ZGlmZiAtLWdpdCBhL0NIQU5HRVMgYi9DSEFOR0VTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjNDJlNDgKLS0tIC9kZXYvbnVsbAorKysgYi9DSEFOR0VTCkBAIC0wLDAgKzEsMTc2IEBACitUaGlzIGZpbGUgc3VtbWFyaXplcyB0aGUgY2hhbmdlcyB0aGF0IG9jY3VyZWQgc2luY2UgdGhlIGxhc3QgImJldGEiIG9mIEZyZWVUeXBlIDIuCitCZWNhdXNlIHRoZSBsaXN0IGlzIGltcG9ydGFudCwgaXQgaGFzIGJlZW4gZGl2aWRlZCBpbnRvIHNlcGFyYXRlIHNlY3Rpb25zOgorCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitIaWdoLUxldmVsIEludGVyZmFjZSA6CisKKyAgVGhlIGhpZ2gtbGV2ZWwgQVBJIGhhcyBiZWVuIGNvbnNpZGVyYWJseSBzaW1wbGlmaWVkLiBIZXJlIGlzIGhvdyA6CisKKyAgICAtIHJlc291cmNlIG9iamVjdHMgaGF2ZSBkaXNhcHBlYXJlZC4gdGhpcyBtZWFucyB0aGF0IGZhY2Ugb2JqZWN0cyBjYW4gbm93CisgICAgICBiZSBjcmVhdGVkIHdpdGggYSBzaW5nbGUgZnVuY3Rpb24gY2FsbCAoc2VlIEZUX05ld19GYWNlIGFuZAorICAgICAgRlRfT3Blbl9GYWNlKQorICAgIAorICAgIC0gd2hlbiBjYWxsaW5nIGVpdGhlciBGVF9OZXdfRmFjZSAmIEZUX09wZW5fRmFjZSwgYSBzaXplIG9iamVjdCBhbmQgYQorICAgICAgZ2x5cGggc2xvdCBvYmplY3QgYXJlIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCBmb3IgdGhlIGZhY2UsIGFuZCBjYW4gYmUKKyAgICAgIGFjY2Vzc2VkIHRocm91Z2ggImZhY2UtPmdseXBoIiBhbmQgImZhY2UtPnNpemUiIGlmIG9uZSByZWFsbHkgbmVlZHMgdG8uCisgICAgICBJbiBtb3N0IGNhc2VzLCB0aGVyZSdzIG5vIG5lZWQgdG8gY2FsbCBGVF9OZXdfU2l6ZSBvciBGVF9OZXdfR2x5cGguCisgICAgCisgICAgLSBzaW1pbGFybHksIEZUX0xvYWRfR2x5cGggbm93IG9ubHkgdGFrZXMgYSAiZmFjZSIgYXJndW1lbnQgKGluc3RlYWQgb2YKKyAgICAgIGEgZ2x5cGggc2xvdCBhbmQgYSBzaXplKS4gQWxzbywgaXQncyAicmVzdWx0IiBwYXJhbWV0ZXIgaXMgZ29uZSwgYXMKKyAgICAgIHRoZSBnbHlwaCBpbWFnZSB0eXBlIGlzIHJldHVybmVkIGluIHRoZSBmaWVsZCAiZmFjZS0+Z2x5cGguZm9ybWF0IgorICAgIAorICAgIC0gdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIGNoYXJtYXBzIGlzIGRpcmVjdGx5IGFjY2Vzc2libGUgdGhyb3VnaAorICAgICAgImZhY2UtPmNoYXJtYXBzIiwgY291bnRpbmcgImZhY2UtPm51bV9jaGFybWFwcyIgZWxlbWVudHMuIEVhY2gKKyAgICAgIGNoYXJtYXAgaGFzIGFuICdlbmNvZGluZycgZmllbGQgd2hpY2ggc3BlY2lmaWVzIHdoaWNoIGtub3duIGVuY29kaW5nCisgICAgICBpdCBkZWFscyB3aXRoLiBWYWxpZCB2YWx1ZXMgYXJlLCBmb3IgZXhhbXBsZSA6CisgICAgCisgICAgICAgICAgZnRfZW5jb2RpbmdfdW5pY29kZSAgICAgIChmb3IgQVNDSUksIExhdGluLTEgYW5kIFVuaWNvZGUpCisgICAgICAgICAgZnRfZW5jb2RpbmdfYXBwbGVfcm9tYW4KKyAgICAgICAgICBmdF9lbmNvZGluZ19zamlzCisgICAgICAgICAgZnRfZW5jb2RpbmdfYWRvYmVfc3RhbmRhcmQKKyAgICAKKyAgICAgIG90aGVyIHZhbHVlcyBtYXkgYmUgYWRkZWQgaW4gdGhlIGZ1dHVyZS4gRWFjaCBjaGFybWFwIHN0aWxsIGhvbGRzIGl0cworICAgICAgInBsYXRmb3JtX2lkIiBhbmQgImVuY29kaW5nX2lkIiB2YWx1ZXMgaW4gY2FzZSB0aGUgZW5jb2RpbmcgaXMgdG9vCisgICAgICBleG90aWMgZm9yIHRoZSBjdXJyZW50IGxpYnJhcnkKKworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRGlyZWN0b3J5IFN0cnVjdHVyZToKKworICBTaG91bGQgc2VlbSBvYnZpb3VzIHRvIG1vc3Qgb2YgeW91OgorCisgICAgIGZyZWV0eXBlLworICAgICAgICAgY29uZmlnLyAgICAgICAgLS0gY29uZmlndXJhdGlvbiBzdWItbWFrZWZpbGVzCisgICAgICAgICAgICBhbnNpLworICAgICAgICAgICAgdW5peC8KKyAgICAgICAgICAgIHdpbjMyLworICAgICAgICAgICAgb3MyLworICAgICAgICAgICAgbXNkb3MvCisKKyAgICAgICAgIGluY2x1ZGUvICAgICAgIC0tIHB1YmxpYyBoZWFkZXIgZmlsZXMsIHRob3NlIHRvIGJlIGluY2x1ZGVkIGRpcmVjdGx5CisgICAgICAgICAgICAgICAgICAgICAgICAgICBieSBjbGllbnQgYXBwcworCisgICAgICAgICBzcmMvICAgICAgICAgICAtLSBzb3VyY2VzIG9mIHRoZSBsaWJyYXJ5CisgICAgICAgICAgIGJhc2UvICAgICAgICAtLSB0aGUgYmFzZSBsYXllcgorICAgICAgICAgICBzZm50LyAgICAgICAgLS0gdGhlIHNmbnQgImRyaXZlciIgKHNlZSB0aGUgZHJpdmVycyBzZWN0aW9uIGJlbG93KQorICAgICAgICAgICB0cnVldHlwZS8gICAgLS0gdGhlIHRydWV0eXBlIGRyaXZlcgorICAgICAgICAgICB0eXBlMS8gICAgICAgLS0gdGhlIHR5cGUxIGRyaXZlcgorICAgICAgICAgICBzaGFyZWQvICAgICAgLS0gc29tZSBoZWFkZXIgZmlsZXMgc2hhcmVkIGJldHdlZW4gZHJpdmVycworCisgICAgICAgICBkZW1vcy8gICAgICAgICAtLSBkZW1vcy90b29scworCisgICAgICAgICBkb2NzLyAgICAgICAgICAtLSBkb2N1bWVudGF0aW9uIChhIGJpdCBlbXB0eSBmb3Igbm93KQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorR2x5cGggSW1hZ2UgRm9ybWF0cyA6CisKKyAgRHJpdmVycyBhcmUgbm93IGFibGUgdG8gcmVnaXN0ZXIgbmV3IGdseXBoIGltYWdlIGZvcm1hdHMgd2l0aGluIHRoZSBsaWJyYXJ5LgorICBGb3Igbm93LCB0aGUgYmFzZSBsYXllciBzdXBwb3J0cyBvZiBjb3Vyc2UgYml0bWFwcyBhbmQgdmVjdG9yIG91dGxpbmVzLCBidXQKKyAgb25lIGNvdWxkIGltYWdpbmUgc29tZXRoaW5nIGRpZmZlcmVudCBsaWtlIGNvbG9yZWQgYml0bWFwcywgYmktY29sb3IKKyAgdmVjdG9ycyBvciB3YXRoZXZlciBlbHNlIChNZXRhZm9udHMgYW55b25lID8/KS4KKworICBTZWUgdGhlIGZpbGUgYGluY2x1ZGUvZnRpbWFnZS5oJy4gTm90ZSBhbHNvIHRoYXQgdGhlIHR5cGUgRlRfUmFzdGVyX01hcCBpcworICBnb25lLCBhbmQgaXMgbm93IHJlcGxhY2VkIGJ5IEZUX0JpdG1hcCwgd2hpY2ggc2hvdWxkIGVuY29tcGFzcyBhbGwga25vd24KKyAgYml0bWFwIHR5cGVzLgorCisgIEVhY2ggbmV3IGltYWdlIGZvcm1hdCBtdXN0IHByb3ZpZGUgYXQgbGVhc3Qgb25lICJyYXN0ZXIiLCBpLmUuIGEgbW9kdWxlCisgIGNhcGFibGUgb2YgdHJhbnNmb3JtaW5nIHRoZSBnbHlwaCBpbWFnZSBpbnRvIGEgYml0bWFwLiBJdCBpcyBhbHNvIHBvc3NpYmxlCisgIHRvIGNoYW5nZSB0aGUgZGVmYXVsdCByYXN0ZXIgdXNlZCBmb3IgYSBnaXZlbiBnbHlwaCBpbWFnZSBmb3JtYXQuCisKKyAgVGhlIGRlZmF1bHQgb3V0bGluZSBzY2FuLWNvbnZlcnRlciBub3cgdXNlcyAxMjggbGV2ZWxzIG9mIGdyYXlzIGJ5IGRlZmF1bHQsCisgIHdoaWNoIHRlbmRzIHRvIHNtb290aCBtYW55IHRoaW5ncy4gTm90ZSB0aGF0IHRoZSBkZW1vIHByb2dyYW1zIGhhdmUgYmVlbgorICB1cGRhdGVkIHNpZ25pZmljYW50bHkgdG8gYmUgYWJsZSB0byBkaXNwbGF5IHRoZXNlLi4KKworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQnVpbGQgc3lzdGVtIDoKKworICBZb3Ugc3RpbGwgbmVlZCBHTlUgTWFrZSB0byBidWlsZCB0aGUgbGlicmFyeS4gVGhlIGJ1aWxkIHN5c3RlbSBoYXMgYmVlbgorICB2ZXJ5IHNlcmlvdXNseSByZS12YW1wZWQgaW4gb3JkZXIgdG8gcHJvdmlkZSB0aGluZ3MgbGlrZSA6CisKKyAgIC0gYXV0b21hdGljIGhvc3QgcGxhdGZvcm0gZGV0ZWN0aW9uIChyZXZlcnRpbmcgdG8gJ2NvbmZpZy9hbnNpJworICAgICBpZiBpdCBpcyBub3QgZGV0ZWN0ZWQsIHdpdGggcHNldWRvLXN0YW5kYXJkIGNvbXBpbGF0aW9uIGZsYWdzKQorCisgICAtIHRoZSBhYmlsaXR5IHRvIGNvbXBpbGUgZnJvbSB0aGUgTWFrZWZpbGVzIHdpdGggdmVyeSBkaWZmZXJlbnQgYW5kCisgICAgIGV4b3RpYyBjb21waWxlcnMuIE5vdGUgdGhhdCBsaW5raW5nIHRoZSBsaWJyYXJ5IGNhbiBiZSBkaWZmaWN1bHQgZm9yCisgICAgIHNvbWUgcGxhdGZvcm1zLgorCisgICAgIEZvciBleGFtcGxlLCB0aGUgZmlsZSBgY29uZmlnL3dpbjMyL2xjY2xpYi5iYXQnIGlzIGludm9rZWQgYnkgdGhlCisgICAgIGJ1aWxkIHN5c3RlbSB0byBjcmVhdGUgdGhlICIubGliIiBmaWxlIHdpdGggTENDLVdpbjMyIGJlY2F1c2UgaXRzCisgICAgIGxpYnJhcmlhbiBoYXMgdG9vIG1hbnkgZmxhd3MgdG8gYmUgaW52b2tlZCBkaXJlY3RseSBmcm9tIHRoZSBNYWtlZmlsZS4KKworICBIZXJlJ3MgaG93IGl0IHdvcmtzIDoKKworICAtIHRoZSBmaXJzdCB0aW1lIHlvdSB0eXBlIGBtYWtlJywgdGhlIGJ1aWxkIHN5c3RlbSBydW5zIGEgc2VyaWVzIG9mCisgICAgc3ViLW1ha2VmaWxlcyBpbiBvcmRlciB0byBkZXRlY3QgeW91ciBob3N0IHBsYXRmb3JtLiBJdCB0aGVuIGR1bXBzCisgICAgd2hhdCBpdCBmb3VuZCwgYW5kIGNyZWF0ZXMgYSBmaWxlIGNhbGxlZCBgY29uZmlnLm1rJyBpbiB0aGUgY3VycmVudAorICAgIGRpcmVjdG9yeS4gVGhpcyBpcyBhIHN1Yi1NYWtlZmlsZSB1c2VkIHRvIGRlZmluZSBtYW55IGltcG9ydGFudCBNYWtlCisgICAgdmFyaWFibGVzIHVzZWQgdG8gYnVpbGQgdGhlIGxpYnJhcnkuCisKKyAgLSB0aGUgc2Vjb25kIHRpbWUsIHRoZSBidWlsZCBzeXN0ZW0gZGV0ZWN0cyB0aGUgYGNvbmZpZy5taycgdGhlbiB1c2UgaXQKKyAgICB0byBidWlsZCB0aGUgbGlicmFyeS4gQWxsIG9iamVjdCBmaWxlcyBnbyBpbnRvICdvYmonIGJ5IGRlZmF1bHQsIGFzCisgICAgd2VsbCBhcyB0aGUgbGlicmFyeSBmaWxlLCBidXQgIHRoaXMgY2FuIGVhc2lseSBiZSBjaGFuZ2VkLgorCisgIE5vdGUgdGhhdCB5b3UgY2FuIHJ1biAibWFrZSBzZXR1cCIgdG8gZm9yY2UgYW5vdGhlciBob3N0IHBsYXRmb3JtIGRldGVjdGlvbgorICBldmVuIGlmIGEgYGNvbmZpZy5taycgaXMgcHJlc2VudCBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkuIEFub3RoZXIgc29sdXRpb24KKyAgaXMgc2ltcGx5IHRvIGRlbGV0ZSB0aGUgZmlsZSwgdGhlbiByZS1ydW4gbWFrZS4KKworICBGaW5hbGx5LCB0aGUgZGVmYXVsdCBjb21waWxlciBmb3IgYWxsIHBsYXRmb3JtcyBpcyBnY2MgKGZvciBub3csIHRoaXMgd2lsbAorICBob3BlZnVsbHkgY2hhbmdlZCBpbiB0aGUgZnV0dXJlKS4gWW91IGNhbiBob3dldmVyIHNwZWNpZnkgYSBkaWZmZXJlbnQKKyAgY29tcGlsZXIgYnkgc3BlY2lmeWluZyBpdCBhZnRlciB0aGUgJ3NldHVwJyB0YXJnZXQgYXMgaW4gOgorCisgICAgICBnbnVtYWtlIHNldHVwIGxjYyAgICAgICAgIG9uIFdpbjMyIHRvIHVzZSB0aGUgTENDIGNvbXBpbGVyCisgICAgICBnbnVtYWtlIHNldHVwIHZpc3VhbGMgICAgIG9uIFdpbjMyIHRvIHVzZSBWaXN1YWwgQysrCisKKyAgU2VlIHRoZSBmaWxlIGBjb25maWcvPHN5c3RlbT4vZGV0ZWN0Lm1rJyBmb3IgYSBsaXN0IG9mIHN1cHBvcnRlZCBjb21waWxlcnMKKyAgZm9yIHlvdXIgcGxhdGZvcm1zLgorCisgIEl0IHNob3VsZCBiZSByZWxhdGl2ZWx5IGVhc3kgdG8gd3JpdGUgbmV3IGRldGVjdGlvbiBydWxlcyBmaWxlcyBhbmQKKyAgY29uZmlnLm1rLi4KKworICBGaW5hbGx5LCB0byBidWlsZCB0aGUgZGVtbyBwcm9ncmFtcywgZ28gdG8gYGRlbW9zJyBhbmQgbGF1bmNoIEdOVSBNYWtlLAorICBpdCB3aWxsIHVzZSB0aGUgYGNvbmZpZy5taycgaW4gdGhlIHRvcCBkaXJlY3RvcnkgdG8gYnVpbGQgdGhlIHRlc3QKKyAgcHJvZ3JhbXMuLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorUG9ydGFiaWxpdHkgOgorCisgIEluIHRoZSBwcmV2aW91cyBiZXRhLCBhIHNpbmdsZSBGVF9TeXN0ZW0gb2JqZWN0IHdhcyB1c2VkIHRvIGVuY29tcGFzcworICBhbGwgbG93LWxldmVsIG9wZXJhdGlvbnMgbGlrZSB0aHJlYWQgc3luY2hyb25pc2F0aW9uLCBtZW1vcnkgbWFuYWdlbWVudAorICBhbmQgaS9vIGFjY2Vzcy4gVGhpcyBoYXMgYmVlbiBncmVhdGx5IHNpbXBsaWZpZWQgOgorCisgICAgLSB0aHJlYWQgc3luY2hyb25pc2F0aW9uIGhhcyBiZWVuIGRyb3BwZWQsIGZvciB0aGUgc2ltcGxlIHJlYXNvbiB0aGF0CisgICAgICB0aGUgbGlicmFyeSBpcyBhbHJlYWR5IHJlLWVudHJhbnQsIGFuZCB0aGF0IGlmIHlvdSByZWFsbHkgbmVlZCB0d28KKyAgICAgIHRocmVhZHMgYWNjZXNzaW5nIHRoZSBzYW1lIEZUX0xpYnJhcnksIHlvdSBzaG91bGQgcmVhbGx5IHN5bmNocm9uaXplCisgICAgICBhY2Nlc3MgdG8gaXQgeW91cnNlbGYgd2l0aCBhIHNpbXBsZSBtdXRleC4KKworICAgIC0gbWVtb3J5IG1hbmFnZW1lbnQgaXMgcGVyZm9ybWVkIHRocm91Z2ggYSB2ZXJ5IHNpbXBsZSBvYmplY3QgY2FsbGVkCisgICAgICAiRlRfTWVtb3J5Iiwgd2hpY2ggcmVhbGx5IGlzIGEgdGFibGUgY29udGFpbmluZyBhIHRhYmxlIG9mIHBvaW50ZXJzCisgICAgICB0byBmdW5jdGlvbnMgbGlrZSBtYWxsb2MsIHJlYWxsb2MgYW5kIGZyZWUgYXMgd2VsbCBhcyBzb21lIHVzZXIgZGF0YQorICAgICAgKGNsb3N1cmUpLgorCisgICAgLSByZXNvdXJjZXMgaGF2ZSBkaXNhcHBlYXJlZCAodGhleSBjcmVhdGVkIG1vcmUgcHJvYmxlbXMgdGhhbiB0aGV5CisgICAgICBzb2x2ZWQpLCBhbmQgaS9vIG1hbmFnZW1lbnQgaGF2ZSBiZWVuIHNpbXBsaWZpZWQgZ3JlYXRseSBhcyBhCisgICAgICByZXN1bHQuIFN0cmVhbXMgYXJlIGRlZmluZWQgdGhyb3VnaCBGVF9TdHJlYW0gb2JqZWN0cywgd2hpY2ggY2FuCisgICAgICBiZSBlaXRoZXIgbWVtb3J5LWJhc2VkIG9yIGRpc2stYmFzZWQuCisKKyAgICAgIE5vdGUgdGhhdCBlYWNoIGZhY2UgaGFzIGl0cyBvd24gc3RyZWFtLCB3aGljaCBpcyBjbG9zZWQgb25seSB3aGVuCisgICAgICB0aGUgZmFjZSBvYmplY3QgaXMgZGVzdHJveWVkLiBIZW5jZSwgYSBmdW5jdGlvbiBsaWtlIFRUX0ZsdXNoX0ZhY2UKKyAgICAgIGluIDEueCBjYW5ub3QgYmUgZGlyZWN0bHkgc3VwcG9ydGVkLiBIb3dldmVyLCBpZiB5b3UgcmVhbGx5IG5lZWQKKyAgICAgIHNvbWV0aGluZyBsaWtlIHRoaXMsIHlvdSBjYW4gZWFzaWx5IHRhaWxvciB5b3VyIG93biBzdHJlYW1zIHRvIGFjaGlldmUKKyAgICAgIHRoZSBzYW1lIGZlYXR1cmUgYXQgYSBsb3dlciBsZXZlbCAoYW5kIHVzZSBGVF9PcGVuX0ZhY2UgaW5zdGVhZCBvZgorICAgICAgRlRfTmV3X0ZhY2UgdG8gY3JlYXRlIHRoZSBmYWNlKS4KKworICBTZWUgdGhlIGZpbGUgImluY2x1ZGUvZnRzeXN0ZW0uaCIgZm9yIG1vcmUgZGV0YWlscywgYXMgd2VsbCBhcyB0aGUKKyAgaW1wbGVtZW50YXRpb25zIGZvdW5kIGluICJjb25maWcvdW5peCIgYW5kICJjb25maWcvYW5zaSIuCisKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0RyaXZlcnMgSW50ZXJmYWNlIDoKKyAgKFRvIGJlIHdyaXR0ZW4pCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFeHRlbnNpb25zIHN1cHBvcnQgOgorICAoVG8gYmUgZGVmaW5lZCkKKwpkaWZmIC0tZ2l0IGEvTWFrZWZpbGUgYi9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTMyMzc3Ci0tLSAvZGV2L251bGwKKysrIGIvTWFrZWZpbGUKQEAgLTAsMCArMSw5MCBAQAorIyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIyoKKyMqICBGcmVlVHlwZSBidWlsZCBzeXN0ZW0gLSB0b3AtbGV2ZWwgTWFrZWZpbGUKKyMqCisjKiAgVGhpcyBmaWxlIGlzIGRlc2lnbmVkIGZvciBHTlUgTWFrZSwgZG8gbm90IHVzZSBpdCB3aXRoIGFub3RoZXIgTWFrZSB0b29sLgorIyogIEl0IHdvcmtzIGFzIGZvbGxvd3MgOgorIyoKKyMqICAtIHdoZW4gaW52b2tlZCBmb3IgdGhlIGZpcnN0IHRpbWUsIHRoaXMgTWFrZWZpbGUgd2lsbCBpbmNsdWRlCisjKiAgICB0aGUgcnVsZXMgZm91bmQgaW4gYGZyZWV0eXBlL2NvbmZpZy9kZXRlY3QubWsnLiBUaGV5IGFyZSBpbiBjaGFyZ2UKKyMqICAgIG9mIGRldGVjdGluZyB0aGUgY3VycmVudCBwbGF0Zm9ybS4KKyMqCisjKiAgICBBIHN1bW1hcnkgb2YgdGhlIGRldGVjdGlvbiB3aWxsIGJlIGRpc3BsYXllZCwgYW5kIHRoZSBmaWxlIGBjb25maWcubWsnCisjKiAgICB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5CisjKgorIyoKKyMqICAtIHdoZW4gaW52b2tlZCBsYXRlciwgdGhpcyBNYWtlZmlsZSB3aWxsIGluY2x1ZGUgdGhlIHJ1bGVzIGZvdW5kIGluCisjKiAgICBgY29uZmlnLm1rJy4gVGhpcyBzdWItTWFrZWZpbGUgd2lsbCBkZWZpbmUgc29tZSBzeXN0ZW0tc3BlY2lmaWMKKyMqICAgIHZhcmlhYmxlcyAobGlrZSBjb21waWxlciwgY29tcGlsYXRpb24gZmxhZ3MsIG9iamVjdCBzdWZmaXgsIGV0Yy4uKSwKKyMqICAgIHRoZW4gaW5jbHVkZSB0aGUgcnVsZXMgZm91bmQgaW4gYGZyZWV0eXBlL2NvbmZpZy9mcmVldHlwZS5taycsCisjKiAgICB1c2VkIHRvIGJ1aWxkIHRoZSBsaWJyYXJ5LgorIyoKKyMqICBTZWUgdGhlIGNvbW1lbnRzIGluIGBjb25maWcvZGV0ZWN0Lm1rJyBhbmQgYGNvbmZpZy9mcmVldHlwZS5taycgZm9yCisjKiAgbW9yZSBkZXRhaWxzIG9uIGhvc3QgcGxhdGZvcm0gZGV0ZWN0aW9uIGFuZCBsaWJyYXJ5IGJ1aWxkcy4uCisjKgorIyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisuUEhPTlk6IHNldHVwCisKKyMKKyMgVGhlIHZhcmlhYmxlIFRPUCBob2xkcyB0aGUgcGF0aCB0byB0aGUgdG9wbW9zdCBkaXJlY3RvcnkgaW4gdGhlIEZyZWVUeXBlCisjIGVuZ2luZSBzb3VyY2UgaGllcmFyY2h5LiBJZiBpdCBpcyBub3QgZGVmaW5lZCwgZGVmYXVsdCBpdCB0byAnLicKKyMKK2lmbmRlZiBUT1AKK1RPUCA6PSAuCitlbmRpZgorCitDT05GSUdfTUsgOj0gY29uZmlnLm1rCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIElmIG5vIGNvbmZpZ3VyYXRpb24gc3ViLW1ha2VmaWxlIGlzIHByZXNlbnQsIG9yIGlmICJzZXR1cCIgaXMgdGhlIHRhcmdldAorIyB0byBiZSBidWlsdCwgcnVuIHRoZSBhdXRvLWRldGVjdGlvbiBydWxlcyB0byBmaWd1cmUgb3V0IHdoaWNoIGNvbmZpZ3VyYXRpb24KKyMgcnVsZXMgZmlsZSB0byB1c2UuLiAKKyMKKyMgTm90ZSB0aGF0IHRoZSBjb25maWd1cmF0aW9uIGZpbGUgaXMgcHV0IGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSwgd2hpY2ggaXMKKyMgbm90IG5lY2Vzc2FyaWx5IFRPUC4KKyMKKworIyBpZiBgY29uZmlnLm1rJyBpcyBub3QgcHJlc2VudCwgc2V0ICJjaGVja19wbGF0Zm9ybSIgYW5kICJmaXJzdF90aW1lIgorIworaWZlcSAoJCh3aWxkY2FyZCAkKENPTkZJR19NSykpLCkKK2NoZWNrX3BsYXRmb3JtIDo9IDEKK2ZpcnN0X3RpbWUgICAgIDo9IDEKK2VuZGlmCisKKyMgaWYgYHNldHVwJyBpcyBvbmUgb2YgdGhlIHRhcmdldHMgcmVxdWVzdGVkLCBzZXQgImNoZWNrX3BsYXRmb3JtIgorIworaWZuZXEgKCQoZmluZHN0cmluZyBzZXR1cCwkKE1BS0VDTURHT0FMUykpLCkKK2NoZWNrX3BsYXRmb3JtIDo9IDEKK2VuZGlmCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBpbmNsdWRlIHRoZSBhdXRvbWF0aWMgaG9zdCBwbGF0Zm9ybSBkZXRlY3Rpb24gcnVsZXMgd2hlbiB3ZSBuZWVkIHRvCisjIGNoZWNrIHRoZSBwbGF0Zm9ybS4KKyMKKyMKK2lmZGVmIGNoZWNrX3BsYXRmb3JtCisKK2FsbDogc2V0dXAKKworaW5jbHVkZSAkKFRPUCkvY29uZmlnL2RldGVjdC5taworCisjICJzZXR1cCIgbXVzdCBiZSBkZWZpbmVkIGJ5IHRoZSBob3N0IHBsYXRmb3JtIGRldGVjdGlvbiBydWxlcworCitlbHNlCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBBIGNvbmZpZ3VyYXRpb24gc3ViLU1ha2VmaWxlIGlzIHByZXNlbnQsIHNpbXBseSBydW4gaXQuLgorIworIworYWxsOiBidWlsZF9mcmVldHlwZQorCitCVUlMRF9GUkVFVFlQRSA6PSB5ZXMKK2luY2x1ZGUgJChDT05GSUdfTUspCisKK2VuZGlmICN0ZXN0IGNoZWNrX3BsYXRmb3JtCisKZGlmZiAtLWdpdCBhL2NvbmZpZy9hbnNpL01ha2VmaWxlIGIvY29uZmlnL2Fuc2kvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdkYjE5MgotLS0gL2Rldi9udWxsCisrKyBiL2NvbmZpZy9hbnNpL01ha2VmaWxlCkBAIC0wLDAgKzEsMTc4IEBACisjKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIyoKKyMqICBGcmVlVHlwZSAyIENvbmZpZ3VyYXRpb24gcnVsZXMgZm9yIGEgYG5vcm1hbCcgQU5TSSBjb21waWxlcgorIyoKKyMqICBDb3B5cmlnaHQgMTk5Ni0xOTk5IGJ5CisjKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorIyoKKyMqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQKKyMqICBtb2RpZmllZCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisjKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisjKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisjKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorIyoKKyMqCisjKiAgVGhlIHB1cnBvc2Ugb2YgdGhpcyBzdWItTWFrZWZpbGUgaXMgdG8gZGVmaW5lIHZhcmlvdXMgYnVpbGQgYW5kCisjKiAgcGxhdGZvcm0gc3BlY2lmaWMgdmFyaWFibGVzIGJlZm9yZSBpbmNsdWRpbmcgdGhlIHN1Yi1NYWtlZmlsZQorIyogIGNvbnRhaW5pbmcgdGhlIEZyZWVUeXBlIGxpYnJhcnkgcnVsZXMsIGZvdW5kIGluCisjKgorIyogICAgICQoVE9QKS9jb25maWcvZnJlZXR5cGUubWsKKyMqCisjKiAgVGhlIGZvbGxvd2luZyB2YXJpYWJsZXMgbXVzdCBiZSBkZWZpbmVkIGJlZm9yZSBpbmNsdWRpbmcgdGhpcworIyogIGZpbGUgOgorIyoKKyMqICAgICBUT1AgICAgICAgICAgUGF0aG5hbWUgdG8gdGhlIHRvcCBvZiB0aGUgRnJlZVR5cGUgc291cmNlcworIyogICAgICAgICAgICAgICAgICBoaWVyYXJjaHkKKyMqCisjKiAgVGhpcyBmaWxlIHNob3VsZCBkZWZpbmUgdGhlIGZvbGxvd2luZyB2YXJpYWJsZXMgYmVmb3JlIGluY2x1ZGluZworIyogIHRoZSBGcmVlVHlwZSBsaWJyYXJ5IHJ1bGVzIGZpbGUgOgorIyoKKyMqICAgICBCVUlMRCAgICAgICAgUGF0aG5hbWUgdG8gdGhlIHBsYXRmb3JtLXNwZWNpZmljIGZpbGVzIHVzZWQKKyMqICAgICAgICAgICAgICAgICAgZm9yIHRoZSBidWlsZC4gVXN1YWxseSBgJChUT1ApL2NvbmZpZy88c3lzdGVtPicKKyMqCisjKiAgICAgU0VQICAgICAgICAgIERpcmVjdG9yeSBzZXBhcmF0b3IgZm9yIHRoZSBjdXJyZW50IHBsYXRmb3JtLgorIyogICAgICAgICAgICAgICAgICBFaXRoZXIgLyBvciBcIChtYXliZSA6IG9uIE1hY3MpCisjKiAKKyMqICAgICBERUxFVEUgICAgICAgVGhlIGZvcmNlZCByZW1vdmUvZGVsZXRlIGNvbW1hbmQgdG8gZXJhc2Ugb25lIG9yIG1vcmUKKyMqICAgICAgICAgICAgICAgICAgZmlsZXMKKyMqCisjKiAgICAgSU5DTFVERSAgICAgIFRoZSBsb2NhdGlvbiBvZiBhbGwgcHVibGljIGhlYWRlciBmaWxlcy4gZS5nLgorIyogICAgICAgICAgICAgICAgICBgJChUT1ApL2luY2x1ZGUnaW5jbHVkZScgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyMqICAgICBTUkMgICAgICAgICAgVGhlIGRpcmVjdG9yeSBjb250YWluaW5nIGFsbCBzb3VyY2VzLiBlLmcuICAgICAgICAgICAgICAKKyMqICAgICAgICAgICAgICAgICAgJyQoVE9QKS9zcmMnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorIyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyMqICAgICBPQkpfRElSICAgICAgVGhlIGxvY2F0aW9uIHdoZXJlIGNvbXBpbGVkIG9iamVjdCBmaWxlcyB3aWxsIGJlICAgICAgICAgCisjKiAgICAgICAgICAgICAgICAgIHBsYWNlZCwgZS5nLiAnJChUT1ApL29iaicgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyMqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisjKiAgICAgTElCX0RJUiAgICAgIFRoZSBsb2NhdGlvbiB3aGVyZSB0aGUgcmVzdWx0aW5nIGxpYnJhcnkgZmlsZSB3aWxsIGJlICAgIAorIyogICAgICAgICAgICAgICAgICBwbGFjZWQsIGUuZy4gJyQoVE9QKS9vYmonICAgICAgICAgICAgICAgICAgICAgICAgCisjKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorIyogICAgIExJQlJBUlkgICAgICBUaGUgZmlsZW5hbWUgb2YgdGhlIHJlc3VsdGluZyBsaWJyYXJ5IGZpbGUsIHdpdGhvdXQgICAgICAKKyMqICAgICAgICAgICAgICAgICAgaXRzIGV4dGVuc2lvbi4uIGUuZy4gJ2xpYmZyZWV0eXBlJyBvciAnZnJlZXR5cGUnICAgICAgICAgCisjKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorIyogICAgIE8gICAgICAgICAgICBUaGUgb2JqZWN0IGZpbGUgc3VmZml4LiAgQ2FuIGJlICcubycsICcub2JqLCcgJy5sbywnICAgICAKKyMqICAgICAgICAgICAgICAgICAgJztjb2ZmLCcgZXRjLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisjKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorIyogICAgIEEgICAgICAgICAgICBUaGUgbGlicmFyeSBmaWxlIHN1ZmZpeC4gIENhbiBiZSAnLmEnICcuc28sJyAnLmxpYicgICAgICAKKyMqICAgICAgICAgICAgICAgICAgJy5kbGwsJyBldGMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisjKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorIyogICAgIEkgICAgICAgICAgICBUaGUgcGF0aCBpbmNsdXNpb24gZmxhZy4gIFNvbWUgY29tcGlsZXJzIHVzZSBhICAgICAgICAgICAKKyMqICAgICAgICAgICAgICAgICAgZGlmZmVyZW50IGZsYWcgdGhhbiAnLUknIHRvIHNwZWNpZnkgYW4gYWRkaXRpb25hbCAgICAgICAgCisjKiAgICAgICAgICAgICAgICAgIGluY2x1ZGUgcGF0aC4gIEV4YW1wbGVzIGFyZSAnL2k9JyBvciAnLUogJywgZXRjLiAgICAgICAgIAorIyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyMqICAgICBEICAgICAgICAgICAgVGhlIG1hY3JvIGRlZmluaXRpb24gZmxhZy4gIEkgaGF2ZW4ndCBtZXQgY29tcGlsZXJzICAgICAgCisjKiAgICAgICAgICAgICAgICAgIHdoaWNoIGRvbid0IHVzZSB0aGUgJy1EJyBzd2l0Y2ggdG8gZGVmaW5lIGEgbWFjcm8sIGJ1dCAgIAorIyogICAgICAgICAgICAgICAgICB3aG8ga25vd3MuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyMqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisjKiAgICAgVCAgICAgICAgICAgIFRoZSBjb21waWxhdGlvbiBmbGFnIHVzZWQgdG8gaWRlbnRpZnkgdGhlIHRhcmdldC4gU29tZSAgIAorIyogICAgICAgICAgICAgICAgICBjb21waWxlcnMgdXNlIGEgZGlmZmVyZW50IGZsYWcgdGhhbiAnLW8gJyB0byBzcGVjaWZ5ICAgICAKKyMqICAgICAgICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHRhcmdldCBvYmplY3QgZmlsZS4gICAgICAgICAgICAgICAgICAgICAgCisjKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorIyogICAgIENGTEFHUyAgICAgICBUaGUgc2V0IG9mIGZsYWdzIHVzZWQgdG8gY29tcGlsZSBvYmplY3QgZmlsZXMuCisjKiAgICAgICAgICAgICAgICAgICh1c3VhbGx5IGNvbnRhaW5zIHRoZSBmbGFnICctYycpLgorIyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyMqCisjKgorIyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworaWZuZGVmIFRPUAorVE9QIDo9IC4KK2VuZGlmCisKK0RFTEVURSAgIDo9IHJtIC1mCitTRVAgICAgICA6PSAvCitCVUlMRCAgICA6PSAkKFRPUCkvY29uZmlnL2Fuc2kKK1BMQVRGT1JNIDo9IGFuc2kKKworIyB0aGUgZGlyZWN0b3J5IHdoZXJlIGFsbCBvYmplY3QgZmlsZXMgYXJlIHBsYWNlZAorIworT0JKX0RJUiA6PSAkKFRPUCkvb2JqCisKKworIyB0aGUgZGlyZWN0b3J5IHdoZXJlIGFsbCBsaWJyYXJ5IGZpbGVzIGFyZSBwbGFjZWQKKyMKKyMgIGJ5IGRlZmF1bHQsIHRoaXMgaXMgdGhlIHNhbWUgYXMgT0JKX0RJUiwgaG93ZXZlciwgdGhpcyBjYW4gYmUKKyMgIGNoYW5nZWQgdG8gc3VpdCBwYXJ0aWN1bGFyIG5lZWRzLi4KKyMKK0xJQl9ESVIgOj0gJChPQkpfRElSKQorCisKKyMgdGhlIG9iamVjdCBmaWxlIGV4dGVuc2lvbiwgdGhpcyBjYW4gYmUgLm8sIC50Y28sIC5vYmosIGV0Yy4uCisjIGRlcGVuZGluZyBvbiB0aGUgcGxhdGZvcm0KKyMKK08gOj0gbworCisjIHRoZSBsaWJyYXJ5IGZpbGUgZXh0ZW5zaW9uLCB0aGlzIGNhbiBiZSAuYSwgLmxpYiwgZXRjLi4KKyMgZGVwZW5kaW5nIG9uIHRoZSBwbGF0Zm9ybQorIworQSA6PSBhCisKKworIyBUaGUgbmFtZSBvZiB0aGUgZmluYWwgbGlicmFyeSBmaWxlLgorIyBOb3RlIHRoYXQgdGhlIERPUy1zcGVjaWZpYyBNYWtlZmlsZSB1c2VzIGEgc2hvcnRlciAoOC4zKSBuYW1lCisjCitMSUJSQVJZIDo9IGxpYmZyZWV0eXBlCisKKworIyBwYXRoIGluY2x1c2lvbiBmbGFnLgorIworIyAgU29tZSBjb21waWxlcnMgdXNlIGEgZGlmZmVyZW50IGZsYWcgdGhhbiAnLUknIHRvIHNwZWNpZnkgYW4KKyMgIGFkZGl0aW9uYWwgaW5jbHVkZSBwYXRoLiBFeGFtcGxlcyBhcmUgIi9pPSIgb3IgIi1KIiwgZXRjLi4uCisjCitJIDo9IC1JCisKKworIyBDIGZsYWcgdXNlZCB0byBkZWZpbmUgYSBtYWNybyBiZWZvcmUgdGhlIGNvbXBpbGF0aW9uIG9mIGEgZ2l2ZW4KKyMgc291cmNlIG9iamVjdC4gVXN1YWxseSBpcyAnLUQnIGxpa2UgaW4gIi1EREVCVUciCisjCitEIDo9IC1ECisKKworIyBUYXJnZXQgZmxhZyAtIGJld2FyZSwgdGhlcmUgaXMgYSBzcGFjZSBhZnRlciB0aGUgJ28nICEhCisjCisjCitUIDo9IC1vIAorCisKKyMgVGhlIGxpbmsgZmxhZyB1c2VkIHRvIHNwZWNpZnkgYSBnaXZlbiBsaWJyYXJ5IGZpbGUgb24gbGluay4KKyMgTm90ZSB0aGF0IHRoaXMgaXMgb25seSB1c2VkIHRvIGNvbXBpbGUgdGhlIGRlbW8gcHJvZ3JhbXMsIG5vdAorIyB0aGUgbGlicmFyeSBpdHNlbGYuCisjCitMIDo9IC1sCisKKworIyBDIGZsYWdzCisjCisjICAgVGhlc2Ugc2hvdWxkIGNvbmNlcm4gOgorIworIyAgICAgLSBkZWJ1ZyBvdXRwdXQKKyMgICAgIC0gb3B0aW1pemF0aW9uCisjICAgICAtIHdhcm5pbmdzCisjICAgICAtIGFuc2kgY29tcGxpYW5jZS4uCisjCitpZm5kZWYgQ0ZMQUdTCitDRkxBR1MgOj0gLWMKK2VuZGlmCisKKyMgTm93IGluY2x1ZGUgdGhlIG1haW4gc3ViLW1ha2VmaWxlLiBJdCBjb250YWlucyBhbGwgdGhlIHJ1bGVzIHVzZWQKKyMgdG8gYnVpbGQgdGhlIGxpYnJhcnkgd2l0aCB0aGUgcHJldmlvdXMgdmFyaWFibGVzIGRlZmluZWQKKyMKK2luY2x1ZGUgJChUT1ApL2NvbmZpZy9mcmVldHlwZS5taworCisKKyMgTGlicmFyaWFuIHRvIHVzZSB0byBidWlsZCB0aGUgc3RhdGljIGxpYnJhcnkKKyMKK0ZUX0xJQlJBUklBTiA6PSAkKEFSKSAtcgorCisKKyMgVGhpcyBmaW5hbCBydWxlIGlzIHVzZWQgdG8gbGluayBhbGwgb2JqZWN0IGZpbGVzIGludG8gYSBzaW5nbGUKKyMgbGlicmFyeS4gSXQgaXMgcGFydCBvZiB0aGUgc3lzdGVtLXNwZWNpZmljIHN1Yi1NYWtlZmlsZSBiZWNhdXNlIG5vdAorIyBhbGwgbGlicmFyaWFucyBhY2NlcHQgYSBzaW1wbGUgc3ludGF4IGxpa2UgOgorIworIyAgICBsaWJyYXJpYW4gbGlicmFyeV9maWxlIHtsaXN0IG9mIG9iamVjdCBmaWxlc30gCisjCiskKEZUX0xJQlJBUlkpOiAkKE9CSkVDVFNfTElTVCkKKwktJChERUxFVEUpICRACisJJChGVF9MSUJSQVJJQU4pICRAICQoT0JKRUNUU19MSVNUKQorCmRpZmYgLS1naXQgYS9jb25maWcvYW5zaS9mdGNvbmZpZy5oIGIvY29uZmlnL2Fuc2kvZnRjb25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2E0Yzk1Ci0tLSAvZGV2L251bGwKKysrIGIvY29uZmlnL2Fuc2kvZnRjb25maWcuaApAQCAtMCwwICsxLDE4MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgZnRjb25maWcuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFOU0ktc3BlY2lmaWMgY29uZmlndXJhdGlvbiBmaWxlIChzcGVjaWZpY2F0aW9uIG9ubHkpLiAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAxOTk2LTE5OTkgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCAgICAgICAgKi8KKy8qICBtb2RpZmllZCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgICovCisvKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLworLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KKy8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogVGhpcyBoZWFkZXIgZmlsZSBjb250YWlucyBhIG51bWJlciBvZiBtYWNybyBkZWZpbml0aW9ucyB0aGF0IGFyZSB1c2VkICovCisgIC8qIGJ5IHRoZSByZXN0IG9mIHRoZSBlbmdpbmUuICBQb3J0ZXJzIGFyZSBmcmVlIHRvIGNvcHkgdGhpcyBmaWxlIGFuZCAgICAqLworICAvKiBhZGFwdCBpdCB0byBzdWl0IHRoZWlyIG93biBzeXN0ZW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIElNUE9SVEFOVCBOT1RFOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgUG9ydGVycywgcmVhZCBjYXJlZnVsbHkgdGhlIGNvbW1lbnRzIGluIGBmdHN5cy5oJyBiZWZvcmUgdHJ5aW5nIHRvICovCisgIC8qICAgIHBvcnQgdGhpcyBmaWxlIHRvIHlvdXIgc3lzdGVtLiAgSXQgY29udGFpbnMgbWFueSBlc3NlbnRpYWwgICAgICAgICAqLworICAvKiAgICByZW1hcmtzLCBhbmQgd2lsbCBlYXNlIHlvdXIgd29yayBncmVhdGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNpZm5kZWYgRlRDT05GSUdfSAorI2RlZmluZSBGVENPTkZJR19ICisKKy8qIEluY2x1ZGUgdGhlIGhlYWRlciBmaWxlIGNvbnRhaW5pbmcgYWxsIGRldmVsb3BlciBidWlsZCBvcHRpb25zICovCisjaW5jbHVkZSA8ZnRvcHRpb24uaD4KKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgUExBVEZPUk0tU1BFQ0lGSUMgQ09ORklHVVJBVElPTiBNQUNST1MgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogVGhlc2UgbWFjcm9zIGNhbiBiZSB0b2dnbGVkIHRvIHN1aXQgYSBzcGVjaWZpYyBzeXN0ZW0uICBUaGUgY3VycmVudCAgICovCisgIC8qIG9uZXMgYXJlIGRlZmF1bHRzIHVzZWQgdG8gY29tcGlsZSBGcmVlVHlwZSBpbiBhbiBBTlNJIEMgZW52aXJvbm1lbnQgICAqLworICAvKiAoMTZiaXQgY29tcGlsZXJzIGFyZSBhbHNvIHN1cHBvcnRlZCkuICBDb3B5IHRoaXMgZmlsZSB0byB5b3VyIG93biAgICAgKi8KKyAgLyogYGZyZWV0eXBlL2FyY2gvPHN5c3RlbT4nICBkaXJlY3RvcnksIGFuZCBlZGl0IGl0IHRvIHBvcnQgdGhlIGVuZ2luZS4gICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvKiBEZWZpbmUgdG8gZW1wdHkgaWYgdGhlIGtleXdvcmQgZG9lcyBub3Qgd29yay4gICovCisvKiAjdW5kZWYgY29uc3QgKi8KKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBBTlNJIEMgaGVhZGVyIGZpbGVzLiAgKi8KKyNkZWZpbmUgU1REQ19IRUFERVJTIDEKKworLyogV2UgdXNlIDxsaW1pdHMuaD4gdmFsdWVzIHRvIGtub3cgdGhlIHNpemVzIG9mIHRoZSB0eXBlcy4gICovCisjaW5jbHVkZSA8bGltaXRzLmg+CisKKy8qIFRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gYW4gYGludCcgdHlwZS4gICovCisjaWYgICBVSU5UX01BWCA9PSAweEZGRkZGRkZGCisjZGVmaW5lIFNJWkVPRl9JTlQgIDQKKyNlbGlmIFVJTlRfTUFYID09IDB4RkZGRgorI2RlZmluZSBTSVpFT0ZfSU5UICAyCisjZWxpZiBVSU5UX01BWCA+IDB4RkZGRkZGRkYgJiYgVUlOVF9NQVggPT0gMHhGRkZGRkZGRkZGRkZGRkZGCisjZGVmaW5lIFNJWkVPRl9JTlQgIDgKKyNlbHNlCisjZXJyb3IgIlVuc3VwcG9ydGVkIG51bWJlciBvZiBieXRlcyBpbiBgaW50JyB0eXBlISIKKyNlbmRpZgorCisvKiBUaGUgbnVtYmVyIG9mIGJ5dGVzIGluIGEgYGxvbmcnIHR5cGUuICAqLworI2lmICAgVUxPTkdfTUFYID09IDB4RkZGRkZGRkYKKyNkZWZpbmUgU0laRU9GX0xPTkcgIDQKKyNlbGlmIFVMT05HX01BWCA+IDB4RkZGRkZGRkYgJiYgVUxPTkdfTUFYID09IDB4RkZGRkZGRkZGRkZGRkZGRgorI2RlZmluZSBTSVpFT0ZfTE9ORyAgOAorI2Vsc2UKKyNlcnJvciAiVW5zdXBwb3J0ZWQgbnVtYmVyIG9mIGJ5dGVzIGluIGBsb25nJyB0eXBlISIKKyNlbmRpZgorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIG1lbWNweSBmdW5jdGlvbi4gICovCisjZGVmaW5lIEhBVkVfTUVNQ1BZIDEKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8ZmNudGwuaD4gaGVhZGVyIGZpbGUuICAqLworI2RlZmluZSBIQVZFX0ZDTlRMX0ggMAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx1bmlzdGQuaD4gaGVhZGVyIGZpbGUuICAqLworI2RlZmluZSBIQVZFX1VOSVNURF9IIDAKKworCisvKiBQcmVmZXJyZWQgYWxpZ25tZW50IG9mIGRhdGEgKi8KKyNkZWZpbmUgRlRfQUxJR05NRU5UICA4CisKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICBBVVRPTUFUSUMgQ09ORklHVVJBVElPTiBNQUNST1MgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgVGhlc2UgbWFjcm9zIGFyZSBjb21wdXRlZCBmcm9tIHRoZSBvbmVzIGRlZmluZWQgYWJvdmUuICBEb24ndCB0b3VjaCAgKi8KKyAgLyogIHRoZWlyIGRlZmluaXRpb24sIHVubGVzcyB5b3Uga25vdyBwcmVjaXNlbHkgd2hhdCB5b3UncmUgZG9pbmcuICBObyAgICovCisgIC8qICBwb3J0ZXIgc2hvdWxkIG5lZWQgdG8gbWVzcyB3aXRoIHRoZW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIEludE4gdHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICBVc2VkIHRvIGd1YXJhbnRlZSB0aGUgc2l6ZSBvZiBzb21lIHNwZWNpZmljIGludGVnZXJzLiAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHNpZ25lZCBzaG9ydCAgICBGVF9JbnQxNjsKKyAgdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAgRlRfV29yZDE2OworCisjaWYgU0laRU9GX0lOVCA9PSA0CisKKyAgdHlwZWRlZiBzaWduZWQgaW50ICAgICAgRlRfSW50MzI7CisgIHR5cGVkZWYgdW5zaWduZWQgaW50ICAgIEZUX1dvcmQzMjsKKworI2VsaWYgU0laRU9GX0xPTkcgPT0gNAorCisgIHR5cGVkZWYgc2lnbmVkIGxvbmcgICAgIEZUX0ludDMyOworICB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgICBGVF9Xb3JkMzI7CisKKyNlbHNlCisjZXJyb3IgIm5vIDMyYml0IHR5cGUgZm91bmQgLSBwbGVhc2UgY2hlY2sgeW91ciBjb25maWd1cmF0aW9uIGZpbGVzIgorI2VuZGlmCisKKyNpZiBTSVpFT0ZfTE9ORyA9PSA4CisKKyAgLyogTE9ORzY0IG11c3QgYmUgZGVmaW5lZCB3aGVuIGEgNjQtYml0IHR5cGUgaXMgYXZhaWxhYmxlICovCisjZGVmaW5lIExPTkc2NAorI2RlZmluZSBJTlQ2NCAgIGxvbmcKKworI2Vsc2UKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogR0NDIHByb3ZpZGVzIHRoZSBub24tQU5TSSAnbG9uZyBsb25nJyA2NC1iaXQgdHlwZS4gIFlvdSBjYW4gYWN0aXZhdGUgICovCisgIC8qIGl0IGJ5IGRlZmluaW5nIHRoZSBGVENBTENfVVNFX0xPTkdfTE9ORyBtYWNybyBpbiBgZnRjb25maWcuaCcuICBOb3RlICAqLworICAvKiB0aGF0IHRoaXMgd2lsbCBwcm9kdWNlIG1hbnkgLWFuc2kgd2FybmluZ3MgZHVyaW5nIGxpYnJhcnkgICAgICAgICAgICAgKi8KKyAgLyogY29tcGlsYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2lmZGVmIEZUQ0FMQ19VU0VfTE9OR19MT05HCisKKyNkZWZpbmUgTE9ORzY0CisjZGVmaW5lIElOVDY0ICAgbG9uZyBsb25nCisKKyNlbmRpZiAvKiBGVENBTENfVVNFX0xPTkdfTE9ORyAqLworI2VuZGlmCisKKworI2lmZGVmIEZUX01BS0VfT1BUSU9OX1NJTkdMRV9PQkpFQ1QKKyNkZWZpbmUgIExPQ0FMX0RFRiAgIHN0YXRpYworI2RlZmluZSAgTE9DQUxfRlVOQyAgc3RhdGljCisjZWxzZQorI2RlZmluZSAgTE9DQUxfREVGICAgZXh0ZXJuCisjZGVmaW5lICBMT0NBTF9GVU5DICAvKiBub3RoaW5nICovCisjZW5kaWYKKworI2lmZGVmIEZUX01BS0VfT1BUSU9OX1NJTkdMRV9MSUJSQVJZX09CSkVDVAorI2RlZmluZSAgQkFTRV9ERUYgICAgTE9DQUxfREVGCisjZGVmaW5lICBCQVNFX0ZVTkMgICBMT0NBTF9GVU5DCisjZWxzZQorI2RlZmluZSAgQkFTRV9ERUYgICAgZXh0ZXJuCisjZGVmaW5lICBCQVNFX0ZVTkMgICAvKiBub3RoaW5nICovCisjZW5kaWYKKworI2lmbmRlZiAgRVhQT1JUX0RFRgorI2RlZmluZSAgRVhQT1JUX0RFRiAgIGV4dGVybgorI2VuZGlmCisKKyNpZm5kZWYgIEVYUE9SVF9GVU5DCisjZGVmaW5lICBFWFBPUlRfRlVOQyAgLyogbm90aGluZyAqLworI2VuZGlmCisKKyNlbmRpZiAvKiBGVENPTkZJR19IICovCisKKworLyogRU5EICovCmRpZmYgLS1naXQgYS9jb25maWcvYW5zaS9mdG9wdGlvbi5oIGIvY29uZmlnL2Fuc2kvZnRvcHRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTJmNjVmCi0tLSAvZGV2L251bGwKKysrIGIvY29uZmlnL2Fuc2kvZnRvcHRpb24uaApAQCAtMCwwICsxLDE2MiBAQAorI2lmbmRlZiBGVE9QVElPTl9ICisjZGVmaW5lIEZUT1BUSU9OX0gKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICBVU0VSLVNFTEVDVEFCTEUgQ09ORklHVVJBVElPTiBNQUNST1MgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogVGhlc2UgbWFjcm9zIGNhbiBiZSB0b2dnbGVkIGJ5IGRldmVsb3BlcnMgdG8gZW5hYmxlIG9yIGRpc2FibGUgICAgICAgICovCisgIC8qIGNlcnRhaW4gYXNwZWN0cyBvZiBGcmVlVHlwZS4gIFRoaXMgZmlsZSBjb250YWlucyBtYWNyb3MgdGhhdCBhcHBseSB0byAqLworICAvKiBhbGwgb2YgRnJlZVR5cGUuICBEcml2ZXItc3BlY2lmaWMgY29uZmlndXJhdGlvbnMgYXJlIHBsYWNlZCBpbiBlYWNoICAgKi8KKyAgLyogZHJpdmVyIGRpcmVjdG9yeSAoZS5nLiBgZnJlZXR5cGUvZHJpdmVycy90dGxpYi90dGNvbmZpZy5oJykuICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogQWx0ZXJuYXRlIEdseXBoIEltYWdlIEZvcm1hdCBzdXBwb3J0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIEJ5IGRlZmF1bHQsIHRoZSBnbHlwaCBpbWFnZXMgcmV0dXJuZWQgYnkgdGhlIEZyZWVUeXBlIGdseXBoIGxvYWRlciAgKi8KKyAgLyogICBjYW4gZWl0aGVyIGJlIGEgcGl4bWFwIG9yIGEgdmVjdG9yaWFsIG91dGxpbmUgZGVmaW5lZCB0aHJvdWdoICAgICAgICovCisgIC8qICAgYmV6aWVyIGNvbnRyb2wgcG9pbnRzLiBXaGVuIGRlZmluaW5nIHRoZSBmb2xsb3dpbmcgY29uZmlndXJhdGlvbiAgICAqLworICAvKiAgIG1hY3JvLCBzb21lIGZvbnQgZHJpdmVycyB3aWxsIGJlIGFibGUgdG8gcmVnaXN0ZXIgYWx0ZXJuYXRlICAgICAgICAgKi8KKyAgLyogICBnbHlwaCBpbWFnZSBmb3JtYXRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIFVuc2V0IHRoaXMgbWFjcm8gaWYgeW91J3JlIHN1cmUgdGhhdCB5b3UnbGwgbmV2ZXIgdXNlIGEgZm9udCBkcml2ZXIgKi8KKyAgLyogICB3aXRoIGFuIGFsdGVybmF0ZSBnbHlwaCBmb3JtYXQsIHRoaXMgd2lsbCByZWR1Y2UgdGhlIHNpemUgb2YgdGhlICAgICovCisgIC8qICAgYmFzZSBsYXllciBjb2RlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRlRfQ09ORklHX09QVElPTl9BTFRFUk5BVEVfR0xZUEhfRk9STUFUUworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogR0NDIHByb3ZpZGVzIHRoZSBub24tQU5TSSBgbG9uZyBsb25nJyA2NC1iaXQgdHlwZS4gIFlvdSBjYW4gYWN0aXZhdGUgICovCisgIC8qIGl0IGJ5IGRlZmluaW5nIHRoZSBGVENBTENfVVNFX0xPTkdfTE9ORyBtYWNybyBoZXJlLiAgTm90ZSBob3dldmVyICAgICAqLworICAvKiB0aGF0IHdlIGRpZCBub3QgZXhwZXJpZW5jZSBhbnkgaW1wcm92ZW1lbnQgaW4gc3BlZWQgd2l0aCBnY2MsIGFuZCAgICAgKi8KKyAgLyogdGhhdCB0aGUgZmluYWwgY29kZSBzZWVtcyBiaWdnZXIgd2hlbiBsaW5rZWQuICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI3VuZGVmIEZUQ0FMQ19VU0VfTE9OR19MT05HCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFdoZW4gY29tcGlsaW5nIEZyZWVUeXBlIGFzIGEgRExMLCBzb21lIHN5c3RlbXMvY29tcGlsZXJzIG5lZWQgYSAgICAgICAqLworICAvKiBzcGVjaWFsIGtleXdvcmQgaW4gZnJvbnQgb2YgZWFjaCBmdW5jdGlvbiBkZWZpbml0aW9uIGluc3RlYWQgb2YgICAgICAgKi8KKyAgLyogYGV4dGVybicuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBUaGUgbWFjcm9zIEVYUE9SVF9ERUYgYW5kIEVYUE9SVF9GVU5DIGFyZSB0aHVzIHVzZWQgdG8gZGVmaW5lICAgICAgICAgKi8KKyAgLyogZXhwb3J0ZWQgbGlicmFyeSBmdW5jdGlvbiBpbnRlcmZhY2VzIGFuZCBleHBvcnRlZCBsaWJyYXJ5IGZ1bmN0aW9ucyAgICovCisgIC8qIGltcGxlbWVudGF0aW9ucyByZXNwZWN0aXZlbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogSWYgbm90IGRlZmluZWQgaGVyZSwgdGhleSBhdXRvbWF0aWNhbGx5IGRlZmF1bHQgdG8gYGV4dGVybicgYW5kIHZvaWQgICovCisgIC8qIGxhdGVyIGluIHRoaXMgaGVhZGVyIGZpbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyN1bmRlZiBFWFBPUlRfREVGCisjdW5kZWYgRVhQT1JUX0ZVTkMKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogRGVidWcgbGV2ZWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIEZyZWVUeXBlIGNhbiBiZSBjb21waWxlZCBpbiBkZWJ1ZyBvciB0cmFjZSBtb2RlLiAgSW4gZGVidWcgbW9kZSwgICAgKi8KKyAgLyogICBlcnJvcnMgYXJlIHJlcG9ydGVkIHRocm91Z2ggdGhlIGBmdGRlYnVnJyBjb21wb25lbnQuICBJbiB0cmFjZSAgICAgICovCisgIC8qICAgbW9kZSwgYWRkaXRpb25hbCBtZXNzYWdlcyBhcmUgc2VudCB0byB0aGUgc3RhbmRhcmQgb3V0cHV0IGR1cmluZyAgICAqLworICAvKiAgIGV4ZWN1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgRGVmaW5lIEZUX0RFQlVHX0xFVkVMX0VSUk9SIHRvIGJ1aWxkIHRoZSBsaWJyYXJ5IGluIGRlYnVnIG1vZGUuICAgICAqLworICAvKiAgIERlZmluZSBGVF9ERUJVR19MRVZFTF9UUkFDRSB0byBidWlsZCBpdCBpbiB0cmFjZSBtb2RlLiAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgRG9uJ3QgZGVmaW5lIGFueSBvZiB0aGVzZSBtYWNyb3MgdG8gY29tcGlsZSBpbiBgcmVsZWFzZScgbW9kZS4gICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyN1bmRlZiAgRlRfREVCVUdfTEVWRUxfRVJST1IKKyN1bmRlZiAgRlRfREVCVUdfTEVWRUxfVFJBQ0UKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogQW50aS1hbGlhc2luZyBzdXBwb3J0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIFVuZGVmaW5lIHRoaXMgbWFjcm8gb25seSBpZiB5b3Ugd2FudCB0byBkaXNhYmxlIHRoZSBhbnRpLWFsaWFzaW5nICAgKi8KKyAgLyogICBzdXBwb3J0IGluIEZyZWVUeXBlLiAgVGhpcyB3aWxsIHNhdmUgeW91IGFib3V0IDUgS2Igb2YgY29kZS4gIEl0ICAgICovCisgIC8qICAgbWF5IGJlIGltcG9ydGFudCBmb3Igc29tZSBlbWJlZGRlZCBzeXN0ZW1zLiAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRlRfQ09ORklHX09QVElPTl9BTlRJX0FMSUFTCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIEVuZGlhbmVzcyBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICBGcmVlVHlwZSBpcyBjb21wbGV0ZWx5IGVuZGlhbi1pbmRlcGVuZGVudCwgYW5kIGNhbiB0aHVzIGJlIGNvbXBpbGVkICovCisgIC8qICAgZGlyZWN0bHkgb24gX2FueV8gbWFjaGluZS4gIEhvd2V2ZXIsIHNvbWUgY29tcG9uZW50cyBvZiB0aGUgbGlicmFyeSAqLworICAvKiAgIHByb3ZpZGUgaW1wcm92ZWQgcm91dGluZXMgZm9yIHRoZSBjYXNlcyB3aGVyZSBlbmRpYW5lc3MgaXMga25vd24uICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgSXQgdXN1YWxseSByZXN1bHRzIGluIHNwZWVkLXVwcyBhbmQgcmVkdWNlZCBjb2RlIHNpemUuICBOb3RlIHRoYXQgICAqLworICAvKiAgIHlvdSBzaG91bGQgbm90IGRlZmluZSBib3RoIG9mIHRoZXNlIG1hY3Jvcy4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIE5PVEU6IEZvciBub3csIG9ubHkgdGhlIHNjYW4tbGluZSBjb252ZXJ0ZXIgKGJhc2UvZnRyYXN0ZXIuYykgdXNlcyAgKi8KKyAgLyogICAgICAgICB0aGVzZSBtYWNyb3MgdG8gc3BlZWQtdXAgc29tZSBhbnRpLWFsaWFzIHJlbmRlcmluZyByb3V0aW5lcy4gICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI3VuZGVmICBGVF9DT05GSUdfT1BUSU9OX0xJVFRMRV9FTkRJQU4KKyN1bmRlZiAgRlRfQ09ORklHX09QVElPTl9CSUdfRU5ESUFOCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIERlZmluZSB0aGlzIGNvbmZpZ3VyYXRpb24gbWFjcm8gd2hlbmV2ZXIgeW91IHdhbnQgdG8gYnVpbGQgYSB2ZXJzaW9uICAqLworICAvKiBvZiBGcmVlVHlwZSB0aGF0IGRvZXMgbm90IGluY2x1ZGUgYSBkZWZhdWx0IGBzeXN0ZW0nIGNvbXBvbmVudC4gICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIE5vdGUgdGhhdCB0aGlzIHdpbGwgcHJldmVudCB0aGUgY29tcGlsYXRpb24gb2YgYGZ0aW5pdCcsIGhlbmNlIHRoZSAgICAqLworICAvKiBmdW5jdGlvbiBGVF9Jbml0X0ZyZWVUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjdW5kZWYgRlRfQ09ORklHX09QVElPTl9OT19ERUZBVUxUX1NZU1RFTQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgcmVuZGVyIHBvb2wgdXNlZCBieSB0aGUgc2Nhbi1saW5lICAgICAgICAgKi8KKyAgLyogICAgY29udmVydGVyIHRvIGRvIGFsbCBvZiBpdHMgd29yay4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGlzIG11c3QgYmUgZ3JlYXRlciB0aGFuIDQgS2IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZUX1JFTkRFUl9QT09MX1NJWkUgICAzMjc2OAorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9NQVhfRFJJVkVSUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoZSBtYXhpbXVtIG51bWJlciBvZiBmb250IGRyaXZlcnMgdGhhdCBjYW4gYmUgcmVnaXN0ZXJlZCBpbiBhICAgICAqLworICAvKiAgICBzaW5nbGUgRnJlZVR5cGUgbGlicmFyeSBvYmplY3QuICA4IHNlZW1zIHRvIGJlIGEgZ29vZCBjaG9pY2UgZHVlICAgKi8KKyAgLyogICAgdG8gdGhlIHJlbGF0aXZlIGxvdyBhY3R1YWwgbnVtYmVyIG9mIGRyaXZlcnMgOy0pICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBGVF9NQVhfRFJJVkVSUyAgOAorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9NQVhfRVhURU5TSU9OUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoZSBtYXhpbXVtIG51bWJlciBvZiBleHRlbnNpb25zIHRoYXQgY2FuIGJlIHJlZ2lzdGVyZWQgaW4gYSAgICAgICAqLworICAvKiAgICBzaW5nbGUgZm9udCBkcml2ZXIuIDggc2VlbXMgdG8gYmUgYSBnb29kIGNob2ljZSBmb3Igbm93Li4gICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZUX01BWF9FWFRFTlNJT05TICA4CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX01BWF9HTFlQSF9GT1JNQVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhlIG1heGltdW0gbnVtYmVyIG9mIGdseXBoIGltYWdlIGZvcm1hdHMgdGhhdCBtaWdodCBiZSByZWdpc3RlcmVkICovCisgIC8qICAgIGluIGEgZ2l2ZW4gbGlicmFyeSBpbnN0YW5jZS4gOCBzZWVtcyB0byBiZSBhIGdvb2QgY2hvaWNlIGR1ZSB0byAgICAqLworICAvKiAgICB0aGUgcmVsYXRpdmVseSBsb3cgbnVtYmVyIG9mIGN1cnJlbnQgZm9ybWF0cyA7LSkgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyNkZWZpbmUgRlRfTUFYX0dMWVBIX0ZPUk1BVFMgIDgKKworCisKKyNlbmRpZiAvKiBGVE9QVElPTl9IICovCmRpZmYgLS1naXQgYS9jb25maWcvYW5zaS9mdHN5cy5jIGIvY29uZmlnL2Fuc2kvZnRzeXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDQyZDU2Ci0tLSAvZGV2L251bGwKKysrIGIvY29uZmlnL2Fuc2kvZnRzeXMuYwpAQCAtMCwwICsxLDk3MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgZnRzeXMuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFOU0ktc3BlY2lmaWMgc3lzdGVtIG9wZXJhdGlvbnMgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAxOTk2LTE5OTkgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCAgICAgICAgKi8KKy8qICBtb2RpZmllZCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgICovCisvKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLworLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KKy8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgYGZ0c3lzJyBjb21wb25lbnQgdXNlcyB0aGUgc3RhbmRhcmQgQU5TSSBDICovCisgIC8qIGxpYnJhcnkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogSU1QT1JUQU5UIE5PVEU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBQb3J0ZXJzLCByZWFkIGNhcmVmdWxseSB0aGUgY29tbWVudHMgaW4gZnRzeXMuaCBiZWZvcmUgdHJ5aW5nIHRvICAgKi8KKyAgLyogICAgcG9ydCB0aGlzIGZpbGUgdG8geW91ciBzeXN0ZW0uICBJdCBjb250YWlucyBtYW55IGVzc2VudGlhbCAgICAgICAgICovCisgIC8qICAgIHJlbWFya3MsIGFuZCB3aWxsIGVhc2UgeW91ciB3b3JrIGdyZWF0bHkuICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2luY2x1ZGUgImZ0c3lzLmgiCisjaW5jbHVkZSAiZnRzdHJlYW0uaCIKKyNpbmNsdWRlICJmdGRlYnVnLmgiCisKKworI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fREVCVUdfTUVNT1JZCisjaW5jbHVkZSAibWVtZGVidWcuYyIKKyNlbmRpZgorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQgICAgICAqLworICAvKiBwYXJhbWV0ZXIgb2YgdGhlIFBUUkFDRSgpIGFuZCBQRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nICAgICAgKi8KKyAgLyogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI3VuZGVmICBGVF9DT01QT05FTlQKKyNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV9pbworCisKKyN1bmRlZiAgQ1VSX1NZU1RFTSAgLyoganVzdCBpbiBjYXNlICovCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFRvIGVhc2UgcG9ydGluZywgd2UgdXNlIHRoZSBtYWNybyBTWVNfU1RSRUFNIHRvIG5hbWUgdGhlICAgICAgICAgICAgICAqLworICAvKiBzeXN0ZW0tc3BlY2lmaWMgc3RyZWFtIHR5cGUuICBGb3IgZXhhbXBsZSwgaXQgaXMgYSBgRklMRSonIHdpdGggdGhlICAgKi8KKyAgLyogQU5TSSBsaWJjLCBpdCB3aWxsIGJlIGEgZmlsZSBkZXNjcmlwdG9yLCBpLmUuIGFuIGludGVnZXIsIHdoZW4gdXNpbmcgICovCisgIC8qIHRoZSBVbml4IHN5c3RlbSBBUEksIGV0Yy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU1lTX1NUUkVBTSAgRklMRSoKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiBmdHN5cyB1c2VzIHRoZSBBTlNJIEMgbGlicmFyeS4gIE1lbW9yeSAgICAgICAgICovCisgIC8qIG1hbmFnZW1lbnQgaXMgcGVyZm9ybWVkIHRocm91Z2ggbWFsbG9jL2ZyZWUsIGkvbyBhY2Nlc3MgdGhyb3VnaCAgICAgICAqLworICAvKiBmb3Blbi9mcmVhZC9mc2VlaywgYW5kIG5vIHN5bmNocm9uaXNhdGlvbiBwcmltaXRpdmUgaXMgaW1wbGVtZW50ZWQgICAgKi8KKyAgLyogKHRoZXkgY29udGFpbiBkdW1teSBjb2RlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgSS9PIEFDQ0VTUyBBTkQgTUFOQUdFTUVOVCAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBXZSBvbmx5IGRlZmluZSB0aGUgYEFOU0knIHJlc291cmNlIGNsYXNzIGluIHRoaXMgY2xhc3MuICBJdCBpcyAgICAgICAgKi8KKyAgLyogZGlzay1iYXNlZCBhbmQgcHJvdmlkZXMgYSBNUlUgY2FjaGUgaW4gb3JkZXIgdG8gb25seSBrZWVwIHRoZSBmaWxlICAgICovCisgIC8qIGRlc2NyaXB0b3JzIG9mIHRoZSAxMCBtb3N0IHJlY2VudGx5IHVzZWQgcmVzb3VyY2UgZmlsZXMuICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogSXQgc2ltcGx5IGNvbnRhaW5zIHR3byBsaXN0cy4gIE9uZSBjb250YWlucyB0aGUgYGNhY2hlZCcgcmVzb3VyY2VzICAgICovCisgIC8qIHdpdGggYSB2YWxpZCBGSUxFKiBwb2ludGVyLCB0aGUgc2Vjb25kIGNvbnRhaW5zIGFsbCBvdGhlciBgZmx1c2hlZCcgICAqLworICAvKiByZXNvdXJjZSBvYmplY3RzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfQW5zaUZpbGVSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhlIEZUX0Fuc2lGaWxlIGNsYXNzIGRlcml2ZXMgZnJvbSBGVF9SZXNvdXJjZVJlYy4gICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgcm9vdCAgICAgIDo6IFRoZSByb290IHJlc291cmNlIGNsYXNzIGZpZWxkcy4gICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBwYXRobmFtZSAgOjogVGhpcyBpcyBhIGNvcHkgb2YgdGhlIEFOU0kgZmlsZSBwYXRobmFtZSB1c2VkIHRvIG9wZW4gKi8KKyAgLyogICAgICAgICAgICAgICAgIHN0cmVhbXMgZm9yIHRoZSByZXNvdXJjZS4gIEEgZGlmZmVyZW50IGltcGxlbWVudGF0aW9uICovCisgIC8qICAgICAgICAgICAgICAgICBpcyBmcmVlIHRvIHVzZSBVbmljb2RlIGNoYXJzLCBvciBmaWxlIGktbm9kZSBudW1iZXJzLCAqLworICAvKiAgICAgICAgICAgICAgICAgZXRjLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZpbGVfc2l6ZSA6OiBUaGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgcmVzb3VyY2UuICBUaGlzIGZpZWxkIHNob3VsZCAqLworICAvKiAgICAgICAgICAgICAgICAgYmUgc2V0IHRvIC0xIHVudGlsIHRoZSByZXNvdXJjZSBpcyBmaXJzdCBvcGVuZWQuICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgc3RydWN0ICBGVF9BbnNpRmlsZVJlY18KKyAgeworICAgIEZUX1Jlc291cmNlUmVjICByb290OworICAgIGNoYXIqICAgICAgICAgICBwYXRobmFtZTsgICAvKiB0aGUgZm9udCBmaWxlJ3MgcGF0aG5hbWUgICAgICAgICAgICovCisgICAgRlRfTG9uZyAgICAgICAgIGZpbGVfc2l6ZTsgIC8qIGZpbGUgc2l6ZSBpbiBieXRlcyAgICAgICAgICAgICAgICAgKi8KKworICB9IEZUX0Fuc2lGaWxlUmVjLCAqRlRfQW5zaUZpbGU7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFdlIHVzZSB0aGUgbWFjcm8gU1RSRUFNX05hbWUoKSBhcyBhIGNvbnZlbmllbmNlIHRvIHJldHVybiBhIGdpdmVuICAgICAqLworICAvKiBBTlNJIHJlc291cmNlJ3MgcGF0aG5hbWUuICBJdHMgYHN0cmVhbScgYXJndW1lbnQgaXMgYSBGVF9SZXNvdXJjZSAgICAgKi8KKyAgLyogd2hpY2ggaXMgdHlwZWNhc3RlZCB0byB0aGUgRlRfQW5zaUZpbGUgY2xhc3MuICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBTVFJFQU1fTmFtZSggc3RyZWFtICkgICgoRlRfQW5zaUZpbGUpc3RyZWFtLT5yZXNvdXJjZSktPnBhdGhuYW1lCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFdlIHVzZSB0aGUgbWFjcm8gU1RSRUFNX0ZpbGUoKSBhcyBhIGNvbnZlbmllbmNlIHRvIGV4dHJhY3QgdGhlICAgICAgICAqLworICAvKiBzeXN0ZW0tc3BlY2lmaWMgc3RyZWFtIGhhbmRsZSBmcm9tIGEgZ2l2ZW4gRnJlZVR5cGUgc3RyZWFtIG9iamVjdC4gICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFNUUkVBTV9GaWxlKCBzdHJlYW0gKSAgKChGSUxFKilzdHJlYW0tPnN0cmVhbV9pZC5wb2ludGVyKQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQW5zaUZpbGVfT3BlbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIG9wZW4gYSBzeXN0ZW0tc3RyZWFtIGZvciBhIGdpdmVuICAgICAgICAgICovCisgIC8qICAgIHJlc291cmNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgTm90ZSB0aGF0IGl0IG11c3QgdXBkYXRlIHRoZSB0YXJnZXQgRnJlZVR5cGUgc3RyZWFtIG9iamVjdCB3aXRoICAgICovCisgIC8qICAgIHRoZSBzeXN0ZW0tc3RyZWFtIGhhbmRsZSBhbmQgdGhlIHJlc291cmNlJ3Mgc2l6ZS4gICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQWxzbywgdGhlIGBzdHJlYW0tPmJhc2UnIGZpZWxkIG11c3QgYmUgc2V0IHRvIE5VTEwgZm9yIGRpc2stYmFzZWQgICovCisgIC8qICAgIHJlc291cmNlcywgYW5kIHRvIHRoZSBhZGRyZXNzIGluIG1lbW9yeSBvZiB0aGUgcmVzb3VyY2UncyBmaXJzdCAgICAqLworICAvKiAgICBieXRlIGZvciBtZW1vcnktYmFzZWQgb25lcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICByZXNvdXJjZSA6OiBUaGUgc291cmNlIHJlc291cmNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgc3RyZWFtICAgOjogVGhlIHRhcmdldCBzdHJlYW0gb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhpcyBmdW5jdGlvbiBzaW1wbHkgY2FsbHMgZm9wZW4oKSBpbiB0aGUgcmVzb3VyY2UncyBmaWxlICAgICAgICAgICovCisgIC8qICAgIHBhdGhuYW1lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhlIHN0cmVhbSBvYmplY3QgSVMgTk9UIENSRUFURUQgYnkgdGhpcyBmdW5jdGlvbiwgYnV0IGJ5IGl0cyAgICAgICovCisgIC8qICAgIGNhbGxlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgc3RhdGljCisgIEZUX0Vycm9yICBBbnNpRmlsZV9PcGVuKCBGVF9BbnNpRmlsZSAgcmVzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gICAgc3RyZWFtICkKKyAgeworICAgIEZJTEUqICBmaWxlOworCisgICAgLyogb3BlbiB0aGUgZmlsZSAqLworICAgIGZpbGUgPSBmb3BlbiggcmVzb3VyY2UtPnBhdGhuYW1lLCAicmIiICk7CisgICAgaWYgKCAhZmlsZSApCisgICAgeworICAgICAgUEVSUk9SKCggIkFuc2lGaWxlX09wZW46IENvdWxkIG5vdCBvcGVuIGZpbGUgYCVzJ1xuIiwKKyAgICAgICAgICAgICAgIHJlc291cmNlLT5wYXRobmFtZSApKTsKKyAgICAgIHJldHVybiBGVF9FcnJfQ2Fubm90X09wZW5fU3RyZWFtOworICAgIH0KKworICAgIC8qIGNvbXB1dGUgZmlsZSBzaXplIGlmIG5lY2Vzc2FyeSAqLworICAgIGlmICggcmVzb3VyY2UtPmZpbGVfc2l6ZSA8IDAgKQorICAgIHsKKyAgICAgIGZzZWVrKCBmaWxlLCAwLCBTRUVLX0VORCApOworICAgICAgcmVzb3VyY2UtPmZpbGVfc2l6ZSA9IGZ0ZWxsKCBmaWxlICk7CisgICAgICBmc2VlayggZmlsZSwgMCwgU0VFS19TRVQgKTsKKyAgICB9CisKKyAgICBzdHJlYW0tPnJlc291cmNlICAgICAgICAgID0gKEZUX1Jlc291cmNlKXJlc291cmNlOworICAgIHN0cmVhbS0+c3RyZWFtX2lkLnBvaW50ZXIgPSBmaWxlOworICAgIHN0cmVhbS0+c2l6ZSAgICAgICAgICAgICAgPSByZXNvdXJjZS0+ZmlsZV9zaXplOworCisgICAgLyogaXQncyBhIGRpc2stYmFzZWQgcmVzb3VyY2UsIHdlIGRvbid0IG5lZWQgdG8gdXNlIHRoZSBgYmFzZScgYW5kICAgKi8KKyAgICAvKiBgY3Vyc29yJyBmaWVsZHMgb2YgdGhlIHN0cmVhbSBvYmplY3RzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIHN0cmVhbS0+YmFzZSAgICAgICAgICAgICAgPSBOVUxMOworICAgIHN0cmVhbS0+Y3Vyc29yICAgICAgICAgICAgPSBOVUxMOworCisgICAgUFRSQUNFMSgoICJBbnNpRmlsZV9PcGVuOiBPcGVuZWQgYCVzJyAoJWQgYnl0ZXMpIHN1Y2Nlc3NmdWxseVxuIiwKKyAgICAgICAgICAgICAgcmVzb3VyY2UtPnBhdGhuYW1lLCByZXNvdXJjZS0+ZmlsZV9zaXplICkpOworCisgICAgcmV0dXJuIEZUX0Vycl9PazsKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQW5zaUZpbGVfQ2xvc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQ2xvc2VzIGEgZ2l2ZW4gc3RyZWFtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgc3RyZWFtIDo6IFRoZSB0YXJnZXQgc3RyZWFtIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhpcyBmdW5jdGlvbiBzaW1wbHkgY2FsbHMgZmNsb3NlKCkgb24gdGhlIHN0cmVhbSdzIEFOU0kgRklMRSAgICAgICovCisgIC8qICAgIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgc3RhdGljCisgIEZUX0Vycm9yICBBbnNpRmlsZV9DbG9zZSggRlRfU3RyZWFtICBzdHJlYW0gKQorICB7CisgICAgUFRSQUNFMSgoICJBbnNpRmlsZV9DbG9zZTogQ2xvc2luZyBmaWxlIGAlcydcbiIsIFNUUkVBTV9OYW1lKCBzdHJlYW0gKSApKTsKKworICAgIGZjbG9zZSggU1RSRUFNX0ZpbGUoIHN0cmVhbSApICk7CisKKyAgICBzdHJlYW0tPnJlc291cmNlICAgICAgICAgID0gTlVMTDsKKyAgICBzdHJlYW0tPnN0cmVhbV9pZC5wb2ludGVyID0gTlVMTDsKKyAgICBzdHJlYW0tPnNpemUgICAgICAgICAgICAgID0gMDsKKworICAgIHJldHVybiBGVF9FcnJfT2s7CisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEFuc2lGaWxlX1NlZWsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFNlZWtzIGEgc3RyZWFtIHRvIGEgZ2l2ZW4gcG9zaXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHN0cmVhbSAgIDo6IFRoZSB0YXJnZXQgc3RyZWFtIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBwb3NpdGlvbiA6OiBUaGUgb2Zmc2V0IGluIGJ5dGVzIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgcmVzb3VyY2Uvc3RyZWFtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhpcyBmdW5jdGlvbiBzaW1wbHkgY2FsbHMgZnNlZWsoKSBvbiB0aGUgc3RyZWFtLiAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGUgYHNlZWsnIG1ldGhvZCBpcyBuZXZlciBjYWxsZWQgYnkgdGhlIHN0cmVhbSBtYW5hZ2VyIGluIGNhc2UgICAgKi8KKyAgLyogICAgb2YgYSBtZW1vcnktYmFzZWQgcmVzb3VyY2UgKGkuZS4sIHdoZW4gYHN0cmVhbS0+YmFzZScgaXNuJ3QgTlVMTCkuICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBzdGF0aWMKKyAgRlRfRXJyb3IgIEFuc2lGaWxlX1NlZWsoIEZUX1N0cmVhbSAgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICBwb3NpdGlvbiApCisgIHsKKyAgICBpZiAoIGZzZWVrKCBTVFJFQU1fRmlsZSggc3RyZWFtICksIHBvc2l0aW9uLCBTRUVLX1NFVCApICkKKyAgICB7CisgICAgICBQRVJST1IoKCAiQW5zaUZpbGVfU2VlazogRkFJTEVEISAgUG9zLiAlbGQgb2YgYCVzJ1xuIiwKKyAgICAgICAgICAgICAgIHBvc2l0aW9uLCBTVFJFQU1fTmFtZSggc3RyZWFtICkgKSk7CisKKyAgICAgIHJldHVybiBGVF9FcnJfSW52YWxpZF9TdHJlYW1fU2VlazsKKyAgICB9CisKKyAgICBQVFJBQ0UyKCggIkFuc2lGaWxlX1NlZWs6IFBvcy4gJWxkIG9mIGAlcydcbiIsCisgICAgICAgICAgICAgIHBvc2l0aW9uLCBTVFJFQU1fTmFtZSggc3RyZWFtICkgKSk7CisKKyAgICByZXR1cm4gRlRfRXJyX09rOworICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBbnNpRmlsZV9Ta2lwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBTa2lwcyBhIGdpdmVuIG51bWJlciBvZiBieXRlcyBpbiBhbiBBTlNJIHN0cmVhbS4gIFVzZWZ1bCB0byBza2lwICAgKi8KKyAgLyogICAgcGFkIGJ5dGVzLCBmb3IgZXhhbXBsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgc3RyZWFtIDo6IFRoZSB0YXJnZXQgc3RyZWFtIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGNvdW50ICA6OiBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHNraXAgaW4gdGhlIHN0cmVhbS4gICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoaXMgZnVuY3Rpb24gc2ltcGx5IGNhbGxzIGZzZWVrKCkgb24gdGhlIHN0cmVhbS4gICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhlIGBza2lwJyBtZXRob2QgaXMgbmV2ZXIgY2FsbGVkIGJ5IHRoZSBzdHJlYW0gbWFuYWdlciBpbiBjYXNlICAgICovCisgIC8qICAgIG9mIGEgbWVtb3J5LWJhc2VkIHJlc291cmNlIChpLmUuLCB3aGVuIGBzdHJlYW0tPmJhc2UnIGlzbid0IE5VTEwpLiAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgc3RhdGljCisgIEZUX0Vycm9yICBBbnNpRmlsZV9Ta2lwKCBGVF9TdHJlYW0gIHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgY291bnQgKQorICB7CisgICAgaWYgKCBmc2VlayggU1RSRUFNX0ZpbGUoIHN0cmVhbSApLCBjb3VudCwgU0VFS19DVVIgKSApCisgICAgeworICAgICAgUEVSUk9SKCggIkFuc2lGaWxlX1NraXA6IEZBSUxFRCEgICVsZCBieXRlcyBpbiBgJXMnXG4iLAorICAgICAgICAgICAgICAgY291bnQsIFNUUkVBTV9OYW1lKCBzdHJlYW0gKSApKTsKKworICAgICAgcmV0dXJuIEZUX0Vycl9JbnZhbGlkX1N0cmVhbV9TZWVrOworICAgIH0KKworICAgIFBUUkFDRTIoKCAiQW5zaUZpbGVfU2tpcDogJWxkIGJ5dGVzIGluIGAlcydcbiIsCisgICAgICAgICAgICAgIGNvdW50LCBTVFJFQU1fTmFtZSggc3RyZWFtICkgKSk7CisKKyAgICByZXR1cm4gRlRfRXJyX09rOworICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBbnNpRmlsZV9Qb3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBSZXR1cm5zIHRoZSBjdXJyZW50IG9mZnNldCB3aXRoaW4gYW4gQU5TSSBzdHJlYW0ncyByZXNvdXJjZS4gICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzdHJlYW0gICA6OiBUaGUgdGFyZ2V0IHN0cmVhbSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBwb3NpdGlvbiA6OiBUaGUgY3VycmVudCBvZmZzZXQuICAtMSBpbiBjYXNlIG9mIGVycm9yLiAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGlzIGZ1bmN0aW9uIHNpbXBseSBjYWxscyBmdGVsbCgpIG9uIHRoZSBzdHJlYW0uICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoZSBgcG9zJyBtZXRob2QgaXMgbmV2ZXIgY2FsbGVkIGJ5IHRoZSBzdHJlYW0gbWFuYWdlciBpbiBjYXNlICAgICAqLworICAvKiAgICBvZiBhIG1lbW9yeS1iYXNlZCByZXNvdXJjZSAoaS5lLiwgd2hlbiBgc3RyZWFtLT5iYXNlJyBpc24ndCBOVUxMKS4gKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0YXRpYworICBGVF9FcnJvciAgQW5zaUZpbGVfUG9zKCBGVF9TdHJlYW0gIHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyogICBwb3NpdGlvbiApCisgIHsKKyAgICAqcG9zaXRpb24gPSBmdGVsbCggU1RSRUFNX0ZpbGUoIHN0cmVhbSApICk7CisgICAgaWYgKCAqcG9zaXRpb24gPT0gLTEgKQorICAgIHsKKyAgICAgIFBUUkFDRTIoKCAiQW5zaUZpbGVfUG9zOiBGQUlMRUQhICBJbiBgJXMnXG4iLCBTVFJFQU1fTmFtZSggc3RyZWFtICkgKSk7CisgICAgICByZXR1cm4gRlRfRXJyX0ludmFsaWRfU3RyZWFtX1NlZWs7CisgICAgfQorCisgICAgUFRSQUNFMigoICJBbnNpRmlsZV9Qb3M6IEZvciBgJXMnXG4iLCBTVFJFQU1fTmFtZSggc3RyZWFtICkgKSk7CisgICAgcmV0dXJuIEZUX0Vycl9PazsKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQW5zaUZpbGVfUmVhZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgUmVhZHMgYSBnaXZlbiBudW1iZXIgb2YgYnl0ZXMgZnJvbSBhbiBBTlNJIHN0cmVhbSBpbnRvIG1lbW9yeS4gICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgc3RyZWFtICAgICA6OiBUaGUgdGFyZ2V0IHN0cmVhbSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGJ1ZmZlciAgICAgOjogVGhlIHRhcmdldCByZWFkIGJ1ZmZlciB3aGVyZSBkYXRhIGlzIGNvcGllZC4gICAgICAgICAqLworICAvKiAgICBzaXplICAgICAgIDo6IFRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZCBmcm9tIHRoZSBzdHJlYW0uICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICByZWFkX2J5dGVzIDo6IFRoZSBudW1iZXIgb2YgYnl0ZXMgZWZmZWN0aXZlbHkgcmVhZCBmcm9tIHRoZSAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICBzdHJlYW0uICBVc2VkIGluIGNhc2Ugb2YgZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgKGkuZS4gRlRfRXJyX0ludmFsaWRfU3RyZWFtX1JlYWQpIGJ5IHNvbWUgcGFydHMgb2YgICAqLworICAvKiAgICAgICAgICAgICAgICAgIHRoZSBsaWJyYXJ5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgVGhpcyBmdW5jdGlvbiBzaW1wbHkgY2FsbHMgZnJlYWQoKSBvbiB0aGUgc3RyZWFtLiAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICBJdCBNVVNUIHJldHVybiB0aGUgZXJyb3IgRlRfRXJyX0ludmFsaWRfU3RyZWFtX1JlYWQgaW4gY2FzZSBvZiAgICAgICovCisgIC8qICAgYW4gb3Zlci1yZWFkIChpLmUuLCByZWFkaW5nIG1vcmUgYnl0ZXMgZnJvbSB0aGUgc3RyZWFtIHRoYXQgd2hhdCAgICAqLworICAvKiAgIGlzIGxlZnQpLCBhcyB0aGUgc3RyZWFtIGNvbXBvbmVudCBjaGVja3MgZm9yIHRoaXMgc3BlY2lmaWMgdmFsdWUuICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgVGhlIGByZWFkJyBtZXRob2QgaXMgbmV2ZXIgY2FsbGVkIGJ5IHRoZSBzdHJlYW0gbWFuYWdlciBpbiBjYXNlICAgICAqLworICAvKiAgIG9mIGEgbWVtb3J5LWJhc2VkIHJlc291cmNlIChpLmUuLCB3aGVuIGBzdHJlYW0tPmJhc2UnIGlzbid0IE5VTEwpLiAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0YXRpYworICBGVF9FcnJvciAgQW5zaUZpbGVfUmVhZCggRlRfU3RyZWFtICBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9DaGFyKiAgIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcqICAgcmVhZF9ieXRlcyApCisgIHsKKyAgICAqcmVhZF9ieXRlcyA9IGZyZWFkKCBidWZmZXIsIDEsIHNpemUsIFNUUkVBTV9GaWxlKCBzdHJlYW0gKSApOworICAgIGlmICggKnJlYWRfYnl0ZXMgIT0gc2l6ZSApCisgICAgeworICAgICAgLyogTm90ZSA6IHdlIGNhbiBoYXZlIGFuIG92ZXItcmVhZCBoZXJlIHdoZW4gY2FsbGVkIGJ5IHRoZSAqLworICAgICAgLyogICAgICAgIGZ1bmN0aW9uIEZUX0FjY2Vzc19Db21wcmVzc2VkX0ZyYW1lLiBUaGlzIG1lYW5zICAqLworICAgICAgLyogICAgICAgIHRoYXQgdGhlIGZvbGxvd2luZyBtZXNzYWdlIHNob3VsZCBiZSBhIHRyYWNlLCAgICAqLworICAgICAgLyogICAgICAgIHJhdGhlciB0aGFuIGFuIGVycm9yIGZvciBkaXNrLWJhc2VkIHJlc291cmNlcy4uICAqLworICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgLyogICAgICAgIHRoZSBmdW5jdGlvbiBtdXN0IHNldCB0aGUgdmFsdWUgb2YgJ3JlYWRfYnl0ZXMnICAqLworICAgICAgLyogICAgICAgIGV2ZW4gaWYgaXQgcmV0dXJucyBhbiBlcnJvciBjb2RlLi4gICAgICAgICAgICAgICAqLworICAgICAgUFRSQUNFMigoICJBbnNpRmlsZV9SZWFkOiBGQUlMRUQhICBSZWFkICVsZCBieXRlcyBmcm9tICclcydcbiIsCisgICAgICAgICAgICAgICBzaXplLCBTVFJFQU1fTmFtZSggc3RyZWFtICkgKSk7CisKKyAgICAgIHJldHVybiBGVF9FcnJfSW52YWxpZF9TdHJlYW1fUmVhZDsKKyAgICB9CisKKyAgICBQVFJBQ0UyKCggIkFuc2lGaWxlX1JlYWQ6IFJlYWQgJWxkIGJ5dGVzIHRvIGJ1ZmZlciAweCUwOGx4IGZyb20gYCVzJ1xuIiwKKyAgICAgICAgICAgICAgc2l6ZSwgKGxvbmcpYnVmZmVyLCBTVFJFQU1fTmFtZSggc3RyZWFtICkgKSk7CisgICAgcmV0dXJuIEZUX0Vycl9PazsKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBUaGUgZm9sbG93aW5nIHRhYmxlIGlzIHRoZSBgdmlydHVhbCBtZXRob2QgdGFibGUnIGZvciB0aGUgYEFOU0kgICAgICAgKi8KKyAgLyogcmVzb3VyY2UgY2xhc3MnLCB3aGljaCBtZXRob2RzIGFyZSBkZWZpbmVkIGFib3ZlLiAgSXRzIGFkZHJlc3MgaXMgc2V0ICovCisgIC8qIGluIHRoZSBgaW50ZXJmYWNlJyBmaWVsZCBvZiBhbGwgcmVzb3VyY2Ugb2JqZWN0cyBjcmVhdGVkIGJ5IHRoZSAgICAgICAqLworICAvKiBmdW5jdGlvbiBGVF9DcmVhdGVfQW5zaUZpbGUoKSAoc2VlIGJlbG93KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0YXRpYworICBGVFJlc19JbnRlcmZhY2VSZWMgIEZUX0Fuc2lGaWxlX0ludGVyZmFjZSA9CisgIHsKKyAgICAoRlRSZXNfT3Blbl9GdW5jKSBBbnNpRmlsZV9PcGVuLAorICAgIChGVFJlc19DbG9zZV9GdW5jKUFuc2lGaWxlX0Nsb3NlLAorICAgIChGVFJlc19TZWVrX0Z1bmMpIEFuc2lGaWxlX1NlZWssCisgICAgKEZUUmVzX1NraXBfRnVuYykgQW5zaUZpbGVfU2tpcCwKKyAgICAoRlRSZXNfUG9zX0Z1bmMpICBBbnNpRmlsZV9Qb3MsCisgICAgKEZUUmVzX1JlYWRfRnVuYykgQW5zaUZpbGVfUmVhZCwKKyAgfTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0NyZWF0ZV9SZXNvdXJjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIENyZWF0ZXMgYSBuZXcgcmVzb3VyY2Ugb2JqZWN0LiAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlICAgICAqLworICAvKiAgICBGVF9OZXdfUmVzb3VyY2UoKSBmdW5jdGlvbiBvZiB0aGUgYmFzZSBsYXllci4gICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBsaWJyYXJ5ICAgOjogVGhlIGlucHV0IGxpYnJhcnkgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgcGF0aG5hbWUgIDo6IFRoZSBmaWxlJ3MgcGF0aG5hbWUgYXMgYW4gQVNDSUkgc3RyaW5nLiAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgYXJlc291cmNlIDo6IEEgaGFuZGxlIHRvIG5ldyByZXNvdXJjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhpcyBmdW5jdGlvbnMgZG9lcyBub3Qgb3BlbiBhIHN0cmVhbS4gIEl0IHNpbXBseSBjb3BpZXMgdGhlICAgICAgICovCisgIC8qICAgIHBhdGhuYW1lIHdpdGhpbiBhIGZyZXNoIG5ldyByZXNvdXJjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgRVhQT1JUX0ZVTkMKKyAgRlRfRXJyb3IgIEZUX0NyZWF0ZV9SZXNvdXJjZSggRlRfTGlicmFyeSAgICBsaWJyYXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgIHBhdGhuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9SZXNvdXJjZSogIGFyZXNvdXJjZSApCisgIHsKKyAgICBGVF9JbnQgICAgICAgbGVuOworICAgIEZUX0Fuc2lGaWxlICByZXNvdXJjZTsKKyAgICBGVF9FcnJvciAgICAgZXJyb3I7CisgICAgRlRfU3lzdGVtICAgIHN5c3RlbTsKKworCisgICAgaWYgKCAhbGlicmFyeSApCisgICAgICByZXR1cm4gRlRfRXJyX0ludmFsaWRfTGlicmFyeV9IYW5kbGU7CisKKyAgICBzeXN0ZW0gPSBsaWJyYXJ5LT5zeXN0ZW07CisKKyAgICBpZiAoICFwYXRobmFtZSApCisgICAgICBnb3RvIEZhaWxfTnVsbDsKKworICAgIGxlbiA9IHN0cmxlbiggcGF0aG5hbWUgKTsKKyAgICBpZiAoIGxlbiA9PSAwICkKKyAgICAgIGdvdG8gRmFpbF9OdWxsOworCisgICAgcmVzb3VyY2UgPSBOVUxMOworCisgICAgaWYgKCBBTExPQyggcmVzb3VyY2UsIHNpemVvZiAoICpyZXNvdXJjZSApICkgfHwKKyAgICAgICAgIEFMTE9DKCByZXNvdXJjZS0+cGF0aG5hbWUsIGxlbiArIDEgKSAgICApCisgICAgICBnb3RvIEZhaWxfTWVtb3J5OworCisgICAgcmVzb3VyY2UtPnJvb3QubGlicmFyeSAgID0gbGlicmFyeTsKKyAgICByZXNvdXJjZS0+cm9vdC5pbnRlcmZhY2UgPSAmRlRfQW5zaUZpbGVfSW50ZXJmYWNlOworICAgIHJlc291cmNlLT5yb290LmZsYWdzICAgICA9IEZUX1JFU09VUkNFX1RZUEVfRElTS19CQVNFRDsKKyAgICByZXNvdXJjZS0+ZmlsZV9zaXplICAgICAgPSAtMTsKKyAgICBzdHJjcHkoIHJlc291cmNlLT5wYXRobmFtZSwgcGF0aG5hbWUgKTsKKworICAgIFBUUkFDRTEoKCAiQ3JlYXRlX0Fuc2lGaWxlOiBBbnNpIHJlc291cmNlIGNyZWF0ZWQgZm9yIGAlcydcbiIsCisgICAgICAgICAgICAgIHBhdGhuYW1lICkpOworCisgICAgKmFyZXNvdXJjZSA9IChGVF9SZXNvdXJjZSlyZXNvdXJjZTsKKyAgICByZXR1cm4gRlRfRXJyX09rOworCisgIEZhaWxfTnVsbDoKKyAgICBQRVJST1IoKCAiQ3JlYXRlX0Fuc2lGaWxlOiBOdWxsIHBhdGhuYW1lIVxuIiApKTsKKyAgICByZXR1cm4gRlRfRXJyX0ludmFsaWRfQXJndW1lbnQ7CisKKyAgRmFpbF9NZW1vcnk6CisgICAgaWYgKCByZXNvdXJjZSApCisgICAgICBGUkVFKCByZXNvdXJjZS0+cGF0aG5hbWUgKTsKKyAgICBGUkVFKCByZXNvdXJjZSApOworICAgIFBFUlJPUigoICJDcmVhdGVfQW5zaUZpbGU6IE5vdCBlbm91Z2ggbWVtb3J5IHRvIGNyZWF0ZSByZXNvdXJjZSFcbiIgKSk7CisgICAgcmV0dXJuIGVycm9yOworICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9EZXN0cm95X1Jlc291cmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBEaXNjYXJkcyBhIGdpdmVuIHJlc291cmNlIG9iamVjdCBleHBsaWNpdGx5LiAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICByZXNvdXJjZSA6OiBUaGUgQU5TSSByZXNvdXJjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IGNoZWNrIHdoZXRoZXIgcnVucyBvciBzdHJlYW1zIGFyZSBvcGVuZWQgICAgKi8KKyAgLyogICAgZm9yIHRoZSByZXNvdXJjZSAoZm9yIG5vdywgd2UgYXNzdW1lIGRldmVsb3BlciBpbnRlbGxpZ2VuY2UuICAgICAgICovCisgIC8qICAgIFdlJ2xsIG1vc3QgcHJvYmFibHkgbG93ZXIgb3VyIHN0YW5kYXJkIGxhdGVyIHRvIGVhc2UgZGVidWdnaW5nIDotKSAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgRVhQT1JUX0ZVTkMKKyAgRlRfRXJyb3IgIEZUX0Rlc3Ryb3lfUmVzb3VyY2UoIEZUX1Jlc291cmNlICByZXNvdXJjZSApCisgIHsKKyAgICBGVF9TeXN0ZW0gICAgc3lzdGVtID0gcmVzb3VyY2UtPmxpYnJhcnktPnN5c3RlbTsKKyAgICBGVF9BbnNpRmlsZSAgYW5zaSAgID0gKEZUX0Fuc2lGaWxlKXJlc291cmNlOworCisgICAgaWYgKCAhYW5zaSB8fCBhbnNpLT5yb290LmludGVyZmFjZSAhPSAmRlRfQW5zaUZpbGVfSW50ZXJmYWNlICkKKyAgICB7CisgICAgICBQRVJST1IoKAorICAgICAgICAiRGVzdHJveV9BbnNpRmlsZTogVHJ5aW5nIHRvIGRlc3Ryb3kgYW4gaW52YWxpZCByZXNvdXJjZSFcbiIgKSk7CisgICAgICByZXR1cm4gRlRfRXJyX0ludmFsaWRfUmVzb3VyY2VfSGFuZGxlOworICAgIH0KKworICAgIFBUUkFDRTEoKCAiRGVzdHJveV9BbnNpRmlsZTogRGVzdHJveWluZyByZXNvdXJjZSBmb3IgYCVzJ1xuIiwKKyAgICAgICAgICAgICAgYW5zaS0+cGF0aG5hbWUgKSk7CisKKyAgICBGUkVFKCBhbnNpLT5wYXRobmFtZSApOworICAgIEZSRUUoIGFuc2kgKTsKKworICAgIHJldHVybiBGVF9FcnJfT2s7CisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgIE1FTU9SWSBNQU5BR0VNRU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogIFRoaXMgcGFydCBjb3BpZXMgdGhlIG9sZCBGcmVlVHlwZSAxLjAgYW5kIDEuMSBtZW1vcnkgbWFuYWdlbWVudCAgICAgICovCisgIC8qICBzY2hlbWUgdGhhdCB3YXMgZGVmaW5lZCBpbiB0aGUgZmlsZSBgdHRtZW1vcnkuaCcuICBPbmUgY2FuIHNlZSB0aGF0ICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogIC0gYSBzZXQgb2YgbWFjcm9zIGlzIGRlZmluZWQgZm9yIHRoZSBtZW1vcnkgb3BlcmF0aW9ucyB1c2VkIGJ5IHRoZSAgICovCisgIC8qICAgIGVuZ2luZSAoTUVNX0NvcHkoKSwgTUVNX01vdmUoKSwgTUVNX1NldCgpKS4gIFRoaXMgY29tZXMgZnJvbSB0aGUgICAqLworICAvKiAgICBmYWN0IHRoYXQgbWFueSBjb21waWxlcnMgYXJlIGFibGUgdG8gaW5saW5lIHRoZXNlIG9wZXJhdGlvbnMgICAgICAgKi8KKyAgLyogICAgZGlyZWN0bHkgd2l0aGluIHRoZSBjb21waWxlZCBjb2RlLCByYXRoZXIgdGhhbiBnZW5lcmF0aW5nIGEgY2FsbCAgICovCisgIC8qICAgIHRvIHRoZSBDIGxpYnJhcnkuICBIb3dldmVyLCB0aGlzIG9ibGlnZXMgdXMgdG8gaW5jbHVkZSB0aGUgICAgICAgICAqLworICAvKiAgICBgPHN0cmluZy5oPicgaGVhZGVyIGZpbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIElmIHlvdSBwcm92aWRlIHlvdXIgb3duIG1lbW9yeSBvcGVyYXRpb25zLCB5b3UgY2FuIGdldCByaWQgb2YgdGhlICAqLworICAvKiAgICBgI2luY2x1ZGUgPHN0cmluZy5oPicgYmVsb3cuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgLSB0aGUgRlRfQWxsb2MoKSBmdW5jdGlvbiBoYXMgc2V2ZXJhbCBlc3NlbnRpYWwgcHJvcGVydGllcyB0aGF0IE1VU1QgKi8KKyAgLyogICAgYmUgcmV0YWluZWQgYnkgZWFjaCBwb3J0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAtIEl0IHJldHVybnMgYW4gZXJyb3IgY29kZSwgTk9UIHRoZSBhbGxvY2F0ZWQgYmxvY2sncyBiYXNlICAgICAgICAgKi8KKyAgLyogICAgICBhZGRyZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAtIEl0IHRha2VzIHRoZSBhZGRyZXNzIG9mIGEgdGFyZ2V0IHBvaW50ZXIsIHdoZXJlIHRoZSBibG9jaydzIGJhc2UgKi8KKyAgLyogICAgICBhZGRyZXNzIHdpbGwgYmUgc2V0LiAgSWYgdGhlIHNpemUgaXMgemVybywgaXRzIHZhbHVlIHdpbGwgYmUgICAgICovCisgIC8qICAgICAgTlVMTCwgYW5kIHRoZSBmdW5jdGlvbiByZXR1cm5zIHN1Y2Nlc3NmdWxseS4gICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgLSBJbiBjYXNlIG9mIGVycm9yLCB0aGUgcG9pbnRlcidzIHZhbHVlIGlzIHNldCB0byBOVUxMIGFuZCBhbiAgICAgICovCisgIC8qICAgICAgZXJyb3IgY29kZSBpcyByZXR1cm5lZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgLSBUaGUgbmV3IGFsbG9jYXRlZCBibG9jayBNVVNUIGJlIHplcm8tZmlsbGVkLiAgVGhpcyBpcyBhIHN0cm9uZyAgICovCisgIC8qICAgICAgY29udmVudGlvbiB0aGUgcmVzdCBvZiB0aGUgZW5naW5lIHJlbGllcyBvbi4gICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAtIHRoZSBGVF9GcmVlKCkgZnVuY3Rpb24gaGFzIGFsc28gaXRzIGVzc2VudGlhbHM6ICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgLSBJdCB0YWtlcyB0aGUgYWRkcmVzcyBvZiBhIHBvaW50ZXIgd2hpY2ggdmFsdWUgaXMgdGhlIGJsb2NrJ3MgICAgICovCisgIC8qICAgICAgYmFzZSBhZGRyZXNzLiAgVGhpcyBpcyBVTkxJS0UgYSBzdGFuZGFyZCBgZnJlZSgpJyB3aGljaCB0YWtlcyAgICAqLworICAvKiAgICAgIHRoZSBibG9jaydzIGJhc2UgZGlyZWN0bHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIC0gSXQgYWNjZXB0cyBzdWNjZXNzZnVsbHkgdGhlIGFkZHJlc3Mgb2YgYSBwb2ludGVyIHdoaWNoIHZhbHVlIGlzICAqLworICAvKiAgICAgIE5VTEwsIGluIHdoaWNoIGNhc2UgaXQgc2ltcGx5IHJldHVybnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIC0gVGhlIHBvaW50ZXIgaXMgYWx3YXlzIHNldCB0byBOVUxMIGJ5IHRoZSBmdW5jdGlvbi4gICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAtIFRoZSBNRU1fQWxsb2MoKSwgQUxMT0MoKSwgYW5kIEFMTE9DX0FSUkFZKCkgbWFjcm9zIGFyZSB1c2VkIGJ5IHRoZSAqLworICAvKiAgICBsaWJyYXJ5IGFuZCBzaG91bGQgTk9UIGJlIG1vZGlmaWVkIGJ5IHBvcnRlcnMhICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0ICAgICAgKi8KKyAgLyogcGFyYW1ldGVyIG9mIHRoZSBQVFJBQ0UoKSBhbmQgUEVSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZyAgICAgICovCisgIC8qIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyN1bmRlZiAgRlRfQ09NUE9ORU5UCisjZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfbWVtb3J5CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9BbGxvYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBbGxvY2F0ZXMgYSBuZXcgYmxvY2sgb2YgbWVtb3J5LiAgVGhlIHJldHVybmVkIGFyZWEgaXMgYWx3YXlzICAgICAgKi8KKyAgLyogICAgemVyby1maWxsZWQsIHRoaXMgaXMgYSBzdHJvbmcgY29udmVudGlvbiBpbiBtYW55IEZyZWVUeXBlIHBhcnRzLiAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgc3lzdGVtIDo6IEEgaGFuZGxlIHRvIGEgZ2l2ZW4gYHN5c3RlbSBvYmplY3QnIHdoZXJlIGFsbG9jYXRpb24gICAgICovCisgIC8qICAgICAgICAgICAgICBvY2N1cnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgc2l6ZSAgIDo6IFRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSBibG9jayB0byBhbGxvY2F0ZS4gICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgUCAgICAgIDo6IEEgcG9pbnRlciB0byB0aGUgZnJlc2ggbmV3IGJsb2NrLiAgSXQgc2hvdWxkIGJlIHNldCB0byAgICovCisgIC8qICAgICAgICAgICAgICBOVUxMIGlmIGBzaXplJyBpcyAwLCBvciBpbiBjYXNlIG9mIGVycm9yLiAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgQkFTRV9GVU5DCisgIEZUX0Vycm9yICBGVF9BbGxvYyggRlRfU3lzdGVtICBzeXN0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICBzaXplLAorICAgICAgICAgICAgICAgICAgICAgIHZvaWQqKiAgICAgUCApCisgIHsKKyAgICBpZiAoICFQICkKKyAgICB7CisgICAgICBQRVJST1IoKCAiRlRfQWxsb2M6IEludmFsaWQgcG9pbnRlciBhZGRyZXNzIVxuIiApKTsKKyAgICAgIHJldHVybiBGVF9FcnJfSW52YWxpZF9Bcmd1bWVudDsKKyAgICB9CisKKyAgICBpZiAoIHNpemUgPiAwICkKKyAgICB7CisgICAgICAqUCA9IG1hbGxvYyggc2l6ZSApOworICAgICAgaWYgKCAhKlAgKQorICAgICAgeworICAgICAgICBQRVJST1IoKCAiRlRfQWxsb2M6IE91dCBvZiBtZW1vcnkgKCVsZCBieXRlcyByZXF1ZXN0ZWQpIVxuIiwKKyAgICAgICAgICAgICAgICAgc2l6ZSApKTsKKworICAgICAgICByZXR1cm4gRlRfRXJyX091dF9PZl9NZW1vcnk7CisgICAgICB9CisKKyNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX0RFQlVHX01FTU9SWQorICAgICAgRE1fUmVjb3JkKCAoY2hhciopKlAsIHNpemUgKTsKKyNlbmRpZgorCisgICAgICBzeXN0ZW0tPnRvdGFsX2FsbG9jICs9IHNpemU7CisKKyAgICAgIC8qIEFMV0FZUyBaRVJPLUZJTEwgVEhFIEJMT0NLISAqLworICAgICAgTUVNX1NldCggKlAsIDAsIHNpemUgKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgKlAgPSBOVUxMOworCisgICAgUFRSQUNFMigoICJGVF9BbGxvYzogU2l6ZSA9ICVsZCwgcG9pbnRlciA9IDB4JTA4bHgsIGJsb2NrID0gMHglMDhseFxuIiwKKyAgICAgICAgICAgICAgc2l6ZSwgKGxvbmcpUCwgKGxvbmcpKlAgKSk7CisKKyAgICByZXR1cm4gRlRfRXJyX09rOworICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9SZWFsbG9jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBSZWFsbG9jYXRlcyBhIGJsb2NrIG9mIG1lbW9yeSBwb2ludGVkIHRvIGJ5IGAqUCcgdG8gYFNpemUnIGJ5dGVzICAgKi8KKyAgLyogICAgZnJvbSB0aGUgaGVhcCwgcG9zc2libHkgY2hhbmdpbmcgYCpQJy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgc3lzdGVtIDo6IEEgaGFuZGxlIHRvIGEgZ2l2ZW4gYHN5c3RlbSBvYmplY3QnIHdoZXJlIGFsbG9jYXRpb24gICAgICovCisgIC8qICAgICAgICAgICAgICBvY2N1cnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgc2l6ZSAgIDo6IFRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSBibG9jayB0byBhbGxvY2F0ZS4gICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgUCAgICAgIDo6IEEgcG9pbnRlciB0byB0aGUgZnJlc2ggbmV3IGJsb2NrLiAgSXQgc2hvdWxkIGJlIHNldCB0byAgICovCisgIC8qICAgICAgICAgICAgICBOVUxMIGlmIGBzaXplJyBpcyAwLCBvciBpbiBjYXNlIG9mIGVycm9yLiAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgQkFTRV9GVU5DCisgIEZUX0Vycm9yICBGVF9SZWFsbG9jKCBGVF9TeXN0ZW0gIHN5c3RlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAqUCApCisgIHsKKyAgICB2b2lkKiAgUTsKKworCisgICAgaWYgKCAhUCApCisgICAgeworICAgICAgUEVSUk9SKCggIkZUX1JlYWxsb2M6IEludmFsaWQgcG9pbnRlciBhZGRyZXNzIVxuIiApKTsKKyAgICAgIHJldHVybiBGVF9FcnJfSW52YWxpZF9Bcmd1bWVudDsKKyAgICB9CisKKyAgICAvKiBpZiB0aGUgb3JpZ2luYWwgcG9pbnRlciBpcyBOVUxMLCBjYWxsIEZUX0FsbG9jKCkgKi8KKyAgICBpZiAoICEqUCApCisgICAgICByZXR1cm4gRlRfQWxsb2MoIHN5c3RlbSwgc2l6ZSwgUCApOworCisgICAgLyogaWYgdGhlIG5ldyBibG9jayBpZiB6ZXJvLXNpemVkLCBjbGVhciB0aGUgY3VycmVudCBvbmUgKi8KKyAgICBpZiAoIHNpemUgPD0gMCApCisgICAgICByZXR1cm4gRlRfRnJlZSggc3lzdGVtLCBQICk7CisKKyNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX0RFQlVHX01FTU9SWQorICAgIERNX0ZvcmdldCggKGNoYXIqKSpQICk7CisjZW5kaWYKKworICAgIFEgPSAodm9pZCopcmVhbGxvYyggKlAsIHNpemUgKTsKKyAgICBpZiAoICFRICkKKyAgICB7CisgICAgICBQRVJST1IoKCAiRlRfUmVhbGxvYzogUmVhbGxvY2F0aW9uIGZhaWxlZCFcbiIgKSk7CisgICAgICByZXR1cm4gRlRfRXJyX091dF9PZl9NZW1vcnk7CisgICAgfQorCisjaWZkZWYgRlRfQ09ORklHX09QVElPTl9ERUJVR19NRU1PUlkKKyAgICBETV9SZWNvcmQoIChjaGFyKilRLCBzaXplICk7CisjZW5kaWYKKworICAgICpQID0gUTsKKyAgICByZXR1cm4gRlRfRXJyX09rOworICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9GcmVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBSZWxlYXNlcyBhIGdpdmVuIGJsb2NrIG9mIG1lbW9yeSBhbGxvY2F0ZWQgdGhyb3VnaCBGVF9BbGxvYygpLiAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzeXN0ZW0gOjogQSBoYW5kbGUgdG8gYSBnaXZlbiBgc3lzdGVtIG9iamVjdCcgd2hlcmUgYWxsb2NhdGlvbiAgICAgKi8KKyAgLyogICAgICAgICAgICAgIG9jY3VyZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBQICAgICAgOjogVGhpcyBpcyB0aGUgX2FkZHJlc3NfIG9mIGEgX3BvaW50ZXJfIHdoaWNoIHBvaW50cyB0byB0aGUgKi8KKyAgLyogICAgICAgICAgICAgIGFsbG9jYXRlZCBibG9jay4gIEl0IGlzIGFsd2F5cyBzZXQgdG8gTlVMTCBvbiBleGl0LiAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgSWYgUCBvciAqUCBhcmUgTlVMTCwgdGhpcyBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIHN1Y2Nlc3NmdWxseS4gICAgICovCisgIC8qICAgIFRoaXMgaXMgYSBzdHJvbmcgY29udmVudGlvbiB3aXRoaW4gYWxsIG9mIEZyZWVUeXBlIGFuZCBpdHMgICAgICAgICAqLworICAvKiAgICBkcml2ZXJzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEJBU0VfRlVOQworICBGVF9FcnJvciAgRlRfRnJlZSggRlRfU3lzdGVtICBzeXN0ZW0sCisgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgKlAgKQorICB7CisgICAgVU5VU0VEKCBzeXN0ZW0gKTsKKworICAgIFBUUkFDRTIoKCAiRlRfRnJlZTogRnJlZWluZyBwb2ludGVyIDB4JTA4bHggKGJsb2NrIDB4JTA4bHgpXG4iLAorICAgICAgICAgICAgICAobG9uZylQLCAoUCA/IChsb25nKSpQIDogLTEpICkpOworCisgICAgaWYgKCAhUCB8fCAhKlAgKQorICAgICAgcmV0dXJuIEZUX0Vycl9PazsKKworICAgIGZyZWUoICpQICk7CisKKyNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX0RFQlVHX01FTU9SWQorICAgIERNX0ZvcmdldCggKGNoYXIqKSpQICk7CisjZW5kaWYKKworICAgICpQID0gTlVMTDsKKworICAgIHJldHVybiBGVF9FcnJfT2s7CisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgIFNZTkNIUk9OSVpBVElPTiBNQU5BR0VNRU5UICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICBUaGlzIHNlY3Rpb24gZGVhbHMgd2l0aCBtdXRleGVzLiAgVGhlIGxpYnJhcnkgY2FuIGJlIGNvbXBpbGVkIHRvICAgICovCisgIC8qICAgdHdvIGRpc3RpbmN0IHRocmVhZCBzdXBwb3J0IGxldmVscyAobmFtZWx5IHNpbmdsZSB0aHJlYWRlZCBhbmQgICAgICAqLworICAvKiAgIHJlLWVudHJhbnQgbW9kZXMpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgSXQgcHJvdGVjdHMgaXRzIHZhcmlhYmxlcyB0aHJvdWdoIHRoZSBNVVRFWF9Mb2NrKCkgYW5kICAgICAgICAgICAgICAqLworICAvKiAgIE1VVEVYX1JlbGVhc2UoKSBtYWNyb3Mgd2hpY2ggYXJlIHZvaWQgaW4gc2luZ2xlIHRocmVhZGVkIG1vZGUuICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgSXQgZGVmaW5lcyBhIHR5cGVsZXNzIG11dGV4IHJlZmVyZW5jZSB0eXBlLCBgRlRfTXV0ZXgnLCB0aGF0IHlvdSdyZSAqLworICAvKiAgIGZyZWUgdG8gcmVkZWZpbmUgZm9yIHlvdXIgc3lzdGVtJ3MgbmVlZHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgZnRzeXMuYyBjb250YWlucyBvbmx5IGR1bW15IGZ1bmN0aW9ucyAqLworICAvKiAgIHdoaWNoIGFsd2F5cyByZXR1cm4gc3VjY2Vzc2Z1bGx5LiAgWW91IE5FRUQgdG8gc3BlY2lhbGl6ZSB0aGVtIGluICAgKi8KKyAgLyogICBvcmRlciB0byBwb3J0IGZ0c3lzLmMgdG8gYW55IG11bHRpLXRocmVhZGVkIGVudmlyb25tZW50LiAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdCAgICAgICovCisgIC8qIHBhcmFtZXRlciBvZiB0aGUgUFRSQUNFKCkgYW5kIFBFUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cgICAgICAqLworICAvKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjdW5kZWYgIEZUX0NPTVBPTkVOVAorI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX3N5bmMKKworCisjaWZkZWYgRlRfQ09ORklHX1RIUkVBRFMKKworICBCQVNFX0ZVTkMKKyAgRlRfRXJyb3IgIEZUX011dGV4X0NyZWF0ZSggRlRfU3lzdGVtICBzeXN0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRNdXRleCogICAgbXV0ZXggKQorICB7CisgICAgVU5VU0VEKCBzeXN0ZW0gKTsKKworICAgIG11dGV4ID0gKHZvaWQqKS0xOworICAgIHN5c3RlbS0+bnVtX211dGV4ZXMrKzsKKworICAgIC8qIEluc2VydCB5b3VyIG93biBtdXRleCBjcmVhdGlvbiBjb2RlIGhlcmUgKi8KKworICAgIHJldHVybiBGVF9FcnJfT2s7CisgIH0KKworCisgIEJBU0VfRlVOQworICB2b2lkICBGVF9NdXRleF9EZWxldGUoIEZUX1N5c3RlbSAgc3lzdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgIFRNdXRleCogICAgbXV0ZXggKQorICB7CisgICAgVU5VU0VEKCBzeXN0ZW0gKTsKKworICAgIG11dGV4ID0gKHZvaWQqKTA7CisgICAgc3lzdGVtLT5udW1fbXV0ZXhlcy0tOworCisgICAgLyogSW5zZXJ0IHlvdXIgb3duIG11dGV4IGRlc3RydWN0aW9uIGNvZGUgaGVyZSAqLworICB9CisKKworICBCQVNFX0ZVTkMKKyAgdm9pZCAgRlRfTXV0ZXhfTG9jayggRlRfU3lzdGVtICBzeXN0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgIFRNdXRleCogICAgbXV0ZXggKQorICB7CisgICAgLyogTk9URTogSXQgaXMgbGVnYWwgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uIHdpdGggYSBOVUxMIGFyZ3VtZW50ICovCisgICAgLyogICAgICAgaW4gd2hpY2ggY2FzZSBhbiBpbW1lZGlhdGUgcmV0dXJuIGlzIGFwcHJvcHJpYXRlLiAgICAgICovCisKKyAgICBVTlVTRUQoIHN5c3RlbSApOworCisgICAgaWYgKCAhbXV0ZXggKQorICAgICAgcmV0dXJuOworCisgICAgLyogSW5zZXJ0IHlvdXIgb3duIG11dGV4IGxvY2tpbmcgY29kZSBoZXJlICovCisgIH0KKworCisgIEJBU0VfRlVOQworICB2b2lkICBGVF9NdXRleF9SZWxlYXNlKCBGVF9TeXN0ZW0gIHN5c3RlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVE11dGV4KiAgICBtdXRleCApCisgIHsKKyAgICAvKiBOT1RFOiBJdCBpcyBsZWdhbCB0byBjYWxsIHRoaXMgZnVuY3Rpb24gd2l0aCBhIE5VTEwgYXJndW1lbnQgKi8KKyAgICAvKiAgICAgICBpbiB3aGljaCBjYXNlIGFuIGltbWVkaWF0ZSByZXR1cm4gaXMgYXBwcm9wcmlhdGUgICAgICAgKi8KKworICAgIFVOVVNFRCggc3lzdGVtICk7CisKKyAgICBpZiAoICFtdXRleCApCisgICAgICByZXR1cm47CisKKyAgICAvKiBJbnNlcnQgeW91ciBvd24gbXV0ZXggcmVsZWFzZSBjb2RlIGhlcmUgKi8KKyAgfQorCisjZW5kaWYgLyogRlRfQ09ORklHX1RIUkVBRFMgKi8KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX05ld19TeXN0ZW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBjcmVhdGUgYW5kIGluaXRpYWxpemUgbmV3IHN5c3RlbSBvYmplY3RzLiAqLworICAvKiAgICBUaGVzZSBhcmUgbWFpbmx5IHVzZWQgdG8gbGV0IGNsaWVudCBhcHBsaWNhdGlvbnMgYW5kIGZvbnQgc2VydmVycyAgKi8KKyAgLyogICAgc3BlY2lmeSB0aGVpciBvd24gbWVtb3J5IGFsbG9jYXRvcnMgYW5kIHN5bmNocm9uaXphdGlvbiAgICAgICAgICAgICovCisgIC8qICAgIHByb2NlZHVyZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHN5c3RlbSA6OiBBIGhhbmRsZSB0byBhIGdpdmVuIGBzeXN0ZW0gb2JqZWN0Jy4gICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgRVhQT1JUX0ZVTkMKKyAgRlRfRXJyb3IgIEZUX05ld19TeXN0ZW0oIEZUX1N5c3RlbSogIHN5c3RlbSApCisgIHsKKyAgICAqc3lzdGVtID0gKEZUX1N5c3RlbSltYWxsb2MoIHNpemVvZiAoICoqc3lzdGVtICkgKTsKKworICAgIGlmICggISpzeXN0ZW0gKQorICAgICAgcmV0dXJuIEZUX0Vycl9PdXRfT2ZfTWVtb3J5OworCisgICAgLyogdGhlIEFOU0kgZnVuY3Rpb24gYGZyZWUoKScgaXMgdW5hYmxlIHRvIHJldHVybiB0aGUgbnVtYmVyICAgKi8KKyAgICAvKiBvZiByZWxlYXNlZCBieXRlcy4gIEhlbmNlLCB0aGUgYGN1cnJlbnRfYWxsb2MnIGZpZWxkIG9mIHRoZSAqLworICAgIC8qIHN5c3RlbSBvYmplY3QgY2Fubm90IGJlIHVzZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICAoKnN5c3RlbSktPnN5c3RlbV9mbGFncyA9IEZUX1NZU1RFTV9GTEFHX1RPVEFMX0FMTE9DIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1NZU1RFTV9GTEFHX01VVEVYRVM7CisgICAgKCpzeXN0ZW0pLT50b3RhbF9hbGxvYyA9IDA7CisgICAgKCpzeXN0ZW0pLT5udW1fbXV0ZXhlcyA9IDA7CisKKyNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX0RFQlVHX01FTU9SWQorICAgIERNX0luaXRfTWVtKCk7CisjZW5kaWYKKworICAgIC8qIGluaXRpYWxpemUgaS9vIG1hbmFnZW1lbnQgKG5vdGhpbmcpICovCisKKyAgICAvKiBpbml0aWFsaXplIHN5bmNocm9uaXNhdGlvbiAobm90aGluZykgKi8KKworICAgIC8qIGluaXRpYWxpemUgc3RyZWFtcyAobm90aGluZykgKi8KKworICAgIHJldHVybiBGVF9FcnJfT2s7CisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0RvbmVfU3lzdGVtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIERlc3Ryb3lzIGEgZ2l2ZW4gRnJlZVR5cGUgc3lzdGVtIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHN5c3RlbSA6OiBBIGhhbmRsZSB0byBhIGdpdmVuIGBzeXN0ZW0gb2JqZWN0Jy4gICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgRVhQT1JUX0ZVTkMKKyAgRlRfRXJyb3IgIEZUX0RvbmVfU3lzdGVtKCBGVF9TeXN0ZW0gIHN5c3RlbSApCisgIHsKKyAgICAvKiBmaW5hbGl6ZSBzeW5jaHJvbml6YXRpb24gKG5vdGhpbmcpICovCisKKyAgICAvKiBmaW5hbGl6ZSBpL28gbWFuYWdlbWVudCAobm90aGluZykgKi8KKworICAgIC8qIGZpbmFsaXplIG1lbW9yeSBtYW5hZ2VtZW50ICovCisKKyNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX0RFQlVHX01FTU9SWQorICAgIERNX0RvbmVfTWVtKCk7CisjZW5kaWYKKworICAgIGZyZWUoIHN5c3RlbSApOworCisgICAgcmV0dXJuIEZUX0Vycl9PazsKKyAgfQorCisKKy8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvY29uZmlnL2Fuc2kvZnRzeXN0ZW0uYyBiL2NvbmZpZy9hbnNpL2Z0c3lzdGVtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU5ZjY2OAotLS0gL2Rldi9udWxsCisrKyBiL2NvbmZpZy9hbnNpL2Z0c3lzdGVtLmMKQEAgLTAsMCArMSwyMTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBmdHN5c3RlbS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjAKKyAqCisgKiAgICBBTlNJLXNwZWNpZmljIEZyZWVUeXBlIGxvdy1sZXZlbCBzeXN0ZW0gaW50ZXJmYWNlCisgKgorICogICAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBkZWZpbml0aW9uIG9mIGludGVyZmFjZSB1c2VkIGJ5IEZyZWVUeXBlCisgKiAgICB0byBhY2Nlc3MgbG93LWxldmVsLCBpLmUuIG1lbW9yeSBtYW5hZ2VtZW50LCBpL28gYWNjZXNzIGFzIHdlbGwKKyAqICAgIGFzIHRocmVhZCBzeW5jaHJvbmlzYXRpb24uICAgICAgICAgICAgICAKKyAqCisgKgorICogIENvcHlyaWdodCAxOTk2LTE5OTkgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCAgICAgICAgICAKKyAqICBtb2RpZmllZCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgICAgCisgKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAgIAorICogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgICAgCisgKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGZ0c3lzdGVtLmg+CisjaW5jbHVkZSA8ZnRlcnJvcnMuaD4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgIE1FTU9SWSBNQU5BR0VNRU5UIElOVEVSRkFDRSAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIDxGdW5jVHlwZT4KKyAqICAgIEZUX0FsbG9jX0Z1bmMKKyAqCisgKiA8RGVzY3JpcHRpb24+CisgKiAgICBUaGUgbWVtb3J5IGFsbG9jYXRvciBmdW5jdGlvbiB0eXBlCisgKgorICogPElucHV0PgorICogICAgc3lzdGVtICAgIDo6IHBvaW50ZXIgdG8gdGhlIHN5c3RlbSBvYmplY3QKKyAqICAgIHNpemUgICAgICA6OiByZXF1ZXN0ZWQgc2l6ZSBpbiBieXRlcworICoKKyAqIDxPdXRwdXQ+CisgKiAgICBibG9jayAgICAgOjogYWRkcmVzcyBvZiBuZXdseSBhbGxvY2F0ZWQgYmxvY2sKKyAqCisgKiA8UmV0dXJuPiAgCisgKiAgICBFcnJvciBjb2RlLiAwIG1lYW5zIHN1Y2Nlc3MuCisgKgorICogPE5vdGU+CisgKiAgICBJZiB5b3VyIGFsbG9jYXRpb24gcm91dGluZSBBTFdBWVMgemVyb2VzIHRoZSBuZXcgYmxvY2ssIHlvdQorICogICAgc2hvdWxkIHNldCB0aGUgZmxhZyBGVF9TWVNURU1fRkxBR19BTExPQ19aRVJPRVMgaW4geW91ciBzeXN0ZW0KKyAqICAgIG9iamVjdCAnZmxhZ3MnIGZpZWxkLgorICoKKyAqICAgIElmIHlvdSBoYXZlIHNldCB0aGUgZmxhZyBGVF9TWVNURU1fRkxBR19SRVBPUlRfQ1VSUkVOVF9BTExPQyBpbgorICogICAgeW91ciBzeXN0ZW0ncyAic3lzdGVtX2ZsYWdzIiBmaWVsZCwgdGhpcyBmdW5jdGlvbiBzaG91bGQgdXBkYXRlCisgKiAgICB0aGUgImN1cnJlbnRfYWxsb2MiIGZpZWxkIG9mIHRoZSBzeXN0ZW0gb2JqZWN0LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgc3RhdGljCisgIHZvaWQqICBmdF9hbGxvYyggRlRfTWVtb3J5ICBtZW1vcnksCisgICAgICAgICAgICAgICAgICAgbG9uZyAgICAgICBzaXplICkKKyAgeworICAgICh2b2lkKW1lbW9yeTsKKyAgICByZXR1cm4gbWFsbG9jKHNpemUpOworICB9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIDxGdW5jVHlwZT4KKyAqICAgIEZUX1JlYWxsb2NfRnVuYworICoKKyAqIDxEZXNjcmlwdGlvbj4KKyAqICAgIFRoZSBtZW1vcnkgcmVhbGxvY2F0b3IgZnVuY3Rpb24gdHlwZQorICoKKyAqIDxJbnB1dD4KKyAqICAgIHN5c3RlbSAgIDo6IHBvaW50ZXIgdG8gdGhlIHN5c3RlbSBvYmplY3QKKyAqICAgIG5ld19zaXplIDo6IG5ldyByZXF1ZXN0ZWQgc2l6ZSBpbiBieXRlcworICoKKyAqIDxJbk91dD4KKyAqICAgIGJsb2NrICAgIDo6IGFkZHJlc3Mgb2YgYmxvY2sgaW4gbWVtb3J5CisgKgorICogPFJldHVybj4KKyAqICAgIEVycm9yIGNvZGUuIDAgbWVhbnMgc3VjY2Vzcy4KKyAqCisgKiA8Tm90ZT4KKyAqICAgIFRoaXMgZnVuY3Rpb24gaXMgX25ldmVyXyBjYWxsZWQgd2hlbiB0aGUgc3lzdGVtIGZsYWcgCisgKiAgICBGVF9TWVNURU1fRkxBR19OT19SRUFMTE9DIGlzIHNldC4gSW5zdGVhZCwgdGhlIGVuZ2luZSB3aWxsIGVtdWxhdGUKKyAqICAgIHJlYWxsb2MgdGhyb3VnaCAiYWxsb2MiIGFuZCAiZnJlZSIuCisgKgorICogICAgTm90ZSB0aGF0IHRoaXMgaXMgcG9zc2libGUgZHVlIHRvIHRoZSBmYWN0IHRoYXQgRnJlZVR5cGUncworICogICAgIkZUX1JlYWxsb2MiIGFsd2F5cyByZXF1ZXN0cyB0aGUgX2N1cnJlbnRfIHNpemUgb2YgdGhlIHJlYWxsb2NhdGVkCisgKiAgICBibG9jayBhcyBhIHBhcmFtZXRlciwgdGh1cyBhdm9pZGluZyBtZW1vcnkgbGVha3MuCisgKgorICogICAgSWYgeW91IGhhdmUgc2V0IHRoZSBmbGFnIEZUX1NZU1RFTV9GTEFHX1JFUE9SVF9DVVJSRU5UX0FMTE9DIGluCisgKiAgICB5b3VyIHN5c3RlbSdzICJzeXN0ZW1fZmxhZ3MiIGZpZWxkLCB0aGlzIGZ1bmN0aW9uIHNob3VsZCB1cGRhdGUKKyAqICAgIHRoZSAiY3VycmVudF9hbGxvYyIgZmllbGQgb2YgdGhlIHN5c3RlbSBvYmplY3QuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICBzdGF0aWMKKyAgdm9pZCogIGZ0X3JlYWxsb2MoIEZUX01lbW9yeSAgbWVtb3J5LAorICAgICAgICAgICAgICAgICAgICAgbG9uZyAgICAgICBjdXJfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgIGxvbmcgICAgICAgbmV3X3NpemUsCisgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgIGJsb2NrICkKKyAgeworICAgICh2b2lkKW1lbW9yeTsKKyAgICAodm9pZCljdXJfc2l6ZTsKKworICAgIHJldHVybiByZWFsbG9jKCBibG9jaywgbmV3X3NpemUgKTsKKyAgfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiA8RnVuY1R5cGU+CisgKiAgICBGVF9GcmVlX0Z1bmMKKyAqCisgKiA8RGVzY3JpcHRpb24+CisgKiAgICBUaGUgbWVtb3J5IHJlbGVhc2UgZnVuY3Rpb24gdHlwZQorICoKKyAqIDxJbnB1dD4KKyAqICAgIHN5c3RlbSAgOjogcG9pbnRlciB0byB0aGUgc3lzdGVtIG9iamVjdAorICogICAgYmxvY2sgICA6OiBhZGRyZXNzIG9mIGJsb2NrIGluIG1lbW9yeQorICoKKyAqIDxOb3RlPgorICogICAgSWYgeW91IGhhdmUgc2V0IHRoZSBmbGFnIEZUX1NZU1RFTV9GTEFHX1JFUE9SVF9DVVJSRU5UX0FMTE9DIGluCisgKiAgICB5b3VyIHN5c3RlbSdzICJzeXN0ZW1fZmxhZ3MiIGZpZWxkLCB0aGlzIGZ1bmN0aW9uIHNob3VsZCB1cGRhdGUKKyAqICAgIHRoZSAiY3VycmVudF9hbGxvYyIgZmllbGQgb2YgdGhlIHN5c3RlbSBvYmplY3QuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICBzdGF0aWMKKyAgdm9pZCAgZnRfZnJlZSggRlRfTWVtb3J5ICBtZW1vcnksCisgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgYmxvY2sgKQorICB7CisgICAgKHZvaWQpbWVtb3J5OworICAgIGZyZWUoIGJsb2NrICk7CisgIH0KKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgIFJFU09VUkNFIE1BTkFHRU1FTlQgSU5URVJGQUNFICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisKKyNkZWZpbmUgU1RSRUFNX0ZJTEUoc3RyZWFtKSAgKChGSUxFKilzdHJlYW0tPmRlc2NyaXB0b3IucG9pbnRlcikKKworICBzdGF0aWMKKyAgdm9pZCAgZnRfY2xvc2Vfc3RyZWFtKCBGVF9TdHJlYW0gIHN0cmVhbSApCisgIHsKKyAgICBmY2xvc2UoIFNUUkVBTV9GSUxFKHN0cmVhbSkgKTsKKyAgfQorCisgIHN0YXRpYworICB1bnNpZ25lZCBsb25nICBmdF9pb19zdHJlYW0oIEZUX1N0cmVhbSAgICAgIHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogICAgICAgICAgYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgIGNvdW50ICkKKyAgeworICAgIEZJTEUqICBmaWxlOworICAgIAorICAgIGZpbGUgPSBTVFJFQU1fRklMRShzdHJlYW0pOworCisgICAgZnNlZWsoIGZpbGUsIG9mZnNldCwgU0VFS19TRVQgKTsgICAgCisgICAgcmV0dXJuICh1bnNpZ25lZCBsb25nKWZyZWFkKCBidWZmZXIsIGNvdW50LCAxLCBmaWxlICk7CisgIH0KKworCisgIGV4dGVybgorICBpbnQgIEZUX05ld19TdHJlYW0oIGNvbnN0IGNoYXIqICBmaWxlcGF0aG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICAgIHN0cmVhbSApCisgIHsKKyAgICBGSUxFKiAgZmlsZTsKKyAgICAKKyAgICBmaWxlID0gZm9wZW4oIGZpbGVwYXRobmFtZSwgInJiIiApOworICAgIGlmICghZmlsZSkKKyAgICAgIHJldHVybiBGVF9FcnJfQ2Fubm90X09wZW5fUmVzb3VyY2U7CisgICAgICAKKyAgICBmc2VlayggZmlsZSwgMCwgU0VFS19FTkQgKTsKKyAgICBzdHJlYW0tPnNpemUgPSBmdGVsbChmaWxlKTsKKyAgICBmc2VlayggZmlsZSwgMCwgU0VFS19TRVQgKTsKKyAgICAKKyAgICBzdHJlYW0tPmRlc2NyaXB0b3IucG9pbnRlciA9IGZpbGU7CisgICAgc3RyZWFtLT5wb3MgICAgICAgICAgICAgICAgPSAwOworICAgIAorICAgIHN0cmVhbS0+cmVhZCAgPSBmdF9pb19zdHJlYW07CisgICAgc3RyZWFtLT5jbG9zZSA9IGZ0X2Nsb3NlX3N0cmVhbTsKKworICAgIHJldHVybiAwOworICB9CisKKworICBleHRlcm4KKyAgRlRfTWVtb3J5ICBGVF9OZXdfTWVtb3J5KCB2b2lkICkKKyAgeworICAgIEZUX01lbW9yeSAgbWVtb3J5OworICAgIAorICAgIG1lbW9yeSA9IChGVF9NZW1vcnkpbWFsbG9jKCBzaXplb2YoKm1lbW9yeSkgKTsKKyAgICBpZiAobWVtb3J5KQorICAgIHsKKyAgICAgIG1lbW9yeS0+dXNlciAgICA9IDA7CisgICAgICBtZW1vcnktPmFsbG9jICAgPSBmdF9hbGxvYzsKKyAgICAgIG1lbW9yeS0+cmVhbGxvYyA9IGZ0X3JlYWxsb2M7CisgICAgICBtZW1vcnktPmZyZWUgICAgPSBmdF9mcmVlOworICAgIH0KKyAgICByZXR1cm4gbWVtb3J5OworICB9CisKZGlmZiAtLWdpdCBhL2NvbmZpZy9hbnNpL21lbWRlYnVnLmMgYi9jb25maWcvYW5zaS9tZW1kZWJ1Zy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhMjc5NjEKLS0tIC9kZXYvbnVsbAorKysgYi9jb25maWcvYW5zaS9tZW1kZWJ1Zy5jCkBAIC0wLDAgKzEsMTQzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBtZW1kZWJ1Zy5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgTWVtb3J5IGRlYnVnZ2luZyBmdW5jdGlvbnMgKGJvZHkgb25seSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDE5OTYtMTk5OSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkICAgICAgICAqLworLyogIG1vZGlmaWVkIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAgKi8KKy8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCisvKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLworLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisKKyAgdHlwZWRlZiBzdHJ1Y3QgIFRCbG9ja1JlY18KKyAgeworICAgIGNoYXIqICBiYXNlOworICAgIGxvbmcgICBzaXplOworCisgIH0gVEJsb2NrUmVjOworCisKKyAgc3RhdGljIFRCbG9ja1JlYyogIG1lbV9ibG9ja3M7CisgIHN0YXRpYyBpbnQgICAgICAgICBudW1fbWVtX2Jsb2NrczsKKyAgc3RhdGljIGludCAgICAgICAgIG1heF9tZW1fYmxvY2tzOworCisKKyAgdm9pZCAgRE1fSW5pdF9NZW0oKQorICB7CisgICAgbnVtX21lbV9ibG9ja3MgPSAwOworICAgIG1heF9tZW1fYmxvY2tzID0gNDA5NjsKKyAgICBtZW1fYmxvY2tzICAgICA9IChUQmxvY2tSZWMqKW1hbGxvYyggbWF4X21lbV9ibG9ja3MgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YgKCAqbWVtX2Jsb2NrcyApICk7CisgIH0KKworCisgIHZvaWQgIERNX0RvbmVfTWVtKCkKKyAgeworICAgIC8qIE5vdyBwcmludCB0aGUgcmVtYWluaW5nIGJsb2NrcyAqLworICAgIGlmICggbnVtX21lbV9ibG9ja3MgPT0gMCApCisgICAgeworICAgICAgZnByaW50Ziggc3RkZXJyLCAiTm8gbWVtb3J5IGxlYWtlZCFcbiIgKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGludCAgaTsKKworCisgICAgICBmcHJpbnRmKCBzdGRlcnIsICJUaGVyZSB3ZXJlICVkIGxlYWtlZCBtZW1vcnkgYmxvY2tzXG5cbiIsCisgICAgICAgICAgICAgICBudW1fbWVtX2Jsb2NrcyApOworCisgICAgICBmcHJpbnRmKCBzdGRlcnIsICJiYXNlICAgICBzaXplXG4iICk7CisgICAgICBmcHJpbnRmKCBzdGRlcnIsICItLS0tLS0tLS0tLS0tLS0tLS1cbiIgKTsKKworICAgICAgZm9yICggaSA9IDA7IGkgPCBudW1fbWVtX2Jsb2NrczsgaSsrICkKKyAgICAgIHsKKyAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiJTA4bHggICUwNGx4XG4iLCAKKyAgICAgICAgICAgICAgICAgKGxvbmcpbWVtX2Jsb2Nrc1tpXS5iYXNlLCBtZW1fYmxvY2tzW2ldLnNpemUgKTsKKyAgICAgIH0KKyAgICB9CisgICAgZnJlZSggbWVtX2Jsb2NrcyApOworICB9CisKKworICB2b2lkICBETV9SZWNvcmQoIGNoYXIqICBiYXNlLAorICAgICAgICAgICAgICAgICAgIGxvbmcgICBzaXplICkKKyAgeworICAgIFRCbG9ja1JlYyogIGJsb2NrOworCisKKyNpZiAwCisgICAgLyogRmlyc3QsIGNoZWNrIHRoYXQgdGhlIGJsb2NrIGlzIG5vdCBsb2NhdGVkIHdpdGhpbiBvbmUgb2YgdGhlICovCisgICAgLyogcmVjb3JkZWQgYmxvY2tzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgZm9yICggaSA9IDA7IGkgPCBudW1fbWVtX2Jsb2NrczsgaSsrICkKKyAgICB7CisgICAgICBjaGFyICAqc3RhcnQsICplbmQsICpfbGltaXQsICpfYmFzZTsKKworCisgICAgICBfYmFzZSAgPSBtZW1fYmxvY2tzW2ldLmJhc2U7CisgICAgICBfbGltaXQgPSBfYmFzZSArIG1lbV9ibG9ja3NbaV0uc2l6ZTsKKworICAgICAgc3RhcnQgPSBiYXNlOworICAgICAgZW5kICAgPSBiYXNlICsgc2l6ZSAtIDE7CisKKyAgICAgIGlmICggKCBzdGFydCA+PSBiYXNlICYmIHN0YXJ0IDwgbGltaXQgKSB8fAorICAgICAgICAgICAoIGVuZCA+PSBiYXNlICYmIGVuZCA8IGxpbWl0ICkgICAgICkKKyAgICAgIHsKKyAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiV2FybmluZzogUmVjb3JkaW5nIGFuIGludmFsaWQgYmxvY2shXG4iICk7CisgICAgICB9CisgICAgfQorI2VuZGlmCisKKyAgICAvKiBBZGQgYmxvY2sgdG8gbGlzdCAqLworICAgIGlmICggbnVtX21lbV9ibG9ja3MgPj0gbWF4X21lbV9ibG9ja3MgKQorICAgIHsKKyAgICAgIG1heF9tZW1fYmxvY2tzICo9IDI7CisgICAgICBtZW1fYmxvY2tzID0gcmVhbGxvYyggbWVtX2Jsb2NrcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfbWVtX2Jsb2NrcyAqIHNpemVvZiAoICptZW1fYmxvY2tzICkgKTsKKyAgICB9CisgICAgYmxvY2sgPSBtZW1fYmxvY2tzICsgbnVtX21lbV9ibG9ja3M7CisgICAgYmxvY2stPmJhc2UgPSBiYXNlOworICAgIGJsb2NrLT5zaXplID0gc2l6ZTsKKyAgICBudW1fbWVtX2Jsb2NrcysrOworICB9CisKKworICB2b2lkICBETV9Gb3JnZXQoIGNoYXIqICBiYXNlICkKKyAgeworICAgIFRCbG9ja1JlYyogIGJsb2NrID0gbWVtX2Jsb2NrczsKKyAgICBpbnQgICAgICAgICBpOworCisKKyAgICBmb3IgKCBpID0gMDsgaSA8IG51bV9tZW1fYmxvY2tzOyBpKyssIGJsb2NrKysgKQorICAgIHsKKyAgICAgIGlmICggYmxvY2stPmJhc2UgPT0gYmFzZSApCisgICAgICB7CisgICAgICAgIC8qIHNpbXBseSBtb3ZlIGxhc3QgYmxvY2sgdG8gdGhlIGN1cnJlbnQgcG9zaXRpb24gKi8KKyAgICAgICAgaWYgKCBudW1fbWVtX2Jsb2NrcyA+IDEgKQorICAgICAgICAgICpibG9jayA9IG1lbV9ibG9ja3NbbnVtX21lbV9ibG9ja3MgLSAxXTsKKworICAgICAgICBudW1fbWVtX2Jsb2Nrcy0tOworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyNpZiAxCisgICAgICBpZiAoIGJhc2UgPj0gYmxvY2stPmJhc2UgJiYgYmFzZSA8IGJsb2NrLT5iYXNlICsgYmxvY2stPnNpemUgKQorICAgICAgeworICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJJbnZhbGlkIGJsb2NrIGZvcmdvdHRlbiFcbiIgKTsKKyAgICAgIH0KKyNlbmRpZgorICAgIH0KKyAgfQorCisKKy8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvY29uZmlnL2RldGVjdC5tayBiL2NvbmZpZy9kZXRlY3QubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGRjYzdjOQotLS0gL2Rldi9udWxsCisrKyBiL2NvbmZpZy9kZXRlY3QubWsKQEAgLTAsMCArMSwxMjcgQEAKKyMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIyogIEZyZWVUeXBlIGhvc3QgcGxhdGZvcm0gZGV0ZWN0aW9uIHJ1bGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisjKiAgQ29weXJpZ2h0IDE5OTYtMTk5OSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgICoKKyMqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisjKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkICAgICAgICAgKgorIyogIG1vZGlmaWVkIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAgICoKKyMqICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICAqCisjKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAgKgorIyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisjKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIyogIFRoaXMgc3ViLU1ha2VmaWxlIGlzIGluIGNoYXJnZSBvZiBkZXRlY3RpbmcgdGhlIGN1cnJlbnQgcGxhdGZvcm0gICAgICAgICoKKyMqICBJdCBzZXRzIHNvbWUgdmFyaWFibGVzIGFjY29yZGluZ2x5LiBOYW1lbHkgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisjKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIyogICBQTEFURk9STSAgICAgVGhlIGRldGVjdGVkIHBsYXRmb3JtLiBUaGlzIHdpbGwgZGVmYXVsdCB0byAiYW5zaSIgaWYgICAgICoKKyMqICAgICAgICAgICAgICAgIGF1dG8tZGV0ZWN0aW9uIGZhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisjKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIyogICBCVUlMRCAgICAgICAgVGhlIGNvbmZpZ3VyYXRpb24gYW5kIHN5c3RlbS1zcGVjaWZpYyBkaXJlY3RvcnkuIFVzdWFsbHkgICoKKyMqICAgICAgICAgICAgICAgICdmcmVldHlwZS9jb25maWcvJChQTEFURk9STSknIGJ1dCBjYW4gYmUgZGlmZmVyZW50IHdoZW4gICAqCisjKiAgICAgICAgICAgICAgICBhIHNwZWNpZmljIGNvbXBpbGVyIGhhcyBiZWVuIHJlcXVlc3RlZCBvbiB0aGUgICAgICAgICAgICAgKgorIyogICAgICAgICAgICAgICAgY29tbWFuZCBsaW5lLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisjKiAgIENPTkZJR19SVUxFUyBUaGUgTWFrZWZpbGUgdG8gdXNlLiBUaGlzIHVzdWFsbHkgZGVwZW5kcyBvbiB0aGUgY29tcGlsZXIgKgorIyogICAgICAgICAgICAgICAgZGVmaW5lZCBpbiB0aGUgJ0NDJyBlbnZpcm9ubWVudCB2YXJpYWJsZS4gICAgICAgICAgICAgICAgICoKKyMqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisjKiAgIERFTEVURSAgICAgICBUaGUgc2hlbGwgY29tbWFuZCB1c2VkIHRvIHJlbW92ZSBhIGdpdmVuIGZpbGUgICAgICAgICAgICAgKgorIyogICBDT1BZICAgICAgICAgVGhlIHNoZWxsIGNvbW1hbmQgdXNlZCB0byBjb3B5IG9uZSBmaWxlICAgICAgICAgICAgICAgICAgICoKKyMqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisjKiAgWW91IG5lZWQgdG8gc2V0IHRoZSBmb2xsb3dpbmcgdmFyaWFibGUocykgYmVmb3JlIGNhbGxpbmcgaXQ6ICAgICAgICAgICAgKgorIyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMqICAgIFRPUCAgICAgICAgIFRoZSB0b3AtbW9zdCBkaXJlY3RvcnkgaW4gdGhlIEZyZWVUeXBlIGxpYnJhcnkgc291cmNlICAgICAqCisjKiAgICAgICAgICAgICAgICBoaWVyYXJjaHkuIElmIG5vdCBkZWZpbmVkLCBpdCB3aWxsIGRlZmF1bHQgdG8gJy4nICAgICAgICAgKgorIyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyMgSWYgVE9QIGlzIG5vdCBkZWZpbmVkLCBkZWZhdWx0IGl0IHRvICcuJworIworaWZuZGVmIFRPUAorVE9QIDo9IC4KK2VuZGlmCisKKyMKKyMgc2V0IGF1dG8tZGV0ZWN0aW9uIGRlZmF1bHQgdG8gQU5TSS4KKyMgTm90ZSB0aGF0IHdlIGRlbGF5IHRoZSB2YWx1YXRpb24gb2YgQlVJTEQgYW5kIFJVTEVTCisjCitQTEFURk9STSA6PSBhbnNpCitDT05GSUcgICAgPSAkKFRPUCkkKFNFUCljb25maWcKK0RFTEVURSAgIDo9ICQoUk0pCitDT1BZICAgICA6PSBjcAorU0VQICAgICAgOj0gLworCitCVUlMRCAgICAgICA9ICQoQ09ORklHKSQoU0VQKSQoUExBVEZPUk0pCitDT05GSUdfRklMRSA9ICQoQlVJTEQpL01ha2VmaWxlCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIE5vdywgaW5jbHVkZSBlYWNoIGRldGVjdGlvbiBydWxlcyBmaWxlIGZvdW5kIGluIGEgYGNvbmZpZy88c3lzdGVtPicKKyMgZGlyZWN0b3J5Li4KKyMKKyMKKworIyB3ZSBkZWZpbmUgdGhlIEJBQ0tTTEFTSCB2YXJpYWJsZSB0byBob2xkIGEgc2luZ2xlIGJhY2stc2xhc2ggY2hhcmFjdGVyCisjIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2UgYSBsaW5lIGxpa2UKKyMKKyMgU0VQIDo9IFwKKyMKKyMgZG9lcyBub3Qgd29yayB3aXRoIEdOVSBNYWtlICh0aGUgYmFjay1zbGFzaCBpcyBpbnRlcnByZXRlZCBhcyBhIGxpbmUKKyMgY29udGludWF0aW9uKS4gV2hpbGUgYSBsaW5lIGxpa2UgOgorIworIyBTRVAgOj0gXFwKKyMKKyMgcmVhbGx5IGRlZmluZSAkKFNFUCkgYXMgIlwiIG9uIFVuaXgsIGFuZCAiXFwiIG9uIERvcyBhbmQgV2luZG93cyAhIQorIworQkFDS1NMQVNIIDo9ICQoc3RyaXAgXCApCisKK2luY2x1ZGUgJCh3aWxkY2FyZCAkKENPTkZJRykvKi9kZXRlY3QubWspCisKKworIyBUaGUgZm9sbG93aW5nIHRhcmdldHMgYXJlIGVxdWl2YWxlbnQsIHdpdGggdGhlIGV4Y2VwdGlvbiB0aGF0IHRoZXkgdXNlCisjIHNsaWdodGx5IGRpZmZlcmVudCBzeW50YXhlcyBmb3IgdGhlIGBlY2hvJyBjb21tYW5kLiBUaGlzIGlzIGR1ZSB0bworIworIyBzdGRfc2V0dXA6IGlzIGRlZmluZWQgZm9yIG1vc3QgcGxhdGZvcm1zCisjIGRvc19zZXR1cDogaXMgZGVmaW5lZCBmb3IgRG9zLWlzaCBwbGF0Zm9ybXMgbGlrZSBEb3MsIFdpbmRvd3MgJiBPUy8yCisjCisKKy5QSE9OWTogc3RkX3NldHVwICBkb3Nfc2V0dXAKKworc3RkX3NldHVwOgorCUBlY2hvICIiCisJQGVjaG8gIkZyZWVUeXBlIGJ1aWxkIHN5c3RlbSAtIGF1dG9tYXRpYyBzeXN0ZW0gZGV0ZWN0aW9uIgorCUBlY2hvICIiCisJQGVjaG8gIlRoZSBmb2xsb3dpbmcgc2V0dGluZ3Mgd2VyZSBkZXRlY3RlZCA6IgorCUBlY2hvICIiCisJQGVjaG8gIiAgcGxhdGZvcm0gICAgICAgICAgICAgICAgIDogICQoUExBVEZPUk0pIgorCUBlY2hvICIgIGNvbXBpbGVyICAgICAgICAgICAgICAgICA6ICAkKENDKSIKKwlAZWNobyAiICBjb25maWd1cmF0aW9uIGRpcmVjdG9yeSAgOiAgJChCVUlMRCkiCisJQGVjaG8gIiAgY29uZmlndXJhdGlvbiBydWxlcyAgICAgIDogICQoQ09ORklHX1JVTEVTKSIKKwlAZWNobyAiIgorCUBlY2hvICJJZiB0aGlzIGRvZXMgbm90IGNvcnJlc3BvbmQgdG8geW91ciBzeXN0ZW0gb3Igc2V0dGluZ3MgcGxlYXNlIHJlbW92ZSB0aGUgZmlsZSIKKwlAZWNobyAiXGAkKENPTkZJR19NSyknIGZyb20gdGhpcyBkaXJlY3RvcnkgdGhlbiByZWFkIHRoZSBJTlNUQUxMIGZpbGUgZm9yIGhlbHAuIgorCUBlY2hvICIiCisJQGVjaG8gIk90aGVyd2lzZSwgc2ltcGxlIHR5cGUgXGBtYWtlJyBhZ2FpbiB0byBidWlsZCB0aGUgbGlicmFyeSIKKwlAZWNobyAiIgorCUAkKENPUFkpICQoQ09ORklHX1JVTEVTKSAkKENPTkZJR19NSykKKworZG9zX3NldHVwOgorCUBlY2hvIP8KKwlAZWNobyBGcmVlVHlwZSBidWlsZCBzeXN0ZW0gLSBhdXRvbWF0aWMgc3lzdGVtIGRldGVjdGlvbgorCUBlY2hvIP8KKwlAZWNobyBUaGUgZm9sbG93aW5nIHNldHRpbmdzIHdlcmUgZGV0ZWN0ZWQgOgorCUBlY2hvIP8KKwlAZWNobyD//3BsYXRmb3Jt//////////////////////86ICAkKFBMQVRGT1JNKQorCUBlY2hvIP//Y29tcGlsZXL//////////////////////zogICQoQ0MpCisJQGVjaG8g//9jb25maWd1cmF0aW9uIGRpcmVjdG9yef//OiAgJChCVUlMRCkKKwlAZWNobyD//2NvbmZpZ3VyYXRpb24gcnVsZXP///////86ICAkKENPTkZJR19SVUxFUykKKwlAZWNobyD/CisJQGVjaG8gSWYgdGhpcyBkb2VzIG5vdCBjb3JyZXNwb25kIHRvIHlvdXIgc3lzdGVtIG9yIHNldHRpbmdzIHBsZWFzZSByZW1vdmUgdGhlIGZpbGUKKwlAZWNobyAnJChDT05GSUdfTUspJyBmcm9tIHRoaXMgZGlyZWN0b3J5IHRoZW4gcmVhZCB0aGUgSU5TVEFMTCBmaWxlIGZvciBoZWxwLgorCUBlY2hvIP8KKwlAZWNobyBPdGhlcndpc2UsIHNpbXBsZSB0eXBlICdtYWtlJyBhZ2FpbiB0byBidWlsZCB0aGUgbGlicmFyeQorCUBlY2hvIP8KKwlAJChDT1BZKSAkKENPTkZJR19SVUxFUykgJChDT05GSUdfTUspID4gbnVsCisKZGlmZiAtLWdpdCBhL2NvbmZpZy9kb3MvRlRDT05GSUcuSCBiL2NvbmZpZy9kb3MvRlRDT05GSUcuSApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2E0Yzk1Ci0tLSAvZGV2L251bGwKKysrIGIvY29uZmlnL2Rvcy9GVENPTkZJRy5ICkBAIC0wLDAgKzEsMTgyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBmdGNvbmZpZy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQU5TSS1zcGVjaWZpYyBjb25maWd1cmF0aW9uIGZpbGUgKHNwZWNpZmljYXRpb24gb25seSkuICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDE5OTYtMTk5OSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkICAgICAgICAqLworLyogIG1vZGlmaWVkIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAgKi8KKy8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCisvKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLworLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBUaGlzIGhlYWRlciBmaWxlIGNvbnRhaW5zIGEgbnVtYmVyIG9mIG1hY3JvIGRlZmluaXRpb25zIHRoYXQgYXJlIHVzZWQgKi8KKyAgLyogYnkgdGhlIHJlc3Qgb2YgdGhlIGVuZ2luZS4gIFBvcnRlcnMgYXJlIGZyZWUgdG8gY29weSB0aGlzIGZpbGUgYW5kICAgICovCisgIC8qIGFkYXB0IGl0IHRvIHN1aXQgdGhlaXIgb3duIHN5c3RlbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogSU1QT1JUQU5UIE5PVEU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBQb3J0ZXJzLCByZWFkIGNhcmVmdWxseSB0aGUgY29tbWVudHMgaW4gYGZ0c3lzLmgnIGJlZm9yZSB0cnlpbmcgdG8gKi8KKyAgLyogICAgcG9ydCB0aGlzIGZpbGUgdG8geW91ciBzeXN0ZW0uICBJdCBjb250YWlucyBtYW55IGVzc2VudGlhbCAgICAgICAgICovCisgIC8qICAgIHJlbWFya3MsIGFuZCB3aWxsIGVhc2UgeW91ciB3b3JrIGdyZWF0bHkuICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2lmbmRlZiBGVENPTkZJR19ICisjZGVmaW5lIEZUQ09ORklHX0gKKworLyogSW5jbHVkZSB0aGUgaGVhZGVyIGZpbGUgY29udGFpbmluZyBhbGwgZGV2ZWxvcGVyIGJ1aWxkIG9wdGlvbnMgKi8KKyNpbmNsdWRlIDxmdG9wdGlvbi5oPgorCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICBQTEFURk9STS1TUEVDSUZJQyBDT05GSUdVUkFUSU9OIE1BQ1JPUyAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBUaGVzZSBtYWNyb3MgY2FuIGJlIHRvZ2dsZWQgdG8gc3VpdCBhIHNwZWNpZmljIHN5c3RlbS4gIFRoZSBjdXJyZW50ICAgKi8KKyAgLyogb25lcyBhcmUgZGVmYXVsdHMgdXNlZCB0byBjb21waWxlIEZyZWVUeXBlIGluIGFuIEFOU0kgQyBlbnZpcm9ubWVudCAgICovCisgIC8qICgxNmJpdCBjb21waWxlcnMgYXJlIGFsc28gc3VwcG9ydGVkKS4gIENvcHkgdGhpcyBmaWxlIHRvIHlvdXIgb3duICAgICAqLworICAvKiBgZnJlZXR5cGUvYXJjaC88c3lzdGVtPicgIGRpcmVjdG9yeSwgYW5kIGVkaXQgaXQgdG8gcG9ydCB0aGUgZW5naW5lLiAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qIERlZmluZSB0byBlbXB0eSBpZiB0aGUga2V5d29yZCBkb2VzIG5vdCB3b3JrLiAgKi8KKy8qICN1bmRlZiBjb25zdCAqLworCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIEFOU0kgQyBoZWFkZXIgZmlsZXMuICAqLworI2RlZmluZSBTVERDX0hFQURFUlMgMQorCisvKiBXZSB1c2UgPGxpbWl0cy5oPiB2YWx1ZXMgdG8ga25vdyB0aGUgc2l6ZXMgb2YgdGhlIHR5cGVzLiAgKi8KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKworLyogVGhlIG51bWJlciBvZiBieXRlcyBpbiBhbiBgaW50JyB0eXBlLiAgKi8KKyNpZiAgIFVJTlRfTUFYID09IDB4RkZGRkZGRkYKKyNkZWZpbmUgU0laRU9GX0lOVCAgNAorI2VsaWYgVUlOVF9NQVggPT0gMHhGRkZGCisjZGVmaW5lIFNJWkVPRl9JTlQgIDIKKyNlbGlmIFVJTlRfTUFYID4gMHhGRkZGRkZGRiAmJiBVSU5UX01BWCA9PSAweEZGRkZGRkZGRkZGRkZGRkYKKyNkZWZpbmUgU0laRU9GX0lOVCAgOAorI2Vsc2UKKyNlcnJvciAiVW5zdXBwb3J0ZWQgbnVtYmVyIG9mIGJ5dGVzIGluIGBpbnQnIHR5cGUhIgorI2VuZGlmCisKKy8qIFRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gYSBgbG9uZycgdHlwZS4gICovCisjaWYgICBVTE9OR19NQVggPT0gMHhGRkZGRkZGRgorI2RlZmluZSBTSVpFT0ZfTE9ORyAgNAorI2VsaWYgVUxPTkdfTUFYID4gMHhGRkZGRkZGRiAmJiBVTE9OR19NQVggPT0gMHhGRkZGRkZGRkZGRkZGRkZGCisjZGVmaW5lIFNJWkVPRl9MT05HICA4CisjZWxzZQorI2Vycm9yICJVbnN1cHBvcnRlZCBudW1iZXIgb2YgYnl0ZXMgaW4gYGxvbmcnIHR5cGUhIgorI2VuZGlmCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgbWVtY3B5IGZ1bmN0aW9uLiAgKi8KKyNkZWZpbmUgSEFWRV9NRU1DUFkgMQorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxmY250bC5oPiBoZWFkZXIgZmlsZS4gICovCisjZGVmaW5lIEhBVkVfRkNOVExfSCAwCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHVuaXN0ZC5oPiBoZWFkZXIgZmlsZS4gICovCisjZGVmaW5lIEhBVkVfVU5JU1REX0ggMAorCisKKy8qIFByZWZlcnJlZCBhbGlnbm1lbnQgb2YgZGF0YSAqLworI2RlZmluZSBGVF9BTElHTk1FTlQgIDgKKworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgIEFVVE9NQVRJQyBDT05GSUdVUkFUSU9OIE1BQ1JPUyAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICBUaGVzZSBtYWNyb3MgYXJlIGNvbXB1dGVkIGZyb20gdGhlIG9uZXMgZGVmaW5lZCBhYm92ZS4gIERvbid0IHRvdWNoICAqLworICAvKiAgdGhlaXIgZGVmaW5pdGlvbiwgdW5sZXNzIHlvdSBrbm93IHByZWNpc2VseSB3aGF0IHlvdSdyZSBkb2luZy4gIE5vICAgKi8KKyAgLyogIHBvcnRlciBzaG91bGQgbmVlZCB0byBtZXNzIHdpdGggdGhlbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogSW50TiB0eXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIFVzZWQgdG8gZ3VhcmFudGVlIHRoZSBzaXplIG9mIHNvbWUgc3BlY2lmaWMgaW50ZWdlcnMuICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgc2lnbmVkIHNob3J0ICAgIEZUX0ludDE2OworICB0eXBlZGVmIHVuc2lnbmVkIHNob3J0ICBGVF9Xb3JkMTY7CisKKyNpZiBTSVpFT0ZfSU5UID09IDQKKworICB0eXBlZGVmIHNpZ25lZCBpbnQgICAgICBGVF9JbnQzMjsKKyAgdHlwZWRlZiB1bnNpZ25lZCBpbnQgICAgRlRfV29yZDMyOworCisjZWxpZiBTSVpFT0ZfTE9ORyA9PSA0CisKKyAgdHlwZWRlZiBzaWduZWQgbG9uZyAgICAgRlRfSW50MzI7CisgIHR5cGVkZWYgdW5zaWduZWQgbG9uZyAgIEZUX1dvcmQzMjsKKworI2Vsc2UKKyNlcnJvciAibm8gMzJiaXQgdHlwZSBmb3VuZCAtIHBsZWFzZSBjaGVjayB5b3VyIGNvbmZpZ3VyYXRpb24gZmlsZXMiCisjZW5kaWYKKworI2lmIFNJWkVPRl9MT05HID09IDgKKworICAvKiBMT05HNjQgbXVzdCBiZSBkZWZpbmVkIHdoZW4gYSA2NC1iaXQgdHlwZSBpcyBhdmFpbGFibGUgKi8KKyNkZWZpbmUgTE9ORzY0CisjZGVmaW5lIElOVDY0ICAgbG9uZworCisjZWxzZQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBHQ0MgcHJvdmlkZXMgdGhlIG5vbi1BTlNJICdsb25nIGxvbmcnIDY0LWJpdCB0eXBlLiAgWW91IGNhbiBhY3RpdmF0ZSAgKi8KKyAgLyogaXQgYnkgZGVmaW5pbmcgdGhlIEZUQ0FMQ19VU0VfTE9OR19MT05HIG1hY3JvIGluIGBmdGNvbmZpZy5oJy4gIE5vdGUgICovCisgIC8qIHRoYXQgdGhpcyB3aWxsIHByb2R1Y2UgbWFueSAtYW5zaSB3YXJuaW5ncyBkdXJpbmcgbGlicmFyeSAgICAgICAgICAgICAqLworICAvKiBjb21waWxhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjaWZkZWYgRlRDQUxDX1VTRV9MT05HX0xPTkcKKworI2RlZmluZSBMT05HNjQKKyNkZWZpbmUgSU5UNjQgICBsb25nIGxvbmcKKworI2VuZGlmIC8qIEZUQ0FMQ19VU0VfTE9OR19MT05HICovCisjZW5kaWYKKworCisjaWZkZWYgRlRfTUFLRV9PUFRJT05fU0lOR0xFX09CSkVDVAorI2RlZmluZSAgTE9DQUxfREVGICAgc3RhdGljCisjZGVmaW5lICBMT0NBTF9GVU5DICBzdGF0aWMKKyNlbHNlCisjZGVmaW5lICBMT0NBTF9ERUYgICBleHRlcm4KKyNkZWZpbmUgIExPQ0FMX0ZVTkMgIC8qIG5vdGhpbmcgKi8KKyNlbmRpZgorCisjaWZkZWYgRlRfTUFLRV9PUFRJT05fU0lOR0xFX0xJQlJBUllfT0JKRUNUCisjZGVmaW5lICBCQVNFX0RFRiAgICBMT0NBTF9ERUYKKyNkZWZpbmUgIEJBU0VfRlVOQyAgIExPQ0FMX0ZVTkMKKyNlbHNlCisjZGVmaW5lICBCQVNFX0RFRiAgICBleHRlcm4KKyNkZWZpbmUgIEJBU0VfRlVOQyAgIC8qIG5vdGhpbmcgKi8KKyNlbmRpZgorCisjaWZuZGVmICBFWFBPUlRfREVGCisjZGVmaW5lICBFWFBPUlRfREVGICAgZXh0ZXJuCisjZW5kaWYKKworI2lmbmRlZiAgRVhQT1JUX0ZVTkMKKyNkZWZpbmUgIEVYUE9SVF9GVU5DICAvKiBub3RoaW5nICovCisjZW5kaWYKKworI2VuZGlmIC8qIEZUQ09ORklHX0ggKi8KKworCisvKiBFTkQgKi8KZGlmZiAtLWdpdCBhL2NvbmZpZy9kb3MvRlRPUFRJT04uSCBiL2NvbmZpZy9kb3MvRlRPUFRJT04uSApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYWRlZDUwCi0tLSAvZGV2L251bGwKKysrIGIvY29uZmlnL2Rvcy9GVE9QVElPTi5ICkBAIC0wLDAgKzEsMTUyIEBACisjaWZuZGVmIEZUT1BUSU9OX0gKKyNkZWZpbmUgRlRPUFRJT05fSAorCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgIFVTRVItU0VMRUNUQUJMRSBDT05GSUdVUkFUSU9OIE1BQ1JPUyAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBUaGVzZSBtYWNyb3MgY2FuIGJlIHRvZ2dsZWQgYnkgZGV2ZWxvcGVycyB0byBlbmFibGUgb3IgZGlzYWJsZSAgICAgICAgKi8KKyAgLyogY2VydGFpbiBhc3BlY3RzIG9mIEZyZWVUeXBlLiAgVGhpcyBmaWxlIGNvbnRhaW5zIG1hY3JvcyB0aGF0IGFwcGx5IHRvICovCisgIC8qIGFsbCBvZiBGcmVlVHlwZS4gIERyaXZlci1zcGVjaWZpYyBjb25maWd1cmF0aW9ucyBhcmUgcGxhY2VkIGluIGVhY2ggICAqLworICAvKiBkcml2ZXIgZGlyZWN0b3J5IChlLmcuIGBmcmVldHlwZS9kcml2ZXJzL3R0bGliL3R0Y29uZmlnLmgnKS4gICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBBbHRlcm5hdGUgR2x5cGggSW1hZ2UgRm9ybWF0IHN1cHBvcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgQnkgZGVmYXVsdCwgdGhlIGdseXBoIGltYWdlcyByZXR1cm5lZCBieSB0aGUgRnJlZVR5cGUgZ2x5cGggbG9hZGVyICAqLworICAvKiAgIGNhbiBlaXRoZXIgYmUgYSBwaXhtYXAgb3IgYSB2ZWN0b3JpYWwgb3V0bGluZSBkZWZpbmVkIHRocm91Z2ggICAgICAgKi8KKyAgLyogICBiZXppZXIgY29udHJvbCBwb2ludHMuIFdoZW4gZGVmaW5pbmcgdGhlIGZvbGxvd2luZyBjb25maWd1cmF0aW9uICAgICovCisgIC8qICAgbWFjcm8sIHNvbWUgZm9udCBkcml2ZXJzIHdpbGwgYmUgYWJsZSB0byByZWdpc3RlciBhbHRlcm5hdGUgICAgICAgICAqLworICAvKiAgIGdseXBoIGltYWdlIGZvcm1hdHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgVW5zZXQgdGhpcyBtYWNybyBpZiB5b3UncmUgc3VyZSB0aGF0IHlvdSdsbCBuZXZlciB1c2UgYSBmb250IGRyaXZlciAqLworICAvKiAgIHdpdGggYW4gYWx0ZXJuYXRlIGdseXBoIGZvcm1hdCwgdGhpcyB3aWxsIHJlZHVjZSB0aGUgc2l6ZSBvZiB0aGUgICAgKi8KKyAgLyogICBiYXNlIGxheWVyIGNvZGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBGVF9DT05GSUdfT1BUSU9OX0FMVEVSTkFURV9HTFlQSF9GT1JNQVRTCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBHQ0MgcHJvdmlkZXMgdGhlIG5vbi1BTlNJIGBsb25nIGxvbmcnIDY0LWJpdCB0eXBlLiAgWW91IGNhbiBhY3RpdmF0ZSAgKi8KKyAgLyogaXQgYnkgZGVmaW5pbmcgdGhlIEZUQ0FMQ19VU0VfTE9OR19MT05HIG1hY3JvIGhlcmUuICBOb3RlIGhvd2V2ZXIgICAgICovCisgIC8qIHRoYXQgd2UgZGlkIG5vdCBleHBlcmllbmNlIGFueSBpbXByb3ZlbWVudCBpbiBzcGVlZCB3aXRoIGdjYywgYW5kICAgICAqLworICAvKiB0aGF0IHRoZSBmaW5hbCBjb2RlIHNlZW1zIGJpZ2dlciB3aGVuIGxpbmtlZC4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjdW5kZWYgRlRDQUxDX1VTRV9MT05HX0xPTkcKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogV2hlbiBjb21waWxpbmcgRnJlZVR5cGUgYXMgYSBETEwsIHNvbWUgc3lzdGVtcy9jb21waWxlcnMgbmVlZCBhICAgICAgICovCisgIC8qIHNwZWNpYWwga2V5d29yZCBpbiBmcm9udCBvZiBlYWNoIGZ1bmN0aW9uIGRlZmluaXRpb24gaW5zdGVhZCBvZiAgICAgICAqLworICAvKiBgZXh0ZXJuJy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFRoZSBtYWNyb3MgRVhQT1JUX0RFRiBhbmQgRVhQT1JUX0ZVTkMgYXJlIHRodXMgdXNlZCB0byBkZWZpbmUgICAgICAgICAqLworICAvKiBleHBvcnRlZCBsaWJyYXJ5IGZ1bmN0aW9uIGludGVyZmFjZXMgYW5kIGV4cG9ydGVkIGxpYnJhcnkgZnVuY3Rpb25zICAgKi8KKyAgLyogaW1wbGVtZW50YXRpb25zIHJlc3BlY3RpdmVseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBJZiBub3QgZGVmaW5lZCBoZXJlLCB0aGV5IGF1dG9tYXRpY2FsbHkgZGVmYXVsdCB0byBgZXh0ZXJuJyBhbmQgdm9pZCAgKi8KKyAgLyogbGF0ZXIgaW4gdGhpcyBoZWFkZXIgZmlsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI3VuZGVmIEVYUE9SVF9ERUYKKyN1bmRlZiBFWFBPUlRfRlVOQworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBEZWJ1ZyBsZXZlbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgRnJlZVR5cGUgY2FuIGJlIGNvbXBpbGVkIGluIGRlYnVnIG9yIHRyYWNlIG1vZGUuICBJbiBkZWJ1ZyBtb2RlLCAgICAqLworICAvKiAgIGVycm9ycyBhcmUgcmVwb3J0ZWQgdGhyb3VnaCB0aGUgYGZ0ZGVidWcnIGNvbXBvbmVudC4gIEluIHRyYWNlICAgICAgKi8KKyAgLyogICBtb2RlLCBhZGRpdGlvbmFsIG1lc3NhZ2VzIGFyZSBzZW50IHRvIHRoZSBzdGFuZGFyZCBvdXRwdXQgZHVyaW5nICAgICovCisgIC8qICAgZXhlY3V0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICBEZWZpbmUgRlRfREVCVUdfTEVWRUxfRVJST1IgdG8gYnVpbGQgdGhlIGxpYnJhcnkgaW4gZGVidWcgbW9kZS4gICAgICovCisgIC8qICAgRGVmaW5lIEZUX0RFQlVHX0xFVkVMX1RSQUNFIHRvIGJ1aWxkIGl0IGluIHRyYWNlIG1vZGUuICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICBEb24ndCBkZWZpbmUgYW55IG9mIHRoZXNlIG1hY3JvcyB0byBjb21waWxlIGluIGByZWxlYXNlJyBtb2RlLiAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI3VuZGVmICBGVF9ERUJVR19MRVZFTF9FUlJPUgorI3VuZGVmICBGVF9ERUJVR19MRVZFTF9UUkFDRQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBBbnRpLWFsaWFzaW5nIHN1cHBvcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgVW5kZWZpbmUgdGhpcyBtYWNybyBvbmx5IGlmIHlvdSB3YW50IHRvIGRpc2FibGUgdGhlIGFudGktYWxpYXNpbmcgICAqLworICAvKiAgIHN1cHBvcnQgaW4gRnJlZVR5cGUuICBUaGlzIHdpbGwgc2F2ZSB5b3UgYWJvdXQgNSBLYiBvZiBjb2RlLiAgSXQgICAgKi8KKyAgLyogICBtYXkgYmUgaW1wb3J0YW50IGZvciBzb21lIGVtYmVkZGVkIHN5c3RlbXMuICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBGVF9DT05GSUdfT1BUSU9OX0FOVElfQUxJQVMKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogRW5kaWFuZXNzIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIEZyZWVUeXBlIGlzIGNvbXBsZXRlbHkgZW5kaWFuLWluZGVwZW5kZW50LCBhbmQgY2FuIHRodXMgYmUgY29tcGlsZWQgKi8KKyAgLyogICBkaXJlY3RseSBvbiBfYW55XyBtYWNoaW5lLiAgSG93ZXZlciwgc29tZSBjb21wb25lbnRzIG9mIHRoZSBsaWJyYXJ5ICovCisgIC8qICAgcHJvdmlkZSBpbXByb3ZlZCByb3V0aW5lcyBmb3IgdGhlIGNhc2VzIHdoZXJlIGVuZGlhbmVzcyBpcyBrbm93bi4gICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICBJdCB1c3VhbGx5IHJlc3VsdHMgaW4gc3BlZWQtdXBzIGFuZCByZWR1Y2VkIGNvZGUgc2l6ZS4gIE5vdGUgdGhhdCAgICovCisgIC8qICAgeW91IHNob3VsZCBub3QgZGVmaW5lIGJvdGggb2YgdGhlc2UgbWFjcm9zLiAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgTk9URTogRm9yIG5vdywgb25seSB0aGUgc2Nhbi1saW5lIGNvbnZlcnRlciAoYmFzZS9mdHJhc3Rlci5jKSB1c2VzICAqLworICAvKiAgICAgICAgIHRoZXNlIG1hY3JvcyB0byBzcGVlZC11cCBzb21lIGFudGktYWxpYXMgcmVuZGVyaW5nIHJvdXRpbmVzLiAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjdW5kZWYgIEZUX0NPTkZJR19PUFRJT05fTElUVExFX0VORElBTgorI3VuZGVmICBGVF9DT05GSUdfT1BUSU9OX0JJR19FTkRJQU4KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogRGVmaW5lIHRoaXMgY29uZmlndXJhdGlvbiBtYWNybyB3aGVuZXZlciB5b3Ugd2FudCB0byBidWlsZCBhIHZlcnNpb24gICovCisgIC8qIG9mIEZyZWVUeXBlIHRoYXQgZG9lcyBub3QgaW5jbHVkZSBhIGRlZmF1bHQgYHN5c3RlbScgY29tcG9uZW50LiAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogTm90ZSB0aGF0IHRoaXMgd2lsbCBwcmV2ZW50IHRoZSBjb21waWxhdGlvbiBvZiBgZnRpbml0JywgaGVuY2UgdGhlICAgICovCisgIC8qIGZ1bmN0aW9uIEZUX0luaXRfRnJlZVR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyN1bmRlZiBGVF9DT05GSUdfT1BUSU9OX05PX0RFRkFVTFRfU1lTVEVNCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSByZW5kZXIgcG9vbCB1c2VkIGJ5IHRoZSBzY2FuLWxpbmUgICAgICAgICAqLworICAvKiAgICBjb252ZXJ0ZXIgdG8gZG8gYWxsIG9mIGl0cyB3b3JrLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoaXMgbXVzdCBiZSBncmVhdGVyIHRoYW4gNCBLYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRlRfUkVOREVSX1BPT0xfU0laRSAgIDMyNzY4CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX01BWF9EUklWRVJTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhlIG1heGltdW0gbnVtYmVyIG9mIGZvbnQgZHJpdmVycyB0aGF0IGNhbiBiZSByZWdpc3RlcmVkIGluIGEgICAgICovCisgIC8qICAgIHNpbmdsZSBGcmVlVHlwZSBsaWJyYXJ5IG9iamVjdC4gIDggc2VlbXMgdG8gYmUgYSBnb29kIGNob2ljZSBkdWUgICAqLworICAvKiAgICB0byB0aGUgcmVsYXRpdmUgbG93IGFjdHVhbCBudW1iZXIgb2YgZHJpdmVycyA7LSkgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZUX01BWF9EUklWRVJTICA4CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX01BWF9HTFlQSF9GT1JNQVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhlIG1heGltdW0gbnVtYmVyIG9mIGdseXBoIGltYWdlIGZvcm1hdHMgdGhhdCBtaWdodCBiZSByZWdpc3RlcmVkICovCisgIC8qICAgIGluIGEgZ2l2ZW4gbGlicmFyeSBpbnN0YW5jZS4gOCBzZWVtcyB0byBiZSBhIGdvb2QgY2hvaWNlIGR1ZSB0byAgICAqLworICAvKiAgICB0aGUgcmVsYXRpdmVseSBsb3cgbnVtYmVyIG9mIGN1cnJlbnQgZm9ybWF0cyA7LSkgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyNkZWZpbmUgRlRfTUFYX0dMWVBIX0ZPUk1BVFMgIDgKKworCisKKyNlbmRpZiAvKiBGVE9QVElPTl9IICovCmRpZmYgLS1naXQgYS9jb25maWcvZG9zL0ZUU1lTVEVNLkMgYi9jb25maWcvZG9zL0ZUU1lTVEVNLkMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU5ZjY2OAotLS0gL2Rldi9udWxsCisrKyBiL2NvbmZpZy9kb3MvRlRTWVNURU0uQwpAQCAtMCwwICsxLDIxNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIGZ0c3lzdGVtLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMAorICoKKyAqICAgIEFOU0ktc3BlY2lmaWMgRnJlZVR5cGUgbG93LWxldmVsIHN5c3RlbSBpbnRlcmZhY2UKKyAqCisgKiAgICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRlZmluaXRpb24gb2YgaW50ZXJmYWNlIHVzZWQgYnkgRnJlZVR5cGUKKyAqICAgIHRvIGFjY2VzcyBsb3ctbGV2ZWwsIGkuZS4gbWVtb3J5IG1hbmFnZW1lbnQsIGkvbyBhY2Nlc3MgYXMgd2VsbAorICogICAgYXMgdGhyZWFkIHN5bmNocm9uaXNhdGlvbi4gICAgICAgICAgICAgIAorICoKKyAqCisgKiAgQ29weXJpZ2h0IDE5OTYtMTk5OSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZyAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkICAgICAgICAgIAorICogIG1vZGlmaWVkIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAgICAKKyAqICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICAgCisgKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAgICAKKyAqICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8ZnRzeXN0ZW0uaD4KKyNpbmNsdWRlIDxmdGVycm9ycy5oPgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgTUVNT1JZIE1BTkFHRU1FTlQgSU5URVJGQUNFICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogPEZ1bmNUeXBlPgorICogICAgRlRfQWxsb2NfRnVuYworICoKKyAqIDxEZXNjcmlwdGlvbj4KKyAqICAgIFRoZSBtZW1vcnkgYWxsb2NhdG9yIGZ1bmN0aW9uIHR5cGUKKyAqCisgKiA8SW5wdXQ+CisgKiAgICBzeXN0ZW0gICAgOjogcG9pbnRlciB0byB0aGUgc3lzdGVtIG9iamVjdAorICogICAgc2l6ZSAgICAgIDo6IHJlcXVlc3RlZCBzaXplIGluIGJ5dGVzCisgKgorICogPE91dHB1dD4KKyAqICAgIGJsb2NrICAgICA6OiBhZGRyZXNzIG9mIG5ld2x5IGFsbG9jYXRlZCBibG9jaworICoKKyAqIDxSZXR1cm4+ICAKKyAqICAgIEVycm9yIGNvZGUuIDAgbWVhbnMgc3VjY2Vzcy4KKyAqCisgKiA8Tm90ZT4KKyAqICAgIElmIHlvdXIgYWxsb2NhdGlvbiByb3V0aW5lIEFMV0FZUyB6ZXJvZXMgdGhlIG5ldyBibG9jaywgeW91CisgKiAgICBzaG91bGQgc2V0IHRoZSBmbGFnIEZUX1NZU1RFTV9GTEFHX0FMTE9DX1pFUk9FUyBpbiB5b3VyIHN5c3RlbQorICogICAgb2JqZWN0ICdmbGFncycgZmllbGQuCisgKgorICogICAgSWYgeW91IGhhdmUgc2V0IHRoZSBmbGFnIEZUX1NZU1RFTV9GTEFHX1JFUE9SVF9DVVJSRU5UX0FMTE9DIGluCisgKiAgICB5b3VyIHN5c3RlbSdzICJzeXN0ZW1fZmxhZ3MiIGZpZWxkLCB0aGlzIGZ1bmN0aW9uIHNob3VsZCB1cGRhdGUKKyAqICAgIHRoZSAiY3VycmVudF9hbGxvYyIgZmllbGQgb2YgdGhlIHN5c3RlbSBvYmplY3QuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICBzdGF0aWMKKyAgdm9pZCogIGZ0X2FsbG9jKCBGVF9NZW1vcnkgIG1lbW9yeSwKKyAgICAgICAgICAgICAgICAgICBsb25nICAgICAgIHNpemUgKQorICB7CisgICAgKHZvaWQpbWVtb3J5OworICAgIHJldHVybiBtYWxsb2Moc2l6ZSk7CisgIH0KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogPEZ1bmNUeXBlPgorICogICAgRlRfUmVhbGxvY19GdW5jCisgKgorICogPERlc2NyaXB0aW9uPgorICogICAgVGhlIG1lbW9yeSByZWFsbG9jYXRvciBmdW5jdGlvbiB0eXBlCisgKgorICogPElucHV0PgorICogICAgc3lzdGVtICAgOjogcG9pbnRlciB0byB0aGUgc3lzdGVtIG9iamVjdAorICogICAgbmV3X3NpemUgOjogbmV3IHJlcXVlc3RlZCBzaXplIGluIGJ5dGVzCisgKgorICogPEluT3V0PgorICogICAgYmxvY2sgICAgOjogYWRkcmVzcyBvZiBibG9jayBpbiBtZW1vcnkKKyAqCisgKiA8UmV0dXJuPgorICogICAgRXJyb3IgY29kZS4gMCBtZWFucyBzdWNjZXNzLgorICoKKyAqIDxOb3RlPgorICogICAgVGhpcyBmdW5jdGlvbiBpcyBfbmV2ZXJfIGNhbGxlZCB3aGVuIHRoZSBzeXN0ZW0gZmxhZyAKKyAqICAgIEZUX1NZU1RFTV9GTEFHX05PX1JFQUxMT0MgaXMgc2V0LiBJbnN0ZWFkLCB0aGUgZW5naW5lIHdpbGwgZW11bGF0ZQorICogICAgcmVhbGxvYyB0aHJvdWdoICJhbGxvYyIgYW5kICJmcmVlIi4KKyAqCisgKiAgICBOb3RlIHRoYXQgdGhpcyBpcyBwb3NzaWJsZSBkdWUgdG8gdGhlIGZhY3QgdGhhdCBGcmVlVHlwZSdzCisgKiAgICAiRlRfUmVhbGxvYyIgYWx3YXlzIHJlcXVlc3RzIHRoZSBfY3VycmVudF8gc2l6ZSBvZiB0aGUgcmVhbGxvY2F0ZWQKKyAqICAgIGJsb2NrIGFzIGEgcGFyYW1ldGVyLCB0aHVzIGF2b2lkaW5nIG1lbW9yeSBsZWFrcy4KKyAqCisgKiAgICBJZiB5b3UgaGF2ZSBzZXQgdGhlIGZsYWcgRlRfU1lTVEVNX0ZMQUdfUkVQT1JUX0NVUlJFTlRfQUxMT0MgaW4KKyAqICAgIHlvdXIgc3lzdGVtJ3MgInN5c3RlbV9mbGFncyIgZmllbGQsIHRoaXMgZnVuY3Rpb24gc2hvdWxkIHVwZGF0ZQorICogICAgdGhlICJjdXJyZW50X2FsbG9jIiBmaWVsZCBvZiB0aGUgc3lzdGVtIG9iamVjdC4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIHN0YXRpYworICB2b2lkKiAgZnRfcmVhbGxvYyggRlRfTWVtb3J5ICBtZW1vcnksCisgICAgICAgICAgICAgICAgICAgICBsb25nICAgICAgIGN1cl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgbG9uZyAgICAgICBuZXdfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgYmxvY2sgKQorICB7CisgICAgKHZvaWQpbWVtb3J5OworICAgICh2b2lkKWN1cl9zaXplOworCisgICAgcmV0dXJuIHJlYWxsb2MoIGJsb2NrLCBuZXdfc2l6ZSApOworICB9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIDxGdW5jVHlwZT4KKyAqICAgIEZUX0ZyZWVfRnVuYworICoKKyAqIDxEZXNjcmlwdGlvbj4KKyAqICAgIFRoZSBtZW1vcnkgcmVsZWFzZSBmdW5jdGlvbiB0eXBlCisgKgorICogPElucHV0PgorICogICAgc3lzdGVtICA6OiBwb2ludGVyIHRvIHRoZSBzeXN0ZW0gb2JqZWN0CisgKiAgICBibG9jayAgIDo6IGFkZHJlc3Mgb2YgYmxvY2sgaW4gbWVtb3J5CisgKgorICogPE5vdGU+CisgKiAgICBJZiB5b3UgaGF2ZSBzZXQgdGhlIGZsYWcgRlRfU1lTVEVNX0ZMQUdfUkVQT1JUX0NVUlJFTlRfQUxMT0MgaW4KKyAqICAgIHlvdXIgc3lzdGVtJ3MgInN5c3RlbV9mbGFncyIgZmllbGQsIHRoaXMgZnVuY3Rpb24gc2hvdWxkIHVwZGF0ZQorICogICAgdGhlICJjdXJyZW50X2FsbG9jIiBmaWVsZCBvZiB0aGUgc3lzdGVtIG9iamVjdC4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIHN0YXRpYworICB2b2lkICBmdF9mcmVlKCBGVF9NZW1vcnkgIG1lbW9yeSwKKyAgICAgICAgICAgICAgICAgdm9pZCogICAgICBibG9jayApCisgIHsKKyAgICAodm9pZCltZW1vcnk7CisgICAgZnJlZSggYmxvY2sgKTsKKyAgfQorCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgUkVTT1VSQ0UgTUFOQUdFTUVOVCBJTlRFUkZBQ0UgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKworI2RlZmluZSBTVFJFQU1fRklMRShzdHJlYW0pICAoKEZJTEUqKXN0cmVhbS0+ZGVzY3JpcHRvci5wb2ludGVyKQorCisgIHN0YXRpYworICB2b2lkICBmdF9jbG9zZV9zdHJlYW0oIEZUX1N0cmVhbSAgc3RyZWFtICkKKyAgeworICAgIGZjbG9zZSggU1RSRUFNX0ZJTEUoc3RyZWFtKSApOworICB9CisKKyAgc3RhdGljCisgIHVuc2lnbmVkIGxvbmcgIGZ0X2lvX3N0cmVhbSggRlRfU3RyZWFtICAgICAgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiAgICAgICAgICBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAgY291bnQgKQorICB7CisgICAgRklMRSogIGZpbGU7CisgICAgCisgICAgZmlsZSA9IFNUUkVBTV9GSUxFKHN0cmVhbSk7CisKKyAgICBmc2VlayggZmlsZSwgb2Zmc2V0LCBTRUVLX1NFVCApOyAgICAKKyAgICByZXR1cm4gKHVuc2lnbmVkIGxvbmcpZnJlYWQoIGJ1ZmZlciwgY291bnQsIDEsIGZpbGUgKTsKKyAgfQorCisKKyAgZXh0ZXJuCisgIGludCAgRlRfTmV3X1N0cmVhbSggY29uc3QgY2hhciogIGZpbGVwYXRobmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gICAgc3RyZWFtICkKKyAgeworICAgIEZJTEUqICBmaWxlOworICAgIAorICAgIGZpbGUgPSBmb3BlbiggZmlsZXBhdGhuYW1lLCAicmIiICk7CisgICAgaWYgKCFmaWxlKQorICAgICAgcmV0dXJuIEZUX0Vycl9DYW5ub3RfT3Blbl9SZXNvdXJjZTsKKyAgICAgIAorICAgIGZzZWVrKCBmaWxlLCAwLCBTRUVLX0VORCApOworICAgIHN0cmVhbS0+c2l6ZSA9IGZ0ZWxsKGZpbGUpOworICAgIGZzZWVrKCBmaWxlLCAwLCBTRUVLX1NFVCApOworICAgIAorICAgIHN0cmVhbS0+ZGVzY3JpcHRvci5wb2ludGVyID0gZmlsZTsKKyAgICBzdHJlYW0tPnBvcyAgICAgICAgICAgICAgICA9IDA7CisgICAgCisgICAgc3RyZWFtLT5yZWFkICA9IGZ0X2lvX3N0cmVhbTsKKyAgICBzdHJlYW0tPmNsb3NlID0gZnRfY2xvc2Vfc3RyZWFtOworCisgICAgcmV0dXJuIDA7CisgIH0KKworCisgIGV4dGVybgorICBGVF9NZW1vcnkgIEZUX05ld19NZW1vcnkoIHZvaWQgKQorICB7CisgICAgRlRfTWVtb3J5ICBtZW1vcnk7CisgICAgCisgICAgbWVtb3J5ID0gKEZUX01lbW9yeSltYWxsb2MoIHNpemVvZigqbWVtb3J5KSApOworICAgIGlmIChtZW1vcnkpCisgICAgeworICAgICAgbWVtb3J5LT51c2VyICAgID0gMDsKKyAgICAgIG1lbW9yeS0+YWxsb2MgICA9IGZ0X2FsbG9jOworICAgICAgbWVtb3J5LT5yZWFsbG9jID0gZnRfcmVhbGxvYzsKKyAgICAgIG1lbW9yeS0+ZnJlZSAgICA9IGZ0X2ZyZWU7CisgICAgfQorICAgIHJldHVybiBtZW1vcnk7CisgIH0KKwpkaWZmIC0tZ2l0IGEvY29uZmlnL2Rvcy9NQUtFRklMRS5HQ0MgYi9jb25maWcvZG9zL01BS0VGSUxFLkdDQwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzY0MmNiCi0tLSAvZGV2L251bGwKKysrIGIvY29uZmlnL2Rvcy9NQUtFRklMRS5HQ0MKQEAgLTAsMCArMSwxNzIgQEAKKyMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjKgorIyogIEZyZWVUeXBlIDIgQ29uZmlndXJhdGlvbiBydWxlcyBmb3IgVW5peCArIGdjYworIyoKKyMqICBDb3B5cmlnaHQgMTk5Ni0xOTk5IGJ5CisjKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorIyoKKyMqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQKKyMqICBtb2RpZmllZCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisjKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisjKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisjKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorIyoKKyMqCisjKiAgVGhlIHB1cnBvc2Ugb2YgdGhpcyBzdWItTWFrZWZpbGUgaXMgdG8gZGVmaW5lIHZhcmlvdXMgYnVpbGQgYW5kCisjKiAgcGxhdGZvcm0gc3BlY2lmaWMgdmFyaWFibGVzIGJlZm9yZSBpbmNsdWRpbmcgdGhlIHN1Yi1NYWtlZmlsZQorIyogIGNvbnRhaW5pbmcgdGhlIEZyZWVUeXBlIGxpYnJhcnkgcnVsZXMsIGZvdW5kIGluCisjKgorIyogICAgICQoVE9QKS9jb25maWcvZnJlZXR5cGUubWsKKyMqCisjKiAgVGhlIGZvbGxvd2luZyB2YXJpYWJsZXMgbXVzdCBiZSBkZWZpbmVkIGJlZm9yZSBpbmNsdWRpbmcgdGhpcworIyogIGZpbGUgOgorIyoKKyMqICAgICBUT1AgICAgICAgICAgUGF0aG5hbWUgdG8gdGhlIHRvcCBvZiB0aGUgRnJlZVR5cGUgc291cmNlcworIyogICAgICAgICAgICAgICAgICBoaWVyYXJjaHkKKyMqCisjKiAgVGhpcyBmaWxlIHNob3VsZCBkZWZpbmUgdGhlIGZvbGxvd2luZyB2YXJpYWJsZXMgYmVmb3JlIGluY2x1ZGluZworIyogIHRoZSBGcmVlVHlwZSBsaWJyYXJ5IHJ1bGVzIGZpbGUgOgorIyoKKyMqICAgICBCVUlMRCAgICAgICAgUGF0aG5hbWUgdG8gdGhlIHBsYXRmb3JtLXNwZWNpZmljIGZpbGVzIHVzZWQKKyMqICAgICAgICAgICAgICAgICAgZm9yIHRoZSBidWlsZC4gVXN1YWxseSBgJChUT1ApL2NvbmZpZy88c3lzdGVtPicKKyMqCisjKiAgICAgU0VQICAgICAgICAgIERpcmVjdG9yeSBzZXBhcmF0b3IgZm9yIHRoZSBjdXJyZW50IHBsYXRmb3JtLgorIyogICAgICAgICAgICAgICAgICBFaXRoZXIgLyBvciBcIChtYXliZSA6IG9uIE1hY3MpCisjKiAKKyMqICAgICBERUxFVEUgICAgICAgVGhlIGZvcmNlZCByZW1vdmUvZGVsZXRlIGNvbW1hbmQgdG8gZXJhc2Ugb25lIG9yIG1vcmUKKyMqICAgICAgICAgICAgICAgICAgZmlsZXMKKyMqCisjKiAgICAgSU5DTFVERSAgICAgIFRoZSBsb2NhdGlvbiBvZiBhbGwgcHVibGljIGhlYWRlciBmaWxlcy4gZS5nLgorIyogICAgICAgICAgICAgICAgICBgJChUT1ApL2luY2x1ZGUnaW5jbHVkZScgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyMqICAgICBTUkMgICAgICAgICAgVGhlIGRpcmVjdG9yeSBjb250YWluaW5nIGFsbCBzb3VyY2VzLiBlLmcuICAgICAgICAgICAgICAKKyMqICAgICAgICAgICAgICAgICAgJyQoVE9QKS9zcmMnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorIyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyMqICAgICBPQkpfRElSICAgICAgVGhlIGxvY2F0aW9uIHdoZXJlIGNvbXBpbGVkIG9iamVjdCBmaWxlcyB3aWxsIGJlICAgICAgICAgCisjKiAgICAgICAgICAgICAgICAgIHBsYWNlZCwgZS5nLiAnJChUT1ApL29iaicgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyMqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisjKiAgICAgTElCX0RJUiAgICAgIFRoZSBsb2NhdGlvbiB3aGVyZSB0aGUgcmVzdWx0aW5nIGxpYnJhcnkgZmlsZSB3aWxsIGJlICAgIAorIyogICAgICAgICAgICAgICAgICBwbGFjZWQsIGUuZy4gJyQoVE9QKS9vYmonICAgICAgICAgICAgICAgICAgICAgICAgCisjKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorIyogICAgIExJQlJBUlkgICAgICBUaGUgZmlsZW5hbWUgb2YgdGhlIHJlc3VsdGluZyBsaWJyYXJ5IGZpbGUsIHdpdGhvdXQgICAgICAKKyMqICAgICAgICAgICAgICAgICAgaXRzIGV4dGVuc2lvbi4uIGUuZy4gJ2xpYmZyZWV0eXBlJyBvciAnZnJlZXR5cGUnICAgICAgICAgCisjKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorIyogICAgIE8gICAgICAgICAgICBUaGUgb2JqZWN0IGZpbGUgc3VmZml4LiAgQ2FuIGJlICcubycsICcub2JqLCcgJy5sbywnICAgICAKKyMqICAgICAgICAgICAgICAgICAgJztjb2ZmLCcgZXRjLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisjKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorIyogICAgIEEgICAgICAgICAgICBUaGUgbGlicmFyeSBmaWxlIHN1ZmZpeC4gIENhbiBiZSAnLmEnICcuc28sJyAnLmxpYicgICAgICAKKyMqICAgICAgICAgICAgICAgICAgJy5kbGwsJyBldGMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisjKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorIyogICAgIEkgICAgICAgICAgICBUaGUgcGF0aCBpbmNsdXNpb24gZmxhZy4gIFNvbWUgY29tcGlsZXJzIHVzZSBhICAgICAgICAgICAKKyMqICAgICAgICAgICAgICAgICAgZGlmZmVyZW50IGZsYWcgdGhhbiAnLUknIHRvIHNwZWNpZnkgYW4gYWRkaXRpb25hbCAgICAgICAgCisjKiAgICAgICAgICAgICAgICAgIGluY2x1ZGUgcGF0aC4gIEV4YW1wbGVzIGFyZSAnL2k9JyBvciAnLUogJywgZXRjLiAgICAgICAgIAorIyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyMqICAgICBEICAgICAgICAgICAgVGhlIG1hY3JvIGRlZmluaXRpb24gZmxhZy4gIEkgaGF2ZW4ndCBtZXQgY29tcGlsZXJzICAgICAgCisjKiAgICAgICAgICAgICAgICAgIHdoaWNoIGRvbid0IHVzZSB0aGUgJy1EJyBzd2l0Y2ggdG8gZGVmaW5lIGEgbWFjcm8sIGJ1dCAgIAorIyogICAgICAgICAgICAgICAgICB3aG8ga25vd3MuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyMqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisjKiAgICAgVCAgICAgICAgICAgIFRoZSBjb21waWxhdGlvbiBmbGFnIHVzZWQgdG8gaWRlbnRpZnkgdGhlIHRhcmdldC4gU29tZSAgIAorIyogICAgICAgICAgICAgICAgICBjb21waWxlcnMgdXNlIGEgZGlmZmVyZW50IGZsYWcgdGhhbiAnLW8gJyB0byBzcGVjaWZ5ICAgICAKKyMqICAgICAgICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHRhcmdldCBvYmplY3QgZmlsZS4gICAgICAgICAgICAgICAgICAgICAgCisjKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorIyogICAgIENGTEFHUyAgICAgICBUaGUgc2V0IG9mIGZsYWdzIHVzZWQgdG8gY29tcGlsZSBvYmplY3QgZmlsZXMuCisjKiAgICAgICAgICAgICAgICAgICh1c3VhbGx5IGNvbnRhaW5zIHRoZSBmbGFnICctYycpLgorIyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyMqCisjKgorIyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworaWZuZGVmIFRPUAorVE9QIDo9IC4KK2VuZGlmCisKK0RFTEVURSAgIDo9IHJtIC1mCitTRVAgICAgICA6PSAvCitCVUlMRCAgICA6PSAkKFRPUCkvY29uZmlnL2RvcworUExBVEZPUk0gOj0gZG9zCisKKyMgdGhlIGRpcmVjdG9yeSB3aGVyZSBhbGwgb2JqZWN0IGZpbGVzIGFyZSBwbGFjZWQKKyMKK09CSl9ESVIgOj0gJChUT1ApL29iagorCisKKyMgdGhlIGRpcmVjdG9yeSB3aGVyZSBhbGwgbGlicmFyeSBmaWxlcyBhcmUgcGxhY2VkCisjCisjICBieSBkZWZhdWx0LCB0aGlzIGlzIHRoZSBzYW1lIGFzIE9CSl9ESVIsIGhvd2V2ZXIsIHRoaXMgY2FuIGJlCisjICBjaGFuZ2VkIHRvIHN1aXQgcGFydGljdWxhciBuZWVkcy4uCisjCitMSUJfRElSIDo9ICQoT0JKX0RJUikKKworCisjIHRoZSBvYmplY3QgZmlsZSBleHRlbnNpb24sIHRoaXMgY2FuIGJlIC5vLCAudGNvLCAub2JqLCBldGMuLgorIyBkZXBlbmRpbmcgb24gdGhlIHBsYXRmb3JtCisjCitPIDo9IG8KKworIyB0aGUgbGlicmFyeSBmaWxlIGV4dGVuc2lvbiwgdGhpcyBjYW4gYmUgLmEsIC5saWIsIGV0Yy4uCisjIGRlcGVuZGluZyBvbiB0aGUgcGxhdGZvcm0KKyMKK0EgOj0gYQorCisKKyMgVGhlIG5hbWUgb2YgdGhlIGZpbmFsIGxpYnJhcnkgZmlsZS4KKyMgTm90ZSB0aGF0IHRoZSBET1Mtc3BlY2lmaWMgTWFrZWZpbGUgdXNlcyBhIHNob3J0ZXIgKDguMykgbmFtZQorIworTElCUkFSWSA6PSBsaWJmcmVldHlwZQorCisKKyMgcGF0aCBpbmNsdXNpb24gZmxhZy4KKyMKKyMgIFNvbWUgY29tcGlsZXJzIHVzZSBhIGRpZmZlcmVudCBmbGFnIHRoYW4gJy1JJyB0byBzcGVjaWZ5IGFuCisjICBhZGRpdGlvbmFsIGluY2x1ZGUgcGF0aC4gRXhhbXBsZXMgYXJlICIvaT0iIG9yICItSiIsIGV0Yy4uLgorIworSSA6PSAtSQorCisKKyMgVGhlIGxpbmsgZmxhZyB1c2VkIHRvIHNwZWNpZnkgYSBnaXZlbiBsaWJyYXJ5IGZpbGUgb24gbGluay4KKyMgTm90ZSB0aGF0IHRoaXMgaXMgb25seSB1c2VkIHRvIGNvbXBpbGUgdGhlIGRlbW8gcHJvZ3JhbXMsIG5vdAorIyB0aGUgbGlicmFyeSBpdHNlbGYuCisjCitMIDo9IC1sCisKKworIyBDIGZsYWcgdXNlZCB0byBkZWZpbmUgYSBtYWNybyBiZWZvcmUgdGhlIGNvbXBpbGF0aW9uIG9mIGEgZ2l2ZW4KKyMgc291cmNlIG9iamVjdC4gVXN1YWxseSBpcyAnLUQnIGxpa2UgaW4gIi1EREVCVUciCisjCitEIDo9IC1ECisKKworIyBUYXJnZXQgZmxhZyAtIGJld2FyZSwgdGhlcmUgaXMgYSBzcGFjZSBhZnRlciB0aGUgJ28nICEhCisjCisjCitUIDo9IC1vIAorCisjIEMgZmxhZ3MKKyMKKyMgICBUaGVzZSBzaG91bGQgY29uY2VybiA6CisjCisjICAgICAtIGRlYnVnIG91dHB1dAorIyAgICAgLSBvcHRpbWl6YXRpb24KKyMgICAgIC0gd2FybmluZ3MKKyMgICAgIC0gYW5zaSBjb21wbGlhbmNlLi4KKyMKK2lmbmRlZiBDRkxBR1MKK0NGTEFHUyA6PSAtYyAtZyAtTzYgLVdhbGwKK2VuZGlmCisKK2lmZGVmIEJVSUxEX0ZSRUVUWVBFCisKK2luY2x1ZGUgJChUT1ApL2NvbmZpZy9mcmVldHlwZS5taworCisKKyMgVGhpcyBmaW5hbCBydWxlIGlzIHVzZWQgdG8gbGluayBhbGwgb2JqZWN0IGZpbGVzIGludG8gYSBzaW5nbGUKKyMgbGlicmFyeS4gSXQgaXMgcGFydCBvZiB0aGUgc3lzdGVtLXNwZWNpZmljIHN1Yi1NYWtlZmlsZSBiZWNhdXNlIG5vdAorIyBhbGwgbGlicmFyaWFucyBhY2NlcHQgYSBzaW1wbGUgc3ludGF4IGxpa2UgOgorIworIyAgICBsaWJyYXJpYW4gbGlicmFyeV9maWxlIHtsaXN0IG9mIG9iamVjdCBmaWxlc30gCisjCiskKEZUX0xJQlJBUlkpOiAkKE9CSkVDVFNfTElTVCkKKwktJChERUxFVEUpICRACisJJChBUikgLXIgJEAgJChPQkpFQ1RTX0xJU1QpCisKK2VuZGlmCmRpZmYgLS1naXQgYS9jb25maWcvZG9zL2RldGVjdC5tayBiL2NvbmZpZy9kb3MvZGV0ZWN0Lm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmZTQ0MDAKLS0tIC9kZXYvbnVsbAorKysgYi9jb25maWcvZG9zL2RldGVjdC5tawpAQCAtMCwwICsxLDg3IEBACisjCisjIFRoaXMgZmlsZSBpcyB1c2VkIHRvIGRldGVjdCBhIERPUyBob3N0IHBsYXRmb3JtLgorIworIyBUaGlzIGNvbmZpZ3VyYXRpb24gZmlsZSB0byBiZSB1c2VkIGRlcGVuZHMgb24gdGhlIHZhbHVlIG9mIHRoZSBDQworIyBlbnZpcm9ubWVudCB2YXJpYWJsZS4KKyMKKyMKKworIyBXZSB0ZXN0IGZvciB0aGUgQ09NU1BFQyBlbnZpcm9ubWVudCB2YXJpYWJsZSwgdGhlbiBydW4gdGhlICd2ZXInCisjIGNvbW1hbmQtbGluZSBwcm9ncmFtIHRvIHNlZSBpZiBpdHMgb3V0cHV0IGNvbnRhaW5zIHRoZSB3b3JkICJEb3MiCisjCisjIElmIHRoaXMgaXMgdHJ1ZSwgd2UncmUgcnVubmluZyBhIERvcy1pc2ggcGxhdGZvcm0gKG9yIGFuIGVtdWxhdGlvbikKKyMKKworaWZlcSAoJChQTEFURk9STSksYW5zaSkKKworaWZkZWYgQ09NU1BFQworCitpc19kb3MgOj0gJChmaW5kc3RyaW5nIERvcywkKHNoZWxsIHZlcikpCisKKyMgV2UgdHJ5IHRvIHJlY29nbml6ZSBhIERvcyBzZXNzaW9uIHVuZGVyIE9TLzIuIFRoZSAidmVyIiBjb21tYW5kCisjIHJldHVybnMgJ09wZXJhdGluZyBTeXN0ZW0vMiAuLi4nIHRoZXJlIHNvICdpc19kb3MnIHNob3VsZCBiZSBlbXB0eQorIyB0aGVyZS4KKyMKKyMgVG8gcmVjb2duaXplIGEgRG9zIHNlc3Npb24gdW5kZXIgT1MvMiwgd2UgY2hlY2sgQ09NU1BFQyBmb3IgdGhlCisjIHN1YnN0cmluZyAiTURPU1xDT01NQU5EIgorIworaWZlcSAoJChpc19kb3MpLCkKK2lzX2RvcyA6PSAkKGZpbmRzdHJpbmcgTURPU1xDT01NQU5ELCQoQ09NU1BFQykpCitlbmRpZgorCitpZm5lcSAoJChpc19kb3MpLCkKKworUExBVEZPUk0gOj0gZG9zCitERUxFVEUgICA6PSBkZWwKK0NPUFkgICAgIDo9IGNvcHkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIFVzZSBnY2MsIGkuZS4gREpHUFAgYnkgZGVmYXVsdC4gQXJlbid0IHdlIGJpYXNlZCA7LSkKKyMKKyMKK0NPTkZJR19GSUxFIDo9IE1ha2VmaWxlLmdjYworU0VQICAgICAgICAgOj0gLworaWZuZGVmIENDCitDQyAgICAgICAgICA6PSBnY2MKK2VuZGlmCisKKworaWZuZXEgKCQoZmluZHN0cmluZyB0dXJib2MsJChNQUtFQ01ER09BTFMpKSwpICAgICAjIFR1cmJvIEMKK0NPTkZJR19GSUxFIDo9IE1ha2VmaWxlLnRjYworU0VQICAgICAgICAgOj0gJChCQUNLU0xBU0gpCitDQyAgICAgICAgICA6PSB0Y2MKKy5QSE9OWTogdHVyYm9jCitlbmRpZgorCitpZm5lcSAoJChmaW5kc3RyaW5nIHdhdGNvbSwkKE1BS0VDTURHT0FMUykpLCkgICAgICMgV2F0Y29tIEMvQysrCitDT05GSUdfRklMRSA6PSBNYWtlZmlsZS53YXQKK1NFUCAgICAgICAgIDo9ICQoQkFDS1NMQVNIKQorQ0MgICAgICAgICAgOj0gd2NjMzg2CisuUEhPTlk6IHdhdGNvbQorZW5kaWYKKworaWZuZXEgKCQoZmluZHN0cmluZyBib3JsYW5kYzE2LCQoTUFLRUNNREdPQUxTKSksKSAgICMgQm9ybGFuZCBDL0MrKyAxNiBiaXRzCitDT05GSUdfRklMRSA6PSBNYWtlZmlsZS5iY2MKK1NFUCAgICAgICAgIDo9ICQoQkFDS1NMQVNIKQorQ0MgICAgICAgICAgOj0gYmNjCisuUEhPTlk6IGJvcmxhbmRjMTYKK2VuZGlmCisKK2lmbmVxICgkKGZpbmRzdHJpbmcgYm9ybGFuZGMsJChNQUtFQ01ER09BTFMpKSwpICAgIyBCb3JsYW5kIEMvQysrIDMyIGJpdHMKK0NPTkZJR19GSUxFIDo9IE1ha2VmaWxlLmJjYworU0VQICAgICAgICAgOj0gJChCQUNLU0xBU0gpCitDQyAgICAgICAgICA6PSBiY2MzMgorLlBIT05ZOiBib3JsYW5kYworZW5kaWYKKworQ09ORklHX1JVTEVTIDo9ICQoVE9QKVxjb25maWdcZG9zXCQoQ09ORklHX0ZJTEUpCisKKyMgdXNlIHRoZSBEb3MgdmVyc2lvbiBvZiB0aGUgInNldHVwIGR1bXAiCisjCitzZXR1cDogIGRvc19zZXR1cAorCitlbmRpZiAjIHRlc3QgRG9zCitlbmRpZiAjIHRlc3QgQ09NU1BFQworZW5kaWYgIyB0ZXN0IFBMQVRGT1JNCisKZGlmZiAtLWdpdCBhL2NvbmZpZy9kb3MvZnRvcHRpb24uaCBiL2NvbmZpZy9kb3MvZnRvcHRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTJmNjVmCi0tLSAvZGV2L251bGwKKysrIGIvY29uZmlnL2Rvcy9mdG9wdGlvbi5oCkBAIC0wLDAgKzEsMTYyIEBACisjaWZuZGVmIEZUT1BUSU9OX0gKKyNkZWZpbmUgRlRPUFRJT05fSAorCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgIFVTRVItU0VMRUNUQUJMRSBDT05GSUdVUkFUSU9OIE1BQ1JPUyAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBUaGVzZSBtYWNyb3MgY2FuIGJlIHRvZ2dsZWQgYnkgZGV2ZWxvcGVycyB0byBlbmFibGUgb3IgZGlzYWJsZSAgICAgICAgKi8KKyAgLyogY2VydGFpbiBhc3BlY3RzIG9mIEZyZWVUeXBlLiAgVGhpcyBmaWxlIGNvbnRhaW5zIG1hY3JvcyB0aGF0IGFwcGx5IHRvICovCisgIC8qIGFsbCBvZiBGcmVlVHlwZS4gIERyaXZlci1zcGVjaWZpYyBjb25maWd1cmF0aW9ucyBhcmUgcGxhY2VkIGluIGVhY2ggICAqLworICAvKiBkcml2ZXIgZGlyZWN0b3J5IChlLmcuIGBmcmVldHlwZS9kcml2ZXJzL3R0bGliL3R0Y29uZmlnLmgnKS4gICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBBbHRlcm5hdGUgR2x5cGggSW1hZ2UgRm9ybWF0IHN1cHBvcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgQnkgZGVmYXVsdCwgdGhlIGdseXBoIGltYWdlcyByZXR1cm5lZCBieSB0aGUgRnJlZVR5cGUgZ2x5cGggbG9hZGVyICAqLworICAvKiAgIGNhbiBlaXRoZXIgYmUgYSBwaXhtYXAgb3IgYSB2ZWN0b3JpYWwgb3V0bGluZSBkZWZpbmVkIHRocm91Z2ggICAgICAgKi8KKyAgLyogICBiZXppZXIgY29udHJvbCBwb2ludHMuIFdoZW4gZGVmaW5pbmcgdGhlIGZvbGxvd2luZyBjb25maWd1cmF0aW9uICAgICovCisgIC8qICAgbWFjcm8sIHNvbWUgZm9udCBkcml2ZXJzIHdpbGwgYmUgYWJsZSB0byByZWdpc3RlciBhbHRlcm5hdGUgICAgICAgICAqLworICAvKiAgIGdseXBoIGltYWdlIGZvcm1hdHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgVW5zZXQgdGhpcyBtYWNybyBpZiB5b3UncmUgc3VyZSB0aGF0IHlvdSdsbCBuZXZlciB1c2UgYSBmb250IGRyaXZlciAqLworICAvKiAgIHdpdGggYW4gYWx0ZXJuYXRlIGdseXBoIGZvcm1hdCwgdGhpcyB3aWxsIHJlZHVjZSB0aGUgc2l6ZSBvZiB0aGUgICAgKi8KKyAgLyogICBiYXNlIGxheWVyIGNvZGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBGVF9DT05GSUdfT1BUSU9OX0FMVEVSTkFURV9HTFlQSF9GT1JNQVRTCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBHQ0MgcHJvdmlkZXMgdGhlIG5vbi1BTlNJIGBsb25nIGxvbmcnIDY0LWJpdCB0eXBlLiAgWW91IGNhbiBhY3RpdmF0ZSAgKi8KKyAgLyogaXQgYnkgZGVmaW5pbmcgdGhlIEZUQ0FMQ19VU0VfTE9OR19MT05HIG1hY3JvIGhlcmUuICBOb3RlIGhvd2V2ZXIgICAgICovCisgIC8qIHRoYXQgd2UgZGlkIG5vdCBleHBlcmllbmNlIGFueSBpbXByb3ZlbWVudCBpbiBzcGVlZCB3aXRoIGdjYywgYW5kICAgICAqLworICAvKiB0aGF0IHRoZSBmaW5hbCBjb2RlIHNlZW1zIGJpZ2dlciB3aGVuIGxpbmtlZC4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjdW5kZWYgRlRDQUxDX1VTRV9MT05HX0xPTkcKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogV2hlbiBjb21waWxpbmcgRnJlZVR5cGUgYXMgYSBETEwsIHNvbWUgc3lzdGVtcy9jb21waWxlcnMgbmVlZCBhICAgICAgICovCisgIC8qIHNwZWNpYWwga2V5d29yZCBpbiBmcm9udCBvZiBlYWNoIGZ1bmN0aW9uIGRlZmluaXRpb24gaW5zdGVhZCBvZiAgICAgICAqLworICAvKiBgZXh0ZXJuJy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFRoZSBtYWNyb3MgRVhQT1JUX0RFRiBhbmQgRVhQT1JUX0ZVTkMgYXJlIHRodXMgdXNlZCB0byBkZWZpbmUgICAgICAgICAqLworICAvKiBleHBvcnRlZCBsaWJyYXJ5IGZ1bmN0aW9uIGludGVyZmFjZXMgYW5kIGV4cG9ydGVkIGxpYnJhcnkgZnVuY3Rpb25zICAgKi8KKyAgLyogaW1wbGVtZW50YXRpb25zIHJlc3BlY3RpdmVseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBJZiBub3QgZGVmaW5lZCBoZXJlLCB0aGV5IGF1dG9tYXRpY2FsbHkgZGVmYXVsdCB0byBgZXh0ZXJuJyBhbmQgdm9pZCAgKi8KKyAgLyogbGF0ZXIgaW4gdGhpcyBoZWFkZXIgZmlsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI3VuZGVmIEVYUE9SVF9ERUYKKyN1bmRlZiBFWFBPUlRfRlVOQworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBEZWJ1ZyBsZXZlbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgRnJlZVR5cGUgY2FuIGJlIGNvbXBpbGVkIGluIGRlYnVnIG9yIHRyYWNlIG1vZGUuICBJbiBkZWJ1ZyBtb2RlLCAgICAqLworICAvKiAgIGVycm9ycyBhcmUgcmVwb3J0ZWQgdGhyb3VnaCB0aGUgYGZ0ZGVidWcnIGNvbXBvbmVudC4gIEluIHRyYWNlICAgICAgKi8KKyAgLyogICBtb2RlLCBhZGRpdGlvbmFsIG1lc3NhZ2VzIGFyZSBzZW50IHRvIHRoZSBzdGFuZGFyZCBvdXRwdXQgZHVyaW5nICAgICovCisgIC8qICAgZXhlY3V0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICBEZWZpbmUgRlRfREVCVUdfTEVWRUxfRVJST1IgdG8gYnVpbGQgdGhlIGxpYnJhcnkgaW4gZGVidWcgbW9kZS4gICAgICovCisgIC8qICAgRGVmaW5lIEZUX0RFQlVHX0xFVkVMX1RSQUNFIHRvIGJ1aWxkIGl0IGluIHRyYWNlIG1vZGUuICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICBEb24ndCBkZWZpbmUgYW55IG9mIHRoZXNlIG1hY3JvcyB0byBjb21waWxlIGluIGByZWxlYXNlJyBtb2RlLiAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI3VuZGVmICBGVF9ERUJVR19MRVZFTF9FUlJPUgorI3VuZGVmICBGVF9ERUJVR19MRVZFTF9UUkFDRQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBBbnRpLWFsaWFzaW5nIHN1cHBvcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgVW5kZWZpbmUgdGhpcyBtYWNybyBvbmx5IGlmIHlvdSB3YW50IHRvIGRpc2FibGUgdGhlIGFudGktYWxpYXNpbmcgICAqLworICAvKiAgIHN1cHBvcnQgaW4gRnJlZVR5cGUuICBUaGlzIHdpbGwgc2F2ZSB5b3UgYWJvdXQgNSBLYiBvZiBjb2RlLiAgSXQgICAgKi8KKyAgLyogICBtYXkgYmUgaW1wb3J0YW50IGZvciBzb21lIGVtYmVkZGVkIHN5c3RlbXMuICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBGVF9DT05GSUdfT1BUSU9OX0FOVElfQUxJQVMKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogRW5kaWFuZXNzIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIEZyZWVUeXBlIGlzIGNvbXBsZXRlbHkgZW5kaWFuLWluZGVwZW5kZW50LCBhbmQgY2FuIHRodXMgYmUgY29tcGlsZWQgKi8KKyAgLyogICBkaXJlY3RseSBvbiBfYW55XyBtYWNoaW5lLiAgSG93ZXZlciwgc29tZSBjb21wb25lbnRzIG9mIHRoZSBsaWJyYXJ5ICovCisgIC8qICAgcHJvdmlkZSBpbXByb3ZlZCByb3V0aW5lcyBmb3IgdGhlIGNhc2VzIHdoZXJlIGVuZGlhbmVzcyBpcyBrbm93bi4gICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICBJdCB1c3VhbGx5IHJlc3VsdHMgaW4gc3BlZWQtdXBzIGFuZCByZWR1Y2VkIGNvZGUgc2l6ZS4gIE5vdGUgdGhhdCAgICovCisgIC8qICAgeW91IHNob3VsZCBub3QgZGVmaW5lIGJvdGggb2YgdGhlc2UgbWFjcm9zLiAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgTk9URTogRm9yIG5vdywgb25seSB0aGUgc2Nhbi1saW5lIGNvbnZlcnRlciAoYmFzZS9mdHJhc3Rlci5jKSB1c2VzICAqLworICAvKiAgICAgICAgIHRoZXNlIG1hY3JvcyB0byBzcGVlZC11cCBzb21lIGFudGktYWxpYXMgcmVuZGVyaW5nIHJvdXRpbmVzLiAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjdW5kZWYgIEZUX0NPTkZJR19PUFRJT05fTElUVExFX0VORElBTgorI3VuZGVmICBGVF9DT05GSUdfT1BUSU9OX0JJR19FTkRJQU4KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogRGVmaW5lIHRoaXMgY29uZmlndXJhdGlvbiBtYWNybyB3aGVuZXZlciB5b3Ugd2FudCB0byBidWlsZCBhIHZlcnNpb24gICovCisgIC8qIG9mIEZyZWVUeXBlIHRoYXQgZG9lcyBub3QgaW5jbHVkZSBhIGRlZmF1bHQgYHN5c3RlbScgY29tcG9uZW50LiAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogTm90ZSB0aGF0IHRoaXMgd2lsbCBwcmV2ZW50IHRoZSBjb21waWxhdGlvbiBvZiBgZnRpbml0JywgaGVuY2UgdGhlICAgICovCisgIC8qIGZ1bmN0aW9uIEZUX0luaXRfRnJlZVR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyN1bmRlZiBGVF9DT05GSUdfT1BUSU9OX05PX0RFRkFVTFRfU1lTVEVNCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSByZW5kZXIgcG9vbCB1c2VkIGJ5IHRoZSBzY2FuLWxpbmUgICAgICAgICAqLworICAvKiAgICBjb252ZXJ0ZXIgdG8gZG8gYWxsIG9mIGl0cyB3b3JrLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoaXMgbXVzdCBiZSBncmVhdGVyIHRoYW4gNCBLYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRlRfUkVOREVSX1BPT0xfU0laRSAgIDMyNzY4CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX01BWF9EUklWRVJTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhlIG1heGltdW0gbnVtYmVyIG9mIGZvbnQgZHJpdmVycyB0aGF0IGNhbiBiZSByZWdpc3RlcmVkIGluIGEgICAgICovCisgIC8qICAgIHNpbmdsZSBGcmVlVHlwZSBsaWJyYXJ5IG9iamVjdC4gIDggc2VlbXMgdG8gYmUgYSBnb29kIGNob2ljZSBkdWUgICAqLworICAvKiAgICB0byB0aGUgcmVsYXRpdmUgbG93IGFjdHVhbCBudW1iZXIgb2YgZHJpdmVycyA7LSkgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZUX01BWF9EUklWRVJTICA4CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX01BWF9FWFRFTlNJT05TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhlIG1heGltdW0gbnVtYmVyIG9mIGV4dGVuc2lvbnMgdGhhdCBjYW4gYmUgcmVnaXN0ZXJlZCBpbiBhICAgICAgICovCisgIC8qICAgIHNpbmdsZSBmb250IGRyaXZlci4gOCBzZWVtcyB0byBiZSBhIGdvb2QgY2hvaWNlIGZvciBub3cuLiAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRlRfTUFYX0VYVEVOU0lPTlMgIDgKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfTUFYX0dMWVBIX0ZPUk1BVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGUgbWF4aW11bSBudW1iZXIgb2YgZ2x5cGggaW1hZ2UgZm9ybWF0cyB0aGF0IG1pZ2h0IGJlIHJlZ2lzdGVyZWQgKi8KKyAgLyogICAgaW4gYSBnaXZlbiBsaWJyYXJ5IGluc3RhbmNlLiA4IHNlZW1zIHRvIGJlIGEgZ29vZCBjaG9pY2UgZHVlIHRvICAgICovCisgIC8qICAgIHRoZSByZWxhdGl2ZWx5IGxvdyBudW1iZXIgb2YgY3VycmVudCBmb3JtYXRzIDstKSAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworI2RlZmluZSBGVF9NQVhfR0xZUEhfRk9STUFUUyAgOAorCisKKworI2VuZGlmIC8qIEZUT1BUSU9OX0ggKi8KZGlmZiAtLWdpdCBhL2NvbmZpZy9kb3MvZnRzeXMuYyBiL2NvbmZpZy9kb3MvZnRzeXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjc2ZGZjCi0tLSAvZGV2L251bGwKKysrIGIvY29uZmlnL2Rvcy9mdHN5cy5jCkBAIC0wLDAgKzEsODY2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBmdHN5cy5jCisgKgorICogICAgQU5TSS1zcGVjaWZpYyBzeXN0ZW0gb3BlcmF0aW9ucy4KKyAqCisgKiAgQ29weXJpZ2h0IDE5OTYtMTk5OCBieQorICogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkCisgKiAgbW9kaWZpZWQgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAKKyAqICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICoKKyAqICBUaGlzIGltcGxlbWVudGF0aW9uIG9mIHRoZSAnZnRzeXMnIGNvbXBvbmVudCB1c2VzIHRoZSBzdGFuZGFyZAorICogIEFOU0kgQyBsaWJyYXJ5LgorICoKKyAqICBJTVBPUlRBTlQgTk9URSA6CisgKgorICogICAgUG9ydGVycywgcmVhZCBjYXJlZnVsbHkgdGhlIGNvbW1lbnRzIGluIGZ0c3lzLmggYmVmb3JlIHRyeWluZworICogICAgdG8gcG9ydCB0aGlzIGZpbGUgdG8geW91ciBzeXN0ZW0uIEl0IGNvbnRhaW5zIG1hbnkgZXNzZW50aWFsCisgKiAgICByZW1hcmtzLCBhbmQgd2lsbCBlYXNlIHlvdXIgd29yayBncmVhdGx5Li4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiZnRzeXMuaCIKKyNpbmNsdWRlICJmdHN0cmVhbS5oIgorI2luY2x1ZGUgImZ0ZGVidWcuaCIKKworCisvKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gSXQgaXMgYW4gaW1wbGljaXQgKi8KKy8qIHBhcmFtZXRlciBvZiB0aGUgUFRSQUNFIGFuZCBQRVJST1IgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZyAgICAqLworLyogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyN1bmRlZiAgRlRfQ09NUE9ORU5UCisjZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfaW8KKworCisjdW5kZWYgIENVUl9TWVNURU0gIC8qIGp1c3QgaW4gY2FzZSAqLworCisKKy8qIFRvIGVhc2UgcG9ydGluZywgd2UgdXNlIHRoZSBtYWNybyBTWVNfU1RSRUFNIHRvIG5hbWUgdGhlIHN5c3RlbS1zcGVjaWZpYyAqLworLyogc3RyZWFtIHR5cGUuIEZvciBleGFtcGxlLCBpdCBpcyBhICJGSUxFKiIgd2l0aCB0aGUgQU5TSSBsaWJjLCBpdCB3aWxsIGJlICovCisvKiBhIGZpbGUgZGVzY3JpcHRvciwgaS5lLiBhbiBpbnRlZ2VyLCB3aGVuIHVzaW5nIHRoZSBVbml4IHN5c3RlbSBhcGksIGV0Yy4gKi8KKyAKKyNkZWZpbmUgIFNZU19TVFJFQU0gIEZJTEUqCisKKworICAvKiBUaGlzIGltcGxlbWVudGF0aW9uIG9mIGZ0c3lzIHVzZXMgdGhlIEFOU0kgQyBsaWJyYXJ5LiBNZW1vcnkgICAgICAgKi8KKyAgLyogbWFuYWdlbWVudCBpcyBwZXJmb3JtZWQgdGhyb3VnaCBtYWxsb2MvZnJlZSwgaS9vIGFjY2VzcyB0aHJvdWdoICAgICovCisgIC8qIGZvcGVuL2ZyZWFkL2ZzZWVrLCBhbmQgbm8gc3luY2hyb25pc2F0aW9uIHByaW1pdGl2ZSBpcyBpbXBsZW1lbnRlZCAqLworICAvKiAodGhleSBjb250YWluIGR1bW15IGNvZGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgIEkvTyBBQ0NFU1MgQU5EIE1BTkFHRU1FTlQgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBXZSBvbmx5IGRlZmluZSB0aGUgIkFOU0kiIHJlc291cmNlIGNsYXNzIGluIHRoaXMgY2xhc3MuIEl0IGlzICAgICAgICAgKi8KKy8qICBkaXNrLWJhc2VkLCBhbmQgcHJvdmlkZXMgYSBNUlUgY2FjaGUsIGluIG9yZGVyIHRvIG9ubHkga2VlcCB0aGUgZmlsZSAgKi8KKy8qICBkZXNjcmlwdG9ycyBvZiB0aGUgMTAgbW9zdCByZWNlbnRseSB1c2VkIHJlc291cmNlIGZpbGVzLiAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBpdCBzaW1wbHkgY29udGFpbnMgdHdvIGxpc3RzLiBPbmUgY29udGFpbnMgdGhlICJjYWNoZWQiIHJlc291cmNlcyAgICAgKi8KKy8qICB3aXRoIGEgdmFsaWQgRklMRSogcG9pbnRlciwgdGhlIHNlY29uZCBjb250YWlucyBhbGwgb3RoZXIgImZsdXNoZWQiICAgKi8KKy8qICByZXNvdXJjZSBvYmplY3RzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworLyogVGhlIEZUX0FOU0lfRmlsZSBjbGFzcyBkZXJpdmVzIGZyb20gRlRfUmVzb3VyY2VSZWMgLSBkZXNjcmlwdGlvbiA6ICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPFN0cnVjdD4gRlRfQW5zaUZpbGVSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogcm9vdCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgdGhlIHJvb3QgcmVzb3VyY2UgY2xhc3MgZmllbGRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogcGF0aG5hbWUgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgdGhpcyBpcyBhIGNvcHkgb2YgdGhlIEFOU0kgZmlsZSBwYXRobmFtZSB1c2VkIHRvIG9wZW4gc3RyZWFtcyAgICAqLworLyogICAgZm9yIHRoZSByZXNvdXJjZS4gQSBkaWZmZXJlbnQgaW1wbGVtZW50YXRpb24gaXMgZnJlZSB0byB1c2UgICAgICAqLworLyogICAgdW5pY29kZSBjaGFycywgb3IgZmlsZSBpLW5vZGUgbnVtYmVycywgZXRjLi4gICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogZmlsZV9zaXplIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgdGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIHJlc291cmNlLiBUaGlzIGZpZWxkIHNob3VsZCBiZSBzZXQgdG8gICAqLworLyogICAgLTEgdW50aWwgdGhlIHJlc291cmNlIGlzIGZpcnN0IG9wZW5lZC4uICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKworICB0eXBlZGVmIHN0cnVjdCBGVF9BbnNpRmlsZVJlY18KKyAgeworICAgIEZUX1Jlc291cmNlUmVjICByb290OworICAgIGNoYXIqICAgICAgICAgICBwYXRobmFtZTsgICAvKiB0aGUgZm9udCBmaWxlJ3MgcGF0aG5hbWUgICAgICAgICAgICovCisgICAgRlRfTG9uZyAgICAgICAgIGZpbGVfc2l6ZTsgIC8qIGZpbGUgc2l6ZSBpbiBieXRlcyAgICAgICAgICAgICAgICAgKi8KKyAgICAKKyAgfSBGVF9BbnNpRmlsZVJlYywgKkZUX0Fuc2lGaWxlOworCisKKy8qIFdlIHVzZSB0aGUgbWFjcm8gU1RSRUFNX05hbWUgYXMgYSBjb252ZW5pZW5jZSB0byByZXR1cm4gYSBnaXZlbiAgKi8KKy8qIEFOU0kgcmVzb3VyY2UncyBwYXRobmFtZS4gSXRzICJzdHJlYW0iIGFyZ3VtZW50IGlzIGEgRlRfUmVzb3VyY2UgKi8KKy8qIHdoaWNoIGlzIHR5cGVjYXN0ZWQgdG8gdGhlIEZUX0Fuc2lGaWxlIGNsYXNzICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU1RSRUFNX05hbWUoc3RyZWFtKSAgKChGVF9BbnNpRmlsZSlzdHJlYW0tPnJlc291cmNlKS0+cGF0aG5hbWUKKworLyogV2UgdXNlIHRoZSBtYWNybyBTVFJFQU1fRmlsZSBhcyBhIGNvbnZlbmllbmNlIHRvIGV4dHJhY3QgdGhlICAgICAgKi8KKy8qIHN5c3RlbS1zcGVjaWZpYyBzdHJlYW0gaGFuZGxlIGZyb20gYSBnaXZlbiBGcmVlVHlwZSBzdHJlYW0gb2JqZWN0ICovCisjZGVmaW5lIFNUUkVBTV9GaWxlKHN0cmVhbSkgICgoRklMRSopc3RyZWFtLT5zdHJlYW1faWQucG9pbnRlcikKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPEZ1bmN0aW9uPiBBbnNpRmlsZV9PcGVuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIG9wZW4gYSBzeXN0ZW0tc3RyZWFtIGZvciBhIGdpdmVuIHJlc291cmNlLiAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBOb3RlIHRoYXQgaXQgbXVzdCB1cGRhdGUgdGhlIHRhcmdldCBGcmVlVHlwZSBzdHJlYW0gb2JqZWN0IHdpdGggdGhlICAqLworLyogICAgc3lzdGVtLXN0cmVhbSBoYW5kbGUgYW5kIHRoZSByZXNvdXJjZSdzIHNpemUuICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBbHNvLCB0aGUgJ3N0cmVhbS0+YmFzZScgZmllbGQgbXVzdCBiZSBzZXQgdG8gTlVMTCBmb3IgZGlzay1iYXNlZCAgICAqLworLyogICAgcmVzb3VyY2UsIGFuZCB0byB0aGUgYWRkcmVzcyBpbiBtZW1vcnkgb2YgdGhlIHJlc291cmNlJ3MgZmlyc3QgYnl0ZSAgKi8KKy8qICAgIGZvciBhIG1lbW9yeS1iYXNlZCBvbmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgcmVzb3VyY2UgOjogdGhlIHNvdXJjZSByZXNvdXJjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIHN0cmVhbSAgIDo6IHRoZSB0YXJnZXQgc3RyZWFtIG9iamVjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIEVycm9yIGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIFRoaXMgZnVuY3Rpb24gc2ltcGx5IGNhbGxzIGZvcGVuIGluIHRoZSByZXNvdXJjZSdzIGZpbGUgcGF0aG5hbWUgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgVGhlIHN0cmVhbSBvYmplY3QgSVMgTk9UIENSRUFURUQgYnkgdGhpcyBmdW5jdGlvbiwgYnV0IGJ5IGl0cyBjYWxsZXIuICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICBzdGF0aWMKKyAgRlRfRXJyb3IgIEFuc2lGaWxlX09wZW4oIEZUX0Fuc2lGaWxlICByZXNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgICBzdHJlYW0gKQorICB7CisgICAgRklMRSogIGZpbGU7CisgICAgCisgICAgLyogb3BlbiB0aGUgZmlsZSAqLworICAgIGZpbGUgPSBmb3BlbiggcmVzb3VyY2UtPnBhdGhuYW1lLCAicmIiICk7CisgICAgaWYgKCFmaWxlKQorICAgIHsKKyAgICAgIFBFUlJPUigoICJBbnNpRmlsZV9PcGVuOiBjb3VsZCBub3Qgb3BlbiBmaWxlICclcydcbiIsCisgICAgICAgICAgICAgICByZXNvdXJjZS0+cGF0aG5hbWUgKSk7CisgICAgICByZXR1cm4gRlRfRXJyX0Nhbm5vdF9PcGVuX1N0cmVhbTsKKyAgICB9CisKKyAgICAvKiBjb21wdXRlIGZpbGUgc2l6ZSBpZiBuZWNlc3NhcnkgKi8KKyAgICBpZiAoIHJlc291cmNlLT5maWxlX3NpemUgPCAwICkKKyAgICB7CisgICAgICBmc2VlayggZmlsZSwgMCwgU0VFS19FTkQgKTsKKyAgICAgIHJlc291cmNlLT5maWxlX3NpemUgPSBmdGVsbChmaWxlKTsKKyAgICAgIGZzZWVrKCBmaWxlLCAwLCBTRUVLX1NFVCApOworICAgIH0KKworICAgIHN0cmVhbS0+cmVzb3VyY2UgICAgICAgICAgPSAoRlRfUmVzb3VyY2UpcmVzb3VyY2U7CisgICAgc3RyZWFtLT5zdHJlYW1faWQucG9pbnRlciA9IGZpbGU7CisgICAgc3RyZWFtLT5zaXplICAgICAgICAgICAgICA9IHJlc291cmNlLT5maWxlX3NpemU7CisgICAgCisgICAgLyogaXQncyBhIGRpc2stYmFzZWQgcmVzb3VyY2UsIHdlIGRvbid0IG5lZWQgdG8gdXNlIHRoZSAiYmFzZSIgYW5kICAgKi8KKyAgICAvKiAiY3Vyc29yIiBmaWVsZHMgb2YgdGhlIHN0cmVhbSBvYmplY3RzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIHN0cmVhbS0+YmFzZSAgICAgICAgICAgICAgPSBOVUxMOworICAgIHN0cmVhbS0+Y3Vyc29yICAgICAgICAgICAgPSBOVUxMOworCisgICAgUFRSQUNFMSgoICJBbnNpRmlsZV9PcGVuOiBvcGVuZWQgJyVzJyAoJWQgYnl0ZXMpIHN1Y2Nlc2Z1bGx5XG4iLAorICAgICAgICAgICAgICByZXNvdXJjZS0+cGF0aG5hbWUsIHJlc291cmNlLT5maWxlX3NpemUgKSk7CisKKyAgICByZXR1cm4gRlRfRXJyX09rOworICB9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA8RnVuY3Rpb24+IEFuc2lGaWxlX0Nsb3NlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIDxEZXNjcmlwdGlvbj4gQ2xvc2VzIGEgZ2l2ZW4gc3RyZWFtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgc3RyZWFtICAgOjogdGhlIHRhcmdldCBzdHJlYW0gb2JqZWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgRXJyb3IgY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgVGhpcyBmdW5jdGlvbiBzaW1wbHkgY2FsbHMgZmNsb3NlIG9uIHRoZSBzdHJlYW0ncyBBTlNJIEZJTEUgb2JqZWN0ICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICBzdGF0aWMKKyAgRlRfRXJyb3IgIEFuc2lGaWxlX0Nsb3NlKCBGVF9TdHJlYW0gIHN0cmVhbSApCisgIHsKKyAgICBQVFJBQ0UxKCggIkNsb3NpbmcgZmlsZSAnJXMnXG4iLCBTVFJFQU1fTmFtZShzdHJlYW0pICkpOworICAgIAorICAgIGZjbG9zZSggU1RSRUFNX0ZpbGUoc3RyZWFtKSApOworICAgIAorICAgIHN0cmVhbS0+cmVzb3VyY2UgICAgICAgICAgPSBOVUxMOworICAgIHN0cmVhbS0+c3RyZWFtX2lkLnBvaW50ZXIgPSBOVUxMOworICAgIHN0cmVhbS0+c2l6ZSAgICAgICAgICAgICAgPSAwOworCisgICAgcmV0dXJuIEZUX0Vycl9PazsKKyAgfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPEZ1bmN0aW9uPiBBbnNpRmlsZV9TZWVrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA8RGVzY3JpcHRpb24+IFNlZWsgYSBzdHJlYW0gdG8gYSBnaXZlbiBwb3NpdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIHN0cmVhbSAgIDo6IHRoZSB0YXJnZXQgc3RyZWFtIG9iamVjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBwb3NpdGlvbiA6OiBvZmZzZXQgaW4gYnl0ZXMgZnJvbSBzdGFydCBvZiByZXNvdXJjZS9zdHJlYW0gICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBFcnJvciBjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBUaGlzIGZ1bmN0aW9uIHNpbXBseSBjYWxscyBmc2VlayBvbiB0aGUgc3RyZWFtLiAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIFRoZSAic2VlayIgbWV0aG9kIGlzIG5ldmVyIGNhbGxlZCBieSB0aGUgc3RyZWFtIG1hbmFnZXIgaW4gdGhlIGNhc2UgICAqLworLyogICBvZiBhIG1lbW9yeS1iYXNlZCByZXNvdXJjZSAoaS5lLiB3aGVuICdzdHJlYW0tPmJhc2UnIGlzbid0IE5VTEwpLiAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIHN0YXRpYworICBGVF9FcnJvciAgQW5zaUZpbGVfU2VlayggRlRfU3RyZWFtICBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgIHBvc2l0aW9uICkKKyAgeworICAgIGlmICggZnNlZWsoIFNUUkVBTV9GaWxlKHN0cmVhbSksIHBvc2l0aW9uLCBTRUVLX1NFVCApICkKKyAgICB7CisgICAgICBQRVJST1IoKCAiQW5zaUZpbGVfU2VlayA6IEZBSUxFRCAhISBwb3MuICVsZCBvZiAnJXMnXG4iLAorICAgICAgICAgICAgICAgcG9zaXRpb24sIFNUUkVBTV9OYW1lKHN0cmVhbSkgKSk7CisgICAgICAgICAgICAgCisgICAgICByZXR1cm4gRlRfRXJyX0ludmFsaWRfU3RyZWFtX1NlZWs7CisgICAgfQorICAgICAgCisgICAgUFRSQUNFMigoICJBbnNpRmlsZV9TZWVrIDogcG9zLiAlbGQgb2YgJyVzJ1xuIiwKKyAgICAgICAgICAgICAgcG9zaXRpb24sIFNUUkVBTV9OYW1lKHN0cmVhbSkgKSk7CisgICAgICAgICAgICAgCisgICAgcmV0dXJuIEZUX0Vycl9PazsKKyAgfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPEZ1bmN0aW9uPiBBbnNpRmlsZV9Ta2lwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA8RGVzY3JpcHRpb24+IFNraXAgYSBnaXZlbiBudW1iZXIgb2YgYnl0ZXMgaW4gYW4gQU5TSSBzdHJlYW0uICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICBVc2VmdWwgdG8gc2tpcCBwYWQgYnl0ZXMsIGZvciBleGFtcGxlLiAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBzdHJlYW0gICA6OiB0aGUgdGFyZ2V0IHN0cmVhbSBvYmplY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgY291bnQgICAgOjogbnVtYmVyIG9mIGJ5dGVzIHRvIHNraXAgaW4gdGhlIHN0cmVhbSAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgRXJyb3IgY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgVGhpcyBmdW5jdGlvbiBzaW1wbHkgY2FsbHMgZnNlZWsgb24gdGhlIHN0cmVhbS4gICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBUaGUgInNraXAiIG1ldGhvZCBpcyBuZXZlciBjYWxsZWQgYnkgdGhlIHN0cmVhbSBtYW5hZ2VyIGluIHRoZSBjYXNlICAgKi8KKy8qICAgb2YgYSBtZW1vcnktYmFzZWQgcmVzb3VyY2UgKGkuZS4gd2hlbiAnc3RyZWFtLT5iYXNlJyBpc24ndCBOVUxMKS4gICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICBzdGF0aWMKKyAgRlRfRXJyb3IgIEFuc2lGaWxlX1NraXAoIEZUX1N0cmVhbSAgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICBjb3VudCApCisgIHsKKyAgICBpZiAoIGZzZWVrKCBTVFJFQU1fRmlsZShzdHJlYW0pLCBjb3VudCwgU0VFS19DVVIgKSApCisgICAgeworICAgICAgUEVSUk9SKCggIkFuc2lGaWxlX1NraXAgOiBGQUlMRUQgISEgJWxkIGJ5dGVzIGluICclcydcbiIsCisgICAgICAgICAgICAgICBjb3VudCwgU1RSRUFNX05hbWUoc3RyZWFtKSApKTsKKyAgICAgICAgICAgICAKKyAgICAgIHJldHVybiBGVF9FcnJfSW52YWxpZF9TdHJlYW1fU2VlazsKKyAgICB9CisgICAgICAKKyAgICBQVFJBQ0UyKCggIkFuc2lGaWxlX1NraXAgOiAlbGQgYnl0ZXMgaW4gJyVzJ1xuIixjb3VudCwgCisgICAgICAgICAgICAgIFNUUkVBTV9OYW1lKHN0cmVhbSkgKSk7CisgICAgICAgICAgICAgCisgICAgcmV0dXJuIEZUX0Vycl9PazsKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgIAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIDxGdW5jdGlvbj4gQW5zaUZpbGVfUG9zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPERlc2NyaXB0aW9uPiBSZXR1cm5zIHRoZSBjdXJyZW50IG9mZnNldCB3aXRoaW4gYW4gQU5TSSBzdHJlYW0ncyAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgcmVzb3VyY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgc3RyZWFtICAgOjogdGhlIHRhcmdldCBzdHJlYW0gb2JqZWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgcG9zaXRpb24gOjogY3VycmVudCBvZmZzZXQuIC0xIGluIGNhc2Ugb2YgZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgRXJyb3IgY29kZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgVGhpcyBmdW5jdGlvbiBzaW1wbHkgY2FsbHMgZnRlbGwgb24gdGhlIHN0cmVhbS4gICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBUaGUgICJwb3MiIG1ldGhvZCBpcyBuZXZlciBjYWxsZWQgYnkgdGhlIHN0cmVhbSBtYW5hZ2VyIGluIHRoZSBjYXNlICAgKi8KKy8qICAgb2YgYSBtZW1vcnktYmFzZWQgcmVzb3VyY2UgKGkuZS4gd2hlbiAnc3RyZWFtLT5iYXNlJyBpc24ndCBOVUxMKS4gICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICBzdGF0aWMKKyAgRlRfRXJyb3IgIEFuc2lGaWxlX1BvcyggRlRfU3RyZWFtICBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcqICAgcG9zaXRpb24gKQorICB7CisgICAgKnBvc2l0aW9uID0gZnRlbGwoIFNUUkVBTV9GaWxlKHN0cmVhbSkgKTsKKyAgICBpZiAoICpwb3NpdGlvbiA9PSAtMSApCisgICAgeworICAgICAgUFRSQUNFMigoICJBbnNpRmlsZV9Qb3MgOiBGQUlMRUQgISEgaW4gJyVzJ1xuIiwgU1RSRUFNX05hbWUoc3RyZWFtKSApKTsKKyAgICAgIHJldHVybiBGVF9FcnJfSW52YWxpZF9TdHJlYW1fU2VlazsKKyAgICB9CisgICAgCisgICAgUFRSQUNFMigoICJBbnNpRmlsZV9Qb3MgOiBmb3IgJyVzJ1xuIiwgU1RSRUFNX05hbWUoc3RyZWFtKSApKTsKKyAgICByZXR1cm4gRlRfRXJyX09rOworICB9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPEZ1bmN0aW9uPiBBbnNpRmlsZV9SZWFkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA8RGVzY3JpcHRpb24+IFJlYWQgYSBnaXZlbiBudW1iZXIgb2YgYnl0ZXMgZnJvbSBhbiBBTlNJIHN0cmVhbSBpbnRvICAgICAqLworLyogICAgICAgICAgICAgICBtZW1vcnkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBzdHJlYW0gICA6OiB0aGUgdGFyZ2V0IHN0cmVhbSBvYmplY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgYnVmZmVyICAgOjogdGhlIHRhcmdldCByZWFkIGJ1ZmZlciB3aGVyZSBkYXRhIGlzIGNvcGllZCAgICAgICAgICAgICAgICovCisvKiAgIHNpemUgICAgIDo6IG51bWJlciBvZiBieXRlcyB0byByZWFkIGZyb20gdGhlIHN0cmVhbSAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIHJlYWRfYnl0ZXMgOjogdGhlIG51bWJlciBvZiBieXRlcyBlZmZlY3RpdmVseSByZWFkIGZyb20gdGhlIHN0cmVhbSAgICAqLworLyogICAgICAgICAgICAgICAgIHVzZWQgaW4gY2FzZSBvZiBlcnJvciAoaS5lLiBGVF9FcnJfSW52YWxpZF9TdHJlYW1fUmVhZCkgKi8KKy8qICAgICAgICAgICAgICAgICBieSBzb21lIHBhcnRzIG9mIHRoZSBsaWJyYXJ5Li4gICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBFcnJvciBjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBUaGlzIGZ1bmN0aW9uIHNpbXBseSBjYWxscyBmcmVhZCBvbiB0aGUgc3RyZWFtLiAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIEl0IE1VU1QgcmV0dXJuIHRoZSBlcnJvciBGVF9FcnJfSW52YWxpZF9TdHJlYW1fUmVhZCBpbiBjYXNlIG9mICAgICAgICAqLworLyogICBhbiBvdmVyLXJlYWQgKGkuZS4gcmVhZGluZyBtb3JlIGJ5dGVzIGZyb20gdGhlIHN0cmVhbSB0aGF0IHdoYXQgICAgICAgKi8KKy8qICAgaXMgbGVmdCBpbnQpLCBhcyB0aGUgc3RyZWFtIGNvbXBvbmVudCBjaGVja3MgZm9yIHRoaXMgc3BlY2lmaWMgICAgICAgICovCisvKiAgIHZhbHVlLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIFRoZSAicmVhZCIgbWV0aG9kIGlzIG5ldmVyIGNhbGxlZCBieSB0aGUgc3RyZWFtIG1hbmFnZXIgaW4gdGhlIGNhc2UgICAqLworLyogICBvZiBhIG1lbW9yeS1iYXNlZCByZXNvdXJjZSAoaS5lLiB3aGVuICdzdHJlYW0tPmJhc2UnIGlzbid0IE5VTEwpLiAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIHN0YXRpYworICBGVF9FcnJvciAgQW5zaUZpbGVfUmVhZCggRlRfU3RyZWFtICBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9DaGFyKiAgIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcqICAgcmVhZF9ieXRlcyApCisgIHsKKyAgICAqcmVhZF9ieXRlcyA9IGZyZWFkKCBidWZmZXIsIDEsIHNpemUsIFNUUkVBTV9GaWxlKHN0cmVhbSkgKTsKKyAgICBpZiAoICpyZWFkX2J5dGVzICE9IHNpemUgKQorICAgIHsKKyAgICAgIC8qIE5vdGUgOiB3ZSBjYW4gaGF2ZSBhbiBvdmVyLXJlYWQgaGVyZSB3aGVuIGNhbGxlZCBieSB0aGUgKi8KKyAgICAgIC8qICAgICAgICBmdW5jdGlvbiBGVF9BY2Nlc3NfQ29tcHJlc3NlZF9GcmFtZS4gVGhpcyBtZWFucyAgKi8KKyAgICAgIC8qICAgICAgICB0aGF0IHRoZSBmb2xsb3dpbmcgbWVzc2FnZSBzaG91bGQgYmUgYSB0cmFjZSwgICAgKi8KKyAgICAgIC8qICAgICAgICByYXRoZXIgdGhhbiBhbiBlcnJvciBmb3IgZGlzay1iYXNlZCByZXNvdXJjZXMuLiAgKi8KKyAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgIC8qICAgICAgICB0aGUgZnVuY3Rpb24gbXVzdCBzZXQgdGhlIHZhbHVlIG9mICdyZWFkX2J5dGVzJyAgKi8KKyAgICAgIC8qICAgICAgICBldmVuIGlmIGl0IHJldHVybnMgYW4gZXJyb3IgY29kZS4uICAgICAgICAgICAgICAgKi8KKyAgICAgIFBUUkFDRTIoKCAiQW5zaUZpbGVfUmVhZCA6IEZBSUxFRCAhISByZWFkICVsZCBieXRlcyBmcm9tICclcydcbiIsCisgICAgICAgICAgICAgICBzaXplLCBTVFJFQU1fTmFtZShzdHJlYW0pICkpOworCisgICAgICByZXR1cm4gRlRfRXJyX0ludmFsaWRfU3RyZWFtX1JlYWQ7CisgICAgfQorCisgICAgUFRSQUNFMigoICJBbnNpRmlsZV9SZWFkIDogcmVhZCAlbGQgYnl0ZXMgdG8gYnVmZmVyIDB4JTA4bHggZnJvbSAnJXMnXG4iLAorICAgICAgICAgICAgICBzaXplLCAobG9uZylidWZmZXIsIFNUUkVBTV9OYW1lKHN0cmVhbSkgKSk7CisgICAgcmV0dXJuIEZUX0Vycl9PazsKKyAgfQorCisvKiBUaGUgZm9sbG93aW5nIHRhYmxlIGlzIHRoZSAidmlydHVhbCBtZXRob2QgdGFibGUiIGZvciB0aGUgJ0FOU0kgICovCisvKiByZXNvdXJjZSBjbGFzcycsIHdoaWNoIG1ldGhvZHMgYXJlIGRlZmluZWQgYWJvdmUuIEl0cyBhZGRyZXNzIGlzICovCisvKiBzZXQgaW4gdGhlICdpbnRlcmZhY2UnIGZpZWxkIG9mIGFsbCByZXNvdXJjZSBvYmplY3RzIGNyZWF0ZWQgYnkgICovCisvKiB0aGUgZnVuY3Rpb24gRlRfQ3JlYXRlX0Fuc2lGaWxlIChzZWUgYmVsb3cpICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgc3RhdGljCisgIEZUUmVzX0ludGVyZmFjZVJlYyAgRlRfQW5zaUZpbGVfSW50ZXJmYWNlID0KKyAgeworICAgIChGVFJlc19PcGVuX0Z1bmMpICAgICAgICBBbnNpRmlsZV9PcGVuLAorICAgIChGVFJlc19DbG9zZV9GdW5jKSAgICAgICBBbnNpRmlsZV9DbG9zZSwKKyAgICAoRlRSZXNfU2Vla19GdW5jKSAgICAgICAgQW5zaUZpbGVfU2VlaywKKyAgICAoRlRSZXNfU2tpcF9GdW5jKSAgICAgICAgQW5zaUZpbGVfU2tpcCwKKyAgICAoRlRSZXNfUG9zX0Z1bmMpICAgICAgICAgQW5zaUZpbGVfUG9zLAorICAgIChGVFJlc19SZWFkX0Z1bmMpICAgICAgICBBbnNpRmlsZV9SZWFkLAorICB9OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPEZ1bmN0aW9uPiBGVF9DcmVhdGVfUmVzb3VyY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA8RGVzY3JpcHRpb24+IENyZWF0ZXMgYSBuZXcgcmVzb3VyY2Ugb2JqZWN0LCBvZiBjbGFzcyAiQW5zaUZpbGUiLiAgICAgICAqLworLyogICAgICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGlzIG5ldmVyIGNhbGxlZCBkaXJlY3RseSBieSB0aGUgZm9udCAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgZHJpdmVycy4gT25seSBieSB0aGUgaGlnaGVyLWxldmVsIHBhcnQgb2YgRnJlZVR5cGUgICAgICAgICovCisvKiAgICAgICAgICAgICAgIChjYWxsZWQgdGhlIEhMaWIpLCBvciBjbGllbnQgYXBwbGljYXRpb25zICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIHBhdGhuYW1lIDo6IHRoZSBmaWxlJ3MgcGF0aG5hbWUsIGluIEFTQ0lJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIEhhbmRsZS9wb2ludGVyIHRvIHRoZSBuZXcgcmVzb3VyY2Ugb2JqZWN0LiBOVUxMIGluIGNhc2Ugb2YgZXJyb3IgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIFRoaXMgZnVuY3Rpb25zIGRvZXMgbm90IG9wZW4gYSBzdHJlYW0uIEl0IHNpbXBseSBjb3BpZXMgdGhlICAgICAgICAgICAqLworLyogICBwYXRobmFtZSB3aXRoaW4gYSBmcmVzaCBuZXcgcmVzb3VyY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIEVYUE9SVF9GVU5DCisgIEZUX0Vycm9yICAgICBGVF9DcmVhdGVfUmVzb3VyY2UoIEZUX0xpYnJhcnkgICAgbGlicmFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogICBwYXRobmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfUmVzb3VyY2UqICBhcmVzb3VyY2UgKQorICB7CisgICAgRlRfSW50ICAgICAgIGxlbjsKKyAgICBGVF9BbnNpRmlsZSAgcmVzb3VyY2U7CisgICAgRlRfRXJyb3IgICAgIGVycm9yOworICAgIEZUX1N5c3RlbSAgICBzeXN0ZW0gPSBsaWJyYXJ5LT5zeXN0ZW07CisgICAgCisgICAgaWYgKCAhcGF0aG5hbWUgKQorICAgICAgZ290byBGYWlsX051bGw7CisgICAgICAKKyAgICBsZW4gPSBzdHJsZW4ocGF0aG5hbWUpOworICAgIGlmIChsZW4gPT0gMCkKKyAgICAgIGdvdG8gRmFpbF9OdWxsOworCisgICAgcmVzb3VyY2UgPSBOVUxMOworICAgIAorICAgIGlmICggQUxMT0MoIHJlc291cmNlLCBzaXplb2YoKnJlc291cmNlKSApIHx8CisgICAgICAgICBBTExPQyggcmVzb3VyY2UtPnBhdGhuYW1lLCBsZW4rMSAgICkgKQorICAgICAgZ290byBGYWlsX01lbW9yeTsKKworICAgIHJlc291cmNlLT5yb290LmxpYnJhcnkgICA9IGxpYnJhcnk7CisgICAgcmVzb3VyY2UtPnJvb3QuaW50ZXJmYWNlID0gJkZUX0Fuc2lGaWxlX0ludGVyZmFjZTsKKyAgICByZXNvdXJjZS0+cm9vdC5mbGFncyAgICAgPSBGVF9SRVNPVVJDRV9UWVBFX0RJU0tfQkFTRUQ7CisgICAgcmVzb3VyY2UtPmZpbGVfc2l6ZSAgICAgID0gLTE7CisgICAgc3RyY3B5KCByZXNvdXJjZS0+cGF0aG5hbWUsIHBhdGhuYW1lICk7CisKKyAgICBQVFJBQ0UxKCggIkNyZWF0ZV9BbnNpRmlsZSA6IEFuc2kgcmVzb3VyY2UgY3JlYXRlZCBmb3IgJyVzJ1xuIiwKKyAgICAgICAgICAgICAgcGF0aG5hbWUgKSk7CisgICAgCisgICAgKmFyZXNvdXJjZSA9IChGVF9SZXNvdXJjZSlyZXNvdXJjZTsKKyAgICByZXR1cm4gRlRfRXJyX09rOworCisgIEZhaWxfTnVsbDogICAgCisgICAgUEVSUk9SKCggIkNyZWF0ZV9BbnNpRmlsZSA6IG51bGwgcGF0aG5hbWUgISFcbiIgKSk7CisgICAgcmV0dXJuIEZUX0Vycl9JbnZhbGlkX0FyZ3VtZW50OworICAgIAorICBGYWlsX01lbW9yeToKKyAgICBpZiAocmVzb3VyY2UpCisgICAgICBGUkVFKCByZXNvdXJjZS0+cGF0aG5hbWUgKTsKKyAgICBGUkVFKCByZXNvdXJjZSApOworICAgIFBFUlJPUigoICJDcmVhdGVfQW5zaUZpbGUgOiBub3QgZW5vdWdoIG1lbW9yeSB0byBjcmVhdGUgcmVzb3VyY2UgIVxuIiApKTsKKyAgICByZXR1cm4gZXJyb3I7CisgIH0KKworICAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPEZ1bmN0aW9uPiBGVF9EZXN0cm95X1Jlc291cmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA8RGVzY3JpcHRpb24+IERlc3Ryb3lzIGFuIEFOU0kgcmVzb3VyY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGlzIG5ldmVyIGNhbGxlZCBkaXJlY3RseSBieSB0aGUgZm9udCAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgZHJpdmVycy4gT25seSBieSB0aGUgaGlnaGVyLWxldmVsIHBhcnQgb2YgRnJlZVR5cGUgICAgICAgICovCisvKiAgICAgICAgICAgICAgIChjYWxsZWQgdGhlIEhMaWIpLCBvciBjbGllbnQgYXBwbGljYXRpb25zICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIHJlc291cmNlIDo6IHRoZSBBbnNpIHJlc291cmNlIG9iamVjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIFRoaXMgZnVuY3Rpb25zIGRvZXMgbm90IGNoZWNrIHRoYXQgcnVucyBvciBzdHJlYW1zIGFyZSBvcGVuZWQgZm9yICAgICAqLworLyogICB0aGUgcmVzb3VyY2UgKGZvciBub3csIHdlIGFzc3VtZSBkZXZlbG9wZXIgaW50ZWxsaWdlbmNlLiBXZSdsbCBtb3N0ICAgKi8KKy8qICAgcHJvYmFibHkgbG93ZXIgb3VyIHN0YW5kYXJkIGxhdGVyIHRvIGVhc2UgZGVidWdnaW5nIDstKSAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKKyAgRVhQT1JUX0ZVTkMKKyAgRlRfRXJyb3IgIEZUX0Rlc3Ryb3lfUmVzb3VyY2UoIEZUX1Jlc291cmNlICByZXNvdXJjZSApCisgIHsKKyAgICBGVF9TeXN0ZW0gICAgc3lzdGVtID0gcmVzb3VyY2UtPmxpYnJhcnktPnN5c3RlbTsKKyAgICBGVF9BbnNpRmlsZSAgYW5zaSAgID0gKEZUX0Fuc2lGaWxlKXJlc291cmNlOworICAgIAorICAgIGlmICggIWFuc2kgfHwgYW5zaS0+cm9vdC5pbnRlcmZhY2UgIT0gJkZUX0Fuc2lGaWxlX0ludGVyZmFjZSApCisgICAgeworICAgICAgUEVSUk9SKCggCisgICAgICAgICJEZXN0cm95X0Fuc2lGaWxlIDogVHJ5aW5nIHRvIGRlc3Ryb3kgYW4gaW52YWxpZCByZXNvdXJjZSAhIVxuIiApKTsKKyAgICAgIHJldHVybiBGVF9FcnJfSW52YWxpZF9SZXNvdXJjZV9IYW5kbGU7CisgICAgfQorICAgIAorICAgIFBUUkFDRTEoKCAiRGVzdHJveV9BbnNpRmlsZSA6IGRlc3Ryb3lpbmcgcmVzb3VyY2UgZm9yICclcydcbiIsCisgICAgICAgICAgICAgIGFuc2ktPnBhdGhuYW1lICkpOworCisgICAgRlJFRSggYW5zaS0+cGF0aG5hbWUgKTsKKyAgICBGUkVFKCBhbnNpICk7CisKKyAgICByZXR1cm4gRlRfRXJyX09rOworICB9CisKKyAgCisgIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgTUVNT1JZIE1BTkFHRU1FTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBUaGlzIHBhcnQgY29waWVzIHRoZSBvbGQgRnJlZVR5cGUgMS4wIGFuZCAxLjEgbWVtb3J5IG1hbmFnZW1lbnQgICAgICAqLworLyogICBzY2hlbWUgdGhhdCB3YXMgZGVmaW5lZCBpbiB0aGUgZmlsZSAidHRtZW1vcnkuaCIuIE9uZSBjYW4gc2VlIHRoYXQgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAtIGEgc2V0IG9mIG1hY3JvcyBpcyBkZWZpbmVkIGZvciB0aGUgbWVtb3J5IG9wZXJhdGlvbnMgdXNlZCAgICAgICAgICAqLworLyogICAgIGJ5IHRoZSBlbmdpbmUgKCBNRU1fQ29weSwgTUVNX01vdmUsIE1FTV9TZXQgKS4gVGhpcyBjb21lcyBmcm9tICAgICAqLworLyogICAgIHRoZSBmYWN0IHRoYXQgbWFueSBjb21waWxlcnMgYXJlIGFibGUgdG8gaW5saW5lIHRoZXNlIG9wcyBkaXJlY3RseSAqLworLyogICAgIHdpdGhpbiB0aGUgY29tcGlsZWQgY29kZSwgcmF0aGVyIHRoYW4gZ2VuZXJhdGluZyBhIGNhbGwgdG8gdGhlICAgICAqLworLyogICAgIEMgbGlicmFyeS4gSG93ZXZlciwgdGhpcyBvYmxpZ2VzIHVzIHRvIGluY2x1ZGUgdGhlIDxzdHJpbmcuaD4gICAgICAqLworLyogICAgIGhlYWRlciBmaWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgIElmIHlvdSBwcm92aWRlIHlvdXIgb3duIG1lbW9yeSBvcGVyYXRpb25zIHJvdXRpbmUsIHlvdSBjYW4gZ2V0ICAgICAqLworLyogICAgIHJpZCBvZiB0aGUgI2luY2x1ZGUgPHN0cmluZy5oPiBiZWxvdy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAtIHRoZSBGVF9BbGxvYyBmdW5jdGlvbiBoYXMgc2V2ZXJhbCBlc3NlbnRpYWwgcHJvcGVydGllcyB0aGF0ICAgICAgICAqLworLyogICAgIE1VU1QgYmUgcmV0YWluZWQgYnkgZWFjaCBwb3J0IDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAtIGl0IHJldHVybnMgYW4gZXJyb3IgY29kZSwgTk9UIHRoZSBhbGxvY2F0ZWQgYmxvY2sncyBiYXNlICAgICAgICAqLworLyogICAgICAgIGFkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAtIGl0IHRha2VzIHRoZSBhZGRyZXNzIG9mIGEgdGFyZ2V0IHBvaW50ZXIsIHdoZXJlIHRoZSBibG9jaydzICAgICAqLworLyogICAgICAgIGJhc2UgYWRkcmVzcyB3aWxsIGJlIHNldC4gaWYgdGhlIHNpemUgaXMgemVybywgaXRzIHZhbHVlICAgICAgICAqLworLyogICAgICAgIHdpbGwgYmUgTlVMTCBhbmQgdGhlIGZ1bmN0aW9uIHJldHVybnMgc3VjY2Vzc2Z1bGx5ICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAtIGluIGNhc2Ugb2YgZXJyb3IsIHRoZSBwb2ludGVyJ3MgdmFsdWUgaXMgc2V0IHRvIE5VTEwgYW5kICAgICAgICAqLworLyogICAgICAgIGFuIGVycm9yIGNvZGUgaXMgcmV0dXJuZWQuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAtIHRoZSBuZXcgYWxsb2NhdGVkIGJsb2NrIE1VU1QgYmUgemVyby1maWxsZWQuIFRoaXMgaXMgYSBzdHJvbmcgICAqLworLyogICAgICAgIGNvbnZldGlvbiB0aGUgcmVzdCBvZiB0aGUgZW5naW5lIHJlbGllcyBvbiAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAtIHRoZSBGVF9GcmVlIGZ1bmN0aW9uIGhhcyBhbHNvIGl0cyBlc3NlbnRpYWxzIDogICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAtIGl0IHRha2VzIHRoZSBhZGRyZXNzIG9mIGEgcG9pbnRlciB3aGljaCB2YWx1ZSBpcyB0aGUgYmxvY2sncyAgICAqLworLyogICAgICAgIGJhc2UgYWRkcmVzcy4gVGhpcyBpcyBVTkxJS0UgYSBzdGFuZGFyZCAiZnJlZSIgd2hpY2ggdGFrZXMgdGhlICAqLworLyogICAgICAgIHRoZSBibG9jaydzIGJhc2UgZGlyZWN0bHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAtIGl0IGFjY2VwdHMgc3VjY2VzZnVsbHkgdGhlIGFkZHJlc3Mgb2YgYSBwb2ludGVyIHdoaWNoIHZhbHVlICAgICAqLworLyogICAgICAgIGlzIE5VTEwsIGluIHdoaWNoIGNhc2UgaXQgc2ltcGx5IHJldHVybnMuICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAtIHRoZSBwb2ludGVyIGlzIGFsd2F5cyBzZXQgdG8gTlVMTCBieSB0aGUgZnVuY3Rpb24gICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAtIHRoZSBNRU1fQWxsb2MsIEFMTE9DIGFuZCBBTExPQ19BUlJBWSBtYWNyb3MgYXJlIHVzZWQgYnkgdGhlICAgICAgICAqLworLyogICAgIGxpYnJhcnksIGFuZCBzaG91bGQgTk9UIGJlIG1vZGlmaWVkIGJ5IHBvcnRlcnMgISEgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisvKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gSXQgaXMgYW4gaW1wbGljaXQgKi8KKy8qIHBhcmFtZXRlciBvZiB0aGUgUFRSQUNFIGFuZCBQRVJST1IgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZyAgICAqLworLyogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyN1bmRlZiAgRlRfQ09NUE9ORU5UCisjZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfbWVtb3J5CisKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA8RnVuY3Rpb24+IEZUX0FsbG9jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBbGxvY2F0ZXMgYSBuZXcgYmxvYyBvZiBtZW1vcnkuIFRoZSByZXR1cm5lZCBhcmVhIGlzIGFsd2F5cyAgICAgICAgICovCisvKiAgICB6ZXJvLWZpbGxlZCwgdGhpcyBpcyBhIHN0cm9uZyBjb252ZW50aW9uIGluIG1hbnkgRnJlZVR5cGUgcGFydHMgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBzeXN0ZW0gICAgOjogaGFuZGxlIHRvIGEgZ2l2ZW4gJ3N5c3RlbSBvYmplY3QnIHdoZXJlIGFsbG9jYXRpb24gICAgICovCisvKiAgICAgICAgICAgICAgICAgb2NjdXJzLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBzaXplICAgICAgOjogc2l6ZSBpbiBieXRlcyBvZiB0aGUgYmxvY2sgdG8gYWxsb2NhdGUgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBQICAgICAgICAgOjogcG9pbnRlciB0byB0aGUgZnJlc2ggbmV3IGJsb2NrLiBJdCBzaG91bGQgYmUgc2V0ICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgdG8gTlVMTCBpZiAnc2l6ZScgaXMgMCwgb2YgaW4gY2FzZSBvZiBlcnJvci4uICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgQkFTRV9GVU5DCisgIEZUX0Vycm9yICBGVF9BbGxvYyggRlRfU3lzdGVtICBzeXN0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgbG9uZyAgICAgICBzaXplLCAKKyAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgKlAgKSAKKyAgeworICAKKyAgICBpZiAoIVApCisgICAgeworICAgICAgUEVSUk9SKCggIkZUX0FsbG9jIDogaW52YWxpZCBwb2ludGVyIGFkZHJlc3MgISFcbiIgKSk7CisgICAgICByZXR1cm4gRlRfRXJyX0ludmFsaWRfQXJndW1lbnQ7CisgICAgfQorICAgIAorICAgIGlmICggc2l6ZSA+IDAgKQorICAgIHsKKyAgICAgICpQID0gbWFsbG9jKCBzaXplICk7CisgICAgICBpZiAoICEqUCApCisgICAgICB7CisgICAgICAgIFBFUlJPUigoICJGVF9BbGxvYyA6IG91dCBvZiBtZW1vcnkgKCVsZCBieXRlcyByZXF1ZXN0ZWQpICEhXG4iLAorICAgICAgICAgICAgICAgICBzaXplICkpOworCisgICAgICAgIHJldHVybiBGVF9FcnJfT3V0X09mX01lbW9yeTsKKyAgICAgIH0KKworICAgICAgc3lzdGVtLT50b3RhbF9hbGxvYyArPSBzaXplOworCisgICAgICAvKiBBTFdBWVMgWkVSTy1GSUxMIFRIRSBCTE9DSyAhISEhISAqLyAgIAorICAgICAgTUVNX1NldCggKlAsIDAsIHNpemUgKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgKlAgPSBOVUxMOworCisgICAgUFRSQUNFMigoICJGVF9BbGxvYyA6IHNpemUgPSAlbGQsIHBvaW50ZXIgPSAweCUwOGx4LCBibG9jayA9IDB4JTA4bHhcbiIsCisgICAgICAgICAgICAgIHNpemUsIChsb25nKVAsIChsb25nKSpQICkpOworCisgICAgcmV0dXJuIEZUX0Vycl9PazsKKyAgfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIDxGdW5jdGlvbj4gRlRfUmVhbGxvYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIFJlYWxsb2NhdGVzIGEgYmxvY2sgb2YgbWVtb3J5IHBvaW50ZWQgdG8gYnkgJypQJyB0byAnU2l6ZScgICAgICAgICAgKi8KKy8qICAgIGJ5dGVzIGZyb20gdGhlIGhlYV4sIHBvc3NpYmx5IGNoYW5naW5nICcqUCcuICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIHN5c3RlbSAgICA6OiBoYW5kbGUgdG8gYSBnaXZlbiAnc3lzdGVtIG9iamVjdCcgd2hlcmUgYWxsb2NhdGlvbiAgICAgKi8KKy8qICAgICAgICAgICAgICAgICBvY2N1cnMuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIHNpemUgICAgICA6OiBzaXplIGluIGJ5dGVzIG9mIHRoZSBibG9jayB0byBhbGxvY2F0ZSAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIFAgICAgICAgICA6OiBwb2ludGVyIHRvIHRoZSBmcmVzaCBuZXcgYmxvY2suIEl0IHNob3VsZCBiZSBzZXQgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICB0byBOVUxMIGlmICdzaXplJyBpcyAwLCBvZiBpbiBjYXNlIG9mIGVycm9yLi4gICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICBCQVNFX0ZVTkMKKyAgaW50ICBGVF9SZWFsbG9jKCBGVF9TeXN0ZW0gIHN5c3RlbSwKKyAgICAgICAgICAgICAgICAgICBsb25nICAgICAgIHNpemUsIAorICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAqUCApCisgIHsKKyAgICB2b2lkKiAgUTsKKyAgICAKKyAgICBpZiAoIVApCisgICAgeworICAgICAgUEVSUk9SKCggIkZUX1JlYWxsb2MgOiBpbnZhbGlkIHBvaW50ZXIgYWRkcmVzcyAhIVxuIiApKTsKKyAgICAgIHJldHVybiBGVF9FcnJfSW52YWxpZF9Bcmd1bWVudDsKKyAgICB9CisKKyAgICAvKiBpZiB0aGUgb3JpZ2luYWwgcG9pbnRlciBpcyBOVUxMLCBjYWxsIEZUX0FsbG9jICovICAgIAorICAgIGlmICghKlApCisgICAgICByZXR1cm4gRlRfQWxsb2MoIHN5c3RlbSwgc2l6ZSwgUCApOworCisgICAgLyogaWYgdGhlIG5ldyBibG9jayBpZiB6ZXJvLXNpemVkLCBjbGVhciB0aGUgY3VycmVudCBvbmUgKi8gICAgCisgICAgaWYgKHNpemUgPD0gMCkKKyAgICAgIHJldHVybiBGVF9GcmVlKCBzeXN0ZW0sIFAgKTsKKyAgICAKKyAgICBRID0gKHZvaWQqKXJlYWxsb2MoICpQLCBzaXplICk7CisgICAgaWYgKCFRKQorICAgIHsKKyAgICAgIFBFUlJPUigoICJGVF9SZWFsbG9jIDogcmVhbGxvY2F0aW9uIGZhaWxlZFxuIiApKTsKKyAgICAgIHJldHVybiBGVF9FcnJfT3V0X09mX01lbW9yeTsKKyAgICB9CisKKyAgICAqUCA9IFE7ICAgIAorICAgIHJldHVybiBGVF9FcnJfT2s7CisgIH0KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA8RnVuY3Rpb24+IEZUX0ZyZWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBSZWxlYXNlcyBhIGdpdmVuIGJsb2NrIG9mIG1lbW9yeSBhbGxvY2F0ZWQgdGhyb3VnaCBGVF9BbGxvYyAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBzeXN0ZW0gICAgOjogaGFuZGxlIHRvIGEgZ2l2ZW4gJ3N5c3RlbSBvYmplY3QnIHdoZXJlIGFsbG9jYXRpb24gICAgICovCisvKiAgICAgICAgICAgICAgICAgb2NjdXJlZC4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBQICAgICAgICAgOjogVGhpcyBpcyB0aGUgX2FkZHJlc3NfIG9mIGEgX3BvaW50ZXJfIHdoaWNoIHBvaW50cyB0byAgICovCisvKiAgICAgICAgICAgICAgICAgdGhlIGFsbG9jYXRlZCBibG9jay4gSXQgaXMgYWx3YXlzIHNldCB0byBOVUxMIG9uIGV4aXQgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJZiBQIG9yICpQIGFyZSBOVUxMLCB0aGlzIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gc3VjY2Vzc2Z1bHkuIFRoaXMgICovCisvKiAgICBpcyBhIHN0cm9uZyBjb252ZW50aW9uIHdpdGhpbiBhbGwgb2YgRnJlZVR5cGUgYW5kIGl0cyBkcml2ZXJzLi4gICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgQkFTRV9GVU5DCisgIEZUX0Vycm9yICBGVF9GcmVlKCBGVF9TeXN0ZW0gIHN5c3RlbSwKKyAgICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAqUCApCisgIHsKKyAgICAodm9pZClzeXN0ZW07ICAvKiB1bnVzZWQgcGFyYW1ldGVyLiBHZXRzIHJpZCBvZiB3YXJuaW5ncyAqLworCisgICAgUFRSQUNFMigoICJGVF9GcmVlIDogZnJlZWluZyBwb2ludGVyIDB4JTA4bHggKGJsb2NrIDB4JTA4bHgpXG4iLAorICAgICAgICAgICAgICAobG9uZylQLCAoUCA/IChsb25nKSpQIDogLTEpICkpOworCisgICAgaWYgKCAhUCB8fCAhKlAgKQorICAgICAgcmV0dXJuIEZUX0Vycl9PazsKKworICAgIGZyZWUoICpQICk7CisgICAgKlAgPSBOVUxMOworCisgICAgcmV0dXJuIEZUX0Vycl9PazsKKyAgfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgU1lOQ0hST05JWkFUSU9OIE1BTkFHRU1FTlQgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIFRoaXMgc2VjdGlvbiBkZWFscyB3aXRoIG11dGV4ZXMuIFRoZSBsaWJyYXJ5IGNhbiBiZSBjb21waWxlZCB0byAgICAgICovCisvKiAgIHRocmVlIGRpc3RpbmN0IHRocmVhZC1zdXBwb3J0IGxldmVscyAoIG5hbWVseSBzaW5nbGUtdGhyZWFkZWQsICAgICAgICovCisvKiAgIHRocmVhZC1zYWZlIGFuZCByZS1lbnRyYW50IG1vZGVzICkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIEl0IHByb3RlY3RzIGl0cyB2YXJpYWJsZXMgdGhyb3VnaCB0aGUgTVVURVhfTG9jayBhbmQgTVVURVhfUmVsZWFzZSAgICovCisvKiAgIG1hY3JvcyB3aGljaCBhcmUgdm9pZCBpbiBzaW5nbGUtdGhyZWFkZWQgbW9kZS4gICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIEl0IGRlZmluZXMgYSB0eXBlLWxlc3MgbXV0ZXggcmVmZXJlbmNlIHR5cGUsICJUTXV0ZXgiLCB0aGF0IHlvdSdyZSAgICovCisvKiAgIGZyZWUgdG8gcmVkZWZpbmUgZm9yIHlvdXIgc3lzdGVtJ3MgbmVlZHMuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIGZ0c3lzLmMgY29udGFpbnMgb25seSBkdW1teSBmdW5jdGlvbnMgICovCisvKiAgIHdoaWNoIGFsd2F5cyByZXR1cm4gc3VjY2VzZnVsbHkuIHlvdSBORUVEIHRvIHNwZWNpYWxpemUgdGhlbSBpbiAgICAgICovCisvKiAgIG9yZGVyIHRvIHBvcnQgZnRzeXMuYyBpbiBhbnkgbXVsdGktdGhyZWFkZWQgZW52aXJvbm1lbnQuLi4gICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKy8qIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiBJdCBpcyBhbiBpbXBsaWNpdCAqLworLyogcGFyYW1ldGVyIG9mIHRoZSBQVFJBQ0UgYW5kIFBFUlJPUiBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nICAgICovCisvKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI3VuZGVmICBGVF9DT01QT05FTlQKKyNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV9zeW5jCisKKyNpZmRlZiBGVF9DT05GSUdfVEhSRUFEUworCisKKyAgQkFTRV9GVU5DCisgIEZUX0Vycm9yICBGVF9NdXRleF9DcmVhdGUgKCBGVF9TeXN0ZW0gIHN5c3RlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRNdXRleCogICAgbXV0ZXggKQorICB7CisgICAgKHZvaWQpc3lzdGVtOyAgLyogdW51c2VkIHBhcmFtZXRlci4gR2V0cyByaWQgb2Ygd2FybmluZ3MgKi8KKyAgICAKKyAgICBtdXRleCA9ICh2b2lkKiktMTsKKyAgICBzeXN0ZW0tPm51bV9tdXRleGVzKys7CisgICAgcmV0dXJuIEZUX0Vycl9PazsKKyAgICAvKiBSZXBsYWNlIHRoaXMgbGluZSB3aXRoIHlvdXIgb3duIG11dGV4IGNyZWF0aW9uIGNvZGUgKi8KKyAgfQorCisKKyAgQkFTRV9GVU5DCisgIHZvaWQgIEZUX011dGV4X0RlbGV0ZSAoIEZUX1N5c3RlbSAgc3lzdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUTXV0ZXgqICAgIG11dGV4ICkKKyAgeworICAgICh2b2lkKXN5c3RlbTsgLyogdW51c2VkIHBhcmFtZXRlci4gR2V0cyByaWQgb2Ygd2FybmluZ3MgKi8KKyAgICAKKyAgICBtdXRleCA9ICh2b2lkKikwOworICAgIHN5c3RlbS0+bnVtX211dGV4ZXMtLTsKKyAgICAvKiBSZXBsYWNlIHRoaXMgbGluZSB3aXRoIHlvdXIgb3duIG11dGV4IGRlc3RydWN0aW9uIGNvZGUgKi8KKyAgfQorCisgIEJBU0VfRlVOQworICB2b2lkICBGVF9NdXRleF9Mb2NrICAgKCBGVF9TeXN0ZW0gIHN5c3RlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVE11dGV4KiAgICBtdXRleCApCisgIHsKKyAgICAvKiBOT1RFOiBJdCBpcyBsZWdhbCB0byBjYWxsIHRoaXMgZnVuY3Rpb24gd2l0aCBhIE5VTEwgYXJndW1lbnQgKi8KKyAgICAvKiAgICAgICBpbiB3aGljaCBjYXNlIGFuIGltbWVkaWF0ZSByZXR1cm4gaXMgYXBwcm9wcmlhdGUuICAgICAgKi8KKyAgICAodm9pZClzeXN0ZW07IC8qIHVudXNlZCBwYXJhbWV0ZXIuIEdldHMgcmlkIG9mIHdhcm5pbmdzICovCisgICAgCisgICAgaWYgKCAhbXV0ZXggKQorICAgICAgcmV0dXJuOworCisgICAgOyAvKiBJbnNlcnQgeW91ciBvd24gbXV0ZXggbG9ja2luZyBjb2RlIGhlcmUgKi8KKyAgfQorCisKKyAgdm9pZCAgRlRfTXV0ZXhfUmVsZWFzZSggRlRfU3lzdGVtICBzeXN0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRNdXRleCogIG11dGV4ICkKKyAgeworICAgIC8qIE5PVEU6IEl0IGlzIGxlZ2FsIHRvIGNhbGwgdGhpcyBmdW5jdGlvbiB3aXRoIGEgTlVMTCBhcmd1bWVudCAqLworICAgIC8qICAgICAgIGluIHdoaWNoIGNhc2UgYW4gaW1tZWRpYXRlIHJldHVybiBpcyBhcHByb3ByaWF0ZSAgICAgICAqLworICAgICh2b2lkKXN5c3RlbTsgLyogdW51c2VkIHBhcmFtZXRlci4gR2V0cyByaWQgb2Ygd2FybmluZ3MgKi8KKyAgICAKKyAgICBpZiAoICFtdXRleCApCisgICAgICByZXR1cm47CisgICAgOyAvKiBJbnNlcnQgeW91ciBvd24gbXV0ZXggcmVsZWFzZSBjb2RlIGhlcmUgKi8KKyAgfQorCisjZW5kaWYgLyogRlRfQ09ORklHX1RIUkVBRFMgKi8KKworCisKKworICBFWFBPUlRfRlVOQworICBGVF9FcnJvciAgRlRfTmV3X1N5c3RlbSggRlRfU3lzdGVtKiAgc3lzdGVtICkKKyAgeworICAgICpzeXN0ZW0gPSAoRlRfU3lzdGVtKW1hbGxvYyggc2l6ZW9mKCoqc3lzdGVtKSApOworICAgIGlmICggISpzeXN0ZW0gKQorICAgICAgcmV0dXJuIEZUX0Vycl9PdXRfT2ZfTWVtb3J5OworCisgICAgLyogdGhlIEFOU0kgZnVuY3Rpb24gJ2ZyZWUnIGlzIHVuYWJsZSB0byAgcmV0dXJuIHRoZSBudW1iZXIgICAqLworICAgIC8qIG9mIHJlbGVhc2VkIGJ5dGVzLiBIZW5jZSwgdGhlICdjdXJyZW50X2FsbG9jJyBmaWVsZCBvZiB0aGUgKi8KKyAgICAvKiBzeXN0ZW0gb2JqZWN0IGNhbm5vdCBiZSB1c2VkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgCisgICAgKCpzeXN0ZW0pLT5zeXN0ZW1fZmxhZ3MgPSBGVF9TWVNURU1fRkxBR19UT1RBTF9BTExPQyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TWVNURU1fRkxBR19NVVRFWEVTOworICAgICgqc3lzdGVtKS0+dG90YWxfYWxsb2MgPSAwOworICAgICgqc3lzdGVtKS0+bnVtX211dGV4ZXMgPSAwOworCisgICAgLyogaW5pdGlhbGlzZSBpL28gbWFuYWdlbWVudCAobm90aGluZykgKi8KKyAgICAKKyAgICAvKiBpbml0aWFsaXNlIHN5bmNocm9uaXNhdGlvbiAobm90aGluZykgKi8KKyAgICAKKyAgICAvKiBpbml0aWFsaXNlIHN0cmVhbXMgKi8KKworICAgIHJldHVybiBGVF9FcnJfT2s7CisgIH0KKworCisKKyAgRVhQT1JUX0ZVTkMKKyAgRlRfRXJyb3IgIEZUX0RvbmVfU3lzdGVtKCBGVF9TeXN0ZW0gIHN5c3RlbSApCisgIHsKKyAgICAvKiBmaW5hbGlzZSBzeW5jcmhvbmlzYXRpb24gKG5vdGhpbmcpICovCisgICAgCisgICAgLyogZmluYWxpc2UgaS9vIG1hbmFnZW1lbnQgKG5vdGhpbmcpICAqLworICAgIAorICAgIC8qIGZpbmFsaXNlIG1lbW9yeSBtYW5hZ2VtZW50ICAgICAgICAgKi8KKyAgICBmcmVlKCBzeXN0ZW0gKTsKKworICAgIHJldHVybiBGVF9FcnJfT2s7CisgIH0KKworCisKKwpkaWZmIC0tZ2l0IGEvY29uZmlnL2ZyZWV0eXBlLm1rIGIvY29uZmlnL2ZyZWV0eXBlLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmNzhlMDgKLS0tIC9kZXYvbnVsbAorKysgYi9jb25maWcvZnJlZXR5cGUubWsKQEAgLTAsMCArMSwxOTkgQEAKKyMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIyogIEZyZWVUeXBlIGxpYnJhcnkgc3ViLU1ha2VmaWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisjKiAgQ29weXJpZ2h0IDE5OTYtMTk5OSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgICoKKyMqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisjKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkICAgICAgICAgKgorIyogIG1vZGlmaWVkIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAgICoKKyMqICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICAqCisjKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAgKgorIyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisjKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMqICBETyBOT1QgSU5WT0tFIFRISVMgTUFLRUZJTEUgRElSRUNUTFkuIElUIElTIE1FQU5UIFRPIEJFIElOQ0xVREVEIEJZICAgICAqCisjKiAgT1RIRVIgTUFLRUZJTEVTLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKworIyBUaGUgdGFyZ2V0cyBgb2JqZWN0cycsIGBsaWJyYXJ5JyBhbmQgYG11bHRpcGxlJyBhcmUgZGVmaW5lZAorIyBhdCB0aGUgZW5kIG9mIHRoaXMgTWFrZWZpbGUgd2hlbiBhbGwgcnVsZXMgaGF2ZSBiZWVuIGluY2x1ZGVkLi4KKyMKKy5QSE9OWTogYnVpbGRfZnJlZXR5cGUgb2JqZWN0cyBsaWJyYXJ5CisKKyMgZGVmYXVsdCB0YXJnZXQgLSBidWlsZCBvYmplY3RzIGFuZCBsaWJyYXJ5CisjCitidWlsZF9mcmVldHlwZTogb2JqZWN0cyBsaWJyYXJ5CisKKyMgYG11bHRpJyB0YXJnZXQgLSBidWlsZCBtdWx0aXBsZSBvYmplY3RzIGFuZCBsaWJyYXJ5CisjCittdWx0aTogb2JqZWN0cyBsaWJyYXJ5CisKKworIyBUaGUgRnJlZVR5cGUgc291cmNlcyBkaXJlY3RvcnkuCisjCitTUkMgOj0gJChUT1ApJChTRVApc3JjCisKKworIyBUaGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBiYXNlIGxheWVyIGNvbXBvbmVudHMgYXJlIHBsYWNlZC4KKyMgQnkgZGVmYXVsdCwgdGhpcyBpcyAnZnJlZXR5cGUvc3JjL2Jhc2UnCisjCitCQVNFX0RJUiA6PSAkKFNSQykkKFNFUCliYXNlCisKKworIyBBIEZldyBzaG9ydC1jdXRzIGluIG9yZGVyIHRvIGF2b2lkIHR5cGluZyAkKFNFUCkgYWxsIHRoZSB0aW1lIGZvcgorIyB0aGUgZGlyZWN0b3J5IHNlcGFyYXRvcgorIworIyBGb3IgZXhhbXBsZTogIFNSQ18gZXF1YWxzIHRvICcuL3NyYy8nIHdoZXJlICcuJyBpcyAkKFRPUCkKKyMKKyMKK1NSQ18gICAgOj0gJChTUkMpJChTRVApCitCQVNFXyAgIDo9ICQoQkFTRV9ESVIpJChTRVApCitPQkpfICAgIDo9ICQoT0JKX0RJUikkKFNFUCkKK0xJQl8gICAgOj0gJChMSUJfRElSKSQoU0VQKQorUFVCTElDXyA6PSAkKFRPUCkkKFNFUClpbmNsdWRlJChTRVApCisKKyMgVGhlIG5hbWUgb2YgdGhlIGZpbmFsIGxpYnJhcnkgZmlsZS4KKyMKK0ZUX0xJQlJBUlkgOj0gJChMSUJfRElSKSQoU0VQKSQoTElCUkFSWSkuJEEKKworCisjIGluY2x1ZGUgcGF0aHMKKyMKKyMgSU1QT1JUQU5UIE5PVEU6IFRoZSBhcmNoaXRlY3R1cmUtZGVwZW5kZW50IGRpcmVjdG9yeSBtdXN0IEFMV0FZUyBiZSBwbGFjZWQKKyMgICAgICAgICAgICAgICAgIGluIGZyb250IG9mIHRoZSBpbmNsdWRlIGxpc3QuICBQb3J0ZXJzIGFyZSB0aGVuIGFibGUgdG8gcHV0CisjICAgICAgICAgICAgICAgICB0aGVpciBvd24gdmVyc2lvbiBvZiBzb21lIG9mIHRoZSBGcmVlVHlwZSBjb21wb25lbnRzIGluCisjICAgICAgICAgICAgICAgICB0aGUgJ2ZyZWV0eXBlL2FyY2gvPHN5c3RlbT4nIGRpcmVjdG9yeSwgYXMgdGhlc2UgZmlsZXMKKyMgICAgICAgICAgICAgICAgIHdpbGwgb3ZlcnJpZGUgdGhlIGRlZmF1bHQgc291cmNlcy4KKyMKK0lOQ0xVREVTIDo9ICQoQlVJTEQpICQoVE9QKSQoU0VQKWluY2x1ZGUgJChJTkNMVURFUykKKworSU5DTFVERV9GTEFHUyA9ICQoSU5DTFVERVM6JT0kSSUpCisKKworIyBDIGZsYWdzIHVzZWQgZm9yIHRoZSBjb21waWxhdGlvbiBvZiBhbiBvYmplY3QgZmlsZS4gIFRoaXMgbXVzdCBpbmNsdWRlIGF0CisjIGxlYXN0IHRoZSBwYXRocyBmb3IgdGhlICdiYXNlJyBhbmQgJ2NvbmZpZy88c3lzdGVtPicgZGlyZWN0b3JpZXMsCisjIGRlYnVnL29wdGltaXphdGlvbi93YXJuaW5nIGZsYWdzICsgYW5zaSBjb21wbGlhbmNlIGlmIG5lZWRlZC4KKyMKK0ZUX0NGTEFHUyAgPSAkKENGTEFHUykgJChJTkNMVURFX0ZMQUdTKQorRlRfQ0MgICAgICA9ICQoQ0MpICQoRlRfQ0ZMQUdTKQorRlRfQ09NUElMRSA9ICQoRlRfQ0MpCisKKworIworIyBGcmVlIHRoZSBsaXN0cyBvZiBkcml2ZXIgb2JqZWN0cworIworQ09NUE9ORU5UU19MSVNUIDo9CitEUklWRVJTX0xJU1QgICAgOj0KK09CSkVDVFNfTElTVCAgICA6PQorCisjIGZyZWUgdGhlIGxpc3Qgb2YgJ2Z0aW5pdCcgdmFyaWFibGVzCisjCitGVElOSVRfRFJJVkVSX1BBVEhTICA6PQorRlRJTklUX0RSSVZFUl9IICAgICAgOj0KK0ZUSU5JVF9EUklWRVJfTUFDUk9TIDo9CisKKworIyBTeXN0ZW0tc3BlY2lmaWMgY29tcG9uZW50IC0gdGhpcyBtdXN0IGJlIGRlZmluZWQgaW4gdGhpcyBNYWtlZmlsZQorIyBmb3IgZWFzeSB1cGRhdGVzCisjCisjIEJBU0VfSCBpcyBkZWZpbmVkIGluIHNyYy9iYXNlL3J1bGVzLm1rIGFuZCBjb250YWlucyB0aGUgbGlzdCBvZiBhbGwKKyMgYmFzZSBsYXllciBoZWFkZXIgZmlsZXMuCisjCitGVFNZU19TUkMgPSAkKEJVSUxEKSQoU0VQKWZ0c3lzdGVtLmMKK0ZUU1lTX09CSiA9ICQoT0JKX0RJUikkKFNFUClmdHN5c3RlbS4kTworCitPQkpFQ1RTX0xJU1QgKz0gJChGVFNZU19PQkopCisKKyQoRlRTWVNfT0JKKTogJChGVFNZU19TUkMpICQoQkFTRV9IKQorCSQoRlRfQ09NUElMRSkgJFQkQCAkPAorCisKKyMgZnRkZWJ1ZyBjb21wb25lbnQKKyMKKyMKKyMKKworRlRERUJVR19TUkMgPSAkKEJBU0VfKWZ0ZGVidWcuYworRlRERUJVR19PQkogPSAkKE9CSl8pZnRkZWJ1Zy4kTworCitPQkpFQ1RTX0xJU1QgKz0gJChGVERFQlVHX09CSikKKworJChGVERFQlVHX09CSik6ICQoRlRERUJVR19TUkMpICQoQkFTRV9IKQorCSQoRlRfQ09NUElMRSkgJFQkQCAkPAorCisKKworIyBEZWZpbmUgUFVCTElDX0ggYXMgdGhlIGxpc3Qgb2YgYWxsIHB1YmxpYyBoZWFkZXIgZmlsZXMgbG9jYXRlZCBpbgorIyBgJChUT1ApL2luY2x1ZGUnCisjCitQVUJMSUNfSCA6PSAkKHdpbGRjYXJkICQoUFVCTElDXykqLmgpCisKKworIyBJbmNsdWRlIGFsbCBydWxlIGZpbGVzIGZyb20gRnJlZVR5cGUgY29tcG9uZW50cworIworIworaW5jbHVkZSAkKHdpbGRjYXJkICQoU1JDKS8qL3J1bGVzLm1rKQorCisjIEZUSW5pdCBmaWxlOgorIworIyAgIFRoZSBDIHNvdXJjZSAnZnRpbml0LmMnIGNvbnRhaW5zIHRoZSBGcmVlVHlwZSBpbml0aWFsaXNhdGlvbiByb3V0aW5lcy4KKyMgICBJdCBpcyBhYmxlIHRvIGF1dG9tYXRpY2FsbHkgcmVnaXN0ZXIgb25lIG9yIG1vcmUgZHJpdmVycyB3aGVuIHRoZSBBUEkKKyMgICBmdW5jdGlvbiBGVF9Jbml0X0ZyZWVUeXBlKCkgaXMgY2FsbGVkLgorIworIyAgIFRoZSBzZXQgb2YgaW5pdGlhbCBkcml2ZXJzIGlzIGRldGVybWluZWQgYnkgdGhlIGRyaXZlciBNYWtlZmlsZXMKKyMgICBpbmNsdWRlcyBhYm92ZS4gIEVhY2ggZHJpdmVyIE1ha2VmaWxlIHVwZGF0ZXMgdGhlIEZUSU5JVF94eHh4IGxpc3RzCisjICAgd2hpY2ggY29udGFpbiBhZGRpdGlvbmFsIGluY2x1ZGUgcGF0aHMgYW5kIG1hY3JvcyB1c2VkIHRvIGNvbXBpbGUgdGhlCisjICAgc2luZ2xlICdmdGFwaS5jJyBzb3VyY2UuCisjCitGVElOSVRfU1JDIDo9ICQoQkFTRV9ESVIpJChTRVApZnRpbml0LmMKK0ZUSU5JVF9PQkogOj0gJChPQkpfKWZ0aW5pdC4kTworCiskKEZUSU5JVF9PQkopOiAkKEZUSU5JVF9TUkMpICQoQkFTRV9IKSAkKEZUSU5JVF9EUklWRVJfSCkKKwkkKEZUX0NPTVBJTEUpICQoRlRJTklUX0RSSVZFUl9QQVRIUzolPSRJJSkgXAorICAgICAgICAgICAgICAgICAgICAgICQoRlRJTklUX0RSSVZFUl9NQUNST1M6JT0kRCUpICRUJEAgJDwKKworCisjIEFsbCBGcmVlVHlwZSBsaWJyYXJ5IG9iamVjdHMKKyMKKyMgICBCeSBkZWZhdWx0LCB3ZSBpbmNsdWRlIHRoZSBiYXNlIGxheWVyIGV4dGVuc2lvbnMuICBUaGVzZSBjb3VsZCBiZQorIyAgIG9tbWl0dGVkIG9uIGJ1aWxkcyB3aGljaCBkbyBub3Qgd2FudCB0aGVtLgorIworT0JKX00gPSAkKEJBU0VfT0JKX00pICQoQkFTRV9FWFRfT0JKKSAkKERSVl9PQkpTX00pIFwKKyAgICAgICAgJChGVFNZU19PQkopICAkKEZUSU5JVF9PQkopICQoRlRERUJVR19PQkopCisKK09CSl9TID0gJChCQVNFX09CSl9TKSAkKEJBU0VfRVhUX09CSikgJChEUlZfT0JKU19TKSBcCisgICAgICAgICQoRlRTWVNfT0JKKSAgJChGVElOSVRfT0JKKSAkKEZUREVCVUdfT0JKKQorCitpZm5lcSAoJChmaW5kc3RyaW5nIG11bHRpLCQoTUFLRUNNREdPQUxTKSksKQorT0JKRUNUU19MSVNUICs9ICQoT0JKX00pCitlbHNlCitPQkpFQ1RTX0xJU1QgKz0gJChPQkpfUykKK2VuZGlmCisKK29iamVjdHM6ICQoT0JKRUNUU19MSVNUKQorCitsaWJyYXJ5OiAkKEZUX0xJQlJBUlkpCisKKy5jLiRPOgorCSQoRlRfQ09NUElMRSkgJFQkQCAkPAorCisKK2NsZWFuX2ZyZWV0eXBlOgorCS0kKERFTEVURSkgJChPQkpfUzovPSQoU0VQKSkgJChPQkpfTTovPSQoU0VQKSkKKworCitkaXN0Y2xlYW5fZnJlZXR5cGU6IGNsZWFuX2ZyZWV0eXBlCisJLSQoREVMRVRFKSAkKEZUX0xJQlJBUlk6Lz0kKFNFUCkpCisJLSQoREVMRVRFKSAqLm9yaWcgKn4gY29yZSAqLmNvcmUKKworcmVtb3ZlX2NvbmZpZ19tazoKKwktJChERUxFVEUpICQoQ09ORklHX01LOi89JChTRVApKQorCitjbGVhbjogY2xlYW5fZnJlZXR5cGUKK2Rpc3RjbGVhbjogZGlzdGNsZWFuX2ZyZWV0eXBlIHJlbW92ZV9jb25maWdfbWsKKworIyBFTkQKZGlmZiAtLWdpdCBhL2NvbmZpZy9vczIvTWFrZWZpbGUuZW14IGIvY29uZmlnL29zMi9NYWtlZmlsZS5lbXgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzUzOTRlYQotLS0gL2Rldi9udWxsCisrKyBiL2NvbmZpZy9vczIvTWFrZWZpbGUuZW14CkBAIC0wLDAgKzEsMTk2IEBACisjKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIyoKKyMqICBGcmVlVHlwZSAyIENvbmZpZ3VyYXRpb24gcnVsZXMgZm9yIFVuaXggKyBnY2MKKyMqCisjKiAgQ29weXJpZ2h0IDE5OTYtMTk5OSBieQorIyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyMqCisjKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkCisjKiAgbW9kaWZpZWQgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorIyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorIyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorIyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyMqCisjKgorIyogIFRoZSBwdXJwb3NlIG9mIHRoaXMgc3ViLU1ha2VmaWxlIGlzIHRvIGRlZmluZSB2YXJpb3VzIGJ1aWxkIGFuZAorIyogIHBsYXRmb3JtIHNwZWNpZmljIHZhcmlhYmxlcyBiZWZvcmUgaW5jbHVkaW5nIHRoZSBzdWItTWFrZWZpbGUKKyMqICBjb250YWluaW5nIHRoZSBGcmVlVHlwZSBsaWJyYXJ5IHJ1bGVzLCBmb3VuZCBpbgorIyoKKyMqICAgICAkKFRPUCkvY29uZmlnL2ZyZWV0eXBlLm1rCisjKgorIyogIFRoZSBmb2xsb3dpbmcgdmFyaWFibGVzIG11c3QgYmUgZGVmaW5lZCBiZWZvcmUgaW5jbHVkaW5nIHRoaXMKKyMqICBmaWxlIDoKKyMqCisjKiAgICAgVE9QICAgICAgICAgIFBhdGhuYW1lIHRvIHRoZSB0b3Agb2YgdGhlIEZyZWVUeXBlIHNvdXJjZXMKKyMqICAgICAgICAgICAgICAgICAgaGllcmFyY2h5CisjKgorIyogIFRoaXMgZmlsZSBzaG91bGQgZGVmaW5lIHRoZSBmb2xsb3dpbmcgdmFyaWFibGVzIGJlZm9yZSBpbmNsdWRpbmcKKyMqICB0aGUgRnJlZVR5cGUgbGlicmFyeSBydWxlcyBmaWxlIDoKKyMqCisjKiAgICAgQlVJTEQgICAgICAgIFBhdGhuYW1lIHRvIHRoZSBwbGF0Zm9ybS1zcGVjaWZpYyBmaWxlcyB1c2VkCisjKiAgICAgICAgICAgICAgICAgIGZvciB0aGUgYnVpbGQuIFVzdWFsbHkgYCQoVE9QKS9jb25maWcvPHN5c3RlbT4nCisjKgorIyogICAgIFNFUCAgICAgICAgICBEaXJlY3Rvcnkgc2VwYXJhdG9yIGZvciB0aGUgY3VycmVudCBwbGF0Zm9ybS4KKyMqICAgICAgICAgICAgICAgICAgRWl0aGVyIC8gb3IgXCAobWF5YmUgOiBvbiBNYWNzKQorIyogCisjKiAgICAgREVMRVRFICAgICAgIFRoZSBmb3JjZWQgcmVtb3ZlL2RlbGV0ZSBjb21tYW5kIHRvIGVyYXNlIG9uZSBvciBtb3JlCisjKiAgICAgICAgICAgICAgICAgIGZpbGVzCisjKgorIyogICAgIElOQ0xVREUgICAgICBUaGUgbG9jYXRpb24gb2YgYWxsIHB1YmxpYyBoZWFkZXIgZmlsZXMuIGUuZy4KKyMqICAgICAgICAgICAgICAgICAgYCQoVE9QKS9pbmNsdWRlJ2luY2x1ZGUnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisjKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisjKiAgICAgU1JDICAgICAgICAgIFRoZSBkaXJlY3RvcnkgY29udGFpbmluZyBhbGwgc291cmNlcy4gZS5nLiAgICAgICAgICAgICAgCisjKiAgICAgICAgICAgICAgICAgICckKFRPUCkvc3JjJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyMqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisjKiAgICAgT0JKX0RJUiAgICAgIFRoZSBsb2NhdGlvbiB3aGVyZSBjb21waWxlZCBvYmplY3QgZmlsZXMgd2lsbCBiZSAgICAgICAgIAorIyogICAgICAgICAgICAgICAgICBwbGFjZWQsIGUuZy4gJyQoVE9QKS9vYmonICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisjKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorIyogICAgIExJQl9ESVIgICAgICBUaGUgbG9jYXRpb24gd2hlcmUgdGhlIHJlc3VsdGluZyBsaWJyYXJ5IGZpbGUgd2lsbCBiZSAgICAKKyMqICAgICAgICAgICAgICAgICAgcGxhY2VkLCBlLmcuICckKFRPUCkvb2JqJyAgICAgICAgICAgICAgICAgICAgICAgIAorIyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyMqICAgICBMSUJSQVJZICAgICAgVGhlIGZpbGVuYW1lIG9mIHRoZSByZXN1bHRpbmcgbGlicmFyeSBmaWxlLCB3aXRob3V0ICAgICAgCisjKiAgICAgICAgICAgICAgICAgIGl0cyBleHRlbnNpb24uLiBlLmcuICdsaWJmcmVldHlwZScgb3IgJ2ZyZWV0eXBlJyAgICAgICAgIAorIyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyMqICAgICBPICAgICAgICAgICAgVGhlIG9iamVjdCBmaWxlIHN1ZmZpeC4gIENhbiBiZSAnLm8nLCAnLm9iaiwnICcubG8sJyAgICAgCisjKiAgICAgICAgICAgICAgICAgICc7Y29mZiwnIGV0Yy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorIyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyMqICAgICBBICAgICAgICAgICAgVGhlIGxpYnJhcnkgZmlsZSBzdWZmaXguICBDYW4gYmUgJy5hJyAnLnNvLCcgJy5saWInICAgICAgCisjKiAgICAgICAgICAgICAgICAgICcuZGxsLCcgZXRjLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorIyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyMqICAgICBJICAgICAgICAgICAgVGhlIHBhdGggaW5jbHVzaW9uIGZsYWcuICBTb21lIGNvbXBpbGVycyB1c2UgYSAgICAgICAgICAgCisjKiAgICAgICAgICAgICAgICAgIGRpZmZlcmVudCBmbGFnIHRoYW4gJy1JJyB0byBzcGVjaWZ5IGFuIGFkZGl0aW9uYWwgICAgICAgIAorIyogICAgICAgICAgICAgICAgICBpbmNsdWRlIHBhdGguICBFeGFtcGxlcyBhcmUgJy9pPScgb3IgJy1KICcsIGV0Yy4gICAgICAgICAKKyMqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisjKiAgICAgRCAgICAgICAgICAgIFRoZSBtYWNybyBkZWZpbml0aW9uIGZsYWcuICBJIGhhdmVuJ3QgbWV0IGNvbXBpbGVycyAgICAgIAorIyogICAgICAgICAgICAgICAgICB3aGljaCBkb24ndCB1c2UgdGhlICctRCcgc3dpdGNoIHRvIGRlZmluZSBhIG1hY3JvLCBidXQgICAKKyMqICAgICAgICAgICAgICAgICAgd2hvIGtub3dzLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisjKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorIyogICAgIFQgICAgICAgICAgICBUaGUgY29tcGlsYXRpb24gZmxhZyB1c2VkIHRvIGlkZW50aWZ5IHRoZSB0YXJnZXQuIFNvbWUgICAKKyMqICAgICAgICAgICAgICAgICAgY29tcGlsZXJzIHVzZSBhIGRpZmZlcmVudCBmbGFnIHRoYW4gJy1vICcgdG8gc3BlY2lmeSAgICAgCisjKiAgICAgICAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSB0YXJnZXQgb2JqZWN0IGZpbGUuICAgICAgICAgICAgICAgICAgICAgIAorIyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyMqICAgICBDRkxBR1MgICAgICAgVGhlIHNldCBvZiBmbGFncyB1c2VkIHRvIGNvbXBpbGUgb2JqZWN0IGZpbGVzLgorIyogICAgICAgICAgICAgICAgICAodXN1YWxseSBjb250YWlucyB0aGUgZmxhZyAnLWMnKS4KKyMqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisjKgorIyoKKyMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKK2lmbmRlZiBUT1AKK1RPUCA6PSAuCitlbmRpZgorCitERUxFVEUgICA6PSBkZWwKK1NFUCAgICAgIDo9IC8KK0JVSUxEICAgIDo9ICQoVE9QKS9jb25maWcvb3MyCitQTEFURk9STSA6PSBvczIKK0NDICAgICAgIDo9IGdjYworCisjIHRoZSBkaXJlY3Rvcnkgd2hlcmUgYWxsIG9iamVjdCBmaWxlcyBhcmUgcGxhY2VkCisjCitPQkpfRElSIDo9ICQoVE9QKS9vYmoKKworCisjIHRoZSBkaXJlY3Rvcnkgd2hlcmUgYWxsIGxpYnJhcnkgZmlsZXMgYXJlIHBsYWNlZAorIworIyAgYnkgZGVmYXVsdCwgdGhpcyBpcyB0aGUgc2FtZSBhcyBPQkpfRElSLCBob3dldmVyLCB0aGlzIGNhbiBiZQorIyAgY2hhbmdlZCB0byBzdWl0IHBhcnRpY3VsYXIgbmVlZHMuLgorIworTElCX0RJUiA6PSAkKE9CSl9ESVIpCisKKworIyB0aGUgb2JqZWN0IGZpbGUgZXh0ZW5zaW9uLCB0aGlzIGNhbiBiZSAubywgLnRjbywgLm9iaiwgZXRjLi4KKyMgZGVwZW5kaW5nIG9uIHRoZSBwbGF0Zm9ybQorIworTyA6PSBvCisKKyMgdGhlIGxpYnJhcnkgZmlsZSBleHRlbnNpb24sIHRoaXMgY2FuIGJlIC5hLCAubGliLCBldGMuLgorIyBkZXBlbmRpbmcgb24gdGhlIHBsYXRmb3JtCisjCitBIDo9IGEKKworCisjIFRoZSBuYW1lIG9mIHRoZSBmaW5hbCBsaWJyYXJ5IGZpbGUuCisjIE5vdGUgdGhhdCB0aGUgRE9TLXNwZWNpZmljIE1ha2VmaWxlIHVzZXMgYSBzaG9ydGVyICg4LjMpIG5hbWUKKyMKK0xJQlJBUlkgOj0gbGliZnJlZXR5cGUKKworCisjIHBhdGggaW5jbHVzaW9uIGZsYWcuCisjCisjICBTb21lIGNvbXBpbGVycyB1c2UgYSBkaWZmZXJlbnQgZmxhZyB0aGFuICctSScgdG8gc3BlY2lmeSBhbgorIyAgYWRkaXRpb25hbCBpbmNsdWRlIHBhdGguIEV4YW1wbGVzIGFyZSAiL2k9IiBvciAiLUoiLCBldGMuLi4KKyMKK0kgOj0gLUkKKworCisjIFRoZSBsaW5rIGZsYWcgdXNlZCB0byBzcGVjaWZ5IGEgZ2l2ZW4gbGlicmFyeSBmaWxlIG9uIGxpbmsuCisjIE5vdGUgdGhhdCB0aGlzIGlzIG9ubHkgdXNlZCB0byBjb21waWxlIHRoZSBkZW1vIHByb2dyYW1zLCBub3QKKyMgdGhlIGxpYnJhcnkgaXRzZWxmLgorIworTCA6PSAtbAorCisKKyMgQyBmbGFnIHVzZWQgdG8gZGVmaW5lIGEgbWFjcm8gYmVmb3JlIHRoZSBjb21waWxhdGlvbiBvZiBhIGdpdmVuCisjIHNvdXJjZSBvYmplY3QuIFVzdWFsbHkgaXMgJy1EJyBsaWtlIGluICItRERFQlVHIgorIworRCA6PSAtRAorCisKKyMgVGFyZ2V0IGZsYWcgLSBiZXdhcmUsIHRoZXJlIGlzIGEgc3BhY2UgYWZ0ZXIgdGhlICdvJyAhIQorIworIworVCA6PSAtbyAKKworIyBDIGZsYWdzCisjCisjICAgVGhlc2Ugc2hvdWxkIGNvbmNlcm4gOgorIworIyAgICAgLSBkZWJ1ZyBvdXRwdXQKKyMgICAgIC0gb3B0aW1pemF0aW9uCisjICAgICAtIHdhcm5pbmdzCisjICAgICAtIGFuc2kgY29tcGxpYW5jZS4uCisjCitpZm5kZWYgQ0ZMQUdTCitDRkxBR1MgOj0gLWMgLWcgLU82IC1XYWxsCitlbmRpZgorCisKK2lmZGVmIEJVSUxEX0ZSRUVUWVBFCisKK2luY2x1ZGUgJChUT1ApL2NvbmZpZy9mcmVldHlwZS5taworCisKKyMgTGlicmFyaWFuIHRvIHVzZSB0byBidWlsZCB0aGUgc3RhdGljIGxpYnJhcnkKKyMKK0ZUX0xJQlJBUklBTiA6PSAkKEFSKSAtcgorCisKKyMgVGhpcyBmaW5hbCBydWxlIGlzIHVzZWQgdG8gbGluayBhbGwgb2JqZWN0IGZpbGVzIGludG8gYSBzaW5nbGUKKyMgbGlicmFyeS4gSXQgaXMgcGFydCBvZiB0aGUgc3lzdGVtLXNwZWNpZmljIHN1Yi1NYWtlZmlsZSBiZWNhdXNlIG5vdAorIyBhbGwgbGlicmFyaWFucyBhY2NlcHQgYSBzaW1wbGUgc3ludGF4IGxpa2UgOgorIworIyAgICBsaWJyYXJpYW4gbGlicmFyeV9maWxlIHtsaXN0IG9mIG9iamVjdCBmaWxlc30gCisjCiskKEZUX0xJQlJBUlkpOiAkKE9CSkVDVFNfTElTVCkKKwktJChERUxFVEUpICRACisJJChGVF9MSUJSQVJJQU4pICRAICQoT0JKRUNUU19MSVNUKQorCisKKyMgQ2xlYW5pbmcgcnVsZXMKKyMKK0RJUl9PQkogOj0gJChzdWJzdCAkKFNFUCksXCwkKE9CSl9ESVIpKQorCitjbGVhbl9mcmVldHlwZV9vYmplY3RzOgorCS1kZWwgJChESVJfT0JKKVwqLiRPCisKK2NsZWFuX2ZyZWV0eXBlX2xpYjoKKwktZGVsICQoc3Vic3QgJChTRVApLFwsJChGVF9MSUJSQVJZKSkKKworY2xlYW46IGNsZWFuX2ZyZWV0eXBlX29iamVjdHMKKworCisKK2VuZGlmCisKKwpkaWZmIC0tZ2l0IGEvY29uZmlnL29zMi9kZXRlY3QubWsgYi9jb25maWcvb3MyL2RldGVjdC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmRjNDdiCi0tLSAvZGV2L251bGwKKysrIGIvY29uZmlnL29zMi9kZXRlY3QubWsKQEAgLTAsMCArMSw0NyBAQAorIworIyBUaGlzIGZpbGUgaXMgdXNlZCB0byBkZXRlY3QgYW4gT1MvMiBob3N0LCBhbmQgc2V0IHRoZSBidWlsZCB2YXJpYWJsZXMKKyMgYWNjb3JkaW5nbHkuLgorIworIyB3aGljaCBNYWtlZmlsZSB0byB1c2UgYmFzZWQgb24gdGhlIHZhbHVlIG9mIHRoZSBDQyBlbnZpcm9ubWVudCB2YXJpYWJsZS4KKyMKKyMgT1MvMgorIworIworCitpZmVxICgkKFBMQVRGT1JNKSxhbnNpKQoraWZkZWYgT1MyX1NIRUxMCisKK1BMQVRGT1JNIDo9IG9zMgorQ09QWSAgICAgOj0gY29weQorREVMRVRFICAgOj0gZGVsCisKK0NPTkZJR19GSUxFIDo9IE1ha2VmaWxlLmVteCAgICMgZ2NjLWVteCBieSBkZWZhdWx0CitTRVAgICAgICAgICA6PSAvCisKK2lmbmVxICgkKGZpbmRzdHJpbmcgdmlzdWFsYWdlLCQoTUFLRUNNREdPQUxTKSksKSAgICAgIyBWaXN1YWwgQWdlIEMrKworQ09ORklHX0ZJTEUgOj0gTWFrZWZpbGUuaWNjCitTRVAgICAgICAgICA6PSAkKEJBQ0tTTEFTSCkKK0NDICAgICAgICAgIDo9IGljYworLlBIT05ZOiB2aXN1YWxhZ2UKK2VuZGlmCisKK2lmbmVxICgkKGZpbmRzdHJpbmcgd2F0Y29tLCQoTUFLRUNNREdPQUxTKSksKSAgICAgICAgIyBXYXRjb20gQy9DKysKK0NPTkZJR19GSUxFIDo9IE1ha2VmaWxlLndhdAorU0VQICAgICAgICAgOj0gJChCQUNLU0xBU0gpCitDQyAgICAgICAgICA6PSB3Y2MzODYKKy5QSE9OWTogd2F0Y29tCitlbmRpZgorCitpZm5lcSAoJChmaW5kc3RyaW5nIGJvcmxhbmRjLCQoTUFLRUNNREdPQUxTKSksKSAgICAgICMgQm9ybGFuZCBDKysgMzIgYml0cworQ09ORklHX0ZJTEUgOj0gTWFrZWZpbGUuYmNjCitTRVAgICAgICAgICA6PSAkKEJBQ0tTTEFTSCkKK0NDICAgICAgICAgIDo9IGJjYzMyCisuUEhPTlk6IGJvcmxhbmRjCitlbmRpZgorCitDT05GSUdfUlVMRVMgOj0gJChUT1ApXGNvbmZpZ1xvczJcJChDT05GSUdfRklMRSkKKworc2V0dXA6IGRvc19zZXR1cAorCitlbmRpZiAjdGVzdCBPUzJfU0hFTEwKK2VuZGlmICN0ZXN0IFBMQVRGT1JNCmRpZmYgLS1naXQgYS9jb25maWcvb3MyL2Z0Y29uZmlnLmggYi9jb25maWcvb3MyL2Z0Y29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNhNGM5NQotLS0gL2Rldi9udWxsCisrKyBiL2NvbmZpZy9vczIvZnRjb25maWcuaApAQCAtMCwwICsxLDE4MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgZnRjb25maWcuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFOU0ktc3BlY2lmaWMgY29uZmlndXJhdGlvbiBmaWxlIChzcGVjaWZpY2F0aW9uIG9ubHkpLiAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAxOTk2LTE5OTkgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCAgICAgICAgKi8KKy8qICBtb2RpZmllZCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgICovCisvKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLworLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KKy8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogVGhpcyBoZWFkZXIgZmlsZSBjb250YWlucyBhIG51bWJlciBvZiBtYWNybyBkZWZpbml0aW9ucyB0aGF0IGFyZSB1c2VkICovCisgIC8qIGJ5IHRoZSByZXN0IG9mIHRoZSBlbmdpbmUuICBQb3J0ZXJzIGFyZSBmcmVlIHRvIGNvcHkgdGhpcyBmaWxlIGFuZCAgICAqLworICAvKiBhZGFwdCBpdCB0byBzdWl0IHRoZWlyIG93biBzeXN0ZW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIElNUE9SVEFOVCBOT1RFOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgUG9ydGVycywgcmVhZCBjYXJlZnVsbHkgdGhlIGNvbW1lbnRzIGluIGBmdHN5cy5oJyBiZWZvcmUgdHJ5aW5nIHRvICovCisgIC8qICAgIHBvcnQgdGhpcyBmaWxlIHRvIHlvdXIgc3lzdGVtLiAgSXQgY29udGFpbnMgbWFueSBlc3NlbnRpYWwgICAgICAgICAqLworICAvKiAgICByZW1hcmtzLCBhbmQgd2lsbCBlYXNlIHlvdXIgd29yayBncmVhdGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNpZm5kZWYgRlRDT05GSUdfSAorI2RlZmluZSBGVENPTkZJR19ICisKKy8qIEluY2x1ZGUgdGhlIGhlYWRlciBmaWxlIGNvbnRhaW5pbmcgYWxsIGRldmVsb3BlciBidWlsZCBvcHRpb25zICovCisjaW5jbHVkZSA8ZnRvcHRpb24uaD4KKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgUExBVEZPUk0tU1BFQ0lGSUMgQ09ORklHVVJBVElPTiBNQUNST1MgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogVGhlc2UgbWFjcm9zIGNhbiBiZSB0b2dnbGVkIHRvIHN1aXQgYSBzcGVjaWZpYyBzeXN0ZW0uICBUaGUgY3VycmVudCAgICovCisgIC8qIG9uZXMgYXJlIGRlZmF1bHRzIHVzZWQgdG8gY29tcGlsZSBGcmVlVHlwZSBpbiBhbiBBTlNJIEMgZW52aXJvbm1lbnQgICAqLworICAvKiAoMTZiaXQgY29tcGlsZXJzIGFyZSBhbHNvIHN1cHBvcnRlZCkuICBDb3B5IHRoaXMgZmlsZSB0byB5b3VyIG93biAgICAgKi8KKyAgLyogYGZyZWV0eXBlL2FyY2gvPHN5c3RlbT4nICBkaXJlY3RvcnksIGFuZCBlZGl0IGl0IHRvIHBvcnQgdGhlIGVuZ2luZS4gICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvKiBEZWZpbmUgdG8gZW1wdHkgaWYgdGhlIGtleXdvcmQgZG9lcyBub3Qgd29yay4gICovCisvKiAjdW5kZWYgY29uc3QgKi8KKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBBTlNJIEMgaGVhZGVyIGZpbGVzLiAgKi8KKyNkZWZpbmUgU1REQ19IRUFERVJTIDEKKworLyogV2UgdXNlIDxsaW1pdHMuaD4gdmFsdWVzIHRvIGtub3cgdGhlIHNpemVzIG9mIHRoZSB0eXBlcy4gICovCisjaW5jbHVkZSA8bGltaXRzLmg+CisKKy8qIFRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gYW4gYGludCcgdHlwZS4gICovCisjaWYgICBVSU5UX01BWCA9PSAweEZGRkZGRkZGCisjZGVmaW5lIFNJWkVPRl9JTlQgIDQKKyNlbGlmIFVJTlRfTUFYID09IDB4RkZGRgorI2RlZmluZSBTSVpFT0ZfSU5UICAyCisjZWxpZiBVSU5UX01BWCA+IDB4RkZGRkZGRkYgJiYgVUlOVF9NQVggPT0gMHhGRkZGRkZGRkZGRkZGRkZGCisjZGVmaW5lIFNJWkVPRl9JTlQgIDgKKyNlbHNlCisjZXJyb3IgIlVuc3VwcG9ydGVkIG51bWJlciBvZiBieXRlcyBpbiBgaW50JyB0eXBlISIKKyNlbmRpZgorCisvKiBUaGUgbnVtYmVyIG9mIGJ5dGVzIGluIGEgYGxvbmcnIHR5cGUuICAqLworI2lmICAgVUxPTkdfTUFYID09IDB4RkZGRkZGRkYKKyNkZWZpbmUgU0laRU9GX0xPTkcgIDQKKyNlbGlmIFVMT05HX01BWCA+IDB4RkZGRkZGRkYgJiYgVUxPTkdfTUFYID09IDB4RkZGRkZGRkZGRkZGRkZGRgorI2RlZmluZSBTSVpFT0ZfTE9ORyAgOAorI2Vsc2UKKyNlcnJvciAiVW5zdXBwb3J0ZWQgbnVtYmVyIG9mIGJ5dGVzIGluIGBsb25nJyB0eXBlISIKKyNlbmRpZgorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIG1lbWNweSBmdW5jdGlvbi4gICovCisjZGVmaW5lIEhBVkVfTUVNQ1BZIDEKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8ZmNudGwuaD4gaGVhZGVyIGZpbGUuICAqLworI2RlZmluZSBIQVZFX0ZDTlRMX0ggMAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx1bmlzdGQuaD4gaGVhZGVyIGZpbGUuICAqLworI2RlZmluZSBIQVZFX1VOSVNURF9IIDAKKworCisvKiBQcmVmZXJyZWQgYWxpZ25tZW50IG9mIGRhdGEgKi8KKyNkZWZpbmUgRlRfQUxJR05NRU5UICA4CisKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICBBVVRPTUFUSUMgQ09ORklHVVJBVElPTiBNQUNST1MgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgVGhlc2UgbWFjcm9zIGFyZSBjb21wdXRlZCBmcm9tIHRoZSBvbmVzIGRlZmluZWQgYWJvdmUuICBEb24ndCB0b3VjaCAgKi8KKyAgLyogIHRoZWlyIGRlZmluaXRpb24sIHVubGVzcyB5b3Uga25vdyBwcmVjaXNlbHkgd2hhdCB5b3UncmUgZG9pbmcuICBObyAgICovCisgIC8qICBwb3J0ZXIgc2hvdWxkIG5lZWQgdG8gbWVzcyB3aXRoIHRoZW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIEludE4gdHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICBVc2VkIHRvIGd1YXJhbnRlZSB0aGUgc2l6ZSBvZiBzb21lIHNwZWNpZmljIGludGVnZXJzLiAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHNpZ25lZCBzaG9ydCAgICBGVF9JbnQxNjsKKyAgdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAgRlRfV29yZDE2OworCisjaWYgU0laRU9GX0lOVCA9PSA0CisKKyAgdHlwZWRlZiBzaWduZWQgaW50ICAgICAgRlRfSW50MzI7CisgIHR5cGVkZWYgdW5zaWduZWQgaW50ICAgIEZUX1dvcmQzMjsKKworI2VsaWYgU0laRU9GX0xPTkcgPT0gNAorCisgIHR5cGVkZWYgc2lnbmVkIGxvbmcgICAgIEZUX0ludDMyOworICB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgICBGVF9Xb3JkMzI7CisKKyNlbHNlCisjZXJyb3IgIm5vIDMyYml0IHR5cGUgZm91bmQgLSBwbGVhc2UgY2hlY2sgeW91ciBjb25maWd1cmF0aW9uIGZpbGVzIgorI2VuZGlmCisKKyNpZiBTSVpFT0ZfTE9ORyA9PSA4CisKKyAgLyogTE9ORzY0IG11c3QgYmUgZGVmaW5lZCB3aGVuIGEgNjQtYml0IHR5cGUgaXMgYXZhaWxhYmxlICovCisjZGVmaW5lIExPTkc2NAorI2RlZmluZSBJTlQ2NCAgIGxvbmcKKworI2Vsc2UKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogR0NDIHByb3ZpZGVzIHRoZSBub24tQU5TSSAnbG9uZyBsb25nJyA2NC1iaXQgdHlwZS4gIFlvdSBjYW4gYWN0aXZhdGUgICovCisgIC8qIGl0IGJ5IGRlZmluaW5nIHRoZSBGVENBTENfVVNFX0xPTkdfTE9ORyBtYWNybyBpbiBgZnRjb25maWcuaCcuICBOb3RlICAqLworICAvKiB0aGF0IHRoaXMgd2lsbCBwcm9kdWNlIG1hbnkgLWFuc2kgd2FybmluZ3MgZHVyaW5nIGxpYnJhcnkgICAgICAgICAgICAgKi8KKyAgLyogY29tcGlsYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2lmZGVmIEZUQ0FMQ19VU0VfTE9OR19MT05HCisKKyNkZWZpbmUgTE9ORzY0CisjZGVmaW5lIElOVDY0ICAgbG9uZyBsb25nCisKKyNlbmRpZiAvKiBGVENBTENfVVNFX0xPTkdfTE9ORyAqLworI2VuZGlmCisKKworI2lmZGVmIEZUX01BS0VfT1BUSU9OX1NJTkdMRV9PQkpFQ1QKKyNkZWZpbmUgIExPQ0FMX0RFRiAgIHN0YXRpYworI2RlZmluZSAgTE9DQUxfRlVOQyAgc3RhdGljCisjZWxzZQorI2RlZmluZSAgTE9DQUxfREVGICAgZXh0ZXJuCisjZGVmaW5lICBMT0NBTF9GVU5DICAvKiBub3RoaW5nICovCisjZW5kaWYKKworI2lmZGVmIEZUX01BS0VfT1BUSU9OX1NJTkdMRV9MSUJSQVJZX09CSkVDVAorI2RlZmluZSAgQkFTRV9ERUYgICAgTE9DQUxfREVGCisjZGVmaW5lICBCQVNFX0ZVTkMgICBMT0NBTF9GVU5DCisjZWxzZQorI2RlZmluZSAgQkFTRV9ERUYgICAgZXh0ZXJuCisjZGVmaW5lICBCQVNFX0ZVTkMgICAvKiBub3RoaW5nICovCisjZW5kaWYKKworI2lmbmRlZiAgRVhQT1JUX0RFRgorI2RlZmluZSAgRVhQT1JUX0RFRiAgIGV4dGVybgorI2VuZGlmCisKKyNpZm5kZWYgIEVYUE9SVF9GVU5DCisjZGVmaW5lICBFWFBPUlRfRlVOQyAgLyogbm90aGluZyAqLworI2VuZGlmCisKKyNlbmRpZiAvKiBGVENPTkZJR19IICovCisKKworLyogRU5EICovCmRpZmYgLS1naXQgYS9jb25maWcvb3MyL2Z0b3B0aW9uLmggYi9jb25maWcvb3MyL2Z0b3B0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODUyZjY1ZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbmZpZy9vczIvZnRvcHRpb24uaApAQCAtMCwwICsxLDE2MiBAQAorI2lmbmRlZiBGVE9QVElPTl9ICisjZGVmaW5lIEZUT1BUSU9OX0gKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICBVU0VSLVNFTEVDVEFCTEUgQ09ORklHVVJBVElPTiBNQUNST1MgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogVGhlc2UgbWFjcm9zIGNhbiBiZSB0b2dnbGVkIGJ5IGRldmVsb3BlcnMgdG8gZW5hYmxlIG9yIGRpc2FibGUgICAgICAgICovCisgIC8qIGNlcnRhaW4gYXNwZWN0cyBvZiBGcmVlVHlwZS4gIFRoaXMgZmlsZSBjb250YWlucyBtYWNyb3MgdGhhdCBhcHBseSB0byAqLworICAvKiBhbGwgb2YgRnJlZVR5cGUuICBEcml2ZXItc3BlY2lmaWMgY29uZmlndXJhdGlvbnMgYXJlIHBsYWNlZCBpbiBlYWNoICAgKi8KKyAgLyogZHJpdmVyIGRpcmVjdG9yeSAoZS5nLiBgZnJlZXR5cGUvZHJpdmVycy90dGxpYi90dGNvbmZpZy5oJykuICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogQWx0ZXJuYXRlIEdseXBoIEltYWdlIEZvcm1hdCBzdXBwb3J0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIEJ5IGRlZmF1bHQsIHRoZSBnbHlwaCBpbWFnZXMgcmV0dXJuZWQgYnkgdGhlIEZyZWVUeXBlIGdseXBoIGxvYWRlciAgKi8KKyAgLyogICBjYW4gZWl0aGVyIGJlIGEgcGl4bWFwIG9yIGEgdmVjdG9yaWFsIG91dGxpbmUgZGVmaW5lZCB0aHJvdWdoICAgICAgICovCisgIC8qICAgYmV6aWVyIGNvbnRyb2wgcG9pbnRzLiBXaGVuIGRlZmluaW5nIHRoZSBmb2xsb3dpbmcgY29uZmlndXJhdGlvbiAgICAqLworICAvKiAgIG1hY3JvLCBzb21lIGZvbnQgZHJpdmVycyB3aWxsIGJlIGFibGUgdG8gcmVnaXN0ZXIgYWx0ZXJuYXRlICAgICAgICAgKi8KKyAgLyogICBnbHlwaCBpbWFnZSBmb3JtYXRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIFVuc2V0IHRoaXMgbWFjcm8gaWYgeW91J3JlIHN1cmUgdGhhdCB5b3UnbGwgbmV2ZXIgdXNlIGEgZm9udCBkcml2ZXIgKi8KKyAgLyogICB3aXRoIGFuIGFsdGVybmF0ZSBnbHlwaCBmb3JtYXQsIHRoaXMgd2lsbCByZWR1Y2UgdGhlIHNpemUgb2YgdGhlICAgICovCisgIC8qICAgYmFzZSBsYXllciBjb2RlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRlRfQ09ORklHX09QVElPTl9BTFRFUk5BVEVfR0xZUEhfRk9STUFUUworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogR0NDIHByb3ZpZGVzIHRoZSBub24tQU5TSSBgbG9uZyBsb25nJyA2NC1iaXQgdHlwZS4gIFlvdSBjYW4gYWN0aXZhdGUgICovCisgIC8qIGl0IGJ5IGRlZmluaW5nIHRoZSBGVENBTENfVVNFX0xPTkdfTE9ORyBtYWNybyBoZXJlLiAgTm90ZSBob3dldmVyICAgICAqLworICAvKiB0aGF0IHdlIGRpZCBub3QgZXhwZXJpZW5jZSBhbnkgaW1wcm92ZW1lbnQgaW4gc3BlZWQgd2l0aCBnY2MsIGFuZCAgICAgKi8KKyAgLyogdGhhdCB0aGUgZmluYWwgY29kZSBzZWVtcyBiaWdnZXIgd2hlbiBsaW5rZWQuICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI3VuZGVmIEZUQ0FMQ19VU0VfTE9OR19MT05HCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFdoZW4gY29tcGlsaW5nIEZyZWVUeXBlIGFzIGEgRExMLCBzb21lIHN5c3RlbXMvY29tcGlsZXJzIG5lZWQgYSAgICAgICAqLworICAvKiBzcGVjaWFsIGtleXdvcmQgaW4gZnJvbnQgb2YgZWFjaCBmdW5jdGlvbiBkZWZpbml0aW9uIGluc3RlYWQgb2YgICAgICAgKi8KKyAgLyogYGV4dGVybicuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBUaGUgbWFjcm9zIEVYUE9SVF9ERUYgYW5kIEVYUE9SVF9GVU5DIGFyZSB0aHVzIHVzZWQgdG8gZGVmaW5lICAgICAgICAgKi8KKyAgLyogZXhwb3J0ZWQgbGlicmFyeSBmdW5jdGlvbiBpbnRlcmZhY2VzIGFuZCBleHBvcnRlZCBsaWJyYXJ5IGZ1bmN0aW9ucyAgICovCisgIC8qIGltcGxlbWVudGF0aW9ucyByZXNwZWN0aXZlbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogSWYgbm90IGRlZmluZWQgaGVyZSwgdGhleSBhdXRvbWF0aWNhbGx5IGRlZmF1bHQgdG8gYGV4dGVybicgYW5kIHZvaWQgICovCisgIC8qIGxhdGVyIGluIHRoaXMgaGVhZGVyIGZpbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyN1bmRlZiBFWFBPUlRfREVGCisjdW5kZWYgRVhQT1JUX0ZVTkMKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogRGVidWcgbGV2ZWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIEZyZWVUeXBlIGNhbiBiZSBjb21waWxlZCBpbiBkZWJ1ZyBvciB0cmFjZSBtb2RlLiAgSW4gZGVidWcgbW9kZSwgICAgKi8KKyAgLyogICBlcnJvcnMgYXJlIHJlcG9ydGVkIHRocm91Z2ggdGhlIGBmdGRlYnVnJyBjb21wb25lbnQuICBJbiB0cmFjZSAgICAgICovCisgIC8qICAgbW9kZSwgYWRkaXRpb25hbCBtZXNzYWdlcyBhcmUgc2VudCB0byB0aGUgc3RhbmRhcmQgb3V0cHV0IGR1cmluZyAgICAqLworICAvKiAgIGV4ZWN1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgRGVmaW5lIEZUX0RFQlVHX0xFVkVMX0VSUk9SIHRvIGJ1aWxkIHRoZSBsaWJyYXJ5IGluIGRlYnVnIG1vZGUuICAgICAqLworICAvKiAgIERlZmluZSBGVF9ERUJVR19MRVZFTF9UUkFDRSB0byBidWlsZCBpdCBpbiB0cmFjZSBtb2RlLiAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgRG9uJ3QgZGVmaW5lIGFueSBvZiB0aGVzZSBtYWNyb3MgdG8gY29tcGlsZSBpbiBgcmVsZWFzZScgbW9kZS4gICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyN1bmRlZiAgRlRfREVCVUdfTEVWRUxfRVJST1IKKyN1bmRlZiAgRlRfREVCVUdfTEVWRUxfVFJBQ0UKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogQW50aS1hbGlhc2luZyBzdXBwb3J0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIFVuZGVmaW5lIHRoaXMgbWFjcm8gb25seSBpZiB5b3Ugd2FudCB0byBkaXNhYmxlIHRoZSBhbnRpLWFsaWFzaW5nICAgKi8KKyAgLyogICBzdXBwb3J0IGluIEZyZWVUeXBlLiAgVGhpcyB3aWxsIHNhdmUgeW91IGFib3V0IDUgS2Igb2YgY29kZS4gIEl0ICAgICovCisgIC8qICAgbWF5IGJlIGltcG9ydGFudCBmb3Igc29tZSBlbWJlZGRlZCBzeXN0ZW1zLiAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRlRfQ09ORklHX09QVElPTl9BTlRJX0FMSUFTCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIEVuZGlhbmVzcyBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICBGcmVlVHlwZSBpcyBjb21wbGV0ZWx5IGVuZGlhbi1pbmRlcGVuZGVudCwgYW5kIGNhbiB0aHVzIGJlIGNvbXBpbGVkICovCisgIC8qICAgZGlyZWN0bHkgb24gX2FueV8gbWFjaGluZS4gIEhvd2V2ZXIsIHNvbWUgY29tcG9uZW50cyBvZiB0aGUgbGlicmFyeSAqLworICAvKiAgIHByb3ZpZGUgaW1wcm92ZWQgcm91dGluZXMgZm9yIHRoZSBjYXNlcyB3aGVyZSBlbmRpYW5lc3MgaXMga25vd24uICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgSXQgdXN1YWxseSByZXN1bHRzIGluIHNwZWVkLXVwcyBhbmQgcmVkdWNlZCBjb2RlIHNpemUuICBOb3RlIHRoYXQgICAqLworICAvKiAgIHlvdSBzaG91bGQgbm90IGRlZmluZSBib3RoIG9mIHRoZXNlIG1hY3Jvcy4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIE5PVEU6IEZvciBub3csIG9ubHkgdGhlIHNjYW4tbGluZSBjb252ZXJ0ZXIgKGJhc2UvZnRyYXN0ZXIuYykgdXNlcyAgKi8KKyAgLyogICAgICAgICB0aGVzZSBtYWNyb3MgdG8gc3BlZWQtdXAgc29tZSBhbnRpLWFsaWFzIHJlbmRlcmluZyByb3V0aW5lcy4gICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI3VuZGVmICBGVF9DT05GSUdfT1BUSU9OX0xJVFRMRV9FTkRJQU4KKyN1bmRlZiAgRlRfQ09ORklHX09QVElPTl9CSUdfRU5ESUFOCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIERlZmluZSB0aGlzIGNvbmZpZ3VyYXRpb24gbWFjcm8gd2hlbmV2ZXIgeW91IHdhbnQgdG8gYnVpbGQgYSB2ZXJzaW9uICAqLworICAvKiBvZiBGcmVlVHlwZSB0aGF0IGRvZXMgbm90IGluY2x1ZGUgYSBkZWZhdWx0IGBzeXN0ZW0nIGNvbXBvbmVudC4gICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIE5vdGUgdGhhdCB0aGlzIHdpbGwgcHJldmVudCB0aGUgY29tcGlsYXRpb24gb2YgYGZ0aW5pdCcsIGhlbmNlIHRoZSAgICAqLworICAvKiBmdW5jdGlvbiBGVF9Jbml0X0ZyZWVUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjdW5kZWYgRlRfQ09ORklHX09QVElPTl9OT19ERUZBVUxUX1NZU1RFTQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgcmVuZGVyIHBvb2wgdXNlZCBieSB0aGUgc2Nhbi1saW5lICAgICAgICAgKi8KKyAgLyogICAgY29udmVydGVyIHRvIGRvIGFsbCBvZiBpdHMgd29yay4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGlzIG11c3QgYmUgZ3JlYXRlciB0aGFuIDQgS2IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZUX1JFTkRFUl9QT09MX1NJWkUgICAzMjc2OAorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9NQVhfRFJJVkVSUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoZSBtYXhpbXVtIG51bWJlciBvZiBmb250IGRyaXZlcnMgdGhhdCBjYW4gYmUgcmVnaXN0ZXJlZCBpbiBhICAgICAqLworICAvKiAgICBzaW5nbGUgRnJlZVR5cGUgbGlicmFyeSBvYmplY3QuICA4IHNlZW1zIHRvIGJlIGEgZ29vZCBjaG9pY2UgZHVlICAgKi8KKyAgLyogICAgdG8gdGhlIHJlbGF0aXZlIGxvdyBhY3R1YWwgbnVtYmVyIG9mIGRyaXZlcnMgOy0pICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBGVF9NQVhfRFJJVkVSUyAgOAorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9NQVhfRVhURU5TSU9OUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoZSBtYXhpbXVtIG51bWJlciBvZiBleHRlbnNpb25zIHRoYXQgY2FuIGJlIHJlZ2lzdGVyZWQgaW4gYSAgICAgICAqLworICAvKiAgICBzaW5nbGUgZm9udCBkcml2ZXIuIDggc2VlbXMgdG8gYmUgYSBnb29kIGNob2ljZSBmb3Igbm93Li4gICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZUX01BWF9FWFRFTlNJT05TICA4CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX01BWF9HTFlQSF9GT1JNQVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhlIG1heGltdW0gbnVtYmVyIG9mIGdseXBoIGltYWdlIGZvcm1hdHMgdGhhdCBtaWdodCBiZSByZWdpc3RlcmVkICovCisgIC8qICAgIGluIGEgZ2l2ZW4gbGlicmFyeSBpbnN0YW5jZS4gOCBzZWVtcyB0byBiZSBhIGdvb2QgY2hvaWNlIGR1ZSB0byAgICAqLworICAvKiAgICB0aGUgcmVsYXRpdmVseSBsb3cgbnVtYmVyIG9mIGN1cnJlbnQgZm9ybWF0cyA7LSkgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyNkZWZpbmUgRlRfTUFYX0dMWVBIX0ZPUk1BVFMgIDgKKworCisKKyNlbmRpZiAvKiBGVE9QVElPTl9IICovCmRpZmYgLS1naXQgYS9jb25maWcvb3MyL2Z0c3lzLmMgYi9jb25maWcvb3MyL2Z0c3lzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY1MGYxYwotLS0gL2Rldi9udWxsCisrKyBiL2NvbmZpZy9vczIvZnRzeXMuYwpAQCAtMCwwICsxLDk0MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgZnRzeXMuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9TLzItc3BlY2lmaWMgc3lzdGVtIG9wZXJhdGlvbnMgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAxOTk2LTE5OTkgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCAgICAgICAgKi8KKy8qICBtb2RpZmllZCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgICovCisvKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLworLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KKy8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgYGZ0c3lzJyBjb21wb25lbnQgdXNlcyBtYWxsb2MoKS9mcmVlKCkgZm9yICovCisgIC8qIG1lbW9yeSBtYW5hZ2VtZW50LCBhbmQgdGhlIE9TLzIgRG9zWFhYWFgoKSBBUEkgZnVuY3Rpb25zcyBmb3IgZmlsZSAgICAqLworICAvKiBhY2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIElNUE9SVEFOVCBOT1RFOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgUG9ydGVycywgcmVhZCBjYXJlZnVsbHkgdGhlIGNvbW1lbnRzIGluIGZ0c3lzLmggYmVmb3JlIHRyeWluZyB0byAgICovCisgIC8qICAgIHBvcnQgdGhpcyBmaWxlIHRvIHlvdXIgc3lzdGVtLiAgSXQgY29udGFpbnMgbWFueSBlc3NlbnRpYWwgICAgICAgICAqLworICAvKiAgICByZW1hcmtzLCBhbmQgd2lsbCBlYXNlIHlvdXIgd29yayBncmVhdGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNpbmNsdWRlICJmdHN5cy5oIgorI2luY2x1ZGUgImZ0c3RyZWFtLmgiCisjaW5jbHVkZSAiZnRkZWJ1Zy5oIgorCisjaW5jbHVkZSA8b3MyLmg+CisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaWZkZWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdCAgICAgICovCisgIC8qIHBhcmFtZXRlciBvZiB0aGUgUFRSQUNFKCkgYW5kIFBFUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cgICAgICAqLworICAvKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjdW5kZWYgIEZUX0NPTVBPTkVOVAorI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX2lvCisKKworI3VuZGVmICBDVVJfU1lTVEVNICAvKiBqdXN0IGluIGNhc2UgKi8KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogVG8gZWFzZSBwb3J0aW5nLCB3ZSB1c2UgdGhlIG1hY3JvIFNZU19TVFJFQU0gdG8gbmFtZSB0aGUgICAgICAgICAgICAgICovCisgIC8qIHN5c3RlbS1zcGVjaWZpYyBzdHJlYW0gdHlwZS4gIEZvciBleGFtcGxlLCBpdCBpcyBhIGBGSUxFKicgd2l0aCB0aGUgICAqLworICAvKiBBTlNJIGxpYmMsIGl0IHdpbGwgYmUgYSBmaWxlIGRlc2NyaXB0b3IsIGkuZS4gYW4gaW50ZWdlciwgd2hlbiB1c2luZyAgKi8KKyAgLyogdGhlIFVuaXggc3lzdGVtIEFQSSwgZXRjLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBTWVNfU1RSRUFNICBIRklMRQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICBJL08gQUNDRVNTIEFORCBNQU5BR0VNRU5UICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFdlIG9ubHkgZGVmaW5lIHRoZSBgQU5TSScgcmVzb3VyY2UgY2xhc3MgaW4gdGhpcyBjbGFzcy4gIEl0IGlzICAgICAgICAqLworICAvKiBkaXNrLWJhc2VkIGFuZCBwcm92aWRlcyBhIE1SVSBjYWNoZSBpbiBvcmRlciB0byBvbmx5IGtlZXAgdGhlIGZpbGUgICAgKi8KKyAgLyogZGVzY3JpcHRvcnMgb2YgdGhlIDEwIG1vc3QgcmVjZW50bHkgdXNlZCByZXNvdXJjZSBmaWxlcy4gICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBJdCBzaW1wbHkgY29udGFpbnMgdHdvIGxpc3RzLiAgT25lIGNvbnRhaW5zIHRoZSBgY2FjaGVkJyByZXNvdXJjZXMgICAgKi8KKyAgLyogd2l0aCBhIHZhbGlkIEZJTEUqIHBvaW50ZXIsIHRoZSBzZWNvbmQgY29udGFpbnMgYWxsIG90aGVyIGBmbHVzaGVkJyAgICovCisgIC8qIHJlc291cmNlIG9iamVjdHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9PczJGaWxlUmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGUgRlRfT3MyRmlsZSBjbGFzcyBkZXJpdmVzIGZyb20gRlRfUmVzb3VyY2VSZWMuICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICByb290ICAgICAgOjogVGhlIHJvb3QgcmVzb3VyY2UgY2xhc3MgZmllbGRzLiAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHBhdGhuYW1lICA6OiBUaGlzIGlzIGEgY29weSBvZiB0aGUgQU5TSSBmaWxlIHBhdGhuYW1lIHVzZWQgdG8gb3BlbiAqLworICAvKiAgICAgICAgICAgICAgICAgc3RyZWFtcyBmb3IgdGhlIHJlc291cmNlLiAgQSBkaWZmZXJlbnQgaW1wbGVtZW50YXRpb24gKi8KKyAgLyogICAgICAgICAgICAgICAgIGlzIGZyZWUgdG8gdXNlIFVuaWNvZGUgY2hhcnMsIG9yIGZpbGUgaS1ub2RlIG51bWJlcnMsICovCisgIC8qICAgICAgICAgICAgICAgICBldGMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZmlsZV9zaXplIDo6IFRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSByZXNvdXJjZS4gIFRoaXMgZmllbGQgc2hvdWxkICovCisgIC8qICAgICAgICAgICAgICAgICBiZSBzZXQgdG8gLTEgdW50aWwgdGhlIHJlc291cmNlIGlzIGZpcnN0IG9wZW5lZC4gICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBzdHJ1Y3QgIEZUX09zMkZpbGVSZWNfCisgIHsKKyAgICBGVF9SZXNvdXJjZVJlYyAgcm9vdDsKKyAgICBjaGFyKiAgICAgICAgICAgcGF0aG5hbWU7ICAgLyogdGhlIGZvbnQgZmlsZSdzIHBhdGhuYW1lICAgICAgICAgICAqLworICAgIEZUX0xvbmcgICAgICAgICBmaWxlX3NpemU7ICAvKiBmaWxlIHNpemUgaW4gYnl0ZXMgICAgICAgICAgICAgICAgICovCisKKyAgfSBGVF9PczJGaWxlUmVjLCAqRlRfT3MyRmlsZTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogV2UgdXNlIHRoZSBtYWNybyBTVFJFQU1fTmFtZSgpIGFzIGEgY29udmVuaWVuY2UgdG8gcmV0dXJuIGEgZ2l2ZW4gICAgICovCisgIC8qIEFOU0kgcmVzb3VyY2UncyBwYXRobmFtZS4gIEl0cyBgc3RyZWFtJyBhcmd1bWVudCBpcyBhIEZUX1Jlc291cmNlICAgICAqLworICAvKiB3aGljaCBpcyB0eXBlY2FzdGVkIHRvIHRoZSBGVF9PczJGaWxlIGNsYXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFNUUkVBTV9OYW1lKCBzdHJlYW0gKSAgKChGVF9PczJGaWxlKXN0cmVhbS0+cmVzb3VyY2UpLT5wYXRobmFtZQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBXZSB1c2UgdGhlIG1hY3JvIFNUUkVBTV9GaWxlKCkgYXMgYSBjb252ZW5pZW5jZSB0byBleHRyYWN0IHRoZSAgICAgICAgKi8KKyAgLyogc3lzdGVtLXNwZWNpZmljIHN0cmVhbSBoYW5kbGUgZnJvbSBhIGdpdmVuIEZyZWVUeXBlIHN0cmVhbSBvYmplY3QuICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBTVFJFQU1fRmlsZShzdHJlYW0pICAoKEhGSUxFKXN0cmVhbS0+c3RyZWFtX2lkLnBvaW50ZXIpCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBPczJGaWxlX09wZW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gb3BlbiBhIHN5c3RlbS1zdHJlYW0gZm9yIGEgZ2l2ZW4gICAgICAgICAgKi8KKyAgLyogICAgcmVzb3VyY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBOb3RlIHRoYXQgaXQgbXVzdCB1cGRhdGUgdGhlIHRhcmdldCBGcmVlVHlwZSBzdHJlYW0gb2JqZWN0IHdpdGggICAgKi8KKyAgLyogICAgdGhlIHN5c3RlbS1zdHJlYW0gaGFuZGxlIGFuZCB0aGUgcmVzb3VyY2UncyBzaXplLiAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBbHNvLCB0aGUgYHN0cmVhbS0+YmFzZScgZmllbGQgbXVzdCBiZSBzZXQgdG8gTlVMTCBmb3IgZGlzay1iYXNlZCAgKi8KKyAgLyogICAgcmVzb3VyY2VzLCBhbmQgdG8gdGhlIGFkZHJlc3MgaW4gbWVtb3J5IG9mIHRoZSByZXNvdXJjZSdzIGZpcnN0ICAgICovCisgIC8qICAgIGJ5dGUgZm9yIG1lbW9yeS1iYXNlZCBvbmVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHJlc291cmNlIDo6IFRoZSBzb3VyY2UgcmVzb3VyY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzdHJlYW0gICA6OiBUaGUgdGFyZ2V0IHN0cmVhbSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGUgc3RyZWFtIG9iamVjdCBJUyBOT1QgQ1JFQVRFRCBieSB0aGlzIGZ1bmN0aW9uLCBidXQgYnkgaXRzICAgICAgKi8KKyAgLyogICAgY2FsbGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBzdGF0aWMKKyAgRlRfRXJyb3IgIE9zMkZpbGVfT3BlbiggRlRfT3MyRmlsZSAgcmVzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgIHN0cmVhbSApCisgIHsKKyAgICBIRklMRSAgZmlsZTsKKyAgICBVTE9ORyAgdWxBY3Rpb247CisKKworICAgIC8qIG9wZW4gdGhlIGZpbGUgKi8KKyNpZmRlZiBfX0VNWF9fCisgICAgaWYgKCBEb3NPcGVuKCAoRlRfQnl0ZSopcmVzb3VyY2UtPnBhdGhuYW1lLAorICAgICAgICAgICAgICAgICAgJmZpbGUsCisgICAgICAgICAgICAgICAgICAmdWxBY3Rpb24sIDAsIDAsIE9QRU5fQUNUSU9OX09QRU5fSUZfRVhJU1RTLAorICAgICAgICAgICAgICAgICAgT1BFTl9TSEFSRV9ERU5ZTk9ORSB8IE9QRU5fQUNDRVNTX1JFQURPTkxZLAorICAgICAgICAgICAgICAgICAgTlVMTCApICkKKyNlbHNlCisgICAgaWYgKCBEb3NPcGVuKCByZXNvdXJjZS0+cGF0aG5hbWUsCisgICAgICAgICAgICAgICAgICAmZmlsZSwKKyAgICAgICAgICAgICAgICAgICZ1bEFjdGlvbiwgMCwgMCwgT1BFTl9BQ1RJT05fT1BFTl9JRl9FWElTVFMsCisgICAgICAgICAgICAgICAgICBPUEVOX1NIQVJFX0RFTllOT05FIHwgT1BFTl9BQ0NFU1NfUkVBRE9OTFksCisgICAgICAgICAgICAgICAgICBOVUxMICkgKQorI2VuZGlmICAvKiBfX0VNWF9fICovCisgICAgeworICAgICAgUEVSUk9SKCggIk9zMkZpbGVfT3BlbjogQ291bGQgbm90IG9wZW4gZmlsZSBgJXMnXG4iLAorICAgICAgICAgICAgICAgcmVzb3VyY2UtPnBhdGhuYW1lICkpOworICAgICAgcmV0dXJuIEZUX0Vycl9DYW5ub3RfT3Blbl9TdHJlYW07CisgICAgfQorCisgICAgLyogY29tcHV0ZSBmaWxlIHNpemUgaWYgbmVjZXNzYXJ5ICovCisgICAgaWYgKCByZXNvdXJjZS0+ZmlsZV9zaXplIDwgMCApCisgICAgeworICAgICAgRG9zU2V0RmlsZVB0ciggZmlsZSwgMCwgRklMRV9FTkQsIChVTE9ORyopJnJlc291cmNlLT5maWxlX3NpemUgKTsKKyAgICAgIERvc1NldEZpbGVQdHIoIGZpbGUsIDAsIEZJTEVfQkVHSU4sICZ1bEFjdGlvbiApOworICAgIH0KKworICAgIHN0cmVhbS0+cmVzb3VyY2UgICAgICAgICAgPSAoRlRfUmVzb3VyY2UpcmVzb3VyY2U7CisgICAgc3RyZWFtLT5zdHJlYW1faWQucG9pbnRlciA9ICh2b2lkKilmaWxlOworICAgIHN0cmVhbS0+c2l6ZSAgICAgICAgICAgICAgPSByZXNvdXJjZS0+ZmlsZV9zaXplOworCisgICAgLyogaXQncyBhIGRpc2stYmFzZWQgcmVzb3VyY2UsIHdlIGRvbid0IG5lZWQgdG8gdXNlIHRoZSAiYmFzZSIgYW5kICAgKi8KKyAgICAvKiAiY3Vyc29yIiBmaWVsZHMgb2YgdGhlIHN0cmVhbSBvYmplY3RzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIHN0cmVhbS0+YmFzZSAgICAgICAgICAgICAgPSBOVUxMOworICAgIHN0cmVhbS0+Y3Vyc29yICAgICAgICAgICAgPSBOVUxMOworCisgICAgUFRSQUNFMSgoICJPczJGaWxlX09wZW46IE9wZW5lZCBgJXMnICglZCBieXRlcykgc3VjY2Vzc2Z1bGx5XG4iLAorICAgICAgICAgICAgICByZXNvdXJjZS0+cGF0aG5hbWUsIHJlc291cmNlLT5maWxlX3NpemUgKSk7CisKKyAgICByZXR1cm4gRlRfRXJyX09rOworICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBPczJGaWxlX0Nsb3NlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBDbG9zZXMgYSBnaXZlbiBzdHJlYW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzdHJlYW0gOjogVGhlIHRhcmdldCBzdHJlYW0gb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0YXRpYworICBGVF9FcnJvciAgT3MyRmlsZV9DbG9zZSggRlRfU3RyZWFtICBzdHJlYW0gKQorICB7CisgICAgUFRSQUNFMSgoICJPUzJGaWxlX0Nsb3NlOiBDbG9zaW5nIGZpbGUgYCVzJ1xuIiwgU1RSRUFNX05hbWUoIHN0cmVhbSApICkpOworCisgICAgRG9zQ2xvc2UoIFNUUkVBTV9GaWxlKCBzdHJlYW0gKSApOworCisgICAgc3RyZWFtLT5yZXNvdXJjZSAgICAgICAgICA9IE5VTEw7CisgICAgc3RyZWFtLT5zdHJlYW1faWQucG9pbnRlciA9IE5VTEw7CisgICAgc3RyZWFtLT5zaXplICAgICAgICAgICAgICA9IDA7CisKKyAgICByZXR1cm4gRlRfRXJyX09rOworICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBPczJGaWxlX1NlZWsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBTZWVrcyBhIHN0cmVhbSB0byBhIGdpdmVuIHBvc2l0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzdHJlYW0gICA6OiBUaGUgdGFyZ2V0IHN0cmVhbSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgcG9zaXRpb24gOjogVGhlIG9mZnNldCBpbiBieXRlcyBmcm9tIHRoZSBzdGFydCBvZiB0aGUgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgIHJlc291cmNlL3N0cmVhbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoZSBgc2VlaycgbWV0aG9kIGlzIG5ldmVyIGNhbGxlZCBieSB0aGUgc3RyZWFtIG1hbmFnZXIgaW4gY2FzZSAgICAqLworICAvKiAgICBvZiBhIG1lbW9yeS1iYXNlZCByZXNvdXJjZSAoaS5lLiwgd2hlbiBgc3RyZWFtLT5iYXNlJyBpc24ndCBOVUxMKS4gKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0YXRpYworICBGVF9FcnJvciAgT3MyRmlsZV9TZWVrKCBGVF9TdHJlYW0gIHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICBwb3NpdGlvbiApCisgIHsKKyAgICBVTE9ORyAgaWJBY3R1YWw7CisKKworICAgIGlmICggRG9zU2V0RmlsZVB0ciggU1RSRUFNX0ZpbGUoIHN0cmVhbSApLCBwb3NpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZJTEVfQkVHSU4sICZpYkFjdHVhbCApICkKKyAgICB7CisgICAgICBQRVJST1IoKCAiT3MyRmlsZV9TZWVrOiBGQUlMRUQhIFBvcy4gJWxkIG9mIGAlcydcbiIsCisgICAgICAgICAgICAgICBwb3NpdGlvbiwgU1RSRUFNX05hbWUoIHN0cmVhbSApICkpOworCisgICAgICByZXR1cm4gRlRfRXJyX0ludmFsaWRfU3RyZWFtX1NlZWs7CisgICAgfQorCisgICAgUFRSQUNFMigoICJPczJGaWxlX1NlZWs6IFBvcy4gJWxkIG9mIGAlcydcbiIsCisgICAgICAgICAgICAgIHBvc2l0aW9uLCBTVFJFQU1fTmFtZSggc3RyZWFtICkgKSk7CisKKyAgICByZXR1cm4gRlRfRXJyX09rOworICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBPczJGaWxlX1NraXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBTa2lwcyBhIGdpdmVuIG51bWJlciBvZiBieXRlcyBpbiBhbiBPUy8yIHN0cmVhbS4gIFVzZWZ1bCB0byBza2lwICAgKi8KKyAgLyogICAgcGFkIGJ5dGVzLCBmb3IgZXhhbXBsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgc3RyZWFtIDo6IFRoZSB0YXJnZXQgc3RyZWFtIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGNvdW50ICA6OiBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHNraXAgaW4gdGhlIHN0cmVhbS4gICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoZSBgc2tpcCcgbWV0aG9kIGlzIG5ldmVyIGNhbGxlZCBieSB0aGUgc3RyZWFtIG1hbmFnZXIgaW4gY2FzZSAgICAqLworICAvKiAgICBvZiBhIG1lbW9yeS1iYXNlZCByZXNvdXJjZSAoaS5lLiwgd2hlbiBgc3RyZWFtLT5iYXNlJyBpc24ndCBOVUxMKS4gKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0YXRpYworICBGVF9FcnJvciAgT3MyRmlsZV9Ta2lwKCBGVF9TdHJlYW0gIHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICBjb3VudCApCisgIHsKKyAgICBVTE9ORyAgaWJBY3R1YWw7CisKKworICAgIERvc1NldEZpbGVQdHIoIFNUUkVBTV9GaWxlKCBzdHJlYW0gKSwgMCwgRklMRV9DVVJSRU5ULCAmaWJBY3R1YWwgKTsKKyAgICByZXR1cm4gT3MyRmlsZV9TZWVrKCBzdHJlYW0sIGliQWN0dWFsICsgY291bnQgKTsKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgT3MyRmlsZV9Qb3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgUmV0dXJucyB0aGUgY3VycmVudCBvZmZzZXQgd2l0aGluIGFuIE9TLzIgc3RyZWFtJ3MgcmVzb3VyY2UuICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgc3RyZWFtICAgOjogVGhlIHRhcmdldCBzdHJlYW0gb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgcG9zaXRpb24gOjogVGhlIGN1cnJlbnQgb2Zmc2V0LiAgLTEgaW4gY2FzZSBvZiBlcnJvci4gICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhlIGBwb3MnIG1ldGhvZCBpcyBuZXZlciBjYWxsZWQgYnkgdGhlIHN0cmVhbSBtYW5hZ2VyIGluIGNhc2UgICAgICovCisgIC8qICAgIG9mIGEgbWVtb3J5LWJhc2VkIHJlc291cmNlIChpLmUuLCB3aGVuIGBzdHJlYW0tPmJhc2UnIGlzbid0IE5VTEwpLiAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgc3RhdGljCisgIEZUX0Vycm9yICBPczJGaWxlX1BvcyggRlRfU3RyZWFtICBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyogICBwb3NpdGlvbiApCisgIHsKKyAgICBVTE9ORyAgaWJBY3R1YWw7CisKKworICAgIGlmICggRG9zU2V0RmlsZVB0ciggU1RSRUFNX0ZpbGUoIHN0cmVhbSApLCAwLCBGSUxFX0NVUlJFTlQsICZpYkFjdHVhbCApICkKKyAgICB7CisgICAgICBQVFJBQ0UyKCggIk9zMkZpbGVfUG9zOiBGQUlMRUQhIGluIGAlcydcbiIsIFNUUkVBTV9OYW1lKCBzdHJlYW0gKSApKTsKKyAgICAgIHJldHVybiBGVF9FcnJfSW52YWxpZF9TdHJlYW1fU2VlazsKKyAgICB9CisKKyAgICAqcG9zaXRpb24gPSBpYkFjdHVhbDsKKworICAgIFBUUkFDRTIoKCAiT3MyRmlsZV9Qb3M6IEZvciBgJXMnXG4iLCBTVFJFQU1fTmFtZSggc3RyZWFtICkgKSk7CisgICAgcmV0dXJuIEZUX0Vycl9PazsKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgT3MyRmlsZV9SZWFkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgUmVhZHMgYSBnaXZlbiBudW1iZXIgb2YgYnl0ZXMgZnJvbSBhbiBPUy8yIHN0cmVhbSBpbnRvIG1lbW9yeS4gICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgc3RyZWFtICAgICA6OiBUaGUgdGFyZ2V0IHN0cmVhbSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGJ1ZmZlciAgICAgOjogVGhlIHRhcmdldCByZWFkIGJ1ZmZlciB3aGVyZSBkYXRhIGlzIGNvcGllZC4gICAgICAgICAqLworICAvKiAgICBzaXplICAgICAgIDo6IFRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZCBmcm9tIHRoZSBzdHJlYW0uICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICByZWFkX2J5dGVzIDo6IFRoZSBudW1iZXIgb2YgYnl0ZXMgZWZmZWN0aXZlbHkgcmVhZCBmcm9tIHRoZSAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICBzdHJlYW0uICBVc2VkIGluIGNhc2Ugb2YgZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgKGkuZS4gRlRfRXJyX0ludmFsaWRfU3RyZWFtX1JlYWQpIGJ5IHNvbWUgcGFydHMgb2YgICAqLworICAvKiAgICAgICAgICAgICAgICAgIHRoZSBsaWJyYXJ5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgSXQgTVVTVCByZXR1cm4gdGhlIGVycm9yIEZUX0Vycl9JbnZhbGlkX1N0cmVhbV9SZWFkIGluIGNhc2Ugb2YgICAgICAqLworICAvKiAgIGFuIG92ZXItcmVhZCAoaS5lLiwgcmVhZGluZyBtb3JlIGJ5dGVzIGZyb20gdGhlIHN0cmVhbSB0aGF0IHdoYXQgICAgKi8KKyAgLyogICBpcyBsZWZ0KSwgYXMgdGhlIHN0cmVhbSBjb21wb25lbnQgY2hlY2tzIGZvciB0aGlzIHNwZWNpZmljIHZhbHVlLiAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIFRoZSBgcmVhZCcgbWV0aG9kIGlzIG5ldmVyIGNhbGxlZCBieSB0aGUgc3RyZWFtIG1hbmFnZXIgaW4gY2FzZSAgICAgKi8KKyAgLyogICBvZiBhIG1lbW9yeS1iYXNlZCByZXNvdXJjZSAoaS5lLiwgd2hlbiBgc3RyZWFtLT5iYXNlJyBpc24ndCBOVUxMKS4gICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBzdGF0aWMKKyAgRlRfRXJyb3IgIE9zMkZpbGVfUmVhZCggRlRfU3RyZWFtICBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqICAgICAgYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcqICAgcmVhZF9ieXRlcyApCisgIHsKKyAgICBVTE9ORyAgY2JBY3R1YWw7CisKKworICAgIERvc1JlYWQoIFNUUkVBTV9GaWxlKCBzdHJlYW0gKSwgYnVmZmVyLCBzaXplLCAmY2JBY3R1YWwgKTsKKworICAgICpyZWFkX2J5dGVzID0gY2JBY3R1YWw7CisKKyAgICBpZiAoIGNiQWN0dWFsICE9IChVTE9ORylzaXplICkKKyAgICB7CisgICAgICAvKiBOb3RlIDogd2UgY2FuIGhhdmUgYW4gb3Zlci1yZWFkIGhlcmUgd2hlbiBjYWxsZWQgYnkgdGhlICovCisgICAgICAvKiAgICAgICAgZnVuY3Rpb24gRlRfQWNjZXNzX0NvbXByZXNzZWRfRnJhbWUuIFRoaXMgbWVhbnMgICovCisgICAgICAvKiAgICAgICAgdGhhdCB0aGUgZm9sbG93aW5nIG1lc3NhZ2Ugc2hvdWxkIGJlIGEgdHJhY2UsICAgICovCisgICAgICAvKiAgICAgICAgcmF0aGVyIHRoYW4gYW4gZXJyb3IgZm9yIGRpc2stYmFzZWQgcmVzb3VyY2VzLi4gICovCisgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAvKiAgICAgICAgdGhlIGZ1bmN0aW9uIG11c3Qgc2V0IHRoZSB2YWx1ZSBvZiAncmVhZF9ieXRlcycgICovCisgICAgICAvKiAgICAgICAgZXZlbiBpZiBpdCByZXR1cm5zIGFuIGVycm9yIGNvZGUuLiAgICAgICAgICAgICAgICovCisgICAgICBQVFJBQ0UyKCggIk9zMkZpbGVfUmVhZDogRkFJTEVEISAgUmVhZCAlbGQgYnl0ZXMgZnJvbSAnJXMnXG4iLAorICAgICAgICAgICAgICAgc2l6ZSwgU1RSRUFNX05hbWUoIHN0cmVhbSApICkpOworCisgICAgICByZXR1cm4gRlRfRXJyX0ludmFsaWRfU3RyZWFtX1JlYWQ7CisgICAgfQorCisgICAgUFRSQUNFMigoICJPczJGaWxlX1JlYWQ6IFJlYWQgJWxkIGJ5dGVzIHRvIGJ1ZmZlciAweCUwOGx4IGZyb20gYCVzJ1xuIiwKKyAgICAgICAgICAgICAgc2l6ZSwgKGxvbmcpYnVmZmVyLCBTVFJFQU1fTmFtZSggc3RyZWFtICkgKSk7CisgICAgcmV0dXJuIEZUX0Vycl9PazsKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBUaGUgZm9sbG93aW5nIHRhYmxlIGlzIHRoZSBgdmlydHVhbCBtZXRob2QgdGFibGUnIGZvciB0aGUgYE9TLzIgICAgICAgKi8KKyAgLyogcmVzb3VyY2UgY2xhc3MnLCB3aGljaCBtZXRob2RzIGFyZSBkZWZpbmVkIGFib3ZlLiAgSXRzIGFkZHJlc3MgaXMgc2V0ICovCisgIC8qIGluIHRoZSBgaW50ZXJmYWNlJyBmaWVsZCBvZiBhbGwgcmVzb3VyY2Ugb2JqZWN0cyBjcmVhdGVkIGJ5IHRoZSAgICAgICAqLworICAvKiBmdW5jdGlvbiBGVF9DcmVhdGVfT3MyRmlsZSgpIChzZWUgYmVsb3cpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0YXRpYworICBGVFJlc19JbnRlcmZhY2VSZWMgIEZUX09zMkZpbGVfSW50ZXJmYWNlID0KKyAgeworICAgIChGVFJlc19PcGVuX0Z1bmMpICAgICAgICBPczJGaWxlX09wZW4sCisgICAgKEZUUmVzX0Nsb3NlX0Z1bmMpICAgICAgIE9zMkZpbGVfQ2xvc2UsCisgICAgKEZUUmVzX1NlZWtfRnVuYykgICAgICAgIE9zMkZpbGVfU2VlaywKKyAgICAoRlRSZXNfU2tpcF9GdW5jKSAgICAgICAgT3MyRmlsZV9Ta2lwLAorICAgIChGVFJlc19Qb3NfRnVuYykgICAgICAgICBPczJGaWxlX1BvcywKKyAgICAoRlRSZXNfUmVhZF9GdW5jKSAgICAgICAgT3MyRmlsZV9SZWFkLAorICB9OworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfQ3JlYXRlX1Jlc291cmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQ3JlYXRlcyBhIG5ldyByZXNvdXJjZSBvYmplY3QuICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgICAgICovCisgIC8qICAgIEZUX05ld19SZXNvdXJjZSgpIGZ1bmN0aW9uIG9mIHRoZSBiYXNlIGxheWVyLiAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGxpYnJhcnkgICA6OiBUaGUgaW5wdXQgbGlicmFyeSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBwYXRobmFtZSAgOjogVGhlIGZpbGUncyBwYXRobmFtZSBhcyBhbiBBU0NJSSBzdHJpbmcuICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBhcmVzb3VyY2UgOjogQSBoYW5kbGUgdG8gbmV3IHJlc291cmNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBFcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGlzIGZ1bmN0aW9ucyBkb2VzIG5vdCBvcGVuIGEgc3RyZWFtLiAgSXQgc2ltcGx5IGNvcGllcyB0aGUgICAgICAgKi8KKyAgLyogICAgcGF0aG5hbWUgd2l0aGluIGEgZnJlc2ggbmV3IHJlc291cmNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBFWFBPUlRfRlVOQworICBGVF9FcnJvciAgRlRfQ3JlYXRlX1Jlc291cmNlKCBGVF9MaWJyYXJ5ICAgIGxpYnJhcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICAgcGF0aG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1Jlc291cmNlKiAgYXJlc291cmNlICkKKyAgeworICAgIEZUX0ludCAgICAgIGxlbjsKKyAgICBGVF9PczJGaWxlICByZXNvdXJjZTsKKyAgICBGVF9FcnJvciAgICBlcnJvcjsKKyAgICBGVF9TeXN0ZW0gICBzeXN0ZW07CisKKworICAgIGlmICggIWxpYnJhcnkgKQorICAgICAgcmV0dXJuIEZUX0Vycl9JbnZhbGlkX0xpYnJhcnlfSGFuZGxlOworCisgICAgc3lzdGVtID0gbGlicmFyeS0+c3lzdGVtOworCisgICAgaWYgKCAhcGF0aG5hbWUgKQorICAgICAgZ290byBGYWlsX051bGw7CisKKyAgICBsZW4gPSBzdHJsZW4oIHBhdGhuYW1lICk7CisgICAgaWYgKCBsZW4gPT0gMCApCisgICAgICBnb3RvIEZhaWxfTnVsbDsKKworICAgIHJlc291cmNlID0gTlVMTDsKKworICAgIGlmICggQUxMT0MoIHJlc291cmNlLCBzaXplb2YgKCAqcmVzb3VyY2UgKSApIHx8CisgICAgICAgICBBTExPQyggcmVzb3VyY2UtPnBhdGhuYW1lLCBsZW4gKyAxICkgICAgKQorICAgICAgZ290byBGYWlsX01lbW9yeTsKKworICAgIHJlc291cmNlLT5yb290LmxpYnJhcnkgICA9IGxpYnJhcnk7CisgICAgcmVzb3VyY2UtPnJvb3QuaW50ZXJmYWNlID0gJkZUX09zMkZpbGVfSW50ZXJmYWNlOworICAgIHJlc291cmNlLT5yb290LmZsYWdzICAgICA9IEZUX1JFU09VUkNFX1RZUEVfRElTS19CQVNFRDsKKyAgICByZXNvdXJjZS0+ZmlsZV9zaXplICAgICAgPSAtMTsKKyAgICBzdHJjcHkoIHJlc291cmNlLT5wYXRobmFtZSwgcGF0aG5hbWUgKTsKKworICAgIFBUUkFDRTEoKCAiQ3JlYXRlX09zMkZpbGU6IE9TLzIgcmVzb3VyY2UgY3JlYXRlZCBmb3IgJyVzJ1xuIiwKKyAgICAgICAgICAgICAgcGF0aG5hbWUgKSk7CisKKyAgICAqYXJlc291cmNlID0gKEZUX1Jlc291cmNlKXJlc291cmNlOworICAgIHJldHVybiBGVF9FcnJfT2s7CisKKyAgRmFpbF9OdWxsOgorICAgIFBFUlJPUigoICJDcmVhdGVfT3MyRmlsZTogTnVsbCBwYXRobmFtZSFcbiIgKSk7CisgICAgcmV0dXJuIEZUX0Vycl9JbnZhbGlkX0FyZ3VtZW50OworCisgIEZhaWxfTWVtb3J5OgorICAgIGlmICggcmVzb3VyY2UgKQorICAgICAgRlJFRSggcmVzb3VyY2UtPnBhdGhuYW1lICk7CisgICAgRlJFRSggcmVzb3VyY2UgKTsKKyAgICBQRVJST1IoKCAiQ3JlYXRlX09zMkZpbGU6IE5vdCBlbm91Z2ggbWVtb3J5IHRvIGNyZWF0ZSByZXNvdXJjZSFcbiIgKSk7CisgICAgcmV0dXJuIGVycm9yOworICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9EZXN0cm95X1Jlc291cmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBEaXNjYXJkcyBhIGdpdmVuIHJlc291cmNlIG9iamVjdCBleHBsaWNpdGx5LiAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICByZXNvdXJjZSA6OiBUaGUgT1MvMiByZXNvdXJjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IGNoZWNrIHdoZXRoZXIgcnVucyBvciBzdHJlYW1zIGFyZSBvcGVuZWQgICAgKi8KKyAgLyogICAgZm9yIHRoZSByZXNvdXJjZSAoZm9yIG5vdywgd2UgYXNzdW1lIGRldmVsb3BlciBpbnRlbGxpZ2VuY2UuICAgICAgICovCisgIC8qICAgIFdlJ2xsIG1vc3QgcHJvYmFibHkgbG93ZXIgb3VyIHN0YW5kYXJkIGxhdGVyIHRvIGVhc2UgZGVidWdnaW5nIDotKSAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgRVhQT1JUX0ZVTkMKKyAgRlRfRXJyb3IgIEZUX0Rlc3Ryb3lfUmVzb3VyY2UoIEZUX1Jlc291cmNlICByZXNvdXJjZSApCisgIHsKKyAgICBGVF9TeXN0ZW0gICBzeXN0ZW0gPSByZXNvdXJjZS0+bGlicmFyeS0+c3lzdGVtOworICAgIEZUX09zMkZpbGUgIGFuc2kgICA9IChGVF9PczJGaWxlKXJlc291cmNlOworCisgICAgaWYgKCAhYW5zaSB8fCBhbnNpLT5yb290LmludGVyZmFjZSAhPSAmRlRfT3MyRmlsZV9JbnRlcmZhY2UgKQorICAgIHsKKyAgICAgIFBFUlJPUigoCisgICAgICAgICJEZXN0cm95X09zMkZpbGU6IFRyeWluZyB0byBkZXN0cm95IGFuIGludmFsaWQgcmVzb3VyY2UhXG4iICkpOworICAgICAgcmV0dXJuIEZUX0Vycl9JbnZhbGlkX1Jlc291cmNlX0hhbmRsZTsKKyAgICB9CisKKyAgICBQVFJBQ0UxKCggIkRlc3Ryb3lfT3MyRmlsZTogRGVzdHJveWluZyByZXNvdXJjZSBmb3IgYCVzJ1xuIiwKKyAgICAgICAgICAgICAgYW5zaS0+cGF0aG5hbWUgKSk7CisKKyAgICBGUkVFKCBhbnNpLT5wYXRobmFtZSApOworICAgIEZSRUUoIGFuc2kgKTsKKworICAgIHJldHVybiBGVF9FcnJfT2s7CisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgIE1FTU9SWSBNQU5BR0VNRU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogIFRoaXMgcGFydCBjb3BpZXMgdGhlIG9sZCBGcmVlVHlwZSAxLjAgYW5kIDEuMSBtZW1vcnkgbWFuYWdlbWVudCAgICAgICovCisgIC8qICBzY2hlbWUgdGhhdCB3YXMgZGVmaW5lZCBpbiB0aGUgZmlsZSBgdHRtZW1vcnkuaCcuICBPbmUgY2FuIHNlZSB0aGF0ICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogIC0gYSBzZXQgb2YgbWFjcm9zIGlzIGRlZmluZWQgZm9yIHRoZSBtZW1vcnkgb3BlcmF0aW9ucyB1c2VkIGJ5IHRoZSAgICovCisgIC8qICAgIGVuZ2luZSAoTUVNX0NvcHkoKSwgTUVNX01vdmUoKSwgTUVNX1NldCgpKS4gIFRoaXMgY29tZXMgZnJvbSB0aGUgICAqLworICAvKiAgICBmYWN0IHRoYXQgbWFueSBjb21waWxlcnMgYXJlIGFibGUgdG8gaW5saW5lIHRoZXNlIG9wZXJhdGlvbnMgICAgICAgKi8KKyAgLyogICAgZGlyZWN0bHkgd2l0aGluIHRoZSBjb21waWxlZCBjb2RlLCByYXRoZXIgdGhhbiBnZW5lcmF0aW5nIGEgY2FsbCAgICovCisgIC8qICAgIHRvIHRoZSBDIGxpYnJhcnkuICBIb3dldmVyLCB0aGlzIG9ibGlnZXMgdXMgdG8gaW5jbHVkZSB0aGUgICAgICAgICAqLworICAvKiAgICBgPHN0cmluZy5oPicgaGVhZGVyIGZpbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIElmIHlvdSBwcm92aWRlIHlvdXIgb3duIG1lbW9yeSBvcGVyYXRpb25zLCB5b3UgY2FuIGdldCByaWQgb2YgdGhlICAqLworICAvKiAgICBgI2luY2x1ZGUgPHN0cmluZy5oPicgYmVsb3cuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgLSB0aGUgRlRfQWxsb2MoKSBmdW5jdGlvbiBoYXMgc2V2ZXJhbCBlc3NlbnRpYWwgcHJvcGVydGllcyB0aGF0IE1VU1QgKi8KKyAgLyogICAgYmUgcmV0YWluZWQgYnkgZWFjaCBwb3J0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAtIEl0IHJldHVybnMgYW4gZXJyb3IgY29kZSwgTk9UIHRoZSBhbGxvY2F0ZWQgYmxvY2sncyBiYXNlICAgICAgICAgKi8KKyAgLyogICAgICBhZGRyZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAtIEl0IHRha2VzIHRoZSBhZGRyZXNzIG9mIGEgdGFyZ2V0IHBvaW50ZXIsIHdoZXJlIHRoZSBibG9jaydzIGJhc2UgKi8KKyAgLyogICAgICBhZGRyZXNzIHdpbGwgYmUgc2V0LiAgSWYgdGhlIHNpemUgaXMgemVybywgaXRzIHZhbHVlIHdpbGwgYmUgICAgICovCisgIC8qICAgICAgTlVMTCwgYW5kIHRoZSBmdW5jdGlvbiByZXR1cm5zIHN1Y2Nlc3NmdWxseS4gICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgLSBJbiBjYXNlIG9mIGVycm9yLCB0aGUgcG9pbnRlcidzIHZhbHVlIGlzIHNldCB0byBOVUxMIGFuZCBhbiAgICAgICovCisgIC8qICAgICAgZXJyb3IgY29kZSBpcyByZXR1cm5lZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgLSBUaGUgbmV3IGFsbG9jYXRlZCBibG9jayBNVVNUIGJlIHplcm8tZmlsbGVkLiAgVGhpcyBpcyBhIHN0cm9uZyAgICovCisgIC8qICAgICAgY29udmVudGlvbiB0aGUgcmVzdCBvZiB0aGUgZW5naW5lIHJlbGllcyBvbi4gICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAtIHRoZSBGVF9GcmVlKCkgZnVuY3Rpb24gaGFzIGFsc28gaXRzIGVzc2VudGlhbHM6ICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgLSBJdCB0YWtlcyB0aGUgYWRkcmVzcyBvZiBhIHBvaW50ZXIgd2hpY2ggdmFsdWUgaXMgdGhlIGJsb2NrJ3MgICAgICovCisgIC8qICAgICAgYmFzZSBhZGRyZXNzLiAgVGhpcyBpcyBVTkxJS0UgYSBzdGFuZGFyZCBgZnJlZSgpJyB3aGljaCB0YWtlcyAgICAqLworICAvKiAgICAgIHRoZSBibG9jaydzIGJhc2UgZGlyZWN0bHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIC0gSXQgYWNjZXB0cyBzdWNjZXNzZnVsbHkgdGhlIGFkZHJlc3Mgb2YgYSBwb2ludGVyIHdoaWNoIHZhbHVlIGlzICAqLworICAvKiAgICAgIE5VTEwsIGluIHdoaWNoIGNhc2UgaXQgc2ltcGx5IHJldHVybnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIC0gVGhlIHBvaW50ZXIgaXMgYWx3YXlzIHNldCB0byBOVUxMIGJ5IHRoZSBmdW5jdGlvbi4gICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAtIFRoZSBNRU1fQWxsb2MoKSwgQUxMT0MoKSwgYW5kIEFMTE9DX0FSUkFZKCkgbWFjcm9zIGFyZSB1c2VkIGJ5IHRoZSAqLworICAvKiAgICBsaWJyYXJ5IGFuZCBzaG91bGQgTk9UIGJlIG1vZGlmaWVkIGJ5IHBvcnRlcnMhICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0ICAgICAgKi8KKyAgLyogcGFyYW1ldGVyIG9mIHRoZSBQVFJBQ0UoKSBhbmQgUEVSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZyAgICAgICovCisgIC8qIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyN1bmRlZiAgRlRfQ09NUE9ORU5UCisjZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfbWVtb3J5CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9BbGxvYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBbGxvY2F0ZXMgYSBuZXcgYmxvY2sgb2YgbWVtb3J5LiAgVGhlIHJldHVybmVkIGFyZWEgaXMgYWx3YXlzICAgICAgKi8KKyAgLyogICAgemVyby1maWxsZWQsIHRoaXMgaXMgYSBzdHJvbmcgY29udmVudGlvbiBpbiBtYW55IEZyZWVUeXBlIHBhcnRzLiAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgc3lzdGVtIDo6IEEgaGFuZGxlIHRvIGEgZ2l2ZW4gYHN5c3RlbSBvYmplY3QnIHdoZXJlIGFsbG9jYXRpb24gICAgICovCisgIC8qICAgICAgICAgICAgICBvY2N1cnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgc2l6ZSAgIDo6IFRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSBibG9jayB0byBhbGxvY2F0ZS4gICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgUCAgICAgIDo6IEEgcG9pbnRlciB0byB0aGUgZnJlc2ggbmV3IGJsb2NrLiAgSXQgc2hvdWxkIGJlIHNldCB0byAgICovCisgIC8qICAgICAgICAgICAgICBOVUxMIGlmIGBzaXplJyBpcyAwLCBvciBpbiBjYXNlIG9mIGVycm9yLiAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgQkFTRV9GVU5DCisgIEZUX0Vycm9yICBGVF9BbGxvYyggRlRfU3lzdGVtICBzeXN0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICBzaXplLAorICAgICAgICAgICAgICAgICAgICAgIHZvaWQqKiAgICAgUCApCisgIHsKKyAgICBpZiAoICFQICkKKyAgICB7CisgICAgICBQRVJST1IoKCAiRlRfQWxsb2M6IEludmFsaWQgcG9pbnRlciBhZGRyZXNzIVxuIiApKTsKKyAgICAgIHJldHVybiBGVF9FcnJfSW52YWxpZF9Bcmd1bWVudDsKKyAgICB9CisKKyAgICBpZiAoIHNpemUgPiAwICkKKyAgICB7CisgICAgICAqUCA9IG1hbGxvYyggc2l6ZSApOworICAgICAgaWYgKCAhKlAgKQorICAgICAgeworICAgICAgICBQRVJST1IoKCAiRlRfQWxsb2M6IE91dCBvZiBtZW1vcnkgKCVsZCBieXRlcyByZXF1ZXN0ZWQpIVxuIiwKKyAgICAgICAgICAgICAgICAgc2l6ZSApKTsKKworICAgICAgICByZXR1cm4gRlRfRXJyX091dF9PZl9NZW1vcnk7CisgICAgICB9CisKKyAgICAgIHN5c3RlbS0+dG90YWxfYWxsb2MgKz0gc2l6ZTsKKworICAgICAgLyogQUxXQVlTIFpFUk8tRklMTCBUSEUgQkxPQ0shICovCisgICAgICBNRU1fU2V0KCAqUCwgMCwgc2l6ZSApOworICAgIH0KKyAgICBlbHNlCisgICAgICAqUCA9IE5VTEw7CisKKyAgICBQVFJBQ0UyKCggIkZUX0FsbG9jOiBTaXplID0gJWxkLCBwb2ludGVyID0gMHglMDhseCwgYmxvY2sgPSAweCUwOGx4XG4iLAorICAgICAgICAgICAgICBzaXplLCAobG9uZylQLCAobG9uZykqUCApKTsKKworICAgIHJldHVybiBGVF9FcnJfT2s7CisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX1JlYWxsb2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFJlYWxsb2NhdGVzIGEgYmxvY2sgb2YgbWVtb3J5IHBvaW50ZWQgdG8gYnkgYCpQJyB0byBgU2l6ZScgYnl0ZXMgICAqLworICAvKiAgICBmcm9tIHRoZSBoZWFwLCBwb3NzaWJseSBjaGFuZ2luZyBgKlAnLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzeXN0ZW0gOjogQSBoYW5kbGUgdG8gYSBnaXZlbiBgc3lzdGVtIG9iamVjdCcgd2hlcmUgYWxsb2NhdGlvbiAgICAgKi8KKyAgLyogICAgICAgICAgICAgIG9jY3Vycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzaXplICAgOjogVGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIGJsb2NrIHRvIGFsbG9jYXRlLiAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBQICAgICAgOjogQSBwb2ludGVyIHRvIHRoZSBmcmVzaCBuZXcgYmxvY2suICBJdCBzaG91bGQgYmUgc2V0IHRvICAgKi8KKyAgLyogICAgICAgICAgICAgIE5VTEwgaWYgYHNpemUnIGlzIDAsIG9yIGluIGNhc2Ugb2YgZXJyb3IuICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBCQVNFX0ZVTkMKKyAgRlRfRXJyb3IgIEZUX1JlYWxsb2MoIEZUX1N5c3RlbSAgc3lzdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCoqICAgICBQICkKKyAgeworICAgIHZvaWQqICBROworCisKKyAgICBpZiAoICFQICkKKyAgICB7CisgICAgICBQRVJST1IoKCAiRlRfUmVhbGxvYzogSW52YWxpZCBwb2ludGVyIGFkZHJlc3MhXG4iICkpOworICAgICAgcmV0dXJuIEZUX0Vycl9JbnZhbGlkX0FyZ3VtZW50OworICAgIH0KKworICAgIC8qIGlmIHRoZSBvcmlnaW5hbCBwb2ludGVyIGlzIE5VTEwsIGNhbGwgRlRfQWxsb2MoKSAqLworICAgIGlmICggISpQICkKKyAgICAgIHJldHVybiBGVF9BbGxvYyggc3lzdGVtLCBzaXplLCBQICk7CisKKyAgICAvKiBpZiB0aGUgbmV3IGJsb2NrIGlmIHplcm8tc2l6ZWQsIGNsZWFyIHRoZSBjdXJyZW50IG9uZSAqLworICAgIGlmICggc2l6ZSA8PSAwICkKKyAgICAgIHJldHVybiBGVF9GcmVlKCBzeXN0ZW0sIFAgKTsKKworICAgIFEgPSAodm9pZCopcmVhbGxvYyggKlAsIHNpemUgKTsKKyAgICBpZiAoICFRICkKKyAgICB7CisgICAgICBQRVJST1IoKCAiRlRfUmVhbGxvYzogUmVhbGxvY2F0aW9uIGZhaWxlZCFcbiIgKSk7CisgICAgICByZXR1cm4gRlRfRXJyX091dF9PZl9NZW1vcnk7CisgICAgfQorCisgICAgKlAgPSBROworICAgIHJldHVybiBGVF9FcnJfT2s7CisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0ZyZWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFJlbGVhc2VzIGEgZ2l2ZW4gYmxvY2sgb2YgbWVtb3J5IGFsbG9jYXRlZCB0aHJvdWdoIEZUX0FsbG9jKCkuICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHN5c3RlbSA6OiBBIGhhbmRsZSB0byBhIGdpdmVuIGBzeXN0ZW0gb2JqZWN0JyB3aGVyZSBhbGxvY2F0aW9uICAgICAqLworICAvKiAgICAgICAgICAgICAgb2NjdXJlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFAgICAgICA6OiBUaGlzIGlzIHRoZSBfYWRkcmVzc18gb2YgYSBfcG9pbnRlcl8gd2hpY2ggcG9pbnRzIHRvIHRoZSAqLworICAvKiAgICAgICAgICAgICAgYWxsb2NhdGVkIGJsb2NrLiAgSXQgaXMgYWx3YXlzIHNldCB0byBOVUxMIG9uIGV4aXQuICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBJZiBQIG9yICpQIGFyZSBOVUxMLCB0aGlzIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gc3VjY2Vzc2Z1bGx5LiAgICAgKi8KKyAgLyogICAgVGhpcyBpcyBhIHN0cm9uZyBjb252ZW50aW9uIHdpdGhpbiBhbGwgb2YgRnJlZVR5cGUgYW5kIGl0cyAgICAgICAgICovCisgIC8qICAgIGRyaXZlcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgQkFTRV9GVU5DCisgIEZUX0Vycm9yICBGVF9GcmVlKCBGVF9TeXN0ZW0gIHN5c3RlbSwKKyAgICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAqUCApCisgIHsKKyAgICBVTlVTRUQoIHN5c3RlbSApOworCisgICAgUFRSQUNFMigoICJGVF9GcmVlOiBGcmVlaW5nIHBvaW50ZXIgMHglMDhseCAoYmxvY2sgMHglMDhseClcbiIsCisgICAgICAgICAgICAgIChsb25nKVAsIChQID8gKGxvbmcpKlAgOiAtMSkgKSk7CisKKyAgICBpZiAoICFQIHx8ICEqUCApCisgICAgICByZXR1cm4gRlRfRXJyX09rOworCisgICAgZnJlZSggKlAgKTsKKyAgICAqUCA9IE5VTEw7CisKKyAgICByZXR1cm4gRlRfRXJyX09rOworICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICBTWU5DSFJPTklaQVRJT04gTUFOQUdFTUVOVCAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgVGhpcyBzZWN0aW9uIGRlYWxzIHdpdGggbXV0ZXhlcy4gIFRoZSBsaWJyYXJ5IGNhbiBiZSBjb21waWxlZCB0byAgICAqLworICAvKiAgIHR3byBkaXN0aW5jdCB0aHJlYWQgc3VwcG9ydCBsZXZlbHMgKG5hbWVseSBzaW5nbGUgdGhyZWFkZWQgYW5kICAgICAgKi8KKyAgLyogICByZS1lbnRyYW50IG1vZGVzKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIEl0IHByb3RlY3RzIGl0cyB2YXJpYWJsZXMgdGhyb3VnaCB0aGUgTVVURVhfTG9jaygpIGFuZCAgICAgICAgICAgICAgKi8KKyAgLyogICBNVVRFWF9SZWxlYXNlKCkgbWFjcm9zIHdoaWNoIGFyZSB2b2lkIGluIHNpbmdsZSB0aHJlYWRlZCBtb2RlLiAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIEl0IGRlZmluZXMgYSB0eXBlbGVzcyBtdXRleCByZWZlcmVuY2UgdHlwZSwgYEZUX011dGV4JywgdGhhdCB5b3UncmUgKi8KKyAgLyogICBmcmVlIHRvIHJlZGVmaW5lIGZvciB5b3VyIHN5c3RlbSdzIG5lZWRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIGZ0c3lzLmMgY29udGFpbnMgb25seSBkdW1teSBmdW5jdGlvbnMgKi8KKyAgLyogICB3aGljaCBhbHdheXMgcmV0dXJuIHN1Y2Nlc3NmdWxseS4gIFlvdSBORUVEIHRvIHNwZWNpYWxpemUgdGhlbSBpbiAgICovCisgIC8qICAgb3JkZXIgdG8gcG9ydCBmdHN5cy5jIHRvIGFueSBtdWx0aS10aHJlYWRlZCBlbnZpcm9ubWVudC4gICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQgICAgICAqLworICAvKiBwYXJhbWV0ZXIgb2YgdGhlIFBUUkFDRSgpIGFuZCBQRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nICAgICAgKi8KKyAgLyogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI3VuZGVmICBGVF9DT01QT05FTlQKKyNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV9zeW5jCisKKworI2lmZGVmIEZUX0NPTkZJR19USFJFQURTCisKKyAgQkFTRV9GVU5DCisgIEZUX0Vycm9yICBGVF9NdXRleF9DcmVhdGUoIEZUX1N5c3RlbSAgc3lzdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTXV0ZXgqICAgIG11dGV4ICkKKyAgeworICAgIFVOVVNFRCggc3lzdGVtICk7CisKKyAgICBtdXRleCA9ICh2b2lkKiktMTsKKyAgICBzeXN0ZW0tPm51bV9tdXRleGVzKys7CisKKyAgICAvKiBJbnNlcnQgeW91ciBvd24gbXV0ZXggY3JlYXRpb24gY29kZSBoZXJlICovCisKKyAgICByZXR1cm4gRlRfRXJyX09rOworICB9CisKKworICBCQVNFX0ZVTkMKKyAgdm9pZCAgRlRfTXV0ZXhfRGVsZXRlKCBGVF9TeXN0ZW0gIHN5c3RlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBUTXV0ZXgqICAgIG11dGV4ICkKKyAgeworICAgIFVOVVNFRCggc3lzdGVtICk7CisKKyAgICBtdXRleCA9ICh2b2lkKikwOworICAgIHN5c3RlbS0+bnVtX211dGV4ZXMtLTsKKworICAgIC8qIEluc2VydCB5b3VyIG93biBtdXRleCBkZXN0cnVjdGlvbiBjb2RlIGhlcmUgKi8KKyAgfQorCisKKyAgQkFTRV9GVU5DCisgIHZvaWQgIEZUX011dGV4X0xvY2soIEZUX1N5c3RlbSAgc3lzdGVtLAorICAgICAgICAgICAgICAgICAgICAgICBUTXV0ZXgqICAgIG11dGV4ICkKKyAgeworICAgIC8qIE5PVEU6IEl0IGlzIGxlZ2FsIHRvIGNhbGwgdGhpcyBmdW5jdGlvbiB3aXRoIGEgTlVMTCBhcmd1bWVudCAqLworICAgIC8qICAgICAgIGluIHdoaWNoIGNhc2UgYW4gaW1tZWRpYXRlIHJldHVybiBpcyBhcHByb3ByaWF0ZS4gICAgICAqLworCisgICAgVU5VU0VEKCBzeXN0ZW0gKTsKKworICAgIGlmICggIW11dGV4ICkKKyAgICAgIHJldHVybjsKKworICAgIC8qIEluc2VydCB5b3VyIG93biBtdXRleCBsb2NraW5nIGNvZGUgaGVyZSAqLworICB9CisKKworICBCQVNFX0ZVTkMKKyAgdm9pZCAgRlRfTXV0ZXhfUmVsZWFzZSggRlRfU3lzdGVtICBzeXN0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRNdXRleCogICAgbXV0ZXggKQorICB7CisgICAgLyogTk9URTogSXQgaXMgbGVnYWwgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uIHdpdGggYSBOVUxMIGFyZ3VtZW50ICovCisgICAgLyogICAgICAgaW4gd2hpY2ggY2FzZSBhbiBpbW1lZGlhdGUgcmV0dXJuIGlzIGFwcHJvcHJpYXRlICAgICAgICovCisKKyAgICBVTlVTRUQoIHN5c3RlbSApOworCisgICAgaWYgKCAhbXV0ZXggKQorICAgICAgcmV0dXJuOworCisgICAgLyogSW5zZXJ0IHlvdXIgb3duIG11dGV4IHJlbGVhc2UgY29kZSBoZXJlICovCisgIH0KKworI2VuZGlmIC8qIEZUX0NPTkZJR19USFJFQURTICovCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9OZXdfU3lzdGVtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gY3JlYXRlIGFuZCBpbml0aWFsaXplIG5ldyBzeXN0ZW0gb2JqZWN0cy4gKi8KKyAgLyogICAgVGhlc2UgYXJlIG1haW5seSB1c2VkIHRvIGxldCBjbGllbnQgYXBwbGljYXRpb25zIGFuZCBmb250IHNlcnZlcnMgICovCisgIC8qICAgIHNwZWNpZnkgdGhlaXIgb3duIG1lbW9yeSBhbGxvY2F0b3JzIGFuZCBzeW5jaHJvbml6YXRpb24gICAgICAgICAgICAqLworICAvKiAgICBwcm9jZWR1cmVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzeXN0ZW0gOjogQSBoYW5kbGUgdG8gYSBnaXZlbiBgc3lzdGVtIG9iamVjdCcuICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEVYUE9SVF9GVU5DCisgIEZUX0Vycm9yICBGVF9OZXdfU3lzdGVtKCBGVF9TeXN0ZW0qICBzeXN0ZW0gKQorICB7CisgICAgKnN5c3RlbSA9IChGVF9TeXN0ZW0pbWFsbG9jKCBzaXplb2YgKCAqKnN5c3RlbSApICk7CisKKyAgICBpZiAoICEqc3lzdGVtICkKKyAgICAgIHJldHVybiBGVF9FcnJfT3V0X09mX01lbW9yeTsKKworICAgIC8qIGluaXRpYWxpemUgbWVtb3J5IG1hbmFnZW1lbnQgKi8KKworICAgICgqc3lzdGVtKS0+c3lzdGVtX2ZsYWdzID0gRlRfU1lTVEVNX0ZMQUdfVE9UQUxfQUxMT0MgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU1lTVEVNX0ZMQUdfTVVURVhFUzsKKyAgICAoKnN5c3RlbSktPnRvdGFsX2FsbG9jID0gMDsKKyAgICAoKnN5c3RlbSktPm51bV9tdXRleGVzID0gMDsKKworICAgIC8qIGluaXRpYWxpemUgaS9vIG1hbmFnZW1lbnQgKG5vdGhpbmcpICovCisKKyAgICAvKiBpbml0aWFsaXplIHN5bmNocm9uaXNhdGlvbiAobm90aGluZykgKi8KKworICAgIC8qIGluaXRpYWxpemUgc3RyZWFtcyAobm90aGluZykgKi8KKworICAgIHJldHVybiBGVF9FcnJfT2s7CisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0RvbmVfU3lzdGVtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIERlc3Ryb3lzIGEgZ2l2ZW4gRnJlZVR5cGUgc3lzdGVtIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHN5c3RlbSA6OiBBIGhhbmRsZSB0byBhIGdpdmVuIGBzeXN0ZW0gb2JqZWN0Jy4gICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgRVhQT1JUX0ZVTkMKKyAgRlRfRXJyb3IgIEZUX0RvbmVfU3lzdGVtKCBGVF9TeXN0ZW0gIHN5c3RlbSApCisgIHsKKyAgICAvKiBmaW5hbGl6ZSBzeW5jaHJvbml6YXRpb24gKG5vdGhpbmcpICovCisKKyAgICAvKiBmaW5hbGl6ZSBpL28gbWFuYWdlbWVudCAobm90aGluZykgICovCisKKyAgICAvKiBmaW5hbGl6ZSBtZW1vcnkgbWFuYWdlbWVudCAgICAgICAgICovCisKKyAgICBmcmVlKCBzeXN0ZW0gKTsKKworICAgIHJldHVybiBGVF9FcnJfT2s7CisgIH0KKworCisvKiBFTkQgKi8KZGlmZiAtLWdpdCBhL2NvbmZpZy9vczIvZnRzeXN0ZW0uYyBiL2NvbmZpZy9vczIvZnRzeXN0ZW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTlmNjY4Ci0tLSAvZGV2L251bGwKKysrIGIvY29uZmlnL29zMi9mdHN5c3RlbS5jCkBAIC0wLDAgKzEsMjE0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgZnRzeXN0ZW0uaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4wCisgKgorICogICAgQU5TSS1zcGVjaWZpYyBGcmVlVHlwZSBsb3ctbGV2ZWwgc3lzdGVtIGludGVyZmFjZQorICoKKyAqICAgIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZGVmaW5pdGlvbiBvZiBpbnRlcmZhY2UgdXNlZCBieSBGcmVlVHlwZQorICogICAgdG8gYWNjZXNzIGxvdy1sZXZlbCwgaS5lLiBtZW1vcnkgbWFuYWdlbWVudCwgaS9vIGFjY2VzcyBhcyB3ZWxsCisgKiAgICBhcyB0aHJlYWQgc3luY2hyb25pc2F0aW9uLiAgICAgICAgICAgICAgCisgKgorICoKKyAqICBDb3B5cmlnaHQgMTk5Ni0xOTk5IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQgICAgICAgICAgCisgKiAgbW9kaWZpZWQgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICAgIAorICogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgICAKKyAqICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICAgIAorICogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxmdHN5c3RlbS5oPgorI2luY2x1ZGUgPGZ0ZXJyb3JzLmg+CisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICBNRU1PUlkgTUFOQUdFTUVOVCBJTlRFUkZBQ0UgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiA8RnVuY1R5cGU+CisgKiAgICBGVF9BbGxvY19GdW5jCisgKgorICogPERlc2NyaXB0aW9uPgorICogICAgVGhlIG1lbW9yeSBhbGxvY2F0b3IgZnVuY3Rpb24gdHlwZQorICoKKyAqIDxJbnB1dD4KKyAqICAgIHN5c3RlbSAgICA6OiBwb2ludGVyIHRvIHRoZSBzeXN0ZW0gb2JqZWN0CisgKiAgICBzaXplICAgICAgOjogcmVxdWVzdGVkIHNpemUgaW4gYnl0ZXMKKyAqCisgKiA8T3V0cHV0PgorICogICAgYmxvY2sgICAgIDo6IGFkZHJlc3Mgb2YgbmV3bHkgYWxsb2NhdGVkIGJsb2NrCisgKgorICogPFJldHVybj4gIAorICogICAgRXJyb3IgY29kZS4gMCBtZWFucyBzdWNjZXNzLgorICoKKyAqIDxOb3RlPgorICogICAgSWYgeW91ciBhbGxvY2F0aW9uIHJvdXRpbmUgQUxXQVlTIHplcm9lcyB0aGUgbmV3IGJsb2NrLCB5b3UKKyAqICAgIHNob3VsZCBzZXQgdGhlIGZsYWcgRlRfU1lTVEVNX0ZMQUdfQUxMT0NfWkVST0VTIGluIHlvdXIgc3lzdGVtCisgKiAgICBvYmplY3QgJ2ZsYWdzJyBmaWVsZC4KKyAqCisgKiAgICBJZiB5b3UgaGF2ZSBzZXQgdGhlIGZsYWcgRlRfU1lTVEVNX0ZMQUdfUkVQT1JUX0NVUlJFTlRfQUxMT0MgaW4KKyAqICAgIHlvdXIgc3lzdGVtJ3MgInN5c3RlbV9mbGFncyIgZmllbGQsIHRoaXMgZnVuY3Rpb24gc2hvdWxkIHVwZGF0ZQorICogICAgdGhlICJjdXJyZW50X2FsbG9jIiBmaWVsZCBvZiB0aGUgc3lzdGVtIG9iamVjdC4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIHN0YXRpYworICB2b2lkKiAgZnRfYWxsb2MoIEZUX01lbW9yeSAgbWVtb3J5LAorICAgICAgICAgICAgICAgICAgIGxvbmcgICAgICAgc2l6ZSApCisgIHsKKyAgICAodm9pZCltZW1vcnk7CisgICAgcmV0dXJuIG1hbGxvYyhzaXplKTsKKyAgfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiA8RnVuY1R5cGU+CisgKiAgICBGVF9SZWFsbG9jX0Z1bmMKKyAqCisgKiA8RGVzY3JpcHRpb24+CisgKiAgICBUaGUgbWVtb3J5IHJlYWxsb2NhdG9yIGZ1bmN0aW9uIHR5cGUKKyAqCisgKiA8SW5wdXQ+CisgKiAgICBzeXN0ZW0gICA6OiBwb2ludGVyIHRvIHRoZSBzeXN0ZW0gb2JqZWN0CisgKiAgICBuZXdfc2l6ZSA6OiBuZXcgcmVxdWVzdGVkIHNpemUgaW4gYnl0ZXMKKyAqCisgKiA8SW5PdXQ+CisgKiAgICBibG9jayAgICA6OiBhZGRyZXNzIG9mIGJsb2NrIGluIG1lbW9yeQorICoKKyAqIDxSZXR1cm4+CisgKiAgICBFcnJvciBjb2RlLiAwIG1lYW5zIHN1Y2Nlc3MuCisgKgorICogPE5vdGU+CisgKiAgICBUaGlzIGZ1bmN0aW9uIGlzIF9uZXZlcl8gY2FsbGVkIHdoZW4gdGhlIHN5c3RlbSBmbGFnIAorICogICAgRlRfU1lTVEVNX0ZMQUdfTk9fUkVBTExPQyBpcyBzZXQuIEluc3RlYWQsIHRoZSBlbmdpbmUgd2lsbCBlbXVsYXRlCisgKiAgICByZWFsbG9jIHRocm91Z2ggImFsbG9jIiBhbmQgImZyZWUiLgorICoKKyAqICAgIE5vdGUgdGhhdCB0aGlzIGlzIHBvc3NpYmxlIGR1ZSB0byB0aGUgZmFjdCB0aGF0IEZyZWVUeXBlJ3MKKyAqICAgICJGVF9SZWFsbG9jIiBhbHdheXMgcmVxdWVzdHMgdGhlIF9jdXJyZW50XyBzaXplIG9mIHRoZSByZWFsbG9jYXRlZAorICogICAgYmxvY2sgYXMgYSBwYXJhbWV0ZXIsIHRodXMgYXZvaWRpbmcgbWVtb3J5IGxlYWtzLgorICoKKyAqICAgIElmIHlvdSBoYXZlIHNldCB0aGUgZmxhZyBGVF9TWVNURU1fRkxBR19SRVBPUlRfQ1VSUkVOVF9BTExPQyBpbgorICogICAgeW91ciBzeXN0ZW0ncyAic3lzdGVtX2ZsYWdzIiBmaWVsZCwgdGhpcyBmdW5jdGlvbiBzaG91bGQgdXBkYXRlCisgKiAgICB0aGUgImN1cnJlbnRfYWxsb2MiIGZpZWxkIG9mIHRoZSBzeXN0ZW0gb2JqZWN0LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgc3RhdGljCisgIHZvaWQqICBmdF9yZWFsbG9jKCBGVF9NZW1vcnkgIG1lbW9yeSwKKyAgICAgICAgICAgICAgICAgICAgIGxvbmcgICAgICAgY3VyX3NpemUsCisgICAgICAgICAgICAgICAgICAgICBsb25nICAgICAgIG5ld19zaXplLAorICAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICBibG9jayApCisgIHsKKyAgICAodm9pZCltZW1vcnk7CisgICAgKHZvaWQpY3VyX3NpemU7CisKKyAgICByZXR1cm4gcmVhbGxvYyggYmxvY2ssIG5ld19zaXplICk7CisgIH0KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogPEZ1bmNUeXBlPgorICogICAgRlRfRnJlZV9GdW5jCisgKgorICogPERlc2NyaXB0aW9uPgorICogICAgVGhlIG1lbW9yeSByZWxlYXNlIGZ1bmN0aW9uIHR5cGUKKyAqCisgKiA8SW5wdXQ+CisgKiAgICBzeXN0ZW0gIDo6IHBvaW50ZXIgdG8gdGhlIHN5c3RlbSBvYmplY3QKKyAqICAgIGJsb2NrICAgOjogYWRkcmVzcyBvZiBibG9jayBpbiBtZW1vcnkKKyAqCisgKiA8Tm90ZT4KKyAqICAgIElmIHlvdSBoYXZlIHNldCB0aGUgZmxhZyBGVF9TWVNURU1fRkxBR19SRVBPUlRfQ1VSUkVOVF9BTExPQyBpbgorICogICAgeW91ciBzeXN0ZW0ncyAic3lzdGVtX2ZsYWdzIiBmaWVsZCwgdGhpcyBmdW5jdGlvbiBzaG91bGQgdXBkYXRlCisgKiAgICB0aGUgImN1cnJlbnRfYWxsb2MiIGZpZWxkIG9mIHRoZSBzeXN0ZW0gb2JqZWN0LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgc3RhdGljCisgIHZvaWQgIGZ0X2ZyZWUoIEZUX01lbW9yeSAgbWVtb3J5LAorICAgICAgICAgICAgICAgICB2b2lkKiAgICAgIGJsb2NrICkKKyAgeworICAgICh2b2lkKW1lbW9yeTsKKyAgICBmcmVlKCBibG9jayApOworICB9CisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICBSRVNPVVJDRSBNQU5BR0VNRU5UIElOVEVSRkFDRSAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworCisjZGVmaW5lIFNUUkVBTV9GSUxFKHN0cmVhbSkgICgoRklMRSopc3RyZWFtLT5kZXNjcmlwdG9yLnBvaW50ZXIpCisKKyAgc3RhdGljCisgIHZvaWQgIGZ0X2Nsb3NlX3N0cmVhbSggRlRfU3RyZWFtICBzdHJlYW0gKQorICB7CisgICAgZmNsb3NlKCBTVFJFQU1fRklMRShzdHJlYW0pICk7CisgIH0KKworICBzdGF0aWMKKyAgdW5zaWduZWQgbG9uZyAgZnRfaW9fc3RyZWFtKCBGVF9TdHJlYW0gICAgICBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqICAgICAgICAgIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICBjb3VudCApCisgIHsKKyAgICBGSUxFKiAgZmlsZTsKKyAgICAKKyAgICBmaWxlID0gU1RSRUFNX0ZJTEUoc3RyZWFtKTsKKworICAgIGZzZWVrKCBmaWxlLCBvZmZzZXQsIFNFRUtfU0VUICk7ICAgIAorICAgIHJldHVybiAodW5zaWduZWQgbG9uZylmcmVhZCggYnVmZmVyLCBjb3VudCwgMSwgZmlsZSApOworICB9CisKKworICBleHRlcm4KKyAgaW50ICBGVF9OZXdfU3RyZWFtKCBjb25zdCBjaGFyKiAgZmlsZXBhdGhuYW1lLAorICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgICBzdHJlYW0gKQorICB7CisgICAgRklMRSogIGZpbGU7CisgICAgCisgICAgZmlsZSA9IGZvcGVuKCBmaWxlcGF0aG5hbWUsICJyYiIgKTsKKyAgICBpZiAoIWZpbGUpCisgICAgICByZXR1cm4gRlRfRXJyX0Nhbm5vdF9PcGVuX1Jlc291cmNlOworICAgICAgCisgICAgZnNlZWsoIGZpbGUsIDAsIFNFRUtfRU5EICk7CisgICAgc3RyZWFtLT5zaXplID0gZnRlbGwoZmlsZSk7CisgICAgZnNlZWsoIGZpbGUsIDAsIFNFRUtfU0VUICk7CisgICAgCisgICAgc3RyZWFtLT5kZXNjcmlwdG9yLnBvaW50ZXIgPSBmaWxlOworICAgIHN0cmVhbS0+cG9zICAgICAgICAgICAgICAgID0gMDsKKyAgICAKKyAgICBzdHJlYW0tPnJlYWQgID0gZnRfaW9fc3RyZWFtOworICAgIHN0cmVhbS0+Y2xvc2UgPSBmdF9jbG9zZV9zdHJlYW07CisKKyAgICByZXR1cm4gMDsKKyAgfQorCisKKyAgZXh0ZXJuCisgIEZUX01lbW9yeSAgRlRfTmV3X01lbW9yeSggdm9pZCApCisgIHsKKyAgICBGVF9NZW1vcnkgIG1lbW9yeTsKKyAgICAKKyAgICBtZW1vcnkgPSAoRlRfTWVtb3J5KW1hbGxvYyggc2l6ZW9mKCptZW1vcnkpICk7CisgICAgaWYgKG1lbW9yeSkKKyAgICB7CisgICAgICBtZW1vcnktPnVzZXIgICAgPSAwOworICAgICAgbWVtb3J5LT5hbGxvYyAgID0gZnRfYWxsb2M7CisgICAgICBtZW1vcnktPnJlYWxsb2MgPSBmdF9yZWFsbG9jOworICAgICAgbWVtb3J5LT5mcmVlICAgID0gZnRfZnJlZTsKKyAgICB9CisgICAgcmV0dXJuIG1lbW9yeTsKKyAgfQorCmRpZmYgLS1naXQgYS9jb25maWcvb3MyL21ha2VmaWxlLmRldmVsIGIvY29uZmlnL29zMi9tYWtlZmlsZS5kZXZlbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzkwZjc5Ci0tLSAvZGV2L251bGwKKysrIGIvY29uZmlnL29zMi9tYWtlZmlsZS5kZXZlbApAQCAtMCwwICsxLDE5MiBAQAorIyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyMqCisjKiAgRnJlZVR5cGUgMiBDb25maWd1cmF0aW9uIHJ1bGVzIGZvciBVbml4ICsgZ2NjCisjKgorIyogIENvcHlyaWdodCAxOTk2LTE5OTkgYnkKKyMqICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisjKgorIyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZAorIyogIG1vZGlmaWVkIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyMqICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyMqICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyMqICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisjKgorIyoKKyMqICBUaGUgcHVycG9zZSBvZiB0aGlzIHN1Yi1NYWtlZmlsZSBpcyB0byBkZWZpbmUgdmFyaW91cyBidWlsZCBhbmQKKyMqICBwbGF0Zm9ybSBzcGVjaWZpYyB2YXJpYWJsZXMgYmVmb3JlIGluY2x1ZGluZyB0aGUgc3ViLU1ha2VmaWxlCisjKiAgY29udGFpbmluZyB0aGUgRnJlZVR5cGUgbGlicmFyeSBydWxlcywgZm91bmQgaW4KKyMqCisjKiAgICAgJChUT1ApL2NvbmZpZy9mcmVldHlwZS5taworIyoKKyMqICBUaGUgZm9sbG93aW5nIHZhcmlhYmxlcyBtdXN0IGJlIGRlZmluZWQgYmVmb3JlIGluY2x1ZGluZyB0aGlzCisjKiAgZmlsZSA6CisjKgorIyogICAgIFRPUCAgICAgICAgICBQYXRobmFtZSB0byB0aGUgdG9wIG9mIHRoZSBGcmVlVHlwZSBzb3VyY2VzCisjKiAgICAgICAgICAgICAgICAgIGhpZXJhcmNoeQorIyoKKyMqICBUaGlzIGZpbGUgc2hvdWxkIGRlZmluZSB0aGUgZm9sbG93aW5nIHZhcmlhYmxlcyBiZWZvcmUgaW5jbHVkaW5nCisjKiAgdGhlIEZyZWVUeXBlIGxpYnJhcnkgcnVsZXMgZmlsZSA6CisjKgorIyogICAgIEJVSUxEICAgICAgICBQYXRobmFtZSB0byB0aGUgcGxhdGZvcm0tc3BlY2lmaWMgZmlsZXMgdXNlZAorIyogICAgICAgICAgICAgICAgICBmb3IgdGhlIGJ1aWxkLiBVc3VhbGx5IGAkKFRPUCkvY29uZmlnLzxzeXN0ZW0+JworIyoKKyMqICAgICBTRVAgICAgICAgICAgRGlyZWN0b3J5IHNlcGFyYXRvciBmb3IgdGhlIGN1cnJlbnQgcGxhdGZvcm0uCisjKiAgICAgICAgICAgICAgICAgIEVpdGhlciAvIG9yIFwgKG1heWJlIDogb24gTWFjcykKKyMqIAorIyogICAgIERFTEVURSAgICAgICBUaGUgZm9yY2VkIHJlbW92ZS9kZWxldGUgY29tbWFuZCB0byBlcmFzZSBvbmUgb3IgbW9yZQorIyogICAgICAgICAgICAgICAgICBmaWxlcworIyoKKyMqICAgICBJTkNMVURFICAgICAgVGhlIGxvY2F0aW9uIG9mIGFsbCBwdWJsaWMgaGVhZGVyIGZpbGVzLiBlLmcuCisjKiAgICAgICAgICAgICAgICAgIGAkKFRPUCkvaW5jbHVkZSdpbmNsdWRlJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorIyogICAgIFNSQyAgICAgICAgICBUaGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgYWxsIHNvdXJjZXMuIGUuZy4gICAgICAgICAgICAgIAorIyogICAgICAgICAgICAgICAgICAnJChUT1ApL3NyYycgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisjKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorIyogICAgIE9CSl9ESVIgICAgICBUaGUgbG9jYXRpb24gd2hlcmUgY29tcGlsZWQgb2JqZWN0IGZpbGVzIHdpbGwgYmUgICAgICAgICAKKyMqICAgICAgICAgICAgICAgICAgcGxhY2VkLCBlLmcuICckKFRPUCkvb2JqJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorIyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyMqICAgICBMSUJfRElSICAgICAgVGhlIGxvY2F0aW9uIHdoZXJlIHRoZSByZXN1bHRpbmcgbGlicmFyeSBmaWxlIHdpbGwgYmUgICAgCisjKiAgICAgICAgICAgICAgICAgIHBsYWNlZCwgZS5nLiAnJChUT1ApL29iaicgICAgICAgICAgICAgICAgICAgICAgICAKKyMqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisjKiAgICAgTElCUkFSWSAgICAgIFRoZSBmaWxlbmFtZSBvZiB0aGUgcmVzdWx0aW5nIGxpYnJhcnkgZmlsZSwgd2l0aG91dCAgICAgIAorIyogICAgICAgICAgICAgICAgICBpdHMgZXh0ZW5zaW9uLi4gZS5nLiAnbGliZnJlZXR5cGUnIG9yICdmcmVldHlwZScgICAgICAgICAKKyMqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisjKiAgICAgTyAgICAgICAgICAgIFRoZSBvYmplY3QgZmlsZSBzdWZmaXguICBDYW4gYmUgJy5vJywgJy5vYmosJyAnLmxvLCcgICAgIAorIyogICAgICAgICAgICAgICAgICAnO2NvZmYsJyBldGMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyMqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisjKiAgICAgQSAgICAgICAgICAgIFRoZSBsaWJyYXJ5IGZpbGUgc3VmZml4LiAgQ2FuIGJlICcuYScgJy5zbywnICcubGliJyAgICAgIAorIyogICAgICAgICAgICAgICAgICAnLmRsbCwnIGV0Yy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyMqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisjKiAgICAgSSAgICAgICAgICAgIFRoZSBwYXRoIGluY2x1c2lvbiBmbGFnLiAgU29tZSBjb21waWxlcnMgdXNlIGEgICAgICAgICAgIAorIyogICAgICAgICAgICAgICAgICBkaWZmZXJlbnQgZmxhZyB0aGFuICctSScgdG8gc3BlY2lmeSBhbiBhZGRpdGlvbmFsICAgICAgICAKKyMqICAgICAgICAgICAgICAgICAgaW5jbHVkZSBwYXRoLiAgRXhhbXBsZXMgYXJlICcvaT0nIG9yICctSiAnLCBldGMuICAgICAgICAgCisjKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorIyogICAgIEQgICAgICAgICAgICBUaGUgbWFjcm8gZGVmaW5pdGlvbiBmbGFnLiAgSSBoYXZlbid0IG1ldCBjb21waWxlcnMgICAgICAKKyMqICAgICAgICAgICAgICAgICAgd2hpY2ggZG9uJ3QgdXNlIHRoZSAnLUQnIHN3aXRjaCB0byBkZWZpbmUgYSBtYWNybywgYnV0ICAgCisjKiAgICAgICAgICAgICAgICAgIHdobyBrbm93cy4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorIyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyMqICAgICBUICAgICAgICAgICAgVGhlIGNvbXBpbGF0aW9uIGZsYWcgdXNlZCB0byBpZGVudGlmeSB0aGUgdGFyZ2V0LiBTb21lICAgCisjKiAgICAgICAgICAgICAgICAgIGNvbXBpbGVycyB1c2UgYSBkaWZmZXJlbnQgZmxhZyB0aGFuICctbyAnIHRvIHNwZWNpZnkgICAgIAorIyogICAgICAgICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgdGFyZ2V0IG9iamVjdCBmaWxlLiAgICAgICAgICAgICAgICAgICAgICAKKyMqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisjKiAgICAgQ0ZMQUdTICAgICAgIFRoZSBzZXQgb2YgZmxhZ3MgdXNlZCB0byBjb21waWxlIG9iamVjdCBmaWxlcy4KKyMqICAgICAgICAgICAgICAgICAgKHVzdWFsbHkgY29udGFpbnMgdGhlIGZsYWcgJy1jJykuCisjKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorIyoKKyMqCisjKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCitERUxFVEUgICA6PSBkZWwKK1NFUCAgICAgIDo9IC8KK0JVSUxEICAgIDo9ICQoVE9QKS9jb25maWcvb3MyCitQTEFURk9STSA6PSBvczIKK0NDICAgICAgIDo9IGdjYworCisjIHRoZSBkaXJlY3Rvcnkgd2hlcmUgYWxsIG9iamVjdCBmaWxlcyBhcmUgcGxhY2VkCisjCitPQkpfRElSIDo9ICQoVE9QKS9vYmoKKworCisjIHRoZSBkaXJlY3Rvcnkgd2hlcmUgYWxsIGxpYnJhcnkgZmlsZXMgYXJlIHBsYWNlZAorIworIyAgYnkgZGVmYXVsdCwgdGhpcyBpcyB0aGUgc2FtZSBhcyBPQkpfRElSLCBob3dldmVyLCB0aGlzIGNhbiBiZQorIyAgY2hhbmdlZCB0byBzdWl0IHBhcnRpY3VsYXIgbmVlZHMuLgorIworTElCX0RJUiA6PSAkKE9CSl9ESVIpCisKKworIyB0aGUgb2JqZWN0IGZpbGUgZXh0ZW5zaW9uLCB0aGlzIGNhbiBiZSAubywgLnRjbywgLm9iaiwgZXRjLi4KKyMgZGVwZW5kaW5nIG9uIHRoZSBwbGF0Zm9ybQorIworTyA6PSBvCisKKyMgdGhlIGxpYnJhcnkgZmlsZSBleHRlbnNpb24sIHRoaXMgY2FuIGJlIC5hLCAubGliLCBldGMuLgorIyBkZXBlbmRpbmcgb24gdGhlIHBsYXRmb3JtCisjCitBIDo9IGEKKworCisjIFRoZSBuYW1lIG9mIHRoZSBmaW5hbCBsaWJyYXJ5IGZpbGUuCisjIE5vdGUgdGhhdCB0aGUgRE9TLXNwZWNpZmljIE1ha2VmaWxlIHVzZXMgYSBzaG9ydGVyICg4LjMpIG5hbWUKKyMKK0xJQlJBUlkgOj0gbGliZnJlZXR5cGUKKworCisjIHBhdGggaW5jbHVzaW9uIGZsYWcuCisjCisjICBTb21lIGNvbXBpbGVycyB1c2UgYSBkaWZmZXJlbnQgZmxhZyB0aGFuICctSScgdG8gc3BlY2lmeSBhbgorIyAgYWRkaXRpb25hbCBpbmNsdWRlIHBhdGguIEV4YW1wbGVzIGFyZSAiL2k9IiBvciAiLUoiLCBldGMuLi4KKyMKK0kgOj0gLUkKKworCisjIFRoZSBsaW5rIGZsYWcgdXNlZCB0byBzcGVjaWZ5IGEgZ2l2ZW4gbGlicmFyeSBmaWxlIG9uIGxpbmsuCisjIE5vdGUgdGhhdCB0aGlzIGlzIG9ubHkgdXNlZCB0byBjb21waWxlIHRoZSBkZW1vIHByb2dyYW1zLCBub3QKKyMgdGhlIGxpYnJhcnkgaXRzZWxmLgorIworTCA6PSAtTAorCisKKyMgQyBmbGFnIHVzZWQgdG8gZGVmaW5lIGEgbWFjcm8gYmVmb3JlIHRoZSBjb21waWxhdGlvbiBvZiBhIGdpdmVuCisjIHNvdXJjZSBvYmplY3QuIFVzdWFsbHkgaXMgJy1EJyBsaWtlIGluICItRERFQlVHIgorIworRCA6PSAtRAorCisKKyMgVGFyZ2V0IGZsYWcgLSBiZXdhcmUsIHRoZXJlIGlzIGEgc3BhY2UgYWZ0ZXIgdGhlICdvJyAhIQorIworIworVCA6PSAtbyAKKworIyBDIGZsYWdzCisjCisjICAgVGhlc2Ugc2hvdWxkIGNvbmNlcm4gOgorIworIyAgICAgLSBkZWJ1ZyBvdXRwdXQKKyMgICAgIC0gb3B0aW1pemF0aW9uCisjICAgICAtIHdhcm5pbmdzCisjICAgICAtIGFuc2kgY29tcGxpYW5jZS4uCisjCitpZm5kZWYgQ0ZMQUdTCitDRkxBR1MgOj0gLWMgLWcgLU8wIC1XYWxsCitlbmRpZgorCisKK2lmZGVmIEJVSUxEX0ZSRUVUWVBFCisKK2luY2x1ZGUgJChUT1ApL2NvbmZpZy9mcmVldHlwZS5taworCisKKyMgTGlicmFyaWFuIHRvIHVzZSB0byBidWlsZCB0aGUgc3RhdGljIGxpYnJhcnkKKyMKK0ZUX0xJQlJBUklBTiA6PSAkKEFSKSAtcgorCisKKyMgVGhpcyBmaW5hbCBydWxlIGlzIHVzZWQgdG8gbGluayBhbGwgb2JqZWN0IGZpbGVzIGludG8gYSBzaW5nbGUKKyMgbGlicmFyeS4gSXQgaXMgcGFydCBvZiB0aGUgc3lzdGVtLXNwZWNpZmljIHN1Yi1NYWtlZmlsZSBiZWNhdXNlIG5vdAorIyBhbGwgbGlicmFyaWFucyBhY2NlcHQgYSBzaW1wbGUgc3ludGF4IGxpa2UgOgorIworIyAgICBsaWJyYXJpYW4gbGlicmFyeV9maWxlIHtsaXN0IG9mIG9iamVjdCBmaWxlc30gCisjCiskKEZUX0xJQlJBUlkpOiAkKE9CSkVDVFNfTElTVCkKKwktJChERUxFVEUpICRACisJJChGVF9MSUJSQVJJQU4pICRAICQoT0JKRUNUU19MSVNUKQorCisKKyMgQ2xlYW5pbmcgcnVsZXMKKyMKK0RJUl9PQkogOj0gJChzdWJzdCAkKFNFUCksXCwkKE9CSl9ESVIpKQorCitjbGVhbl9mcmVldHlwZV9vYmplY3RzOgorCS1kZWwgJChESVI4T0JKKVwqLiRPCisKK2NsZWFuX2ZyZWV0eXBlX2xpYjoKKwktZGVsICQoRlRfTElCUkFSWSkKKworY2xlYW46IGNsZWFuX2ZyZWV0eXBlX29iamVjdHMKKworCisKK2VuZGlmCisKKwpkaWZmIC0tZ2l0IGEvY29uZmlnL29zMi9tYWtlZmlsZS5nY2MgYi9jb25maWcvb3MyL21ha2VmaWxlLmdjYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZmQwNDFjCi0tLSAvZGV2L251bGwKKysrIGIvY29uZmlnL29zMi9tYWtlZmlsZS5nY2MKQEAgLTAsMCArMSwxOTAgQEAKKyMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjKgorIyogIEZyZWVUeXBlIDIgQ29uZmlndXJhdGlvbiBydWxlcyBmb3IgVW5peCArIGdjYworIyoKKyMqICBDb3B5cmlnaHQgMTk5Ni0xOTk5IGJ5CisjKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorIyoKKyMqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQKKyMqICBtb2RpZmllZCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisjKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisjKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisjKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorIyoKKyMqCisjKiAgVGhlIHB1cnBvc2Ugb2YgdGhpcyBzdWItTWFrZWZpbGUgaXMgdG8gZGVmaW5lIHZhcmlvdXMgYnVpbGQgYW5kCisjKiAgcGxhdGZvcm0gc3BlY2lmaWMgdmFyaWFibGVzIGJlZm9yZSBpbmNsdWRpbmcgdGhlIHN1Yi1NYWtlZmlsZQorIyogIGNvbnRhaW5pbmcgdGhlIEZyZWVUeXBlIGxpYnJhcnkgcnVsZXMsIGZvdW5kIGluCisjKgorIyogICAgICQoVE9QKS9jb25maWcvZnJlZXR5cGUubWsKKyMqCisjKiAgVGhlIGZvbGxvd2luZyB2YXJpYWJsZXMgbXVzdCBiZSBkZWZpbmVkIGJlZm9yZSBpbmNsdWRpbmcgdGhpcworIyogIGZpbGUgOgorIyoKKyMqICAgICBUT1AgICAgICAgICAgUGF0aG5hbWUgdG8gdGhlIHRvcCBvZiB0aGUgRnJlZVR5cGUgc291cmNlcworIyogICAgICAgICAgICAgICAgICBoaWVyYXJjaHkKKyMqCisjKiAgVGhpcyBmaWxlIHNob3VsZCBkZWZpbmUgdGhlIGZvbGxvd2luZyB2YXJpYWJsZXMgYmVmb3JlIGluY2x1ZGluZworIyogIHRoZSBGcmVlVHlwZSBsaWJyYXJ5IHJ1bGVzIGZpbGUgOgorIyoKKyMqICAgICBCVUlMRCAgICAgICAgUGF0aG5hbWUgdG8gdGhlIHBsYXRmb3JtLXNwZWNpZmljIGZpbGVzIHVzZWQKKyMqICAgICAgICAgICAgICAgICAgZm9yIHRoZSBidWlsZC4gVXN1YWxseSBgJChUT1ApL2NvbmZpZy88c3lzdGVtPicKKyMqCisjKiAgICAgU0VQICAgICAgICAgIERpcmVjdG9yeSBzZXBhcmF0b3IgZm9yIHRoZSBjdXJyZW50IHBsYXRmb3JtLgorIyogICAgICAgICAgICAgICAgICBFaXRoZXIgLyBvciBcIChtYXliZSA6IG9uIE1hY3MpCisjKiAKKyMqICAgICBERUxFVEUgICAgICAgVGhlIGZvcmNlZCByZW1vdmUvZGVsZXRlIGNvbW1hbmQgdG8gZXJhc2Ugb25lIG9yIG1vcmUKKyMqICAgICAgICAgICAgICAgICAgZmlsZXMKKyMqCisjKiAgICAgSU5DTFVERSAgICAgIFRoZSBsb2NhdGlvbiBvZiBhbGwgcHVibGljIGhlYWRlciBmaWxlcy4gZS5nLgorIyogICAgICAgICAgICAgICAgICBgJChUT1ApL2luY2x1ZGUnaW5jbHVkZScgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyMqICAgICBTUkMgICAgICAgICAgVGhlIGRpcmVjdG9yeSBjb250YWluaW5nIGFsbCBzb3VyY2VzLiBlLmcuICAgICAgICAgICAgICAKKyMqICAgICAgICAgICAgICAgICAgJyQoVE9QKS9zcmMnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorIyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyMqICAgICBPQkpfRElSICAgICAgVGhlIGxvY2F0aW9uIHdoZXJlIGNvbXBpbGVkIG9iamVjdCBmaWxlcyB3aWxsIGJlICAgICAgICAgCisjKiAgICAgICAgICAgICAgICAgIHBsYWNlZCwgZS5nLiAnJChUT1ApL29iaicgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyMqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisjKiAgICAgTElCX0RJUiAgICAgIFRoZSBsb2NhdGlvbiB3aGVyZSB0aGUgcmVzdWx0aW5nIGxpYnJhcnkgZmlsZSB3aWxsIGJlICAgIAorIyogICAgICAgICAgICAgICAgICBwbGFjZWQsIGUuZy4gJyQoVE9QKS9vYmonICAgICAgICAgICAgICAgICAgICAgICAgCisjKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorIyogICAgIExJQlJBUlkgICAgICBUaGUgZmlsZW5hbWUgb2YgdGhlIHJlc3VsdGluZyBsaWJyYXJ5IGZpbGUsIHdpdGhvdXQgICAgICAKKyMqICAgICAgICAgICAgICAgICAgaXRzIGV4dGVuc2lvbi4uIGUuZy4gJ2xpYmZyZWV0eXBlJyBvciAnZnJlZXR5cGUnICAgICAgICAgCisjKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorIyogICAgIE8gICAgICAgICAgICBUaGUgb2JqZWN0IGZpbGUgc3VmZml4LiAgQ2FuIGJlICcubycsICcub2JqLCcgJy5sbywnICAgICAKKyMqICAgICAgICAgICAgICAgICAgJztjb2ZmLCcgZXRjLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisjKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorIyogICAgIEEgICAgICAgICAgICBUaGUgbGlicmFyeSBmaWxlIHN1ZmZpeC4gIENhbiBiZSAnLmEnICcuc28sJyAnLmxpYicgICAgICAKKyMqICAgICAgICAgICAgICAgICAgJy5kbGwsJyBldGMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisjKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorIyogICAgIEkgICAgICAgICAgICBUaGUgcGF0aCBpbmNsdXNpb24gZmxhZy4gIFNvbWUgY29tcGlsZXJzIHVzZSBhICAgICAgICAgICAKKyMqICAgICAgICAgICAgICAgICAgZGlmZmVyZW50IGZsYWcgdGhhbiAnLUknIHRvIHNwZWNpZnkgYW4gYWRkaXRpb25hbCAgICAgICAgCisjKiAgICAgICAgICAgICAgICAgIGluY2x1ZGUgcGF0aC4gIEV4YW1wbGVzIGFyZSAnL2k9JyBvciAnLUogJywgZXRjLiAgICAgICAgIAorIyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyMqICAgICBEICAgICAgICAgICAgVGhlIG1hY3JvIGRlZmluaXRpb24gZmxhZy4gIEkgaGF2ZW4ndCBtZXQgY29tcGlsZXJzICAgICAgCisjKiAgICAgICAgICAgICAgICAgIHdoaWNoIGRvbid0IHVzZSB0aGUgJy1EJyBzd2l0Y2ggdG8gZGVmaW5lIGEgbWFjcm8sIGJ1dCAgIAorIyogICAgICAgICAgICAgICAgICB3aG8ga25vd3MuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyMqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisjKiAgICAgVCAgICAgICAgICAgIFRoZSBjb21waWxhdGlvbiBmbGFnIHVzZWQgdG8gaWRlbnRpZnkgdGhlIHRhcmdldC4gU29tZSAgIAorIyogICAgICAgICAgICAgICAgICBjb21waWxlcnMgdXNlIGEgZGlmZmVyZW50IGZsYWcgdGhhbiAnLW8gJyB0byBzcGVjaWZ5ICAgICAKKyMqICAgICAgICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHRhcmdldCBvYmplY3QgZmlsZS4gICAgICAgICAgICAgICAgICAgICAgCisjKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorIyogICAgIENGTEFHUyAgICAgICBUaGUgc2V0IG9mIGZsYWdzIHVzZWQgdG8gY29tcGlsZSBvYmplY3QgZmlsZXMuCisjKiAgICAgICAgICAgICAgICAgICh1c3VhbGx5IGNvbnRhaW5zIHRoZSBmbGFnICctYycpLgorIyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyMqCisjKgorIyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworREVMRVRFICAgOj0gZGVsCitTRVAgICAgICA6PSAvCitCVUlMRCAgICA6PSAkKFRPUCkvY29uZmlnL29zMgorUExBVEZPUk0gOj0gb3MyCitDQyAgICAgICA6PSBnY2MKKworIyB0aGUgZGlyZWN0b3J5IHdoZXJlIGFsbCBvYmplY3QgZmlsZXMgYXJlIHBsYWNlZAorIworT0JKX0RJUiA6PSAkKFRPUCkvb2JqCisKKworIyB0aGUgZGlyZWN0b3J5IHdoZXJlIGFsbCBsaWJyYXJ5IGZpbGVzIGFyZSBwbGFjZWQKKyMKKyMgIGJ5IGRlZmF1bHQsIHRoaXMgaXMgdGhlIHNhbWUgYXMgT0JKX0RJUiwgaG93ZXZlciwgdGhpcyBjYW4gYmUKKyMgIGNoYW5nZWQgdG8gc3VpdCBwYXJ0aWN1bGFyIG5lZWRzLi4KKyMKK0xJQl9ESVIgOj0gJChPQkpfRElSKQorCisKKyMgdGhlIG9iamVjdCBmaWxlIGV4dGVuc2lvbiwgdGhpcyBjYW4gYmUgLm8sIC50Y28sIC5vYmosIGV0Yy4uCisjIGRlcGVuZGluZyBvbiB0aGUgcGxhdGZvcm0KKyMKK08gOj0gbworCisjIHRoZSBsaWJyYXJ5IGZpbGUgZXh0ZW5zaW9uLCB0aGlzIGNhbiBiZSAuYSwgLmxpYiwgZXRjLi4KKyMgZGVwZW5kaW5nIG9uIHRoZSBwbGF0Zm9ybQorIworQSA6PSBhCisKKworIyBUaGUgbmFtZSBvZiB0aGUgZmluYWwgbGlicmFyeSBmaWxlLgorIyBOb3RlIHRoYXQgdGhlIERPUy1zcGVjaWZpYyBNYWtlZmlsZSB1c2VzIGEgc2hvcnRlciAoOC4zKSBuYW1lCisjCitMSUJSQVJZIDo9IGxpYmZyZWV0eXBlCisKKworIyBwYXRoIGluY2x1c2lvbiBmbGFnLgorIworIyAgU29tZSBjb21waWxlcnMgdXNlIGEgZGlmZmVyZW50IGZsYWcgdGhhbiAnLUknIHRvIHNwZWNpZnkgYW4KKyMgIGFkZGl0aW9uYWwgaW5jbHVkZSBwYXRoLiBFeGFtcGxlcyBhcmUgIi9pPSIgb3IgIi1KIiwgZXRjLi4uCisjCitJIDo9IC1JCisKKworIyBUaGUgbGluayBmbGFnIHVzZWQgdG8gc3BlY2lmeSBhIGdpdmVuIGxpYnJhcnkgZmlsZSBvbiBsaW5rLgorIyBOb3RlIHRoYXQgdGhpcyBpcyBvbmx5IHVzZWQgdG8gY29tcGlsZSB0aGUgZGVtbyBwcm9ncmFtcywgbm90CisjIHRoZSBsaWJyYXJ5IGl0c2VsZi4KKyMKK0wgOj0gLUwKKworCisjIEMgZmxhZyB1c2VkIHRvIGRlZmluZSBhIG1hY3JvIGJlZm9yZSB0aGUgY29tcGlsYXRpb24gb2YgYSBnaXZlbgorIyBzb3VyY2Ugb2JqZWN0LiBVc3VhbGx5IGlzICctRCcgbGlrZSBpbiAiLURERUJVRyIKKyMKK0QgOj0gLUQKKworCisjIFRhcmdldCBmbGFnIC0gYmV3YXJlLCB0aGVyZSBpcyBhIHNwYWNlIGFmdGVyIHRoZSAnbycgISEKKyMKKyMKK1QgOj0gLW8gCisKKyMgQyBmbGFncworIworIyAgIFRoZXNlIHNob3VsZCBjb25jZXJuIDoKKyMKKyMgICAgIC0gZGVidWcgb3V0cHV0CisjICAgICAtIG9wdGltaXphdGlvbgorIyAgICAgLSB3YXJuaW5ncworIyAgICAgLSBhbnNpIGNvbXBsaWFuY2UuLgorIworaWZuZGVmIENGTEFHUworQ0ZMQUdTIDo9IC1jIC1nIC1PMCAtV2FsbAorZW5kaWYKKworCitpZmRlZiBCVUlMRF9GUkVFVFlQRQorCitpbmNsdWRlICQoVE9QKS9jb25maWcvZnJlZXR5cGUubWsKKworIyBBIHJ1bGUgdXNlZCB0byBjbGVhbiBhbGwgb2JqZWN0cyBmcm9tIE9CSl9ESVIKKyMKKyMgVGhlIE9TLzIgY29tbWFuZCBzaGVsbCBkb2VzIG5vdCBzdXBwb3J0IHZlcnkgbG9uZyBsaXN0IG9mIGFyZ3VtZW50cworIyBzbyB3ZSdyZSBzdHVjayB3aXRoIHdpbGRjYXJkcworIworCitESVJfT0JKIDo9ICQoc3Vic3QgJChTRVApLFwsJChPQkpfRElSKSkKKworY2xlYW5fZnJlZXR5cGVfb2JqZWN0czoKKwktZGVsICQoRElSOE9CSilcKi4kTworCitjbGVhbl9mcmVldHlwZV9saWI6CisJLWRlbCAkKEZUX0xJQlJBUlkpCisKK2NsZWFuOiBjbGVhbl9mcmVldHlwZV9vYmplY3RzCisKKyMgTGlicmFyaWFuIHRvIHVzZSB0byBidWlsZCB0aGUgc3RhdGljIGxpYnJhcnkKKyMKK0ZUX0xJQlJBUklBTiA6PSAkKEFSKSAtcgorCisjIFRoaXMgZmluYWwgcnVsZSBpcyB1c2VkIHRvIGxpbmsgYWxsIG9iamVjdCBmaWxlcyBpbnRvIGEgc2luZ2xlCisjIGxpYnJhcnkuIEl0IGlzIHBhcnQgb2YgdGhlIHN5c3RlbS1zcGVjaWZpYyBzdWItTWFrZWZpbGUgYmVjYXVzZSBub3QKKyMgYWxsIGxpYnJhcmlhbnMgYWNjZXB0IGEgc2ltcGxlIHN5bnRheCBsaWtlIDoKKyMKKyMgICAgbGlicmFyaWFuIGxpYnJhcnlfZmlsZSB7bGlzdCBvZiBvYmplY3QgZmlsZXN9IAorIworJChGVF9MSUJSQVJZKTogJChPQkpFQ1RTX0xJU1QpCisJLSQoREVMRVRFKSAkQAorCSQoRlRfTElCUkFSSUFOKSAkQCAkKE9CSkVDVFNfTElTVCkKKworZW5kaWYKKwpkaWZmIC0tZ2l0IGEvY29uZmlnL3VuaXgvTWFrZWZpbGUgYi9jb25maWcvdW5peC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWMwOGZlCi0tLSAvZGV2L251bGwKKysrIGIvY29uZmlnL3VuaXgvTWFrZWZpbGUKQEAgLTAsMCArMSwxNzIgQEAKKyMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjKgorIyogIEZyZWVUeXBlIDIgQ29uZmlndXJhdGlvbiBydWxlcyBmb3IgVW5peCArIGdjYworIyoKKyMqICBDb3B5cmlnaHQgMTk5Ni0xOTk5IGJ5CisjKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorIyoKKyMqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQKKyMqICBtb2RpZmllZCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisjKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisjKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisjKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorIyoKKyMqCisjKiAgVGhlIHB1cnBvc2Ugb2YgdGhpcyBzdWItTWFrZWZpbGUgaXMgdG8gZGVmaW5lIHZhcmlvdXMgYnVpbGQgYW5kCisjKiAgcGxhdGZvcm0gc3BlY2lmaWMgdmFyaWFibGVzIGJlZm9yZSBpbmNsdWRpbmcgdGhlIHN1Yi1NYWtlZmlsZQorIyogIGNvbnRhaW5pbmcgdGhlIEZyZWVUeXBlIGxpYnJhcnkgcnVsZXMsIGZvdW5kIGluCisjKgorIyogICAgICQoVE9QKS9jb25maWcvZnJlZXR5cGUubWsKKyMqCisjKiAgVGhlIGZvbGxvd2luZyB2YXJpYWJsZXMgbXVzdCBiZSBkZWZpbmVkIGJlZm9yZSBpbmNsdWRpbmcgdGhpcworIyogIGZpbGUgOgorIyoKKyMqICAgICBUT1AgICAgICAgICAgUGF0aG5hbWUgdG8gdGhlIHRvcCBvZiB0aGUgRnJlZVR5cGUgc291cmNlcworIyogICAgICAgICAgICAgICAgICBoaWVyYXJjaHkKKyMqCisjKiAgVGhpcyBmaWxlIHNob3VsZCBkZWZpbmUgdGhlIGZvbGxvd2luZyB2YXJpYWJsZXMgYmVmb3JlIGluY2x1ZGluZworIyogIHRoZSBGcmVlVHlwZSBsaWJyYXJ5IHJ1bGVzIGZpbGUgOgorIyoKKyMqICAgICBCVUlMRCAgICAgICAgUGF0aG5hbWUgdG8gdGhlIHBsYXRmb3JtLXNwZWNpZmljIGZpbGVzIHVzZWQKKyMqICAgICAgICAgICAgICAgICAgZm9yIHRoZSBidWlsZC4gVXN1YWxseSBgJChUT1ApL2NvbmZpZy88c3lzdGVtPicKKyMqCisjKiAgICAgU0VQICAgICAgICAgIERpcmVjdG9yeSBzZXBhcmF0b3IgZm9yIHRoZSBjdXJyZW50IHBsYXRmb3JtLgorIyogICAgICAgICAgICAgICAgICBFaXRoZXIgLyBvciBcIChtYXliZSA6IG9uIE1hY3MpCisjKiAKKyMqICAgICBERUxFVEUgICAgICAgVGhlIGZvcmNlZCByZW1vdmUvZGVsZXRlIGNvbW1hbmQgdG8gZXJhc2Ugb25lIG9yIG1vcmUKKyMqICAgICAgICAgICAgICAgICAgZmlsZXMKKyMqCisjKiAgICAgSU5DTFVERSAgICAgIFRoZSBsb2NhdGlvbiBvZiBhbGwgcHVibGljIGhlYWRlciBmaWxlcy4gZS5nLgorIyogICAgICAgICAgICAgICAgICBgJChUT1ApL2luY2x1ZGUnaW5jbHVkZScgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyMqICAgICBTUkMgICAgICAgICAgVGhlIGRpcmVjdG9yeSBjb250YWluaW5nIGFsbCBzb3VyY2VzLiBlLmcuICAgICAgICAgICAgICAKKyMqICAgICAgICAgICAgICAgICAgJyQoVE9QKS9zcmMnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorIyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyMqICAgICBPQkpfRElSICAgICAgVGhlIGxvY2F0aW9uIHdoZXJlIGNvbXBpbGVkIG9iamVjdCBmaWxlcyB3aWxsIGJlICAgICAgICAgCisjKiAgICAgICAgICAgICAgICAgIHBsYWNlZCwgZS5nLiAnJChUT1ApL29iaicgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyMqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisjKiAgICAgTElCX0RJUiAgICAgIFRoZSBsb2NhdGlvbiB3aGVyZSB0aGUgcmVzdWx0aW5nIGxpYnJhcnkgZmlsZSB3aWxsIGJlICAgIAorIyogICAgICAgICAgICAgICAgICBwbGFjZWQsIGUuZy4gJyQoVE9QKS9vYmonICAgICAgICAgICAgICAgICAgICAgICAgCisjKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorIyogICAgIExJQlJBUlkgICAgICBUaGUgZmlsZW5hbWUgb2YgdGhlIHJlc3VsdGluZyBsaWJyYXJ5IGZpbGUsIHdpdGhvdXQgICAgICAKKyMqICAgICAgICAgICAgICAgICAgaXRzIGV4dGVuc2lvbi4uIGUuZy4gJ2xpYmZyZWV0eXBlJyBvciAnZnJlZXR5cGUnICAgICAgICAgCisjKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorIyogICAgIE8gICAgICAgICAgICBUaGUgb2JqZWN0IGZpbGUgc3VmZml4LiAgQ2FuIGJlICcubycsICcub2JqLCcgJy5sbywnICAgICAKKyMqICAgICAgICAgICAgICAgICAgJztjb2ZmLCcgZXRjLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisjKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorIyogICAgIEEgICAgICAgICAgICBUaGUgbGlicmFyeSBmaWxlIHN1ZmZpeC4gIENhbiBiZSAnLmEnICcuc28sJyAnLmxpYicgICAgICAKKyMqICAgICAgICAgICAgICAgICAgJy5kbGwsJyBldGMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisjKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorIyogICAgIEkgICAgICAgICAgICBUaGUgcGF0aCBpbmNsdXNpb24gZmxhZy4gIFNvbWUgY29tcGlsZXJzIHVzZSBhICAgICAgICAgICAKKyMqICAgICAgICAgICAgICAgICAgZGlmZmVyZW50IGZsYWcgdGhhbiAnLUknIHRvIHNwZWNpZnkgYW4gYWRkaXRpb25hbCAgICAgICAgCisjKiAgICAgICAgICAgICAgICAgIGluY2x1ZGUgcGF0aC4gIEV4YW1wbGVzIGFyZSAnL2k9JyBvciAnLUogJywgZXRjLiAgICAgICAgIAorIyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyMqICAgICBEICAgICAgICAgICAgVGhlIG1hY3JvIGRlZmluaXRpb24gZmxhZy4gIEkgaGF2ZW4ndCBtZXQgY29tcGlsZXJzICAgICAgCisjKiAgICAgICAgICAgICAgICAgIHdoaWNoIGRvbid0IHVzZSB0aGUgJy1EJyBzd2l0Y2ggdG8gZGVmaW5lIGEgbWFjcm8sIGJ1dCAgIAorIyogICAgICAgICAgICAgICAgICB3aG8ga25vd3MuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyMqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisjKiAgICAgVCAgICAgICAgICAgIFRoZSBjb21waWxhdGlvbiBmbGFnIHVzZWQgdG8gaWRlbnRpZnkgdGhlIHRhcmdldC4gU29tZSAgIAorIyogICAgICAgICAgICAgICAgICBjb21waWxlcnMgdXNlIGEgZGlmZmVyZW50IGZsYWcgdGhhbiAnLW8gJyB0byBzcGVjaWZ5ICAgICAKKyMqICAgICAgICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHRhcmdldCBvYmplY3QgZmlsZS4gICAgICAgICAgICAgICAgICAgICAgCisjKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorIyogICAgIENGTEFHUyAgICAgICBUaGUgc2V0IG9mIGZsYWdzIHVzZWQgdG8gY29tcGlsZSBvYmplY3QgZmlsZXMuCisjKiAgICAgICAgICAgICAgICAgICh1c3VhbGx5IGNvbnRhaW5zIHRoZSBmbGFnICctYycpLgorIyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyMqCisjKgorIyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworaWZuZGVmIFRPUAorVE9QIDo9IC4KK2VuZGlmCisKK0RFTEVURSAgIDo9IHJtIC1mCitTRVAgICAgICA6PSAvCitCVUlMRCAgICA6PSAkKFRPUCkvY29uZmlnL3VuaXgKK1BMQVRGT1JNIDo9IHVuaXgKKworIyB0aGUgZGlyZWN0b3J5IHdoZXJlIGFsbCBvYmplY3QgZmlsZXMgYXJlIHBsYWNlZAorIworT0JKX0RJUiA6PSAkKFRPUCkvb2JqCisKKworIyB0aGUgZGlyZWN0b3J5IHdoZXJlIGFsbCBsaWJyYXJ5IGZpbGVzIGFyZSBwbGFjZWQKKyMKKyMgIGJ5IGRlZmF1bHQsIHRoaXMgaXMgdGhlIHNhbWUgYXMgT0JKX0RJUiwgaG93ZXZlciwgdGhpcyBjYW4gYmUKKyMgIGNoYW5nZWQgdG8gc3VpdCBwYXJ0aWN1bGFyIG5lZWRzLi4KKyMKK0xJQl9ESVIgOj0gJChPQkpfRElSKQorCisKKyMgdGhlIG9iamVjdCBmaWxlIGV4dGVuc2lvbiwgdGhpcyBjYW4gYmUgLm8sIC50Y28sIC5vYmosIGV0Yy4uCisjIGRlcGVuZGluZyBvbiB0aGUgcGxhdGZvcm0KKyMKK08gOj0gbworCisjIHRoZSBsaWJyYXJ5IGZpbGUgZXh0ZW5zaW9uLCB0aGlzIGNhbiBiZSAuYSwgLmxpYiwgZXRjLi4KKyMgZGVwZW5kaW5nIG9uIHRoZSBwbGF0Zm9ybQorIworQSA6PSBhCisKKworIyBUaGUgbmFtZSBvZiB0aGUgZmluYWwgbGlicmFyeSBmaWxlLgorIyBOb3RlIHRoYXQgdGhlIERPUy1zcGVjaWZpYyBNYWtlZmlsZSB1c2VzIGEgc2hvcnRlciAoOC4zKSBuYW1lCisjCitMSUJSQVJZIDo9IGxpYmZyZWV0eXBlCisKKworIyBwYXRoIGluY2x1c2lvbiBmbGFnLgorIworIyAgU29tZSBjb21waWxlcnMgdXNlIGEgZGlmZmVyZW50IGZsYWcgdGhhbiAnLUknIHRvIHNwZWNpZnkgYW4KKyMgIGFkZGl0aW9uYWwgaW5jbHVkZSBwYXRoLiBFeGFtcGxlcyBhcmUgIi9pPSIgb3IgIi1KIiwgZXRjLi4uCisjCitJIDo9IC1JCisKKworIyBUaGUgbGluayBmbGFnIHVzZWQgdG8gc3BlY2lmeSBhIGdpdmVuIGxpYnJhcnkgZmlsZSBvbiBsaW5rLgorIyBOb3RlIHRoYXQgdGhpcyBpcyBvbmx5IHVzZWQgdG8gY29tcGlsZSB0aGUgZGVtbyBwcm9ncmFtcywgbm90CisjIHRoZSBsaWJyYXJ5IGl0c2VsZi4KKyMKK0wgOj0gLWwKKworCisjIEMgZmxhZyB1c2VkIHRvIGRlZmluZSBhIG1hY3JvIGJlZm9yZSB0aGUgY29tcGlsYXRpb24gb2YgYSBnaXZlbgorIyBzb3VyY2Ugb2JqZWN0LiBVc3VhbGx5IGlzICctRCcgbGlrZSBpbiAiLURERUJVRyIKKyMKK0QgOj0gLUQKKworCisjIFRhcmdldCBmbGFnIC0gYmV3YXJlLCB0aGVyZSBpcyBhIHNwYWNlIGFmdGVyIHRoZSAnbycgISEKKyMKKyMKK1QgOj0gLW8gCisKKyMgQyBmbGFncworIworIyAgIFRoZXNlIHNob3VsZCBjb25jZXJuIDoKKyMKKyMgICAgIC0gZGVidWcgb3V0cHV0CisjICAgICAtIG9wdGltaXphdGlvbgorIyAgICAgLSB3YXJuaW5ncworIyAgICAgLSBhbnNpIGNvbXBsaWFuY2UuLgorIworaWZuZGVmIENGTEFHUworQ0ZMQUdTIDo9IC1jIC1nIC1PNiAtV2FsbAorZW5kaWYKKworaWZkZWYgQlVJTERfRlJFRVRZUEUKKworaW5jbHVkZSAkKFRPUCkvY29uZmlnL2ZyZWV0eXBlLm1rCisKKworIyBUaGlzIGZpbmFsIHJ1bGUgaXMgdXNlZCB0byBsaW5rIGFsbCBvYmplY3QgZmlsZXMgaW50byBhIHNpbmdsZQorIyBsaWJyYXJ5LiBJdCBpcyBwYXJ0IG9mIHRoZSBzeXN0ZW0tc3BlY2lmaWMgc3ViLU1ha2VmaWxlIGJlY2F1c2Ugbm90CisjIGFsbCBsaWJyYXJpYW5zIGFjY2VwdCBhIHNpbXBsZSBzeW50YXggbGlrZSA6CisjCisjICAgIGxpYnJhcmlhbiBsaWJyYXJ5X2ZpbGUge2xpc3Qgb2Ygb2JqZWN0IGZpbGVzfSAKKyMKKyQoRlRfTElCUkFSWSk6ICQoT0JKRUNUU19MSVNUKQorCS0kKERFTEVURSkgJEAKKwkkKEFSKSAtciAkQCAkKE9CSkVDVFNfTElTVCkKKworZW5kaWYKZGlmZiAtLWdpdCBhL2NvbmZpZy91bml4L01ha2VmaWxlLmRldmVsIGIvY29uZmlnL3VuaXgvTWFrZWZpbGUuZGV2ZWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODcxMGE3YwotLS0gL2Rldi9udWxsCisrKyBiL2NvbmZpZy91bml4L01ha2VmaWxlLmRldmVsCkBAIC0wLDAgKzEsMTcyIEBACisjKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIyoKKyMqICBGcmVlVHlwZSAyIENvbmZpZ3VyYXRpb24gcnVsZXMgZm9yIFVuaXggKyBnY2MKKyMqCisjKiAgQ29weXJpZ2h0IDE5OTYtMTk5OSBieQorIyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyMqCisjKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkCisjKiAgbW9kaWZpZWQgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorIyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorIyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorIyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyMqCisjKgorIyogIFRoZSBwdXJwb3NlIG9mIHRoaXMgc3ViLU1ha2VmaWxlIGlzIHRvIGRlZmluZSB2YXJpb3VzIGJ1aWxkIGFuZAorIyogIHBsYXRmb3JtIHNwZWNpZmljIHZhcmlhYmxlcyBiZWZvcmUgaW5jbHVkaW5nIHRoZSBzdWItTWFrZWZpbGUKKyMqICBjb250YWluaW5nIHRoZSBGcmVlVHlwZSBsaWJyYXJ5IHJ1bGVzLCBmb3VuZCBpbgorIyoKKyMqICAgICAkKFRPUCkvY29uZmlnL2ZyZWV0eXBlLm1rCisjKgorIyogIFRoZSBmb2xsb3dpbmcgdmFyaWFibGVzIG11c3QgYmUgZGVmaW5lZCBiZWZvcmUgaW5jbHVkaW5nIHRoaXMKKyMqICBmaWxlIDoKKyMqCisjKiAgICAgVE9QICAgICAgICAgIFBhdGhuYW1lIHRvIHRoZSB0b3Agb2YgdGhlIEZyZWVUeXBlIHNvdXJjZXMKKyMqICAgICAgICAgICAgICAgICAgaGllcmFyY2h5CisjKgorIyogIFRoaXMgZmlsZSBzaG91bGQgZGVmaW5lIHRoZSBmb2xsb3dpbmcgdmFyaWFibGVzIGJlZm9yZSBpbmNsdWRpbmcKKyMqICB0aGUgRnJlZVR5cGUgbGlicmFyeSBydWxlcyBmaWxlIDoKKyMqCisjKiAgICAgQlVJTEQgICAgICAgIFBhdGhuYW1lIHRvIHRoZSBwbGF0Zm9ybS1zcGVjaWZpYyBmaWxlcyB1c2VkCisjKiAgICAgICAgICAgICAgICAgIGZvciB0aGUgYnVpbGQuIFVzdWFsbHkgYCQoVE9QKS9jb25maWcvPHN5c3RlbT4nCisjKgorIyogICAgIFNFUCAgICAgICAgICBEaXJlY3Rvcnkgc2VwYXJhdG9yIGZvciB0aGUgY3VycmVudCBwbGF0Zm9ybS4KKyMqICAgICAgICAgICAgICAgICAgRWl0aGVyIC8gb3IgXCAobWF5YmUgOiBvbiBNYWNzKQorIyogCisjKiAgICAgREVMRVRFICAgICAgIFRoZSBmb3JjZWQgcmVtb3ZlL2RlbGV0ZSBjb21tYW5kIHRvIGVyYXNlIG9uZSBvciBtb3JlCisjKiAgICAgICAgICAgICAgICAgIGZpbGVzCisjKgorIyogICAgIElOQ0xVREUgICAgICBUaGUgbG9jYXRpb24gb2YgYWxsIHB1YmxpYyBoZWFkZXIgZmlsZXMuIGUuZy4KKyMqICAgICAgICAgICAgICAgICAgYCQoVE9QKS9pbmNsdWRlJ2luY2x1ZGUnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisjKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisjKiAgICAgU1JDICAgICAgICAgIFRoZSBkaXJlY3RvcnkgY29udGFpbmluZyBhbGwgc291cmNlcy4gZS5nLiAgICAgICAgICAgICAgCisjKiAgICAgICAgICAgICAgICAgICckKFRPUCkvc3JjJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyMqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisjKiAgICAgT0JKX0RJUiAgICAgIFRoZSBsb2NhdGlvbiB3aGVyZSBjb21waWxlZCBvYmplY3QgZmlsZXMgd2lsbCBiZSAgICAgICAgIAorIyogICAgICAgICAgICAgICAgICBwbGFjZWQsIGUuZy4gJyQoVE9QKS9vYmonICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisjKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorIyogICAgIExJQl9ESVIgICAgICBUaGUgbG9jYXRpb24gd2hlcmUgdGhlIHJlc3VsdGluZyBsaWJyYXJ5IGZpbGUgd2lsbCBiZSAgICAKKyMqICAgICAgICAgICAgICAgICAgcGxhY2VkLCBlLmcuICckKFRPUCkvb2JqJyAgICAgICAgICAgICAgICAgICAgICAgIAorIyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyMqICAgICBMSUJSQVJZICAgICAgVGhlIGZpbGVuYW1lIG9mIHRoZSByZXN1bHRpbmcgbGlicmFyeSBmaWxlLCB3aXRob3V0ICAgICAgCisjKiAgICAgICAgICAgICAgICAgIGl0cyBleHRlbnNpb24uLiBlLmcuICdsaWJmcmVldHlwZScgb3IgJ2ZyZWV0eXBlJyAgICAgICAgIAorIyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyMqICAgICBPICAgICAgICAgICAgVGhlIG9iamVjdCBmaWxlIHN1ZmZpeC4gIENhbiBiZSAnLm8nLCAnLm9iaiwnICcubG8sJyAgICAgCisjKiAgICAgICAgICAgICAgICAgICc7Y29mZiwnIGV0Yy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorIyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyMqICAgICBBICAgICAgICAgICAgVGhlIGxpYnJhcnkgZmlsZSBzdWZmaXguICBDYW4gYmUgJy5hJyAnLnNvLCcgJy5saWInICAgICAgCisjKiAgICAgICAgICAgICAgICAgICcuZGxsLCcgZXRjLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorIyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyMqICAgICBJICAgICAgICAgICAgVGhlIHBhdGggaW5jbHVzaW9uIGZsYWcuICBTb21lIGNvbXBpbGVycyB1c2UgYSAgICAgICAgICAgCisjKiAgICAgICAgICAgICAgICAgIGRpZmZlcmVudCBmbGFnIHRoYW4gJy1JJyB0byBzcGVjaWZ5IGFuIGFkZGl0aW9uYWwgICAgICAgIAorIyogICAgICAgICAgICAgICAgICBpbmNsdWRlIHBhdGguICBFeGFtcGxlcyBhcmUgJy9pPScgb3IgJy1KICcsIGV0Yy4gICAgICAgICAKKyMqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisjKiAgICAgRCAgICAgICAgICAgIFRoZSBtYWNybyBkZWZpbml0aW9uIGZsYWcuICBJIGhhdmVuJ3QgbWV0IGNvbXBpbGVycyAgICAgIAorIyogICAgICAgICAgICAgICAgICB3aGljaCBkb24ndCB1c2UgdGhlICctRCcgc3dpdGNoIHRvIGRlZmluZSBhIG1hY3JvLCBidXQgICAKKyMqICAgICAgICAgICAgICAgICAgd2hvIGtub3dzLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisjKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorIyogICAgIFQgICAgICAgICAgICBUaGUgY29tcGlsYXRpb24gZmxhZyB1c2VkIHRvIGlkZW50aWZ5IHRoZSB0YXJnZXQuIFNvbWUgICAKKyMqICAgICAgICAgICAgICAgICAgY29tcGlsZXJzIHVzZSBhIGRpZmZlcmVudCBmbGFnIHRoYW4gJy1vICcgdG8gc3BlY2lmeSAgICAgCisjKiAgICAgICAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSB0YXJnZXQgb2JqZWN0IGZpbGUuICAgICAgICAgICAgICAgICAgICAgIAorIyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyMqICAgICBDRkxBR1MgICAgICAgVGhlIHNldCBvZiBmbGFncyB1c2VkIHRvIGNvbXBpbGUgb2JqZWN0IGZpbGVzLgorIyogICAgICAgICAgICAgICAgICAodXN1YWxseSBjb250YWlucyB0aGUgZmxhZyAnLWMnKS4KKyMqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisjKgorIyoKKyMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKK2lmbmRlZiBUT1AKK1RPUCA6PSAuCitlbmRpZgorCitERUxFVEUgICA6PSBybSAtZgorU0VQICAgICAgOj0gLworQlVJTEQgICAgOj0gJChUT1ApL2NvbmZpZy91bml4CitQTEFURk9STSA6PSB1bml4CisKKyMgdGhlIGRpcmVjdG9yeSB3aGVyZSBhbGwgb2JqZWN0IGZpbGVzIGFyZSBwbGFjZWQKKyMKK09CSl9ESVIgOj0gJChUT1ApL29iagorCisKKyMgdGhlIGRpcmVjdG9yeSB3aGVyZSBhbGwgbGlicmFyeSBmaWxlcyBhcmUgcGxhY2VkCisjCisjICBieSBkZWZhdWx0LCB0aGlzIGlzIHRoZSBzYW1lIGFzIE9CSl9ESVIsIGhvd2V2ZXIsIHRoaXMgY2FuIGJlCisjICBjaGFuZ2VkIHRvIHN1aXQgcGFydGljdWxhciBuZWVkcy4uCisjCitMSUJfRElSIDo9ICQoT0JKX0RJUikKKworCisjIHRoZSBvYmplY3QgZmlsZSBleHRlbnNpb24sIHRoaXMgY2FuIGJlIC5vLCAudGNvLCAub2JqLCBldGMuLgorIyBkZXBlbmRpbmcgb24gdGhlIHBsYXRmb3JtCisjCitPIDo9IG8KKworIyB0aGUgbGlicmFyeSBmaWxlIGV4dGVuc2lvbiwgdGhpcyBjYW4gYmUgLmEsIC5saWIsIGV0Yy4uCisjIGRlcGVuZGluZyBvbiB0aGUgcGxhdGZvcm0KKyMKK0EgOj0gYQorCisKKyMgVGhlIG5hbWUgb2YgdGhlIGZpbmFsIGxpYnJhcnkgZmlsZS4KKyMgTm90ZSB0aGF0IHRoZSBET1Mtc3BlY2lmaWMgTWFrZWZpbGUgdXNlcyBhIHNob3J0ZXIgKDguMykgbmFtZQorIworTElCUkFSWSA6PSBsaWJmcmVldHlwZQorCisKKyMgcGF0aCBpbmNsdXNpb24gZmxhZy4KKyMKKyMgIFNvbWUgY29tcGlsZXJzIHVzZSBhIGRpZmZlcmVudCBmbGFnIHRoYW4gJy1JJyB0byBzcGVjaWZ5IGFuCisjICBhZGRpdGlvbmFsIGluY2x1ZGUgcGF0aC4gRXhhbXBsZXMgYXJlICIvaT0iIG9yICItSiIsIGV0Yy4uLgorIworSSA6PSAtSQorCisKKyMgVGhlIGxpbmsgZmxhZyB1c2VkIHRvIHNwZWNpZnkgYSBnaXZlbiBsaWJyYXJ5IGZpbGUgb24gbGluay4KKyMgTm90ZSB0aGF0IHRoaXMgaXMgb25seSB1c2VkIHRvIGNvbXBpbGUgdGhlIGRlbW8gcHJvZ3JhbXMsIG5vdAorIyB0aGUgbGlicmFyeSBpdHNlbGYuCisjCitMIDo9IC1sCisKKworIyBDIGZsYWcgdXNlZCB0byBkZWZpbmUgYSBtYWNybyBiZWZvcmUgdGhlIGNvbXBpbGF0aW9uIG9mIGEgZ2l2ZW4KKyMgc291cmNlIG9iamVjdC4gVXN1YWxseSBpcyAnLUQnIGxpa2UgaW4gIi1EREVCVUciCisjCitEIDo9IC1ECisKKworIyBUYXJnZXQgZmxhZyAtIGJld2FyZSwgdGhlcmUgaXMgYSBzcGFjZSBhZnRlciB0aGUgJ28nICEhCisjCisjCitUIDo9IC1vIAorCisjIEMgZmxhZ3MKKyMKKyMgICBUaGVzZSBzaG91bGQgY29uY2VybiA6CisjCisjICAgICAtIGRlYnVnIG91dHB1dAorIyAgICAgLSBvcHRpbWl6YXRpb24KKyMgICAgIC0gd2FybmluZ3MKKyMgICAgIC0gYW5zaSBjb21wbGlhbmNlLi4KKyMKK2lmbmRlZiBDRkxBR1MKK0NGTEFHUyA6PSAtYyAtZyAtTzAgLVdhbGwKK2VuZGlmCisKK2lmZGVmIEJVSUxEX0ZSRUVUWVBFCisKK2luY2x1ZGUgJChUT1ApL2NvbmZpZy9mcmVldHlwZS5taworCisKKyMgVGhpcyBmaW5hbCBydWxlIGlzIHVzZWQgdG8gbGluayBhbGwgb2JqZWN0IGZpbGVzIGludG8gYSBzaW5nbGUKKyMgbGlicmFyeS4gSXQgaXMgcGFydCBvZiB0aGUgc3lzdGVtLXNwZWNpZmljIHN1Yi1NYWtlZmlsZSBiZWNhdXNlIG5vdAorIyBhbGwgbGlicmFyaWFucyBhY2NlcHQgYSBzaW1wbGUgc3ludGF4IGxpa2UgOgorIworIyAgICBsaWJyYXJpYW4gbGlicmFyeV9maWxlIHtsaXN0IG9mIG9iamVjdCBmaWxlc30gCisjCiskKEZUX0xJQlJBUlkpOiAkKE9CSkVDVFNfTElTVCkKKwktJChERUxFVEUpICRACisJJChBUikgLXIgJEAgJChPQkpFQ1RTX0xJU1QpCisKK2VuZGlmCmRpZmYgLS1naXQgYS9jb25maWcvdW5peC9kZXRlY3QubWsgYi9jb25maWcvdW5peC9kZXRlY3QubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2QzOWM2NAotLS0gL2Rldi9udWxsCisrKyBiL2NvbmZpZy91bml4L2RldGVjdC5tawpAQCAtMCwwICsxLDMxIEBACisjCisjIFRoaXMgZmlsZSBpcyB1c2VkIHRvIGRldGVjdCB3aGljaCBNYWtlZmlsZSB0byB1c2UgYmFzZWQgb24gdGhlCisjIHZhbHVlIG9mIHRoZSBDQyBlbnZpcm9ubWVudCB2YXJpYWJsZS4KKyMKKyMgVW5peAorIworIworIyBUaGlzIHdpbGwgX211Y2hfIHByb2JhYmx5IGNoYW5nZSBpbiB0aGUgZnV0dXJlIGlmIHdlJ3JlIGdvaW5nIHRvIHVzZQorIyBBdXRvbWFrZS9BdXRvY29uZi4uCisjCisKK2lmZXEgKCQoUExBVEZPUk0pLGFuc2kpCitoYXNfaW5pdHRhYiA6PSAkKHN0cmlwICQod2lsZGNhcmQgL2V0Yy9pbml0dGFiKSkKK2lmbmVxICgkKGhhc19pbml0dGFiKSwpCisKK1BMQVRGT1JNIDo9IHVuaXgKK0NPUFkgICAgIDo9IGNwCitERUxFVEUgICA6PSBybSAtZgorCitDT05GSUdfUlVMRVMgOj0gJChCVUlMRCkkKFNFUClNYWtlZmlsZQorCitzZXR1cDogc3RkX3NldHVwCisKK2VuZGlmICMgdGVzdCBVbml4CitlbmRpZiAjIHRlc3QgUExBVEZPUk0KKworCisKKworCisKZGlmZiAtLWdpdCBhL2NvbmZpZy91bml4L2Z0Y29uZmlnLmggYi9jb25maWcvdW5peC9mdGNvbmZpZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlN2Y2ZjIKLS0tIC9kZXYvbnVsbAorKysgYi9jb25maWcvdW5peC9mdGNvbmZpZy5oCkBAIC0wLDAgKzEsMTcyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBmdGNvbmZpZy5oCisgKgorICogICAgVW5peC1zcGVjaWZpYyBjb25maWd1cmF0aW9uIGZpbGUKKyAqCisgKiAgQ29weXJpZ2h0IDE5OTYtMTk5OCBieQorICogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkCisgKiAgbW9kaWZpZWQgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAKKyAqICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICoKKyAqICBUaGlzIGhlYWRlciBmaWxlIGNvbnRhaW5zIGEgbnVtYmVyIG9mIG1hY3JvIGRlZmluaXRpb25zIHRoYXQgYXJlCisgKiAgdXNlZCBieSB0aGUgcmVzdCBvZiB0aGUgZW5naW5lLiBQb3J0ZXJzIGFyZSBmcmVlIHRvIGNvcHkgdGhpcyBmaWxlCisgKiAgYW5kIGFkYXB0IGl0IHRvIHN1aXQgdGhlaXIgb3duIHN5c3RlbS4uCisgKgorICogIElNUE9SVEFOVCBOT1RFIDoKKyAqCisgKiAgICBQb3J0ZXJzLCByZWFkIGNhcmVmdWxseSB0aGUgY29tbWVudHMgaW4gZnRzeXMuaCBiZWZvcmUgdHJ5aW5nCisgKiAgICB0byBwb3J0IHRoaXMgZmlsZSB0byB5b3VyIHN5c3RlbS4gSXQgY29udGFpbnMgbWFueSBlc3NlbnRpYWwKKyAqICAgIHJlbWFya3MsIGFuZCB3aWxsIGVhc2UgeW91ciB3b3JrIGdyZWF0bHkuLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgRlRDT05GSUdfSAorI2RlZmluZSBGVENPTkZJR19ICisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgIFBMQVRGT1JNLVNQRUNJRklDIENPTkZJR1VSQVRJT04gTUFDUk9TICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoZXNlIG1hY3JvcyBjYW4gYmUgdG9nZ2xlZCB0byBzdWl0IGEgc3BlY2lmaWMgc3lzdGVtLiBUaGUgY3VycmVudCAgICovCisvKiAgb25lcyBhcmUgZGVmYXVsdHMgdXNlZCB0byBjb21waWxlIEZyZWVUeXBlIGluIGEgMzItYml0cyBBTlNJIEMgICAgICAgKi8KKy8qICBlbnZpcm9ubWVudC4gQ29weSB0aGlzIGZpbGUgdG8geW91ciBvd24gImZyZWV0eXBlL2FyY2gvPHN5c3RlbT4iICAgICAqLworLyogIGRpcmVjdG9yeSwgYW5kIGVkaXQgaXQgdG8gcG9ydCB0aGUgZW5naW5lLi4gICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBEZWZpbmUgdG8gZW1wdHkgaWYgdGhlIGtleXdvcmQgZG9lcyBub3Qgd29yay4gICovCisvKiAjdW5kZWYgY29uc3QgKi8KKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIGEgd29ya2luZyBgbW1hcCcgc3lzdGVtIGNhbGwuICAqLworI2RlZmluZSAgSEFWRV9NTUFQCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgQU5TSSBDIGhlYWRlciBmaWxlcy4gICovCisjZGVmaW5lIFNURENfSEVBREVSUyAxCisKKy8qIERlZmluZSBpZiB5b3VyIHByb2Nlc3NvciBzdG9yZXMgd29yZHMgd2l0aCB0aGUgbW9zdCBzaWduaWZpY2FudAorICAgYnl0ZSBmaXJzdCAobGlrZSBNb3Rvcm9sYSBhbmQgU1BBUkMsIHVubGlrZSBJbnRlbCBhbmQgVkFYKS4gICovCisvKiAjdW5kZWYgV09SRFNfQklHRU5ESUFOICovCisKKy8qIERlZmluZSBpZiB0aGUgWCBXaW5kb3cgU3lzdGVtIGlzIG1pc3Npbmcgb3Igbm90IGJlaW5nIHVzZWQuICAqLworLyogI3VuZGVmIFhfRElTUExBWV9NSVNTSU5HICovCisKKy8qIFRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gYSBpbnQuICAqLworI2RlZmluZSBTSVpFT0ZfSU5UIDQKKworLyogVGhlIG51bWJlciBvZiBieXRlcyBpbiBhIGxvbmcuICAqLworI2RlZmluZSBTSVpFT0ZfTE9ORyA0CisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZ2V0cGFnZXNpemUgZnVuY3Rpb24uICAqLworI2RlZmluZSBIQVZFX0dFVFBBR0VTSVpFIDEKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBtZW1jcHkgZnVuY3Rpb24uICAqLworI2RlZmluZSBIQVZFX01FTUNQWSAxCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGZjbnRsLmg+IGhlYWRlciBmaWxlLiAgKi8KKyNkZWZpbmUgSEFWRV9GQ05UTF9IIDEKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8dW5pc3RkLmg+IGhlYWRlciBmaWxlLiAgKi8KKyNkZWZpbmUgSEFWRV9VTklTVERfSCAxCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGxvY2FsZS5oPiBoZWFkZXIgZmlsZS4gICovCisjZGVmaW5lIEhBVkVfTE9DQUxFX0ggMQorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxsaWJpbnRsLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiAgSEFWRV9MSUJJTlRMX0ggIAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGxpYmludGwgbGlicmFyeS4gICovCisvKiAjdW5kZWYgSEFWRV9MSUJJTlRMICovCisKKy8qIFByZWZlcnJlZCBhbGlnbm1lbnQgb2YgZGF0YSAqLworI2RlZmluZSAgRlRfQUxJR05NRU5UICA4CisKKy8qIFNlZSB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgbWFjcm8gRlRfQ09ORklHX09QVElPTl9MSVRUTEVfRU5ESUFOICovCisvKiBhbmQgRlRfQ09ORklHX09QVElPTl9CSUdfRU5ESUFOIGJlbG93LCB0aGV5IG1heSBuZWVkIHRvIGJlIHNldCAqLworLyogYWNjb3JkaW5nIHRvIHRoZSBwbGF0Zm9ybSB0b28uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworCisjaW5jbHVkZSA8ZnRvcHRpb24uaD4KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICBBVVRPTUFUSUMgQ09ORklHVVJBVElPTiBNQUNST1MgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhlc2UgbWFjcm9zIGFyZSBjb21wdXRlZCBmcm9tIHRoZSBvbmVzIGRlZmluZWQgYWJvdmUuIERvbid0IHRvdWNoICAgKi8KKy8qICB0aGVpciBkZWZpbml0aW9uLCB1bmxlc3MgeW91IGtub3cgcHJlY2lzZWx5IHdoYXQgeW91J3JlIGRvaW5nLiBObyAgICAqLworLyogIHBvcnRlciBzaG91bGQgbmVlZCB0byBtZXNzIHdpdGggdGhlbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIC8qIEludE4gdHlwZXM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICBVc2VkIHRvIGd1YXJhbnRlZSB0aGUgc2l6ZSBvZiBzb21lIHNwZWNpZmljIGludGVnZXJzLiAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgIHR5cGVkZWYgc2lnbmVkIHNob3J0ICAgIEZUX0ludDE2OworICB0eXBlZGVmIHVuc2lnbmVkIHNob3J0ICBGVF9Xb3JkMTY7CisKKyNpZiBTSVpFT0ZfSU5UID09IDQKKworICB0eXBlZGVmIHNpZ25lZCBpbnQgICAgICBGVF9JbnQzMjsKKyAgdHlwZWRlZiB1bnNpZ25lZCBpbnQgICAgRlRfV29yZDMyOworCisjZWxpZiBTSVpFT0ZfTE9ORyA9PSA0CisKKyAgdHlwZWRlZiBzaWduZWQgbG9uZyAgICAgRlRfSW50MzI7CisgIHR5cGVkZWYgdW5zaWduZWQgbG9uZyAgIEZUX1dvcmQzMjsKKworI2Vsc2UKKyNlcnJvciAibm8gMzJiaXQgdHlwZSBmb3VuZCAtIHBsZWFzZSBjaGVjayB5b3VyIGNvbmZpZ3VyYXRpb24gZmlsZXMiCisjZW5kaWYKKworI2lmIFNJWkVPRl9MT05HID09IDgKKworLyogTE9ORzY0IG11c3QgYmUgZGVmaW5lZCB3aGVuIGEgNjQtYml0IHR5cGUgaXMgYXZhaWxhYmxlICovCisjZGVmaW5lIExPTkc2NAorI2RlZmluZSBJTlQ2NCAgIGxvbmcKKworI2Vsc2UKKworLyogR0NDIHByb3ZpZGVzIHRoZSBub24tQU5TSSAnbG9uZyBsb25nJyA2NC1iaXQgdHlwZS4gIFlvdSBjYW4gYWN0aXZhdGUgaXQgKi8KKy8qIGJ5IGRlZmluaW5nIHRoZSBGVENBTENfVVNFX0xPTkdfTE9ORyBtYWNybyBpbiAnZnRjb25maWcuaCcuICBOb3RlIHRoYXQgICovCisvKiB0aGlzIHdpbGwgcHJvZHVjZSBtYW55IC1hbnNpIHdhcm5pbmdzIGR1cmluZyBsaWJyYXJ5IGNvbXBpbGF0aW9uLiAgICAgICAqLworI2lmZGVmIEZUQ0FMQ19VU0VfTE9OR19MT05HCisKKyNkZWZpbmUgTE9ORzY0CisjZGVmaW5lIElOVDY0ICAgbG9uZyBsb25nCisKKyNlbmRpZiAvKiBGVENBTENfVVNFX0xPTkdfTE9ORyAqLworI2VuZGlmCisKKyNpZmRlZiBGVF9NQUtFX09QVElPTl9TSU5HTEVfT0JKRUNUCisjZGVmaW5lICBMT0NBTF9ERUYgICBzdGF0aWMKKyNkZWZpbmUgIExPQ0FMX0ZVTkMgIHN0YXRpYworI2Vsc2UKKyNkZWZpbmUgIExPQ0FMX0RFRiAgIGV4dGVybgorI2RlZmluZSAgTE9DQUxfRlVOQyAgLyogbm90aGluZyAqLworI2VuZGlmCisKKyNpZmRlZiBGVF9NQUtFX09QVElPTl9TSU5HTEVfTElCUkFSWV9PQkpFQ1QKKyNkZWZpbmUgIEJBU0VfREVGICAgIExPQ0FMX0RFRgorI2RlZmluZSAgQkFTRV9GVU5DICAgTE9DQUxfRlVOQworI2Vsc2UKKyNkZWZpbmUgIEJBU0VfREVGICAgIGV4dGVybgorI2RlZmluZSAgQkFTRV9GVU5DICAgLyogbm90aGluZyAqLworI2VuZGlmCisKKyNpZm5kZWYgIEVYUE9SVF9ERUYKKyNkZWZpbmUgIEVYUE9SVF9ERUYgICBleHRlcm4KKyNlbmRpZgorCisjaWZuZGVmICBFWFBPUlRfRlVOQworI2RlZmluZSAgRVhQT1JUX0ZVTkMgIC8qIG5vdGhpbmcgKi8KKyNlbmRpZgorCisKKyNlbmRpZiAvKiBGVENPTkZJR19IICovCmRpZmYgLS1naXQgYS9jb25maWcvdW5peC9mdG9wdGlvbi5oIGIvY29uZmlnL3VuaXgvZnRvcHRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTJmNjVmCi0tLSAvZGV2L251bGwKKysrIGIvY29uZmlnL3VuaXgvZnRvcHRpb24uaApAQCAtMCwwICsxLDE2MiBAQAorI2lmbmRlZiBGVE9QVElPTl9ICisjZGVmaW5lIEZUT1BUSU9OX0gKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICBVU0VSLVNFTEVDVEFCTEUgQ09ORklHVVJBVElPTiBNQUNST1MgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogVGhlc2UgbWFjcm9zIGNhbiBiZSB0b2dnbGVkIGJ5IGRldmVsb3BlcnMgdG8gZW5hYmxlIG9yIGRpc2FibGUgICAgICAgICovCisgIC8qIGNlcnRhaW4gYXNwZWN0cyBvZiBGcmVlVHlwZS4gIFRoaXMgZmlsZSBjb250YWlucyBtYWNyb3MgdGhhdCBhcHBseSB0byAqLworICAvKiBhbGwgb2YgRnJlZVR5cGUuICBEcml2ZXItc3BlY2lmaWMgY29uZmlndXJhdGlvbnMgYXJlIHBsYWNlZCBpbiBlYWNoICAgKi8KKyAgLyogZHJpdmVyIGRpcmVjdG9yeSAoZS5nLiBgZnJlZXR5cGUvZHJpdmVycy90dGxpYi90dGNvbmZpZy5oJykuICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogQWx0ZXJuYXRlIEdseXBoIEltYWdlIEZvcm1hdCBzdXBwb3J0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIEJ5IGRlZmF1bHQsIHRoZSBnbHlwaCBpbWFnZXMgcmV0dXJuZWQgYnkgdGhlIEZyZWVUeXBlIGdseXBoIGxvYWRlciAgKi8KKyAgLyogICBjYW4gZWl0aGVyIGJlIGEgcGl4bWFwIG9yIGEgdmVjdG9yaWFsIG91dGxpbmUgZGVmaW5lZCB0aHJvdWdoICAgICAgICovCisgIC8qICAgYmV6aWVyIGNvbnRyb2wgcG9pbnRzLiBXaGVuIGRlZmluaW5nIHRoZSBmb2xsb3dpbmcgY29uZmlndXJhdGlvbiAgICAqLworICAvKiAgIG1hY3JvLCBzb21lIGZvbnQgZHJpdmVycyB3aWxsIGJlIGFibGUgdG8gcmVnaXN0ZXIgYWx0ZXJuYXRlICAgICAgICAgKi8KKyAgLyogICBnbHlwaCBpbWFnZSBmb3JtYXRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIFVuc2V0IHRoaXMgbWFjcm8gaWYgeW91J3JlIHN1cmUgdGhhdCB5b3UnbGwgbmV2ZXIgdXNlIGEgZm9udCBkcml2ZXIgKi8KKyAgLyogICB3aXRoIGFuIGFsdGVybmF0ZSBnbHlwaCBmb3JtYXQsIHRoaXMgd2lsbCByZWR1Y2UgdGhlIHNpemUgb2YgdGhlICAgICovCisgIC8qICAgYmFzZSBsYXllciBjb2RlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRlRfQ09ORklHX09QVElPTl9BTFRFUk5BVEVfR0xZUEhfRk9STUFUUworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogR0NDIHByb3ZpZGVzIHRoZSBub24tQU5TSSBgbG9uZyBsb25nJyA2NC1iaXQgdHlwZS4gIFlvdSBjYW4gYWN0aXZhdGUgICovCisgIC8qIGl0IGJ5IGRlZmluaW5nIHRoZSBGVENBTENfVVNFX0xPTkdfTE9ORyBtYWNybyBoZXJlLiAgTm90ZSBob3dldmVyICAgICAqLworICAvKiB0aGF0IHdlIGRpZCBub3QgZXhwZXJpZW5jZSBhbnkgaW1wcm92ZW1lbnQgaW4gc3BlZWQgd2l0aCBnY2MsIGFuZCAgICAgKi8KKyAgLyogdGhhdCB0aGUgZmluYWwgY29kZSBzZWVtcyBiaWdnZXIgd2hlbiBsaW5rZWQuICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI3VuZGVmIEZUQ0FMQ19VU0VfTE9OR19MT05HCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFdoZW4gY29tcGlsaW5nIEZyZWVUeXBlIGFzIGEgRExMLCBzb21lIHN5c3RlbXMvY29tcGlsZXJzIG5lZWQgYSAgICAgICAqLworICAvKiBzcGVjaWFsIGtleXdvcmQgaW4gZnJvbnQgb2YgZWFjaCBmdW5jdGlvbiBkZWZpbml0aW9uIGluc3RlYWQgb2YgICAgICAgKi8KKyAgLyogYGV4dGVybicuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBUaGUgbWFjcm9zIEVYUE9SVF9ERUYgYW5kIEVYUE9SVF9GVU5DIGFyZSB0aHVzIHVzZWQgdG8gZGVmaW5lICAgICAgICAgKi8KKyAgLyogZXhwb3J0ZWQgbGlicmFyeSBmdW5jdGlvbiBpbnRlcmZhY2VzIGFuZCBleHBvcnRlZCBsaWJyYXJ5IGZ1bmN0aW9ucyAgICovCisgIC8qIGltcGxlbWVudGF0aW9ucyByZXNwZWN0aXZlbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogSWYgbm90IGRlZmluZWQgaGVyZSwgdGhleSBhdXRvbWF0aWNhbGx5IGRlZmF1bHQgdG8gYGV4dGVybicgYW5kIHZvaWQgICovCisgIC8qIGxhdGVyIGluIHRoaXMgaGVhZGVyIGZpbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyN1bmRlZiBFWFBPUlRfREVGCisjdW5kZWYgRVhQT1JUX0ZVTkMKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogRGVidWcgbGV2ZWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIEZyZWVUeXBlIGNhbiBiZSBjb21waWxlZCBpbiBkZWJ1ZyBvciB0cmFjZSBtb2RlLiAgSW4gZGVidWcgbW9kZSwgICAgKi8KKyAgLyogICBlcnJvcnMgYXJlIHJlcG9ydGVkIHRocm91Z2ggdGhlIGBmdGRlYnVnJyBjb21wb25lbnQuICBJbiB0cmFjZSAgICAgICovCisgIC8qICAgbW9kZSwgYWRkaXRpb25hbCBtZXNzYWdlcyBhcmUgc2VudCB0byB0aGUgc3RhbmRhcmQgb3V0cHV0IGR1cmluZyAgICAqLworICAvKiAgIGV4ZWN1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgRGVmaW5lIEZUX0RFQlVHX0xFVkVMX0VSUk9SIHRvIGJ1aWxkIHRoZSBsaWJyYXJ5IGluIGRlYnVnIG1vZGUuICAgICAqLworICAvKiAgIERlZmluZSBGVF9ERUJVR19MRVZFTF9UUkFDRSB0byBidWlsZCBpdCBpbiB0cmFjZSBtb2RlLiAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgRG9uJ3QgZGVmaW5lIGFueSBvZiB0aGVzZSBtYWNyb3MgdG8gY29tcGlsZSBpbiBgcmVsZWFzZScgbW9kZS4gICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyN1bmRlZiAgRlRfREVCVUdfTEVWRUxfRVJST1IKKyN1bmRlZiAgRlRfREVCVUdfTEVWRUxfVFJBQ0UKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogQW50aS1hbGlhc2luZyBzdXBwb3J0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIFVuZGVmaW5lIHRoaXMgbWFjcm8gb25seSBpZiB5b3Ugd2FudCB0byBkaXNhYmxlIHRoZSBhbnRpLWFsaWFzaW5nICAgKi8KKyAgLyogICBzdXBwb3J0IGluIEZyZWVUeXBlLiAgVGhpcyB3aWxsIHNhdmUgeW91IGFib3V0IDUgS2Igb2YgY29kZS4gIEl0ICAgICovCisgIC8qICAgbWF5IGJlIGltcG9ydGFudCBmb3Igc29tZSBlbWJlZGRlZCBzeXN0ZW1zLiAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRlRfQ09ORklHX09QVElPTl9BTlRJX0FMSUFTCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIEVuZGlhbmVzcyBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICBGcmVlVHlwZSBpcyBjb21wbGV0ZWx5IGVuZGlhbi1pbmRlcGVuZGVudCwgYW5kIGNhbiB0aHVzIGJlIGNvbXBpbGVkICovCisgIC8qICAgZGlyZWN0bHkgb24gX2FueV8gbWFjaGluZS4gIEhvd2V2ZXIsIHNvbWUgY29tcG9uZW50cyBvZiB0aGUgbGlicmFyeSAqLworICAvKiAgIHByb3ZpZGUgaW1wcm92ZWQgcm91dGluZXMgZm9yIHRoZSBjYXNlcyB3aGVyZSBlbmRpYW5lc3MgaXMga25vd24uICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgSXQgdXN1YWxseSByZXN1bHRzIGluIHNwZWVkLXVwcyBhbmQgcmVkdWNlZCBjb2RlIHNpemUuICBOb3RlIHRoYXQgICAqLworICAvKiAgIHlvdSBzaG91bGQgbm90IGRlZmluZSBib3RoIG9mIHRoZXNlIG1hY3Jvcy4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIE5PVEU6IEZvciBub3csIG9ubHkgdGhlIHNjYW4tbGluZSBjb252ZXJ0ZXIgKGJhc2UvZnRyYXN0ZXIuYykgdXNlcyAgKi8KKyAgLyogICAgICAgICB0aGVzZSBtYWNyb3MgdG8gc3BlZWQtdXAgc29tZSBhbnRpLWFsaWFzIHJlbmRlcmluZyByb3V0aW5lcy4gICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI3VuZGVmICBGVF9DT05GSUdfT1BUSU9OX0xJVFRMRV9FTkRJQU4KKyN1bmRlZiAgRlRfQ09ORklHX09QVElPTl9CSUdfRU5ESUFOCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIERlZmluZSB0aGlzIGNvbmZpZ3VyYXRpb24gbWFjcm8gd2hlbmV2ZXIgeW91IHdhbnQgdG8gYnVpbGQgYSB2ZXJzaW9uICAqLworICAvKiBvZiBGcmVlVHlwZSB0aGF0IGRvZXMgbm90IGluY2x1ZGUgYSBkZWZhdWx0IGBzeXN0ZW0nIGNvbXBvbmVudC4gICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIE5vdGUgdGhhdCB0aGlzIHdpbGwgcHJldmVudCB0aGUgY29tcGlsYXRpb24gb2YgYGZ0aW5pdCcsIGhlbmNlIHRoZSAgICAqLworICAvKiBmdW5jdGlvbiBGVF9Jbml0X0ZyZWVUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjdW5kZWYgRlRfQ09ORklHX09QVElPTl9OT19ERUZBVUxUX1NZU1RFTQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgcmVuZGVyIHBvb2wgdXNlZCBieSB0aGUgc2Nhbi1saW5lICAgICAgICAgKi8KKyAgLyogICAgY29udmVydGVyIHRvIGRvIGFsbCBvZiBpdHMgd29yay4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGlzIG11c3QgYmUgZ3JlYXRlciB0aGFuIDQgS2IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZUX1JFTkRFUl9QT09MX1NJWkUgICAzMjc2OAorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9NQVhfRFJJVkVSUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoZSBtYXhpbXVtIG51bWJlciBvZiBmb250IGRyaXZlcnMgdGhhdCBjYW4gYmUgcmVnaXN0ZXJlZCBpbiBhICAgICAqLworICAvKiAgICBzaW5nbGUgRnJlZVR5cGUgbGlicmFyeSBvYmplY3QuICA4IHNlZW1zIHRvIGJlIGEgZ29vZCBjaG9pY2UgZHVlICAgKi8KKyAgLyogICAgdG8gdGhlIHJlbGF0aXZlIGxvdyBhY3R1YWwgbnVtYmVyIG9mIGRyaXZlcnMgOy0pICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBGVF9NQVhfRFJJVkVSUyAgOAorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9NQVhfRVhURU5TSU9OUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoZSBtYXhpbXVtIG51bWJlciBvZiBleHRlbnNpb25zIHRoYXQgY2FuIGJlIHJlZ2lzdGVyZWQgaW4gYSAgICAgICAqLworICAvKiAgICBzaW5nbGUgZm9udCBkcml2ZXIuIDggc2VlbXMgdG8gYmUgYSBnb29kIGNob2ljZSBmb3Igbm93Li4gICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZUX01BWF9FWFRFTlNJT05TICA4CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX01BWF9HTFlQSF9GT1JNQVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhlIG1heGltdW0gbnVtYmVyIG9mIGdseXBoIGltYWdlIGZvcm1hdHMgdGhhdCBtaWdodCBiZSByZWdpc3RlcmVkICovCisgIC8qICAgIGluIGEgZ2l2ZW4gbGlicmFyeSBpbnN0YW5jZS4gOCBzZWVtcyB0byBiZSBhIGdvb2QgY2hvaWNlIGR1ZSB0byAgICAqLworICAvKiAgICB0aGUgcmVsYXRpdmVseSBsb3cgbnVtYmVyIG9mIGN1cnJlbnQgZm9ybWF0cyA7LSkgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyNkZWZpbmUgRlRfTUFYX0dMWVBIX0ZPUk1BVFMgIDgKKworCisKKyNlbmRpZiAvKiBGVE9QVElPTl9IICovCmRpZmYgLS1naXQgYS9jb25maWcvdW5peC9mdHN5cy5jIGIvY29uZmlnL3VuaXgvZnRzeXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTk4ZDk1Ci0tLSAvZGV2L251bGwKKysrIGIvY29uZmlnL3VuaXgvZnRzeXMuYwpAQCAtMCwwICsxLDg3MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgZnRzeXMuYworICoKKyAqICAgIFVuaXgtc3BlY2lmaWMgc3lzdGVtIG9wZXJhdGlvbnMuCisgKgorICogIENvcHlyaWdodCAxOTk2LTE5OTggYnkKKyAqICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZAorICogIG1vZGlmaWVkIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgCisgKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqCisgKiAgVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgJ2Z0c3lzJyBjb21wb25lbnQgdXNlcyBtZW1vcnktbWFwcGVkCisgKiAgZmlsZXMsIGFzIHdlbGwgYXMgdGhlIEFOU0kgbWFsbG9jL2ZyZWUgZnVuY3Rpb25zLi4KKyAqCisgKiAgSU1QT1JUQU5UIE5PVEUgOgorICoKKyAqICAgIFBvcnRlcnMsIHJlYWQgY2FyZWZ1bGx5IHRoZSBjb21tZW50cyBpbiBmdHN5cy5oIGJlZm9yZSB0cnlpbmcKKyAqICAgIHRvIHBvcnQgdGhpcyBmaWxlIHRvIHlvdXIgc3lzdGVtLiBJdCBjb250YWlucyBtYW55IGVzc2VudGlhbAorICogICAgcmVtYXJrcywgYW5kIHdpbGwgZWFzZSB5b3VyIHdvcmsgZ3JlYXRseS4uCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgImZ0c3lzLmgiCisjaW5jbHVkZSAiZnRvYmpzLmgiCisjaW5jbHVkZSAiZnRzdHJlYW0uaCIKKyNpbmNsdWRlICJmdGRlYnVnLmgiCisKKy8qIE1lbW9yeS1tYXBwaW5nIGluY2x1ZGVzIGFuZCBkZWZpbml0aW9ucy4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2lmZGVmIEhBVkVfVU5JU1REX0gKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNpZm5kZWYgTUFQX0ZJTEUKKyNkZWZpbmUgTUFQX0ZJTEUgIDB4MDAKKyNlbmRpZgorCisvKgorICogVGhlIHByb3RvdHlwZSBmb3IgbXVubWFwKCkgaXMgbm90IHByb3ZpZGVkIG9uIFN1bk9TLiAgVGhpcyBuZWVkcyB0bworICogaGF2ZSBhIGNoZWNrIGFkZGVkIGxhdGVyIHRvIHNlZSBpZiB0aGUgR05VIEMgbGlicmFyeSBpcyBiZWluZyB1c2VkLgorICogSWYgc28sIHRoZW4gdGhpcyBwcm90b3R5cGUgaXMgbm90IG5lZWRlZC4KKyAqLworI2lmIGRlZmluZWQoX19zdW5fXykgJiYgIWRlZmluZWQoU1ZSNCkgJiYgIWRlZmluZWQoX19TVlI0KQorICBleHRlcm4gaW50ICBtdW5tYXAoIGNhZGRyX3QgIGFkZHIsIGludCAgbGVuICk7CisjZW5kaWYKKworI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaWZkZWYgSEFWRV9GQ05UTF9ICisjaW5jbHVkZSA8ZmNudGwuaD4KKyNlbmRpZgorCisKKy8qIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiBJdCBpcyBhbiBpbXBsaWNpdCAqLworLyogcGFyYW1ldGVyIG9mIHRoZSBQVFJBQ0UgYW5kIFBFUlJPUiBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nICAgICovCisvKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI3VuZGVmICBGVF9DT01QT05FTlQKKyNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV9pbworCisKKworCisvKiBUbyBlYXNlIHBvcnRpbmcsIHdlIHVzZSB0aGUgbWFjcm8gU1lTX1NUUkVBTSB0byBuYW1lIHRoZSBzeXN0ZW0tc3BlY2lmaWMgKi8KKy8qIHN0cmVhbSB0eXBlLiBGb3IgZXhhbXBsZSwgaXQgaXMgYSAiRklMRSoiIHdpdGggdGhlIEFOU0kgbGliYywgaXQgd2lsbCBiZSAqLworLyogYSBmaWxlIGRlc2NyaXB0b3IsIGkuZS4gYW4gaW50ZWdlciwgd2hlbiB1c2luZyB0aGUgVW5peCBzeXN0ZW0gYXBpLCBldGMuICovCisgCisvKiB3ZSBpZGVudGlmeSBlYWNoIG1lbW9yeS1tYXBwZWQgZmlsZSB0aHJvdWdoIGl0cyBhZGRyZXNzIGluIG1lbW9yeSAqLworLyogaGVuY2UgdGhlIGZvbGxvd2luZyBtYWNybyBkZWZpbml0aW9uLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAKKyNkZWZpbmUgIFNZU19TVFJFQU0gIHZvaWQqCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgSS9PIEFDQ0VTUyBBTkQgTUFOQUdFTUVOVCAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFdlIG9ubHkgZGVmaW5lIHRoZSAiQU5TSSIgcmVzb3VyY2UgY2xhc3MgaW4gdGhpcyBjbGFzcy4gSXQgaXMgICAgICAgICAqLworLyogIGRpc2stYmFzZWQsIGFuZCBwcm92aWRlcyBhIE1SVSBjYWNoZSwgaW4gb3JkZXIgdG8gb25seSBrZWVwIHRoZSBmaWxlICAqLworLyogIGRlc2NyaXB0b3JzIG9mIHRoZSAxMCBtb3N0IHJlY2VudGx5IHVzZWQgcmVzb3VyY2UgZmlsZXMuICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGl0IHNpbXBseSBjb250YWlucyB0d28gbGlzdHMuIE9uZSBjb250YWlucyB0aGUgImNhY2hlZCIgcmVzb3VyY2VzICAgICAqLworLyogIHdpdGggYSB2YWxpZCBGSUxFKiBwb2ludGVyLCB0aGUgc2Vjb25kIGNvbnRhaW5zIGFsbCBvdGhlciAiZmx1c2hlZCIgICAqLworLyogIHJlc291cmNlIG9iamVjdHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisvKiBUaGUgRlRfTU1hcEZpbGUgY2xhc3MgZGVyaXZlcyBmcm9tIEZUX1Jlc291cmNlUmVjIC0gZGVzY3JpcHRpb24gOiAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA8U3RydWN0PiBGVF9BbnNpRmlsZVJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiByb290IDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICB0aGUgcm9vdCByZXNvdXJjZSBjbGFzcyBmaWVsZHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBwYXRobmFtZSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICB0aGUgZmlsZSdzIHBhdGhuYW1lLiBOZWVkZWQgYmVjYXVzZSB3ZSBvcGVuIGFuZCBjbG9zZSBmb250ICAgICAgICovCisvKiAgICByZXNvdXJjZXMgZHluYW1pY2FsbHkgaW4gb3JkZXIgdG8gbGltaXQgdGhlIG51bWJlciBvZiAgICAgICAgICAgICovCisvKiAgICBjb25jdXJyZW50bHkgYWN0aXZlIG1hcHBpbmdzICh0aGlzIHNhdmVzIGtlcm5lbCByZXNvdXJjZXMpLiAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBmaWxlX3NpemUgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICB0aGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgcmVzb3VyY2UuIFRoaXMgZmllbGQgc2hvdWxkIGJlIHNldCB0byAgICovCisvKiAgICAtMSB1bnRpbCB0aGUgcmVzb3VyY2UgaXMgZmlyc3Qgb3BlbmVkLi4gICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisgIHR5cGVkZWYgc3RydWN0IEZUX01NYXBGaWxlUmVjXworICB7CisgICAgRlRfUmVzb3VyY2VSZWMgIHJvb3Q7CisgICAgY29uc3QgY2hhciogICAgIHBhdGhuYW1lOworICAgIEZUX0xvbmcgICAgICAgICBmaWxlX3NpemU7ICAvKiBmaWxlIHNpemUgaW4gYnl0ZXMgKi8KKyAgICAKKyAgfSBGVF9NTWFwRmlsZVJlYywgKkZUX01NYXBGaWxlOworCisKKy8qIFdlIHVzZSB0aGUgbWFjcm8gU1RSRUFNX05hbWUgYXMgYSBjb252ZW5pZW5jZSB0byByZXR1cm4gYSBnaXZlbiAgKi8KKy8qIEFOU0kgcmVzb3VyY2UncyBwYXRobmFtZS4gSXRzICJzdHJlYW0iIGFyZ3VtZW50IGlzIGEgRlRfUmVzb3VyY2UgKi8KKy8qIHdoaWNoIGlzIHR5cGVjYXN0ZWQgdG8gdGhlIEZUX0Fuc2lGaWxlIGNsYXNzICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU1RSRUFNX05hbWUoc3RyZWFtKSAgKChGVF9NTWFwRmlsZSlzdHJlYW0tPnJlc291cmNlKS0+cGF0aG5hbWUKKworLyogV2UgdXNlIHRoZSBtYWNybyBTVFJFQU1fRmlsZSBhcyBhIGNvbnZlbmllbmNlIHRvIGV4dHJhY3QgdGhlICAgICAgKi8KKy8qIHN5c3RlbS1zcGVjaWZpYyBzdHJlYW0gaGFuZGxlIGZyb20gYSBnaXZlbiBGcmVlVHlwZSBzdHJlYW0gb2JqZWN0ICovCisjZGVmaW5lIFNUUkVBTV9GaWxlKHN0cmVhbSkgICgodm9pZCopc3RyZWFtLT5zdHJlYW1faWQucG9pbnRlcikKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPEZ1bmN0aW9uPiBNTWFwRmlsZV9PcGVuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIG9wZW4gYSBzeXN0ZW0tc3RyZWFtIGZvciBhIGdpdmVuIHJlc291cmNlLiAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBOb3RlIHRoYXQgaXQgbXVzdCB1cGRhdGUgdGhlIHRhcmdldCBGcmVlVHlwZSBzdHJlYW0gb2JqZWN0IHdpdGggdGhlICAqLworLyogICAgc3lzdGVtLXN0cmVhbSBoYW5kbGUgYW5kIHRoZSByZXNvdXJjZSdzIHNpemUuICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBbHNvLCB0aGUgJ3N0cmVhbS0+YmFzZScgZmllbGQgbXVzdCBiZSBzZXQgdG8gTlVMTCBmb3IgZGlzay1iYXNlZCAgICAqLworLyogICAgcmVzb3VyY2UsIGFuZCB0byB0aGUgYWRkcmVzcyBpbiBtZW1vcnkgb2YgdGhlIHJlc291cmNlJ3MgZmlyc3QgYnl0ZSAgKi8KKy8qICAgIGZvciBhIG1lbW9yeS1iYXNlZCBvbmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgcmVzb3VyY2UgOjogdGhlIHNvdXJjZSByZXNvdXJjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIHN0cmVhbSAgIDo6IHRoZSB0YXJnZXQgc3RyZWFtIG9iamVjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIEVycm9yIGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIFRoaXMgZnVuY3Rpb24gc2ltcGx5IG9wZW5zIGFuZCBtYXBzIHRoZSByZXNvdXJjZSdzIGZpbGUgcGF0aG5hbWUgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgVGhlIHN0cmVhbSBvYmplY3QgSVMgTk9UIENSRUFURUQgYnkgdGhpcyBmdW5jdGlvbiwgYnV0IGJ5IGl0cyBjYWxsZXIuICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICBzdGF0aWMKKyAgRlRfRXJyb3IgIE1NYXBGaWxlX09wZW4oIEZUX01NYXBGaWxlICByZXNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgICBzdHJlYW0gKQorICB7CisgICAgaW50ICAgICAgICAgIGZpbGU7CisgICAgc3RydWN0IHN0YXQgIHN0YXRfYnVmOworICAgIAorICAgIC8qIG9wZW4gdGhlIGZpbGUgKi8KKyAgICBmaWxlID0gb3BlbiggcmVzb3VyY2UtPnBhdGhuYW1lLCBPX1JET05MWSApOworICAgIGlmIChmaWxlIDwgMCkKKyAgICB7CisgICAgICBQRVJST1IoKCAiVW5peFN5cy5NTWFwRmlsZV9PcGVuIDogY291bGQgbm90IG9wZW4gJyVzJ1xuIiwKKyAgICAgICAgICAgICAgIHJlc291cmNlLT5wYXRobmFtZSApKTsKKyAgICAgIHJldHVybiBGVF9FcnJfQ2Fubm90X09wZW5fU3RyZWFtOworICAgIH0KKworICAgIGlmIChmc3RhdCggZmlsZSwgJnN0YXRfYnVmICkgPCAwKQorICAgIHsKKyAgICAgIFBFUlJPUigoICJVbml4U3lzLk1NYXBGaWxlX09wZW4gOiBjb3VsZCBub3QgJ2ZzdGF0JyBmaWxlICclcydcbiIsCisgICAgICAgICAgICAgICByZXNvdXJjZS0+cGF0aG5hbWUgKSk7CisgICAgICBnb3RvIEZhaWxfTWFwOworICAgIH0KKyAgICAgIAorICAgIGlmICggcmVzb3VyY2UtPmZpbGVfc2l6ZSA8IDAgKQorICAgICAgcmVzb3VyY2UtPmZpbGVfc2l6ZSA9IHN0YXRfYnVmLnN0X3NpemU7CisgICAgICAKKyAgICBzdHJlYW0tPnJlc291cmNlICAgICAgICAgID0gKEZUX1Jlc291cmNlKXJlc291cmNlOworICAgIHN0cmVhbS0+c3lzdGVtICAgICAgICAgICAgPSByZXNvdXJjZS0+cm9vdC5kcml2ZXItPnN5c3RlbTsKKyAgICBzdHJlYW0tPnNpemUgICAgICAgICAgICAgID0gcmVzb3VyY2UtPmZpbGVfc2l6ZTsKKyAgICBzdHJlYW0tPnN0cmVhbV9pZC5wb2ludGVyID0gbW1hcCggTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2UtPmZpbGVfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPVF9SRUFELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVBfRklMRSB8IE1BUF9QUklWQVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICk7CisKKyAgICBpZiAoIChsb25nKXN0cmVhbS0+c3RyZWFtX2lkLnBvaW50ZXIgPT0gLTEgKQorICAgIHsKKyAgICAgIFBFUlJPUigoICJVbml4U3lzLk1NYXBGaWxlX09wZW4gOiBDb3VsZCBub3QgbWFwIGZpbGUgJyVzJ1xuIiwKKyAgICAgICAgICAgICAgIHJlc291cmNlLT5wYXRobmFtZSApKTsKKyAgICAgIGdvdG8gRmFpbF9NYXA7CisgICAgfQorCisgICAgY2xvc2UoZmlsZSk7CisgICAgc3RyZWFtLT5iYXNlICAgPSAoRlRfQnl0ZSopc3RyZWFtLT5zdHJlYW1faWQucG9pbnRlcjsKKyAgICBzdHJlYW0tPmN1cnNvciA9IHN0cmVhbS0+YmFzZTsKKyAgICAKKyAgICBQVFJBQ0UxKCggIlVuaXhTeXMuTU1hcEZpbGVfT3Blbjogb3BlbmVkICclcycgKCVkIGJ5dGVzKSBzdWNjZXNmdWxseVxuIiwKKyAgICAgICAgICAgICAgcmVzb3VyY2UtPnBhdGhuYW1lLCByZXNvdXJjZS0+ZmlsZV9zaXplICkpOworCisgICAgcmV0dXJuIEZUX0Vycl9PazsKKyAgICAKKyAgRmFpbF9NYXA6CisgICAgY2xvc2UoZmlsZSk7CisgICAgc3RyZWFtLT5yZXNvdXJjZSAgICAgICAgICA9IE5VTEw7CisgICAgc3RyZWFtLT5zaXplICAgICAgICAgICAgICA9IDA7CisgICAgc3RyZWFtLT5zdHJlYW1faWQucG9pbnRlciA9IE5VTEw7CisgICAgc3RyZWFtLT5iYXNlICAgICAgICAgICAgICA9IE5VTEw7CisgICAgc3RyZWFtLT5jdXJzb3IgICAgICAgICAgICA9IE5VTEw7CisgICAgCisgICAgcmV0dXJuIEZUX0Vycl9DYW5ub3RfT3Blbl9TdHJlYW07CisgIH0KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIDxGdW5jdGlvbj4gTU1hcEZpbGVfQ2xvc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPERlc2NyaXB0aW9uPiBDbG9zZXMgYSBnaXZlbiBzdHJlYW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBzdHJlYW0gICA6OiB0aGUgdGFyZ2V0IHN0cmVhbSBvYmplY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBFcnJvciBjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBUaGlzIGZ1bmN0aW9uIHNpbXBseSB1bm1hcHMgdGhlIHJlc291cmNlLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIHN0YXRpYworICBGVF9FcnJvciAgTU1hcEZpbGVfQ2xvc2UoIEZUX1N0cmVhbSAgc3RyZWFtICkKKyAgeworICAgIFBUUkFDRTEoKCAiQ2xvc2luZyBmaWxlICclcydcbiIsIFNUUkVBTV9OYW1lKHN0cmVhbSkgKSk7CisgICAgCisgICAgbXVubWFwICggKHZvaWQqKXN0cmVhbS0+c3RyZWFtX2lkLnBvaW50ZXIsIHN0cmVhbS0+c2l6ZSApOworICAgICAgICAKKyAgICBzdHJlYW0tPnJlc291cmNlICAgICAgICAgID0gTlVMTDsKKyAgICBzdHJlYW0tPnN0cmVhbV9pZC5wb2ludGVyID0gTlVMTDsKKyAgICBzdHJlYW0tPnNpemUgICAgICAgICAgICAgID0gMDsKKyAgICBzdHJlYW0tPmJhc2UgICAgICAgICAgICAgID0gTlVMTDsKKyAgICBzdHJlYW0tPmN1cnNvciAgICAgICAgICAgID0gTlVMTDsKKworICAgIHJldHVybiBGVF9FcnJfT2s7CisgIH0KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIDxGdW5jdGlvbj4gTU1hcEZpbGVfU2VlayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPERlc2NyaXB0aW9uPiBTZWVrIGEgc3RyZWFtIHRvIGEgZ2l2ZW4gcG9zaXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBzdHJlYW0gICA6OiB0aGUgdGFyZ2V0IHN0cmVhbSBvYmplY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgcG9zaXRpb24gOjogb2Zmc2V0IGluIGJ5dGVzIGZyb20gc3RhcnQgb2YgcmVzb3VyY2Uvc3RyZWFtICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgRXJyb3IgY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgVGhpcyBmdW5jdGlvbiBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIGZvciBtZW1vcnktYmFzZWQgcmVzb3VyY2VzLi4gICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICBzdGF0aWMKKyAgRlRfRXJyb3IgIE1NYXBGaWxlX1NlZWsoIEZUX1N0cmVhbSAgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICBwb3NpdGlvbiApCisgIHsKKyAgICAodm9pZClzdHJlYW07CisgICAgKHZvaWQpcG9zaXRpb247CisgICAgcmV0dXJuIEZUX0Vycl9JbnZhbGlkX1N0cmVhbV9PcGVyYXRpb247CisgIH0KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIDxGdW5jdGlvbj4gTU1hcEZpbGVfU2tpcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPERlc2NyaXB0aW9uPiBTa2lwIGEgZ2l2ZW4gbnVtYmVyIG9mIGJ5dGVzIGluIGFuIE1NYXAgc3RyZWFtLiAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgVXNlZnVsIHRvIHNraXAgcGFkIGJ5dGVzLCBmb3IgZXhhbXBsZS4gICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgc3RyZWFtICAgOjogdGhlIHRhcmdldCBzdHJlYW0gb2JqZWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIGNvdW50ICAgIDo6IG51bWJlciBvZiBieXRlcyB0byBza2lwIGluIHRoZSBzdHJlYW0gICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIEVycm9yIGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCBmb3IgbWVtb3J5LWJhc2VkIHJlc291cmNlcy4uICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgc3RhdGljCisgIEZUX0Vycm9yICBNTWFwRmlsZV9Ta2lwKCBGVF9TdHJlYW0gIHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgY291bnQgKQorICB7CisgICAgKHZvaWQpc3RyZWFtOworICAgICh2b2lkKWNvdW50OworICAgIHJldHVybiBGVF9FcnJfSW52YWxpZF9TdHJlYW1fT3BlcmF0aW9uOworICB9ICAgICAgICAgICAgICAgICAgICAgICAgCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPEZ1bmN0aW9uPiBNTWFwRmlsZV9Qb3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA8RGVzY3JpcHRpb24+IFJldHVybnMgdGhlIGN1cnJlbnQgb2Zmc2V0IHdpdGhpbiBhbiBNTWFwIHN0cmVhbSdzICAgICAgICAqLworLyogICAgICAgICAgICAgICByZXNvdXJjZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBzdHJlYW0gICA6OiB0aGUgdGFyZ2V0IHN0cmVhbSBvYmplY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBwb3NpdGlvbiA6OiBjdXJyZW50IG9mZnNldC4gLTEgaW4gY2FzZSBvZiBlcnJvciAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBFcnJvciBjb2RlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBUaGlzIGZ1bmN0aW9uIHNob3VsZCBuZXZlciBiZSBjYWxsZWQgZm9yIG1lbW9yeS1iYXNlZCByZXNvdXJjZXMuLiAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIHN0YXRpYworICBGVF9FcnJvciAgTU1hcEZpbGVfUG9zKCBGVF9TdHJlYW0gIHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyogICBwb3NpdGlvbiApCisgIHsKKyAgICAodm9pZClzdHJlYW07CisgICAgKHZvaWQpcG9zaXRpb247CisgICAgcmV0dXJuIEZUX0Vycl9JbnZhbGlkX1N0cmVhbV9PcGVyYXRpb247CisgIH0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA8RnVuY3Rpb24+IE1NYXBGaWxlX1JlYWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIDxEZXNjcmlwdGlvbj4gUmVhZCBhIGdpdmVuIG51bWJlciBvZiBieXRlcyBmcm9tIGFuIE1NYXAgc3RyZWFtIGludG8gICAgICovCisvKiAgICAgICAgICAgICAgIG1lbW9yeS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIHN0cmVhbSAgIDo6IHRoZSB0YXJnZXQgc3RyZWFtIG9iamVjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBidWZmZXIgICA6OiB0aGUgdGFyZ2V0IHJlYWQgYnVmZmVyIHdoZXJlIGRhdGEgaXMgY29waWVkICAgICAgICAgICAgICAgKi8KKy8qICAgc2l6ZSAgICAgOjogbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQgZnJvbSB0aGUgc3RyZWFtICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgcmVhZF9ieXRlcyA6OiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGVmZmVjdGl2ZWx5IHJlYWQgZnJvbSB0aGUgc3RyZWFtICAgICovCisvKiAgICAgICAgICAgICAgICAgdXNlZCBpbiBjYXNlIG9mIGVycm9yIChpLmUuIEZUX0Vycl9JbnZhbGlkX1N0cmVhbV9SZWFkKSAqLworLyogICAgICAgICAgICAgICAgIGJ5IHNvbWUgcGFydHMgb2YgdGhlIGxpYnJhcnkuLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIEVycm9yIGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCBmb3IgbWVtb3J5LWJhc2VkIHJlc291cmNlcy4uICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgc3RhdGljCisgIEZUX0Vycm9yICBNTWFwRmlsZV9SZWFkKCBGVF9TdHJlYW0gIHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyogICByZWFkX2J5dGVzICkKKyAgeworICAgICh2b2lkKXN0cmVhbTsKKyAgICAodm9pZClidWZmZXI7CisgICAgKHZvaWQpc2l6ZTsKKyAgICAodm9pZClyZWFkX2J5dGVzOworICAgIHJldHVybiBGVF9FcnJfSW52YWxpZF9TdHJlYW1fT3BlcmF0aW9uOyAgICAgICAgICAgICAgICAgICAgICAKKyAgfQorCisvKiBUaGUgZm9sbG93aW5nIHRhYmxlIGlzIHRoZSAidmlydHVhbCBtZXRob2QgdGFibGUiIGZvciB0aGUgJ01NYXAgICovCisvKiByZXNvdXJjZSBjbGFzcycsIHdoaWNoIG1ldGhvZHMgYXJlIGRlZmluZWQgYWJvdmUuIEl0cyBhZGRyZXNzIGlzICovCisvKiBzZXQgaW4gdGhlICdpbnRlcmZhY2UnIGZpZWxkIG9mIGFsbCByZXNvdXJjZSBvYmplY3RzIGNyZWF0ZWQgYnkgICovCisvKiB0aGUgZnVuY3Rpb24gRlRfQ3JlYXRlX01NYXBGaWxlIChzZWUgYmVsb3cpICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgc3RhdGljCisgIEZUUmVzX0ludGVyZmFjZVJlYyAgRlRfTU1hcEZpbGVfSW50ZXJmYWNlID0KKyAgeworICAgIChGVFJlc19PcGVuX0Z1bmMpICBNTWFwRmlsZV9PcGVuLAorICAgIChGVFJlc19DbG9zZV9GdW5jKSBNTWFwRmlsZV9DbG9zZSwKKyAgICAoRlRSZXNfU2Vla19GdW5jKSAgTU1hcEZpbGVfU2VlaywKKyAgICAoRlRSZXNfU2tpcF9GdW5jKSAgTU1hcEZpbGVfU2tpcCwKKyAgICAoRlRSZXNfUG9zX0Z1bmMpICAgTU1hcEZpbGVfUG9zLAorICAgIChGVFJlc19SZWFkX0Z1bmMpICBNTWFwRmlsZV9SZWFkLAorICB9OworCisKKyAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgLyogPEZ1bmN0aW9uPiAgRlRfQ3JlYXRlX1Jlc291cmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgLyogICAgQ3JlYXRlIGEgbmV3IHJlc291cmNlIG9iamVjdCBmb3IgYSBnaXZlbiBsaWJyYXJ5LiBOb3RlIHRoYXQgdGhpcyAgKi8KKyAvKiAgICBmdW5jdGlvbiB0YWtlcyBhbiBBU0NJSSAncGF0aG5hbWUnIGFzIGFuIGFyZ3VtZW50LiAgICAgICAgICAgICAgICAqLworIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAvKiAgICAgbGlicmFyeSAgOjogaGFuZGxlIHRvIHRhcmdldCBsaWJyYXJ5IG9iamVjdCAgICAgICAgICAgICAgICAgICAgICAqLworIC8qICAgICBwYXRoYW5tZSA6OiBBU0NJSSBwYXRobmFtZSBvZiB0aGUgZm9udCBmaWxlICAgICAgICAgICAgICAgICAgICAgICovCisgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworIC8qICAgICByZXNvdXJjZSA6OiBoYW5kbGUgdG8gbmV3IHJlc291cmNlIG9iamVjdCAgICAgICAgICAgICAgICAgICAgICAgICovCisgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworIC8qICAgICBFcnJvciBjb2RlLiAwIG1lYW5zIHN1Y2Nlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworIC8qICAgICBXaGVuIHBvcnRpbmcgdGhlIGxpYnJhcnkgdG8gZXhvdGljIGVudmlyb25tZW50cywgd2hlcmUgYW4gICAgICAgICovCisgLyogICAgIEFTQ0lJIHBhdGhuYW1lIGlzbid0IHVzZWQgdG8gbmFtZSBmaWxlcywgZGV2ZWxvcGVycyBzaG91bGQgICAgICAgKi8KKyAvKiAgICAgaW52b2tlIGRpcmVjdGx5IHRoZWlyIG93biByZXNvdXJjZSBjcmVhdGlvbiBmdW5jdGlvbiB3aGljaCAgICAgICAqLworIC8qICAgICBtdXN0IGJlIHBsYWNlZCBpbiB0aGVpciBwb3J0IG9mIHRoZSAiZnRzeXMiIGNvbXBvbmVudC4gICAgICAgICAgICovCisgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAvKiAgICAgU2VlIHRoZSBwb3J0aW5nIGd1aWRlIGZvciBtb3JlIGluZm9ybWF0aW9uLi4gICAgICAgICAgICAgICAgICAgICAqLworIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEVYUE9SVF9GVU5DCisgIEZUX0Vycm9yICBGVF9DcmVhdGVfUmVzb3VyY2UoIEZUX0xpYnJhcnkgICAgbGlicmFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogICBwYXRobmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfUmVzb3VyY2UqICBhcmVzb3VyY2UgKQorICB7CisgICAgRlRfSW50ICAgICAgIGxlbjsKKyAgICBGVF9TeXN0ZW0gICAgc3lzdGVtOworICAgIEZUX01NYXBGaWxlICByZXNvdXJjZTsKKyAgICBGVF9FcnJvciAgICAgZXJyb3I7CisKKyAgICAqYXJlc291cmNlID0gTlVMTDsKKyAgICAKKyAgICBpZiAoIWxpYnJhcnkpCisgICAgeworICAgICAgUEVSUk9SKCggIlVuaXguTmV3X1Jlc291cmNlIDogbnVsbCBsaWJyYXJ5IGhhbmRsZVxuIiApKTsKKyAgICAgIHJldHVybiBGVF9FcnJfSW52YWxpZF9MaWJyYXJ5X0hhbmRsZTsKKyAgICB9CisKKyAgICBzeXN0ZW0gPSBsaWJyYXJ5LT5zeXN0ZW07CisKKyAgICBpZiAoICFwYXRobmFtZSApCisgICAgICBnb3RvIEZhaWxfTnVsbDsKKyAgICAgIAorICAgIGxlbiA9IHN0cmxlbihwYXRobmFtZSk7CisgICAgaWYgKGxlbiA9PSAwKQorICAgICAgZ290byBGYWlsX051bGw7CisKKyAgICByZXNvdXJjZSA9IE5VTEw7CisgICAgCisgICAgaWYgKCBBTExPQyggcmVzb3VyY2UsIHNpemVvZigqcmVzb3VyY2UpICkgfHwKKyAgICAgICAgIEFMTE9DKCByZXNvdXJjZS0+cGF0aG5hbWUsIGxlbisxICAgKSApCisgICAgICBnb3RvIEZhaWxfTWVtb3J5OworCisgICAgcmVzb3VyY2UtPnJvb3QubGlicmFyeSAgID0gbGlicmFyeTsKKyAgICByZXNvdXJjZS0+cm9vdC5pbnRlcmZhY2UgPSAmRlRfTU1hcEZpbGVfSW50ZXJmYWNlOworICAgIHJlc291cmNlLT5yb290LmZsYWdzICAgICA9IEZUX1JFU09VUkNFX1RZUEVfTUVNT1JZX0JBU0VEOworICAgIHJlc291cmNlLT5maWxlX3NpemUgICAgICA9IC0xOworICAgIHN0cmNweSggKGNoYXIqKXJlc291cmNlLT5wYXRobmFtZSwgcGF0aG5hbWUgKTsKKworICAgIFBUUkFDRTEoKCAiQ3JlYXRlX01NYXBGaWxlIDogTU1hcCByZXNvdXJjZSBjcmVhdGVkIGZvciAnJXMnXG4iLAorICAgICAgICAgICAgICBwYXRobmFtZSApKTsKKyAgICAKKyAgICAqYXJlc291cmNlID0gKEZUX1Jlc291cmNlKXJlc291cmNlOworICAgIHJldHVybiBGVF9FcnJfT2s7CisKKyAgRmFpbF9OdWxsOiAgICAKKyAgICBQRVJST1IoKCAiQ3JlYXRlX01NYXBGaWxlIDogbnVsbCBwYXRobmFtZSAhIVxuIiApKTsKKyAgICByZXR1cm4gRlRfRXJyX0ludmFsaWRfQXJndW1lbnQ7CisgICAgCisgIEZhaWxfTWVtb3J5OgorICAgIGlmIChyZXNvdXJjZSkKKyAgICAgIEZSRUUoIHJlc291cmNlLT5wYXRobmFtZSApOworICAgIEZSRUUoIHJlc291cmNlICk7CisgICAgUEVSUk9SKCggIkNyZWF0ZV9NTWFwRmlsZSA6IGVycm9yIHdoZW4gY3JlYXRpbmcgcmVzb3VyY2UgIVxuIiApKTsKKyAgICByZXR1cm4gZXJyb3I7CisgIH0KKworICAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPEZ1bmN0aW9uPiBGVF9EZXN0cm95X1Jlc291cmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA8RGVzY3JpcHRpb24+IERlc3Ryb3lzIGFuIE1NYXAgcmVzb3VyY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGlzIG5ldmVyIGNhbGxlZCBkaXJlY3RseSBieSB0aGUgZm9udCAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgZHJpdmVycy4gT25seSBieSB0aGUgaGlnaGVyLWxldmVsIHBhcnQgb2YgRnJlZVR5cGUgICAgICAgICovCisvKiAgICAgICAgICAgICAgIChjYWxsZWQgdGhlIEhMaWIpLCBvciBjbGllbnQgYXBwbGljYXRpb25zICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIHJlc291cmNlIDo6IHRoZSBNTWFwIHJlc291cmNlIG9iamVjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIFRoaXMgZnVuY3Rpb25zIGRvZXMgbm90IGNoZWNrIHRoYXQgcnVucyBvciBzdHJlYW1zIGFyZSBvcGVuZWQgZm9yICAgICAqLworLyogICB0aGUgcmVzb3VyY2UgKGZvciBub3csIHdlIGFzc3VtZSBkZXZlbG9wZXIgaW50ZWxsaWdlbmNlLiBXZSdsbCBtb3N0ICAgKi8KKy8qICAgcHJvYmFibHkgbG93ZXIgb3VyIHN0YW5kYXJkIGxhdGVyIHRvIGVhc2UgZGVidWdnaW5nIDstKSAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKKyAgRVhQT1JUX0ZVTkMKKyAgRlRfRXJyb3IgIEZUX0Rlc3Ryb3lfUmVzb3VyY2UoIEZUX1Jlc291cmNlICByZXNvdXJjZSApCisgIHsKKyAgICBGVF9TeXN0ZW0gICAgc3lzdGVtID0gcmVzb3VyY2UtPmxpYnJhcnktPnN5c3RlbTsKKyAgICBGVF9NTWFwRmlsZSAgcmVzICAgID0gKEZUX01NYXBGaWxlKXJlc291cmNlOworICAgIAorICAgIGlmICggIXJlcyB8fCByZXMtPnJvb3QuaW50ZXJmYWNlICE9ICZGVF9NTWFwRmlsZV9JbnRlcmZhY2UgKQorICAgIHsKKyAgICAgIFBFUlJPUigoIAorICAgICAgICAiRGVzdHJveV9NTWFwRmlsZSA6IFRyeWluZyB0byBkZXN0cm95IGFuIGludmFsaWQgcmVzb3VyY2UgISFcbiIgKSk7CisgICAgICByZXR1cm4gRlRfRXJyX0ludmFsaWRfUmVzb3VyY2VfSGFuZGxlOworICAgIH0KKyAgICAKKyAgICBQVFJBQ0UxKCggIkRlc3Ryb3lfTU1hcEZpbGUgOiBkZXN0cm95aW5nIHJlc291cmNlIGZvciAnJXMnXG4iLAorICAgICAgICAgICAgICByZXMtPnBhdGhuYW1lICkpOworCisgICAgRlJFRSggcmVzLT5wYXRobmFtZSApOworICAgIEZSRUUoIHJlcyApOworCisgICAgcmV0dXJuIEZUX0Vycl9PazsKKyAgfQorCisgIAorICAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgIE1FTU9SWSBNQU5BR0VNRU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgVGhpcyBwYXJ0IGNvcGllcyB0aGUgb2xkIEZyZWVUeXBlIDEuMCBhbmQgMS4xIG1lbW9yeSBtYW5hZ2VtZW50ICAgICAgKi8KKy8qICAgc2NoZW1lIHRoYXQgd2FzIGRlZmluZWQgaW4gdGhlIGZpbGUgInR0bWVtb3J5LmgiLiBPbmUgY2FuIHNlZSB0aGF0ICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgLSBhIHNldCBvZiBtYWNyb3MgaXMgZGVmaW5lZCBmb3IgdGhlIG1lbW9yeSBvcGVyYXRpb25zIHVzZWQgICAgICAgICAgKi8KKy8qICAgICBieSB0aGUgZW5naW5lICggTUVNX0NvcHksIE1FTV9Nb3ZlLCBNRU1fU2V0ICkuIFRoaXMgY29tZXMgZnJvbSAgICAgKi8KKy8qICAgICB0aGUgZmFjdCB0aGF0IG1hbnkgY29tcGlsZXJzIGFyZSBhYmxlIHRvIGlubGluZSB0aGVzZSBvcHMgZGlyZWN0bHkgKi8KKy8qICAgICB3aXRoaW4gdGhlIGNvbXBpbGVkIGNvZGUsIHJhdGhlciB0aGFuIGdlbmVyYXRpbmcgYSBjYWxsIHRvIHRoZSAgICAgKi8KKy8qICAgICBDIGxpYnJhcnkuIEhvd2V2ZXIsIHRoaXMgb2JsaWdlcyB1cyB0byBpbmNsdWRlIHRoZSA8c3RyaW5nLmg+ICAgICAgKi8KKy8qICAgICBoZWFkZXIgZmlsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICBJZiB5b3UgcHJvdmlkZSB5b3VyIG93biBtZW1vcnkgb3BlcmF0aW9ucyByb3V0aW5lLCB5b3UgY2FuIGdldCAgICAgKi8KKy8qICAgICByaWQgb2YgdGhlICNpbmNsdWRlIDxzdHJpbmcuaD4gYmVsb3cuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgLSB0aGUgRlRfQWxsb2MgZnVuY3Rpb24gaGFzIHNldmVyYWwgZXNzZW50aWFsIHByb3BlcnRpZXMgdGhhdCAgICAgICAgKi8KKy8qICAgICBNVVNUIGJlIHJldGFpbmVkIGJ5IGVhY2ggcG9ydCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgLSBpdCByZXR1cm5zIGFuIGVycm9yIGNvZGUsIE5PVCB0aGUgYWxsb2NhdGVkIGJsb2NrJ3MgYmFzZSAgICAgICAgKi8KKy8qICAgICAgICBhZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgLSBpdCB0YWtlcyB0aGUgYWRkcmVzcyBvZiBhIHRhcmdldCBwb2ludGVyLCB3aGVyZSB0aGUgYmxvY2sncyAgICAgKi8KKy8qICAgICAgICBiYXNlIGFkZHJlc3Mgd2lsbCBiZSBzZXQuIGlmIHRoZSBzaXplIGlzIHplcm8sIGl0cyB2YWx1ZSAgICAgICAgKi8KKy8qICAgICAgICB3aWxsIGJlIE5VTEwgYW5kIHRoZSBmdW5jdGlvbiByZXR1cm5zIHN1Y2Nlc3NmdWxseSAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgLSBpbiBjYXNlIG9mIGVycm9yLCB0aGUgcG9pbnRlcidzIHZhbHVlIGlzIHNldCB0byBOVUxMIGFuZCAgICAgICAgKi8KKy8qICAgICAgICBhbiBlcnJvciBjb2RlIGlzIHJldHVybmVkLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgLSB0aGUgbmV3IGFsbG9jYXRlZCBibG9jayBNVVNUIGJlIHplcm8tZmlsbGVkLiBUaGlzIGlzIGEgc3Ryb25nICAgKi8KKy8qICAgICAgICBjb252ZXRpb24gdGhlIHJlc3Qgb2YgdGhlIGVuZ2luZSByZWxpZXMgb24gICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgLSB0aGUgRlRfRnJlZSBmdW5jdGlvbiBoYXMgYWxzbyBpdHMgZXNzZW50aWFscyA6ICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgLSBpdCB0YWtlcyB0aGUgYWRkcmVzcyBvZiBhIHBvaW50ZXIgd2hpY2ggdmFsdWUgaXMgdGhlIGJsb2NrJ3MgICAgKi8KKy8qICAgICAgICBiYXNlIGFkZHJlc3MuIFRoaXMgaXMgVU5MSUtFIGEgc3RhbmRhcmQgImZyZWUiIHdoaWNoIHRha2VzIHRoZSAgKi8KKy8qICAgICAgICB0aGUgYmxvY2sncyBiYXNlIGRpcmVjdGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgLSBpdCBhY2NlcHRzIHN1Y2Nlc2Z1bGx5IHRoZSBhZGRyZXNzIG9mIGEgcG9pbnRlciB3aGljaCB2YWx1ZSAgICAgKi8KKy8qICAgICAgICBpcyBOVUxMLCBpbiB3aGljaCBjYXNlIGl0IHNpbXBseSByZXR1cm5zLiAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgLSB0aGUgcG9pbnRlciBpcyBhbHdheXMgc2V0IHRvIE5VTEwgYnkgdGhlIGZ1bmN0aW9uICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgLSB0aGUgTUVNX0FsbG9jLCBBTExPQyBhbmQgQUxMT0NfQVJSQVkgbWFjcm9zIGFyZSB1c2VkIGJ5IHRoZSAgICAgICAgKi8KKy8qICAgICBsaWJyYXJ5LCBhbmQgc2hvdWxkIE5PVCBiZSBtb2RpZmllZCBieSBwb3J0ZXJzICEhICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworLyogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuIEl0IGlzIGFuIGltcGxpY2l0ICovCisvKiBwYXJhbWV0ZXIgb2YgdGhlIFBUUkFDRSBhbmQgUEVSUk9SIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cgICAgKi8KKy8qIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjdW5kZWYgIEZUX0NPTVBPTkVOVAorI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX21lbW9yeQorCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPEZ1bmN0aW9uPiBGVF9BbGxvYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQWxsb2NhdGVzIGEgbmV3IGJsb2Mgb2YgbWVtb3J5LiBUaGUgcmV0dXJuZWQgYXJlYSBpcyBhbHdheXMgICAgICAgICAqLworLyogICAgemVyby1maWxsZWQsIHRoaXMgaXMgYSBzdHJvbmcgY29udmVudGlvbiBpbiBtYW55IEZyZWVUeXBlIHBhcnRzICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgc3lzdGVtICAgIDo6IGhhbmRsZSB0byBhIGdpdmVuICdzeXN0ZW0gb2JqZWN0JyB3aGVyZSBhbGxvY2F0aW9uICAgICAqLworLyogICAgICAgICAgICAgICAgIG9jY3Vycy4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgc2l6ZSAgICAgIDo6IHNpemUgaW4gYnl0ZXMgb2YgdGhlIGJsb2NrIHRvIGFsbG9jYXRlICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgUCAgICAgICAgIDo6IHBvaW50ZXIgdG8gdGhlIGZyZXNoIG5ldyBibG9jay4gSXQgc2hvdWxkIGJlIHNldCAgICAgICAqLworLyogICAgICAgICAgICAgICAgIHRvIE5VTEwgaWYgJ3NpemUnIGlzIDAsIG9mIGluIGNhc2Ugb2YgZXJyb3IuLiAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIEJBU0VfRlVOQworICBGVF9FcnJvciAgRlRfQWxsb2MoIEZUX1N5c3RlbSAgc3lzdGVtLAorICAgICAgICAgICAgICAgICAgICAgIGxvbmcgICAgICAgc2l6ZSwgCisgICAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICpQICkgCisgIHsKKyAgCisgICAgaWYgKCFQKQorICAgIHsKKyAgICAgIFBFUlJPUigoICJGVF9BbGxvYyA6IGludmFsaWQgcG9pbnRlciBhZGRyZXNzICEhXG4iICkpOworICAgICAgcmV0dXJuIEZUX0Vycl9JbnZhbGlkX0FyZ3VtZW50OworICAgIH0KKyAgICAKKyAgICBpZiAoIHNpemUgPiAwICkKKyAgICB7CisgICAgICAqUCA9IG1hbGxvYyggc2l6ZSApOworICAgICAgaWYgKCAhKlAgKQorICAgICAgeworICAgICAgICBQRVJST1IoKCAiRlRfQWxsb2MgOiBvdXQgb2YgbWVtb3J5ICglbGQgYnl0ZXMgcmVxdWVzdGVkKSAhIVxuIiwKKyAgICAgICAgICAgICAgICAgc2l6ZSApKTsKKworICAgICAgICByZXR1cm4gRlRfRXJyX091dF9PZl9NZW1vcnk7CisgICAgICB9CisKKyAgICAgIHN5c3RlbS0+dG90YWxfYWxsb2MgKz0gc2l6ZTsKKworICAgICAgLyogQUxXQVlTIFpFUk8tRklMTCBUSEUgQkxPQ0sgISEhISEgKi8gICAKKyAgICAgIE1FTV9TZXQoICpQLCAwLCBzaXplICk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICpQID0gTlVMTDsKKworICAgIFBUUkFDRTIoKCAiRlRfQWxsb2MgOiBzaXplID0gJWxkLCBwb2ludGVyID0gMHglMDhseCwgYmxvY2sgPSAweCUwOGx4XG4iLAorICAgICAgICAgICAgICBzaXplLCAobG9uZylQLCAobG9uZykqUCApKTsKKworICAgIHJldHVybiBGVF9FcnJfT2s7CisgIH0KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA8RnVuY3Rpb24+IEZUX1JlYWxsb2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBSZWFsbG9jYXRlcyBhIGJsb2NrIG9mIG1lbW9yeSBwb2ludGVkIHRvIGJ5ICcqUCcgdG8gJ1NpemUnICAgICAgICAgICovCisvKiAgICBieXRlcyBmcm9tIHRoZSBoZWFeLCBwb3NzaWJseSBjaGFuZ2luZyAnKlAnLiAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBzeXN0ZW0gICAgOjogaGFuZGxlIHRvIGEgZ2l2ZW4gJ3N5c3RlbSBvYmplY3QnIHdoZXJlIGFsbG9jYXRpb24gICAgICovCisvKiAgICAgICAgICAgICAgICAgb2NjdXJzLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBzaXplICAgICAgOjogc2l6ZSBpbiBieXRlcyBvZiB0aGUgYmxvY2sgdG8gYWxsb2NhdGUgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBQICAgICAgICAgOjogcG9pbnRlciB0byB0aGUgZnJlc2ggbmV3IGJsb2NrLiBJdCBzaG91bGQgYmUgc2V0ICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgdG8gTlVMTCBpZiAnc2l6ZScgaXMgMCwgb2YgaW4gY2FzZSBvZiBlcnJvci4uICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgQkFTRV9GVU5DCisgIGludCAgRlRfUmVhbGxvYyggRlRfU3lzdGVtICBzeXN0ZW0sCisgICAgICAgICAgICAgICAgICAgbG9uZyAgICAgICBzaXplLCAKKyAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgKlAgKQorICB7CisgICAgdm9pZCogIFE7CisgICAgCisgICAgaWYgKCFQKQorICAgIHsKKyAgICAgIFBFUlJPUigoICJGVF9SZWFsbG9jIDogaW52YWxpZCBwb2ludGVyIGFkZHJlc3MgISFcbiIgKSk7CisgICAgICByZXR1cm4gRlRfRXJyX0ludmFsaWRfQXJndW1lbnQ7CisgICAgfQorCisgICAgLyogaWYgdGhlIG9yaWdpbmFsIHBvaW50ZXIgaXMgTlVMTCwgY2FsbCBGVF9BbGxvYyAqLyAgICAKKyAgICBpZiAoISpQKQorICAgICAgcmV0dXJuIEZUX0FsbG9jKCBzeXN0ZW0sIHNpemUsIFAgKTsKKworICAgIC8qIGlmIHRoZSBuZXcgYmxvY2sgaWYgemVyby1zaXplZCwgY2xlYXIgdGhlIGN1cnJlbnQgb25lICovICAgIAorICAgIGlmIChzaXplIDw9IDApCisgICAgICByZXR1cm4gRlRfRnJlZSggc3lzdGVtLCBQICk7CisgICAgCisgICAgUSA9ICh2b2lkKilyZWFsbG9jKCAqUCwgc2l6ZSApOworICAgIGlmICghUSkKKyAgICB7CisgICAgICBQRVJST1IoKCAiRlRfUmVhbGxvYyA6IHJlYWxsb2NhdGlvbiBmYWlsZWRcbiIgKSk7CisgICAgICByZXR1cm4gRlRfRXJyX091dF9PZl9NZW1vcnk7CisgICAgfQorCisgICAgKlAgPSBROyAgICAKKyAgICByZXR1cm4gRlRfRXJyX09rOworICB9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPEZ1bmN0aW9uPiBGVF9GcmVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgUmVsZWFzZXMgYSBnaXZlbiBibG9jayBvZiBtZW1vcnkgYWxsb2NhdGVkIHRocm91Z2ggRlRfQWxsb2MgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgc3lzdGVtICAgIDo6IGhhbmRsZSB0byBhIGdpdmVuICdzeXN0ZW0gb2JqZWN0JyB3aGVyZSBhbGxvY2F0aW9uICAgICAqLworLyogICAgICAgICAgICAgICAgIG9jY3VyZWQuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgUCAgICAgICAgIDo6IFRoaXMgaXMgdGhlIF9hZGRyZXNzXyBvZiBhIF9wb2ludGVyXyB3aGljaCBwb2ludHMgdG8gICAqLworLyogICAgICAgICAgICAgICAgIHRoZSBhbGxvY2F0ZWQgYmxvY2suIEl0IGlzIGFsd2F5cyBzZXQgdG8gTlVMTCBvbiBleGl0ICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSWYgUCBvciAqUCBhcmUgTlVMTCwgdGhpcyBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIHN1Y2Nlc3NmdWx5LiBUaGlzICAqLworLyogICAgaXMgYSBzdHJvbmcgY29udmVudGlvbiB3aXRoaW4gYWxsIG9mIEZyZWVUeXBlIGFuZCBpdHMgZHJpdmVycy4uICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgIEJBU0VfRlVOQworICBGVF9FcnJvciAgRlRfRnJlZSggRlRfU3lzdGVtICBzeXN0ZW0sCisgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgKlAgKQorICB7CisgICAgKHZvaWQpc3lzdGVtOyAgLyogdW51c2VkIHBhcmFtZXRlci4gR2V0cyByaWQgb2Ygd2FybmluZ3MgKi8KKworICAgIFBUUkFDRTIoKCAiRlRfRnJlZSA6IGZyZWVpbmcgcG9pbnRlciAweCUwOGx4IChibG9jayAweCUwOGx4KVxuIiwKKyAgICAgICAgICAgICAgKGxvbmcpUCwgKFAgPyAobG9uZykqUCA6IC0xKSApKTsKKworICAgIGlmICggIVAgfHwgISpQICkKKyAgICAgIHJldHVybiBGVF9FcnJfT2s7CisKKyAgICBmcmVlKCAqUCApOworICAgICpQID0gTlVMTDsKKworICAgIHJldHVybiBGVF9FcnJfT2s7CisgIH0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgIFNZTkNIUk9OSVpBVElPTiBNQU5BR0VNRU5UICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBUaGlzIHNlY3Rpb24gZGVhbHMgd2l0aCBtdXRleGVzLiBUaGUgbGlicmFyeSBjYW4gYmUgY29tcGlsZWQgdG8gICAgICAqLworLyogICB0aHJlZSBkaXN0aW5jdCB0aHJlYWQtc3VwcG9ydCBsZXZlbHMgKCBuYW1lbHkgc2luZ2xlLXRocmVhZGVkLCAgICAgICAqLworLyogICB0aHJlYWQtc2FmZSBhbmQgcmUtZW50cmFudCBtb2RlcyApLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBJdCBwcm90ZWN0cyBpdHMgdmFyaWFibGVzIHRocm91Z2ggdGhlIE1VVEVYX0xvY2sgYW5kIE1VVEVYX1JlbGVhc2UgICAqLworLyogICBtYWNyb3Mgd2hpY2ggYXJlIHZvaWQgaW4gc2luZ2xlLXRocmVhZGVkIG1vZGUuICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBJdCBkZWZpbmVzIGEgdHlwZS1sZXNzIG11dGV4IHJlZmVyZW5jZSB0eXBlLCAiVE11dGV4IiwgdGhhdCB5b3UncmUgICAqLworLyogICBmcmVlIHRvIHJlZGVmaW5lIGZvciB5b3VyIHN5c3RlbSdzIG5lZWRzLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBmdHN5cy5jIGNvbnRhaW5zIG9ubHkgZHVtbXkgZnVuY3Rpb25zICAqLworLyogICB3aGljaCBhbHdheXMgcmV0dXJuIHN1Y2Nlc2Z1bGx5LiB5b3UgTkVFRCB0byBzcGVjaWFsaXplIHRoZW0gaW4gICAgICAqLworLyogICBvcmRlciB0byBwb3J0IGZ0c3lzLmMgaW4gYW55IG11bHRpLXRocmVhZGVkIGVudmlyb25tZW50Li4uICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisvKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gSXQgaXMgYW4gaW1wbGljaXQgKi8KKy8qIHBhcmFtZXRlciBvZiB0aGUgUFRSQUNFIGFuZCBQRVJST1IgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZyAgICAqLworLyogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyN1bmRlZiAgRlRfQ09NUE9ORU5UCisjZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2Vfc3luYworCisjaWZkZWYgRlRfQ09ORklHX1RIUkVBRFMKKworCisgIEJBU0VfRlVOQworICBGVF9FcnJvciAgRlRfTXV0ZXhfQ3JlYXRlICggRlRfU3lzdGVtICBzeXN0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTXV0ZXgqICAgIG11dGV4ICkKKyAgeworICAgICh2b2lkKXN5c3RlbTsgIC8qIHVudXNlZCBwYXJhbWV0ZXIuIEdldHMgcmlkIG9mIHdhcm5pbmdzICovCisgICAgCisgICAgbXV0ZXggPSAodm9pZCopLTE7CisgICAgc3lzdGVtLT5udW1fbXV0ZXhlcysrOworICAgIHJldHVybiBGVF9FcnJfT2s7CisgICAgLyogUmVwbGFjZSB0aGlzIGxpbmUgd2l0aCB5b3VyIG93biBtdXRleCBjcmVhdGlvbiBjb2RlICovCisgIH0KKworCisgIEJBU0VfRlVOQworICB2b2lkICBGVF9NdXRleF9EZWxldGUgKCBGVF9TeXN0ZW0gIHN5c3RlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVE11dGV4KiAgICBtdXRleCApCisgIHsKKyAgICAodm9pZClzeXN0ZW07IC8qIHVudXNlZCBwYXJhbWV0ZXIuIEdldHMgcmlkIG9mIHdhcm5pbmdzICovCisgICAgCisgICAgbXV0ZXggPSAodm9pZCopMDsKKyAgICBzeXN0ZW0tPm51bV9tdXRleGVzLS07CisgICAgLyogUmVwbGFjZSB0aGlzIGxpbmUgd2l0aCB5b3VyIG93biBtdXRleCBkZXN0cnVjdGlvbiBjb2RlICovCisgIH0KKworICBCQVNFX0ZVTkMKKyAgdm9pZCAgRlRfTXV0ZXhfTG9jayAgICggRlRfU3lzdGVtICBzeXN0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRNdXRleCogICAgbXV0ZXggKQorICB7CisgICAgLyogTk9URTogSXQgaXMgbGVnYWwgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uIHdpdGggYSBOVUxMIGFyZ3VtZW50ICovCisgICAgLyogICAgICAgaW4gd2hpY2ggY2FzZSBhbiBpbW1lZGlhdGUgcmV0dXJuIGlzIGFwcHJvcHJpYXRlLiAgICAgICovCisgICAgKHZvaWQpc3lzdGVtOyAvKiB1bnVzZWQgcGFyYW1ldGVyLiBHZXRzIHJpZCBvZiB3YXJuaW5ncyAqLworICAgIAorICAgIGlmICggIW11dGV4ICkKKyAgICAgIHJldHVybjsKKworICAgIDsgLyogSW5zZXJ0IHlvdXIgb3duIG11dGV4IGxvY2tpbmcgY29kZSBoZXJlICovCisgIH0KKworCisgIHZvaWQgIEZUX011dGV4X1JlbGVhc2UoIEZUX1N5c3RlbSAgc3lzdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUTXV0ZXgqICBtdXRleCApCisgIHsKKyAgICAvKiBOT1RFOiBJdCBpcyBsZWdhbCB0byBjYWxsIHRoaXMgZnVuY3Rpb24gd2l0aCBhIE5VTEwgYXJndW1lbnQgKi8KKyAgICAvKiAgICAgICBpbiB3aGljaCBjYXNlIGFuIGltbWVkaWF0ZSByZXR1cm4gaXMgYXBwcm9wcmlhdGUgICAgICAgKi8KKyAgICAodm9pZClzeXN0ZW07IC8qIHVudXNlZCBwYXJhbWV0ZXIuIEdldHMgcmlkIG9mIHdhcm5pbmdzICovCisgICAgCisgICAgaWYgKCAhbXV0ZXggKQorICAgICAgcmV0dXJuOworICAgIDsgLyogSW5zZXJ0IHlvdXIgb3duIG11dGV4IHJlbGVhc2UgY29kZSBoZXJlICovCisgIH0KKworI2VuZGlmIC8qIEZUX0NPTkZJR19USFJFQURTICovCisKKworCisKKyAgRVhQT1JUX0ZVTkMKKyAgRlRfRXJyb3IgIEZUX05ld19TeXN0ZW0oIEZUX1N5c3RlbSogIHN5c3RlbSApCisgIHsKKyAgICAqc3lzdGVtID0gKEZUX1N5c3RlbSltYWxsb2MoIHNpemVvZihGVF9TeXN0ZW1SZWMpICk7CisgICAgaWYgKCAhKnN5c3RlbSApCisgICAgICByZXR1cm4gRlRfRXJyX091dF9PZl9NZW1vcnk7CisKKyAgICAvKiB0aGUgQU5TSSBmdW5jdGlvbiAnZnJlZScgaXMgdW5hYmxlIHRvICByZXR1cm4gdGhlIG51bWJlciAgICovCisgICAgLyogb2YgcmVsZWFzZWQgYnl0ZXMuIEhlbmNlLCB0aGUgJ2N1cnJlbnRfYWxsb2MnIGZpZWxkIG9mIHRoZSAqLworICAgIC8qIHN5c3RlbSBvYmplY3QgY2Fubm90IGJlIHVzZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAKKyAgICAoKnN5c3RlbSktPnN5c3RlbV9mbGFncyA9IEZUX1NZU1RFTV9GTEFHX1RPVEFMX0FMTE9DIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1NZU1RFTV9GTEFHX01VVEVYRVM7CisgICAgKCpzeXN0ZW0pLT50b3RhbF9hbGxvYyA9IDA7CisgICAgKCpzeXN0ZW0pLT5udW1fbXV0ZXhlcyA9IDA7CisKKyAgICAvKiBpbml0aWFsaXNlIGkvbyBtYW5hZ2VtZW50IChub3RoaW5nKSAqLworICAgIAorICAgIC8qIGluaXRpYWxpc2Ugc3luY2hyb25pc2F0aW9uIChub3RoaW5nKSAqLworICAgIAorICAgIC8qIGluaXRpYWxpc2Ugc3RyZWFtcyAqLworCisgICAgcmV0dXJuIEZUX0Vycl9PazsKKyAgfQorCisKKworICBFWFBPUlRfRlVOQworICBGVF9FcnJvciAgRlRfRG9uZV9TeXN0ZW0oIEZUX1N5c3RlbSAgc3lzdGVtICkKKyAgeworICAgIC8qIGZpbmFsaXNlIHN5bmNyaG9uaXNhdGlvbiAobm90aGluZykgKi8KKyAgICAKKyAgICAvKiBmaW5hbGlzZSBpL28gbWFuYWdlbWVudCAobm90aGluZykgICovCisgICAgCisgICAgLyogZmluYWxpc2UgbWVtb3J5IG1hbmFnZW1lbnQgICAgICAgICAqLworICAgIGZyZWUoIHN5c3RlbSApOworCisgICAgcmV0dXJuIEZUX0Vycl9PazsKKyAgfQorCmRpZmYgLS1naXQgYS9jb25maWcvdW5peC9mdHN5c3RlbS5jIGIvY29uZmlnL3VuaXgvZnRzeXN0ZW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjAyOTEwCi0tLSAvZGV2L251bGwKKysrIGIvY29uZmlnL3VuaXgvZnRzeXN0ZW0uYwpAQCAtMCwwICsxLDI3NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIGZ0c3lzdGVtLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMAorICoKKyAqICAgIFVuaXgtc3BlY2lmaWMgRnJlZVR5cGUgbG93LWxldmVsIHN5c3RlbSBpbnRlcmZhY2UKKyAqCisgKiAgICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRlZmluaXRpb24gb2YgaW50ZXJmYWNlIHVzZWQgYnkgRnJlZVR5cGUKKyAqICAgIHRvIGFjY2VzcyBsb3ctbGV2ZWwsIGkuZS4gbWVtb3J5IG1hbmFnZW1lbnQsIGkvbyBhY2Nlc3MgYXMgd2VsbAorICogICAgYXMgdGhyZWFkIHN5bmNocm9uaXNhdGlvbi4gICAgICAgICAgICAgIAorICoKKyAqCisgKiAgQ29weXJpZ2h0IDE5OTYtMTk5OSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZyAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkICAgICAgICAgIAorICogIG1vZGlmaWVkIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAgICAKKyAqICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICAgCisgKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAgICAKKyAqICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8ZnRzeXN0ZW0uaD4KKyNpbmNsdWRlIDxmdGVycm9ycy5oPgorI2luY2x1ZGUgPGZ0Y29uZmlnLmg+CisjaW5jbHVkZSA8ZnRkZWJ1Zy5oPgorCisvKiBNZW1vcnktbWFwcGluZyBpbmNsdWRlcyBhbmQgZGVmaW5pdGlvbnMuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNpZmRlZiBIQVZFX1VOSVNURF9ICisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisjaWZuZGVmIE1BUF9GSUxFCisjZGVmaW5lIE1BUF9GSUxFICAweDAwCisjZW5kaWYKKworLyoKKyAqIFRoZSBwcm90b3R5cGUgZm9yIG11bm1hcCgpIGlzIG5vdCBwcm92aWRlZCBvbiBTdW5PUy4gIFRoaXMgbmVlZHMgdG8KKyAqIGhhdmUgYSBjaGVjayBhZGRlZCBsYXRlciB0byBzZWUgaWYgdGhlIEdOVSBDIGxpYnJhcnkgaXMgYmVpbmcgdXNlZC4KKyAqIElmIHNvLCB0aGVuIHRoaXMgcHJvdG90eXBlIGlzIG5vdCBuZWVkZWQuCisgKi8KKyNpZiBkZWZpbmVkKF9fc3VuX18pICYmICFkZWZpbmVkKFNWUjQpICYmICFkZWZpbmVkKF9fU1ZSNCkKKyAgZXh0ZXJuIGludCAgbXVubWFwKCBjYWRkcl90ICBhZGRyLCBpbnQgIGxlbiApOworI2VuZGlmCisKKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2lmZGVmIEhBVkVfRkNOVExfSAorI2luY2x1ZGUgPGZjbnRsLmg+CisjZW5kaWYKKworCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICBNRU1PUlkgTUFOQUdFTUVOVCBJTlRFUkZBQ0UgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiA8RnVuY1R5cGU+CisgKiAgICBGVF9BbGxvY19GdW5jCisgKgorICogPERlc2NyaXB0aW9uPgorICogICAgVGhlIG1lbW9yeSBhbGxvY2F0b3IgZnVuY3Rpb24gdHlwZQorICoKKyAqIDxJbnB1dD4KKyAqICAgIHN5c3RlbSAgICA6OiBwb2ludGVyIHRvIHRoZSBzeXN0ZW0gb2JqZWN0CisgKiAgICBzaXplICAgICAgOjogcmVxdWVzdGVkIHNpemUgaW4gYnl0ZXMKKyAqCisgKiA8T3V0cHV0PgorICogICAgYmxvY2sgICAgIDo6IGFkZHJlc3Mgb2YgbmV3bHkgYWxsb2NhdGVkIGJsb2NrCisgKgorICogPFJldHVybj4gIAorICogICAgRXJyb3IgY29kZS4gMCBtZWFucyBzdWNjZXNzLgorICoKKyAqIDxOb3RlPgorICogICAgSWYgeW91ciBhbGxvY2F0aW9uIHJvdXRpbmUgQUxXQVlTIHplcm9lcyB0aGUgbmV3IGJsb2NrLCB5b3UKKyAqICAgIHNob3VsZCBzZXQgdGhlIGZsYWcgRlRfU1lTVEVNX0ZMQUdfQUxMT0NfWkVST0VTIGluIHlvdXIgc3lzdGVtCisgKiAgICBvYmplY3QgJ2ZsYWdzJyBmaWVsZC4KKyAqCisgKiAgICBJZiB5b3UgaGF2ZSBzZXQgdGhlIGZsYWcgRlRfU1lTVEVNX0ZMQUdfUkVQT1JUX0NVUlJFTlRfQUxMT0MgaW4KKyAqICAgIHlvdXIgc3lzdGVtJ3MgInN5c3RlbV9mbGFncyIgZmllbGQsIHRoaXMgZnVuY3Rpb24gc2hvdWxkIHVwZGF0ZQorICogICAgdGhlICJjdXJyZW50X2FsbG9jIiBmaWVsZCBvZiB0aGUgc3lzdGVtIG9iamVjdC4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIHN0YXRpYworICB2b2lkKiAgZnRfYWxsb2MoIEZUX01lbW9yeSAgbWVtb3J5LAorICAgICAgICAgICAgICAgICAgIGxvbmcgICAgICAgc2l6ZSApCisgIHsKKyAgICAodm9pZCltZW1vcnk7CisgICAgcmV0dXJuIG1hbGxvYyhzaXplKTsKKyAgfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiA8RnVuY1R5cGU+CisgKiAgICBGVF9SZWFsbG9jX0Z1bmMKKyAqCisgKiA8RGVzY3JpcHRpb24+CisgKiAgICBUaGUgbWVtb3J5IHJlYWxsb2NhdG9yIGZ1bmN0aW9uIHR5cGUKKyAqCisgKiA8SW5wdXQ+CisgKiAgICBzeXN0ZW0gICA6OiBwb2ludGVyIHRvIHRoZSBzeXN0ZW0gb2JqZWN0CisgKiAgICBuZXdfc2l6ZSA6OiBuZXcgcmVxdWVzdGVkIHNpemUgaW4gYnl0ZXMKKyAqCisgKiA8SW5PdXQ+CisgKiAgICBibG9jayAgICA6OiBhZGRyZXNzIG9mIGJsb2NrIGluIG1lbW9yeQorICoKKyAqIDxSZXR1cm4+CisgKiAgICBFcnJvciBjb2RlLiAwIG1lYW5zIHN1Y2Nlc3MuCisgKgorICogPE5vdGU+CisgKiAgICBUaGlzIGZ1bmN0aW9uIGlzIF9uZXZlcl8gY2FsbGVkIHdoZW4gdGhlIHN5c3RlbSBmbGFnIAorICogICAgRlRfU1lTVEVNX0ZMQUdfTk9fUkVBTExPQyBpcyBzZXQuIEluc3RlYWQsIHRoZSBlbmdpbmUgd2lsbCBlbXVsYXRlCisgKiAgICByZWFsbG9jIHRocm91Z2ggImFsbG9jIiBhbmQgImZyZWUiLgorICoKKyAqICAgIE5vdGUgdGhhdCB0aGlzIGlzIHBvc3NpYmxlIGR1ZSB0byB0aGUgZmFjdCB0aGF0IEZyZWVUeXBlJ3MKKyAqICAgICJGVF9SZWFsbG9jIiBhbHdheXMgcmVxdWVzdHMgdGhlIF9jdXJyZW50XyBzaXplIG9mIHRoZSByZWFsbG9jYXRlZAorICogICAgYmxvY2sgYXMgYSBwYXJhbWV0ZXIsIHRodXMgYXZvaWRpbmcgbWVtb3J5IGxlYWtzLgorICoKKyAqICAgIElmIHlvdSBoYXZlIHNldCB0aGUgZmxhZyBGVF9TWVNURU1fRkxBR19SRVBPUlRfQ1VSUkVOVF9BTExPQyBpbgorICogICAgeW91ciBzeXN0ZW0ncyAic3lzdGVtX2ZsYWdzIiBmaWVsZCwgdGhpcyBmdW5jdGlvbiBzaG91bGQgdXBkYXRlCisgKiAgICB0aGUgImN1cnJlbnRfYWxsb2MiIGZpZWxkIG9mIHRoZSBzeXN0ZW0gb2JqZWN0LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgc3RhdGljCisgIHZvaWQqICBmdF9yZWFsbG9jKCBGVF9NZW1vcnkgIG1lbW9yeSwKKyAgICAgICAgICAgICAgICAgICAgIGxvbmcgICAgICAgY3VyX3NpemUsCisgICAgICAgICAgICAgICAgICAgICBsb25nICAgICAgIG5ld19zaXplLAorICAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICBibG9jayApCisgIHsKKyAgICAodm9pZCltZW1vcnk7CisgICAgKHZvaWQpY3VyX3NpemU7CisKKyAgICByZXR1cm4gcmVhbGxvYyggYmxvY2ssIG5ld19zaXplICk7CisgIH0KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogPEZ1bmNUeXBlPgorICogICAgRlRfRnJlZV9GdW5jCisgKgorICogPERlc2NyaXB0aW9uPgorICogICAgVGhlIG1lbW9yeSByZWxlYXNlIGZ1bmN0aW9uIHR5cGUKKyAqCisgKiA8SW5wdXQ+CisgKiAgICBzeXN0ZW0gIDo6IHBvaW50ZXIgdG8gdGhlIHN5c3RlbSBvYmplY3QKKyAqICAgIGJsb2NrICAgOjogYWRkcmVzcyBvZiBibG9jayBpbiBtZW1vcnkKKyAqCisgKiA8Tm90ZT4KKyAqICAgIElmIHlvdSBoYXZlIHNldCB0aGUgZmxhZyBGVF9TWVNURU1fRkxBR19SRVBPUlRfQ1VSUkVOVF9BTExPQyBpbgorICogICAgeW91ciBzeXN0ZW0ncyAic3lzdGVtX2ZsYWdzIiBmaWVsZCwgdGhpcyBmdW5jdGlvbiBzaG91bGQgdXBkYXRlCisgKiAgICB0aGUgImN1cnJlbnRfYWxsb2MiIGZpZWxkIG9mIHRoZSBzeXN0ZW0gb2JqZWN0LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgc3RhdGljCisgIHZvaWQgIGZ0X2ZyZWUoIEZUX01lbW9yeSAgbWVtb3J5LAorICAgICAgICAgICAgICAgICB2b2lkKiAgICAgIGJsb2NrICkKKyAgeworICAgICh2b2lkKW1lbW9yeTsKKyAgICBmcmVlKCBibG9jayApOworICB9CisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICBSRVNPVVJDRSBNQU5BR0VNRU5UIElOVEVSRkFDRSAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworLyogV2UgdXNlIHRoZSBtYWNybyBTVFJFQU1fRmlsZSBhcyBhIGNvbnZlbmllbmNlIHRvIGV4dHJhY3QgdGhlICAgICAgKi8KKy8qIHN5c3RlbS1zcGVjaWZpYyBzdHJlYW0gaGFuZGxlIGZyb20gYSBnaXZlbiBGcmVlVHlwZSBzdHJlYW0gb2JqZWN0ICovCisjZGVmaW5lIFNUUkVBTV9GaWxlKHN0cmVhbSkgICgodm9pZCopc3RyZWFtLT5kZXNjcmlwdG9yLnBvaW50ZXIpCisKKworI3VuZGVmICBGVF9DT01QT05FTlQKKyNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV9pbworCisgIHN0YXRpYworICB2b2lkICBmdF9jbG9zZV9zdHJlYW0oIEZUX1N0cmVhbSAgc3RyZWFtICkKKyAgeworICAgIG11bm1hcCAoIHN0cmVhbS0+ZGVzY3JpcHRvci5wb2ludGVyLCBzdHJlYW0tPnNpemUgKTsKKyAgICAgICAgCisgICAgc3RyZWFtLT5kZXNjcmlwdG9yLnBvaW50ZXIgPSBOVUxMOworICAgIHN0cmVhbS0+c2l6ZSAgICAgICAgICAgICAgID0gMDsKKyAgICBzdHJlYW0tPmJhc2UgICAgICAgICAgICAgICA9IDA7CisgIH0KKworCisgIGV4dGVybgorICBpbnQgIEZUX05ld19TdHJlYW0oIGNvbnN0IGNoYXIqICBmaWxlcGF0aG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICAgIHN0cmVhbSApCisgIHsKKyAgICBpbnQgICAgICAgICAgZmlsZTsKKyAgICBzdHJ1Y3Qgc3RhdCAgc3RhdF9idWY7CisKKyAgICAvKiBvcGVuIHRoZSBmaWxlICovCisgICAgZmlsZSA9IG9wZW4oIGZpbGVwYXRobmFtZSwgT19SRE9OTFkgKTsKKyAgICBpZiAoZmlsZSA8IDApCisgICAgeworICAgICAgRlRfRVJST1IoKCAiRlQuVW5peC5PcGVuOiIgKSk7CisgICAgICBGVF9FUlJPUigoICIgY291bGQgbm90IG9wZW4gJyVzJ1xuIiwgZmlsZXBhdGhuYW1lICkpOworICAgICAgcmV0dXJuIEZUX0Vycl9DYW5ub3RfT3Blbl9TdHJlYW07CisgICAgfQorCisgICAgaWYgKGZzdGF0KCBmaWxlLCAmc3RhdF9idWYgKSA8IDApCisgICAgeworICAgICAgRlRfRVJST1IoKCAiRlQuVW5peC5PcGVuOiIgKSk7CisgICAgICBGVF9FUlJPUigoICIgY291bGQgbm90ICdmc3RhdCcgZmlsZSAnJXMnXG4iLCBmaWxlcGF0aG5hbWUgKSk7CisgICAgICBnb3RvIEZhaWxfTWFwOworICAgIH0KKyAgICAgIAorICAgIHN0cmVhbS0+c2l6ZSAgICAgPSBzdGF0X2J1Zi5zdF9zaXplOworICAgIHN0cmVhbS0+cG9zICAgICAgPSAwOworICAgIHN0cmVhbS0+YmFzZSAgICAgPSBtbWFwKCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0tPnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST1RfUkVBRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFQX0ZJTEUgfCBNQVBfUFJJVkFURSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCApOworCisgICAgaWYgKCAobG9uZylzdHJlYW0tPmJhc2UgPT0gLTEgKQorICAgIHsKKyAgICAgIEZUX0VSUk9SKCggIkZULlVuaXguT3BlbjoiICkpOworICAgICAgRlRfRVJST1IoKCAiIENvdWxkIG5vdCBtYXAgZmlsZSAnJXMnXG4iLCBmaWxlcGF0aG5hbWUgKSk7CisgICAgICBnb3RvIEZhaWxfTWFwOworICAgIH0KKworICAgIGNsb3NlKGZpbGUpOworCisgICAgc3RyZWFtLT5kZXNjcmlwdG9yLnBvaW50ZXIgPSBzdHJlYW0tPmJhc2U7CisgICAgc3RyZWFtLT5wYXRobmFtZS5wb2ludGVyICAgPSAoY2hhciopZmlsZXBhdGhuYW1lOworICAgIAorICAgIHN0cmVhbS0+Y2xvc2UgPSBmdF9jbG9zZV9zdHJlYW07CisgICAgc3RyZWFtLT5yZWFkICA9IDA7CisgICAgCisgICAgRlRfVFJBQ0UxKCggIkZULlVuaXguT3BlbjoiICkpOworICAgIEZUX1RSQUNFMSgoICIgb3BlbmVkICclcycgKCVkIGJ5dGVzKSBzdWNjZXNmdWxseVxuIiwKKyAgICAgICAgICAgICAgICBmaWxlcGF0aG5hbWUsIHN0cmVhbS0+c2l6ZSApKTsKKworICAgIHJldHVybiBGVF9FcnJfT2s7CisgICAgCisgIEZhaWxfTWFwOgorICAgIGNsb3NlKGZpbGUpOworICAgIHN0cmVhbS0+YmFzZSAgICAgID0gTlVMTDsKKyAgICBzdHJlYW0tPnNpemUgICAgICA9IDA7CisgICAgc3RyZWFtLT5wb3MgICAgICAgPSAwOworICAgIAorICAgIHJldHVybiBGVF9FcnJfQ2Fubm90X09wZW5fU3RyZWFtOworICB9CisKKworICBleHRlcm4KKyAgRlRfTWVtb3J5ICBGVF9OZXdfTWVtb3J5KCB2b2lkICkKKyAgeworICAgIEZUX01lbW9yeSAgbWVtb3J5OworICAgIAorICAgIG1lbW9yeSA9IChGVF9NZW1vcnkpbWFsbG9jKCBzaXplb2YoKm1lbW9yeSkgKTsKKyAgICBpZiAobWVtb3J5KQorICAgIHsKKyAgICAgIG1lbW9yeS0+dXNlciAgICA9IDA7CisgICAgICBtZW1vcnktPmFsbG9jICAgPSBmdF9hbGxvYzsKKyAgICAgIG1lbW9yeS0+cmVhbGxvYyA9IGZ0X3JlYWxsb2M7CisgICAgICBtZW1vcnktPmZyZWUgICAgPSBmdF9mcmVlOworICAgIH0KKyAgICByZXR1cm4gbWVtb3J5OworICB9CisKZGlmZiAtLWdpdCBhL2NvbmZpZy93aW4zMi9NYWtlZmlsZS5nY2MgYi9jb25maWcvd2luMzIvTWFrZWZpbGUuZ2NjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4MWE1YzYKLS0tIC9kZXYvbnVsbAorKysgYi9jb25maWcvd2luMzIvTWFrZWZpbGUuZ2NjCkBAIC0wLDAgKzEsMTc5IEBACisjKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIyoKKyMqICBGcmVlVHlwZSAyIENvbmZpZ3VyYXRpb24gcnVsZXMgZm9yIFVuaXggKyBnY2MKKyMqCisjKiAgQ29weXJpZ2h0IDE5OTYtMTk5OSBieQorIyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyMqCisjKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkCisjKiAgbW9kaWZpZWQgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorIyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorIyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorIyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyMqCisjKgorIyogIFRoZSBwdXJwb3NlIG9mIHRoaXMgc3ViLU1ha2VmaWxlIGlzIHRvIGRlZmluZSB2YXJpb3VzIGJ1aWxkIGFuZAorIyogIHBsYXRmb3JtIHNwZWNpZmljIHZhcmlhYmxlcyBiZWZvcmUgaW5jbHVkaW5nIHRoZSBzdWItTWFrZWZpbGUKKyMqICBjb250YWluaW5nIHRoZSBGcmVlVHlwZSBsaWJyYXJ5IHJ1bGVzLCBmb3VuZCBpbgorIyoKKyMqICAgICAkKFRPUCkvY29uZmlnL2ZyZWV0eXBlLm1rCisjKgorIyogIFRoZSBmb2xsb3dpbmcgdmFyaWFibGVzIG11c3QgYmUgZGVmaW5lZCBiZWZvcmUgaW5jbHVkaW5nIHRoaXMKKyMqICBmaWxlIDoKKyMqCisjKiAgICAgVE9QICAgICAgICAgIFBhdGhuYW1lIHRvIHRoZSB0b3Agb2YgdGhlIEZyZWVUeXBlIHNvdXJjZXMKKyMqICAgICAgICAgICAgICAgICAgaGllcmFyY2h5CisjKgorIyogIFRoaXMgZmlsZSBzaG91bGQgZGVmaW5lIHRoZSBmb2xsb3dpbmcgdmFyaWFibGVzIGJlZm9yZSBpbmNsdWRpbmcKKyMqICB0aGUgRnJlZVR5cGUgbGlicmFyeSBydWxlcyBmaWxlIDoKKyMqCisjKiAgICAgQlVJTEQgICAgICAgIFBhdGhuYW1lIHRvIHRoZSBwbGF0Zm9ybS1zcGVjaWZpYyBmaWxlcyB1c2VkCisjKiAgICAgICAgICAgICAgICAgIGZvciB0aGUgYnVpbGQuIFVzdWFsbHkgYCQoVE9QKS9jb25maWcvPHN5c3RlbT4nCisjKgorIyogICAgIFNFUCAgICAgICAgICBEaXJlY3Rvcnkgc2VwYXJhdG9yIGZvciB0aGUgY3VycmVudCBwbGF0Zm9ybS4KKyMqICAgICAgICAgICAgICAgICAgRWl0aGVyIC8gb3IgXCAobWF5YmUgOiBvbiBNYWNzKQorIyogCisjKiAgICAgREVMRVRFICAgICAgIFRoZSBmb3JjZWQgcmVtb3ZlL2RlbGV0ZSBjb21tYW5kIHRvIGVyYXNlIG9uZSBvciBtb3JlCisjKiAgICAgICAgICAgICAgICAgIGZpbGVzCisjKgorIyogICAgIElOQ0xVREUgICAgICBUaGUgbG9jYXRpb24gb2YgYWxsIHB1YmxpYyBoZWFkZXIgZmlsZXMuIGUuZy4KKyMqICAgICAgICAgICAgICAgICAgYCQoVE9QKS9pbmNsdWRlJ2luY2x1ZGUnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisjKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisjKiAgICAgU1JDICAgICAgICAgIFRoZSBkaXJlY3RvcnkgY29udGFpbmluZyBhbGwgc291cmNlcy4gZS5nLiAgICAgICAgICAgICAgCisjKiAgICAgICAgICAgICAgICAgICckKFRPUCkvc3JjJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyMqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisjKiAgICAgT0JKX0RJUiAgICAgIFRoZSBsb2NhdGlvbiB3aGVyZSBjb21waWxlZCBvYmplY3QgZmlsZXMgd2lsbCBiZSAgICAgICAgIAorIyogICAgICAgICAgICAgICAgICBwbGFjZWQsIGUuZy4gJyQoVE9QKS9vYmonICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisjKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorIyogICAgIExJQl9ESVIgICAgICBUaGUgbG9jYXRpb24gd2hlcmUgdGhlIHJlc3VsdGluZyBsaWJyYXJ5IGZpbGUgd2lsbCBiZSAgICAKKyMqICAgICAgICAgICAgICAgICAgcGxhY2VkLCBlLmcuICckKFRPUCkvb2JqJyAgICAgICAgICAgICAgICAgICAgICAgIAorIyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyMqICAgICBMSUJSQVJZICAgICAgVGhlIGZpbGVuYW1lIG9mIHRoZSByZXN1bHRpbmcgbGlicmFyeSBmaWxlLCB3aXRob3V0ICAgICAgCisjKiAgICAgICAgICAgICAgICAgIGl0cyBleHRlbnNpb24uLiBlLmcuICdsaWJmcmVldHlwZScgb3IgJ2ZyZWV0eXBlJyAgICAgICAgIAorIyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyMqICAgICBPICAgICAgICAgICAgVGhlIG9iamVjdCBmaWxlIHN1ZmZpeC4gIENhbiBiZSAnLm8nLCAnLm9iaiwnICcubG8sJyAgICAgCisjKiAgICAgICAgICAgICAgICAgICc7Y29mZiwnIGV0Yy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorIyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyMqICAgICBBICAgICAgICAgICAgVGhlIGxpYnJhcnkgZmlsZSBzdWZmaXguICBDYW4gYmUgJy5hJyAnLnNvLCcgJy5saWInICAgICAgCisjKiAgICAgICAgICAgICAgICAgICcuZGxsLCcgZXRjLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorIyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyMqICAgICBJICAgICAgICAgICAgVGhlIHBhdGggaW5jbHVzaW9uIGZsYWcuICBTb21lIGNvbXBpbGVycyB1c2UgYSAgICAgICAgICAgCisjKiAgICAgICAgICAgICAgICAgIGRpZmZlcmVudCBmbGFnIHRoYW4gJy1JJyB0byBzcGVjaWZ5IGFuIGFkZGl0aW9uYWwgICAgICAgIAorIyogICAgICAgICAgICAgICAgICBpbmNsdWRlIHBhdGguICBFeGFtcGxlcyBhcmUgJy9pPScgb3IgJy1KICcsIGV0Yy4gICAgICAgICAKKyMqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisjKiAgICAgRCAgICAgICAgICAgIFRoZSBtYWNybyBkZWZpbml0aW9uIGZsYWcuICBJIGhhdmVuJ3QgbWV0IGNvbXBpbGVycyAgICAgIAorIyogICAgICAgICAgICAgICAgICB3aGljaCBkb24ndCB1c2UgdGhlICctRCcgc3dpdGNoIHRvIGRlZmluZSBhIG1hY3JvLCBidXQgICAKKyMqICAgICAgICAgICAgICAgICAgd2hvIGtub3dzLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisjKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorIyogICAgIFQgICAgICAgICAgICBUaGUgY29tcGlsYXRpb24gZmxhZyB1c2VkIHRvIGlkZW50aWZ5IHRoZSB0YXJnZXQuIFNvbWUgICAKKyMqICAgICAgICAgICAgICAgICAgY29tcGlsZXJzIHVzZSBhIGRpZmZlcmVudCBmbGFnIHRoYW4gJy1vICcgdG8gc3BlY2lmeSAgICAgCisjKiAgICAgICAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSB0YXJnZXQgb2JqZWN0IGZpbGUuICAgICAgICAgICAgICAgICAgICAgIAorIyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyMqICAgICBDRkxBR1MgICAgICAgVGhlIHNldCBvZiBmbGFncyB1c2VkIHRvIGNvbXBpbGUgb2JqZWN0IGZpbGVzLgorIyogICAgICAgICAgICAgICAgICAodXN1YWxseSBjb250YWlucyB0aGUgZmxhZyAnLWMnKS4KKyMqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisjKgorIyoKKyMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKK2lmbmRlZiBUT1AKK1RPUCA6PSAuCitlbmRpZgorCitERUxFVEUgICA6PSBkZWwKK1NFUCAgICAgIDo9IC8KK0JVSUxEICAgIDo9ICQoVE9QKS9jb25maWcvd2luMzIKK1BMQVRGT1JNIDo9IHdpbjMyCitDQyAgICAgICA6PSBnY2MKKworIyB0aGUgZGlyZWN0b3J5IHdoZXJlIGFsbCBvYmplY3QgZmlsZXMgYXJlIHBsYWNlZAorIworT0JKX0RJUiA6PSAkKFRPUCkvb2JqCisKKworIyB0aGUgZGlyZWN0b3J5IHdoZXJlIGFsbCBsaWJyYXJ5IGZpbGVzIGFyZSBwbGFjZWQKKyMKKyMgIGJ5IGRlZmF1bHQsIHRoaXMgaXMgdGhlIHNhbWUgYXMgT0JKX0RJUiwgaG93ZXZlciwgdGhpcyBjYW4gYmUKKyMgIGNoYW5nZWQgdG8gc3VpdCBwYXJ0aWN1bGFyIG5lZWRzLi4KKyMKK0xJQl9ESVIgOj0gJChPQkpfRElSKQorCisKKyMgdGhlIG9iamVjdCBmaWxlIGV4dGVuc2lvbiwgdGhpcyBjYW4gYmUgLm8sIC50Y28sIC5vYmosIGV0Yy4uCisjIGRlcGVuZGluZyBvbiB0aGUgcGxhdGZvcm0KKyMKK08gOj0gbworCisjIHRoZSBsaWJyYXJ5IGZpbGUgZXh0ZW5zaW9uLCB0aGlzIGNhbiBiZSAuYSwgLmxpYiwgZXRjLi4KKyMgZGVwZW5kaW5nIG9uIHRoZSBwbGF0Zm9ybQorIworQSA6PSBhCisKKworIyBUaGUgbmFtZSBvZiB0aGUgZmluYWwgbGlicmFyeSBmaWxlLgorIyBOb3RlIHRoYXQgdGhlIERPUy1zcGVjaWZpYyBNYWtlZmlsZSB1c2VzIGEgc2hvcnRlciAoOC4zKSBuYW1lCisjCitMSUJSQVJZIDo9IGxpYmZyZWV0eXBlCisKKworIyBwYXRoIGluY2x1c2lvbiBmbGFnLgorIworIyAgU29tZSBjb21waWxlcnMgdXNlIGEgZGlmZmVyZW50IGZsYWcgdGhhbiAnLUknIHRvIHNwZWNpZnkgYW4KKyMgIGFkZGl0aW9uYWwgaW5jbHVkZSBwYXRoLiBFeGFtcGxlcyBhcmUgIi9pPSIgb3IgIi1KIiwgZXRjLi4uCisjCitJIDo9IC1JCisKKworIyBUaGUgbGluayBmbGFnIHVzZWQgdG8gc3BlY2lmeSBhIGdpdmVuIGxpYnJhcnkgZmlsZSBvbiBsaW5rLgorIyBOb3RlIHRoYXQgdGhpcyBpcyBvbmx5IHVzZWQgdG8gY29tcGlsZSB0aGUgZGVtbyBwcm9ncmFtcywgbm90CisjIHRoZSBsaWJyYXJ5IGl0c2VsZi4KKyMKK0wgOj0gLWwKKworCisjIEMgZmxhZyB1c2VkIHRvIGRlZmluZSBhIG1hY3JvIGJlZm9yZSB0aGUgY29tcGlsYXRpb24gb2YgYSBnaXZlbgorIyBzb3VyY2Ugb2JqZWN0LiBVc3VhbGx5IGlzICctRCcgbGlrZSBpbiAiLURERUJVRyIKKyMKK0QgOj0gLUQKKworCisjIFRhcmdldCBmbGFnIC0gYmV3YXJlLCB0aGVyZSBpcyBhIHNwYWNlIGFmdGVyIHRoZSAnbycgISEKKyMKKyMKK1QgOj0gLW8gCisKKyMgQyBmbGFncworIworIyAgIFRoZXNlIHNob3VsZCBjb25jZXJuIDoKKyMKKyMgICAgIC0gZGVidWcgb3V0cHV0CisjICAgICAtIG9wdGltaXphdGlvbgorIyAgICAgLSB3YXJuaW5ncworIyAgICAgLSBhbnNpIGNvbXBsaWFuY2UuLgorIworaWZuZGVmIENGTEFHUworQ0ZMQUdTIDo9IC1jIC1nIC1PNiAtV2FsbAorZW5kaWYKKworCitpZmRlZiBCVUlMRF9GUkVFVFlQRQorCitpbmNsdWRlICQoVE9QKS9jb25maWcvZnJlZXR5cGUubWsKKworIyBMaWJyYXJpYW4gdG8gdXNlIHRvIGJ1aWxkIHRoZSBzdGF0aWMgbGlicmFyeQorIworRlRfTElCUkFSSUFOIDo9ICQoQVIpIC1yCisKKworIyBUaGlzIGZpbmFsIHJ1bGUgaXMgdXNlZCB0byBsaW5rIGFsbCBvYmplY3QgZmlsZXMgaW50byBhIHNpbmdsZQorIyBsaWJyYXJ5LiBJdCBpcyBwYXJ0IG9mIHRoZSBzeXN0ZW0tc3BlY2lmaWMgc3ViLU1ha2VmaWxlIGJlY2F1c2Ugbm90CisjIGFsbCBsaWJyYXJpYW5zIGFjY2VwdCBhIHNpbXBsZSBzeW50YXggbGlrZSA6CisjCisjICAgIGxpYnJhcmlhbiBsaWJyYXJ5X2ZpbGUge2xpc3Qgb2Ygb2JqZWN0IGZpbGVzfSAKKyMKKyQoRlRfTElCUkFSWSk6ICQoT0JKRUNUU19MSVNUKQorCS0kKERFTEVURSkgJEAKKwkkKEZUX0xJQlJBUklBTikgJEAgJChPQkpFQ1RTX0xJU1QpCisKK2VuZGlmCisKZGlmZiAtLWdpdCBhL2NvbmZpZy93aW4zMi9NYWtlZmlsZS5sY2MgYi9jb25maWcvd2luMzIvTWFrZWZpbGUubGNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyY2QwM2QKLS0tIC9kZXYvbnVsbAorKysgYi9jb25maWcvd2luMzIvTWFrZWZpbGUubGNjCkBAIC0wLDAgKzEsMTgwIEBACisjKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIyoKKyMqICBGcmVlVHlwZSAyIENvbmZpZ3VyYXRpb24gcnVsZXMgZm9yIFVuaXggKyBnY2MKKyMqCisjKiAgQ29weXJpZ2h0IDE5OTYtMTk5OSBieQorIyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyMqCisjKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkCisjKiAgbW9kaWZpZWQgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorIyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorIyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorIyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyMqCisjKgorIyogIFRoZSBwdXJwb3NlIG9mIHRoaXMgc3ViLU1ha2VmaWxlIGlzIHRvIGRlZmluZSB2YXJpb3VzIGJ1aWxkIGFuZAorIyogIHBsYXRmb3JtIHNwZWNpZmljIHZhcmlhYmxlcyBiZWZvcmUgaW5jbHVkaW5nIHRoZSBzdWItTWFrZWZpbGUKKyMqICBjb250YWluaW5nIHRoZSBGcmVlVHlwZSBsaWJyYXJ5IHJ1bGVzLCBmb3VuZCBpbgorIyoKKyMqICAgICAkKFRPUCkvY29uZmlnL2ZyZWV0eXBlLm1rCisjKgorIyogIFRoZSBmb2xsb3dpbmcgdmFyaWFibGVzIG11c3QgYmUgZGVmaW5lZCBiZWZvcmUgaW5jbHVkaW5nIHRoaXMKKyMqICBmaWxlIDoKKyMqCisjKiAgICAgVE9QICAgICAgICAgIFBhdGhuYW1lIHRvIHRoZSB0b3Agb2YgdGhlIEZyZWVUeXBlIHNvdXJjZXMKKyMqICAgICAgICAgICAgICAgICAgaGllcmFyY2h5CisjKgorIyogIFRoaXMgZmlsZSBzaG91bGQgZGVmaW5lIHRoZSBmb2xsb3dpbmcgdmFyaWFibGVzIGJlZm9yZSBpbmNsdWRpbmcKKyMqICB0aGUgRnJlZVR5cGUgbGlicmFyeSBydWxlcyBmaWxlIDoKKyMqCisjKiAgICAgQlVJTEQgICAgICAgIFBhdGhuYW1lIHRvIHRoZSBwbGF0Zm9ybS1zcGVjaWZpYyBmaWxlcyB1c2VkCisjKiAgICAgICAgICAgICAgICAgIGZvciB0aGUgYnVpbGQuIFVzdWFsbHkgYCQoVE9QKS9jb25maWcvPHN5c3RlbT4nCisjKgorIyogICAgIFNFUCAgICAgICAgICBEaXJlY3Rvcnkgc2VwYXJhdG9yIGZvciB0aGUgY3VycmVudCBwbGF0Zm9ybS4KKyMqICAgICAgICAgICAgICAgICAgRWl0aGVyIC8gb3IgXCAobWF5YmUgOiBvbiBNYWNzKQorIyogCisjKiAgICAgREVMRVRFICAgICAgIFRoZSBmb3JjZWQgcmVtb3ZlL2RlbGV0ZSBjb21tYW5kIHRvIGVyYXNlIG9uZSBvciBtb3JlCisjKiAgICAgICAgICAgICAgICAgIGZpbGVzCisjKgorIyogICAgIElOQ0xVREUgICAgICBUaGUgbG9jYXRpb24gb2YgYWxsIHB1YmxpYyBoZWFkZXIgZmlsZXMuIGUuZy4KKyMqICAgICAgICAgICAgICAgICAgYCQoVE9QKS9pbmNsdWRlJ2luY2x1ZGUnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisjKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisjKiAgICAgU1JDICAgICAgICAgIFRoZSBkaXJlY3RvcnkgY29udGFpbmluZyBhbGwgc291cmNlcy4gZS5nLiAgICAgICAgICAgICAgCisjKiAgICAgICAgICAgICAgICAgICckKFRPUCkvc3JjJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyMqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisjKiAgICAgT0JKX0RJUiAgICAgIFRoZSBsb2NhdGlvbiB3aGVyZSBjb21waWxlZCBvYmplY3QgZmlsZXMgd2lsbCBiZSAgICAgICAgIAorIyogICAgICAgICAgICAgICAgICBwbGFjZWQsIGUuZy4gJyQoVE9QKS9vYmonICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisjKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorIyogICAgIExJQl9ESVIgICAgICBUaGUgbG9jYXRpb24gd2hlcmUgdGhlIHJlc3VsdGluZyBsaWJyYXJ5IGZpbGUgd2lsbCBiZSAgICAKKyMqICAgICAgICAgICAgICAgICAgcGxhY2VkLCBlLmcuICckKFRPUCkvb2JqJyAgICAgICAgICAgICAgICAgICAgICAgIAorIyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyMqICAgICBMSUJSQVJZICAgICAgVGhlIGZpbGVuYW1lIG9mIHRoZSByZXN1bHRpbmcgbGlicmFyeSBmaWxlLCB3aXRob3V0ICAgICAgCisjKiAgICAgICAgICAgICAgICAgIGl0cyBleHRlbnNpb24uLiBlLmcuICdsaWJmcmVldHlwZScgb3IgJ2ZyZWV0eXBlJyAgICAgICAgIAorIyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyMqICAgICBPICAgICAgICAgICAgVGhlIG9iamVjdCBmaWxlIHN1ZmZpeC4gIENhbiBiZSAnLm8nLCAnLm9iaiwnICcubG8sJyAgICAgCisjKiAgICAgICAgICAgICAgICAgICc7Y29mZiwnIGV0Yy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorIyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyMqICAgICBBICAgICAgICAgICAgVGhlIGxpYnJhcnkgZmlsZSBzdWZmaXguICBDYW4gYmUgJy5hJyAnLnNvLCcgJy5saWInICAgICAgCisjKiAgICAgICAgICAgICAgICAgICcuZGxsLCcgZXRjLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorIyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyMqICAgICBJICAgICAgICAgICAgVGhlIHBhdGggaW5jbHVzaW9uIGZsYWcuICBTb21lIGNvbXBpbGVycyB1c2UgYSAgICAgICAgICAgCisjKiAgICAgICAgICAgICAgICAgIGRpZmZlcmVudCBmbGFnIHRoYW4gJy1JJyB0byBzcGVjaWZ5IGFuIGFkZGl0aW9uYWwgICAgICAgIAorIyogICAgICAgICAgICAgICAgICBpbmNsdWRlIHBhdGguICBFeGFtcGxlcyBhcmUgJy9pPScgb3IgJy1KICcsIGV0Yy4gICAgICAgICAKKyMqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisjKiAgICAgRCAgICAgICAgICAgIFRoZSBtYWNybyBkZWZpbml0aW9uIGZsYWcuICBJIGhhdmVuJ3QgbWV0IGNvbXBpbGVycyAgICAgIAorIyogICAgICAgICAgICAgICAgICB3aGljaCBkb24ndCB1c2UgdGhlICctRCcgc3dpdGNoIHRvIGRlZmluZSBhIG1hY3JvLCBidXQgICAKKyMqICAgICAgICAgICAgICAgICAgd2hvIGtub3dzLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisjKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorIyogICAgIFQgICAgICAgICAgICBUaGUgY29tcGlsYXRpb24gZmxhZyB1c2VkIHRvIGlkZW50aWZ5IHRoZSB0YXJnZXQuIFNvbWUgICAKKyMqICAgICAgICAgICAgICAgICAgY29tcGlsZXJzIHVzZSBhIGRpZmZlcmVudCBmbGFnIHRoYW4gJy1vICcgdG8gc3BlY2lmeSAgICAgCisjKiAgICAgICAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSB0YXJnZXQgb2JqZWN0IGZpbGUuICAgICAgICAgICAgICAgICAgICAgIAorIyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyMqICAgICBDRkxBR1MgICAgICAgVGhlIHNldCBvZiBmbGFncyB1c2VkIHRvIGNvbXBpbGUgb2JqZWN0IGZpbGVzLgorIyogICAgICAgICAgICAgICAgICAodXN1YWxseSBjb250YWlucyB0aGUgZmxhZyAnLWMnKS4KKyMqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisjKgorIyoKKyMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKK2lmbmRlZiBUT1AKK1RPUCA6PSAuCitlbmRpZgorCitERUxFVEUgICA6PSBkZWwKK1NFUCAgICAgIDo9IC8KK0JVSUxEICAgIDo9ICQoVE9QKSQoU0VQKWNvbmZpZyQoU0VQKXdpbjMyCitQTEFURk9STSA6PSB3aW4zMgorQ0MgICAgICAgOj0gbGNjCisKKyMgdGhlIGRpcmVjdG9yeSB3aGVyZSBhbGwgb2JqZWN0IGZpbGVzIGFyZSBwbGFjZWQKKyMKK09CSl9ESVIgOj0gJChUT1ApJChTRVApb2JqCisKKworIyB0aGUgZGlyZWN0b3J5IHdoZXJlIGFsbCBsaWJyYXJ5IGZpbGVzIGFyZSBwbGFjZWQKKyMKKyMgIGJ5IGRlZmF1bHQsIHRoaXMgaXMgdGhlIHNhbWUgYXMgT0JKX0RJUiwgaG93ZXZlciwgdGhpcyBjYW4gYmUKKyMgIGNoYW5nZWQgdG8gc3VpdCBwYXJ0aWN1bGFyIG5lZWRzLi4KKyMKK0xJQl9ESVIgOj0gJChPQkpfRElSKQorCisKKyMgdGhlIG9iamVjdCBmaWxlIGV4dGVuc2lvbiwgdGhpcyBjYW4gYmUgLm8sIC50Y28sIC5vYmosIGV0Yy4uCisjIGRlcGVuZGluZyBvbiB0aGUgcGxhdGZvcm0KKyMKK08gOj0gb2JqCisKKyMgdGhlIGxpYnJhcnkgZmlsZSBleHRlbnNpb24sIHRoaXMgY2FuIGJlIC5hLCAubGliLCBldGMuLgorIyBkZXBlbmRpbmcgb24gdGhlIHBsYXRmb3JtCisjCitBIDo9IGxpYgorCisKKyMgVGhlIG5hbWUgb2YgdGhlIGZpbmFsIGxpYnJhcnkgZmlsZS4KKyMgTm90ZSB0aGF0IHRoZSBET1Mtc3BlY2lmaWMgTWFrZWZpbGUgdXNlcyBhIHNob3J0ZXIgKDguMykgbmFtZQorIworTElCUkFSWSA6PSBmcmVldHlwZQorCisKKyMgcGF0aCBpbmNsdXNpb24gZmxhZy4KKyMKKyMgIFNvbWUgY29tcGlsZXJzIHVzZSBhIGRpZmZlcmVudCBmbGFnIHRoYW4gJy1JJyB0byBzcGVjaWZ5IGFuCisjICBhZGRpdGlvbmFsIGluY2x1ZGUgcGF0aC4gRXhhbXBsZXMgYXJlICIvaT0iIG9yICItSiIsIGV0Yy4uLgorIworSSA6PSAtSQorCisKKyMgQyBmbGFnIHVzZWQgdG8gZGVmaW5lIGEgbWFjcm8gYmVmb3JlIHRoZSBjb21waWxhdGlvbiBvZiBhIGdpdmVuCisjIHNvdXJjZSBvYmplY3QuIFVzdWFsbHkgaXMgJy1EJyBsaWtlIGluICItRERFQlVHIgorIworRCA6PSAtRAorCisKKyMgVGFyZ2V0IGZsYWcgLSBMQ0MgdXNlcyAiLUZvIiBpbnN0ZWFkIG9mICItbyAiLCB3aGF0IGEgYnJva2VuIGNvbXBpbGVyCisjCisjCitUIDo9IC1GbworCisjIFRoZSBsaW5rIGZsYWcgdXNlZCB0byBzcGVjaWZ5IGEgZ2l2ZW4gbGlicmFyeSBmaWxlIG9uIGxpbmsuCisjIE5vdGUgdGhhdCB0aGlzIGlzIG9ubHkgdXNlZCB0byBjb21waWxlIHRoZSBkZW1vIHByb2dyYW1zLCBub3QKKyMgdGhlIGxpYnJhcnkgaXRzZWxmLgorIworTCA6PSAtRmwKKworCisKKyMgQyBmbGFncworIworIyAgIFRoZXNlIHNob3VsZCBjb25jZXJuIDoKKyMKKyMgICAgIC0gZGVidWcgb3V0cHV0CisjICAgICAtIG9wdGltaXphdGlvbgorIyAgICAgLSB3YXJuaW5ncworIyAgICAgLSBhbnNpIGNvbXBsaWFuY2UuLgorIworaWZuZGVmIENGTEFHUworQ0ZMQUdTIDo9IC1jIC1nMiAtTworZW5kaWYKKworaWZkZWYgQlVJTERfRlJFRVRZUEUKKworaW5jbHVkZSAkKFRPUCkvY29uZmlnL2ZyZWV0eXBlLm1rCisKKyMgVGhpcyBmaW5hbCBydWxlIGlzIHVzZWQgdG8gbGluayBhbGwgb2JqZWN0IGZpbGVzIGludG8gYSBzaW5nbGUKKyMgbGlicmFyeS4gSXQgaXMgcGFydCBvZiB0aGUgc3lzdGVtLXNwZWNpZmljIHN1Yi1NYWtlZmlsZSBiZWNhdXNlIG5vdAorIyBhbGwgbGlicmFyaWFucyBhY2NlcHQgYSBzaW1wbGUgc3ludGF4IGxpa2UgOgorIworIyAgICBsaWJyYXJpYW4gbGlicmFyeV9maWxlIHtsaXN0IG9mIG9iamVjdCBmaWxlc30gCisjCisjIFRoZSBMQ0MtV2luMzIgTGlicmFyaWFuLCBjYWxsZWQgTENDTElCIG5lZWRzIGFsbCBvYmplY3QgZmlsZXMgaW4gdGhlIGN1cnJlbnQKKyMgZGlyZWN0b3J5LiBUaGF0IF9pc18gc3R1cGlkLCBidXQgd2UnbGwgaGF2ZSB0byBkZWFsIHdpdGggaXQuLgorIworCitESVJfT0JKIDo9ICQoc3Vic3QgLyxcXCwkKE9CSl9ESVIpKQorCiskKEZUX0xJQlJBUlkpOiAkKE9CSkVDVFNfTElTVCkKKwlAJChUT1ApL2NvbmZpZy93aW4zMi9sY2NsaWIuYmF0CisKK2VuZGlmCisKKwpkaWZmIC0tZ2l0IGEvY29uZmlnL3dpbjMyL01ha2VmaWxlLnZjYyBiL2NvbmZpZy93aW4zMi9NYWtlZmlsZS52Y2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWIyNTFjNgotLS0gL2Rldi9udWxsCisrKyBiL2NvbmZpZy93aW4zMi9NYWtlZmlsZS52Y2MKQEAgLTAsMCArMSwxNzQgQEAKKyMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjKgorIyogIEZyZWVUeXBlIDIgQ29uZmlndXJhdGlvbiBydWxlcyBmb3IgVmlzdWFsIEMrKyBvbiBXaW4zMgorIyoKKyMqICBDb3B5cmlnaHQgMTk5Ni0xOTk5IGJ5CisjKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorIyoKKyMqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQKKyMqICBtb2RpZmllZCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisjKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisjKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisjKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorIyoKKyMqCisjKiAgVGhlIHB1cnBvc2Ugb2YgdGhpcyBzdWItTWFrZWZpbGUgaXMgdG8gZGVmaW5lIHZhcmlvdXMgYnVpbGQgYW5kCisjKiAgcGxhdGZvcm0gc3BlY2lmaWMgdmFyaWFibGVzIGJlZm9yZSBpbmNsdWRpbmcgdGhlIHN1Yi1NYWtlZmlsZQorIyogIGNvbnRhaW5pbmcgdGhlIEZyZWVUeXBlIGxpYnJhcnkgcnVsZXMsIGZvdW5kIGluCisjKgorIyogICAgICQoVE9QKS9jb25maWcvZnJlZXR5cGUubWsKKyMqCisjKiAgVGhlIGZvbGxvd2luZyB2YXJpYWJsZXMgbXVzdCBiZSBkZWZpbmVkIGJlZm9yZSBpbmNsdWRpbmcgdGhpcworIyogIGZpbGUgOgorIyoKKyMqICAgICBUT1AgICAgICAgICAgUGF0aG5hbWUgdG8gdGhlIHRvcCBvZiB0aGUgRnJlZVR5cGUgc291cmNlcworIyogICAgICAgICAgICAgICAgICBoaWVyYXJjaHkKKyMqCisjKiAgVGhpcyBmaWxlIHNob3VsZCBkZWZpbmUgdGhlIGZvbGxvd2luZyB2YXJpYWJsZXMgYmVmb3JlIGluY2x1ZGluZworIyogIHRoZSBGcmVlVHlwZSBsaWJyYXJ5IHJ1bGVzIGZpbGUgOgorIyoKKyMqICAgICBCVUlMRCAgICAgICAgUGF0aG5hbWUgdG8gdGhlIHBsYXRmb3JtLXNwZWNpZmljIGZpbGVzIHVzZWQKKyMqICAgICAgICAgICAgICAgICAgZm9yIHRoZSBidWlsZC4gVXN1YWxseSBgJChUT1ApL2NvbmZpZy88c3lzdGVtPicKKyMqCisjKiAgICAgU0VQICAgICAgICAgIERpcmVjdG9yeSBzZXBhcmF0b3IgZm9yIHRoZSBjdXJyZW50IHBsYXRmb3JtLgorIyogICAgICAgICAgICAgICAgICBFaXRoZXIgLyBvciBcIChtYXliZSA6IG9uIE1hY3MpCisjKiAKKyMqICAgICBERUxFVEUgICAgICAgVGhlIGZvcmNlZCByZW1vdmUvZGVsZXRlIGNvbW1hbmQgdG8gZXJhc2Ugb25lIG9yIG1vcmUKKyMqICAgICAgICAgICAgICAgICAgZmlsZXMKKyMqCisjKiAgICAgSU5DTFVERSAgICAgIFRoZSBsb2NhdGlvbiBvZiBhbGwgcHVibGljIGhlYWRlciBmaWxlcy4gZS5nLgorIyogICAgICAgICAgICAgICAgICBgJChUT1ApL2luY2x1ZGUnaW5jbHVkZScgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyMqICAgICBTUkMgICAgICAgICAgVGhlIGRpcmVjdG9yeSBjb250YWluaW5nIGFsbCBzb3VyY2VzLiBlLmcuICAgICAgICAgICAgICAKKyMqICAgICAgICAgICAgICAgICAgJyQoVE9QKS9zcmMnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorIyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyMqICAgICBPQkpfRElSICAgICAgVGhlIGxvY2F0aW9uIHdoZXJlIGNvbXBpbGVkIG9iamVjdCBmaWxlcyB3aWxsIGJlICAgICAgICAgCisjKiAgICAgICAgICAgICAgICAgIHBsYWNlZCwgZS5nLiAnJChUT1ApL29iaicgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyMqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisjKiAgICAgTElCX0RJUiAgICAgIFRoZSBsb2NhdGlvbiB3aGVyZSB0aGUgcmVzdWx0aW5nIGxpYnJhcnkgZmlsZSB3aWxsIGJlICAgIAorIyogICAgICAgICAgICAgICAgICBwbGFjZWQsIGUuZy4gJyQoVE9QKS9vYmonICAgICAgICAgICAgICAgICAgICAgICAgCisjKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorIyogICAgIExJQlJBUlkgICAgICBUaGUgZmlsZW5hbWUgb2YgdGhlIHJlc3VsdGluZyBsaWJyYXJ5IGZpbGUsIHdpdGhvdXQgICAgICAKKyMqICAgICAgICAgICAgICAgICAgaXRzIGV4dGVuc2lvbi4uIGUuZy4gJ2xpYmZyZWV0eXBlJyBvciAnZnJlZXR5cGUnICAgICAgICAgCisjKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorIyogICAgIE8gICAgICAgICAgICBUaGUgb2JqZWN0IGZpbGUgc3VmZml4LiAgQ2FuIGJlICcubycsICcub2JqLCcgJy5sbywnICAgICAKKyMqICAgICAgICAgICAgICAgICAgJztjb2ZmLCcgZXRjLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisjKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorIyogICAgIEEgICAgICAgICAgICBUaGUgbGlicmFyeSBmaWxlIHN1ZmZpeC4gIENhbiBiZSAnLmEnICcuc28sJyAnLmxpYicgICAgICAKKyMqICAgICAgICAgICAgICAgICAgJy5kbGwsJyBldGMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisjKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorIyogICAgIEkgICAgICAgICAgICBUaGUgcGF0aCBpbmNsdXNpb24gZmxhZy4gIFNvbWUgY29tcGlsZXJzIHVzZSBhICAgICAgICAgICAKKyMqICAgICAgICAgICAgICAgICAgZGlmZmVyZW50IGZsYWcgdGhhbiAnLUknIHRvIHNwZWNpZnkgYW4gYWRkaXRpb25hbCAgICAgICAgCisjKiAgICAgICAgICAgICAgICAgIGluY2x1ZGUgcGF0aC4gIEV4YW1wbGVzIGFyZSAnL2k9JyBvciAnLUogJywgZXRjLiAgICAgICAgIAorIyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyMqICAgICBEICAgICAgICAgICAgVGhlIG1hY3JvIGRlZmluaXRpb24gZmxhZy4gIEkgaGF2ZW4ndCBtZXQgY29tcGlsZXJzICAgICAgCisjKiAgICAgICAgICAgICAgICAgIHdoaWNoIGRvbid0IHVzZSB0aGUgJy1EJyBzd2l0Y2ggdG8gZGVmaW5lIGEgbWFjcm8sIGJ1dCAgIAorIyogICAgICAgICAgICAgICAgICB3aG8ga25vd3MuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyMqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisjKiAgICAgVCAgICAgICAgICAgIFRoZSBjb21waWxhdGlvbiBmbGFnIHVzZWQgdG8gaWRlbnRpZnkgdGhlIHRhcmdldC4gU29tZSAgIAorIyogICAgICAgICAgICAgICAgICBjb21waWxlcnMgdXNlIGEgZGlmZmVyZW50IGZsYWcgdGhhbiAnLW8gJyB0byBzcGVjaWZ5ICAgICAKKyMqICAgICAgICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHRhcmdldCBvYmplY3QgZmlsZS4gICAgICAgICAgICAgICAgICAgICAgCisjKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorIyogICAgIENGTEFHUyAgICAgICBUaGUgc2V0IG9mIGZsYWdzIHVzZWQgdG8gY29tcGlsZSBvYmplY3QgZmlsZXMuCisjKiAgICAgICAgICAgICAgICAgICh1c3VhbGx5IGNvbnRhaW5zIHRoZSBmbGFnICctYycpLgorIyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyMqCisjKgorIyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworREVMRVRFICAgOj0gZGVsCitTRVAgICAgICA6PSAvCitCVUlMRCAgICA6PSAkKFRPUCkkKFNFUCljb25maWckKFNFUCl3aW4zMgorUExBVEZPUk0gOj0gd2luMzIKK0NDICAgICAgIDo9IGNsCisKKyMgdGhlIGRpcmVjdG9yeSB3aGVyZSBhbGwgb2JqZWN0IGZpbGVzIGFyZSBwbGFjZWQKKyMKK09CSl9ESVIgOj0gJChUT1ApJChTRVApb2JqCisKKworIyB0aGUgZGlyZWN0b3J5IHdoZXJlIGFsbCBsaWJyYXJ5IGZpbGVzIGFyZSBwbGFjZWQKKyMKKyMgIGJ5IGRlZmF1bHQsIHRoaXMgaXMgdGhlIHNhbWUgYXMgT0JKX0RJUiwgaG93ZXZlciwgdGhpcyBjYW4gYmUKKyMgIGNoYW5nZWQgdG8gc3VpdCBwYXJ0aWN1bGFyIG5lZWRzLi4KKyMKK0xJQl9ESVIgOj0gJChPQkpfRElSKQorCisKKyMgdGhlIG9iamVjdCBmaWxlIGV4dGVuc2lvbiwgdGhpcyBjYW4gYmUgLm8sIC50Y28sIC5vYmosIGV0Yy4uCisjIGRlcGVuZGluZyBvbiB0aGUgcGxhdGZvcm0KKyMKK08gOj0gb2JqCisKKyMgdGhlIGxpYnJhcnkgZmlsZSBleHRlbnNpb24sIHRoaXMgY2FuIGJlIC5hLCAubGliLCBldGMuLgorIyBkZXBlbmRpbmcgb24gdGhlIHBsYXRmb3JtCisjCitBIDo9IGxpYgorCisKKyMgVGhlIG5hbWUgb2YgdGhlIGZpbmFsIGxpYnJhcnkgZmlsZS4KKyMgTm90ZSB0aGF0IHRoZSBET1Mtc3BlY2lmaWMgTWFrZWZpbGUgdXNlcyBhIHNob3J0ZXIgKDguMykgbmFtZQorIworTElCUkFSWSA6PSBmcmVldHlwZQorCisKKyMgcGF0aCBpbmNsdXNpb24gZmxhZy4KKyMKKyMgIFNvbWUgY29tcGlsZXJzIHVzZSBhIGRpZmZlcmVudCBmbGFnIHRoYW4gJy1JJyB0byBzcGVjaWZ5IGFuCisjICBhZGRpdGlvbmFsIGluY2x1ZGUgcGF0aC4gRXhhbXBsZXMgYXJlICIvaT0iIG9yICItSiIsIGV0Yy4uLgorIworSSA6PSAvSQorCisKKyMgVGhlIGxpbmsgZmxhZyB1c2VkIHRvIHNwZWNpZnkgYSBnaXZlbiBsaWJyYXJ5IGZpbGUgb24gbGluay4KKyMgTm90ZSB0aGF0IHRoaXMgaXMgb25seSB1c2VkIHRvIGNvbXBpbGUgdGhlIGRlbW8gcHJvZ3JhbXMsIG5vdAorIyB0aGUgbGlicmFyeSBpdHNlbGYuCisjCitMIDo9IC9GbAorCisKKyMgQyBmbGFnIHVzZWQgdG8gZGVmaW5lIGEgbWFjcm8gYmVmb3JlIHRoZSBjb21waWxhdGlvbiBvZiBhIGdpdmVuCisjIHNvdXJjZSBvYmplY3QuIFVzdWFsbHkgaXMgJy1EJyBsaWtlIGluICItRERFQlVHIgorIworRCA6PSAvRAorCisjIFRhcmdldCBmbGFnIC0gTENDIHVzZXMgIi1GbyIgaW5zdGVhZCBvZiAiLW8gIiwgd2hhdCBhIGJyb2tlbiBjb21waWxlcgorIworIworVCA6PSAvRm8KKworIyBDIGZsYWdzCisjCisjICAgVGhlc2Ugc2hvdWxkIGNvbmNlcm4gOgorIworIyAgICAgLSBkZWJ1ZyBvdXRwdXQKKyMgICAgIC0gb3B0aW1pemF0aW9uCisjICAgICAtIHdhcm5pbmdzCisjICAgICAtIGFuc2kgY29tcGxpYW5jZS4uCisjCitpZm5kZWYgQ0ZMQUdTCitDRkxBR1MgOj0gL25vbG9nbyAvYyAvT3ggL0c1IC9aYSAvVzMgL1dYCitlbmRpZgorCitpZmRlZiBCVUlMRF9GUkVFVFlQRQorCitpbmNsdWRlICQoVE9QKS9jb25maWcvZnJlZXR5cGUubWsKKworIyBUaGlzIGZpbmFsIHJ1bGUgaXMgdXNlZCB0byBsaW5rIGFsbCBvYmplY3QgZmlsZXMgaW50byBhIHNpbmdsZQorIyBsaWJyYXJ5LiBJdCBpcyBwYXJ0IG9mIHRoZSBzeXN0ZW0tc3BlY2lmaWMgc3ViLU1ha2VmaWxlIGJlY2F1c2Ugbm90CisjIGFsbCBsaWJyYXJpYW5zIGFjY2VwdCBhIHNpbXBsZSBzeW50YXggbGlrZSA6CisjCisjICAgIGxpYnJhcmlhbiBsaWJyYXJ5X2ZpbGUge2xpc3Qgb2Ygb2JqZWN0IGZpbGVzfSAKKyMKKyMgVGhlIExDQy1XaW4zMiBMaWJyYXJpYW4sIGNhbGxlZCBMQ0NMSUIgbmVlZHMgYWxsIG9iamVjdCBmaWxlcyBpbiB0aGUgY3VycmVudAorIyBkaXJlY3RvcnkuIFRoYXQgX2lzXyBzdHVwaWQsIGJ1dCB3ZSdsbCBoYXZlIHRvIGRlYWwgd2l0aCBpdC4uCisjCisKK0RJUl9PQkogOj0gJChzdWJzdCAvLFxcLCQoT0JKX0RJUikpCisKKyQoRlRfTElCUkFSWSk6ICQoT0JKRUNUU19MSVNUKQorCWxpYiAvb3V0OiRAICQoT0JKRUNUU19MSVNUKQorCitlbmRpZgorCisKZGlmZiAtLWdpdCBhL2NvbmZpZy93aW4zMi9kZXRlY3QubWsgYi9jb25maWcvd2luMzIvZGV0ZWN0Lm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzODVhYjYKLS0tIC9kZXYvbnVsbAorKysgYi9jb25maWcvd2luMzIvZGV0ZWN0Lm1rCkBAIC0wLDAgKzEsNjYgQEAKKyMKKyMgVGhpcyBmaWxlIGlzIHVzZWQgdG8gZGV0ZWN0IGEgV2luMzIgaG9zdCBwbGF0Zm9ybS4KKyMKKyMgVGhpcyBjb25maWd1cmF0aW9uIGZpbGUgdG8gYmUgdXNlZCBkZXBlbmRzIG9uIHRoZSB2YWx1ZSBvZiB0aGUgQ0MKKyMgZW52aXJvbm1lbnQgdmFyaWFibGUuCisjCisjCisKKyMgV2UgdGVzdCBmb3IgdGhlIENPTVNQRUMgZW52aXJvbm1lbnQgdmFyaWFibGUsIHRoZW4gcnVuIHRoZSAndmVyJworIyBjb21tYW5kLWxpbmUgcHJvZ3JhbSB0byBzZWUgaWYgaXRzIG91dHB1dCBjb250YWlucyB0aGUgd29yZCAiV2luZG93cyIKKyMKKyMgSWYgdGhpcyBpcyB0cnVlLCB3ZSdyZSBydW5uaW5nIGEgd2luMzIgcGxhdGZvcm0gKG9yIGFuIGVtdWxhdGlvbikKKyMKKworaWZlcSAoJChQTEFURk9STSksYW5zaSkKK2lmZGVmIENPTVNQRUMKKworaXNfd2luZG93cyA6PSAkKGZpbmRzdHJpbmcgV2luZG93cywkKHN0cmlwICQoc2hlbGwgdmVyKSkpCitpZm5lcSAoJChpc193aW5kb3dzKSwpCisKK1BMQVRGT1JNIDo9IHdpbjMyCitERUxFVEUgICA6PSBkZWwKK0NPUFkgICAgIDo9IGNvcHkKKworQ09ORklHX0ZJTEUgOj0gTWFrZWZpbGUuZ2NjICAjIGdjYyBNYWtlZmlsZSBieSBkZWZhdWx0IC0gYXJlbid0IHdlIGJpYXNlZCA7LSkKK1NFUCAgICAgICAgIDo9IC8KK2lmZXEgKCQoQ0MpLGNjKQorQ0MgICAgICAgICAgOj0gZ2NjCitlbmRpZgorCitpZm5lcSAoJChmaW5kc3RyaW5nIHZpc3VhbGMsJChNQUtFQ01ER09BTFMpKSwpICAgICAjIFZpc3VhbCBDL0MrKworQ09ORklHX0ZJTEUgOj0gTWFrZWZpbGUudmNjCitTRVAgICAgICAgICA6PSAkKEJBQ0tTTEFTSCkKK0NDICAgICAgICAgIDo9IGNsCit2aXN1YWxjOiBzZXR1cAorZW5kaWYKKworaWZuZXEgKCQoZmluZHN0cmluZyB3YXRjb20sJChNQUtFQ01ER09BTFMpKSwpICAgICAgIyBXYXRjb20gQy9DKysKK0NPTkZJR19GSUxFIDo9IE1ha2VmaWxlLndhdAorU0VQICAgICAgICAgOj0gJChCQUNLU0xBU0gpCitDQyAgICAgICAgICA6PSB3Y2MzODYKK3dhdGNvbTogc2V0dXAKK2VuZGlmCisKK2lmbmVxICgkKGZpbmRzdHJpbmcgdmlzdWFsYWdlLCQoTUFLRUNNREdPQUxTKSksKSAgICMgVmlzdWFsIEFnZSBDKysKK0NPTkZJR19GSUxFIDo9IE1ha2VmaWxlLmljYworU0VQICAgICAgICAgOj0gJChCQUNLU0xBU0gpCitDQyAgICAgICAgICA6PSBpY2MKK3Zpc3VhbGFnZTogc2V0dXAKK2VuZGlmCisKK2lmbmVxICgkKGZpbmRzdHJpbmcgbGNjLCQoTUFLRUNNREdPQUxTKSksKSAgICAgICAgICMgTENDLVdpbjMyCitDT05GSUdfRklMRSA6PSBNYWtlZmlsZS5sY2MKK1NFUCAgICAgICAgIDo9ICQoQkFDS1NMQVNIKQorQ0MgICAgICAgICAgOj0gbGNjCitsY2M6IHNldHVwCitlbmRpZgorCitDT05GSUdfUlVMRVMgOj0gJChUT1ApXGNvbmZpZ1x3aW4zMlwkKENPTkZJR19GSUxFKQorCitzZXR1cDogZG9zX3NldHVwCisKK2VuZGlmICN0ZXN0IFdpbmRvd3MKK2VuZGlmICN0ZXN0IENPTVNQRUMKK2VuZGlmICN0ZXN0IFBMQVRGT1JNCisKZGlmZiAtLWdpdCBhL2NvbmZpZy93aW4zMi9mdGNvbmZpZy5oIGIvY29uZmlnL3dpbjMyL2Z0Y29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNhNGM5NQotLS0gL2Rldi9udWxsCisrKyBiL2NvbmZpZy93aW4zMi9mdGNvbmZpZy5oCkBAIC0wLDAgKzEsMTgyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBmdGNvbmZpZy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQU5TSS1zcGVjaWZpYyBjb25maWd1cmF0aW9uIGZpbGUgKHNwZWNpZmljYXRpb24gb25seSkuICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDE5OTYtMTk5OSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkICAgICAgICAqLworLyogIG1vZGlmaWVkIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAgKi8KKy8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCisvKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLworLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBUaGlzIGhlYWRlciBmaWxlIGNvbnRhaW5zIGEgbnVtYmVyIG9mIG1hY3JvIGRlZmluaXRpb25zIHRoYXQgYXJlIHVzZWQgKi8KKyAgLyogYnkgdGhlIHJlc3Qgb2YgdGhlIGVuZ2luZS4gIFBvcnRlcnMgYXJlIGZyZWUgdG8gY29weSB0aGlzIGZpbGUgYW5kICAgICovCisgIC8qIGFkYXB0IGl0IHRvIHN1aXQgdGhlaXIgb3duIHN5c3RlbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogSU1QT1JUQU5UIE5PVEU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBQb3J0ZXJzLCByZWFkIGNhcmVmdWxseSB0aGUgY29tbWVudHMgaW4gYGZ0c3lzLmgnIGJlZm9yZSB0cnlpbmcgdG8gKi8KKyAgLyogICAgcG9ydCB0aGlzIGZpbGUgdG8geW91ciBzeXN0ZW0uICBJdCBjb250YWlucyBtYW55IGVzc2VudGlhbCAgICAgICAgICovCisgIC8qICAgIHJlbWFya3MsIGFuZCB3aWxsIGVhc2UgeW91ciB3b3JrIGdyZWF0bHkuICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2lmbmRlZiBGVENPTkZJR19ICisjZGVmaW5lIEZUQ09ORklHX0gKKworLyogSW5jbHVkZSB0aGUgaGVhZGVyIGZpbGUgY29udGFpbmluZyBhbGwgZGV2ZWxvcGVyIGJ1aWxkIG9wdGlvbnMgKi8KKyNpbmNsdWRlIDxmdG9wdGlvbi5oPgorCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICBQTEFURk9STS1TUEVDSUZJQyBDT05GSUdVUkFUSU9OIE1BQ1JPUyAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBUaGVzZSBtYWNyb3MgY2FuIGJlIHRvZ2dsZWQgdG8gc3VpdCBhIHNwZWNpZmljIHN5c3RlbS4gIFRoZSBjdXJyZW50ICAgKi8KKyAgLyogb25lcyBhcmUgZGVmYXVsdHMgdXNlZCB0byBjb21waWxlIEZyZWVUeXBlIGluIGFuIEFOU0kgQyBlbnZpcm9ubWVudCAgICovCisgIC8qICgxNmJpdCBjb21waWxlcnMgYXJlIGFsc28gc3VwcG9ydGVkKS4gIENvcHkgdGhpcyBmaWxlIHRvIHlvdXIgb3duICAgICAqLworICAvKiBgZnJlZXR5cGUvYXJjaC88c3lzdGVtPicgIGRpcmVjdG9yeSwgYW5kIGVkaXQgaXQgdG8gcG9ydCB0aGUgZW5naW5lLiAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qIERlZmluZSB0byBlbXB0eSBpZiB0aGUga2V5d29yZCBkb2VzIG5vdCB3b3JrLiAgKi8KKy8qICN1bmRlZiBjb25zdCAqLworCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIEFOU0kgQyBoZWFkZXIgZmlsZXMuICAqLworI2RlZmluZSBTVERDX0hFQURFUlMgMQorCisvKiBXZSB1c2UgPGxpbWl0cy5oPiB2YWx1ZXMgdG8ga25vdyB0aGUgc2l6ZXMgb2YgdGhlIHR5cGVzLiAgKi8KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKworLyogVGhlIG51bWJlciBvZiBieXRlcyBpbiBhbiBgaW50JyB0eXBlLiAgKi8KKyNpZiAgIFVJTlRfTUFYID09IDB4RkZGRkZGRkYKKyNkZWZpbmUgU0laRU9GX0lOVCAgNAorI2VsaWYgVUlOVF9NQVggPT0gMHhGRkZGCisjZGVmaW5lIFNJWkVPRl9JTlQgIDIKKyNlbGlmIFVJTlRfTUFYID4gMHhGRkZGRkZGRiAmJiBVSU5UX01BWCA9PSAweEZGRkZGRkZGRkZGRkZGRkYKKyNkZWZpbmUgU0laRU9GX0lOVCAgOAorI2Vsc2UKKyNlcnJvciAiVW5zdXBwb3J0ZWQgbnVtYmVyIG9mIGJ5dGVzIGluIGBpbnQnIHR5cGUhIgorI2VuZGlmCisKKy8qIFRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gYSBgbG9uZycgdHlwZS4gICovCisjaWYgICBVTE9OR19NQVggPT0gMHhGRkZGRkZGRgorI2RlZmluZSBTSVpFT0ZfTE9ORyAgNAorI2VsaWYgVUxPTkdfTUFYID4gMHhGRkZGRkZGRiAmJiBVTE9OR19NQVggPT0gMHhGRkZGRkZGRkZGRkZGRkZGCisjZGVmaW5lIFNJWkVPRl9MT05HICA4CisjZWxzZQorI2Vycm9yICJVbnN1cHBvcnRlZCBudW1iZXIgb2YgYnl0ZXMgaW4gYGxvbmcnIHR5cGUhIgorI2VuZGlmCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgbWVtY3B5IGZ1bmN0aW9uLiAgKi8KKyNkZWZpbmUgSEFWRV9NRU1DUFkgMQorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxmY250bC5oPiBoZWFkZXIgZmlsZS4gICovCisjZGVmaW5lIEhBVkVfRkNOVExfSCAwCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHVuaXN0ZC5oPiBoZWFkZXIgZmlsZS4gICovCisjZGVmaW5lIEhBVkVfVU5JU1REX0ggMAorCisKKy8qIFByZWZlcnJlZCBhbGlnbm1lbnQgb2YgZGF0YSAqLworI2RlZmluZSBGVF9BTElHTk1FTlQgIDgKKworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgIEFVVE9NQVRJQyBDT05GSUdVUkFUSU9OIE1BQ1JPUyAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICBUaGVzZSBtYWNyb3MgYXJlIGNvbXB1dGVkIGZyb20gdGhlIG9uZXMgZGVmaW5lZCBhYm92ZS4gIERvbid0IHRvdWNoICAqLworICAvKiAgdGhlaXIgZGVmaW5pdGlvbiwgdW5sZXNzIHlvdSBrbm93IHByZWNpc2VseSB3aGF0IHlvdSdyZSBkb2luZy4gIE5vICAgKi8KKyAgLyogIHBvcnRlciBzaG91bGQgbmVlZCB0byBtZXNzIHdpdGggdGhlbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogSW50TiB0eXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIFVzZWQgdG8gZ3VhcmFudGVlIHRoZSBzaXplIG9mIHNvbWUgc3BlY2lmaWMgaW50ZWdlcnMuICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgc2lnbmVkIHNob3J0ICAgIEZUX0ludDE2OworICB0eXBlZGVmIHVuc2lnbmVkIHNob3J0ICBGVF9Xb3JkMTY7CisKKyNpZiBTSVpFT0ZfSU5UID09IDQKKworICB0eXBlZGVmIHNpZ25lZCBpbnQgICAgICBGVF9JbnQzMjsKKyAgdHlwZWRlZiB1bnNpZ25lZCBpbnQgICAgRlRfV29yZDMyOworCisjZWxpZiBTSVpFT0ZfTE9ORyA9PSA0CisKKyAgdHlwZWRlZiBzaWduZWQgbG9uZyAgICAgRlRfSW50MzI7CisgIHR5cGVkZWYgdW5zaWduZWQgbG9uZyAgIEZUX1dvcmQzMjsKKworI2Vsc2UKKyNlcnJvciAibm8gMzJiaXQgdHlwZSBmb3VuZCAtIHBsZWFzZSBjaGVjayB5b3VyIGNvbmZpZ3VyYXRpb24gZmlsZXMiCisjZW5kaWYKKworI2lmIFNJWkVPRl9MT05HID09IDgKKworICAvKiBMT05HNjQgbXVzdCBiZSBkZWZpbmVkIHdoZW4gYSA2NC1iaXQgdHlwZSBpcyBhdmFpbGFibGUgKi8KKyNkZWZpbmUgTE9ORzY0CisjZGVmaW5lIElOVDY0ICAgbG9uZworCisjZWxzZQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBHQ0MgcHJvdmlkZXMgdGhlIG5vbi1BTlNJICdsb25nIGxvbmcnIDY0LWJpdCB0eXBlLiAgWW91IGNhbiBhY3RpdmF0ZSAgKi8KKyAgLyogaXQgYnkgZGVmaW5pbmcgdGhlIEZUQ0FMQ19VU0VfTE9OR19MT05HIG1hY3JvIGluIGBmdGNvbmZpZy5oJy4gIE5vdGUgICovCisgIC8qIHRoYXQgdGhpcyB3aWxsIHByb2R1Y2UgbWFueSAtYW5zaSB3YXJuaW5ncyBkdXJpbmcgbGlicmFyeSAgICAgICAgICAgICAqLworICAvKiBjb21waWxhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjaWZkZWYgRlRDQUxDX1VTRV9MT05HX0xPTkcKKworI2RlZmluZSBMT05HNjQKKyNkZWZpbmUgSU5UNjQgICBsb25nIGxvbmcKKworI2VuZGlmIC8qIEZUQ0FMQ19VU0VfTE9OR19MT05HICovCisjZW5kaWYKKworCisjaWZkZWYgRlRfTUFLRV9PUFRJT05fU0lOR0xFX09CSkVDVAorI2RlZmluZSAgTE9DQUxfREVGICAgc3RhdGljCisjZGVmaW5lICBMT0NBTF9GVU5DICBzdGF0aWMKKyNlbHNlCisjZGVmaW5lICBMT0NBTF9ERUYgICBleHRlcm4KKyNkZWZpbmUgIExPQ0FMX0ZVTkMgIC8qIG5vdGhpbmcgKi8KKyNlbmRpZgorCisjaWZkZWYgRlRfTUFLRV9PUFRJT05fU0lOR0xFX0xJQlJBUllfT0JKRUNUCisjZGVmaW5lICBCQVNFX0RFRiAgICBMT0NBTF9ERUYKKyNkZWZpbmUgIEJBU0VfRlVOQyAgIExPQ0FMX0ZVTkMKKyNlbHNlCisjZGVmaW5lICBCQVNFX0RFRiAgICBleHRlcm4KKyNkZWZpbmUgIEJBU0VfRlVOQyAgIC8qIG5vdGhpbmcgKi8KKyNlbmRpZgorCisjaWZuZGVmICBFWFBPUlRfREVGCisjZGVmaW5lICBFWFBPUlRfREVGICAgZXh0ZXJuCisjZW5kaWYKKworI2lmbmRlZiAgRVhQT1JUX0ZVTkMKKyNkZWZpbmUgIEVYUE9SVF9GVU5DICAvKiBub3RoaW5nICovCisjZW5kaWYKKworI2VuZGlmIC8qIEZUQ09ORklHX0ggKi8KKworCisvKiBFTkQgKi8KZGlmZiAtLWdpdCBhL2NvbmZpZy93aW4zMi9mdG9wdGlvbi5oIGIvY29uZmlnL3dpbjMyL2Z0b3B0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODUyZjY1ZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbmZpZy93aW4zMi9mdG9wdGlvbi5oCkBAIC0wLDAgKzEsMTYyIEBACisjaWZuZGVmIEZUT1BUSU9OX0gKKyNkZWZpbmUgRlRPUFRJT05fSAorCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgIFVTRVItU0VMRUNUQUJMRSBDT05GSUdVUkFUSU9OIE1BQ1JPUyAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBUaGVzZSBtYWNyb3MgY2FuIGJlIHRvZ2dsZWQgYnkgZGV2ZWxvcGVycyB0byBlbmFibGUgb3IgZGlzYWJsZSAgICAgICAgKi8KKyAgLyogY2VydGFpbiBhc3BlY3RzIG9mIEZyZWVUeXBlLiAgVGhpcyBmaWxlIGNvbnRhaW5zIG1hY3JvcyB0aGF0IGFwcGx5IHRvICovCisgIC8qIGFsbCBvZiBGcmVlVHlwZS4gIERyaXZlci1zcGVjaWZpYyBjb25maWd1cmF0aW9ucyBhcmUgcGxhY2VkIGluIGVhY2ggICAqLworICAvKiBkcml2ZXIgZGlyZWN0b3J5IChlLmcuIGBmcmVldHlwZS9kcml2ZXJzL3R0bGliL3R0Y29uZmlnLmgnKS4gICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBBbHRlcm5hdGUgR2x5cGggSW1hZ2UgRm9ybWF0IHN1cHBvcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgQnkgZGVmYXVsdCwgdGhlIGdseXBoIGltYWdlcyByZXR1cm5lZCBieSB0aGUgRnJlZVR5cGUgZ2x5cGggbG9hZGVyICAqLworICAvKiAgIGNhbiBlaXRoZXIgYmUgYSBwaXhtYXAgb3IgYSB2ZWN0b3JpYWwgb3V0bGluZSBkZWZpbmVkIHRocm91Z2ggICAgICAgKi8KKyAgLyogICBiZXppZXIgY29udHJvbCBwb2ludHMuIFdoZW4gZGVmaW5pbmcgdGhlIGZvbGxvd2luZyBjb25maWd1cmF0aW9uICAgICovCisgIC8qICAgbWFjcm8sIHNvbWUgZm9udCBkcml2ZXJzIHdpbGwgYmUgYWJsZSB0byByZWdpc3RlciBhbHRlcm5hdGUgICAgICAgICAqLworICAvKiAgIGdseXBoIGltYWdlIGZvcm1hdHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgVW5zZXQgdGhpcyBtYWNybyBpZiB5b3UncmUgc3VyZSB0aGF0IHlvdSdsbCBuZXZlciB1c2UgYSBmb250IGRyaXZlciAqLworICAvKiAgIHdpdGggYW4gYWx0ZXJuYXRlIGdseXBoIGZvcm1hdCwgdGhpcyB3aWxsIHJlZHVjZSB0aGUgc2l6ZSBvZiB0aGUgICAgKi8KKyAgLyogICBiYXNlIGxheWVyIGNvZGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBGVF9DT05GSUdfT1BUSU9OX0FMVEVSTkFURV9HTFlQSF9GT1JNQVRTCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBHQ0MgcHJvdmlkZXMgdGhlIG5vbi1BTlNJIGBsb25nIGxvbmcnIDY0LWJpdCB0eXBlLiAgWW91IGNhbiBhY3RpdmF0ZSAgKi8KKyAgLyogaXQgYnkgZGVmaW5pbmcgdGhlIEZUQ0FMQ19VU0VfTE9OR19MT05HIG1hY3JvIGhlcmUuICBOb3RlIGhvd2V2ZXIgICAgICovCisgIC8qIHRoYXQgd2UgZGlkIG5vdCBleHBlcmllbmNlIGFueSBpbXByb3ZlbWVudCBpbiBzcGVlZCB3aXRoIGdjYywgYW5kICAgICAqLworICAvKiB0aGF0IHRoZSBmaW5hbCBjb2RlIHNlZW1zIGJpZ2dlciB3aGVuIGxpbmtlZC4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjdW5kZWYgRlRDQUxDX1VTRV9MT05HX0xPTkcKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogV2hlbiBjb21waWxpbmcgRnJlZVR5cGUgYXMgYSBETEwsIHNvbWUgc3lzdGVtcy9jb21waWxlcnMgbmVlZCBhICAgICAgICovCisgIC8qIHNwZWNpYWwga2V5d29yZCBpbiBmcm9udCBvZiBlYWNoIGZ1bmN0aW9uIGRlZmluaXRpb24gaW5zdGVhZCBvZiAgICAgICAqLworICAvKiBgZXh0ZXJuJy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFRoZSBtYWNyb3MgRVhQT1JUX0RFRiBhbmQgRVhQT1JUX0ZVTkMgYXJlIHRodXMgdXNlZCB0byBkZWZpbmUgICAgICAgICAqLworICAvKiBleHBvcnRlZCBsaWJyYXJ5IGZ1bmN0aW9uIGludGVyZmFjZXMgYW5kIGV4cG9ydGVkIGxpYnJhcnkgZnVuY3Rpb25zICAgKi8KKyAgLyogaW1wbGVtZW50YXRpb25zIHJlc3BlY3RpdmVseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBJZiBub3QgZGVmaW5lZCBoZXJlLCB0aGV5IGF1dG9tYXRpY2FsbHkgZGVmYXVsdCB0byBgZXh0ZXJuJyBhbmQgdm9pZCAgKi8KKyAgLyogbGF0ZXIgaW4gdGhpcyBoZWFkZXIgZmlsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI3VuZGVmIEVYUE9SVF9ERUYKKyN1bmRlZiBFWFBPUlRfRlVOQworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBEZWJ1ZyBsZXZlbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgRnJlZVR5cGUgY2FuIGJlIGNvbXBpbGVkIGluIGRlYnVnIG9yIHRyYWNlIG1vZGUuICBJbiBkZWJ1ZyBtb2RlLCAgICAqLworICAvKiAgIGVycm9ycyBhcmUgcmVwb3J0ZWQgdGhyb3VnaCB0aGUgYGZ0ZGVidWcnIGNvbXBvbmVudC4gIEluIHRyYWNlICAgICAgKi8KKyAgLyogICBtb2RlLCBhZGRpdGlvbmFsIG1lc3NhZ2VzIGFyZSBzZW50IHRvIHRoZSBzdGFuZGFyZCBvdXRwdXQgZHVyaW5nICAgICovCisgIC8qICAgZXhlY3V0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICBEZWZpbmUgRlRfREVCVUdfTEVWRUxfRVJST1IgdG8gYnVpbGQgdGhlIGxpYnJhcnkgaW4gZGVidWcgbW9kZS4gICAgICovCisgIC8qICAgRGVmaW5lIEZUX0RFQlVHX0xFVkVMX1RSQUNFIHRvIGJ1aWxkIGl0IGluIHRyYWNlIG1vZGUuICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICBEb24ndCBkZWZpbmUgYW55IG9mIHRoZXNlIG1hY3JvcyB0byBjb21waWxlIGluIGByZWxlYXNlJyBtb2RlLiAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI3VuZGVmICBGVF9ERUJVR19MRVZFTF9FUlJPUgorI3VuZGVmICBGVF9ERUJVR19MRVZFTF9UUkFDRQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBBbnRpLWFsaWFzaW5nIHN1cHBvcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgVW5kZWZpbmUgdGhpcyBtYWNybyBvbmx5IGlmIHlvdSB3YW50IHRvIGRpc2FibGUgdGhlIGFudGktYWxpYXNpbmcgICAqLworICAvKiAgIHN1cHBvcnQgaW4gRnJlZVR5cGUuICBUaGlzIHdpbGwgc2F2ZSB5b3UgYWJvdXQgNSBLYiBvZiBjb2RlLiAgSXQgICAgKi8KKyAgLyogICBtYXkgYmUgaW1wb3J0YW50IGZvciBzb21lIGVtYmVkZGVkIHN5c3RlbXMuICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBGVF9DT05GSUdfT1BUSU9OX0FOVElfQUxJQVMKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogRW5kaWFuZXNzIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIEZyZWVUeXBlIGlzIGNvbXBsZXRlbHkgZW5kaWFuLWluZGVwZW5kZW50LCBhbmQgY2FuIHRodXMgYmUgY29tcGlsZWQgKi8KKyAgLyogICBkaXJlY3RseSBvbiBfYW55XyBtYWNoaW5lLiAgSG93ZXZlciwgc29tZSBjb21wb25lbnRzIG9mIHRoZSBsaWJyYXJ5ICovCisgIC8qICAgcHJvdmlkZSBpbXByb3ZlZCByb3V0aW5lcyBmb3IgdGhlIGNhc2VzIHdoZXJlIGVuZGlhbmVzcyBpcyBrbm93bi4gICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICBJdCB1c3VhbGx5IHJlc3VsdHMgaW4gc3BlZWQtdXBzIGFuZCByZWR1Y2VkIGNvZGUgc2l6ZS4gIE5vdGUgdGhhdCAgICovCisgIC8qICAgeW91IHNob3VsZCBub3QgZGVmaW5lIGJvdGggb2YgdGhlc2UgbWFjcm9zLiAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgTk9URTogRm9yIG5vdywgb25seSB0aGUgc2Nhbi1saW5lIGNvbnZlcnRlciAoYmFzZS9mdHJhc3Rlci5jKSB1c2VzICAqLworICAvKiAgICAgICAgIHRoZXNlIG1hY3JvcyB0byBzcGVlZC11cCBzb21lIGFudGktYWxpYXMgcmVuZGVyaW5nIHJvdXRpbmVzLiAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjdW5kZWYgIEZUX0NPTkZJR19PUFRJT05fTElUVExFX0VORElBTgorI3VuZGVmICBGVF9DT05GSUdfT1BUSU9OX0JJR19FTkRJQU4KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogRGVmaW5lIHRoaXMgY29uZmlndXJhdGlvbiBtYWNybyB3aGVuZXZlciB5b3Ugd2FudCB0byBidWlsZCBhIHZlcnNpb24gICovCisgIC8qIG9mIEZyZWVUeXBlIHRoYXQgZG9lcyBub3QgaW5jbHVkZSBhIGRlZmF1bHQgYHN5c3RlbScgY29tcG9uZW50LiAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogTm90ZSB0aGF0IHRoaXMgd2lsbCBwcmV2ZW50IHRoZSBjb21waWxhdGlvbiBvZiBgZnRpbml0JywgaGVuY2UgdGhlICAgICovCisgIC8qIGZ1bmN0aW9uIEZUX0luaXRfRnJlZVR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyN1bmRlZiBGVF9DT05GSUdfT1BUSU9OX05PX0RFRkFVTFRfU1lTVEVNCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSByZW5kZXIgcG9vbCB1c2VkIGJ5IHRoZSBzY2FuLWxpbmUgICAgICAgICAqLworICAvKiAgICBjb252ZXJ0ZXIgdG8gZG8gYWxsIG9mIGl0cyB3b3JrLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoaXMgbXVzdCBiZSBncmVhdGVyIHRoYW4gNCBLYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRlRfUkVOREVSX1BPT0xfU0laRSAgIDMyNzY4CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX01BWF9EUklWRVJTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhlIG1heGltdW0gbnVtYmVyIG9mIGZvbnQgZHJpdmVycyB0aGF0IGNhbiBiZSByZWdpc3RlcmVkIGluIGEgICAgICovCisgIC8qICAgIHNpbmdsZSBGcmVlVHlwZSBsaWJyYXJ5IG9iamVjdC4gIDggc2VlbXMgdG8gYmUgYSBnb29kIGNob2ljZSBkdWUgICAqLworICAvKiAgICB0byB0aGUgcmVsYXRpdmUgbG93IGFjdHVhbCBudW1iZXIgb2YgZHJpdmVycyA7LSkgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZUX01BWF9EUklWRVJTICA4CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX01BWF9FWFRFTlNJT05TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhlIG1heGltdW0gbnVtYmVyIG9mIGV4dGVuc2lvbnMgdGhhdCBjYW4gYmUgcmVnaXN0ZXJlZCBpbiBhICAgICAgICovCisgIC8qICAgIHNpbmdsZSBmb250IGRyaXZlci4gOCBzZWVtcyB0byBiZSBhIGdvb2QgY2hvaWNlIGZvciBub3cuLiAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRlRfTUFYX0VYVEVOU0lPTlMgIDgKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfTUFYX0dMWVBIX0ZPUk1BVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGUgbWF4aW11bSBudW1iZXIgb2YgZ2x5cGggaW1hZ2UgZm9ybWF0cyB0aGF0IG1pZ2h0IGJlIHJlZ2lzdGVyZWQgKi8KKyAgLyogICAgaW4gYSBnaXZlbiBsaWJyYXJ5IGluc3RhbmNlLiA4IHNlZW1zIHRvIGJlIGEgZ29vZCBjaG9pY2UgZHVlIHRvICAgICovCisgIC8qICAgIHRoZSByZWxhdGl2ZWx5IGxvdyBudW1iZXIgb2YgY3VycmVudCBmb3JtYXRzIDstKSAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworI2RlZmluZSBGVF9NQVhfR0xZUEhfRk9STUFUUyAgOAorCisKKworI2VuZGlmIC8qIEZUT1BUSU9OX0ggKi8KZGlmZiAtLWdpdCBhL2NvbmZpZy93aW4zMi9mdHN5c3RlbS5jIGIvY29uZmlnL3dpbjMyL2Z0c3lzdGVtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU5ZjY2OAotLS0gL2Rldi9udWxsCisrKyBiL2NvbmZpZy93aW4zMi9mdHN5c3RlbS5jCkBAIC0wLDAgKzEsMjE0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgZnRzeXN0ZW0uaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4wCisgKgorICogICAgQU5TSS1zcGVjaWZpYyBGcmVlVHlwZSBsb3ctbGV2ZWwgc3lzdGVtIGludGVyZmFjZQorICoKKyAqICAgIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZGVmaW5pdGlvbiBvZiBpbnRlcmZhY2UgdXNlZCBieSBGcmVlVHlwZQorICogICAgdG8gYWNjZXNzIGxvdy1sZXZlbCwgaS5lLiBtZW1vcnkgbWFuYWdlbWVudCwgaS9vIGFjY2VzcyBhcyB3ZWxsCisgKiAgICBhcyB0aHJlYWQgc3luY2hyb25pc2F0aW9uLiAgICAgICAgICAgICAgCisgKgorICoKKyAqICBDb3B5cmlnaHQgMTk5Ni0xOTk5IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQgICAgICAgICAgCisgKiAgbW9kaWZpZWQgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICAgIAorICogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgICAKKyAqICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICAgIAorICogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxmdHN5c3RlbS5oPgorI2luY2x1ZGUgPGZ0ZXJyb3JzLmg+CisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICBNRU1PUlkgTUFOQUdFTUVOVCBJTlRFUkZBQ0UgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiA8RnVuY1R5cGU+CisgKiAgICBGVF9BbGxvY19GdW5jCisgKgorICogPERlc2NyaXB0aW9uPgorICogICAgVGhlIG1lbW9yeSBhbGxvY2F0b3IgZnVuY3Rpb24gdHlwZQorICoKKyAqIDxJbnB1dD4KKyAqICAgIHN5c3RlbSAgICA6OiBwb2ludGVyIHRvIHRoZSBzeXN0ZW0gb2JqZWN0CisgKiAgICBzaXplICAgICAgOjogcmVxdWVzdGVkIHNpemUgaW4gYnl0ZXMKKyAqCisgKiA8T3V0cHV0PgorICogICAgYmxvY2sgICAgIDo6IGFkZHJlc3Mgb2YgbmV3bHkgYWxsb2NhdGVkIGJsb2NrCisgKgorICogPFJldHVybj4gIAorICogICAgRXJyb3IgY29kZS4gMCBtZWFucyBzdWNjZXNzLgorICoKKyAqIDxOb3RlPgorICogICAgSWYgeW91ciBhbGxvY2F0aW9uIHJvdXRpbmUgQUxXQVlTIHplcm9lcyB0aGUgbmV3IGJsb2NrLCB5b3UKKyAqICAgIHNob3VsZCBzZXQgdGhlIGZsYWcgRlRfU1lTVEVNX0ZMQUdfQUxMT0NfWkVST0VTIGluIHlvdXIgc3lzdGVtCisgKiAgICBvYmplY3QgJ2ZsYWdzJyBmaWVsZC4KKyAqCisgKiAgICBJZiB5b3UgaGF2ZSBzZXQgdGhlIGZsYWcgRlRfU1lTVEVNX0ZMQUdfUkVQT1JUX0NVUlJFTlRfQUxMT0MgaW4KKyAqICAgIHlvdXIgc3lzdGVtJ3MgInN5c3RlbV9mbGFncyIgZmllbGQsIHRoaXMgZnVuY3Rpb24gc2hvdWxkIHVwZGF0ZQorICogICAgdGhlICJjdXJyZW50X2FsbG9jIiBmaWVsZCBvZiB0aGUgc3lzdGVtIG9iamVjdC4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIHN0YXRpYworICB2b2lkKiAgZnRfYWxsb2MoIEZUX01lbW9yeSAgbWVtb3J5LAorICAgICAgICAgICAgICAgICAgIGxvbmcgICAgICAgc2l6ZSApCisgIHsKKyAgICAodm9pZCltZW1vcnk7CisgICAgcmV0dXJuIG1hbGxvYyhzaXplKTsKKyAgfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiA8RnVuY1R5cGU+CisgKiAgICBGVF9SZWFsbG9jX0Z1bmMKKyAqCisgKiA8RGVzY3JpcHRpb24+CisgKiAgICBUaGUgbWVtb3J5IHJlYWxsb2NhdG9yIGZ1bmN0aW9uIHR5cGUKKyAqCisgKiA8SW5wdXQ+CisgKiAgICBzeXN0ZW0gICA6OiBwb2ludGVyIHRvIHRoZSBzeXN0ZW0gb2JqZWN0CisgKiAgICBuZXdfc2l6ZSA6OiBuZXcgcmVxdWVzdGVkIHNpemUgaW4gYnl0ZXMKKyAqCisgKiA8SW5PdXQ+CisgKiAgICBibG9jayAgICA6OiBhZGRyZXNzIG9mIGJsb2NrIGluIG1lbW9yeQorICoKKyAqIDxSZXR1cm4+CisgKiAgICBFcnJvciBjb2RlLiAwIG1lYW5zIHN1Y2Nlc3MuCisgKgorICogPE5vdGU+CisgKiAgICBUaGlzIGZ1bmN0aW9uIGlzIF9uZXZlcl8gY2FsbGVkIHdoZW4gdGhlIHN5c3RlbSBmbGFnIAorICogICAgRlRfU1lTVEVNX0ZMQUdfTk9fUkVBTExPQyBpcyBzZXQuIEluc3RlYWQsIHRoZSBlbmdpbmUgd2lsbCBlbXVsYXRlCisgKiAgICByZWFsbG9jIHRocm91Z2ggImFsbG9jIiBhbmQgImZyZWUiLgorICoKKyAqICAgIE5vdGUgdGhhdCB0aGlzIGlzIHBvc3NpYmxlIGR1ZSB0byB0aGUgZmFjdCB0aGF0IEZyZWVUeXBlJ3MKKyAqICAgICJGVF9SZWFsbG9jIiBhbHdheXMgcmVxdWVzdHMgdGhlIF9jdXJyZW50XyBzaXplIG9mIHRoZSByZWFsbG9jYXRlZAorICogICAgYmxvY2sgYXMgYSBwYXJhbWV0ZXIsIHRodXMgYXZvaWRpbmcgbWVtb3J5IGxlYWtzLgorICoKKyAqICAgIElmIHlvdSBoYXZlIHNldCB0aGUgZmxhZyBGVF9TWVNURU1fRkxBR19SRVBPUlRfQ1VSUkVOVF9BTExPQyBpbgorICogICAgeW91ciBzeXN0ZW0ncyAic3lzdGVtX2ZsYWdzIiBmaWVsZCwgdGhpcyBmdW5jdGlvbiBzaG91bGQgdXBkYXRlCisgKiAgICB0aGUgImN1cnJlbnRfYWxsb2MiIGZpZWxkIG9mIHRoZSBzeXN0ZW0gb2JqZWN0LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgc3RhdGljCisgIHZvaWQqICBmdF9yZWFsbG9jKCBGVF9NZW1vcnkgIG1lbW9yeSwKKyAgICAgICAgICAgICAgICAgICAgIGxvbmcgICAgICAgY3VyX3NpemUsCisgICAgICAgICAgICAgICAgICAgICBsb25nICAgICAgIG5ld19zaXplLAorICAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICBibG9jayApCisgIHsKKyAgICAodm9pZCltZW1vcnk7CisgICAgKHZvaWQpY3VyX3NpemU7CisKKyAgICByZXR1cm4gcmVhbGxvYyggYmxvY2ssIG5ld19zaXplICk7CisgIH0KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogPEZ1bmNUeXBlPgorICogICAgRlRfRnJlZV9GdW5jCisgKgorICogPERlc2NyaXB0aW9uPgorICogICAgVGhlIG1lbW9yeSByZWxlYXNlIGZ1bmN0aW9uIHR5cGUKKyAqCisgKiA8SW5wdXQ+CisgKiAgICBzeXN0ZW0gIDo6IHBvaW50ZXIgdG8gdGhlIHN5c3RlbSBvYmplY3QKKyAqICAgIGJsb2NrICAgOjogYWRkcmVzcyBvZiBibG9jayBpbiBtZW1vcnkKKyAqCisgKiA8Tm90ZT4KKyAqICAgIElmIHlvdSBoYXZlIHNldCB0aGUgZmxhZyBGVF9TWVNURU1fRkxBR19SRVBPUlRfQ1VSUkVOVF9BTExPQyBpbgorICogICAgeW91ciBzeXN0ZW0ncyAic3lzdGVtX2ZsYWdzIiBmaWVsZCwgdGhpcyBmdW5jdGlvbiBzaG91bGQgdXBkYXRlCisgKiAgICB0aGUgImN1cnJlbnRfYWxsb2MiIGZpZWxkIG9mIHRoZSBzeXN0ZW0gb2JqZWN0LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgc3RhdGljCisgIHZvaWQgIGZ0X2ZyZWUoIEZUX01lbW9yeSAgbWVtb3J5LAorICAgICAgICAgICAgICAgICB2b2lkKiAgICAgIGJsb2NrICkKKyAgeworICAgICh2b2lkKW1lbW9yeTsKKyAgICBmcmVlKCBibG9jayApOworICB9CisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICBSRVNPVVJDRSBNQU5BR0VNRU5UIElOVEVSRkFDRSAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworCisjZGVmaW5lIFNUUkVBTV9GSUxFKHN0cmVhbSkgICgoRklMRSopc3RyZWFtLT5kZXNjcmlwdG9yLnBvaW50ZXIpCisKKyAgc3RhdGljCisgIHZvaWQgIGZ0X2Nsb3NlX3N0cmVhbSggRlRfU3RyZWFtICBzdHJlYW0gKQorICB7CisgICAgZmNsb3NlKCBTVFJFQU1fRklMRShzdHJlYW0pICk7CisgIH0KKworICBzdGF0aWMKKyAgdW5zaWduZWQgbG9uZyAgZnRfaW9fc3RyZWFtKCBGVF9TdHJlYW0gICAgICBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqICAgICAgICAgIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICBjb3VudCApCisgIHsKKyAgICBGSUxFKiAgZmlsZTsKKyAgICAKKyAgICBmaWxlID0gU1RSRUFNX0ZJTEUoc3RyZWFtKTsKKworICAgIGZzZWVrKCBmaWxlLCBvZmZzZXQsIFNFRUtfU0VUICk7ICAgIAorICAgIHJldHVybiAodW5zaWduZWQgbG9uZylmcmVhZCggYnVmZmVyLCBjb3VudCwgMSwgZmlsZSApOworICB9CisKKworICBleHRlcm4KKyAgaW50ICBGVF9OZXdfU3RyZWFtKCBjb25zdCBjaGFyKiAgZmlsZXBhdGhuYW1lLAorICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgICBzdHJlYW0gKQorICB7CisgICAgRklMRSogIGZpbGU7CisgICAgCisgICAgZmlsZSA9IGZvcGVuKCBmaWxlcGF0aG5hbWUsICJyYiIgKTsKKyAgICBpZiAoIWZpbGUpCisgICAgICByZXR1cm4gRlRfRXJyX0Nhbm5vdF9PcGVuX1Jlc291cmNlOworICAgICAgCisgICAgZnNlZWsoIGZpbGUsIDAsIFNFRUtfRU5EICk7CisgICAgc3RyZWFtLT5zaXplID0gZnRlbGwoZmlsZSk7CisgICAgZnNlZWsoIGZpbGUsIDAsIFNFRUtfU0VUICk7CisgICAgCisgICAgc3RyZWFtLT5kZXNjcmlwdG9yLnBvaW50ZXIgPSBmaWxlOworICAgIHN0cmVhbS0+cG9zICAgICAgICAgICAgICAgID0gMDsKKyAgICAKKyAgICBzdHJlYW0tPnJlYWQgID0gZnRfaW9fc3RyZWFtOworICAgIHN0cmVhbS0+Y2xvc2UgPSBmdF9jbG9zZV9zdHJlYW07CisKKyAgICByZXR1cm4gMDsKKyAgfQorCisKKyAgZXh0ZXJuCisgIEZUX01lbW9yeSAgRlRfTmV3X01lbW9yeSggdm9pZCApCisgIHsKKyAgICBGVF9NZW1vcnkgIG1lbW9yeTsKKyAgICAKKyAgICBtZW1vcnkgPSAoRlRfTWVtb3J5KW1hbGxvYyggc2l6ZW9mKCptZW1vcnkpICk7CisgICAgaWYgKG1lbW9yeSkKKyAgICB7CisgICAgICBtZW1vcnktPnVzZXIgICAgPSAwOworICAgICAgbWVtb3J5LT5hbGxvYyAgID0gZnRfYWxsb2M7CisgICAgICBtZW1vcnktPnJlYWxsb2MgPSBmdF9yZWFsbG9jOworICAgICAgbWVtb3J5LT5mcmVlICAgID0gZnRfZnJlZTsKKyAgICB9CisgICAgcmV0dXJuIG1lbW9yeTsKKyAgfQorCmRpZmYgLS1naXQgYS9jb25maWcvd2luMzIvbGNjbGliLmJhdCBiL2NvbmZpZy93aW4zMi9sY2NsaWIuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjOGY1MWIKLS0tIC9kZXYvbnVsbAorKysgYi9jb25maWcvd2luMzIvbGNjbGliLmJhdApAQCAtMCwwICsxLDEyIEBACitAY2Qgb2JqCitATENDTElCIC9vdXQ6ZnJlZXR5cGUubGliICoub2JqCitAZWNobyBUaGUgbGlicmFyeSBmaWxlIGBvYmovZnJlZXR5cGUubGliJyB3YXMgZ2VuZXJhdGVkLgorQGV4aXQgMAorCis7IHRoZSBMQ0MgTGlicmFyaWFuIGhhcyBtYW55IGZsYXdzLCBvbmUgb2YgdGhlbSBpcyB0aGF0IGl0ICpyZXF1aXJlcyogdGhhdAorOyBhbGwgb2JqZWN0IGZpbGVzIGJlIHBsYWNlZCBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkuIEFub3RoZXIgZmxhdyBpcyB0aGF0Cis7IGl0IGNhbm5vdCBhY2NlcHQgYSBsb25nIGxpc3Qgb2Ygb2JqZWN0IGZpbGVzLgorOworOyB0aGlzIGZpbGUgaXMgdXNlZCB0byBidWlsZCB0aGUgbGlicmFyeSBmaWxlIGBvYmovZnJlZXR5cGUubGliJworOyAKKwpkaWZmIC0tZ2l0IGEvZGVtb3MvTWFrZWZpbGUgYi9kZW1vcy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjNkOWQxCi0tLSAvZGV2L251bGwKKysrIGIvZGVtb3MvTWFrZWZpbGUKQEAgLTAsMCArMSwyMjcgQEAKKy5QSE9OWTogZXhlcworYWxsOiBleGVzCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIFRPUCBpcyB0aGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBtYWluIEZyZWVUeXBlIHNvdXJjZSBpcyBmb3VuZCwKKyMgYXMgd2VsbCBhcyB0aGUgJ2NvbmZpZy5taycgZmlsZQorIworCitpZm5kZWYgVE9QCitUT1AgOj0gLi4KK2VuZGlmCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIENoZWNrIHRoYXQgd2UgaGF2ZSBhIHdvcmtpbmcgYGNvbmZpZy5taycgaW4gdGhlIGFib3ZlIGRpcmVjdG9yeS4KKyMgSWYgbm90LCBpc3N1ZSBhIHdhcm5pbmcgbWVzc2FnZSwgdGhlbiBzdG9wIHRoZXJlLi4KKyMKK2lmZXEgKCQod2lsZGNhcmQgJChUT1ApL2NvbmZpZy5tayksKQorbm9fY29uZmlnX21rIDo9IDEKK2VuZGlmCisKK2lmZGVmIG5vX2NvbmZpZ19taworCitleGVzOgorCUBlY2hvIFBsZWFzZSBjb21waWxlIHRoZSBsaWJyYXJ5IGJlZm9yZSB0aGUgZGVtbyBwcm9ncmFtcyAhIQorCitlbHNlCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIEdvb2QsIG5vdyBpbmNsdWRlIHRoZSBgY29uZmlnLm1rJyBpbiBvcmRlciB0byBrbm93IGhvdyB0byBidWlsZAorIyBvYmplY3QgZmlsZXMgZnJvbSBzb3VyY2VzLCBhcyB3ZWxsIGFzIG90aGVyIHRoaW5ncyAoY29tcGlsZXIgZmxhZ3MpCisjCitpbmNsdWRlIC4uL2NvbmZpZy5taworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBEZXRlY3QgRE9TLWxpa2UgcGxhdGZvcm1zLCBjdXJyZW50bHkgRE9TLCBXaW4gMy4xLCBXaW4zMiAmIE9TLzIKKyMKKyMKK2lmbmVxICgkKGZpbmRzdHJpbmcgJChQTEFURk9STSksb3MyIHdpbjE2IHdpbjMyIGRvcyksKQorRE9TTElLRSA6PSAxCitlbmRpZgorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgQ2xlYW4tdXAgcnVsZXMuIEJlY2F1c2UgdGhlIGBkZWwnIGNvbW1hbmQgb24gRE9TLWxpa2UgcGxhdGZvcm1zCisjIGNhbm5vdCB0YWtlIGEgbG9uZyBsaXN0IG9mIGFyZ3VtZW50cywgd2Ugc2ltcGx5IGVyYXNlIHRoZSBkaXJlY3RvcnkKKyMgY29udGVudHMuLgorIworLlBIT05ZOiBjbGVhbiAgZGlzdGNsZWFuCisKK2lmZGVmIERPU0xJS0UKK2NsZWFuX2RlbW86CisJLWRlbCBvYmpcKi4kTworCS1kZWwgc3JjXCouYmFrCisKK2Rpc3RjbGVhbl9kZW1vOiBjbGVhbl9kZW1vCisJLWRlbCBvYmpcKi4qCisJLWRlbCBiaW5cKi5leGUKK2Vsc2UKK2NsZWFuX2RlbW86CisJLSQoREVMRVRFKSAkKE9CSl8pKi4kTworCS0kKERFTEVURSkgJChTUkNfKSouYmFrIGdyYXBoJChTRVApKi5iYWsKKwktJChERUxFVEUpICQoU1JDXykqfiBncmFwaCQoU0VQKSp+CisKKworZGlzdGNsZWFuX2RlbW86IGNsZWFuX2RlbW8KKwktJChERUxFVEUpICQoQklOXykqCitlbmRpZgorCitjbGVhbjogY2xlYW5fZGVtbworZGlzdGNsZWFuOiBkaXN0Y2xlYW5fZGVtbworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBEZWZpbmUgYSBmZXcgaW1wb3J0YW50IHZhcmlhYmxlcyBub3cKKyMKKyMKK1RPUF8gOj0gJChUT1ApJChTRVApCitTUkNfIDo9ICQoVE9QKSQoU0VQKXNyYyQoU0VQKQorCitCSU5fIDo9IGJpbiQoU0VQKQorT0JKXyA6PSBvYmokKFNFUCkKKworR1JBUEhfRElSIDo9IGdyYXBoCisKK1NSQ19ESVIgIDo9IHNyYworU1JDX0RJUl8gOj0gJChTUkNfRElSKSQoU0VQKQorCisKK0ZUX0lOQ0xVREVTIDo9ICQoQlVJTEQpICQoVE9QXylpbmNsdWRlICQoU1JDXyliYXNlCitUVF9JTkNMVURFUyA6PSAkKFNSQ18pc2hhcmVkICQoU1JDXyl0cnVldHlwZQorVDFfSU5DTFVERVMgOj0gJChTUkNfKXNoYXJlZCAkKFNSQ18pdHlwZTEKKworQ0ZMQUdTICAgID0gLWMgLU8wIC1nICQoSU5DTFVERVM6JT0kSSUpIC1XYWxsIC1XIC1hbnNpCitDQyAgICAgICA6PSAkKENDKQorTElOSyAgICAgOj0gJChDQykKK0ZUTElCICAgIDo9ICQoTElCX0RJUikkKFNFUCkkKExJQlJBUlkpLiRBCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgQ29tcHV0ZSB0aGUgZXhlY3V0YWJsZSBzdWZmaXggdG8gdXNlLCBhbmQgcHV0IGl0IGluIGBFJy4KKyMgSXQgaXMgIi5leGUiIG9uIERPUy1pc2ggcGxhdGZvcm1zLCBhbmQgbm90aGluZyBvdGhlcndpc2UKKyMKK2lmZGVmIERPU0xJS0UKK0UgOj0gLmV4ZQorZWxzZQorRSA6PQorZW5kaWYKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBUaGUgbGlzdCBvZiBkZW1vbnN0cmF0aW9uIHByb2dyYW1zIHRvIGJ1aWxkLgorIworRVhFUyA6PSBmdGxpbnQgdDFkdW1wIGZ0dmlldyBmdHRpbWVyCisKK2lmbmVxICgkKGZpbmRzdHJpbmcgJChQTEFURk9STSksb3MyIHVuaXgpLCkKK0VYRVMgKz0gdHRkZWJ1ZworZW5kaWYKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBJbmNsdWRlIHRoZSBydWxlcyBuZWVkZWQgdG8gY29tcGlsZSB0aGUgZ3JhcGhpY3Mgc3ViLXN5c3RlbS4KKyMgVGhpcyB3aWxsIGFsc28gc2VsZWN0IHdoaWNoIGdyYXBoaWNzIGRyaXZlciB0byBjb21waWxlIHRvIHRoZQorIyBzdWItc3lzdGVtLi4KKyMKK2luY2x1ZGUgJChHUkFQSF9ESVIpL3J1bGVzLm1rCisKK2V4ZXM6ICQoRVhFUzolPSQoQklOXyklJEUpCisKKworSU5DTFVERVMgOj0gJChGVF9JTkNMVURFUykKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgUnVsZXMgZm9yIGNvbXBpbGluZyBvYmplY3QgZmlsZXMgZm9yIHRleHQtb25seSBkZW1vcworIworCitDT01NT05fT0JKIDo9ICQoT0JKXyljb21tb24ubworJChDT01NT05fT0JKKTogJChTUkNfRElSXyljb21tb24uYworCSQoQ0MpICQoQ0ZMQUdTKSAkVCRAICQ8CisKKyQoT0JKXyklLiRPOiAkKFNSQ19ESVJfKSUuYyAkKEZUTElCKQorCSQoQ0MpICQoQ0ZMQUdTKSAkVCRAICQ8CisKKyQoT0JKXylmdGxpbnQuJE86ICQoU1JDX0RJUl8pZnRsaW50LmMKKwkkKENDKSAkKENGTEFHUykgJFQkQCAkPAorCiskKE9CSl8pZnR0cnkuJE86ICQoU1JDX0RJUl8pZnR0cnkuYworCSQoQ0MpICQoQ0ZMQUdTKSAkVCRAICQ8CisKKworJChPQkpfKWZ0dmlldy4kTzogJChTUkNfRElSXylmdHZpZXcuYyAkKEdSQVBIX0xJQikKKwkkKENDKSAkKENGTEFHUykgJChHUkFQSF9JTkNMVURFUzolPSRJJSkgJFQkQCAkPAorCiskKE9CSl8pZnR0aW1lci4kTzogJChTUkNfRElSXylmdHRpbWVyLmMgJChHUkFQSF9MSUIpCisJJChDQykgJChDRkxBR1MpICQoR1JBUEhfSU5DTFVERVM6JT0kSSUpICRUJEAgJDwKKworIyQoT0JKXylmdHNiaXQuJE86ICQoU1JDX0RJUikvZnRzYml0LmMgJChHUkFQSF9MSUIpCisjCSQoQ0MpICQoQ0ZMQUdTKSAkVCRAICQ8CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgU3BlY2lhbCBydWxlIHRvIGNvbXBpbGUgdGhlIGB0MWR1bXAnIHByb2dyYW0gYXMgaXQgaW5jbHVkZXMKKyMgdGhlIFR5cGUxIHNvdXJjZSBwYXRoCisjCiskKE9CSl8pdDFkdW1wLiRPOiAkKFNSQ19ESVIpL3QxZHVtcC5jCisJJChDQykgJChDRkxBR1MpICQoVDFfSU5DTFVERVM6JT0kSSUpICRUJEAgJDwKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBTcGVjaWFsIHJ1bGUgdG8gY29tcGlsZSB0aGUgYHR0ZGVidWcnIHByb2dyYW0gYXMgaXQgaW5jbHVkZXMKKyMgdGhlIFRydWVUeXBlIHNvdXJjZSBwYXRoIGFuZCBuZWVkcyBleHRyYSBmbGFncyBmb3IgY29ycmVjdCBrZXlib2FyZAorIyBoYW5kbGluZyBvbiBVbml4CisjCisKKyMgUE9TSVggVEVSTUlPUzogRG8gbm90IGRlZmluZSBpZiB5b3UgdXNlIE9MRCBVKml4IGxpa2UgNC4yQlNELgorIworIyBkZXRlY3QgYSBVbml4IHN5c3RlbQoraWZlcSAoJChQTEFURk9STSksdW5peCkKK0VYVFJBRkxBR1MgPSAkRFVOSVggJERIQVZFX1BPU0lYX1RFUk1JT1MKK2VuZGlmCisKKyQoT0JKXyl0dGRlYnVnLiRPOiAkKFNSQ19ESVIpL3R0ZGVidWcuYworCSQoQ0MpICQoQ0ZMQUdTKSAkKFRUX0lOQ0xVREVTOiU9JEklKSAkVCRAICQ8ICQoRVhUUkFGTEFHUykKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBSdWxlcyB1c2VkIHRvIGxpbmsgdGhlIGV4ZWN1dGFibGVzLiBOb3RlIHRoYXQgdGhleSBjb3VsZCBiZQorIyBvdmVyLXJpZGRlbiBieSBzeXN0ZW0tc3BlY2lmaWMgdGhpbmdzLi4KKyMKKworJChCSU5fKWZ0bGludCRFOiAkKE9CSl8pZnRsaW50LiRPICQoRlRMSUIpCisJJChMSU5LKSAkKExGTEFHUykgJFQkQCAkPCAgJChGVExJQikgJChFRkVOQ0UpCisKKworJChCSU5fKWZ0dHJ5JEU6ICQoT0JKXylmdHRyeS4kTyAkKEZUTElCKQorCSQoTElOSykgJChMRkxBR1MpICRUJEAgJDwgICQoRlRMSUIpICQoRUZFTkNFKQorCisKKyQoQklOXylmdHNiaXQkRTogJChPQkpfKWZ0c2JpdC4kTyAkKEZUTElCKQorCSQoTElOSykgJChMRkxBR1MpICRUJEAgJDwgICQoRlRMSUIpICQoRUZFTkNFKQorCisKKyQoQklOXyl0MWR1bXAkRTogJChPQkpfKXQxZHVtcC4kTyAkKEZUTElCKQorCSQoTElOSykgICQoTEZMQUdTKSAkVCRAICQ8ICAkKEZUTElCKSAkKEVGRU5DRSkKKworJChCSU5fKXR0ZGVidWckRTogJChPQkpfKXR0ZGVidWcuJE8gJChGVExJQikKKwkkKExJTkspICQoTEZMQUdTKSAkVCRAICQ8ICQoRlRMSUIpICQoRUZFTkNFKQorCisKKyQoQklOXylmdHZpZXckRTogJChPQkpfKWZ0dmlldy4kTyAkKEZUTElCKSAkKEdSQVBIX0xJQikgJChDT01NT05fT0JKKQorCSQoTElOSykgJChMRkxBR1MpICRUJEAgJDwgJChGVExJQikgJChHUkFQSF9MSU5LKSAkKENPTU1PTl9PQkopICQoRUZFTkNFKQorCiskKEJJTl8pZnR0aW1lciRFOiAkKE9CSl8pZnR0aW1lci4kTyAkKEZUTElCKSAkKEdSQVBIX0xJQikgJChDT01NT05fT0JKKQorCSQoTElOSykgJChMRkxBR1MpICRUJEAgJDwgJChGVExJQikgJChHUkFQSF9MSU5LKSAkKEVGRU5DRSkKKworZW5kaWYKKworCmRpZmYgLS1naXQgYS9kZW1vcy9jb25maWcvb3MyL2dyb3MycG0uYyBiL2RlbW9zL2NvbmZpZy9vczIvZ3JvczJwbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3NmY1OGQKLS0tIC9kZXYvbnVsbAorKysgYi9kZW1vcy9jb25maWcvb3MyL2dyb3MycG0uYwpAQCAtMCwwICsxLDg4NyBAQAorI2luY2x1ZGUgImdyb3MycG0uaCIKKyNpbmNsdWRlICJncmRldmljZS5oIgorCisjZGVmaW5lIElOQ0xfRE9TCisjZGVmaW5lIElOQ0xfV0lOCisjZGVmaW5lIElOQ0xfR1BJCisjZGVmaW5lIElOQ0xfU1VCCisKKyNpbmNsdWRlIDxvczIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisKKyAgc3RhdGljIHZvaWQgUGFuaWMoIGNvbnN0IGNoYXIqIG1lc3NhZ2UgKQorICB7CisgICAgZnByaW50Ziggc3RkZXJyLCAiJXMiLCBtZXNzYWdlICk7CisgICAgZXhpdCgxKTsKKyAgfQorCisgIHR5cGVkZWYgc3RydWN0IFRyYW5zbGF0b3IKKyAgeworICAgIFVMT05HICAgb3Mya2V5OworICAgIGdyS2V5ICAgZ3JrZXk7CisgICAgCisgIH0gVHJhbnNsYXRvcjsKKyAgCisKKyAgc3RhdGljCisgIFRyYW5zbGF0b3IgIGtleV90cmFuc2xhdG9yc1tdID0KKyAgeworICAgIHsgVktfQkFDS1NQQUNFLCBncktleUJhY2tTcGFjZSB9LAorICAgIHsgVktfVEFCLCAgICAgICBncktleVRhYiAgICAgICB9LAorICAgIHsgVktfRU5URVIsICAgICBncktleVJldHVybiAgICB9LAorICAgIHsgVktfRVNDLCAgICAgICBncktleUVzYyAgICAgICB9LAorICAgIHsgVktfSE9NRSwgICAgICBncktleUhvbWUgICAgICB9LAorICAgIHsgVktfTEVGVCwgICAgICBncktleUxlZnQgICAgICB9LAorICAgIHsgVktfVVAsICAgICAgICBncktleVVwICAgICAgICB9LAorICAgIHsgVktfUklHSFQsICAgICBncktleVJpZ2h0ICAgICB9LAorICAgIHsgVktfRE9XTiwgICAgICBncktleURvd24gICAgICB9LAorICAgIHsgVktfUEFHRVVQLCAgICBncktleVBhZ2VVcCAgICB9LAorICAgIHsgVktfUEFHRURPV04sICBncktleVBhZ2VEb3duICB9LAorICAgIHsgVktfRU5ELCAgICAgICBncktleUVuZCAgICAgICB9LAorICAgIHsgVktfRjEsICAgICAgICBncktleUYxICAgICAgICB9LAorICAgIHsgVktfRjIsICAgICAgICBncktleUYyICAgICAgICB9LAorICAgIHsgVktfRjMsICAgICAgICBncktleUYzICAgICAgICB9LAorICAgIHsgVktfRjQsICAgICAgICBncktleUY0ICAgICAgICB9LAorICAgIHsgVktfRjUsICAgICAgICBncktleUY1ICAgICAgICB9LAorICAgIHsgVktfRjYsICAgICAgICBncktleUY2ICAgICAgICB9LAorICAgIHsgVktfRjcsICAgICAgICBncktleUY3ICAgICAgICB9LAorICAgIHsgVktfRjgsICAgICAgICBncktleUY4ICAgICAgICB9LAorICAgIHsgVktfRjksICAgICAgICBncktleUY5ICAgICAgICB9LAorICAgIHsgVktfRjEwLCAgICAgICBncktleUYxMCAgICAgICB9LAorICAgIHsgVktfRjExLCAgICAgICBncktleUYxMSAgICAgICB9LAorICAgIHsgVktfRjEyLCAgICAgICBncktleUYxMiAgICAgICB9CisgIH07CisKKworI2RlZmluZSBNQVhfUElYRUxfTU9ERVMgIDMyCisKKyAgc3RhdGljIGludCAgICAgICAgICAgbnVtX3BpeGVsX21vZGVzID0gMDsKKyAgc3RhdGljIGdyUGl4ZWxNb2RlICAgcGl4ZWxfbW9kZXNbIE1BWF9QSVhFTF9NT0RFUyBdOyAgCisgIHN0YXRpYyBpbnQgICAgICAgICAgIHBpeGVsX2RlcHRoWyBNQVhfUElYRUxfTU9ERVMgXTsKKworICBzdGF0aWMgIEhBQiAgIGdyX2FuY2hvcjsgICAvKiBkZXZpY2UgYW5jaG9yIGJsb2NrICovCisKKyAgdHlwZWRlZiBQT0lOVEwgIFBNQmxpdFBvaW50c1s0XTsKKworCisgIHR5cGVkZWYgc3RydWN0IGdyUE1TdXJmYWNlXworICB7CisgICAgZ3JTdXJmYWNlICByb290OworICAgIGdyQml0bWFwICAgaW1hZ2U7CisKKyAgICBIQUIgICAgICAgIGFuY2hvcjsgICAgICAgICAvKiBoYW5kbGUgdG8gYW5jaG9yIGJsb2NrIGZvciBzdXJmYWNlJ3Mgd2luZG93ICovCisgICAgSFdORCAgICAgICBmcmFtZV93aW5kb3c7ICAgLyogaGFuZGxlIHRvIHdpbmRvdydzIGZyYW1lICAgICAgICAgICAgICAgICAgICAqLworICAgIEhXTkQgICAgICAgY2xpZW50X3dpbmRvdzsgIC8qIGhhbmRsZSB0byB3aW5kb3cncyBjbGllbnQgICAgICAgICAgICAgICAgICAgKi8KKyAgICBIV05EICAgICAgIHRpdGxlX3dpbmRvdzsgICAvKiBoYW5kbGUgdG8gd2luZG93J3MgdGl0bGUgYmFyICAgICAgICAgICAgICAgICovCisKKyAgICBIUFMgICAgICAgIGltYWdlX3BzOyAgICAgICAvKiBtZW1vcnkgcHJlc2VudGF0aW9uIHNwYWNlIHVzZWQgdG8gaG9sZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoZSBzdXJmYWNlJ3MgY29udGVudCB1bmRlciBQTSAgICAgICAgICovCisgICAgSERDICAgICAgICBpbWFnZV9kYzsgICAgICAgLyogbWVtb3J5IGRldmljZSBjb250ZXh0IGZvciB0aGUgaW1hZ2UgICAgKi8KKworICAgIEhFViAgICAgICAgZXZlbnRfbG9jazsgICAgIC8qIHNlbWFwaG9yZSB1c2VkIGluIGxpc3Rlbl9zdXJmYWNlICAgKi8KKyAgICBITVRYICAgICAgIGltYWdlX2xvY2s7ICAgICAvKiBhIG11dGV4IHVzZWQgdG8gc3luY2hyb25pc2UgYWNjZXNzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdG8gdGhlIG1lbW9yeSBwcmVzZW50YXRpb24gc3BhY2UgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHVzZWQgdG8gaG9sZCB0aGUgc3VyZmFjZSAgICAgICAgICAgKi8KKworICAgIFRJRCAgICAgICAgbWVzc2FnZV90aHJlYWQ7IC8qIHRocmVhZCB1c2VkIHRvIHByb2Nlc3MgdGhpcyBzdXJmYWNlJ3MgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtZXNzYWdlcy4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICBQQklUTUFQSU5GTzIgYml0bWFwX2hlYWRlcjsvKiBvcy8yIGJpdG1hcCBkZXNjcmlwdG9yICAgICAgICAgICAgICAgICAgICovCisgICAgSEJJVE1BUCAgICAgIG9zMl9iaXRtYXA7ICAgLyogSGFuZGxlIHRvIE9TLzIgYml0bWFwIGNvbnRhaW5lZCBpbiBpbWFnZSAqLworICAgIEJPT0wgICAgICAgICByZWFkeTsgICAgICAgIC8qID8/PyAqLworCisgICAgbG9uZyAgICAgICAgIHNoYWRlc1syNTZdOyAgLyogaW5kaWNlcyBvZiBncmF5IGxldmVscyBpbiBwaXhlbF9tb2RlX2dyYXkgKi8KKworICAgIFBPSU5UTCAgICAgICBzdXJmYWNlX2JsaXRbNF07ICAvKiBzdXJmYWNlIGJsaXR0aW5nIHRhYmxlICAgKi8KKyAgICBQT0lOVEwgICAgICAgbWFnbmlmeV9ibGl0WzRdOyAgLyogbWFnbmlmaWVyIGJsaXR0aW5nIHRhYmxlICovCisgICAgaW50ICAgICAgICAgIG1hZ25pZmljYXRpb247ICAgIC8qIGxldmVsIG9mIG1hZ25pZmljYXRpb24gICAqLworICAgIFBPSU5UTCAgICAgICBtYWduaWZ5X2NlbnRlcjsKKyAgICBTSVpFTCAgICAgICAgbWFnbmlmeV9zaXplOworCisgICAgZ3JFdmVudCAgICAgIGV2ZW50OworCisgICAgUE1CbGl0UG9pbnRzIGJsaXRfcG9pbnRzOworCisgIH0gZ3JQTVN1cmZhY2U7CisKKworCisgIHN0YXRpYworICB2b2lkICBlbmFibGVfb3MyX2lvc3RyZWFtcyggdm9pZCApCisgIHsKKyAgICBQVElCICB0aHJlYWRfYmxvY2s7CisgICAgUFBJQiAgcHJvY2Vzc19ibG9jazsKKworICAgIC8qIFhYWCA6IFRoaXMgaXMgYSB2ZXJ5IG5hc3R5IGhhY2ssIGl0IGZvb2xzIE9TLzIgYW5kIGxldCB0aGUgcHJvZ3JhbSAqLworICAgIC8qICAgICAgIGNhbGwgUE0gZnVuY3Rpb25zLCBldmVuIHRob3VnaCBzdGRpbi9zdGRvdXQvc3RkZXJyIGFyZSBzdGlsbCAqLworICAgIC8qICAgICAgIGRpcmVjdGVkIHRvIHRoZSBzdGFuZGFyZCBpL28gc3RyZWFtcy4uICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICAgICAgIFRoZSBwcm9ncmFtIG11c3QgYmUgY29tcGlsZWQgd2l0aCBXSU5ET1dDT01QQVQgICAgICAgICAgICAgICAqLworICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICAgQ3JlZGl0cyBnbyB0byBNaWNoYWwgZm9yIGZpbmRpbmcgdGhpcyAhISAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIERvc0dldEluZm9CbG9ja3MoICZ0aHJlYWRfYmxvY2ssICZwcm9jZXNzX2Jsb2NrICk7CisgICAgcHJvY2Vzc19ibG9jay0+cGliX3VsdHlwZSA9IDM7CisgIH0KKworCisKKyAgc3RhdGljCisgIGludCAgaW5pdF9kZXZpY2UoIHZvaWQgKQorICB7CisgICAgZW5hYmxlX29zMl9pb3N0cmVhbXMoKTsKKworICAgIC8qIGNyZWF0ZSBhbiBhbmNob3IgYmxvY2suIFRoaXMgd2lsbCBhbGxvdyB0aGlzIHRocmVhZCAoaS5lLiB0aGUgKi8KKyAgICAvKiBtYWluIG9uZSkgdG8gY2FsbCBHcGkgZnVuY3Rpb25zLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgZ3JfYW5jaG9yID0gV2luSW5pdGlhbGl6ZSgwKTsKKyAgICBpZiAoIWdyX2FuY2hvcikKKyAgICB7CisgICAgICAvKiBjb3VsZCBub3QgaW5pdGlhbGlzZSBQcmVzZW50YXRpb24gTWFuYWdlciAqLworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHJldHVybiAwOworICB9CisKKworCisgIHN0YXRpYworICB2b2lkICBkb25lX2RldmljZSggdm9pZCApCisgIHsKKyAgICAvKiBJbmRpY2F0ZXMgdGhhdCB3ZSBkbyBub3QgdXNlIHRoZSBQcmVzZW50YXRpb24gTWFuYWdlciwgdGhpcyAqLworICAgIC8qIHdpbGwgYWxzbyByZWxlYXNlIGFsbCBhc3NvY2lhdGVkIHJlc291cmNlcy4uICAgICAgICAgICAgICAgICovCisgICAgV2luVGVybWluYXRlKCBncl9hbmNob3IgKTsKKyAgfQorCisKKworICAvKiBjbG9zZSBhIGdpdmVuIHdpbmRvdyAqLworICBzdGF0aWMKKyAgdm9pZCAgZG9uZV9zdXJmYWNlKCBnclBNU3VyZmFjZSogIHN1cmZhY2UgKQorICB7CisgICAgaWYgKCBzdXJmYWNlLT5mcmFtZV93aW5kb3cgKQorICAgICAgV2luRGVzdHJveVdpbmRvdyggc3VyZmFjZS0+ZnJhbWVfd2luZG93ICk7CisKKyAgICBXaW5SZWxlYXNlUFMoIHN1cmZhY2UtPmltYWdlX3BzICk7CisKKyAgICBnckRvbmVCaXRtYXAoICZzdXJmYWNlLT5pbWFnZSApOworICAgIGdyRG9uZUJpdG1hcCggJnN1cmZhY2UtPnJvb3QuYml0bWFwICk7CisgIH0KKworCisKKworCisgIHN0YXRpYworICB2b2lkIGFkZF9waXhlbF9tb2RlKCBnclBpeGVsTW9kZSAgcGl4ZWxfbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgIGRlcHRoICkKKyAgeworICAgIGlmICggbnVtX3BpeGVsX21vZGVzID49IE1BWF9QSVhFTF9NT0RFUyApCisgICAgICBQYW5pYyggIlgxMS5Ub28gbWFueSBwaXhlbCBtb2Rlc1xuIiApOworICAgICAgCisgICAgcGl4ZWxfbW9kZXNbIG51bV9waXhlbF9tb2RlcyBdID0gcGl4ZWxfbW9kZTsKKyAgICBwaXhlbF9kZXB0aFsgbnVtX3BpeGVsX21vZGVzIF0gPSBkZXB0aDsKKyAgICAKKyAgICBudW1fcGl4ZWxfbW9kZXMrKzsKKyAgfQorCisKKyNkZWZpbmUgTE9DSyh4KSAgICBEb3NSZXF1ZXN0TXV0ZXhTZW0oIHgsIFNFTV9JTkRFRklOSVRFX1dBSVQgKTsKKyNkZWZpbmUgVU5MT0NLKHgpICBEb3NSZWxlYXNlTXV0ZXhTZW0oIHggKQorCisKKyAgc3RhdGljCisgIGNvbnN0IGludCAgcGl4ZWxfbW9kZV9iaXRfY291bnRbXSA9CisgIHsKKyAgICAwLAorICAgIDEsICAgLyogbW9ubyAgKi8KKyAgICA0LCAgIC8qIHBhbDQgICovCisgICAgOCwgICAvKiBwYWw4ICAqLworCTgsICAgLyogZ3JheXMgKi8KKyAgICAxNSwgIC8qIHJnYjE1ICovCisgICAgMTYsICAvKiByZ2IxNiAqLworICAgIDI0LCAgLyogcmdiMjQgKi8KKyAgICAzMiAgIC8qIHJnYjMyICovCisgIH07CisKKworIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKgorICAqIFRlY2huaWNhbCBub3RlIDogaG93IHRoZSBPUy8yIFByZXNudGF0aW9uIE1hbmFnZXIgZHJpdmVyIHdvcmtzCisgICoKKyAgKiBQTSBpcywgaW4gbXkgb3BpbmlvbiwgYSBibG9hdGVkIGFuZCBvdmVyLWVuZ2luZWVyZWQgZ3JhcGhpY3MKKyAgKiBzdWItc3lzdGVtLCBldmVuIHRob3VnaCBpdCBoYXMgbG90cyBvZiBuaWNlIGZlYXR1cmVzLiBIZXJlIGFyZQorICAqIGEgZmV3IHRpZGJpdHMgYWJvdXQgaXQgOgorICAqCisgICoKKyAgKiAtIHVuZGVyIFBNLCBhICJiaXRtYXAiIGlzIGEgZGV2aWNlLXNwZWNpZmljIG9iamVjdCB3aG9zZSBiaXRzIGFyZQorICAqICAgbm90IGRpcmVjdGx5IGFjY2Vzc2libGUgdG8gdGhlIGNsaWVudCBhcHBsaWNhdGlvbi4gVGhpcyBtZWFucworICAqICAgdGhhdCB3ZSBtdXN0IHVzZSBhIHNjaGVtZSBsaWtlIHRoZSBmb2xsb3dpbmcgdG8gZGlzcGxheSBvdXIKKyAgKiAgIHN1cmZhY2VzIDoKKyAgKgorICAqICAgICAtIGhvbGQsIGZvciBlYWNoIHN1cmZhY2UsIGl0cyBvd24gYml0bWFwIGJ1ZmZlciB3aGVyZSB0aGUKKyAgKiAgICAgICByZXN0IG9mIE1pR1Mgd3JpdGVzIGRpcmVjdGx5LgorICAqCisgICogICAgIC0gY3JlYXRlIGEgUE0gYml0bWFwIG9iamVjdCB3aXRoIHRoZSBzYW1lIGRpbWVuc2lvbnMgKGFuZAorICAqICAgICAgIHBvc3NpYmx5IGZvcm1hdCkuCisgICoKKyAgKiAgICAgLSBjb3B5IHRoZSBjb250ZW50IG9mIGVhY2ggdXBkYXRlZCByZWN0YW5nbGUgaW50byB0aGUKKyAgKiAgICAgICBQTSBiaXRtYXAgd2l0aCB0aGUgZnVuY3Rpb24gJ0dwaVNldEJpdG1hcEJpdHMnLgorICAqCisgICogICAgIC0gZmluYWxseSwgImJsaXQiIHRoZSBQTSBiaXRtYXAgdG8gdGhlIHNjcmVlbiBjYWxsaW5nCisgICogICAgICAgJ0dwaUJsaXRCbHQnCisgICoKKyAgKiAtIGJ1dCB0aGVyZSBpcyBtb3JlIDogeW91IGNhbm5vdCBkaXJlY3RseSBibGl0IGEgUE0gYml0bWFwIHRvIHRoZQorICAqICAgc2NyZWVuIHdpdGggUE0uIFRoZSAnR3BpQmxpdEJsdCcgb25seSB3b3JrcyB3aXRoIHByZXNlbnRhdGlvbgorICAqICAgc3BhY2VzLiBUaGlzIG1lYW5zIHRoYXQgd2UgYWxzbyBuZWVkIHRvIGNyZWF0ZSwgZm9yIGVhY2ggc3VyZmFjZSA6CisgICoKKyAgKiAgICAgLSBhIG1lbW9yeSBwcmVzZW50YXRpb24gc3BhY2UsIHVzZWQgdG8gaG9sZCB0aGUgUE0gYml0bWFwCisgICogICAgIC0gYSAibWVtb3J5IGRldmljZSBjb250ZXh0IiBmb3IgdGhlIHByZXNlbnRhdGlvbiBzcGFjZQorICAqCisgICogICBUaGUgYmxpdCBpcyB0aGVuIHBlcmZvcm1lZCBmcm9tIHRoZSBtZW1vcnkgcHJlc2VudGF0aW9uIHNwYWNlCisgICogICB0byB0aGUgc2NyZWVuJ3MgcHJlc2VudGF0aW9uIHNwYWNlLi4KKyAgKgorICAqCisgICogLSBiZWNhdXNlIGVhY2ggc3VyZmFjZSBjcmVhdGVzIGl0cyBvd24gZXZlbnQtaGFuZGxpbmcgdGhyZWFkLAorICAqICAgd2UgbXVzdCBwcm90ZWN0IHRoZSBzdXJmYWNlJ3MgcHJlc2VudGF0aW9uIHNwYWNlIGZyb20gY29uY3VycmVudAorICAqICAgYWNjZXNzZXMgKGkuZS4gY2FsbHMgdG8gJ0dwaVNldEJpdG1hcEJpdHMnIHdoZW4gZHJhd2luZyB0byB0aGUKKyAgKiAgIHN1cmZhY2UsIGFuZCBjYWxscyB0byAnR3BpQmxpdEJsdCcgd2hlbiBkcmF3aW5nIGl0IG9uIHRoZSBzY3JlZW4KKyAgKiAgIGFyZSBwZXJmb3JtZWQgaW4gdHdvIGRpZmZlcmVudCB0aHJlYWRzKS4KKyAgKgorICAqICAgd2UgdXNlIGEgc2ltcGxlIG11dGV4IHRvIGRvIHRoaXMuCisgICoKKyAgKgorICAqIC0gd2UgYWxzbyB1c2UgYSBzZW1hcGhvcmUgdG8gcGVyZm9ybSBhIHJlbmRlei12b3VzIGJldHdlZW4gdGhlCisgICogICBtYWluIGFuZCBldmVudC1oYW5kbGluZyB0aHJlYWRzIChuZWVkZWQgaW4gImxpc3Rlbl9ldmVudCIpLgorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICBzdGF0aWMKKyAgdm9pZCAgUnVuUE1XaW5kb3coIGdyUE1TdXJmYWNlKiAgc3VyZmFjZSApOworCisKKworCisgIHN0YXRpYworICB2b2lkICBjb252ZXJ0X2dyYXlfdG9fcGFsOCggZ3JQTVN1cmZhY2UqIHN1cmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgIHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgaCApCisgIHsKKyAgICBnckJpdG1hcCogIHRhcmdldCAgPSAmc3VyZmFjZS0+aW1hZ2U7CisgICAgZ3JCaXRtYXAqICBzb3VyY2UgID0gJnN1cmZhY2UtPnJvb3QuYml0bWFwOworICAgIGJ5dGUqICAgICAgd3JpdGUgICA9IChieXRlKil0YXJnZXQtPmJ1ZmZlciArIHkqdGFyZ2V0LT5waXRjaCArIHg7CisgICAgYnl0ZSogICAgICByZWFkICAgID0gKGJ5dGUqKXNvdXJjZS0+YnVmZmVyICsgeSpzb3VyY2UtPnBpdGNoICsgeDsKKyAgICBsb25nKiAgICAgIHBhbGV0dGUgPSBzdXJmYWNlLT5zaGFkZXM7CisgICAgCisgICAgd2hpbGUgKGggPiAwKQorICAgIHsKKyAgICAgIGJ5dGUqICBfd3JpdGUgPSB3cml0ZTsKKyAgICAgIGJ5dGUqICBfcmVhZCAgPSByZWFkOworICAgICAgYnl0ZSogIGxpbWl0ICA9IF93cml0ZSArIHc7CisgICAgICAKKyAgICAgIGZvciAoIDsgX3dyaXRlIDwgbGltaXQ7IF93cml0ZSsrLCBfcmVhZCsrICkKKyAgICAgICAgKl93cml0ZSA9IChieXRlKSBwYWxldHRlWyAqX3JlYWQgXTsKKworICAgICAgd3JpdGUgKz0gdGFyZ2V0LT5waXRjaDsKKyAgICAgIHJlYWQgICs9IHNvdXJjZS0+cGl0Y2g7CisgICAgICBoLS07CisgICAgfQorICB9CisKKworICBzdGF0aWMKKyAgdm9pZCAgY29udmVydF9ncmF5X3RvXzE2KCBnclBNU3VyZmFjZSogc3VyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgaCApCisgIHsKKyAgICBnckJpdG1hcCogIHRhcmdldCAgPSAmc3VyZmFjZS0+aW1hZ2U7CisgICAgZ3JCaXRtYXAqICBzb3VyY2UgID0gJnN1cmZhY2UtPnJvb3QuYml0bWFwOworICAgIGJ5dGUqICAgICAgd3JpdGUgICA9IChieXRlKil0YXJnZXQtPmJ1ZmZlciArIHkqdGFyZ2V0LT5waXRjaCArIDIqeDsKKyAgICBieXRlKiAgICAgIHJlYWQgICAgPSAoYnl0ZSopc291cmNlLT5idWZmZXIgKyB5KnNvdXJjZS0+cGl0Y2ggKyB4OworICAgIGxvbmcqICAgICAgICAgICBwYWxldHRlID0gc3VyZmFjZS0+c2hhZGVzOworICAgIAorICAgIHdoaWxlIChoID4gMCkKKyAgICB7CisgICAgICBieXRlKiAgX3dyaXRlID0gd3JpdGU7CisgICAgICBieXRlKiAgX3JlYWQgID0gcmVhZDsKKyAgICAgIGJ5dGUqICBsaW1pdCAgPSBfd3JpdGUgKyAyKnc7CisgICAgICAKKyAgICAgIGZvciAoIDsgX3dyaXRlIDwgbGltaXQ7IF93cml0ZSArPSAyLCBfcmVhZCsrICkKKyAgICAgICAgKihzaG9ydCopX3dyaXRlID0gKHNob3J0KXBhbGV0dGVbICpfcmVhZCBdOworCisgICAgICB3cml0ZSArPSB0YXJnZXQtPnBpdGNoOworICAgICAgcmVhZCAgKz0gc291cmNlLT5waXRjaDsKKyAgICAgIGgtLTsKKyAgICB9CisgIH0KKworCisgIHN0YXRpYworICB2b2lkICBjb252ZXJ0X2dyYXlfdG9fMjQoIGdyUE1TdXJmYWNlKiBzdXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICB3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICBoICkKKyAgeworICAgIGdyQml0bWFwKiAgdGFyZ2V0ICA9ICZzdXJmYWNlLT5pbWFnZTsKKyAgICBnckJpdG1hcCogIHNvdXJjZSAgPSAmc3VyZmFjZS0+cm9vdC5iaXRtYXA7CisgICAgYnl0ZSogICAgICB3cml0ZSAgID0gKGJ5dGUqKXRhcmdldC0+YnVmZmVyICsgeSp0YXJnZXQtPnBpdGNoICsgMyp4OworICAgIGJ5dGUqICAgICAgcmVhZCAgICA9IChieXRlKilzb3VyY2UtPmJ1ZmZlciArIHkqc291cmNlLT5waXRjaCArIHg7CisgICAgCisgICAgd2hpbGUgKGggPiAwKQorICAgIHsKKyAgICAgIGJ5dGUqICBfd3JpdGUgPSB3cml0ZTsKKyAgICAgIGJ5dGUqICBfcmVhZCAgPSByZWFkOworICAgICAgYnl0ZSogIGxpbWl0ICA9IF93cml0ZSArIDMqdzsKKyAgICAgIAorICAgICAgZm9yICggOyBfd3JpdGUgPCBsaW1pdDsgX3dyaXRlICs9IDMsIF9yZWFkKysgKQorICAgICAgeworICAgICAgICBieXRlICBjb2xvciA9ICpfcmVhZDsKKyAgICAgICAgCisgICAgICAgIF93cml0ZVswXSA9CisgICAgICAgIF93cml0ZVsxXSA9CisgICAgICAgIF93cml0ZVsyXSA9IGNvbG9yOworICAgICAgfQorCisgICAgICB3cml0ZSArPSB0YXJnZXQtPnBpdGNoOworICAgICAgcmVhZCAgKz0gc291cmNlLT5waXRjaDsKKyAgICAgIGgtLTsKKyAgICB9CisgIH0KKworCisgIHN0YXRpYworICB2b2lkICBjb252ZXJ0X2dyYXlfdG9fMzIoIGdyUE1TdXJmYWNlKiBzdXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICB3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICBoICkKKyAgeworICAgIGdyQml0bWFwKiAgdGFyZ2V0ICA9ICZzdXJmYWNlLT5pbWFnZTsKKyAgICBnckJpdG1hcCogIHNvdXJjZSAgPSAmc3VyZmFjZS0+cm9vdC5iaXRtYXA7CisgICAgYnl0ZSogICAgICB3cml0ZSAgID0gKGJ5dGUqKXRhcmdldC0+YnVmZmVyICsgeSp0YXJnZXQtPnBpdGNoICsgNCp4OworICAgIGJ5dGUqICAgICAgcmVhZCAgICA9IChieXRlKilzb3VyY2UtPmJ1ZmZlciArIHkqc291cmNlLT5waXRjaCArIHg7CisgICAgCisgICAgd2hpbGUgKGggPiAwKQorICAgIHsKKyAgICAgIGJ5dGUqICBfd3JpdGUgPSB3cml0ZTsKKyAgICAgIGJ5dGUqICBfcmVhZCAgPSByZWFkOworICAgICAgYnl0ZSogIGxpbWl0ICA9IF93cml0ZSArIDQqdzsKKyAgICAgIAorICAgICAgZm9yICggOyBfd3JpdGUgPCBsaW1pdDsgX3dyaXRlICs9IDQsIF9yZWFkKysgKQorICAgICAgeworICAgICAgICBieXRlICBjb2xvciA9ICpfcmVhZDsKKyAgICAgICAgCisgICAgICAgIF93cml0ZVswXSA9CisgICAgICAgIF93cml0ZVsxXSA9CisgICAgICAgIF93cml0ZVsyXSA9CisgICAgICAgIF93cml0ZVszXSA9IGNvbG9yOworICAgICAgfQorCisgICAgICB3cml0ZSArPSB0YXJnZXQtPnBpdGNoOworICAgICAgcmVhZCAgKz0gc291cmNlLT5waXRjaDsKKyAgICAgIGgtLTsKKyAgICB9CisgIH0KKworCisgIHN0YXRpYworICB2b2lkICBjb252ZXJ0X3JlY3RhbmdsZSggZ3JQTVN1cmZhY2UqIHN1cmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgIHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgaCApCisgIHsKKyAgICBpbnQgIHo7CisgICAgCisgICAgLyogZmlyc3Qgb2YgYWxsLCBjbGlwIHRvIHRoZSBzdXJmYWNlJ3MgYXJlYSAqLworICAgIGlmICggeCAgID49IHN1cmZhY2UtPmltYWdlLndpZHRoIHx8CisgICAgICAgICB4K3cgPD0gMCAgICAgICAgICAgICAgICAgICAgfHwKKyAgICAgICAgIHkgICA+PSBzdXJmYWNlLT5pbWFnZS5yb3dzICB8fAorICAgICAgICAgeStoIDw9IDAgKQorICAgICAgcmV0dXJuOworIAorICAgIGlmICggeCA8IDAgKQorICAgIHsKKyAgICAgIHcgKz0geDsKKyAgICAgIHggID0gMDsKKyAgICB9CisgCisgICAgeiA9ICh4ICsgdykgLSBzdXJmYWNlLT5pbWFnZS53aWR0aDsKKyAgICBpZiAoeiA+IDApCisgICAgICB3IC09IHo7CisgICAgICAKKyAgICB6ID0gKHkgKyBoKSAtIHN1cmZhY2UtPmltYWdlLnJvd3M7CisgICAgaWYgKHogPiAwKQorICAgICAgaCAtPSB6OworICAgICAgCisgICAgLyogY29udmVydCB0aGUgcmVjdGFuZ2xlIHRvIHRoZSB0YXJnZXQgZGVwdGggZm9yIGdyYXkgc3VyZmFjZXMgKi8KKyAgICBpZiAoc3VyZmFjZS0+cm9vdC5iaXRtYXAubW9kZSA9PSBncl9waXhlbF9tb2RlX2dyYXkpCisgICAgeworICAgICAgc3dpdGNoIChzdXJmYWNlLT5pbWFnZS5tb2RlKQorICAgICAgeworICAgICAgICBjYXNlIGdyX3BpeGVsX21vZGVfcGFsOCAgOgorICAgICAgICAgIGNvbnZlcnRfZ3JheV90b19wYWw4KCBzdXJmYWNlLCB4LCB5LCB3LCBoICk7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBncl9waXhlbF9tb2RlX3JnYjU1NToKKyAgICAgICAgY2FzZSBncl9waXhlbF9tb2RlX3JnYjU2NToKKyAgICAgICAgICBjb252ZXJ0X2dyYXlfdG9fMTYgICggc3VyZmFjZSwgeCwgeSwgdywgaCApOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgZ3JfcGl4ZWxfbW9kZV9yZ2IyNDoKKyAgICAgICAgICBjb252ZXJ0X2dyYXlfdG9fMjQgICggc3VyZmFjZSwgeCwgeSwgdywgaCApOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgZ3JfcGl4ZWxfbW9kZV9yZ2IzMjoKKyAgICAgICAgICBjb252ZXJ0X2dyYXlfdG9fMzIgICggc3VyZmFjZSwgeCwgeSwgdywgaCApOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgOworICAgICAgfQorICAgIH0KKyAgfSAKKworCisgIHN0YXRpYworICB2b2lkICByZWZyZXNoX3JlY3RhbmdsZSggZ3JQTVN1cmZhY2UqIHN1cmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgIHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgaCApCisgIHsKKyAgICBjb252ZXJ0X3JlY3RhbmdsZSggc3VyZmFjZSwgeCwgeSwgdywgaCApOworCisgICAgV2luSW52YWxpZGF0ZVJlY3QoIHN1cmZhY2UtPmNsaWVudF93aW5kb3csIE5VTEwsIEZBTFNFICk7CisgICAgV2luVXBkYXRlV2luZG93KCBzdXJmYWNlLT5mcmFtZV93aW5kb3cgKTsKKyAgfQorCisgIAorICBzdGF0aWMKKyAgdm9pZCAgc2V0X3RpdGxlKCBnclBNU3VyZmFjZSogc3VyZmFjZSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgdGl0bGUgKQorICB7CisgICAgV2luU2V0V2luZG93VGV4dCggc3VyZmFjZS0+dGl0bGVfd2luZG93LCAoUFNaKXRpdGxlICk7CisgIH0KKworCisKKyAgc3RhdGljICAKKyAgdm9pZCAgbGlzdGVuX2V2ZW50KCBnclBNU3VyZmFjZSogc3VyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgZXZlbnRfbWFzaywKKyAgICAgICAgICAgICAgICAgICAgICBnckV2ZW50KiAgICAgZ3JldmVudCApCisgIHsKKyAgICBVTE9ORyAgdWxSZXF1ZXN0Q291bnQ7CisKKyAgICAodm9pZCkgZXZlbnRfbWFzazsgICAvKiBpZ25vcmVkIGZvciBub3cgKi8KKworICAgIC8qIHRoZSBsaXN0ZW5fZXZlbnQgZnVuY3Rpb24gYmxvY2tzIHVudGlsIHRoZXJlIGlzIGFuIGV2ZW50IHRvIHByb2Nlc3MgKi8KKyAgICBEb3NXYWl0RXZlbnRTZW0oIHN1cmZhY2UtPmV2ZW50X2xvY2ssIFNFTV9JTkRFRklOSVRFX1dBSVQgKTsKKyAgICBEb3NRdWVyeUV2ZW50U2VtKCBzdXJmYWNlLT5ldmVudF9sb2NrLCAmdWxSZXF1ZXN0Q291bnQgKTsKKyAgICAqZ3JldmVudCA9IHN1cmZhY2UtPmV2ZW50OworICAgIERvc1Jlc2V0RXZlbnRTZW0oIHN1cmZhY2UtPmV2ZW50X2xvY2ssICZ1bFJlcXVlc3RDb3VudCApOworCisgICAgcmV0dXJuOworICB9CisKKworICBzdGF0aWMKKyAgZ3JQTVN1cmZhY2UqICBpbml0X3N1cmZhY2UoIGdyUE1TdXJmYWNlKiAgc3VyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyQml0bWFwKiAgICAgYml0bWFwICkKKyAgeworICAgIFBCSVRNQVBJTkZPMiAgYml0OworICAgIFNJWkVMICAgICAgICAgc2l6bCA9IHsgMCwgMCB9OworICAgIExPTkcgICAgICAgICAgcGFsZXR0ZVsyNTZdOworCisgICAgLyogY3JlYXRlIHRoZSBiaXRtYXAgLSB1bmRlciBPUy8yLCB3ZSBzdXBwb3J0IGFsbCBtb2RlcyBhcyBQTSAqLworICAgIC8qIGhhbmRsZXMgYWxsIGNvbnZlcnNpb25zIGF1dG9tYXRpY2FsbHkuLiAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBpZiAoIGdyTmV3Qml0bWFwKCBiaXRtYXAtPm1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgYml0bWFwLT5ncmF5cywKKwkJCQkJICBiaXRtYXAtPndpZHRoLAorCQkJCQkgIGJpdG1hcC0+cm93cywKKyAgICAgICAgICAgICAgICAgICAgICBiaXRtYXAgKSApCisgICAgICByZXR1cm4gMDsKKworICAgIHN1cmZhY2UtPnJvb3QuYml0bWFwID0gKmJpdG1hcDsKKworICAgIC8qIGNyZWF0ZSB0aGUgaW1hZ2UgYW5kIGV2ZW50IGxvY2sgKi8KKyAgICBEb3NDcmVhdGVFdmVudFNlbSggTlVMTCwgJnN1cmZhY2UtPmV2ZW50X2xvY2ssIDAsIFRSVUUgICk7CisgICAgRG9zQ3JlYXRlTXV0ZXhTZW0oIE5VTEwsICZzdXJmYWNlLT5pbWFnZV9sb2NrLCAwLCBGQUxTRSApOworCisgICAgLyogY3JlYXRlIHRoZSBpbWFnZSdzIHByZXNlbnRhdGlvbiBzcGFjZSAqLworICAgIHN1cmZhY2UtPmltYWdlX2RjID0gRGV2T3BlbkRDKCBncl9hbmNob3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9EX01FTU9SWSwgKFBTWikiKiIsIDBMLCAwTCwgMEwgKTsKKworICAgIHN1cmZhY2UtPmltYWdlX3BzID0gR3BpQ3JlYXRlUFMoIGdyX2FuY2hvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXJmYWNlLT5pbWFnZV9kYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2l6bCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQVV9QRUxTICAgIHwgR1BJVF9NSUNSTyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BJQV9BU1NPQyB8IEdQSUZfREVGQVVMVCApOworCisgICAgR3BpU2V0QmFja01peCggc3VyZmFjZS0+aW1hZ2VfcHMsIEJNX09WRVJQQUlOVCApOworCisgICAgLyogY3JlYXRlIHRoZSBpbWFnZSdzIFBNIGJpdG1hcCAqLworICAgIGJpdCA9IChQQklUTUFQSU5GTzIpZ3JBbGxvYyggc2l6ZW9mKEJJVE1BUElORk8yKSArIDI1NipzaXplb2YoUkdCMikgKTsKKyAgICBzdXJmYWNlLT5iaXRtYXBfaGVhZGVyID0gYml0OworCisgICAgYml0LT5jYkZpeCAgID0gc2l6ZW9mKCBCSVRNQVBJTkZPSEVBREVSMiApOworICAgIGJpdC0+Y3ggICAgICA9IHN1cmZhY2UtPnJvb3QuYml0bWFwLndpZHRoOworICAgIGJpdC0+Y3kgICAgICA9IHN1cmZhY2UtPnJvb3QuYml0bWFwLnJvd3M7CisgICAgYml0LT5jUGxhbmVzID0gMTsKKworICAgIGJpdC0+YXJnYkNvbG9yWzBdLmJCbHVlICA9IDA7CisgICAgYml0LT5hcmdiQ29sb3JbMF0uYkdyZWVuID0gMDsKKyAgICBiaXQtPmFyZ2JDb2xvclswXS5iUmVkICAgPSAwOworCisgICAgYml0LT5hcmdiQ29sb3JbMV0uYkJsdWUgID0gMjU1OworICAgIGJpdC0+YXJnYkNvbG9yWzFdLmJHcmVlbiA9IDI1NTsKKyAgICBiaXQtPmFyZ2JDb2xvclsxXS5iUmVkICAgPSAyNTU7CisKKyAgICBiaXQtPmNCaXRDb3VudCA9IHBpeGVsX21vZGVfYml0X2NvdW50WyBzdXJmYWNlLT5yb290LmJpdG1hcC5tb2RlIF07CisKKyAgICBzdXJmYWNlLT5vczJfYml0bWFwID0gR3BpQ3JlYXRlQml0bWFwKCBzdXJmYWNlLT5pbWFnZV9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUEJJVE1BUElORk9IRUFERVIyKWJpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwTCwgTlVMTCwgTlVMTCApOworCisgICAgR3BpU2V0Qml0bWFwKCBzdXJmYWNlLT5pbWFnZV9wcywgc3VyZmFjZS0+b3MyX2JpdG1hcCApOworCisgICAgYml0LT5jYkZpeCA9IHNpemVvZiggQklUTUFQSU5GT0hFQURFUjIgKTsKKyAgICBHcGlRdWVyeUJpdG1hcEluZm9IZWFkZXIoIHN1cmZhY2UtPm9zMl9iaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUEJJVE1BUElORk9IRUFERVIyKWJpdCApOworCisgICAgLyogZm9yIGdyX3BpeGVsX21vZGVfZ3JheSwgY3JlYXRlIGEgZ3JheS1sZXZlbHMgbG9naWNhbCBwYWxldHRlICovCisgICAgaWYgKCBiaXRtYXAtPm1vZGUgPT0gZ3JfcGl4ZWxfbW9kZV9ncmF5ICkKKyAgICB7CisgICAgICBpbnQgICAgIHgsIGNvdW50OworCisgICAgICBjb3VudCA9IGJpdG1hcC0+Z3JheXM7CisgICAgICBmb3IgKCB4ID0gMDsgeCA8IGNvdW50OyB4KysgKQorICAgICAgICBwYWxldHRlW3hdID0gKCgoY291bnQteCkqMjU1KS9jb3VudCkgKiAweDAxMDEwMTsKKworICAgICAgLyogY3JlYXRlIGxvZ2ljYWwgY29sb3IgdGFibGUgKi8KKyAgICAgIEdwaUNyZWF0ZUxvZ0NvbG9yVGFibGUoIHN1cmZhY2UtPmltYWdlX3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFVMT05HKSBMQ09MX1BVUkVDT0xPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMT05HKSAgTENPTEZfQ09OU0VDUkdCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExPTkcpICAwTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMT05HKSAgY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUExPTkcpIHBhbGV0dGUgKTsKKworICAgICAgLyogbm93LCBjb3B5IHRoZSBjb2xvciBpbmRleGVzIHRvIHN1cmZhY2UtPnNoYWRlcyAqLworICAgICAgZm9yICggeCA9IDA7IHggPCBjb3VudDsgeCsrICkKKyAgICAgICAgc3VyZmFjZS0+c2hhZGVzW3hdID0gR3BpUXVlcnlDb2xvckluZGV4KCBzdXJmYWNlLT5pbWFnZV9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBwYWxldHRlW3hdICk7CisgICAgfQorCisgICAgLyogc2V0IHVwIHRoZSBibGl0IHBvaW50cyBhcnJheSAqLworICAgIHN1cmZhY2UtPmJsaXRfcG9pbnRzWzFdLnggPSBzdXJmYWNlLT5yb290LmJpdG1hcC53aWR0aDsKKyAgICBzdXJmYWNlLT5ibGl0X3BvaW50c1sxXS55ID0gc3VyZmFjZS0+cm9vdC5iaXRtYXAucm93czsKKyAgICBzdXJmYWNlLT5ibGl0X3BvaW50c1szXSAgID0gc3VyZmFjZS0+YmxpdF9wb2ludHNbMV07CisKKyAgICAvKiBGaW5hbGx5LCBjcmVhdGUgdGhlIGV2ZW50IGhhbmRsaW5nIHRocmVhZCBmb3IgdGhlIHN1cmZhY2UncyB3aW5kb3cgKi8KKyAgICBEb3NDcmVhdGVUaHJlYWQoICZzdXJmYWNlLT5tZXNzYWdlX3RocmVhZCwKKyAgICAgICAgICAgICAgICAgICAgIChQRk5USFJFQUQpIFJ1blBNV2luZG93LAorICAgICAgICAgICAgICAgICAgICAgKFVMT05HKSAgICAgc3VyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgIDBVTCwKKyAgICAgICAgICAgICAgICAgICAgIDMyOTIwICk7CisKKyAgICBzdXJmYWNlLT5yb290LmRvbmUgICAgICAgICA9IChnckRvbmVTdXJmYWNlRnVuYykgZG9uZV9zdXJmYWNlOworICAgIHN1cmZhY2UtPnJvb3QucmVmcmVzaF9yZWN0ID0gKGdyUmVmcmVzaFJlY3RGdW5jKSByZWZyZXNoX3JlY3RhbmdsZTsKKyAgICBzdXJmYWNlLT5yb290LnNldF90aXRsZSAgICA9IChnclNldFRpdGxlRnVuYykgICAgc2V0X3RpdGxlOworICAgIHN1cmZhY2UtPnJvb3QubGlzdGVuX2V2ZW50ID0gKGdyTGlzdGVuRXZlbnRGdW5jKSBsaXN0ZW5fZXZlbnQ7CisgICAgCisgICAgY29udmVydF9yZWN0YW5nbGUoIHN1cmZhY2UsIDAsIDAsIGJpdG1hcC0+d2lkdGgsIGJpdG1hcC0+cm93cyApOworICAgIHJldHVybiBzdXJmYWNlOworICB9CisKKworCisgIE1SRVNVTFQgRVhQRU5UUlkgIE1lc3NhZ2VfUHJvY2VzcyggSFdORCAgICBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUxPTkcgICBtZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QQVJBTSAgcGFybTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBBUkFNICBwYXJtMiApOworCisKKyAgc3RhdGljCisgIHZvaWQgIFJ1blBNV2luZG93KCBnclBNU3VyZmFjZSogIHN1cmZhY2UgKQorICB7CisgICAgdW5zaWduZWQgY2hhciAgIGNsYXNzX25hbWVbXSA9ICJEaXNwbGF5Q2xhc3MiOworICAgICAgICAgICAgIFVMT05HICBjbGFzc19mbGFnczsKKworICAgIHN0YXRpYyAgIEhNUSAgICBxdWV1ZTsKKyAgICAgICAgICAgICBRTVNHICAgbWVzc2FnZTsKKworICAgIC8qIGNyZWF0ZSBhbiBhbmNob3IgdG8gYWxsb3cgdGhpcyB0aHJlYWQgdG8gdXNlIFBNICovCisgICAgc3VyZmFjZS0+YW5jaG9yID0gV2luSW5pdGlhbGl6ZSgwKTsKKyAgICBpZiAoIXN1cmZhY2UtPmFuY2hvcikKKyAgICB7CisgICAgICBwcmludGYoICJFcnJvciBkb2luZyBXaW5Jbml0aWFsaXplKClcbiIgKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKiBjcmVhdGUgYSBtZXNzYWdlIHF1ZXVlICovCisgICAgcXVldWUgPSBXaW5DcmVhdGVNc2dRdWV1ZSggc3VyZmFjZS0+YW5jaG9yLCAwICk7CisgICAgaWYgKCFxdWV1ZSkKKyAgICB7CisgICAgICBwcmludGYoICJFcnJvciBkb2luZyA+aW5DcmVhdGVNc2dRdWV1ZSgpXG4iICk7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyogcmVnaXN0ZXIgdGhlIHdpbmRvdyBjbGFzcyAqLworICAgIGlmICggIVdpblJlZ2lzdGVyQ2xhc3MoIHN1cmZhY2UtPmFuY2hvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUFNaKSAgIGNsYXNzX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFBGTldQKSBNZXNzYWdlX1Byb2Nlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1NfU0laRVJFRFJBVywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICkgKQorICAgIHsKKyAgICAgIHByaW50ZiggIkVycm9yIGRvaW5nIFdpblJlZ2lzdGVyQ2xhc3MoKVxuIiApOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qIGNyZWF0ZSB0aGUgUE0gd2luZG93ICovCisgICAgY2xhc3NfZmxhZ3MgPSBGQ0ZfVElUTEVCQVIgfCBGQ0ZfTUlOQlVUVE9OIHwgRkNGX0RMR0JPUkRFUiB8IAorICAgICAgICAgICAgICAgICAgRkNGX1RBU0tMSVNUIHwgRkNGX1NZU01FTlU7IAorCisgICAgc3VyZmFjZS0+ZnJhbWVfd2luZG93ID0gV2luQ3JlYXRlU3RkV2luZG93KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIV05EX0RFU0tUT1AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdTX1ZJU0lCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjbGFzc19mbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFBTWikgY2xhc3NfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFBTWikgIkZyZWVUeXBlIFBNIEdyYXBoaWNzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1NfVklTSUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN1cmZhY2UtPmNsaWVudF93aW5kb3cgKTsKKyAgICBpZiAoIXN1cmZhY2UtPmZyYW1lX3dpbmRvdykKKyAgICB7CisgICAgICBwcmludGYoICJFcnJvciBkb2luZyBXaW5DcmVhdGVTdGRXaW5kb3coKVxuIiApOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qIGZpbmQgdGhlIHRpdGxlIHdpbmRvdyBoYW5kbGUgKi8KKyAgICBzdXJmYWNlLT50aXRsZV93aW5kb3cgPSBXaW5XaW5kb3dGcm9tSUQoIHN1cmZhY2UtPmZyYW1lX3dpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJRF9USVRMRUJBUiApOworCisgICAgLyogc2V0IFdpbmRvdyBzaXplIGFuZCBwb3NpdGlvbiAqLworICAgIFdpblNldFdpbmRvd1Bvcyggc3VyZmFjZS0+ZnJhbWVfd2luZG93LAorICAgICAgICAgICAgICAgICAgICAgMEwsCisgICAgICAgICAgICAgICAgICAgICAoU0hPUlQpIDYwLAorICAgICAgICAgICAgICAgICAgICAgKFNIT1JUKSBXaW5RdWVyeVN5c1ZhbHVlKCBIV05EX0RFU0tUT1AsIFNWX0NZU0NSRUVOICkgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXJmYWNlLT5yb290LmJpdG1hcC5yb3dzICsgMTAwLAorCisgICAgICAgICAgICAgICAgICAgICAoU0hPUlQpIFdpblF1ZXJ5U3lzVmFsdWUoIEhXTkRfREVTS1RPUCwgU1ZfQ1lETEdGUkFNRSApKjIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXJmYWNlLT5yb290LmJpdG1hcC53aWR0aCwKKworICAgICAgICAgICAgICAgICAgICAgKFNIT1JUKSBXaW5RdWVyeVN5c1ZhbHVlKCBIV05EX0RFU0tUT1AsIFNWX0NZVElUTEVCQVIgKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpblF1ZXJ5U3lzVmFsdWUoIEhXTkRfREVTS1RPUCwgU1ZfQ1lETEdGUkFNRSApKjIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXJmYWNlLT5yb290LmJpdG1hcC5yb3dzLAorCisgICAgICAgICAgICAgICAgICAgICBTV1BfU0laRSB8IFNXUF9NT1ZFICk7CisKKyAgICAvKiBzYXZlIHRoZSBoYW5kbGUgdG8gdGhlIGN1cnJlbnQgc3VyZmFjZSB3aXRoaW4gdGhlIHdpbmRvdyB3b3JkcyAqLworICAgIFdpblNldFdpbmRvd1B0ciggc3VyZmFjZS0+ZnJhbWVfd2luZG93LFFXTF9VU0VSLCBzdXJmYWNlICk7CisKKyAgICAvKiBydW4gdGhlIG1lc3NhZ2UgcXVldWUgdGlsbCB0aGUgZW5kICovCisgICAgd2hpbGUgKCBXaW5HZXRNc2coIHN1cmZhY2UtPmFuY2hvciwgJm1lc3NhZ2UsIChIV05EKU5VTEwsIDAsIDAgKSApCisgICAgICBXaW5EaXNwYXRjaE1zZyggc3VyZmFjZS0+YW5jaG9yLCAmbWVzc2FnZSApOworCisgICAgLyogY2xlYW4tdXAgKi8KKyAgICBXaW5EZXN0cm95V2luZG93KCBzdXJmYWNlLT5mcmFtZV93aW5kb3cgKTsKKyAgICBzdXJmYWNlLT5mcmFtZV93aW5kb3cgPSAwOworCisgICAgV2luRGVzdHJveU1zZ1F1ZXVlKCBxdWV1ZSApOworICAgIFdpblRlcm1pbmF0ZSggc3VyZmFjZS0+YW5jaG9yICk7CisKKyAgICAvKiBhd2FpdCBkZWF0aC4uLiAqLworICAgIHdoaWxlICggMSApCisgICAgICBEb3NTbGVlcCggMTAwICk7CisgIH0KKworCisKKworICAvKiBNZXNzYWdlIHByb2Nlc3NpbmcgZm9yIG91ciBQTSBXaW5kb3cgY2xhc3MgKi8KKyAgTVJFU1VMVCBFWFBFTlRSWSAgTWVzc2FnZV9Qcm9jZXNzKCBIV05EICAgIGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTE9ORyAgIG1lc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBBUkFNICBwYXJtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUEFSQU0gIHBhcm0yICkKKyAgeworICAgICBzdGF0aWMgSERDICAgICBzY3JlZW5fZGM7CisgICAgIHN0YXRpYyBIUFMgICAgIHNjcmVlbl9wczsKKyAgICAgc3RhdGljIEJPT0wgICAgbWluaW1pemVkOworCisgICAgIFNJWkVMICAgc2l6bDsKKyAgICAgU1dQICAgICBzd3A7CisKKyAgICAgZ3JQTVN1cmZhY2UqICBzdXJmYWNlOworCisgICAgLyogZ2V0IHRoZSBoYW5kbGUgdG8gdGhlIHdpbmRvdydzIHN1cmZhY2UgKi8KKyAgICBzdXJmYWNlID0gKGdyUE1TdXJmYWNlKilXaW5RdWVyeVdpbmRvd1B0ciggaGFuZGxlLCBRV0xfVVNFUiApOworCisgICAgc3dpdGNoKCBtZXNzICkKKyAgICB7CisgICAgY2FzZSBXTV9ERVNUUk9ZOgorICAgICAgLyogd2FybiB0aGUgbWFpbiB0aHJlYWQgdG8gcXVpdCBpZiBpdCBkaWRuJ3Qga25vdyAqLworICAgICAgc3VyZmFjZS0+ZXZlbnQudHlwZSA9IGdyX2V2ZW50X2tleTsKKyAgICAgIHN1cmZhY2UtPmV2ZW50LmtleSAgPSBncktleUVzYzsKKyAgICAgIERvc1Bvc3RFdmVudFNlbSggc3VyZmFjZS0+ZXZlbnRfbG9jayApOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFdNX0NSRUFURToKKyAgICAgIC8qIHNldCBvcmlnaW5hbCBtYWduaWZpY2F0aW9uICovCisgICAgICBtaW5pbWl6ZWQgPSBGQUxTRTsKKworICAgICAgLyogY3JlYXRlIERldmljZSBDb250ZXh0IGFuZCBQcmVzZW50YXRpb24gU3BhY2UgZm9yIHNjcmVlbi4gKi8KKyAgICAgIHNjcmVlbl9kYyA9IFdpbk9wZW5XaW5kb3dEQyggaGFuZGxlICk7CisgICAgICBzY3JlZW5fcHMgPSBHcGlDcmVhdGVQUyggc3VyZmFjZS0+YW5jaG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmVlbl9kYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2l6bCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQVV9QRUxTIHwgR1BJVF9NSUNSTyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BJQV9BU1NPQyB8IEdQSUZfREVGQVVMVCApOworCisgICAgICAvKiB0YWtlIHRoZSBpbnB1dCBmb2N1cyAqLworICAgICAgV2luRm9jdXNDaGFuZ2UoIEhXTkRfREVTS1RPUCwgaGFuZGxlLCAwTCApOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFdNX01JTk1BWEZSQU1FOgorICAgICAgLyogdG8gdXBkYXRlIG1pbmltaXplZCBpZiBjaGFuZ2VkICovCisgICAgICBzd3AgPSAqKChQU1dQKSBwYXJtMSk7CisgICAgICBpZiAoIHN3cC5mbCAmIFNXUF9NSU5JTUlaRSApIAorICAgICAgICBtaW5pbWl6ZWQgPSBUUlVFOworICAgICAgaWYgKCBzd3AuZmwgJiBTV1BfUkVTVE9SRSApCisgICAgICAgIG1pbmltaXplZCA9IEZBTFNFOworICAgICAgcmV0dXJuIFdpbkRlZldpbmRvd1Byb2MoIGhhbmRsZSwgbWVzcywgcGFybTEsIHBhcm0yICk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgV01fRVJBU0VCQUNLR1JPVU5EOgorICAgIGNhc2UgV01fUEFJTlQ6ICAKKyAgICAgIC8qIGNvcHkgdGhlIG1lbW9yeSBpbWFnZSBvZiB0aGUgc2NyZWVuIG91dCB0byB0aGUgcmVhbCBzY3JlZW4gKi8KKyAgICAgIERvc1JlcXVlc3RNdXRleFNlbSggc3VyZmFjZS0+aW1hZ2VfbG9jaywgU0VNX0lOREVGSU5JVEVfV0FJVCApOworICAgICAgV2luQmVnaW5QYWludCggaGFuZGxlLCBzY3JlZW5fcHMsIE5VTEwgKTsKKyAgICAgIAorICAgICAgLyogbWFpbiBpbWFnZSBhbmQgbWFnbmlmaWVkIHBpY3R1cmUgKi8KKyAgICAgIEdwaUJpdEJsdCggc2NyZWVuX3BzLAorICAgICAgICAgICAgICAgICBzdXJmYWNlLT5pbWFnZV9wcywKKyAgICAgICAgICAgICAgICAgNEwsCisgICAgICAgICAgICAgICAgIHN1cmZhY2UtPmJsaXRfcG9pbnRzLAorICAgICAgICAgICAgICAgICBST1BfU1JDQ09QWSwgQkJPX0FORCApOworCisgICAgICBXaW5FbmRQYWludCggc2NyZWVuX3BzICk7CisgICAgICBEb3NSZWxlYXNlTXV0ZXhTZW0oIHN1cmZhY2UtPmltYWdlX2xvY2sgKTsgICAKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBXTV9DSEFSOgorICAgICAgaWYgKCBDSEFSTVNHKCAmbWVzcyApLT5mcyAmIEtDX0tFWVVQICkKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIC8qIGxvb2sgZm9yIGEgc3BlY2lmaWMgdmtleSAqLworICAgICAgeworICAgICAgICBpbnQgICAgICAgICAgY291bnQgPSBzaXplb2YoIGtleV90cmFuc2xhdG9ycyApL3NpemVvZigga2V5X3RyYW5zbGF0b3JzWzBdICk7CisgICAgICAgIFRyYW5zbGF0b3IqICB0cmFucyA9IGtleV90cmFuc2xhdG9yczsKKyAgICAgICAgVHJhbnNsYXRvciogIGxpbWl0ID0gdHJhbnMgKyBjb3VudDsKKworICAgICAgICBmb3IgKCA7IHRyYW5zIDwgbGltaXQ7IHRyYW5zKysgKQorICAgICAgICAgIGlmICggQ0hBUk1TRygmbWVzcyktPnZrZXkgPT0gdHJhbnMtPm9zMmtleSApCisgICAgICAgICAgeworICAgICAgICAgICAgc3VyZmFjZS0+ZXZlbnQua2V5ID0gdHJhbnMtPmdya2V5OworICAgICAgICAgICAgZ290byBEb19LZXlfRXZlbnQ7CisgICAgICAgICAgfQorICAgICAgfQorCisgICAgICAvKiBvdGhlcndpc2UsIHNpbXBseSByZWNvcmQgdGhlIGNoYXJhY3RlciBjb2RlICovCisgICAgICBpZiAoIChDSEFSTVNHKCAmbWVzcyApLT5mcyAmIEtDX0NIQVIpID09IDAgKQorICAgICAgICBicmVhazsKKworICAgICAgc3VyZmFjZS0+ZXZlbnQua2V5ID0gQ0hBUk1TRygmbWVzcyktPmNocjsKKworICAgIERvX0tleV9FdmVudDoKKyAgICAgIHN1cmZhY2UtPmV2ZW50LnR5cGUgPSBncl9ldmVudF9rZXk7CisgICAgICBEb3NQb3N0RXZlbnRTZW0oIHN1cmZhY2UtPmV2ZW50X2xvY2sgKTsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBXaW5EZWZXaW5kb3dQcm9jKCBoYW5kbGUsIG1lc3MsIHBhcm0xLCBwYXJtMiApOworICAgIH0KKworICAgIHJldHVybiAoTVJFU1VMVCkgRkFMU0U7CisgIH0KKworCisKKworCisKKworI2lmIDAKKyAgc3RhdGljCisgIGdyS2V5ICBLZXlTeW1Ub2dyS2V5KCAgIGtleSApCisgIHsKKyAgICBncktleSAgICAgICAgazsKKyAgICBpbnQgICAgICAgICAgY291bnQgPSBzaXplb2Yoa2V5X3RyYW5zbGF0b3JzKS9zaXplb2Yoa2V5X3RyYW5zbGF0b3JzWzBdKTsKKyAgICBUcmFuc2xhdG9yKiAgdHJhbnMgPSBrZXlfdHJhbnNsYXRvcnM7CisgICAgVHJhbnNsYXRvciogIGxpbWl0ID0gdHJhbnMgKyBjb3VudDsKKworICAgIGsgPSBncktleU5vbmU7CisKKyAgICB3aGlsZSAoIHRyYW5zIDwgbGltaXQgKQorICAgIHsKKyAgICAgIGlmICggdHJhbnMtPnhrZXkgPT0ga2V5ICkKKyAgICAgIHsKKyAgICAgICAgayA9IHRyYW5zLT5ncmtleTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICB0cmFucysrOworICAgIH0KKworICAgIHJldHVybiBrOworICB9CisKKworCisgIHN0YXRpYyAgCisgIHZvaWQgIGxpc3Rlbl9ldmVudCggZ3JQTVN1cmZhY2UqIHN1cmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgIGV2ZW50X21hc2ssCisgICAgICAgICAgICAgICAgICAgICAgZ3JFdmVudCogICAgIGdyZXZlbnQgKQorICB7CisgICAgZ3JLZXkgICAgICAgICAgIGdya2V5OworCisgICAgLyogWFhYWCA6IEZvciBub3csIGlnbm9yZSB0aGUgZXZlbnQgbWFzaywgYW5kIG9ubHkgZXhpdCB3aGVuICovCisgICAgLyogICAgICAgIGEga2V5IGlzIHByZXNzZWQuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgKHZvaWQpZXZlbnRfbWFzazsKKworCisgICAgLyogTm93LCB0cmFuc2xhdGUgdGhlIGtleXByZXNzIHRvIGEgZ3JLZXkgKi8KKyAgICAvKiBJZiB0aGlzIHdhc24ndCBwYXJ0IG9mIHRoZSBzaW1wbGUgdHJhbnNsYXRlZCBrZXlzLCBzaW1wbHkgZ2V0IHRoZSBjaGFyY29kZSAqLworICAgIC8qIGZyb20gdGhlIGNoYXJhY3RlciBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgZ3JrZXkgPSBncktFWShrZXlfYnVmZmVyW2tleV9jdXJzb3IrK10pOworICAgICAgCisgIFNldF9LZXk6CisgICAgZ3JldmVudC0+dHlwZSA9IGdyX2tleV9kb3duOworICAgIGdyZXZlbnQtPmtleSAgPSBncmtleTsKKyAgfQorCisjZW5kaWYKKworCisKKyAgZ3JEZXZpY2UgIGdyX29zMnBtX2RldmljZSA9CisgIHsKKyAgICBzaXplb2YoIGdyUE1TdXJmYWNlICksCisgICAgIm9zMnBtIiwKKyAgICAKKyAgICBpbml0X2RldmljZSwKKyAgICBkb25lX2RldmljZSwKKyAgICAKKyAgICAoZ3JEZXZpY2VJbml0U3VyZmFjZUZ1bmMpIGluaXRfc3VyZmFjZSwKKyAgICAKKyAgICAwLAorICAgIDAKKyAgICAKKyAgfTsKKworCmRpZmYgLS1naXQgYS9kZW1vcy9jb25maWcvb3MyL2dyb3MycG0uZGVmIGIvZGVtb3MvY29uZmlnL29zMi9ncm9zMnBtLmRlZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTc3YzYzCi0tLSAvZGV2L251bGwKKysrIGIvZGVtb3MvY29uZmlnL29zMi9ncm9zMnBtLmRlZgpAQCAtMCwwICsxLDUgQEAKK05BTUUgICAgICAgIFdJTkRPV0NPTVBBVAorCitERVNDUklQVElPTiAnRnJlZVR5cGUgR3JhcGhpY3MnCitIRUFQU0laRSAgICA4MTkyCitTVEFDS1NJWkUgICA0MDg4OApkaWZmIC0tZ2l0IGEvZGVtb3MvY29uZmlnL29zMi9ncm9zMnBtLmggYi9kZW1vcy9jb25maWcvb3MyL2dyb3MycG0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjkzNTgwCi0tLSAvZGV2L251bGwKKysrIGIvZGVtb3MvY29uZmlnL29zMi9ncm9zMnBtLmgKQEAgLTAsMCArMSwyMyBAQAorI2lmbmRlZiBHUk9TMlBNX0gKKyNkZWZpbmUgR1JPUzJQTV9ICisKKyNpbmNsdWRlICJncm9ianMuaCIKKworICBleHRlcm4KKyAgZ3JEZXZpY2UgIGdyX29zMnBtX2RldmljZTsKKworI2lmZGVmIEdSX0lOSVRfQlVJTEQKKyAgc3RhdGljCisgIGdyRGV2aWNlQ2hhaW4gIGdyX29zMnBtX2RldmljZV9jaGFpbiA9CisgIHsKKyAgICAib3MycG0iLAorICAgICZncl9vczJwbV9kZXZpY2UsCisgICAgR1JfSU5JVF9ERVZJQ0VfQ0hBSU4KKyAgfTsKKworI3VuZGVmIEdSX0lOSVRfREVWSUNFX0NIQUlOCisjZGVmaW5lIEdSX0lOSVRfREVWSUNFX0NIQUlOICAmZ3Jfb3MycG1fZGV2aWNlX2NoYWluCisKKyNlbmRpZiAgLyogR1JfSU5JVF9CVUlMRCAqLworCisjZW5kaWYgLyogR1JPUzJQTV9IICovCmRpZmYgLS1naXQgYS9kZW1vcy9jb25maWcvb3MyL3J1bGVzLm1rIGIvZGVtb3MvY29uZmlnL29zMi9ydWxlcy5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzcwMzRkCi0tLSAvZGV2L251bGwKKysrIGIvZGVtb3MvY29uZmlnL29zMi9ydWxlcy5tawpAQCAtMCwwICsxLDMyIEBACisjKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyMqCisjKiAgT1MvMiBzcGVjaWZpYyBydWxlcyBmaWxlLCB1c2VkIHRvIGNvbXBpbGUgdGhlIE9TLzIgZ3JhcGhpY3MgZHJpdmVyCisjKiAgdG8gdGhlIGdyYXBoaWNzIHN1YnN5c3RlbQorIyoKKyMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCitpZmVxICgkKFBMQVRGT1JNKSxvczIpCisKK0dSX09TMiAgOj0gY29uZmlnJChTRVApb3MyCitHUl9PUzJfIDo9ICQoR1JfT1MyKSQoU0VQKQorCisjIHRoZSBHUkFQSF9MSU5LIGlzIGV4cGFuZGVkIGVhY2ggdGltZSBhbiBleGVjdXRhYmxlIGlzIGxpbmtlZCB3aXRoIHRoZQorIyBncmFwaGljcyBsaWJyYXJ5LgorIworR1JBUEhfTElOSyAgICAgKz0gJChHUl9PUzJfKWdyb3MycG0uZGVmCisKKyMgQWRkIHRoZSBPUy8yIGRyaXZlciBvYmplY3QgZmlsZSB0byB0aGUgZ3JhcGhpY3MgbGlicmFyeSAiZ3JhcGguYSIKKyMKK0dSQVBIX09CSlMgKz0gJChPQkpfKWdyb3MycG0uJE8KKworREVWSUNFUyAgICAgICAgICs9IE9TMl9QTQorREVWSUNFX0lOQ0xVREVTICs9ICQoR1JfT1MyKQorCisjIHRoZSBydWxlIHVzZWQgdG8gY29tcGlsZSB0aGUgZ3JhcGhpY3MgZHJpdmVyCisjCiskKE9CSl8pZ3JvczJwbS4kTzogJChHUl9PUzJfKWdyb3MycG0uYyAkKEdSX09TMl8pZ3JvczJwbS5oCisJJChDQykgJChDRkxBR1MpICQoR1JBUEhfSU5DTFVERVM6JT0kSSUpICRJJChHUl9PUzIpICRUJEAgJDwKKworZW5kaWYKKworCmRpZmYgLS1naXQgYS9kZW1vcy9jb25maWcveDExL2dyeDExLmMgYi9kZW1vcy9jb25maWcveDExL2dyeDExLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTlkODUzOAotLS0gL2Rldi9udWxsCisrKyBiL2RlbW9zL2NvbmZpZy94MTEvZ3J4MTEuYwpAQCAtMCwwICsxLDkzNiBAQAorI2luY2x1ZGUgImdyeDExLmgiCisKKworI2lmZGVmIFRFU1QKKyNpbmNsdWRlICJncmZvbnQuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxYMTEvWGxpYi5oPgorI2luY2x1ZGUgPFgxMS9YdXRpbC5oPgorI2luY2x1ZGUgPFgxMS9jdXJzb3Jmb250Lmg+CisjaW5jbHVkZSA8WDExL2tleXN5bS5oPgorCisgIHN0YXRpYyB2b2lkIFBhbmljKCBjb25zdCBjaGFyKiBtZXNzYWdlICkKKyAgeworICAgIGZwcmludGYoIHN0ZGVyciwgIiVzIiwgbWVzc2FnZSApOworICAgIGV4aXQoMSk7CisgIH0KKworICB0eXBlZGVmIHN0cnVjdCBUcmFuc2xhdG9yCisgIHsKKyAgICBLZXlTeW0gIHhrZXk7CisgICAgZ3JLZXkgICBncmtleTsKKyAgICAKKyAgfSBUcmFuc2xhdG9yOworICAKKyAgc3RhdGljCisgIFRyYW5zbGF0b3IgIGtleV90cmFuc2xhdG9yc1tdID0KKyAgeworICAgIHsgWEtfQmFja1NwYWNlLCBncktleUJhY2tTcGFjZSB9LAorICAgIHsgWEtfVGFiLCAgICAgICBncktleVRhYiAgICAgICB9LAorICAgIHsgWEtfUmV0dXJuLCAgICBncktleVJldHVybiAgICB9LAorICAgIHsgWEtfRXNjYXBlLCAgICBncktleUVzYyAgICAgICB9LAorICAgIHsgWEtfSG9tZSwgICAgICBncktleUhvbWUgICAgICB9LAorICAgIHsgWEtfTGVmdCwgICAgICBncktleUxlZnQgICAgICB9LAorICAgIHsgWEtfVXAsICAgICAgICBncktleVVwICAgICAgICB9LAorICAgIHsgWEtfUmlnaHQsICAgICBncktleVJpZ2h0ICAgICB9LAorICAgIHsgWEtfRG93biwgICAgICBncktleURvd24gICAgICB9LAorICAgIHsgWEtfUGFnZV9VcCwgICBncktleVBhZ2VVcCAgICB9LAorICAgIHsgWEtfUGFnZV9Eb3duLCBncktleVBhZ2VEb3duICB9LAorICAgIHsgWEtfRW5kLCAgICAgICBncktleUVuZCAgICAgICB9LAorICAgIHsgWEtfQmVnaW4sICAgICBncktleUhvbWUgICAgICB9LAorICAgIHsgWEtfRjEsICAgICAgICBncktleUYxICAgICAgICB9LAorICAgIHsgWEtfRjIsICAgICAgICBncktleUYyICAgICAgICB9LAorICAgIHsgWEtfRjMsICAgICAgICBncktleUYzICAgICAgICB9LAorICAgIHsgWEtfRjQsICAgICAgICBncktleUY0ICAgICAgICB9LAorICAgIHsgWEtfRjUsICAgICAgICBncktleUY1ICAgICAgICB9LAorICAgIHsgWEtfRjYsICAgICAgICBncktleUY2ICAgICAgICB9LAorICAgIHsgWEtfRjcsICAgICAgICBncktleUY3ICAgICAgICB9LAorICAgIHsgWEtfRjgsICAgICAgICBncktleUY4ICAgICAgICB9LAorICAgIHsgWEtfRjksICAgICAgICBncktleUY5ICAgICAgICB9LAorICAgIHsgWEtfRjEwLCAgICAgICBncktleUYxMCAgICAgICB9LAorICAgIHsgWEtfRjExLCAgICAgICBncktleUYxMSAgICAgICB9LAorICAgIHsgWEtfRjEyLCAgICAgICBncktleUYxMiAgICAgICB9CisgIH07CisKKworI2lmZGVmIFRFU1QKKyAgCisjZGVmaW5lIGdyQWxsb2MgIG1hbGxvYworICAKKyNlbmRpZgorCisKKyAgc3RhdGljIERpc3BsYXkqICBkaXNwbGF5OworICBzdGF0aWMgY2hhciogICAgIGRpc3BsYXluYW1lID0gIiI7CisKKyAgc3RhdGljIEN1cnNvciAgaWRsZTsKKyAgc3RhdGljIEN1cnNvciAgYnVzeTsKKworI2RlZmluZSBNQVhfUElYRUxfTU9ERVMgIDMyCisKKyAgdHlwZWRlZiBYUGl4bWFwRm9ybWF0VmFsdWVzICBYRGVwdGg7CisKKyAgc3RhdGljIGludCAgICAgICAgICAgbnVtX3BpeGVsX21vZGVzID0gMDsKKyAgc3RhdGljIGdyUGl4ZWxNb2RlICAgcGl4ZWxfbW9kZXNbIE1BWF9QSVhFTF9NT0RFUyBdOyAgCisgIHN0YXRpYyBYRGVwdGggICAgICAgIHBpeGVsX2RlcHRoWyBNQVhfUElYRUxfTU9ERVMgXTsKKworICB0eXBlZGVmIHN0cnVjdCBnclhTdXJmYWNlXworICB7CisgICAgZ3JTdXJmYWNlICAgICAgcm9vdDsKKyAgICBnckJpdG1hcCAgICAgICBpbWFnZTsKKworICAgIFdpbmRvdyAgICAgICAgIHdpbjsKKyAgICBWaXN1YWwqICAgICAgICB2aXN1YWw7CisgICAgQ29sb3JtYXAgICAgICAgY29sb3JtYXA7CisgICAgaW50ICAgICAgICAgICAgZGVwdGg7CisgICAgQm9vbCAgICAgICAgICAgZ3JheTsKKyAgICAKKyAgICBHQyAgICAgICAgICAgICBnYzsKKyAgICAKKyAgICBYQ29sb3IgICAgICAgICBjb2xvclsyNTZdOyAgIC8qIGdyYXkgbGV2ZWxzIHBhbGV0dGUgZm9yIDgtYml0IG1vZGVzICovCisgICAgWEltYWdlKiAgICAgICAgeGltYWdlOworCisgICAgaW50ICAgICAgICAgICAgd2luX29yZ194OworICAgIGludCAgICAgICAgICAgIHdpbl9vcmdfeTsKKyAgICBpbnQgICAgICAgICAgICB3aW5fd2lkdGg7CisgICAgaW50ICAgICAgICAgICAgd2luX2hlaWdodDsKKyAgICAKKyAgICBpbnQgICAgICAgICAgICBpbWFnZV93aWR0aDsKKyAgICBpbnQgICAgICAgICAgICBpbWFnZV9oZWlnaHQ7CisgICAgCisgIH0gZ3JYU3VyZmFjZTsKKworCisKKworICAvKiBjbG9zZSBhIGdpdmVuIHdpbmRvdyAqLworICBzdGF0aWMKKyAgdm9pZCAgZG9uZV9zdXJmYWNlKCBnclhTdXJmYWNlKiAgc3VyZmFjZSApCisgIHsKKyAgICBYVW5tYXBXaW5kb3coIGRpc3BsYXksIHN1cmZhY2UtPndpbiApOworICB9CisKKworCisgIC8qIGNsb3NlIHRoZSBkZXZpY2UsIGkuZS4gdGhlIGRpc3BsYXkgY29ubmVjdGlvbiAqLworICBzdGF0aWMKKyAgdm9pZCAgZG9uZV9kZXZpY2UoIHZvaWQgKQorICB7CisgICAgWENsb3NlRGlzcGxheSggZGlzcGxheSApOworICB9CisKKworCisgIHN0YXRpYworICB2b2lkIGFkZF9waXhlbF9tb2RlKCBnclBpeGVsTW9kZSAgcGl4ZWxfbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgWERlcHRoKiAgICAgIGRlcHRoICkKKyAgeworICAgIGlmICggbnVtX3BpeGVsX21vZGVzID49IE1BWF9QSVhFTF9NT0RFUyApCisgICAgICBQYW5pYyggIlgxMS5Ub28gbWFueSBwaXhlbCBtb2Rlc1xuIiApOworICAgICAgCisgICAgcGl4ZWxfbW9kZXNbIG51bV9waXhlbF9tb2RlcyBdID0gcGl4ZWxfbW9kZTsKKyAgICBwaXhlbF9kZXB0aFsgbnVtX3BpeGVsX21vZGVzIF0gPSAqZGVwdGg7CisgICAgCisgICAgbnVtX3BpeGVsX21vZGVzKys7CisgIH0KKworCisKKyAgc3RhdGljCisgIGludCAgaW5pdF9kZXZpY2UoIHZvaWQgKQorICB7CisgICAgWERlcHRoICBkdW1teTsKKyAgCisgICAgWHJtSW5pdGlhbGl6ZSgpOworICAgIAorICAgIGRpc3BsYXkgPSBYT3BlbkRpc3BsYXkoIGRpc3BsYXluYW1lICk7CisgICAgaWYgKCFkaXNwbGF5KQorICAgIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICAgLyogUGFuaWMoICJHcjplcnJvcjogY2Fubm90IG9wZW4gWDExIGRpc3BsYXlcbiIgKTsgKi8KKyAgICB9CisgICAgICAKKyAgICBpZGxlID0gWENyZWF0ZUZvbnRDdXJzb3IoIGRpc3BsYXksIFhDX2xlZnRfcHRyICk7CisgICAgYnVzeSA9IFhDcmVhdGVGb250Q3Vyc29yKCBkaXNwbGF5LCBYQ193YXRjaCApOworICAgIAorICAgIG51bV9waXhlbF9tb2RlcyA9IDA7CisgICAgCisgICAgLyogYWx3YXlzIGVuYWJsZSB0aGUgOC1iaXQgZ3JheSBsZXZlbHMgcGl4ZWwgbW9kZSAgICAgICAgICAgICAgICAqLworICAgIC8qIGV2ZW4gaWYgaXRzIGRpc3BsYXkgaXMgZW11bGF0ZWQgdGhyb3VnaCBhIGNvbnN0cmFpbmVkIHBhbGV0dGUgKi8KKyAgICAvKiBvciBhbm90aGVyIGNvbG9yIG1vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgZHVtbXkuZGVwdGggICAgICAgICAgPSA4OworICAgIGR1bW15LmJpdHNfcGVyX3BpeGVsID0gODsKKyAgICBkdW1teS5zY2FubGluZV9wYWQgICA9IDg7CisgICAgYWRkX3BpeGVsX21vZGUoIGdyX3BpeGVsX21vZGVfZ3JheSwgJmR1bW15ICk7CisKKyAgICB7CisgICAgICBpbnQgICAgICAgICAgY291bnQ7CisgICAgICBYRGVwdGgqICAgICAgZm9ybWF0OworICAgICAgWERlcHRoKiAgICAgIGZvcm1hdHM7CisgICAgICBYVmlzdWFsSW5mbyAgdGVtcGxhdGU7CisKKyAgICAgIGZvcm1hdHMgPSBYTGlzdFBpeG1hcEZvcm1hdHMoIGRpc3BsYXksICZjb3VudCApOworICAgICAgZm9ybWF0ICA9IGZvcm1hdHM7CisgICAgICAgCisjaWZkZWYgVEVTVAorICAgICAgcHJpbnRmKCAiYXZhaWxhYmxlIHBpeG1hcCBmb3JtYXRzXG4iICk7CisgICAgICBwcmludGYoICJkZXB0aCAgcGl4Yml0cyAgc2NhbnBhZFxuIiApOworI2VuZGlmCisgICAgICAgCisgICAgICB3aGlsZSAoIGNvdW50LS0gPiAwICkKKyAgICAgIHsKKyNpZmRlZiBURVNUIAorICAgICAgICBwcmludGYoICIgJTNkICAgICAlM2QgICAgICAlM2RcbiIsCisgICAgICAgICAgICAgICAgZm9ybWF0LT5kZXB0aCwKKyAgICAgICAgICAgICAgICBmb3JtYXQtPmJpdHNfcGVyX3BpeGVsLAorICAgICAgICAgICAgICAgIGZvcm1hdC0+c2NhbmxpbmVfcGFkICk7CisjZW5kaWYKKyAgICAgIAorICAgICAgICBpZiAoIGZvcm1hdC0+ZGVwdGggPT0gMSApCisgICAgICAgICAgLyogdXN1YWxseSwgdGhpcyBzaG91bGQgYmUgdGhlIGZpcnN0IGZvcm1hdCAqLworICAgICAgICAgIGFkZF9waXhlbF9tb2RlKCBncl9waXhlbF9tb2RlX21vbm8sIGZvcm1hdCApOworICAgICAgICAgIAorICAgICAgICBlbHNlIGlmICggZm9ybWF0LT5kZXB0aCA9PSA4ICkKKyAgICAgICAgICBhZGRfcGl4ZWxfbW9kZSggZ3JfcGl4ZWxfbW9kZV9wYWw4LCBmb3JtYXQgKTsKKworICAgICAgICAvKiBub3RlLCB0aGUgMzItYml0IG1vZGVzIHJldHVybiBhIGRlcHRoIG9mIDI0LCBhbmQgMzIgYml0cyBwZXIgcGl4ZWwgKi8gICAgICAgICAgCisgICAgICAgIGVsc2UgaWYgKCBmb3JtYXQtPmRlcHRoID09IDI0ICkKKyAgICAgICAgeworICAgICAgICAgIGlmICggZm9ybWF0LT5iaXRzX3Blcl9waXhlbCA9PSAyNCApCisgICAgICAgICAgICBhZGRfcGl4ZWxfbW9kZSggZ3JfcGl4ZWxfbW9kZV9yZ2IyNCwgZm9ybWF0ICk7CisgICAgICAgICAgICAKKyAgICAgICAgICBlbHNlIGlmICggZm9ybWF0LT5iaXRzX3Blcl9waXhlbCA9PSAzMiApCisgICAgICAgICAgICBhZGRfcGl4ZWxfbW9kZSggZ3JfcGl4ZWxfbW9kZV9yZ2IzMiwgZm9ybWF0ICk7CisgICAgICAgIH0KKyAgICAgICAgICAKKyAgICAgICAgZWxzZSBpZiAoIGZvcm1hdC0+ZGVwdGggPT0gMTYgKQorICAgICAgICB7CisgICAgICAgICAgaW50ICAgICAgICAgICBjb3VudDI7CisgICAgICAgICAgWFZpc3VhbEluZm8qICB2aXN1YWxzOworICAgICAgICAgIFhWaXN1YWxJbmZvKiAgdmlzdWFsOworCisgICAgICAgICAgdGVtcGxhdGUuZGVwdGggPSBmb3JtYXQtPmRlcHRoOworICAgICAgICAgIHZpc3VhbHMgICAgICAgID0gWEdldFZpc3VhbEluZm8oIGRpc3BsYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlzdWFsRGVwdGhNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZW1wbGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY291bnQyICk7CisgICAgICAgICAgdmlzdWFsID0gdmlzdWFsczsKKyAgICAgICAgICAKKyAgICAgICAgICB3aGlsZSAoIGNvdW50Mi0tID4gMCApCisgICAgICAgICAgeworI2lmZGVmIFRFU1QgCisgICAgICAgICAgICBjb25zdCBjaGFyKiAgc3RyaW5nID0gInVua25vd24iOworICAgICAgICAgICAgCisgICAgICAgICAgICBzd2l0Y2ggKHZpc3VhbC0+Y2xhc3MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGNhc2UgVHJ1ZUNvbG9yOiAgIHN0cmluZyA9ICJUcnVlQ29sb3IiOyAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBEaXJlY3RDb2xvcjogc3RyaW5nID0gIkRpcmVjdENvbG9yIjsgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIFBzZXVkb0NvbG9yOiBzdHJpbmcgPSAiUHNldWRvQ29sb3IiOyAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgU3RhdGljR3JheSA6IHN0cmluZyA9ICJTdGF0aWNHcmF5IjsgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBTdGF0aWNDb2xvcjogc3RyaW5nID0gIlN0YXRpY0NvbG9yIjsgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIEdyYXlTY2FsZTogICBzdHJpbmcgPSAiR3JheVNjYWxlIjsgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHByaW50ZiggIj4gICBSR0IgJTAyeDolMDJ4OiUwMngsIGNvbG9ycyAlM2QsIGJpdHMgJTJkICAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgdmlzdWFsLT5yZWRfbWFzaywKKyAgICAgICAgICAgICAgICAgICAgdmlzdWFsLT5ncmVlbl9tYXNrLAorICAgICAgICAgICAgICAgICAgICB2aXN1YWwtPmJsdWVfbWFzaywKKyAgICAgICAgICAgICAgICAgICAgdmlzdWFsLT5jb2xvcm1hcF9zaXplLAorICAgICAgICAgICAgICAgICAgICB2aXN1YWwtPmJpdHNfcGVyX3JnYiwKKyAgICAgICAgICAgICAgICAgICAgc3RyaW5nICk7CisjZW5kaWYKKyAgICAgICAgICAgIGlmICggdmlzdWFsLT5yZWRfbWFzayAgID09IDB4ZjgwMCAmJgorICAgICAgICAgICAgICAgICB2aXN1YWwtPmdyZWVuX21hc2sgPT0gMHgwN2UwICYmCisgICAgICAgICAgICAgICAgIHZpc3VhbC0+Ymx1ZV9tYXNrICA9PSAweDAwMWYgKQorICAgICAgICAgICAgICBhZGRfcGl4ZWxfbW9kZSggZ3JfcGl4ZWxfbW9kZV9yZ2I1NjUsIGZvcm1hdCApOworICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGVsc2UgaWYgKCB2aXN1YWwtPnJlZF9tYXNrICAgPT0gMHg3YzAwICYmCisgICAgICAgICAgICAgICAgICAgICAgdmlzdWFsLT5ncmVlbl9tYXNrID09IDB4MDNlMCAmJgorICAgICAgICAgICAgICAgICAgICAgIHZpc3VhbC0+Ymx1ZV9tYXNrICA9PSAweDAwMWYgKQorICAgICAgICAgICAgICBhZGRfcGl4ZWxfbW9kZSggZ3JfcGl4ZWxfbW9kZV9yZ2I1NTUsIGZvcm1hdCApOworICAgICAgICAgICAgICAKKyAgICAgICAgICAgIC8qIG90aGVyIDE2LWJpdCBtb2RlcyBhcmUgaWdub3JlZCAqLyAgCisgICAgICAgICAgICB2aXN1YWwrKzsKKyAgICAgICAgICB9CisgICAgICAgICAgCisgICAgICAgICAgWEZyZWUoIHZpc3VhbHMgKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgZm9ybWF0Kys7CisgICAgICB9CisgICAgICAKKyAgICAgIFhGcmVlKCBmb3JtYXRzICk7CisgICAgfQorICAgIAorICAgIGdyX3gxMV9kZXZpY2UubnVtX3BpeGVsX21vZGVzID0gbnVtX3BpeGVsX21vZGVzOworICAgIGdyX3gxMV9kZXZpY2UucGl4ZWxfbW9kZXMgICAgID0gcGl4ZWxfbW9kZXM7CisgICAgCisgICAgcmV0dXJuIDA7CisgIH0KKworCisKKworCisKKworCisKKworCisKKyAgc3RhdGljCisgIHZvaWQgIGNvbnZlcnRfZ3JheV90b19wYWw4KCBnclhTdXJmYWNlKiAgc3VyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgIHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICBoICkKKyAgeworICAgIGdyQml0bWFwKiAgdGFyZ2V0ICA9ICZzdXJmYWNlLT5pbWFnZTsKKyAgICBnckJpdG1hcCogIHNvdXJjZSAgPSAmc3VyZmFjZS0+cm9vdC5iaXRtYXA7CisgICAgYnl0ZSogICAgICB3cml0ZSAgID0gKGJ5dGUqKXRhcmdldC0+YnVmZmVyICsgeSp0YXJnZXQtPnBpdGNoICsgeDsKKyAgICBieXRlKiAgICAgIHJlYWQgICAgPSAoYnl0ZSopc291cmNlLT5idWZmZXIgKyB5KnNvdXJjZS0+cGl0Y2ggKyB4OworICAgIFhDb2xvciogICAgcGFsZXR0ZSA9IHN1cmZhY2UtPmNvbG9yOworICAgIAorICAgIHdoaWxlIChoID4gMCkKKyAgICB7CisgICAgICBieXRlKiAgX3dyaXRlID0gd3JpdGU7CisgICAgICBieXRlKiAgX3JlYWQgID0gcmVhZDsKKyAgICAgIGJ5dGUqICBsaW1pdCAgPSBfd3JpdGUgKyB3OworICAgICAgCisgICAgICBmb3IgKCA7IF93cml0ZSA8IGxpbWl0OyBfd3JpdGUrKywgX3JlYWQrKyApCisgICAgICAgICpfd3JpdGUgPSAoYnl0ZSkgcGFsZXR0ZVsgKl9yZWFkIF0ucGl4ZWw7CisKKyAgICAgIHdyaXRlICs9IHRhcmdldC0+cGl0Y2g7CisgICAgICByZWFkICArPSBzb3VyY2UtPnBpdGNoOworICAgICAgaC0tOworICAgIH0KKyAgfQorCisKKyAgc3RhdGljCisgIHZvaWQgIGNvbnZlcnRfZ3JheV90b18xNiggZ3JYU3VyZmFjZSogIHN1cmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgIHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgIHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgIHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgIGggKQorICB7CisgICAgZ3JCaXRtYXAqICB0YXJnZXQgID0gJnN1cmZhY2UtPmltYWdlOworICAgIGdyQml0bWFwKiAgc291cmNlICA9ICZzdXJmYWNlLT5yb290LmJpdG1hcDsKKyAgICBieXRlKiAgICAgIHdyaXRlICAgPSAoYnl0ZSopdGFyZ2V0LT5idWZmZXIgKyB5KnRhcmdldC0+cGl0Y2ggKyAyKng7CisgICAgYnl0ZSogICAgICByZWFkICAgID0gKGJ5dGUqKXNvdXJjZS0+YnVmZmVyICsgeSpzb3VyY2UtPnBpdGNoICsgeDsKKyAgICBYQ29sb3IqICAgIHBhbGV0dGUgPSBzdXJmYWNlLT5jb2xvcjsKKyAgICAKKyAgICB3aGlsZSAoaCA+IDApCisgICAgeworICAgICAgYnl0ZSogIF93cml0ZSA9IHdyaXRlOworICAgICAgYnl0ZSogIF9yZWFkICA9IHJlYWQ7CisgICAgICBieXRlKiAgbGltaXQgID0gX3dyaXRlICsgMip3OworICAgICAgCisgICAgICBmb3IgKCA7IF93cml0ZSA8IGxpbWl0OyBfd3JpdGUgKz0gMiwgX3JlYWQrKyApCisgICAgICAgICooc2hvcnQqKV93cml0ZSA9IChzaG9ydClwYWxldHRlWyAqX3JlYWQgXS5waXhlbDsKKworICAgICAgd3JpdGUgKz0gdGFyZ2V0LT5waXRjaDsKKyAgICAgIHJlYWQgICs9IHNvdXJjZS0+cGl0Y2g7CisgICAgICBoLS07CisgICAgfQorICB9CisKKworICBzdGF0aWMKKyAgdm9pZCAgY29udmVydF9ncmF5X3RvXzI0KCBnclhTdXJmYWNlKiAgc3VyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgaCApCisgIHsKKyAgICBnckJpdG1hcCogIHRhcmdldCAgPSAmc3VyZmFjZS0+aW1hZ2U7CisgICAgZ3JCaXRtYXAqICBzb3VyY2UgID0gJnN1cmZhY2UtPnJvb3QuYml0bWFwOworICAgIGJ5dGUqICAgICAgd3JpdGUgICA9IChieXRlKil0YXJnZXQtPmJ1ZmZlciArIHkqdGFyZ2V0LT5waXRjaCArIDMqeDsKKyAgICBieXRlKiAgICAgIHJlYWQgICAgPSAoYnl0ZSopc291cmNlLT5idWZmZXIgKyB5KnNvdXJjZS0+cGl0Y2ggKyB4OworICAgIAorICAgIHdoaWxlIChoID4gMCkKKyAgICB7CisgICAgICBieXRlKiAgX3dyaXRlID0gd3JpdGU7CisgICAgICBieXRlKiAgX3JlYWQgID0gcmVhZDsKKyAgICAgIGJ5dGUqICBsaW1pdCAgPSBfd3JpdGUgKyAzKnc7CisgICAgICAKKyAgICAgIGZvciAoIDsgX3dyaXRlIDwgbGltaXQ7IF93cml0ZSArPSAzLCBfcmVhZCsrICkKKyAgICAgIHsKKyAgICAgICAgYnl0ZSAgY29sb3IgPSAqX3JlYWQ7CisgICAgICAgIAorICAgICAgICBfd3JpdGVbMF0gPQorICAgICAgICBfd3JpdGVbMV0gPQorICAgICAgICBfd3JpdGVbMl0gPSBjb2xvcjsKKyAgICAgIH0KKworICAgICAgd3JpdGUgKz0gdGFyZ2V0LT5waXRjaDsKKyAgICAgIHJlYWQgICs9IHNvdXJjZS0+cGl0Y2g7CisgICAgICBoLS07CisgICAgfQorICB9CisKKworICBzdGF0aWMKKyAgdm9pZCAgY29udmVydF9ncmF5X3RvXzMyKCBnclhTdXJmYWNlKiAgc3VyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgaCApCisgIHsKKyAgICBnckJpdG1hcCogIHRhcmdldCAgPSAmc3VyZmFjZS0+aW1hZ2U7CisgICAgZ3JCaXRtYXAqICBzb3VyY2UgID0gJnN1cmZhY2UtPnJvb3QuYml0bWFwOworICAgIGJ5dGUqICAgICAgd3JpdGUgICA9IChieXRlKil0YXJnZXQtPmJ1ZmZlciArIHkqdGFyZ2V0LT5waXRjaCArIDQqeDsKKyAgICBieXRlKiAgICAgIHJlYWQgICAgPSAoYnl0ZSopc291cmNlLT5idWZmZXIgKyB5KnNvdXJjZS0+cGl0Y2ggKyB4OworICAgIAorICAgIHdoaWxlIChoID4gMCkKKyAgICB7CisgICAgICBieXRlKiAgX3dyaXRlID0gd3JpdGU7CisgICAgICBieXRlKiAgX3JlYWQgID0gcmVhZDsKKyAgICAgIGJ5dGUqICBsaW1pdCAgPSBfd3JpdGUgKyA0Knc7CisgICAgICAKKyAgICAgIGZvciAoIDsgX3dyaXRlIDwgbGltaXQ7IF93cml0ZSArPSA0LCBfcmVhZCsrICkKKyAgICAgIHsKKyAgICAgICAgYnl0ZSAgY29sb3IgPSAqX3JlYWQ7CisgICAgICAgIAorICAgICAgICBfd3JpdGVbMF0gPQorICAgICAgICBfd3JpdGVbMV0gPQorICAgICAgICBfd3JpdGVbMl0gPQorICAgICAgICBfd3JpdGVbM10gPSBjb2xvcjsKKyAgICAgIH0KKworICAgICAgd3JpdGUgKz0gdGFyZ2V0LT5waXRjaDsKKyAgICAgIHJlYWQgICs9IHNvdXJjZS0+cGl0Y2g7CisgICAgICBoLS07CisgICAgfQorICB9CisKKworICBzdGF0aWMKKyAgdm9pZCAgY29udmVydF9yZWN0YW5nbGUoIGdyWFN1cmZhY2UqICBzdXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgIHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICB3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgIGggKQorICB7CisgICAgaW50ICB6OworICAgIAorICAgIC8qIGZpcnN0IG9mIGFsbCwgY2xpcCB0byB0aGUgc3VyZmFjZSdzIGFyZWEgKi8KKyAgICBpZiAoIHggICA+PSBzdXJmYWNlLT5pbWFnZS53aWR0aCB8fAorICAgICAgICAgeCt3IDw9IDAgICAgICAgICAgICAgICAgICAgIHx8CisgICAgICAgICB5ICAgPj0gc3VyZmFjZS0+aW1hZ2Uucm93cyAgfHwKKyAgICAgICAgIHkraCA8PSAwICkKKyAgICAgIHJldHVybjsKKyAKKyAgICBpZiAoIHggPCAwICkKKyAgICB7CisgICAgICB3ICs9IHg7CisgICAgICB4ICA9IDA7CisgICAgfQorIAorICAgIHogPSAoeCArIHcpIC0gc3VyZmFjZS0+aW1hZ2Uud2lkdGg7CisgICAgaWYgKHogPiAwKQorICAgICAgdyAtPSB6OworICAgICAgCisgICAgeiA9ICh5ICsgaCkgLSBzdXJmYWNlLT5pbWFnZS5yb3dzOworICAgIGlmICh6ID4gMCkKKyAgICAgIGggLT0gejsKKyAgICAgIAorICAgIC8qIGNvbnZlcnQgdGhlIHJlY3RhbmdsZSB0byB0aGUgdGFyZ2V0IGRlcHRoIGZvciBncmF5IHN1cmZhY2VzICovCisgICAgaWYgKHN1cmZhY2UtPmdyYXkpCisgICAgeworICAgICAgc3dpdGNoIChzdXJmYWNlLT5kZXB0aCkKKyAgICAgIHsKKyAgICAgICAgY2FzZSA4IDogY29udmVydF9ncmF5X3RvX3BhbDgoIHN1cmZhY2UsIHgsIHksIHcsIGggKTsgYnJlYWs7CisgICAgICAgIGNhc2UgMTY6IGNvbnZlcnRfZ3JheV90b18xNiAgKCBzdXJmYWNlLCB4LCB5LCB3LCBoICk7IGJyZWFrOworICAgICAgICBjYXNlIDI0OiBjb252ZXJ0X2dyYXlfdG9fMjQgICggc3VyZmFjZSwgeCwgeSwgdywgaCApOyBicmVhazsKKyAgICAgICAgY2FzZSAzMjogY29udmVydF9ncmF5X3RvXzMyICAoIHN1cmZhY2UsIHgsIHksIHcsIGggKTsgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9IAorCisKKyAgc3RhdGljCisgIHZvaWQgIHJlZnJlc2hfcmVjdGFuZ2xlKCBnclhTdXJmYWNlKiAgc3VyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgIHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICBoICkKKyAgeworICAgIGlmIChzdXJmYWNlLT5ncmF5KQorICAgICAgY29udmVydF9yZWN0YW5nbGUoIHN1cmZhY2UsIHgsIHksIHcsIGggKTsKKyAgICAKKyAgICBYUHV0SW1hZ2UoIGRpc3BsYXksCisgICAgICAgICAgICAgICBzdXJmYWNlLT53aW4sCisgICAgICAgICAgICAgICBzdXJmYWNlLT5nYywKKyAgICAgICAgICAgICAgIHN1cmZhY2UtPnhpbWFnZSwKKyAgICAgICAgICAgICAgIHgsIHksIHgsIHksIHcsIGggKTsKKyAgfQorCisgIAorICBzdGF0aWMKKyAgdm9pZCAgc2V0X3RpdGxlKCBnclhTdXJmYWNlKiAgc3VyZmFjZSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgdGl0bGUgKQorICB7CisgICAgWFN0b3JlTmFtZSggZGlzcGxheSwgc3VyZmFjZS0+d2luLCB0aXRsZSApOworICB9CisKKworCisgIHN0YXRpYworICBncktleSAgS2V5U3ltVG9ncktleSggS2V5U3ltICBrZXkgKQorICB7CisgICAgZ3JLZXkgICAgICAgIGs7CisgICAgaW50ICAgICAgICAgIGNvdW50ID0gc2l6ZW9mKGtleV90cmFuc2xhdG9ycykvc2l6ZW9mKGtleV90cmFuc2xhdG9yc1swXSk7CisgICAgVHJhbnNsYXRvciogIHRyYW5zID0ga2V5X3RyYW5zbGF0b3JzOworICAgIFRyYW5zbGF0b3IqICBsaW1pdCA9IHRyYW5zICsgY291bnQ7CisKKyAgICBrID0gZ3JLZXlOb25lOworCisgICAgd2hpbGUgKCB0cmFucyA8IGxpbWl0ICkKKyAgICB7CisgICAgICBpZiAoIHRyYW5zLT54a2V5ID09IGtleSApCisgICAgICB7CisgICAgICAgIGsgPSB0cmFucy0+Z3JrZXk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgdHJhbnMrKzsKKyAgICB9CisKKyAgICByZXR1cm4gazsKKyAgfQorCisKKworICBzdGF0aWMgIAorICB2b2lkICBsaXN0ZW5fZXZlbnQoIGdyWFN1cmZhY2UqICBzdXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICBldmVudF9tYXNrLAorICAgICAgICAgICAgICAgICAgICAgIGdyRXZlbnQqICAgICBncmV2ZW50ICkKKyAgeworICAgIHN0YXRpYyBjaGFyICAgICBrZXlfYnVmZmVyWzEwXTsKKyAgICBzdGF0aWMgaW50ICAgICAga2V5X2N1cnNvciA9IDA7CisgICAgc3RhdGljIGludCAgICAgIGtleV9udW1iZXIgPSAwOworICAgIHN0YXRpYyBYRXZlbnQgICB4X2V2ZW50OworICAgICAgICAgICBLZXlTeW0gICBrZXk7CisKKyAgICBpbnQgICAgICAgICAgICAgYm9vbF9leGl0OworICAgIGdyS2V5ICAgICAgICAgICBncmtleTsKKworICAgIFhDb21wb3NlU3RhdHVzICBjb21wb3NlOworCisgICAgLyogWFhYWCA6IEZvciBub3csIGlnbm9yZSB0aGUgZXZlbnQgbWFzaywgYW5kIG9ubHkgZXhpdCB3aGVuICovCisgICAgLyogICAgICAgIGEga2V5IGlzIHByZXNzZWQuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgKHZvaWQpZXZlbnRfbWFzazsKKworICAgIGJvb2xfZXhpdCA9IGtleV9jdXJzb3IgPCBrZXlfbnVtYmVyOworCisgICAgWERlZmluZUN1cnNvciggZGlzcGxheSwgc3VyZmFjZS0+d2luLCBpZGxlICk7CisKKyAgICB3aGlsZSAoICFib29sX2V4aXQgKQorICAgIHsKKyAgICAgIFhOZXh0RXZlbnQoIGRpc3BsYXksICZ4X2V2ZW50ICk7CisKKyAgICAgIHN3aXRjaCAoIHhfZXZlbnQudHlwZSApCisgICAgICB7CisgICAgICBjYXNlIEtleVByZXNzOiAKKyAgICAgICAga2V5X251bWJlciA9IFhMb29rdXBTdHJpbmcoICZ4X2V2ZW50LnhrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlfYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mICgga2V5X2J1ZmZlciApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb21wb3NlICk7CisgICAgICAgIGtleV9jdXJzb3IgPSAwOworCisgICAgICAgIGlmICgga2V5X251bWJlciA9PSAwIHx8CisgICAgICAgICAgICAga2V5ID4gNTEyICAgICAgICkKKyAgICAgICAgeworICAgICAgICAgIC8qIHRoaXMgbWF5IGJlIGEgc3BlY2lhbCBrZXkgbGlrZSBGMSwgRjIsIGV0Yy4uICovCisgICAgICAgICAgZ3JrZXkgPSBLZXlTeW1Ub2dyS2V5KGtleSk7CisgICAgICAgICAgaWYgKGdya2V5ICE9IGdyS2V5Tm9uZSkKKyAgICAgICAgICAgIGdvdG8gU2V0X0tleTsgIAorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICBib29sX2V4aXQgPSAxOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBNYXBwaW5nTm90aWZ5OgorICAgICAgICBYUmVmcmVzaEtleWJvYXJkTWFwcGluZyggJnhfZXZlbnQueG1hcHBpbmcgKTsKKyAgICAgICAgYnJlYWs7CisgICAgICAKKyAgICAgIGNhc2UgRXhwb3NlOgorICAgICAgICByZWZyZXNoX3JlY3RhbmdsZSggc3VyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHhfZXZlbnQueGV4cG9zZS54LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgeF9ldmVudC54ZXhwb3NlLnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICB4X2V2ZW50LnhleHBvc2Uud2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB4X2V2ZW50LnhleHBvc2UuaGVpZ2h0ICk7CisgICAgICAgIGJyZWFrOworCisgICAgICAvKiBZb3Ugc2hvdWxkIGFkZCBtb3JlIGNhc2VzIHRvIGhhbmRsZSBtb3VzZSBldmVudHMsIGV0Yy4gKi8KKyAgICAgIH0KKyAgICB9CisKKyAgICBYRGVmaW5lQ3Vyc29yKCBkaXNwbGF5LCBzdXJmYWNlLT53aW4sIGJ1c3kgKTsKKyAgICBYRmx1c2ggICAgICAgKCBkaXNwbGF5ICk7CisKKyAgICAvKiBOb3csIHRyYW5zbGF0ZSB0aGUga2V5cHJlc3MgdG8gYSBncktleSAqLworICAgIC8qIElmIHRoaXMgd2Fzbid0IHBhcnQgb2YgdGhlIHNpbXBsZSB0cmFuc2xhdGVkIGtleXMsIHNpbXBseSBnZXQgdGhlIGNoYXJjb2RlICovCisgICAgLyogZnJvbSB0aGUgY2hhcmFjdGVyIGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBncmtleSA9IGdyS0VZKGtleV9idWZmZXJba2V5X2N1cnNvcisrXSk7CisgICAgICAKKyAgU2V0X0tleToKKyAgICBncmV2ZW50LT50eXBlID0gZ3Jfa2V5X2Rvd247CisgICAgZ3JldmVudC0+a2V5ICA9IGdya2V5OworICB9CisKKworCisKKyAgZ3JYU3VyZmFjZSogIGluaXRfc3VyZmFjZSggZ3JYU3VyZmFjZSogIHN1cmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyQml0bWFwKiAgICBiaXRtYXAgKQorICB7CisgICAgaW50ICAgICAgICBzY3JlZW47CisgICAgZ3JCaXRtYXAqICBpbWFnZTsKKyAgICBjaGFyICAgICAgIGdyYXlzOworICAgIFhEZXB0aCogICAgZm9ybWF0OworICAgIGludCAgICAgICAgaW1hZ2VfZGVwdGg7CisgICAgCisgICAgc2NyZWVuID0gRGVmYXVsdFNjcmVlbiggZGlzcGxheSApOworICAgIAorICAgIHN1cmZhY2UtPmNvbG9ybWFwID0gRGVmYXVsdENvbG9ybWFwKCBkaXNwbGF5LCBzY3JlZW4gKTsKKyAgICBzdXJmYWNlLT5kZXB0aCAgICA9IERlZmF1bHREZXB0aCggZGlzcGxheSwgc2NyZWVuICk7CisgICAgc3VyZmFjZS0+dmlzdWFsICAgPSBEZWZhdWx0VmlzdWFsKCBkaXNwbGF5LCBzY3JlZW4gKTsgCisKKyAgICBpbWFnZSAgPSAmc3VyZmFjZS0+aW1hZ2U7CisKKyAgICAvKiBmb3JjZSB0aGUgc3VyZmFjZSBpbWFnZSBkZXB0aCB0byAxIGlmIG5lY2Vzc2FyeSAqLworICAgIC8qIGFzIHRoaXMgc2hvdWxkIGJlIHN1cHBvcnRlZCBieSBhbGwgd2luZG93cyAgICAgICovCisgICAgaW1hZ2VfZGVwdGggPSBzdXJmYWNlLT5kZXB0aDsKKyAgICBpZiAoYml0bWFwLT5tb2RlID09IGdyX3BpeGVsX21vZGVfbW9ubykKKyAgICAgIGltYWdlX2RlcHRoID0gMTsKKworICAgIGdyYXlzID0gKCBiaXRtYXAtPm1vZGUgPT0gZ3JfcGl4ZWxfbW9kZV9ncmF5ICYmCisgICAgICAgICAgICAgIGJpdG1hcC0+Z3JheXMgPj0gMiApOworCisgICAgc3VyZmFjZS0+Z3JheSA9IGdyYXlzOworIAorICAgIC8qIGNvcHkgZGltZW5zaW9ucyAqLworICAgIGltYWdlLT53aWR0aCAgPSBiaXRtYXAtPndpZHRoOworICAgIGltYWdlLT5yb3dzICAgPSBiaXRtYXAtPnJvd3M7CisgICAgaW1hZ2UtPm1vZGUgICA9IGJpdG1hcC0+bW9kZTsKKyAgICBpbWFnZS0+cGl0Y2ggID0gMDsKKyAgICBpbWFnZS0+Z3JheXMgID0gMDsKKyAgICBpbWFnZS0+YnVmZmVyID0gMDsKKworICAgIC8qIGZpbmQgdGhlIHN1cHBvcnRlZCBmb3JtYXQgY29ycmVzcG9uZGluZyB0byB0aGUgcmVxdWVzdCAqLworICAgIGZvcm1hdCA9IDA7CisKKyAgICBpZiAoZ3JheXMpICAgIAorICAgIHsKKyAgICAgIC8qIGNob29zZSB0aGUgZGVmYXVsdCBkZXB0aCBpbiBjYXNlIG9mIGdyYXlzIHJlbmRlcmluZyAqLworICAgICAgaW50ICBpOworICAgICAgZm9yICggaSA9IDA7IGkgPCBudW1fcGl4ZWxfbW9kZXM7IGkrKyApCisgICAgICAgIGlmICggaW1hZ2VfZGVwdGggPT0gcGl4ZWxfZGVwdGhbaV0uZGVwdGggKQorICAgICAgICB7CisgICAgICAgICAgZm9ybWF0ID0gcGl4ZWxfZGVwdGggKyBpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBvdGhlcndpc2UsIHNlbGVjdCB0aGUgZm9ybWF0IGRlcGVuZGluZyBvbiB0aGUgcGl4ZWwgbW9kZSAqLworICAgICAgaW50ICBpOworICAgICAgCisgICAgICBmb3JtYXQgPSAwOworICAgICAgZm9yICggaSA9IDA7IGkgPCBudW1fcGl4ZWxfbW9kZXM7IGkrKyApCisgICAgICAgIGlmICggcGl4ZWxfbW9kZXNbaV0gPT0gYml0bWFwLT5tb2RlICkKKyAgICAgICAgeworICAgICAgICAgIGZvcm1hdCA9IHBpeGVsX2RlcHRoICsgaTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBpZiAoIWZvcm1hdCkKKyAgICB7CisgICAgICBnckVycm9yID0gZ3JfZXJyX2JhZF9hcmd1bWVudDsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworCisgICAgLyogY29ycmVjdCBzdXJmYWNlLmRlcHRoLiBUaGlzIGlzIHJlcXVpcmVkIGJlY2F1c2UgaW4gdGhlIGNhc2UgICAgKi8KKyAgICAvKiBvZiAzMi1iaXRzIHBpeGVscywgdGhlIHZhbHVlIG9mICJmb3JtYXQuZGVwdGgiIGlzIDI0IHVuZGVyIFgxMSAqLworICAgIGlmICggZm9ybWF0LT5kZXB0aCAgICAgICAgICA9PSAyNCAmJgorICAgICAgICAgZm9ybWF0LT5iaXRzX3Blcl9waXhlbCA9PSAzMiApCisgICAgICBpbWFnZV9kZXB0aCA9IDMyOworICAgICAKKyAgICAvKiBhbGxvY2F0ZSBzdXJmYWNlIGltYWdlICovCisgICAgeworICAgICAgaW50ICBiaXRzLCBvdmVyOworCisgICAgICBiaXRzID0gaW1hZ2UtPndpZHRoICogZm9ybWF0LT5iaXRzX3Blcl9waXhlbDsKKyAgICAgIG92ZXIgPSBiaXRzICUgZm9ybWF0LT5zY2FubGluZV9wYWQ7CisgICAgICAgICAgCisgICAgICBpZiAob3ZlcikKKyAgICAgICAgYml0cyArPSBmb3JtYXQtPnNjYW5saW5lX3BhZCAtIG92ZXI7CisgICAgICAKKyAgICAgIGlmICghZ3JheXMpCisgICAgICB7CisgICAgICAgIGltYWdlLT53aWR0aCAgPSBiaXRzOworICAgICAgICBiaXRtYXAtPndpZHRoID0gYml0czsKKyAgICAgIH0KKyAgICAgIGltYWdlLT5waXRjaCAgPSBiaXRzID4+IDM7CisgICAgfQorCisgICAgaW1hZ2UtPmJ1ZmZlciA9IGdyQWxsb2MoIGltYWdlLT5waXRjaCAqIGltYWdlLT5yb3dzICk7CisgICAgaWYgKCFpbWFnZS0+YnVmZmVyKSByZXR1cm4gMDsKKworICAgIC8qIG5vdywgYWxsb2NhdGUgYSBncmF5IHBhbDggcGl4bWFwLCBvbmx5IHdoZW4gd2UgYXNrZWQgKi8KKyAgICAvKiBmb3IgYW4gOC1iaXQgcGl4bWFwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgaWYgKCBncmF5cyApCisgICAgeworICAgICAgLyogcGFkIHBpdGNoIHRvIDMyIGJpdHMgKi8KKyAgICAgIGJpdG1hcC0+cGl0Y2ggID0gKGJpdG1hcC0+d2lkdGggKyAzKSAmIC00OworICAgICAgYml0bWFwLT5idWZmZXIgPSBnckFsbG9jKCBiaXRtYXAtPnBpdGNoICogYml0bWFwLT5yb3dzICk7CisgICAgICBpZiAoIWJpdG1hcC0+YnVmZmVyKQorICAgICAgICBQYW5pYyggImdyWDExOiBjb3VsZCBub3QgYWxsb2NhdGUgc3VyZmFjZSBiaXRtYXAhXG4iICk7CisgICAgfQorICAgIGVsc2UgIC8qIG90aGVyd2lzZSAqLworICAgIHsKKyAgICAgICpiaXRtYXAgPSAqaW1hZ2U7CisgICAgfQorCisgICAgc3VyZmFjZS0+cm9vdC5iaXRtYXAgPSAqYml0bWFwOworIAorICAgIC8qIE5vdyBjcmVhdGUgdGhlIHN1cmZhY2UgWDExIGltYWdlICovCisgICAgc3VyZmFjZS0+eGltYWdlID0gWENyZWF0ZUltYWdlKCBkaXNwbGF5LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cmZhY2UtPnZpc3VhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdC0+ZGVwdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQtPmRlcHRoID09IDEgPyBYWUJpdG1hcCA6IFpQaXhtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIqKWltYWdlLT5idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZS0+d2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZS0+cm93cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICk7CisgICAgaWYgKCAhc3VyZmFjZS0+eGltYWdlICkKKyAgICAgIFBhbmljKCAiZ3JYMTE6IGNhbm5vdCBjcmVhdGUgc3VyZmFjZSBYMTEgaW1hZ2VcbiIgKTsKKyAKKworICAgIC8qIGFsbG9jYXRlIGdyYXkgbGV2ZWxzIGluIHRoZSBjYXNlIG9mIGdyYXkgc3VyZmFjZSAqLworICAgIGlmICggZ3JheXMgKQorICAgIHsKKyAgICAgIFhDb2xvciogIGNvbG9yID0gc3VyZmFjZS0+Y29sb3I7CisgICAgICBpbnQgICAgICBpOworICAgICAgCisgICAgICBmb3IgKCBpID0gMDsgaSA8IGJpdG1hcC0+Z3JheXM7IGkrKywgY29sb3IrKyApCisgICAgICB7CisgICAgICAgIGNvbG9yLT5yZWQgICA9CisgICAgICAgIGNvbG9yLT5ncmVlbiA9CisgICAgICAgIGNvbG9yLT5ibHVlICA9IDY1NTM1IC0gKCBpICogNjU1MzUgKSAvIGJpdG1hcC0+Z3JheXM7CisgIAorICAgICAgICBpZiAoICFYQWxsb2NDb2xvciggZGlzcGxheSwgc3VyZmFjZS0+Y29sb3JtYXAsIGNvbG9yICkgKQorICAgICAgICAgIFBhbmljKCAiRVJST1I6IGNhbm5vdCBhbGxvY2F0ZSBDb2xvclxuIiApOworICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmICggaW1hZ2VfZGVwdGggPT0gMSApCisgICAgeworICAgICAgc3VyZmFjZS0+eGltYWdlLT5ieXRlX29yZGVyICAgICAgID0gTVNCRmlyc3Q7CisgICAgICBzdXJmYWNlLT54aW1hZ2UtPmJpdG1hcF9iaXRfb3JkZXIgPSBNU0JGaXJzdDsKKyAgICB9CisKKyAgICB7CisgICAgICAgIFhUZXh0UHJvcGVydHkgICAgICAgICB4dHA7CisgICAgICAgIFhTaXplSGludHMgICAgICAgICAgICB4c2g7CisgICAgICAgIFhTZXRXaW5kb3dBdHRyaWJ1dGVzICB4c3dhOworICAgIAorICAgICAgICB4c3dhLmJvcmRlcl9waXhlbCAgICAgPSBCbGFja1BpeGVsKCBkaXNwbGF5LCBzY3JlZW4gKTsKKyAgICAgICAgeHN3YS5iYWNrZ3JvdW5kX3BpeGVsID0gV2hpdGVQaXhlbCggZGlzcGxheSwgc2NyZWVuICk7CisgICAgICAgIHhzd2EuY3Vyc29yICAgICAgICAgICA9IGJ1c3k7CisgICAgCisgICAgICAgIHhzd2EuZXZlbnRfbWFzayA9IEtleVByZXNzTWFzayB8IEV4cG9zdXJlTWFzazsKKyAgICAKKyAgICAgICAgc3VyZmFjZS0+d2luID0gWENyZWF0ZVdpbmRvdyggZGlzcGxheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUm9vdFdpbmRvdyggZGlzcGxheSwgc2NyZWVuICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlLT53aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2UtPnJvd3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXJmYWNlLT5kZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXRPdXRwdXQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXJmYWNlLT52aXN1YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENXQmFja1BpeGVsIHwgQ1dCb3JkZXJQaXhlbCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1dFdmVudE1hc2sgfCBDV0N1cnNvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnhzd2EgKTsKKyAgICAKKyAgICAgICAgWE1hcFdpbmRvdyggZGlzcGxheSwgc3VyZmFjZS0+d2luICk7CisgCisgICAgICAgIHN1cmZhY2UtPmdjID0gWENyZWF0ZUdDKCBkaXNwbGF5LCBSb290V2luZG93KCBkaXNwbGF5LCBzY3JlZW4gKSwgMEwsIE5VTEwgKTsKKyAgICAgICAgWFNldEZvcmVncm91bmQoIGRpc3BsYXksIHN1cmZhY2UtPmdjLCB4c3dhLmJvcmRlcl9waXhlbCAgICAgKTsKKyAgICAgICAgWFNldEJhY2tncm91bmQoIGRpc3BsYXksIHN1cmZhY2UtPmdjLCB4c3dhLmJhY2tncm91bmRfcGl4ZWwgKTsKKyAgICAKKyAgICAKKyAgICAgICAgLyogbWFrZSB3aW5kb3cgbWFuYWdlciBoYXBweSA6LSkgKi8KKyAgICAgICAgeHRwLnZhbHVlICAgID0gKHVuc2lnbmVkIGNoYXIqKSJGcmVlVHlwZSI7CisgICAgICAgIHh0cC5lbmNvZGluZyA9IDMxOworICAgICAgICB4dHAuZm9ybWF0ICAgPSA4OworICAgICAgICB4dHAubml0ZW1zICAgPSBzdHJsZW4oIChjaGFyKil4dHAudmFsdWUgKTsKKyAgICAKKyAgICAgICAgeHNoLnggPSAwOworICAgICAgICB4c2gueSA9IDA7CisgICAgCisgICAgICAgIHhzaC53aWR0aCAgPSBpbWFnZS0+d2lkdGg7CisgICAgICAgIHhzaC5oZWlnaHQgPSBpbWFnZS0+cm93czsKKyAgICAgICAgeHNoLmZsYWdzICA9IChQUG9zaXRpb24gfCBQU2l6ZSk7CisgICAgICAgIHhzaC5mbGFncyAgPSAwOworICAgIAorICAgICAgICBYU2V0V01Qcm9wZXJ0aWVzKCBkaXNwbGF5LCBzdXJmYWNlLT53aW4sICZ4dHAsICZ4dHAsIE5VTEwsIDAsICZ4c2gsIE5VTEwsIE5VTEwgKTsKKyAgICB9CisgICAgCisgICAgc3VyZmFjZS0+cm9vdC5kb25lICAgICAgICAgPSAoZ3JEb25lU3VyZmFjZUZ1bmMpIGRvbmVfc3VyZmFjZTsKKyAgICBzdXJmYWNlLT5yb290LnJlZnJlc2hfcmVjdCA9IChnclJlZnJlc2hSZWN0RnVuYykgcmVmcmVzaF9yZWN0YW5nbGU7CisgICAgc3VyZmFjZS0+cm9vdC5zZXRfdGl0bGUgICAgPSAoZ3JTZXRUaXRsZUZ1bmMpICAgIHNldF90aXRsZTsKKyAgICBzdXJmYWNlLT5yb290Lmxpc3Rlbl9ldmVudCA9IChnckxpc3RlbkV2ZW50RnVuYykgbGlzdGVuX2V2ZW50OworICAgIAorICAgIGNvbnZlcnRfcmVjdGFuZ2xlKCBzdXJmYWNlLCAwLCAwLCBiaXRtYXAtPndpZHRoLCBiaXRtYXAtPnJvd3MgKTsKKyAgICByZXR1cm4gc3VyZmFjZTsKKyAgfQorICAKKworCisKKyAgZ3JEZXZpY2UgIGdyX3gxMV9kZXZpY2UgPQorICB7CisgICAgc2l6ZW9mKCBnclhTdXJmYWNlICksCisgICAgIngxMSIsCisgICAgCisgICAgaW5pdF9kZXZpY2UsCisgICAgZG9uZV9kZXZpY2UsCisgICAgCisgICAgKGdyRGV2aWNlSW5pdFN1cmZhY2VGdW5jKSBpbml0X3N1cmZhY2UsCisgICAgCisgICAgMCwKKyAgICAwCisgICAgCisgIH07CisKKyNpZmRlZiBURVNUCisKK3R5cGVkZWYgc3RydWN0IGdyS2V5TmFtZQoreworICBncktleSAgICAgICBrZXk7CisgIGNvbnN0IGNoYXIqIG5hbWU7CisKK30gZ3JLZXlOYW1lOworCisKK3N0YXRpYworY29uc3QgZ3JLZXlOYW1lICBrZXlfbmFtZXNbXSA9Cit7CisgIHsgZ3JLZXlGMSwgICAiRjEiICB9LAorICB7IGdyS2V5RjIsICAgIkYyIiAgfSwKKyAgeyBncktleUYzLCAgICJGMyIgIH0sCisgIHsgZ3JLZXlGNCwgICAiRjQiICB9LAorICB7IGdyS2V5RjUsICAgIkY1IiAgfSwKKyAgeyBncktleUY2LCAgICJGNiIgIH0sCisgIHsgZ3JLZXlGNywgICAiRjciICB9LAorICB7IGdyS2V5RjgsICAgIkY4IiAgfSwKKyAgeyBncktleUY5LCAgICJGOSIgIH0sCisgIHsgZ3JLZXlGMTAsICAiRjEwIiB9LAorICB7IGdyS2V5RjExLCAgIkYxMSIgfSwKKyAgeyBncktleUYxMiwgICJGMTIiIH0sCisgIHsgZ3JLZXlFc2MsICAiRXNjIiB9LAorICB7IGdyS2V5SG9tZSwgIkhvbWUiIH0sCisgIHsgZ3JLZXlFbmQsICAiRW5kIiAgfSwKKyAgICAKKyAgeyBncktleVBhZ2VVcCwgICAiUGFnZV9VcCIgfSwKKyAgeyBncktleVBhZ2VEb3duLCAiUGFnZV9Eb3duIiB9LAorICB7IGdyS2V5TGVmdCwgICAgICJMZWZ0IiB9LAorICB7IGdyS2V5UmlnaHQsICAgICJSaWdodCIgfSwKKyAgeyBncktleVVwLCAgICAgICAiVXAiIH0sCisgIHsgZ3JLZXlEb3duLCAgICAgIkRvd24iIH0sCisgIHsgZ3JLZXlCYWNrU3BhY2UsICJCYWNrU3BhY2UiIH0sCisgIHsgZ3JLZXlSZXR1cm4sICAgIlJldHVybiIgfQorfTsKKworaW50ICBtYWluKCB2b2lkICkKK3sKKyAgZ3JTdXJmYWNlKiAgc3VyZmFjZTsKKyAgaW50ICAgICAgICAgbjsKKyAgCisgIGdySW5pdCgpOworICBzdXJmYWNlID0gZ3JOZXdTY3JlZW5TdXJmYWNlKCAwLCBncl9waXhlbF9tb2RlX2dyYXksIDMyMCwgNDAwLCAxMjggKTsKKyAgaWYgKCFzdXJmYWNlKQorICAgIFBhbmljKCJDb3VsZCBub3QgY3JlYXRlIHdpbmRvd1xuIiApOworICBlbHNlCisgIHsKKyAgICBnckNvbG9yICAgICAgY29sb3I7CisgICAgZ3JFdmVudCAgICAgIGV2ZW50OworICAgIGNvbnN0IGNoYXIqICBzdHJpbmc7CisgICAgaW50ICAgICAgICAgIHg7CisgICAgCisgICAgZ3JTZXRTdXJmYWNlUmVmcmVzaCggc3VyZmFjZSwgMSApOworICAgIGdyU2V0VGl0bGUoc3VyZmFjZSwiWDExIGRyaXZlciBkZW1vbnN0cmF0aW9uIiApOworICAgIAorICAgIGZvciAoIHggPSAtMTA7IHggPCAxMDsgeCsrICkKKyAgICB7CisgICAgICBmb3IgKCBuID0gMDsgbiA8IDEyODsgbisrICkKKyAgICAgIHsKKyAgICAgICAgY29sb3IudmFsdWUgPSAobiozKSAmIDEyNzsKKyAgICAgICAgZ3JXcml0ZUNlbGxDaGFyKCBzdXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHggKyAoKG4gJSA2MCkgPDwgMyksCisgICAgICAgICAgICAgICAgICAgICAgICAgODAgKyAoeCsxMCkqOCozICsgKChuLzYwKSA8PCAzKSwgbiwgY29sb3IgKTsKKyAgICAgIH0KKworICAgIH0KKyAgICBjb2xvci52YWx1ZSA9IDY0OworICAgIGdyV3JpdGVDZWxsU3RyaW5nKCBzdXJmYWNlLCAwLCAwLCAianVzdCBhbiBleGFtcGxlIiwgY29sb3IgKTsKKyAgICAKKyAgICBkbworICAgIHsKKyAgICAgIGxpc3Rlbl9ldmVudCgoZ3JYU3VyZmFjZSopc3VyZmFjZSwgMCwgJmV2ZW50KTsKKyAgICAKKyAgICAgIC8qIHJldHVybiBpZiBFU0Mgd2FzIHByZXNzZWQgKi8KKyAgICAgIGlmICggZXZlbnQua2V5ID09IGdyS2V5RXNjICkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICAKKyAgICAgIC8qIG90aGVyd2lzZSwgZGlzcGxheSBrZXkgc3RyaW5nICovCisgICAgICBjb2xvci52YWx1ZSA9IChjb2xvci52YWx1ZSArIDgpICYgMTI3OworICAgICAgeworICAgICAgICBpbnQgICAgICAgICBjb3VudCA9IHNpemVvZihrZXlfbmFtZXMpL3NpemVvZihrZXlfbmFtZXNbMF0pOworICAgICAgICBncktleU5hbWUqICBuYW1lICA9IGtleV9uYW1lczsKKyAgICAgICAgZ3JLZXlOYW1lKiAgbGltaXQgPSBuYW1lICsgY291bnQ7CisgICAgICAgIGNvbnN0IGNoYXIqIGtuYW1lICA9IDA7CisgICAgICAgIGNoYXIgICAgICAgIGtuYW1lX3RlbXBbMTZdOworICAgICAgCisgICAgICAgIHdoaWxlIChuYW1lIDwgbGltaXQpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoIG5hbWUtPmtleSA9PSBldmVudC5rZXkgKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGtuYW1lID0gbmFtZS0+bmFtZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBuYW1lKys7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgICBpZiAoIWtuYW1lKQorICAgICAgICB7CisgICAgICAgICAgc3ByaW50Zigga25hbWVfdGVtcCwgImNoYXIgJyVjJyIsIChjaGFyKWV2ZW50LmtleSApOworICAgICAgICAgIGtuYW1lID0ga25hbWVfdGVtcDsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgZ3JXcml0ZUNlbGxTdHJpbmcoIHN1cmZhY2UsIDMwLCAzMCwga25hbWUsIGNvbG9yICk7CisgICAgICAgIGdyUmVmcmVzaFN1cmZhY2Uoc3VyZmFjZSk7CisgICAgICAgIHBhaW50X3JlY3RhbmdsZSggc3VyZmFjZSwgMCwgMCwgc3VyZmFjZS0+Yml0bWFwLndpZHRoLCBzdXJmYWNlLT5iaXRtYXAucm93cyApOworICAgICAgfQorICAgIH0gd2hpbGUgKDEpOworICB9CisgICAgCisgIHJldHVybiAwOworICAKKyAgCit9CisjZW5kaWYgLyogVEVTVCAqLworCmRpZmYgLS1naXQgYS9kZW1vcy9jb25maWcveDExL2dyeDExLmggYi9kZW1vcy9jb25maWcveDExL2dyeDExLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q3NzExMgotLS0gL2Rldi9udWxsCisrKyBiL2RlbW9zL2NvbmZpZy94MTEvZ3J4MTEuaApAQCAtMCwwICsxLDI0IEBACisjaWZuZGVmIEdSWDExX0gKKyNkZWZpbmUgR1JYMTFfSAorCisjaW5jbHVkZSAiZ3JvYmpzLmgiCisjaW5jbHVkZSAiZ3JkZXZpY2UuaCIKKworICBleHRlcm4KKyAgZ3JEZXZpY2UgIGdyX3gxMV9kZXZpY2U7CisKKyNpZmRlZiBHUl9JTklUX0JVSUxECisgIHN0YXRpYworICBnckRldmljZUNoYWluICBncl94MTFfZGV2aWNlX2NoYWluID0KKyAgeworICAgICJ4MTEiLAorICAgICZncl94MTFfZGV2aWNlLAorICAgIEdSX0lOSVRfREVWSUNFX0NIQUlOCisgIH07CisKKyN1bmRlZiBHUl9JTklUX0RFVklDRV9DSEFJTgorI2RlZmluZSBHUl9JTklUX0RFVklDRV9DSEFJTiAgJmdyX3gxMV9kZXZpY2VfY2hhaW4KKworI2VuZGlmICAvKiBHUl9JTklUX0JVSUxEICovCisKKyNlbmRpZiAvKiBHUlgxMV9IICovCmRpZmYgLS1naXQgYS9kZW1vcy9jb25maWcveDExL3J1bGVzLm1rIGIvZGVtb3MvY29uZmlnL3gxMS9ydWxlcy5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTYxNmU5Ci0tLSAvZGV2L251bGwKKysrIGIvZGVtb3MvY29uZmlnL3gxMS9ydWxlcy5tawpAQCAtMCwwICsxLDY5IEBACisjKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyMqCisjKiAgWDExLXNwZWNpZmljIHJ1bGVzIGZpbGVzLCB1c2VkIHRvIGNvbXBpbGUgdGhlIFgxMSBncmFwaGljcyBkcml2ZXIKKyMqICB3aGVuIHN1cHBvcnRlZCBieSB0aGUgY3VycmVudCBwbGF0Zm9ybQorIyoKKyMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIFRyeSB0byBkZXRlY3QgYW4gWDExIHNldHVwLgorIworIyBXZSBzaW1wbHkgdHJ5IHRvIGRldGVjdCBhIGBYMTFSNi9iaW4nLCBgWDExUjUvYmluJyBvciBgWDExL2JpbicgaW4KKyMgdGhlIGN1cnJlbnQgcGF0aC4KKyMKK2lmbmVxICgkKGZpbmRzdHJpbmcgWDExUjYkKFNFUCliaW4sJChQQVRIKSksKQoreHZlcnNpb24gOj0gWDExUjYKK2VuZGlmCisKK2lmbmVxICgkKGZpbmRzdHJpbmcgWDExUjUkKFNFUCliaW4sJChQQVRIKSksKQoreHZlcnNpb24gOj0gWDExUjUKK2VuZGlmCisKK2lmbmVxICgkKGZpbmRzdHJpbmcgWDExJChTRVApYmluLCQoUEFUSCkpLCkKK3h2ZXJzaW9uIDo9IFgxMQorZW5kaWYKKworaWZkZWYgeHZlcnNpb24KK1gxMV9QQVRIIDo9ICQoc3Vic3QgOywgLCQoUEFUSCkpICQoc3Vic3QgOiwgLCQoUEFUSCkpCitYMTFfUEFUSCA6PSAkKGZpbHRlciAlJCh4dmVyc2lvbikkKFNFUCliaW4sJChYMTFfUEFUSCkpCitYMTFfUEFUSCA6PSAkKFgxMV9QQVRIOiUkKFNFUCliaW49JSkKK2VuZGlmCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIFVwZGF0ZSBzb21lIHZhcmlhYmxlcyB0byBjb21waWxlIHRoZSBYMTEgZ3JhcGhpY3MgbW9kdWxlLiBOb3RlIHRoYXQKKyMgWDExIGlzIGF2YWlsYWJsZSBvbiBVbml4LCBvciBvbiBPUy8yLiBIb3dldmVyLCBpdCBvbmx5IGNvbXBpbGVzIHdpdGgKKyMgZ2NjIG9uIHRoZSBsYXR0ZXIgcGxhdGZvcm0sIHdoaWNoIGlzIHdoeSBpdCBpcyBzYWZlIHRvIHVzZSB0aGUgZmxhZ3MKKyMgYC1MJyBhbmQgYC1sJworIworaWZuZXEgKCQoWDExX1BBVEgpLCkKKworWDExX0lOQ0xVREUgICAgOj0gJChYMTFfUEFUSCkkKFNFUClpbmNsdWRlCitYMTFfTElCICAgICAgICA6PSAkKFgxMV9QQVRIKSQoU0VQKWxpYgorCisjIHRoZSBHUkFQSF9MSU5LIHZhcmlhYmxlIGlzIGV4cGFuZGVkIGVhY2ggdGltZSBhbiBleGVjdXRhYmxlIGlzIGxpbmtlZCBhZ2FpbnN0CisjIHRoZSBncmFwaGljcyBsaWJyYXJ5Li4KKyMKK0dSQVBIX0xJTksgICAgICs9IC1MJChYMTFfTElCKSAtbFgxMQorCisjIGFkZCB0aGUgWDExIGRyaXZlciBvYmplY3QgZmlsZSB0byB0aGUgZ3JhcGhpY3MgbGlicmFyeQorIworR1JBUEhfT0JKUyArPSAkKE9CSl8pZ3J4MTEuJE8KKworR1JfWDExICA6PSBjb25maWckKFNFUCl4MTEKK0dSX1gxMV8gOj0gJChHUl9YMTEpJChTRVApCisKK0RFVklDRVMgICAgICAgICArPSBYMTEKK0RFVklDRV9JTkNMVURFUyArPSAkKEdSX1gxMSkKKworIyB0aGUgcnVsZSB1c2VkIHRvIGNvbXBpbGUgdGhlIFgxMSBkcml2ZXIKKyMKKyQoT0JKXylncngxMS4kTzogJChHUl9YMTFfKWdyeDExLmMgJChHUl9YMTFfKWdyeDExLmgKKwkkKENDKSAkKENGTEFHUykgJChHUkFQSF9JTkNMVURFUzolPSRJJSkgJEkkKEdSX1gxMSkgXAorICAgICAgICAgICAgICAkKFgxMV9JTkNMVURFOiU9JEklKSAkVCRAICQ8CitlbmRpZgorCisKKworCmRpZmYgLS1naXQgYS9kZW1vcy9ncmFwaC9ncG1fb3MyLmRlZiBiL2RlbW9zL2dyYXBoL2dwbV9vczIuZGVmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhNzdjNjMKLS0tIC9kZXYvbnVsbAorKysgYi9kZW1vcy9ncmFwaC9ncG1fb3MyLmRlZgpAQCAtMCwwICsxLDUgQEAKK05BTUUgICAgICAgIFdJTkRPV0NPTVBBVAorCitERVNDUklQVElPTiAnRnJlZVR5cGUgR3JhcGhpY3MnCitIRUFQU0laRSAgICA4MTkyCitTVEFDS1NJWkUgICA0MDg4OApkaWZmIC0tZ2l0IGEvZGVtb3MvZ3JhcGgvZ3JhcGguaCBiL2RlbW9zL2dyYXBoL2dyYXBoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTVmM2IzMgotLS0gL2Rldi9udWxsCisrKyBiL2RlbW9zL2dyYXBoL2dyYXBoLmgKQEAgLTAsMCArMSw2MzIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgZ3JhcGguaAorICoKKyAqICAgIEdyYXBoaWNzIFN1YnN5c3RlbSBpbnRlcmZhY2UKKyAqCisgKiAgQ29weXJpZ2h0IDE5OTkgLSBUaGUgRnJlZVR5cGUgRGV2ZWxvcG1lbnQgVGVhbSAtIHd3dy5mcmVldHlwZS5vcmcKKyAqCisgKgorICoKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIEdSQVBIX0gKKyNkZWZpbmUgR1JBUEhfSAorCisjaW5jbHVkZSAiZ3JldmVudHMuaCIKKworIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIC8qKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqLworIC8qKioqKioqKiAgICAgICAgIEdFTkVSQUwgREVGSU5JVElPTlMgQU5EIEJMSVRUSU5HIFJPVVRJTkVTICAgICAgICoqKioqKioqLworIC8qKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqLworIC8qKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqLworIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyAgLyogZGVmaW5lIHRoZSBnbG9iYWwgZXJyb3IgdmFyaWFibGUgKi8KKyAgZXh0ZXJuIGludCAgZ3JFcnJvcjsKKworICAvKiBpbml0aWFsaXNhdGlvbiAqLworICBleHRlcm4gaW50ICBnckluaXQoIHZvaWQgKTsKKyAgCisgIC8qIGZpbmFsaXNhdGlvbiAqLworICBleHRlcm4gdm9pZCBnckRvbmUoIHZvaWQgKTsKKworCisgIC8qIHBpeGVsIG1vZGUgY29uc3RhbnRzICovCisgIHR5cGVkZWYgZW51bSBnclBpeGVsTW9kZQorICB7CisgICAgZ3JfcGl4ZWxfbW9kZV9ub25lID0gMCwKKyAgICBncl9waXhlbF9tb2RlX21vbm8sICAgICAgICAvKiBtb25vY2hyb21lIGJpdG1hcHMgICAgICAgICAgICAgICAqLworICAgIGdyX3BpeGVsX21vZGVfcGFsNCwgICAgICAgIC8qIDQtYml0IHBhbGV0dGVkIC0gMTYgY29sb3JzICAgICAgICovCisgICAgZ3JfcGl4ZWxfbW9kZV9wYWw4LCAgICAgICAgLyogOC1iaXQgcGFsZXR0ZWQgLSAyNTYgY29sb3JzICAgICAgKi8KKyAgICBncl9waXhlbF9tb2RlX2dyYXksICAgICAgICAvKiA4LWJpdCBncmF5IGxldmVscyAgICAgICAgICAgICAgICAqLworICAgIGdyX3BpeGVsX21vZGVfcmdiNTU1LCAgICAgIC8qIDE1LWJpdHMgbW9kZSAtIDMyNzY4IGNvbG9ycyAgICAgICovCisgICAgZ3JfcGl4ZWxfbW9kZV9yZ2I1NjUsICAgICAgLyogMTYtYml0cyBtb2RlIC0gNjU1MzYgY29sb3JzICAgICAgKi8KKyAgICBncl9waXhlbF9tb2RlX3JnYjI0LCAgICAgICAvKiAyNC1iaXRzIG1vZGUgLSAxNiBtaWxsaW9uIGNvbG9ycyAqLworICAgIGdyX3BpeGVsX21vZGVfcmdiMzIsICAgICAgIC8qIDMyLWJpdHMgbW9kZSAtIDE2IG1pbGxpb24gY29sb3JzICovCisKKyAgICBncl9waXhlbF9tb2RlX21heCAgICAgICAgICAvKiBkb24ndCByZW1vdmUgKi8KKyAgCisgIH0gZ3JQaXhlbE1vZGU7CisKKworICAvKiBmb3J3YXJkIGRlY2xhcmF0aW9uIG9mIHRoZSBzdXJmYWNlIGNsYXNzICovCisgIHR5cGVkZWYgc3RydWN0IGdyU3VyZmFjZV8gICAgIGdyU3VyZmFjZTsKKyAgCisKKyAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICoKKyAgKiA8U3RydWN0PgorICAqICAgZ3JCaXRtYXAKKyAgKgorICAqIDxEZXNjcmlwdGlvbj4KKyAgKiAgIGEgc2ltcGxlIGJpdG1hcCBkZXNjcmlwdG9yCisgICoKKyAgKiA8RmllbGRzPgorICAqICAgcm93cyAgIDo6IGhlaWdodCBpbiBwaXhlbHMKKyAgKiAgIHdpZHRoICA6OiB3aWR0aCBpbiBwaXhlbHMKKyAgKiAgIHBpdGNoICA6OiArIG9yIC0gdGhlIG51bWJlciBvZiBieXRlcyBwZXIgcm93CisgICogICBtb2RlICAgOjogcGl4ZWwgbW9kZSBvZiBiaXRtYXAgYnVmZmVyCisgICogICBncmF5cyAgOjogbnVtYmVyIG9mIGdyYXlzIGluIHBhbGV0dGUgZm9yIFBBTDggbW9kZS4gMCBvdGhlcndpc2UKKyAgKiAgIGJ1ZmZlciA6OiBwb2ludGVyIHRvIHBpeGVsIGJ1ZmZlcgorICAqCisgICogPE5vdGU+CisgICogICB0aGUgJ3BpdGNoJyBpcyBwb3NpdGl2ZSBmb3IgZG93bndhcmQgZmxvd3MsIGFuZCBuZWdhdGl2ZSBvdGhlcndpc2UKKyAgKiAgIEl0cyBhYnNvbHV0ZSB2YWx1ZSBpcyBhbHdheXMgdGhlIG51bWJlciBvZiBieXRlcyB0YWtlbiBieSBlYWNoCisgICogICBiaXRtYXAgcm93LgorICAqCisgICogICBBbGwgZHJhd2luZyBvcGVyYXRpb25zIHdpbGwgYmUgcGVyZm9ybWVkIHdpdGhpbiB0aGUgZmlyc3QKKyAgKiAgICJ3aWR0aCIgcGl4ZWxzIG9mIGVhY2ggcm93IChjbGlwcGluZyBpcyBhbHdheXMgcGVyZm9ybWVkKS4KKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICB0eXBlZGVmIHN0cnVjdCBnckJpdG1hcF8KKyAgeworICAgIGludCAgICAgICAgICByb3dzOworICAgIGludCAgICAgICAgICB3aWR0aDsKKyAgICBpbnQgICAgICAgICAgcGl0Y2g7CisgICAgZ3JQaXhlbE1vZGUgIG1vZGU7CisgICAgaW50ICAgICAgICAgIGdyYXlzOworICAgIGNoYXIqICAgICAgICBidWZmZXI7CisKKyAgfSBnckJpdG1hcDsKKworCisKKyAgdHlwZWRlZiBsb25nICAgZ3JQb3M7CisgIHR5cGVkZWYgY2hhciAgIGdyQm9vbDsKKworICB0eXBlZGVmIHN0cnVjdCBnclZlY3Rvcl8KKyAgeworICAgIGdyUG9zICB4OworICAgIGdyUG9zICB5OworICAgIAorICB9IGdyVmVjdG9yOworCisKKyAgdHlwZWRlZiB1bmlvbiBnckNvbG9yXworICB7CisgICAgbG9uZyAgICAgICAgICAgdmFsdWU7CisgICAgdW5zaWduZWQgY2hhciAgY2hyb21hWzRdOworICAgIAorICB9IGdyQ29sb3I7CisKKworCisgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKgorICAqIDxGdW5jdGlvbj4KKyAgKiAgICBnck5ld0JpdG1hcAorICAqCisgICogPERlc2NyaXB0aW9uPgorICAqICAgIGNyZWF0ZXMgYSBuZXcgYml0bWFwICAgIAorICAqCisgICogPElucHV0PgorICAqICAgIHBpeGVsX21vZGUgICA6OiB0aGUgdGFyZ2V0IHN1cmZhY2UncyBwaXhlbF9tb2RlCisgICogICAgbnVtX2dyYXlzICAgIDo6IG51bWJlciBvZiBncmF5cyBsZXZlbHMgZm9yIFBBTDggcGl4ZWwgbW9kZQorICAqICAgIHdpZHRoICAgICAgICA6OiB3aWR0aCBpbiBwaXhlbHMKKyAgKiAgICBoZWlnaHQgICAgICAgOjogaGVpZ2h0IGluIHBpeGVscworICAqCisgICogPE91dHB1dD4KKyAgKiAgICBiaXQgICAgICAgICAgOjogZGVzY3JpcHRvciBvZiB0aGUgbmV3IGJpdG1hcAorICAqCisgICogPFJldHVybj4KKyAgKiAgICBFcnJvciBjb2RlLiAwIG1lYW5zIHN1Y2Nlc3MuCisgICoKKyAgKiA8Tm90ZT4KKyAgKiAgICBUaGlzIGZ1bmN0aW9uIHJlYWxseSBhbGxvY2F0ZXMgYSBwaXhlbCBidWZmZXIsIHplcm8gaXQsIHRoZW4KKyAgKiAgICByZXR1cm5zIGEgZGVzY3JpcHRvciBmb3IgaXQuCisgICoKKyAgKiAgICBDYWxsIGdyRG9uZUJpdG1hcCB3aGVuIHlvdSdyZSBkb25lIHdpdGggaXQuLgorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgZXh0ZXJuICBpbnQgIGdyTmV3Qml0bWFwKCBnclBpeGVsTW9kZSAgcGl4ZWxfbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgbnVtX2dyYXlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyQml0bWFwICAgICpiaXQgKTsKKworCisgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKgorICAqIDxGdW5jdGlvbj4KKyAgKiAgICBnckJsaXRHbHlwaFRvQml0bWFwCisgICoKKyAgKiA8RGVzY3JpcHRpb24+CisgICogICAgd3JpdGVzIGEgZ2l2ZW4gZ2x5cGggYml0bWFwIHRvIGEgdGFyZ2V0IHN1cmZhY2UuCisgICoKKyAgKiA8SW5wdXQ+CisgICogICAgdGFyZ2V0ICA6OiBoYW5kbGUgdG8gdGFyZ2V0IGJpdG1hcCAKKyAgKiAgICBnbHlwaCAgIDo6IGhhbmRsZSB0byBzb3VyY2UgZ2x5cGggYml0bWFwCisgICogICAgeCAgICAgICA6OiBwb3NpdGlvbiBvZiBsZWZ0LW1vc3QgcGl4ZWwgb2YgZ2x5cGggaW1hZ2UgaW4gdGFyZ2V0IHN1cmZhY2UKKyAgKiAgICB5ICAgICAgIDo6IHBvc2l0aW9uIG9mIHRvcC1tb3N0IHBpeGVsIG9mIGdseXBoIGltYWdlIGluIHRhcmdldCBzdXJmYWNlCisgICogICAgY29sb3IgICA6OiBjb2xvciB0byBiZSB1c2VkIHRvIGRyYXcgYSBtb25vY2hyb21lIGdseXBoCisgICoKKyAgKiA8UmV0dXJuPgorICAqICAgRXJyb3IgY29kZS4gMCBtZWFucyBzdWNjZXNzCisgICoKKyAgKiA8Tm90ZT4KKyAgKiAgIFRoZXJlIGFyZSBvbmx5IHR3byBzdXBwb3J0ZWQgc291cmNlIHBpeGVsIG1vZGVzIDogbW9ub2Nocm9tZQorICAqICAgYW5kIGdyYXkuIFRoZSA4LWJpdCBpbWFnZXMgY2FuIGhhdmUgYW55IG51bWJlciBvZiBncmF5cyBiZXR3ZWVuCisgICogICAyIGFuZCAxMjgsIGFuZCBjb252ZXJzaW9ucyB0byB0aGUgdGFyZ2V0IHN1cmZhY2UgaXMgaGFuZGxlZAorICAqICAgX2F1dG9tYXRpY2FsbHlfLgorICAqCisgICogICBOb3RlIGhvd2V2ZXIgdGhhdCB5b3Ugc2hvdWxkIGF2b2lkIGJsaXR0aW5nIGEgZ3JheSBnbHlwaCB0byBhIGdyYXkKKyAgKiAgIGJpdG1hcCB3aXRoIGZld2VyIGxldmVscyBvZiBncmF5cywgYXMgdGhpcyB3b3VsZCBtdWNoIHByb2JhYmx5CisgICogICBnaXZlIHVucGxlYXNhbnQgcmVzdWx0cy4uCisgICoKKyAgKiAgIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgY2xpcHBpbmcKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIAorICBleHRlcm4gaW50ICAgZ3JCbGl0R2x5cGhUb0JpdG1hcCggZ3JCaXRtYXAqICB0YXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnckJpdG1hcCogIGdseXBoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JQb3MgICAgICB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JQb3MgICAgICB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JDb2xvciAgICBjb2xvciApOworCisKKyAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqCisgICogPEZ1bmN0aW9uPgorICAqICAgIGdyRmlsbFJlY3RhbmdsZQorICAqCisgICogPERlc2NyaXB0aW9uPgorICAqICAgIHRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBmaWxsIGEgZ2l2ZW4gcmVjdGFuZ2xlIG9uIGEgc3VyZmFjZSAgIAorICAqCisgICogPElucHV0PgorICAqICAgIHN1cmZhY2UgOjogaGFuZGxlIHRvIHRhcmdldCBzdXJmYWNlCisgICogICAgeCAgICAgICA6OiB4IGNvb3JkaW5hdGUgb2YgdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgcmVjdGFuZ2xlCisgICogICAgeSAgICAgICA6OiB5IGNvb3JkaW5hdGUgb2YgdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgcmVjdGFuZ2xlCisgICogICAgd2lkdGggICA6OiByZWN0YW5nbGUgd2lkdGggaW4gcGl4ZWxzCisgICogICAgaGVpZ2h0ICA6OiByZWN0YW5nbGUgaGVpZ2h0IGluIHBpeGVscworICAqICAgIGNvbG9yICAgOjogZmlsbCBjb2xvcgorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgCisgIGV4dGVybiB2b2lkICBnckZpbGxSZWN0YW5nbGUoIGdyQml0bWFwKiAgc3VyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JQb3MgICAgICB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnclBvcyAgICAgIHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyUG9zICAgICAgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyUG9zICAgICAgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnckNvbG9yICAgIGNvbG9yICk7CisKKworCisgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKgorICAqIDxGdW5jdGlvbj4KKyAgKiAgICBncldyaXRlQ2VsbENoYXIKKyAgKgorICAqIDxEZXNjcmlwdGlvbj4KKyAgKiAgICBUaGUgZ3JhcGhpY3Mgc3ViLXN5c3RlbSBjb250YWlucyBhbiBpbnRlcm5hbCBMYXRpbjEgOHg4IGZvbnQKKyAgKiAgICB3aGljaCBjYW4gYmUgdXNlZCB0byBkaXNwbGF5IHNpbXBsZSBzdHJpbmdzIG9mIHRleHQgd2l0aG91dAorICAqICAgIHVzaW5nIEZyZWVUeXBlLgorICAqCisgICogICAgVGhpcyBmdW5jdGlvbiB3cml0ZXMgYSBzaW5nbGUgOHg4IGNoYXJhY3RlciBvbiB0aGUgdGFyZ2V0IGJpdG1hcC4KKyAgKgorICAqIDxJbnB1dD4KKyAgKiAgICB0YXJnZXQgICA6OiBoYW5kbGUgdG8gdGFyZ2V0IHN1cmZhY2UKKyAgKiAgICB4ICAgICAgICA6OiB4IHBpeGVsIHBvc2l0aW9uIG9mIGNoYXJhY3RlciBjZWxsJ3MgdG9wIGxlZnQgY29ybmVyCisgICogICAgeSAgICAgICAgOjogeSBwaXhlbCBwb3NpdGlvbiBvZiBjaGFyYWN0ZXIgY2VsbCdzIHRvcCBsZWZ0IGNvcm5lcgorICAqICAgIGNoYXJjb2RlIDo6IExhdGluLTEgY2hhcmFjdGVyIGNvZGUKKyAgKiAgICBjb2xvciAgICA6OiBjb2xvciB0byBiZSB1c2VkIHRvIGRyYXcgdGhlIGNoYXJhY3RlcgorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIAorICBleHRlcm4KKyAgdm9pZCAgZ3JXcml0ZUNlbGxDaGFyKCBnckJpdG1hcCogIHRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgIHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICB5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgY2hhcmNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgZ3JDb2xvciAgICBjb2xvciApOworCisKKyAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqCisgICogPEZ1bmN0aW9uPgorICAqICAgIGdyV3JpdGVDZWxsU3RyaW5nCisgICoKKyAgKiA8RGVzY3JpcHRpb24+CisgICogICAgVGhlIGdyYXBoaWNzIHN1Yi1zeXN0ZW0gY29udGFpbnMgYW4gaW50ZXJuYWwgTGF0aW4xIDh4OCBmb250CisgICogICAgd2hpY2ggY2FuIGJlIHVzZWQgdG8gZGlzcGxheSBzaW1wbGUgc3RyaW5ncyBvZiB0ZXh0IHdpdGhvdXQKKyAgKiAgICB1c2luZyBGcmVlVHlwZS4KKyAgKgorICAqICAgIFRoaXMgZnVuY3Rpb24gd3JpdGVzIGEgc3RyaW5nIHdpdGggdGhlIGludGVybmFsIGZvbnQKKyAgKgorICAqIDxJbnB1dD4KKyAgKiAgICB0YXJnZXQgICAgICAgOjogaGFuZGxlIHRvIHRhcmdldCBiaXRtYXAgIAorICAqICAgIHggICAgICAgICAgICA6OiB4IHBpeGVsIHBvc2l0aW9uIG9mIHN0cmluZydzIHRvcCBsZWZ0IGNvcm5lcgorICAqICAgIHkgICAgICAgICAgICA6OiB5IHBpeGVsIHBvc2l0aW9uIG9mIHN0cmluZydzIHRvcCBsZWZ0IGNvcm5lcgorICAqICAgIHN0cmluZyAgICAgICA6OiBMYXRpbi0xIHRleHQgc3RyaW5nCisgICogICAgY29sb3IgICAgICAgIDo6IGNvbG9yIHRvIGJlIHVzZWQgdG8gZHJhdyB0aGUgY2hhcmFjdGVyCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgCisgIGV4dGVybgorICB2b2lkICBncldyaXRlQ2VsbFN0cmluZyggZ3JCaXRtYXAqICAgdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgIHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBnckNvbG9yICAgICBjb2xvciApOworCisgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKgorICAqIDxGdW5jdGlvbj4KKyAgKiAgICBnckRvbmVCaXRtYXAKKyAgKgorICAqIDxEZXNjcmlwdGlvbj4KKyAgKiAgICBkZXN0cm95cyBhIGJpdG1hcCAgICAKKyAgKgorICAqIDxJbnB1dD4KKyAgKiAgICBiaXRtYXAgOjogaGFuZGxlIHRvIGJpdG1hcCBkZXNjcmlwdG9yCisgICoKKyAgKiA8Tm90ZT4KKyAgKiAgICBUaGlzIGZ1bmN0aW9uIGRvZXMgTk9UIHJlbGVhc2UgdGhlIGJpdG1hcCBkZXNjcmlwdG9yLCBvbmx5CisgICogICAgdGhlIHBpeGVsIGJ1ZmZlci4KKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIGV4dGVybiAgdm9pZCAgZ3JEb25lQml0bWFwKCBnckJpdG1hcCogIGJpdCApOworCisKKworCisgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgLyoqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKiovCisgLyoqKioqKioqICAgICAgICAgREVWSUNFLVNQRUNJRklDIERFRklOSVRJT05TIEFORCBST1VUSU5FUyAgICAgICAgKioqKioqKiovCisgLyoqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKiovCisgLyoqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKiovCisgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworICAvKiBmb3J3YXJkIGRlY2xhcmF0aW9uIC0gdGhlIGRlZmluaXRpb24gb2YgZ3JEZXZpY2UgaXMgbm90IHZpc2libGUgKi8KKyAgLyogdG8gY2xpZW50cy4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgc3RydWN0IGdyRGV2aWNlXyAgZ3JEZXZpY2U7CisKKworIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICoKKyAgKiA8U3RydWN0PgorICAqICAgIGdyRGV2aWNlQ2hhaW4KKyAgKgorICAqIDxEZXNjcmlwdGlvbj4KKyAgKiAgICBhIHNpbXBsZSBzdHJ1Y3R1cmUgdXNlZCB0byBpbXBsZW1lbnQgYSBsaW5rZWQgbGlzdCBvZgorICAqICAgIGdyYXBoaWNzIGRldmljZSBkZXNjcmlwdG9ycy4gVGhlIGxpc3QgaXMgY2FsbGVkIGEKKyAgKiAgICAiZGV2aWNlIGNoYWluIgorICAqCisgICogPEZpZWxkcz4KKyAgKiAgICBuYW1lICAgOjogQVNDSUkgbmFtZSBvZiB0aGUgZGV2aWNlLCBlLmcuICJ4MTEiLCAib3MycG0iLCBldGMuLgorICAqICAgIGRldmljZSA6OiBoYW5kbGUgdG8gdGhlIGRldmljZSBkZXNjcmlwdG9yLgorICAqICAgIG5leHQgICA6OiBuZXh0IGVsZW1lbnQgaW4gY2hhaW4KKyAgKgorICAqIDxOb3RlPgorICAqICAgIHRoZSAnZGV2aWNlJyBmaWVsZCBpcyBhIGJsaW5kIHBvaW50ZXI7IGl0IGlzIHRodXMgdW51c2FibGUgYnkKKyAgKiAgICBjbGllbnQgYXBwbGljYXRpb25zLi4KKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIAorICB0eXBlZGVmIHN0cnVjdCBnckRldmljZUNoYWluXyAgZ3JEZXZpY2VDaGFpbjsKKworICBzdHJ1Y3QgZ3JEZXZpY2VDaGFpbl8KKyAgeworICAgIGNvbnN0IGNoYXIqICAgICBuYW1lOworICAgIGdyRGV2aWNlKiAgICAgICBkZXZpY2U7CisgICAgZ3JEZXZpY2VDaGFpbiogIG5leHQ7CisgIH07CisKKworIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICoKKyAgKiA8RnVuY3Rpb24+CisgICogICAgZ3JJbml0RGV2aWNlcworICAqCisgICogPERlc2NyaXB0aW9uPgorICAqICAgIFRoaXMgZnVuY3Rpb24gaXMgaW4gY2hhcmdlIG9mIGluaXRpYWxpc2luZyBhbGwgc3lzdGVtLXNwZWNpZmljCisgICogICAgZGV2aWNlcy4gQSBkZXZpY2UgaXMgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIGFuZCBtYW5hZ2luZyBvbmUKKyAgKiAgICBvciBtb3JlICJzdXJmYWNlcyIuIEEgc3VyZmFjZSBpcyBlaXRoZXIgYSB3aW5kb3cgb3IgYSBzY3JlZW4sCisgICogICAgZGVwZW5kaW5nIG9uIHRoZSBzeXN0ZW0uCisgICoKKyAgKiA8UmV0dXJuPgorICAqICAgIGEgcG9pbnRlciB0byB0aGUgZmlyc3QgZWxlbWVudCBvZiBhIGRldmljZSBjaGFpbi4gVGhlIGNoYWluIGNhbgorICAqICAgIGJlIHBhcnNlZCB0byBmaW5kIHRoZSBhdmFpbGFibGUgZGV2aWNlcyBvbiB0aGUgY3VycmVudCBzeXN0ZW0KKyAgKgorICAqIDxOb3RlPgorICAqICAgIElmIGEgZGV2aWNlIGNhbm5vdCBiZSBpbml0aWFsaXNlZCBjb3JyZWN0bHksIGl0IGlzIG5vdCBwYXJ0IG9mCisgICogICAgdGhlIGRldmljZSBjaGFpbiByZXR1cm5lZCBieSB0aGlzIGZ1bmN0aW9uLiBGb3IgZXhhbXBsZSwgaWYgYW4KKyAgKiAgICBYMTEgZGV2aWNlIHdhcyBjb21waWxlZCBpbiB0aGUgbGlicmFyeSwgaXQgd2lsbCBiZSBwYXJ0IG9mCisgICogICAgdGhlIHJldHVybmVkIGRldmljZSBjaGFpbiBvbmx5IGlmIGEgY29ubmVjdGlvbiB0byB0aGUgZGlzcGxheQorICAqICAgIGNvdWxkIGJlIGVzdGFibGlzZ2VkCisgICoKKyAgKiAgICBJZiBubyBkcml2ZXIgY291bGQgYmUgaW5pdGlhbGlzZWQsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBOVUxMLgorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgCisgIGV4dGVybgorICBnckRldmljZUNoYWluKiAgZ3JJbml0RGV2aWNlcyggdm9pZCApOworCisKKworIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICoKKyAgKiA8RnVuY3Rpb24+CisgICogICAgZ3JHZXREZXZpY2VNb2RlcworICAqCisgICogPERlc2NyaXB0aW9uPgorICAqICAgIHF1ZXJpZXMgdGhlIGF2YWlsYWJsZSBwaXhlbCBtb2RlcyBmb3IgYSBkZXZpY2UuCisgICoKKyAgKiA8SW5wdXQ+CisgICogICAgZGV2aWNlX25hbWUgIDo6IG5hbWUgb2YgZGV2aWNlIHRvIGJlIHVzZWQuIDAgZm9yIHRoZSBkZWZhdWx0CisgICogICAgICAgICAgICAgICAgICAgIGRldmljZS4gRm9yIGEgbGlzdCBvZiBhdmFpbGFibGUgZGV2aWNlcywgc2VlCisgICogICAgICAgICAgICAgICAgICAgIGdySW5pdERldmljZXMuCisgICoKKyAgKiA8T3V0cHV0PgorICAqICAgIG51bV9tb2RlcyAgICA6OiBudW1iZXIgb2YgYXZhaWxhYmxlIG1vZGVzLiAwIGluIGNhc2Ugb2YgZXJyb3IsCisgICogICAgICAgICAgICAgICAgICAgIHdoaWNoIHJlYWxseSBpcyBhbiBpbnZhbGlkIGRldmljZSBuYW1lLgorICAqCisgICogICAgcGl4ZWxfbW9kZXMgIDo6IGFycmF5IG9mIGF2YWlsYWJsZSBwaXhlbCBtb2RlcyBmb3IgdGhpcyBkZXZpY2UKKyAgKiAgICAgICAgICAgICAgICAgICAgdGhpcyB0YWJsZSBpcyBpbnRlcm5hbCB0byB0aGUgZGV2aWNlIGFuZCBzaG91bGQKKyAgKiAgICAgICAgICAgICAgICAgICAgbm90IGJlIGZyZWVkIGJ5IGNsaWVudCBhcHBsaWNhdGlvbnMuCisgICoKKyAgKiA8UmV0dXJuPgorICAqICAgIGVycm9yIGNvZGUuIDAgbWVhbnMgc3VjY2Vzcy4gaW52YWxpZCBkZXZpY2UgbmFtZSBvdGhlcndpc2UKKyAgKgorICAqIDxOb3RlPgorICAqICAgIEFsbCBkcml2ZXJzIGFyZSBfcmVxdWlyZWRfIHRvIHN1cHBvcnQgYXQgbGVhc3QgdGhlIGZvbGxvd2luZworICAqICAgIHBpeGVsIGZvcm1hdHMgOgorICAqCisgICogICAgLSBncl9waXhlbF9tb2RlX21vbm8gOiBpLmUuIG1vbm9jaHJvbWUgYml0bWFwcworICAqICAgIC0gZ3JfcGl4ZWxfbW9kZV9ncmF5IDogd2l0aCBhbnkgbnVtYmVyIG9mIGdyYXkgbGV2ZWxzIGJldHdlZW4KKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgYW5kIDI1Ni4KKyAgKgorICAqICAgIHRoZSBwaXhlbCBtb2RlcyBkbyBub3QgcHJvdmlkZSB0aGUgbnVtYmVyIG9mIGdyYXlzIGluIHRoZSBjYXNlCisgICogICAgb2YgImdyYXkiIGRldmljZXMuIFlvdSBzaG91bGQgdHJ5IHRvIGNyZWF0ZSBhIHN1cmZhY2Ugd2l0aCB0aGUgCisgICogICAgbWF4aW1hbCBudW1iZXIgKDI1NiwgdGhhdCBpcykgYW5kIHNlZSB0aGUgdmFsdWUgcmV0dXJuZWQgaW4KKyAgKiAgICB0aGUgYml0bWFwIGRlc2NyaXB0b3IuCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKKyAgZXh0ZXJuIHZvaWQgIGdyR2V0RGV2aWNlTW9kZXMoIGNvbnN0IGNoYXIqICAgIGRldmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAqbnVtX21vZGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JQaXhlbE1vZGUqICAqcGl4ZWxfbW9kZXMgKTsKKworCisKKyAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqCisgICogPEZ1bmN0aW9uPgorICAqICAgIGdyTmV3U3VyZmFjZQorICAqCisgICogPERlc2NyaXB0aW9uPgorICAqICAgIGNyZWF0ZXMgYSBuZXcgZGV2aWNlLXNwZWNpZmljIHN1cmZhY2UuIEEgc3VyZmFjZSBpcyBlaXRoZXIKKyAgKiAgICBhIHdpbmRvdyBvciBhIHNjcmVlbiwgZGVwZW5kaW5nIG9uIHRoZSBkZXZpY2UuCisgICoKKyAgKiA8SW5wdXQ+CisgICogICAgZGV2aWNlICA6OiBuYW1lIG9mIHRoZSBkZXZpY2UgdG8gdXNlLiBBIHZhbHVlIG9mIE5VTEwgbWVhbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBkZWZhdWx0IGRldmljZSAod2hpY2ggZGVwZW5kcyBvbiB0aGUgc3lzdGVtKS4KKyAgKiAgICAgICAgICAgICAgIGZvciBhIGxpc3Qgb2YgYXZhaWxhYmxlIGRldmljZXMsIHNlZSBnckluaXREZXZpY2VzLgorICAqCisgICogPEluT3V0PgorICAqICAgIGJpdG1hcCAgOjogaGFuZGxlIHRvIGEgYml0bWFwIGRlc2NyaXB0b3IgY29udGFpbmluZyB0aGUKKyAgKiAgICAgICAgICAgICAgIHJlcXVlc3RlZCBwaXhlbCBtb2RlLCBudW1iZXIgb2YgZ3JheXMgYW5kIGRpbWVuc2lvbnMKKyAgKiAgICAgICAgICAgICAgIGZvciB0aGUgc3VyZmFjZS4gdGhlIGJpdG1hcCdzICdwaXRjaCcgYW5kICdidWZmZXInCisgICogICAgICAgICAgICAgICBmaWVsZHMgYXJlIGlnbm9yZWQgb24gaW5wdXQuCisgICoKKyAgKiAgICAgICAgICAgICAgIE9uIG91dHB1dCwgdGhlIGJpdG1hcCBkZXNjcmliZXMgdGhlIHN1cmZhY2UncyBpbWFnZQorICAqICAgICAgICAgICAgICAgY29tcGxldGVseS4gSXQgaXMgcG9zc2libGUgdG8gd3JpdGUgZGlyZWN0bHkgaW4gaXQKKyAgKiAgICAgICAgICAgICAgIHdpdGggZ3JCbGl0R2x5cGhUb0JpdG1hcCwgZXZlbiB0aG91Z2ggdGhlIHVzZSBvZgorICAqICAgICAgICAgICAgICAgZ3JCbGl0R2x5cGhUb1N1cmZhY2UgaXMgcmVjb21tZW5kZWQuCisgICoKKyAgKiA8UmV0dXJuPgorICAqICAgIGhhbmRsZSB0byB0aGUgY29ycmVzcG9uZGluZyBzdXJmYWNlIG9iamVjdC4gMCBpbiBjYXNlIG9mIGVycm9yCisgICoKKyAgKiA8Tm90ZT4KKyAgKiAgICBBbGwgZHJpdmVycyBhcmUgX3JlcXVpcmVkXyB0byBzdXBwb3J0IGF0IGxlYXN0IHRoZSBmb2xsb3dpbmcKKyAgKiAgICBwaXhlbCBmb3JtYXRzIDoKKyAgKgorICAqICAgIC0gZ3JfcGl4ZWxfbW9kZV9tb25vIDogaS5lLiBtb25vY2hyb21lIGJpdG1hcHMKKyAgKiAgICAtIGdyX3BpeGVsX21vZGVfZ3JheSA6IHdpdGggYW55IG51bWJlciBvZiBncmF5IGxldmVscyBiZXR3ZWVuCisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAyIGFuZCAyNTYuCisgICoKKyAgKiAgICBUaGlzIGZ1bmN0aW9uIG1pZ2h0IGNoYW5nZSB0aGUgYml0bWFwIGRlc2NyaXB0b3IncyBmaWVsZHMuIEZvcgorICAqICAgIGV4YW1wbGUsIHdoZW4gZGlzcGxheWluZyBhIGZ1bGwtc2NyZWVuIHN1cmZhY2UsIHRoZSBiaXRtYXAncworICAqICAgIGRpbWVuc2lvbnMgd2lsbCBiZSBzZXQgdG8gdGhvc2Ugb2YgdGhlIHNjcmVlbiAoZS5nLiA2NDB4NDgwCisgICogICAgb3IgODAweDYwMCk7IGFsc28sIHRoZSBiaXRtYXAncyAnYnVmZmVyJyBmaWVsZCBtaWdodCBwb2ludCB0bworICAqICAgIHRoZSBWaWRlbyBSYW0gZGVwZW5kaW5nIG9uIHRoZSBtb2RlIHJlcXVlc3RlZC4uCisgICoKKyAgKiAgICBUaGUgc3VyZmFjZSBjb250YWlucyBhIGNvcHkgb2YgdGhlIHJldHVybmVkIGJpdG1hcCBkZXNjcmlwdG9yLAorICAqICAgIHlvdSBjYW4gdGh1cyBkaXNjYXJkIHRoZSAnYml0bWFwJyBwYXJhbWV0ZXIgYWZ0ZXIgdGhlIGNhbGwuCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAKKyAgZXh0ZXJuIGdyU3VyZmFjZSogIGdyTmV3U3VyZmFjZSggY29uc3QgY2hhciogIGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JCaXRtYXAqICAgIGJpdG1hcCApOworCisKKworIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICoKKyAgKiA8RnVuY3Rpb24+CisgICogICAgZ3JSZWZyZXNoUmVjdGFuZ2xlCisgICoKKyAgKiA8RGVzY3JpcHRpb24+CisgICogICAgdGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGluZGljYXRlIHRoYXQgYSBnaXZlbiBzdXJmYWNlIHJlY3RhbmdsZQorICAqICAgIHdhcyBtb2RpZmllZCBhbmQgdGh1cyBuZWVkcyByZS1wYWludGluZy4gSXQgcmVhbGx5IGlzIHVzZWZ1bCBmb3IKKyAgKiAgICB3aW5kb3dlZCBvciBncmF5IHN1cmZhY2VzLgorICAqCisgICogPElucHV0PgorICAqICAgIHN1cmZhY2UgOjogaGFuZGxlIHRvIHRhcmdldCBzdXJmYWNlCisgICogICAgeCAgICAgICA6OiB4IGNvb3JkaW5hdGUgb2YgdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgcmVjdGFuZ2xlCisgICogICAgeSAgICAgICA6OiB5IGNvb3JkaW5hdGUgb2YgdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgcmVjdGFuZ2xlCisgICogICAgd2lkdGggICA6OiByZWN0YW5nbGUgd2lkdGggaW4gcGl4ZWxzCisgICogICAgaGVpZ2h0ICA6OiByZWN0YW5nbGUgaGVpZ2h0IGluIHBpeGVscworICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgCisgIGV4dGVybiB2b2lkICBnclJlZnJlc2hSZWN0YW5nbGUoIGdyU3VyZmFjZSogIHN1cmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyUG9zICAgICAgIHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyUG9zICAgICAgIHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyUG9zICAgICAgIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnclBvcyAgICAgICBoZWlnaHQgKTsKKworCisgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKgorICAqIDxGdW5jdGlvbj4KKyAgKiAgICBnclJlZnJlc2hTdXJmYWNlCisgICoKKyAgKiA8RGVzY3JpcHRpb24+CisgICogICAgYSB2YXJpYXRpb24gb2YgZ3JSZWZyZXNoUmVjdGFuZ2xlIHdoaWNoIHJlcGFpbnRzIHRoZSB3aG9sZSBzdXJmYWNlCisgICogICAgdG8gdGhlIHNjcmVlbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICoKKyAgKiA8SW5wdXQ+CisgICogICAgc3VyZmFjZSA6OiBoYW5kbGUgdG8gdGFyZ2V0IHN1cmZhY2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIGV4dGVybiB2b2lkICBnclJlZnJlc2hTdXJmYWNlKCBnclN1cmZhY2UqICBzdXJmYWNlICk7CisKKworCisgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKgorICAqIDxGdW5jdGlvbj4KKyAgKiAgICBncldyaXRlU3VyZmFjZUNoYXIKKyAgKgorICAqIDxEZXNjcmlwdGlvbj4KKyAgKiAgICBUaGlzIGZ1bmN0aW9uIGlzIGVxdWl2YWxlbnQgdG8gY2FsbGluZyBncldyaXRlQ2VsbENoYXIgb24gdGhlCisgICogICAgc3VyZmFjZSdzIGJpdG1hcCwgdGhlbiBpbnZva2luZyBnclJlZnJlc2hSZWN0YW5nbGUuCisgICoKKyAgKiAgICBUaGUgZ3JhcGhpY3Mgc3ViLXN5c3RlbSBjb250YWlucyBhbiBpbnRlcm5hbCBMYXRpbjEgOHg4IGZvbnQKKyAgKiAgICB3aGljaCBjYW4gYmUgdXNlZCB0byBkaXNwbGF5IHNpbXBsZSBzdHJpbmdzIG9mIHRleHQgd2l0aG91dAorICAqICAgIHVzaW5nIEZyZWVUeXBlLgorICAqCisgICogICAgVGhpcyBmdW5jdGlvbiB3cml0ZXMgYSBzaW5nbGUgOHg4IGNoYXJhY3RlciBvbiB0aGUgdGFyZ2V0IGJpdG1hcC4KKyAgKgorICAqIDxJbnB1dD4KKyAgKiAgICB0YXJnZXQgICA6OiBoYW5kbGUgdG8gdGFyZ2V0IHN1cmZhY2UKKyAgKiAgICB4ICAgICAgICA6OiB4IHBpeGVsIHBvc2l0aW9uIG9mIGNoYXJhY3RlciBjZWxsJ3MgdG9wIGxlZnQgY29ybmVyCisgICogICAgeSAgICAgICAgOjogeSBwaXhlbCBwb3NpdGlvbiBvZiBjaGFyYWN0ZXIgY2VsbCdzIHRvcCBsZWZ0IGNvcm5lcgorICAqICAgIGNoYXJjb2RlIDo6IExhdGluLTEgY2hhcmFjdGVyIGNvZGUKKyAgKiAgICBjb2xvciAgICA6OiBjb2xvciB0byBiZSB1c2VkIHRvIGRyYXcgdGhlIGNoYXJhY3RlcgorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIAorICBleHRlcm4KKyAgdm9pZCAgZ3JXcml0ZVN1cmZhY2VDaGFyKCBnclN1cmZhY2UqIHRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgIHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgY2hhcmNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JDb2xvciAgICBjb2xvciApOworCisKKyAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqCisgICogPEZ1bmN0aW9uPgorICAqICAgIGdyV3JpdGVTdXJmYWNlU3RyaW5nCisgICoKKyAgKiA8RGVzY3JpcHRpb24+CisgICogICAgVGhpcyBmdW5jdGlvbiBpcyBlcXVpdmFsZW50IHRvIGNhbGxpbmcgZ3JXcml0ZUNlbGxTdHJpbmcgb24gdGhlCisgICogICAgc3VyZmFjZSdzIGJpdG1hcCwgdGhlbiBpbnZva2luZyBnclJlZnJlc2hSZWN0YW5nbGUuCisgICoKKyAgKiAgICBUaGUgZ3JhcGhpY3Mgc3ViLXN5c3RlbSBjb250YWlucyBhbiBpbnRlcm5hbCBMYXRpbjEgOHg4IGZvbnQKKyAgKiAgICB3aGljaCBjYW4gYmUgdXNlZCB0byBkaXNwbGF5IHNpbXBsZSBzdHJpbmdzIG9mIHRleHQgd2l0aG91dAorICAqICAgIHVzaW5nIEZyZWVUeXBlLgorICAqCisgICogICAgVGhpcyBmdW5jdGlvbiB3cml0ZXMgYSBzdHJpbmcgd2l0aCB0aGUgaW50ZXJuYWwgZm9udAorICAqCisgICogPElucHV0PgorICAqICAgIHRhcmdldCAgICAgICA6OiBoYW5kbGUgdG8gdGFyZ2V0IGJpdG1hcCAgCisgICogICAgeCAgICAgICAgICAgIDo6IHggcGl4ZWwgcG9zaXRpb24gb2Ygc3RyaW5nJ3MgdG9wIGxlZnQgY29ybmVyCisgICogICAgeSAgICAgICAgICAgIDo6IHkgcGl4ZWwgcG9zaXRpb24gb2Ygc3RyaW5nJ3MgdG9wIGxlZnQgY29ybmVyCisgICogICAgc3RyaW5nICAgICAgIDo6IExhdGluLTEgdGV4dCBzdHJpbmcKKyAgKiAgICBjb2xvciAgICAgICAgOjogY29sb3IgdG8gYmUgdXNlZCB0byBkcmF3IHRoZSBjaGFyYWN0ZXIKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAKKyAgZXh0ZXJuCisgIHZvaWQgIGdyV3JpdGVTdXJmYWNlU3RyaW5nKCBnclN1cmZhY2UqICB0YXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyQ29sb3IgICAgIGNvbG9yICk7CisKKworIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICoKKyAgKiA8RnVuY3Rpb24+CisgICogICAgZ3JTZXRUaXRsZQorICAqCisgICogPERlc2NyaXB0aW9uPgorICAqICAgIHNldCB0aGUgd2luZG93IHRpdGxlIG9mIGEgZ2l2ZW4gd2luZG93ZWQgc3VyZmFjZS4KKyAgKgorICAqIDxJbnB1dD4KKyAgKiAgICBzdXJmYWNlICAgICAgOjogaGFuZGxlIHRvIHRhcmdldCBzdXJmYWNlCisgICogICAgdGl0bGVfc3RyaW5nIDo6IHRoZSBuZXcgdGl0bGUKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIGV4dGVybiB2b2lkICBnclNldFRpdGxlKCBnclN1cmZhY2UqICBzdXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdGl0bGVfc3RyaW5nICk7CisKKworCisKKyAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqCisgICogPEZ1bmN0aW9uPgorICAqICAgIGdyTGlzdGVuU3VyZmFjZQorICAqCisgICogPERlc2NyaXB0aW9uPgorICAqICAgIGxpc3RlbiB0aGUgZXZlbnRzIGZvciBhIGdpdmVuIHN1cmZhY2UKKyAgKgorICAqIDxJbnB1dD4KKyAgKiAgICBzdXJmYWNlICAgIDo6IGhhbmRsZSB0byB0YXJnZXQgc3VyZmFjZQorICAqICAgIGV2ZW50X21hc2sgOjogdGhlIGV2ZW50IG1hc2sgKG1vZGUpCisgICoKKyAgKiA8T3V0cHV0PgorICAqICAgIGV2ZW50ICA6OiB0aGUgcmV0dXJuZWQgZXZlbnQKKyAgKgorICAqIDxOb3RlPgorICAqICAgIFhYWCA6IEZvciBub3csIG9ubHkga2V5cHJlc3NlcyBhcmUgc3VwcG9ydGVkLgorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIAorICBleHRlcm4KKyAgaW50ICAgZ3JMaXN0ZW5TdXJmYWNlKCBnclN1cmZhY2UqICBzdXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgIGV2ZW50X21hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgZ3JFdmVudCAgICAqZXZlbnQgKTsKKworCisjZW5kaWYgLyogR1JBUEhfSCAqLwpkaWZmIC0tZ2l0IGEvZGVtb3MvZ3JhcGgvZ3JibGl0LmMgYi9kZW1vcy9ncmFwaC9ncmJsaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDM0NmUxCi0tLSAvZGV2L251bGwKKysrIGIvZGVtb3MvZ3JhcGgvZ3JibGl0LmMKQEAgLTAsMCArMSwxMjY4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoZSBGcmVlVHlwZSBwcm9qZWN0IC0tIGEgZnJlZSBhbmQgcG9ydGFibGUgcXVhbGl0eSBUcnVlVHlwZSByZW5kZXJlci4gICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMTk5Ni0xOTk5IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEQuIFR1cm5lciwgUi5XaWxoZWxtLCBhbmQgVy4gTGVtYmVyZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBibGl0dGVyLmM6IFN1cHBvcnQgZm9yIGJsaXR0aW5nIG9mIGJpdG1hcHMgd2l0aCB2YXJpb3VzIGRlcHRoLiAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgImdyYmxpdC5oIgorI2luY2x1ZGUgImdyb2Jqcy5oIgorCisgIHN0YXRpYworICBpbnQgIGNvbXB1dGVfY2xpcHMoIGdyQmxpdHRlciogIGJsaXQsCisgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgeF9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgeV9vZmZzZXQgKQorICB7CisgICAgaW50ICB4bWluLCB5bWluLCB4bWF4LCB5bWF4LCB3aWR0aCwgaGVpZ2h0LCB0YXJnZXRfd2lkdGg7CisKKyAgICAvKiBwZXJmb3JtIGNsaXBwaW5nIGFuZCBzZXR1cCB2YXJpYWJsZXMgKi8KKyAgICB3aWR0aCAgPSBibGl0LT5zb3VyY2Uud2lkdGg7CisgICAgaGVpZ2h0ID0gYmxpdC0+c291cmNlLnJvd3M7CisKKyAgICBzd2l0Y2ggKCBibGl0LT5zb3VyY2UubW9kZSApCisgICAgeworICAgIGNhc2UgZ3JfcGl4ZWxfbW9kZV9tb25vOgorICAgICAgd2lkdGggPSAod2lkdGggKyA3KSAmIC04OworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGdyX3BpeGVsX21vZGVfcGFsNDoKKyAgICAgIHdpZHRoID0gKHdpZHRoICsgMSkgJiAtMjsKKyAgICAgIGJyZWFrOworICAgICAgCisgICAgZGVmYXVsdDoKKyAgICAgIDsKKyAgICB9CisKKyAgICB4bWluID0geF9vZmZzZXQ7CisgICAgeW1pbiA9IHlfb2Zmc2V0OworICAgIHhtYXggPSB4bWluICsgd2lkdGgtMTsKKyAgICB5bWF4ID0geW1pbiArIGhlaWdodC0xOworCisgICAgLyogY2xpcCBpZiBuZWNlc3NhcnkgKi8KKyAgICBpZiAoIHdpZHRoID09IDAgfHwgaGVpZ2h0ID09IDAgICAgICAgICAgICAgICAgfHwKKyAgICAgICAgIHhtYXggPCAwICAgfHwgeG1pbiA+PSBibGl0LT50YXJnZXQud2lkdGggfHwKKyAgICAgICAgIHltYXggPCAwICAgfHwgeW1pbiA+PSBibGl0LT50YXJnZXQucm93cyAgKQorICAgICAgcmV0dXJuIDE7CisKKyAgICAvKiBzZXQgdXAgY2xpcHBpbmcgYW5kIGN1cnNvcnMgKi8KKyAgICBibGl0LT55cmVhZCA9IDA7CisgICAgaWYgKCB5bWluIDwgMCApCisgICAgeworICAgICAgYmxpdC0+eXJlYWQgIC09IHltaW47CisgICAgICBoZWlnaHQgICAgICAgKz0geW1pbjsKKyAgICAgIGJsaXQtPnl3cml0ZSAgPSAwOworICAgIH0KKyAgICBlbHNlCisgICAgICBibGl0LT55d3JpdGUgID0geW1pbjsKKworICAgIGlmICggeW1heCA+PSBibGl0LT50YXJnZXQucm93cyApCisgICAgICBoZWlnaHQgLT0geW1heCAtIGJsaXQtPnRhcmdldC5yb3dzICsgMTsKKworICAgIGJsaXQtPnhyZWFkID0gMDsKKyAgICBpZiAoIHhtaW4gPCAwICkKKyAgICB7CisgICAgICBibGl0LT54cmVhZCAgLT0geG1pbjsKKyAgICAgIHdpZHRoICAgICAgICArPSB4bWluOworICAgICAgYmxpdC0+eHdyaXRlICA9IDA7CisgICAgfQorICAgIGVsc2UKKyAgICAgIGJsaXQtPnh3cml0ZSAgPSB4bWluOworCisgICAgdGFyZ2V0X3dpZHRoID0gYmxpdC0+dGFyZ2V0LndpZHRoOworCisgICAgc3dpdGNoICggYmxpdC0+dGFyZ2V0Lm1vZGUgKQorICAgIHsKKyAgICBjYXNlIGdyX3BpeGVsX21vZGVfbW9ubzoKKyAgICAgIHRhcmdldF93aWR0aCA9ICh0YXJnZXRfd2lkdGggKyA3KSAmIC04OworICAgICAgYnJlYWs7CisgICAgY2FzZSBncl9waXhlbF9tb2RlX3BhbDQ6CisgICAgICB0YXJnZXRfd2lkdGggPSAodGFyZ2V0X3dpZHRoICsgMSkgJiAtMjsKKyAgICAgIGJyZWFrOworICAgICAgCisgICAgZGVmYXVsdDoKKyAgICAgIDsKKyAgICB9CisKKyAgICBibGl0LT5yaWdodF9jbGlwID0geG1heCAtIHRhcmdldF93aWR0aCArIDE7CisgICAgaWYgKCBibGl0LT5yaWdodF9jbGlwID4gMCApCisgICAgICB3aWR0aCAtPSBibGl0LT5yaWdodF9jbGlwOworICAgIGVsc2UKKyAgICAgIGJsaXQtPnJpZ2h0X2NsaXAgPSAwOworCisgICAgYmxpdC0+d2lkdGggID0gd2lkdGg7CisgICAgYmxpdC0+aGVpZ2h0ID0gaGVpZ2h0OworCisgICAgLyogc2V0IHJlYWQgYW5kIHdyaXRlIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIHJlYWQgKi8KKyAgICAvKiBhbmQgd3JpdGUgYXJlYXMgYmVmb3JlIGNsaXBwaW5nLiAgICAgICAgICAgICAgICAgICAgICAqLworCisgICAgYmxpdC0+cmVhZCAgPSAodW5zaWduZWQgY2hhciopYmxpdC0+c291cmNlLmJ1ZmZlcjsKKyAgICBibGl0LT53cml0ZSA9ICh1bnNpZ25lZCBjaGFyKilibGl0LT50YXJnZXQuYnVmZmVyOworCisgICAgYmxpdC0+cmVhZF9saW5lICA9IGJsaXQtPnNvdXJjZS5waXRjaDsKKyAgICBibGl0LT53cml0ZV9saW5lID0gYmxpdC0+dGFyZ2V0LnBpdGNoOworICAgIAorICAgIGlmICggYmxpdC0+cmVhZF9saW5lIDwgMCApCisgICAgICBibGl0LT5yZWFkIC09IChibGl0LT5zb3VyY2Uucm93cy0xKSAqIGJsaXQtPnJlYWRfbGluZTsKKworICAgIGlmICggYmxpdC0+d3JpdGVfbGluZSA8IDAgKQorICAgICAgYmxpdC0+d3JpdGUgLT0gKGJsaXQtPnRhcmdldC5yb3dzLTEpICogYmxpdC0+d3JpdGVfbGluZTsKKworICAgIC8qIG5vdyBnbyB0byB0aGUgc3RhcnQgbGluZS4gTm90ZSB0aGF0IHdlIGRvIG5vdCBtb3ZlIHRoZSAgICovCisgICAgLyogeCBwb3NpdGlvbiB5ZXQsIGFzIHRoaXMgaXMgZGVwZW5kZW50IG9uIHRoZSBwaXhlbCBmb3JtYXQgKi8KKyAgICBibGl0LT5yZWFkICArPSBibGl0LT55cmVhZCAqIGJsaXQtPnJlYWRfbGluZTsKKyAgICBibGl0LT53cml0ZSArPSBibGl0LT55d3JpdGUgKiBibGl0LT53cml0ZV9saW5lOworCisgICAgcmV0dXJuIDA7CisgIH0KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA8RnVuY3Rpb24+IGJsaXRfbW9ub190b19tb25vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgc3RhdGljCisgIHZvaWQgIGJsaXRfbW9ub190b19tb25vKCBnckJsaXR0ZXIqICBibGl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JDb2xvciAgICAgY29sb3IgKQorICB7CisgICAgaW50ICAgIHNoaWZ0LCBsZWZ0X2NsaXAsIHgsIHk7CisgICAgYnl0ZSogIHJlYWQ7CisgICAgYnl0ZSogIHdyaXRlOworCisgICAgKHZvaWQpY29sb3I7ICAgLyogdW51c2VkIGFyZ3VtZW50ICovCisKKyAgICBsZWZ0X2NsaXAgPSAoIGJsaXQtPnhyZWFkID4gMCApOworICAgIHNoaWZ0ICAgICA9ICggYmxpdC0+eHdyaXRlIC0gYmxpdC0+eHJlYWQgKSAmIDc7CisKKyAgICByZWFkICA9IGJsaXQtPnJlYWQgICsgKGJsaXQtPnhyZWFkID4+IDMpOworICAgIHdyaXRlID0gYmxpdC0+d3JpdGUgKyAoYmxpdC0+eHdyaXRlID4+IDMpOworCisgICAgaWYgKCBzaGlmdCA9PSAwICkKKyAgICB7CisgICAgICB5ID0gYmxpdC0+aGVpZ2h0OworICAgICAgZG8KKyAgICAgIHsKKyAgICAgICAgYnl0ZSogIF9yZWFkICA9IHJlYWQ7CisgICAgICAgIGJ5dGUqICBfd3JpdGUgPSB3cml0ZTsKKworICAgICAgICB4ID0gYmxpdC0+d2lkdGg7CisKKyAgICAgICAgZG8KKyAgICAgICAgeworICAgICAgICAgICpfd3JpdGUrKyB8PSAqX3JlYWQrKzsKKyAgICAgICAgICB4IC09IDg7CisgICAgICAgIH0gd2hpbGUgKCB4ID4gMCApOworCisgICAgICAgIHJlYWQgICs9IGJsaXQtPnJlYWRfbGluZTsKKyAgICAgICAgd3JpdGUgKz0gYmxpdC0+d3JpdGVfbGluZTsKKyAgICAgICAgeS0tOworICAgICAgfSB3aGlsZSAoIHkgPiAwICk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBpbnQgIGZpcnN0LCBsYXN0LCBjb3VudDsKKworCisgICAgICBmaXJzdCA9IGJsaXQtPnh3cml0ZSA+PiAzOworICAgICAgbGFzdCAgPSAoYmxpdC0+eHdyaXRlICsgYmxpdC0+d2lkdGgtMSkgPj4gMzsKKworICAgICAgY291bnQgPSBsYXN0IC0gZmlyc3Q7CisKKyAgICAgIGlmICggYmxpdC0+cmlnaHRfY2xpcCApCisgICAgICAgIGNvdW50Kys7CisKKyAgICAgIHkgPSBibGl0LT5oZWlnaHQ7CisKKyAgICAgIGRvCisgICAgICB7CisgICAgICAgIHVuc2lnbmVkIGNoYXIqICBfcmVhZCAgPSByZWFkOworICAgICAgICB1bnNpZ25lZCBjaGFyKiAgX3dyaXRlID0gd3JpdGU7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgICBvbGQ7CisgICAgICAgIGludCAgICAgICAgICAgICBzaGlmdDIgPSAoOC1zaGlmdCk7CisKKyAgICAgICAgaWYgKCBsZWZ0X2NsaXAgKQorICAgICAgICAgIG9sZCA9ICgqX3JlYWQrKykgPDwgc2hpZnQyOworICAgICAgICBlbHNlCisgICAgICAgICAgb2xkID0gMDsKKworICAgICAgICB4ID0gY291bnQ7CisgICAgICAgIHdoaWxlICggeCA+IDAgKQorICAgICAgICB7CisgICAgICAgICAgdW5zaWduZWQgY2hhciB2YWw7CisKKyAgICAgICAgICB2YWwgPSAqX3JlYWQrKzsKKyAgICAgICAgICAqX3dyaXRlKysgfD0gKCAodmFsID4+IHNoaWZ0KSB8IG9sZCApOworICAgICAgICAgIG9sZCA9IHZhbCA8PCBzaGlmdDI7CisgICAgICAgICAgeC0tOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCAhYmxpdC0+cmlnaHRfY2xpcCApCisgICAgICAgICAgKl93cml0ZSB8PSBvbGQ7CisKKyAgICAgICAgcmVhZCAgKz0gYmxpdC0+cmVhZF9saW5lOworICAgICAgICB3cml0ZSArPSBibGl0LT53cml0ZV9saW5lOworICAgICAgICB5LS07CisKKyAgICAgIH0gd2hpbGUgKCB5ID4gMCApOworICAgIH0KKyAgfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIDxGdW5jdGlvbj4gYmxpdF9tb25vX3RvX3BhbDggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICBzdGF0aWMKKyAgdm9pZCAgYmxpdF9tb25vX3RvX3BhbDgoIGdyQmxpdHRlciogIGJsaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBnckNvbG9yICAgICBjb2xvciApCisgIHsKKyAgICBpbnQgICAgICAgICAgICAgeCwgeTsKKyAgICB1bnNpZ25lZCBpbnQgICAgbGVmdF9tYXNrOworICAgIHVuc2lnbmVkIGNoYXIqICByZWFkOworICAgIHVuc2lnbmVkIGNoYXIqICB3cml0ZTsKKworICAgIHJlYWQgID0gYmxpdC0+cmVhZCAgKyAoYmxpdC0+eHJlYWQgPj4gMyk7CisgICAgd3JpdGUgPSBibGl0LT53cml0ZSArICBibGl0LT54d3JpdGU7CisKKyAgICBsZWZ0X21hc2sgPSAweDgwID4+IChibGl0LT54cmVhZCAmIDcpOworCisgICAgeSA9IGJsaXQtPmhlaWdodDsKKyAgICBkbworICAgIHsKKyAgICAgIHVuc2lnbmVkIGNoYXIqICBfcmVhZCAgPSByZWFkOworICAgICAgdW5zaWduZWQgY2hhciogIF93cml0ZSA9IHdyaXRlOworICAgICAgdW5zaWduZWQgaW50ICAgIG1hc2sgICA9IGxlZnRfbWFzazsKKyAgICAgIHVuc2lnbmVkIGludCAgICB2YWwgICAgPSAqX3JlYWQ7CisKKworICAgICAgeCA9IGJsaXQtPndpZHRoOworICAgICAgZG8KKyAgICAgIHsKKyAgICAgICAgaWYgKCBtYXNrID09IDB4ODAgKQorICAgICAgICAgIHZhbCA9ICpfcmVhZCsrOworICAgICAgICAgIAorICAgICAgICBpZiAoIHZhbCAmIG1hc2sgKQorICAgICAgICAgICpfd3JpdGUgPSAodW5zaWduZWQgY2hhciljb2xvci52YWx1ZTsKKworICAgICAgICBtYXNrID4+PSAxOworICAgICAgICBpZiAoIG1hc2sgPT0gMCApCisgICAgICAgICAgbWFzayA9IDB4ODA7CisKKyAgICAgICAgX3dyaXRlKys7CisgICAgICAgIHgtLTsKKyAgICAgIH0gd2hpbGUgKCB4ID4gMCApOworCisgICAgICByZWFkICArPSBibGl0LT5yZWFkX2xpbmU7CisgICAgICB3cml0ZSArPSBibGl0LT53cml0ZV9saW5lOworICAgICAgeS0tOworICAgIH0gd2hpbGUgKCB5ID4gMCApOworICB9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPEZ1bmN0aW9uPiBibGl0X21vbm9fdG9fcGFsNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIHN0YXRpYworICB2b2lkICBibGl0X21vbm9fdG9fcGFsNCggZ3JCbGl0dGVyKiAgYmxpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyQ29sb3IgICAgIGNvbG9yICkKKyAgeworICAgIGludCAgICAgICAgICAgICB4LCB5LCBwaGFzZTsKKyAgICB1bnNpZ25lZCBpbnQgICAgbGVmdF9tYXNrOworICAgIHVuc2lnbmVkIGNoYXIqICByZWFkOworICAgIHVuc2lnbmVkIGNoYXIqICB3cml0ZTsKKyAgICB1bnNpZ25lZCBjaGFyICAgY29sOworCisKKyAgICBjb2wgICA9IGNvbG9yLnZhbHVlICYgMTU7CisgICAgcmVhZCAgPSBibGl0LT5yZWFkICArIChibGl0LT54cmVhZCA+PiAzKTsKKyAgICB3cml0ZSA9IGJsaXQtPndyaXRlICsgKGJsaXQtPnh3cml0ZSA+PiAxKTsKKworICAgIC8qIG5vdyBiZWdpbiBibGl0ICovCisgICAgbGVmdF9tYXNrID0gMHg4MCA+PiAoYmxpdC0+eHJlYWQgJiA3KTsKKyAgICBwaGFzZSAgICAgPSBibGl0LT54d3JpdGUgJiAxOworCisgICAgeSA9IGJsaXQtPmhlaWdodDsKKyAgICBkbworICAgIHsKKyAgICAgIHVuc2lnbmVkIGNoYXIqICBfcmVhZCAgPSByZWFkOworICAgICAgdW5zaWduZWQgY2hhciogIF93cml0ZSA9IHdyaXRlOworICAgICAgdW5zaWduZWQgaW50ICAgIG1hc2sgICA9IGxlZnRfbWFzazsKKyAgICAgIGludCAgICAgICAgICAgICBfcGhhc2UgPSBwaGFzZTsKKyAgICAgIHVuc2lnbmVkIGludCAgICB2YWwgICAgPSAqX3JlYWQ7CisKKyAgICAgIHggPSBibGl0LT53aWR0aDsKKyAgICAgIGRvCisgICAgICB7CisgICAgICAgIGlmICggbWFzayA9PSAweDgwICkKKyAgICAgICAgICB2YWwgPSAqX3JlYWQrKzsKKworICAgICAgICBpZiAoIHZhbCAmIG1hc2sgKQorICAgICAgICB7CisgICAgICAgICAgaWYgKCBfcGhhc2UgKQorICAgICAgICAgICAgKl93cml0ZSA9ICgqX3dyaXRlICYgMHhGMCkgfCBjb2w7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgKl93cml0ZSA9ICgqX3dyaXRlICYgMHgwRikgfCAoY29sIDw8IDQpOworICAgICAgICB9CisKKyAgICAgICAgbWFzayA+Pj0gMTsKKyAgICAgICAgaWYgKCBtYXNrID09IDAgKQorICAgICAgICAgIG1hc2sgPSAweDgwOworCisgICAgICAgIF93cml0ZSArPSBfcGhhc2U7CisgICAgICAgIF9waGFzZSBePSAxOworICAgICAgICB4LS07CisgICAgICB9IHdoaWxlICggeCA+IDAgKTsKKworICAgICAgcmVhZCAgKz0gYmxpdC0+cmVhZF9saW5lOworICAgICAgd3JpdGUgKz0gYmxpdC0+d3JpdGVfbGluZTsKKyAgICAgIHktLTsKKyAgICB9IHdoaWxlICggeSA+IDAgKTsKKyAgfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIDxGdW5jdGlvbj4gYmxpdF9tb25vX3RvX3JnYjE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICBzdGF0aWMKKyAgdm9pZCAgYmxpdF9tb25vX3RvX3JnYjE2KCBnckJsaXR0ZXIqICBibGl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyQ29sb3IgICAgIGNvbG9yICkKKyAgeworICAgIGludCAgICAgICAgICAgICAgeCwgeTsKKyAgICB1bnNpZ25lZCBpbnQgICAgIGxlZnRfbWFzazsKKyAgICB1bnNpZ25lZCBjaGFyKiAgIHJlYWQ7CisgICAgdW5zaWduZWQgY2hhciogICB3cml0ZTsKKyAgICAKKyAgICByZWFkICA9IGJsaXQtPnJlYWQgKyAoYmxpdC0+eHJlYWQgPj4gMyk7CisgICAgd3JpdGUgPSBibGl0LT53cml0ZSArIGJsaXQtPnh3cml0ZSoyOworCisgICAgbGVmdF9tYXNrID0gMHg4MCA+PiAoYmxpdC0+eHJlYWQgJiA3KTsKKworICAgIHkgPSBibGl0LT5oZWlnaHQ7CisgICAgZG8KKyAgICB7CisgICAgICB1bnNpZ25lZCBjaGFyKiAgX3JlYWQgID0gcmVhZDsKKyAgICAgIHVuc2lnbmVkIGNoYXIqICBfd3JpdGUgPSB3cml0ZTsKKyAgICAgIHVuc2lnbmVkIGludCAgICBtYXNrICAgPSBsZWZ0X21hc2s7CisgICAgICB1bnNpZ25lZCBpbnQgICAgdmFsICAgID0gKl9yZWFkOworCisgICAgICB4ID0gYmxpdC0+d2lkdGg7CisgICAgICBkbworICAgICAgeworICAgICAgICBpZiAoIG1hc2sgPT0gMHg4MCApCisgICAgICAgICAgdmFsID0gKl9yZWFkKys7CisKKyAgICAgICAgaWYgKCB2YWwgJiBtYXNrICkKKyAgICAgICAgICAqKHNob3J0Kilfd3JpdGUgPSAoc2hvcnQpY29sb3IudmFsdWU7CisKKyAgICAgICAgbWFzayA+Pj0gMTsKKyAgICAgICAgaWYgKCBtYXNrID09IDAgKQorICAgICAgICAgIG1hc2sgPSAweDgwOworCisgICAgICAgIF93cml0ZSArPTI7CisgICAgICAgIHgtLTsKKyAgICAgIH0gd2hpbGUgKCB4ID4gMCApOworCisgICAgICByZWFkICArPSBibGl0LT5yZWFkX2xpbmU7CisgICAgICB3cml0ZSArPSBibGl0LT53cml0ZV9saW5lOworICAgICAgeS0tOworICAgIH0gd2hpbGUgKCB5ID4gMCApOworICB9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPEZ1bmN0aW9uPiBibGl0X21vbm9fdG9fcmdiMjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIHN0YXRpYworICB2b2lkICBibGl0X21vbm9fdG9fcmdiMjQoIGdyQmxpdHRlciogIGJsaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JDb2xvciAgICAgY29sb3IgKQorICB7CisgICAgaW50ICAgICAgICAgICAgIHgsIHk7CisgICAgdW5zaWduZWQgaW50ICAgIGxlZnRfbWFzazsKKyAgICB1bnNpZ25lZCBjaGFyKiAgcmVhZDsKKyAgICB1bnNpZ25lZCBjaGFyKiAgd3JpdGU7CisgICAgCisgICAgcmVhZCAgPSBibGl0LT5yZWFkICArIChibGl0LT54cmVhZCA+PiAzKTsKKyAgICB3cml0ZSA9IGJsaXQtPndyaXRlICsgYmxpdC0+eHdyaXRlKjM7CisKKyAgICBsZWZ0X21hc2sgPSAweDgwID4+IChibGl0LT54cmVhZCAmIDcpOworCisgICAgeSA9IGJsaXQtPmhlaWdodDsKKyAgICBkbworICAgIHsKKyAgICAgIHVuc2lnbmVkIGNoYXIqICBfcmVhZCAgPSByZWFkOworICAgICAgdW5zaWduZWQgY2hhciogIF93cml0ZSA9IHdyaXRlOworICAgICAgdW5zaWduZWQgaW50ICAgIG1hc2sgICA9IGxlZnRfbWFzazsKKyAgICAgIHVuc2lnbmVkIGludCAgICB2YWwgICAgPSAqX3JlYWQ7CisKKyAgICAgIHggPSBibGl0LT53aWR0aDsKKyAgICAgIGRvCisgICAgICB7CisgICAgICAgIGlmICggbWFzayA9PSAweDgwICkKKyAgICAgICAgICB2YWwgPSAqX3JlYWQrKzsKKworICAgICAgICBpZiAoIHZhbCAmIG1hc2sgKQorICAgICAgICB7CisgICAgICAgICAgX3dyaXRlWzBdID0gY29sb3IuY2hyb21hWzBdOworICAgICAgICAgIF93cml0ZVsxXSA9IGNvbG9yLmNocm9tYVsxXTsKKyAgICAgICAgICBfd3JpdGVbMl0gPSBjb2xvci5jaHJvbWFbMl07CisgICAgICAgIH0KKworICAgICAgICBtYXNrID4+PSAxOworICAgICAgICBpZiAoIG1hc2sgPT0gMCApCisgICAgICAgICAgbWFzayA9IDB4ODA7CisKKyAgICAgICAgX3dyaXRlICs9IDM7CisgICAgICAgIHgtLTsKKyAgICAgIH0gd2hpbGUgKCB4ID4gMCApOworCisgICAgICByZWFkICArPSBibGl0LT5yZWFkX2xpbmU7CisgICAgICB3cml0ZSArPSBibGl0LT53cml0ZV9saW5lOworICAgICAgeS0tOworICAgIH0gd2hpbGUgKCB5ID4gMCApOworICB9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPEZ1bmN0aW9uPiBibGl0X21vbm9fdG9fcmdiMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIHN0YXRpYworICB2b2lkICBibGl0X21vbm9fdG9fcmdiMzIoIGdyQmxpdHRlciogIGJsaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JDb2xvciAgICAgY29sb3IgKQorICB7CisgICAgaW50ICAgICAgICAgICAgIHgsIHk7CisgICAgdW5zaWduZWQgaW50ICAgIGxlZnRfbWFzazsKKyAgICB1bnNpZ25lZCBjaGFyKiAgcmVhZDsKKyAgICB1bnNpZ25lZCBjaGFyKiAgd3JpdGU7CisgICAgIAorICAgIHJlYWQgID0gYmxpdC0+cmVhZCAgKyAoYmxpdC0+eHJlYWQgPj4gMyk7CisgICAgd3JpdGUgPSBibGl0LT53cml0ZSArIGJsaXQtPnh3cml0ZSo0OworCisgICAgbGVmdF9tYXNrID0gMHg4MCA+PiAoYmxpdC0+eHJlYWQgJiA3KTsKKworICAgIHkgPSBibGl0LT5oZWlnaHQ7CisgICAgZG8KKyAgICB7CisgICAgICB1bnNpZ25lZCBjaGFyKiAgX3JlYWQgID0gcmVhZDsKKyAgICAgIHVuc2lnbmVkIGNoYXIqICBfd3JpdGUgPSB3cml0ZTsKKyAgICAgIHVuc2lnbmVkIGludCAgICBtYXNrICAgPSBsZWZ0X21hc2s7CisgICAgICB1bnNpZ25lZCBpbnQgICAgdmFsICAgID0gKl9yZWFkOworCisgICAgICB4ID0gYmxpdC0+d2lkdGg7CisgICAgICBkbworICAgICAgeworICAgICAgICBpZiAoIG1hc2sgPT0gMHg4MCApCisgICAgICAgICAgdmFsID0gKl9yZWFkKys7CisKKyAgICAgICAgaWYgKCB2YWwgJiBtYXNrICkKKyAgICAgICAgeworICAgLyogdGhpcyBjb3VsZCBiZSBncmVhdGx5IG9wdGltaXNlZCBhcyBhICoobG9uZyopX3dyaXRlID0gY29sb3IudmFsdWUgKi8KKyAgIC8qIGJ1dCB0aGlzIHdvdWxkbid0IHdvcmsgb24gNjQtYml0cyBzeXN0ZW1zLi4uIHN0dXBpZCBDIHR5cGVzISAgICAgICovCisgICAgICAgICAgX3dyaXRlWzBdID0gY29sb3IuY2hyb21hWzBdOworICAgICAgICAgIF93cml0ZVsxXSA9IGNvbG9yLmNocm9tYVsxXTsKKyAgICAgICAgICBfd3JpdGVbMl0gPSBjb2xvci5jaHJvbWFbMl07CisgICAgICAgICAgX3dyaXRlWzNdID0gY29sb3IuY2hyb21hWzNdOworICAgICAgICB9CisKKyAgICAgICAgbWFzayA+Pj0gMTsKKyAgICAgICAgaWYgKCBtYXNrID09IDAgKQorICAgICAgICAgIG1hc2sgPSAweDgwOworCisgICAgICAgIF93cml0ZSArPSA0OworICAgICAgICB4LS07CisgICAgICB9IHdoaWxlICggeCA+IDAgKTsKKworICAgICAgcmVhZCAgKz0gYmxpdC0+cmVhZF9saW5lOworICAgICAgd3JpdGUgKz0gYmxpdC0+d3JpdGVfbGluZTsKKyAgICAgIHktLTsKKyAgICB9IHdoaWxlICggeSA+IDAgKTsKKyAgfQorCisKKworICBzdGF0aWMKKyAgY29uc3QgZ3JCbGl0dGVyRnVuYyAgZ3JfbW9ub19ibGl0dGVyc1tncl9waXhlbF9tb2RlX21heF0gPQorICB7CisgICAgMCwKKyAgICBibGl0X21vbm9fdG9fbW9ubywKKyAgICBibGl0X21vbm9fdG9fcGFsNCwKKyAgICBibGl0X21vbm9fdG9fcGFsOCwKKyAgICBibGl0X21vbm9fdG9fcGFsOCwKKyAgICBibGl0X21vbm9fdG9fcmdiMTYsCisgICAgYmxpdF9tb25vX3RvX3JnYjE2LAorICAgIGJsaXRfbW9ub190b19yZ2IyNCwKKyAgICBibGl0X21vbm9fdG9fcmdiMzIKKyAgfTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgIFNhdHVyYXRpb24gdGFibGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICB0eXBlZGVmIHN0cnVjdCBnclNhdHVyYXRpb25fCisgIHsKKyAgICBpbnQgICAgICAgICAgY291bnQ7CisgICAgY29uc3QgYnl0ZSogIHRhYmxlOworICAKKyAgfSBnclNhdHVyYXRpb247CisgIAorICAKKyAgc3RhdGljCisgIGNvbnN0IGJ5dGUgIGdyX3NhdHVyYXRpb25fNVs4XSA9IHsgMCwgMSwgMiwgMywgNCwgNCwgNCwgNCB9OworICAKKworICBzdGF0aWMKKyAgY29uc3QgYnl0ZSAgZ3Jfc2F0dXJhdGlvbl8xN1szMl0gPQorICB7CisgICAgIDAsICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3LCAgOCwgIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIAorICB9OworCisKKyAgc3RhdGljCisgIGdyU2F0dXJhdGlvbiAgZ3Jfc2F0dXJhdGlvbnNbIEdSX01BWF9TQVRVUkFUSU9OUyBdID0KKyAgeworICAgIHsgIDUsIGdyX3NhdHVyYXRpb25fNSAgfSwKKyAgICB7IDE3LCBncl9zYXR1cmF0aW9uXzE3IH0KKyAgfTsKKworICBzdGF0aWMKKyAgaW50ICBncl9udW1fc2F0dXJhdGlvbnMgPSAyOworCisgIHN0YXRpYworICBnclNhdHVyYXRpb24qICBncl9sYXN0X3NhdHVyYXRpb24gPSBncl9zYXR1cmF0aW9uczsKKworCisgIGV4dGVybgorICBjb25zdCBieXRlKiAgZ3JHZXRTYXR1cmF0aW9uKCBpbnQgIG51bV9ncmF5cyApCisgIHsKKyAgICAvKiBmaXJzdCBvZiBhbGwsIHNjYW4gdGhlIGN1cnJlbnQgc2F0dXJhdGlvbnMgdGFibGUgKi8KKyAgICBnclNhdHVyYXRpb24qICBzYXQgICA9IGdyX3NhdHVyYXRpb25zOworICAgIGdyU2F0dXJhdGlvbiogIGxpbWl0ID0gc2F0ICsgZ3JfbnVtX3NhdHVyYXRpb25zOworCisgICAgaWYgKCBudW1fZ3JheXMgPCAyICkKKyAgICB7CisgICAgICBnckVycm9yID0gZ3JfZXJyX2JhZF9hcmd1bWVudDsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAgCisgICAgZm9yICggOyBzYXQgPCBsaW1pdDsgc2F0KysgKQorICAgIHsKKyAgICAgIGlmICggc2F0LT5jb3VudCA9PSBudW1fZ3JheXMgKQorICAgICAgeworICAgICAgICBncl9sYXN0X3NhdHVyYXRpb24gPSBzYXQ7CisgICAgICAgIHJldHVybiBzYXQtPnRhYmxlOworICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKiBub3QgZm91bmQsIHNpbXBseSBjcmVhdGUgYSBuZXcgZW50cnkgaWYgdGhlcmUgaXMgcm9vbSAqLworICAgIGlmIChncl9udW1fc2F0dXJhdGlvbnMgPCBHUl9NQVhfU0FUVVJBVElPTlMpCisgICAgeworICAgICAgaW50ICAgICAgICAgIGk7CisgICAgICBjb25zdCBieXRlKiAgdGFibGU7CisgICAgICAKKyAgICAgIHRhYmxlID0gKGNvbnN0IGJ5dGUqKWdyQWxsb2MoICgzKm51bV9ncmF5cy0xKSpzaXplb2YoYnl0ZSkgKTsKKyAgICAgIGlmICghdGFibGUpIHJldHVybiAwOworICAgICAgICAKKyAgICAgIHNhdC0+Y291bnQgPSBudW1fZ3JheXM7CisgICAgICBzYXQtPnRhYmxlID0gdGFibGU7CisgICAgICAKKyAgICAgIGZvciAoIGkgPSAwOyBpIDwgbnVtX2dyYXlzOyBpKyssIHRhYmxlKysgKQorICAgICAgICAqKHVuc2lnbmVkIGNoYXIqKXRhYmxlID0gKHVuc2lnbmVkIGNoYXIpaTsgIAorICAgICAgCisgICAgICBmb3IgKCBpID0gMipudW1fZ3JheXMtMTsgaSA+IDA7IGktLSwgdGFibGUrKyApCisgICAgICAgICoodW5zaWduZWQgY2hhciopdGFibGUgPSAodW5zaWduZWQgY2hhcikobnVtX2dyYXlzLTEpOyAgIAorICAgICAgICAKKyAgICAgIGdyX251bV9zYXR1cmF0aW9ucysrOworICAgICAgZ3JfbGFzdF9zYXR1cmF0aW9uID0gc2F0OworICAgICAgcmV0dXJuIHNhdC0+dGFibGU7CisgICAgfQorICAgIGdyRXJyb3IgPSBncl9lcnJfc2F0dXJhdGlvbl9vdmVyZmxvdzsKKyAgICByZXR1cm4gMDsKKyAgfQorCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICBjb252ZXJzaW9uIHRhYmxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgdHlwZWRlZiBzdHJ1Y3QgZ3JDb252ZXJzaW9uXworICB7CisgICAgaW50ICAgICAgICAgIHRhcmdldF9ncmF5czsKKyAgICBpbnQgICAgICAgICAgc291cmNlX2dyYXlzOworICAgIGNvbnN0IGJ5dGUqICB0YWJsZTsKKyAgCisgIH0gZ3JDb252ZXJzaW9uOworICAKKyAgCisgIAorICBzdGF0aWMKKyAgY29uc3QgYnl0ZSAgZ3JfZ3JheTVfdG9fZ3JheTE3WzVdID0geyAwLCA0LCA4LCAxMiwgMTYgfTsKKworCisgIHN0YXRpYworICBjb25zdCBieXRlICBncl9ncmF5NV90b19ncmF5MTI4WzVdID0geyAwLCAzMiwgNjQsIDk2LCAxMjcgfTsKKworCisgIHN0YXRpYworICBjb25zdCB1bnNpZ25lZCBjaGFyICBncl9ncmF5MTdfdG9fZ3JheTEyOFsxN10gPQorICB7CisgICAgMCwgOCwgMTYsIDI0LCAzMiwgNDAsIDQ4LCA1NiwgNjQsIDcyLCA4MCwgODgsIDk2LCAxMDQsIDExMiwgMTIwLCAxMjcKKyAgfTsKKworICBzdGF0aWMKKyAgZ3JDb252ZXJzaW9uICBncl9jb252ZXJzaW9uc1sgR1JfTUFYX0NPTlZFUlNJT05TIF0gPQorICB7CisgICAgeyAgMTcsICA1LCBncl9ncmF5NV90b19ncmF5MTcgICB9LAorICAgIHsgMTI4LCAgNSwgZ3JfZ3JheTVfdG9fZ3JheTEyOCAgfSwKKyAgICB7IDEyOCwgMTcsIGdyX2dyYXkxN190b19ncmF5MTI4IH0KKyAgfTsKKworICBzdGF0aWMKKyAgaW50ICBncl9udW1fY29udmVyc2lvbnMgPSAzOworCisgIHN0YXRpYworICBnckNvbnZlcnNpb24qICBncl9sYXN0X2NvbnZlcnNpb24gPSBncl9jb252ZXJzaW9uczsKKworCisgIGV4dGVybgorICBjb25zdCBieXRlKiAgZ3JHZXRDb252ZXJzaW9uKCBpbnQgIHRhcmdldF9ncmF5cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICBzb3VyY2VfZ3JheXMgKQorICB7CisgICAgZ3JDb252ZXJzaW9uKiAgY29udiAgPSBncl9jb252ZXJzaW9uczsKKyAgICBnckNvbnZlcnNpb24qICBsaW1pdCA9IGNvbnYgKyBncl9udW1fY29udmVyc2lvbnM7CisgICAKKyAgICBpZiAoIHRhcmdldF9ncmF5cyA8IDIgfHwgc291cmNlX2dyYXlzIDwgMiApCisgICAgeworICAgICAgZ3JFcnJvciA9IGdyX2Vycl9iYWRfYXJndW1lbnQ7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgCisgICAgLyogb3RoZXJ3aXNlLCBzY2FuIHRhYmxlICovCisgICAgZm9yICggOyBjb252IDwgbGltaXQ7IGNvbnYrKyApCisgICAgeworICAgICAgaWYgKCBjb252LT50YXJnZXRfZ3JheXMgPT0gdGFyZ2V0X2dyYXlzICYmCisgICAgICAgICAgIGNvbnYtPnNvdXJjZV9ncmF5cyA9PSBzb3VyY2VfZ3JheXMgKQorICAgICAgeworICAgICAgICBncl9sYXN0X2NvbnZlcnNpb24gPSBjb252OworICAgICAgICByZXR1cm4gY29udi0+dGFibGU7CisgICAgICB9CisgICAgfQorICAgIAorICAgIC8qIG5vdCBmb3VuZCwgYWRkIGEgbmV3IGNvbnZlcnNpb24gdG8gdGhlIHRhYmxlICovCisgICAgaWYgKGdyX251bV9jb252ZXJzaW9ucyA8IEdSX01BWF9DT05WRVJTSU9OUykKKyAgICB7CisgICAgICBjb25zdCBieXRlKiAgdGFibGU7CisgICAgICBpbnQgICAgICAgICAgbjsKKworICAgICAgdGFibGUgPSAoY29uc3QgYnl0ZSopZ3JBbGxvYyggc291cmNlX2dyYXlzKnNpemVvZihieXRlKSApOworICAgICAgaWYgKCF0YWJsZSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIAorICAgICAgY29udi0+dGFyZ2V0X2dyYXlzID0gdGFyZ2V0X2dyYXlzOworICAgICAgY29udi0+c291cmNlX2dyYXlzID0gc291cmNlX2dyYXlzOworICAgICAgY29udi0+dGFibGUgICAgICAgID0gdGFibGU7CisKKyAgICAgIGZvciAoIG4gPSAwOyBuIDwgc291cmNlX2dyYXlzOyBuKysgKQorICAgICAgICAoKHVuc2lnbmVkIGNoYXIqKXRhYmxlKVtuXSA9ICh1bnNpZ25lZCBjaGFyKShuKih0YXJnZXRfZ3JheXMtMSkpIC8gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzb3VyY2VfZ3JheXMtMSk7CisgICAgICAgICAgICAKKyAgICAgIGdyX251bV9jb252ZXJzaW9ucysrOworICAgICAgZ3JfbGFzdF9jb252ZXJzaW9uID0gY29udjsKKyAgICAgIHJldHVybiB0YWJsZTsKKyAgICB9CisgICAgZ3JFcnJvciA9IGdyX2Vycl9jb252ZXJzaW9uX292ZXJmbG93OworICAgIHJldHVybiAwOworICB9CisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIDxGdW5jdGlvbj4gYmxpdF9ncmF5X3RvX2dyYXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICBzdGF0aWMKKyAgdm9pZCAgYmxpdF9ncmF5X3RvX2dyYXkoIGdyQmxpdHRlciogICBibGl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYnl0ZSogIHNhdHVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBieXRlKiAgY29udmVyc2lvbiApCisgIHsKKyAgICBpbnQgICAgICAgICAgICAgeTsKKyAgICB1bnNpZ25lZCBjaGFyKiAgcmVhZDsKKyAgICB1bnNpZ25lZCBjaGFyKiAgd3JpdGU7CisgICAgdW5zaWduZWQgY2hhciAgIG1heDE7CisgICAgdW5zaWduZWQgY2hhciAgIG1heDI7CisKKyAgICBtYXgxICA9ICh1bnNpZ25lZCBjaGFyKShibGl0LT5zb3VyY2UuZ3JheXMtMSk7CisgICAgbWF4MiAgPSAodW5zaWduZWQgY2hhcikoYmxpdC0+dGFyZ2V0LmdyYXlzLTEpOworICAgIAorICAgIHJlYWQgID0gKHVuc2lnbmVkIGNoYXIqKWJsaXQtPnJlYWQgICsgYmxpdC0+eHJlYWQ7CisgICAgd3JpdGUgPSAodW5zaWduZWQgY2hhciopYmxpdC0+d3JpdGUgKyBibGl0LT54d3JpdGU7CisKKyAgICB5ID0gYmxpdC0+aGVpZ2h0OworICAgIGRvCisgICAgeworICAgICAgdW5zaWduZWQgY2hhciogIF9yZWFkICA9IHJlYWQ7CisgICAgICB1bnNpZ25lZCBjaGFyKiAgX3dyaXRlID0gd3JpdGU7CisgICAgICBpbnQgICAgICAgICAgICAgeCAgICAgID0gYmxpdC0+d2lkdGg7CisKKyAgICAgIHdoaWxlICh4ID4gMCkKKyAgICAgIHsKKyNpZmRlZiBHUl9DT05GSUdfR1JBWV9TS0lQX1dISVRFCisgICAgICAgIHVuc2lnbmVkIGNoYXIgdmFsID0gKl9yZWFkOworICAgICAgICAKKyAgICAgICAgaWYgKHZhbCkKKyAgICAgICAgeworICAgICAgICAgIGlmICh2YWwgPT0gbWF4KQorICAgICAgICAgICAgKl93cml0ZSA9IG1heDI7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgKl93cml0ZSA9IHNhdHVyYXRpb25bIChpbnQpKl93cml0ZSArIGNvbnZlcnNpb25bICpfcmVhZCBdIF07CisgICAgICAgIH0KKyNlbHNlCisgICAgICAgICpfd3JpdGUgPSBzYXR1cmF0aW9uWyAoaW50KSpfd3JpdGUgKyBjb252ZXJzaW9uWyAqX3JlYWQgXSBdOworI2VuZGlmCisgICAgICAgIF93cml0ZSsrOworICAgICAgICBfcmVhZCsrOworICAgICAgICB4LS07CisgICAgICB9CisgICAgICAKKyAgICAgIHJlYWQgICs9IGJsaXQtPnJlYWRfbGluZTsKKyAgICAgIHdyaXRlICs9IGJsaXQtPndyaXRlX2xpbmU7CisgICAgICB5LS07CisgICAgfQorICAgIHdoaWxlICh5ID4gMCk7CisgIH0KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA8RnVuY3Rpb24+IGJsaXRfZ3JheV90b19ncmF5X3NpbXBsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgc3RhdGljCisgIHZvaWQgIGJsaXRfZ3JheV90b19ncmF5X3NpbXBsZSggZ3JCbGl0dGVyKiAgIGJsaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYnl0ZSogIHNhdHVyYXRpb24gKQorICB7CisgICAgaW50ICAgICAgICAgICAgIHk7CisgICAgdW5zaWduZWQgY2hhciogIHJlYWQ7CisgICAgdW5zaWduZWQgY2hhciogIHdyaXRlOworICAgIHVuc2lnbmVkIGNoYXIgICBtYXg7CisKKyAgICBtYXggICA9ICh1bnNpZ25lZCBjaGFyKShibGl0LT5zb3VyY2UuZ3JheXMtMSk7CisgICAgCisgICAgcmVhZCAgPSAodW5zaWduZWQgY2hhciopYmxpdC0+cmVhZCAgKyBibGl0LT54cmVhZDsKKyAgICB3cml0ZSA9ICh1bnNpZ25lZCBjaGFyKilibGl0LT53cml0ZSArIGJsaXQtPnh3cml0ZTsKKworICAgIHkgPSBibGl0LT5oZWlnaHQ7CisgICAgZG8KKyAgICB7CisgICAgICB1bnNpZ25lZCBjaGFyKiAgX3JlYWQgID0gcmVhZDsKKyAgICAgIHVuc2lnbmVkIGNoYXIqICBfd3JpdGUgPSB3cml0ZTsKKyAgICAgIGludCAgICAgICAgICAgICB4ICAgICAgPSBibGl0LT53aWR0aDsKKworICAgICAgd2hpbGUgKHggPiAwKQorICAgICAgeworI2lmZGVmIEdSX0NPTkZJR19HUkFZX1NLSVBfV0hJVEUKKyAgICAgICAgdW5zaWduZWQgY2hhciB2YWwgPSAqX3JlYWQ7CisgICAgICAgIAorICAgICAgICBpZiAodmFsKQorICAgICAgICB7CisgICAgICAgICAgaWYgKHZhbCA9PSBtYXgpCisgICAgICAgICAgICAqX3dyaXRlID0gdmFsOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICpfd3JpdGUgPSBzYXR1cmF0aW9uWyAoaW50KSpfd3JpdGUgKyAqX3JlYWQgXTsKKyAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgKl93cml0ZSA9IHNhdHVyYXRpb25bIChpbnQpKl93cml0ZSArICpfcmVhZCBdOworI2VuZGlmCisgICAgICAgIF93cml0ZSsrOworICAgICAgICBfcmVhZCsrOworICAgICAgICB4LS07CisgICAgICB9CisgICAgICAKKyAgICAgIHJlYWQgICs9IGJsaXQtPnJlYWRfbGluZTsKKyAgICAgIHdyaXRlICs9IGJsaXQtPndyaXRlX2xpbmU7CisgICAgICB5LS07CisgICAgfQorICAgIHdoaWxlICh5ID4gMCk7CisgIH0KKworCisKKyNkZWZpbmUgIGNvbXBvc2VfcGl4ZWwoIGEsIGIsIG4sIG1heCApICAgICAgIFwKKyAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgaW50ICBkLCBoYWxmID0gbWF4ID4+IDE7ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgZCA9IChpbnQpYi5jaHJvbWFbMF0gLSBhLmNocm9tYVswXTsgXAorICAgICBhLmNocm9tYVswXSArPSAobipkICsgaGFsZikvbWF4OyAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgZCA9IChpbnQpYi5jaHJvbWFbMV0gLSBhLmNocm9tYVsxXTsgXAorICAgICBhLmNocm9tYVsxXSArPSAobipkICsgaGFsZikvbWF4OyAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgZCA9IChpbnQpYi5jaHJvbWFbMl0gLSBhLmNocm9tYVsyXTsgXAorICAgICBhLmNocm9tYVsyXSArPSAobipkICsgaGFsZikvbWF4OyAgICAgIFwKKyAgIH0KKworCisjZGVmaW5lICBleHRyYWN0NTU1KCBwaXhlbCwgY29sb3IgKSAgICAgICAgICAgXAorICAgY29sb3IuY2hyb21hWzBdID0gKHBpeGVsID4+IDEwKSAmIDB4MUY7ICBcCisgICBjb2xvci5jaHJvbWFbMV0gPSAocGl4ZWwgPj4gIDUpICYgMHgxRjsgIFwKKyAgIGNvbG9yLmNocm9tYVsyXSA9IChwaXhlbCAgICAgICkgJiAweDFGOworICAgCisKKyNkZWZpbmUgIGV4dHJhY3Q1NjUoIHBpeGVsLCBjb2xvciApICAgICAgICAgICBcCisgICBjb2xvci5jaHJvbWFbMF0gPSAocGl4ZWwgPj4gMTEpICYgMHgxRjsgIFwKKyAgIGNvbG9yLmNocm9tYVsxXSA9IChwaXhlbCA+PiAgNSkgJiAweDNGOyAgXAorICAgY29sb3IuY2hyb21hWzJdID0gKHBpeGVsICAgICAgKSAmIDB4MUY7CisKKworI2RlZmluZSAgaW5qZWN0NTU1KCBjb2xvciApICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgKCAoICh1bnNpZ25lZCBzaG9ydCljb2xvci5jaHJvbWFbMF0gPDwgMTAgKSB8ICAgIFwKKyAgICAgKCAodW5zaWduZWQgc2hvcnQpY29sb3IuY2hyb21hWzFdIDw8ICA1ICkgfCAgICBcCisgICAgICAgY29sb3IuY2hyb21hWzJdICAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgIAorCisjZGVmaW5lICBpbmplY3Q1NjUoIGNvbG9yICkgICAgICAgICBcCisgICAoICggKHVuc2lnbmVkIHNob3J0KWNvbG9yLmNocm9tYVswXSA8PCAxMSApIHwgICAgXAorICAgICAoICh1bnNpZ25lZCBzaG9ydCljb2xvci5jaHJvbWFbMV0gPDwgIDUgKSB8ICAgIFwKKyAgICAgICBjb2xvci5jaHJvbWFbMl0gICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIDxGdW5jdGlvbj4gYmxpdF9ncmF5X3RvXzU1NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICBzdGF0aWMKKyAgdm9pZCAgYmxpdF9ncmF5X3RvXzU1NSggZ3JCbGl0dGVyKiAgYmxpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JDb2xvciAgICAgY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgIG1heCApCisgIHsKKyAgICBpbnQgICAgICAgICAgICAgeTsKKyAgICB1bnNpZ25lZCBjaGFyKiAgcmVhZDsKKyAgICB1bnNpZ25lZCBjaGFyKiAgd3JpdGU7CisgICAgbG9uZyAgICAgICAgICAgIGNvbG9yMjsKKworICAgIHJlYWQgICA9IGJsaXQtPnJlYWQgICsgYmxpdC0+eHJlYWQ7CisgICAgd3JpdGUgID0gYmxpdC0+d3JpdGUgKyAyKmJsaXQtPnh3cml0ZTsKKyAgICAKKyAgICAvKiBjb252ZXJ0IGNvbG9yIHRvIFI6RzpCIHRyaXBsZXQgKi8KKyAgICBjb2xvcjIgPSBjb2xvci52YWx1ZTsKKyAgICBleHRyYWN0NTU1KCBjb2xvcjIsIGNvbG9yICk7CisKKyAgICB5ID0gYmxpdC0+aGVpZ2h0OworICAgIGRvCisgICAgeworICAgICAgdW5zaWduZWQgY2hhciogIF9yZWFkICA9IHJlYWQ7CisgICAgICB1bnNpZ25lZCBjaGFyKiAgX3dyaXRlID0gd3JpdGU7CisgICAgICBpbnQgICAgICAgICAgICAgeCAgICAgID0gYmxpdC0+d2lkdGg7CisKKyAgICAgIHdoaWxlICh4ID4gMCkKKyAgICAgIHsKKyAgICAgICAgdW5zaWduZWQgY2hhciAgIHZhbDsKKyAgICAgICAgCisgICAgICAgIHZhbCA9ICpfcmVhZDsKKyAgICAgICAgaWYgKHZhbCkKKyAgICAgICAgeworICAgICAgICAgIHVuc2lnbmVkIHNob3J0KiBwaXhlbCA9ICh1bnNpZ25lZCBzaG9ydCopX3dyaXRlOworICAgICAgICAgIAorICAgICAgICAgIGlmICh2YWwgPT0gbWF4KQorICAgICAgICAgIHsKKyAgICAgICAgICAgIHBpeGVsWzBdID0gKHNob3J0KWNvbG9yMjsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGNvbXBvc2UgZ3JheSB2YWx1ZSAqLworICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgIHBpeDE2ID0gKnBpeGVsOworICAgICAgICAgICAgZ3JDb2xvciAgICAgICAgIHBpeDsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgZXh0cmFjdDU1NSggcGl4MTYsIHBpeCApOworCisgICAgICAgICAgICBjb21wb3NlX3BpeGVsKCBwaXgsIGNvbG9yLCB2YWwsIG1heCApOworICAgICAgICAgICAgKnBpeGVsID0gaW5qZWN0NTU1KHBpeCk7CisgICAgICAgICAgfSAgCisgICAgICAgIH0KKyAgICAgICAgX3dyaXRlICs9IDI7CisgICAgICAgIF9yZWFkICArKzsKKyAgICAgICAgeC0tOworICAgICAgfQorICAgICAgCisgICAgICByZWFkICArPSBibGl0LT5yZWFkX2xpbmU7CisgICAgICB3cml0ZSArPSBibGl0LT53cml0ZV9saW5lOworICAgICAgeS0tOworICAgIH0KKyAgICB3aGlsZSAoeSA+IDApOworICB9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPEZ1bmN0aW9uPiBibGl0X2dyYXlfdG9fNTY1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIHN0YXRpYworICB2b2lkICBibGl0X2dyYXlfdG9fNTY1KCBnckJsaXR0ZXIqICBibGl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBnckNvbG9yICAgICBjb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgbWF4ICkKKyAgeworICAgIGludCAgICAgICAgICAgICB5OworICAgIHVuc2lnbmVkIGNoYXIqICByZWFkOworICAgIHVuc2lnbmVkIGNoYXIqICB3cml0ZTsKKyAgICBsb25nICAgICAgICAgICAgY29sb3IyOworCisgICAgcmVhZCAgID0gYmxpdC0+cmVhZCAgKyBibGl0LT54cmVhZDsKKyAgICB3cml0ZSAgPSBibGl0LT53cml0ZSArIDIqYmxpdC0+eHdyaXRlOworICAgIAorICAgIGNvbG9yMiA9IGNvbG9yLnZhbHVlOworICAgIGV4dHJhY3Q1NjUoIGNvbG9yMiwgY29sb3IgKTsKKworICAgIHkgPSBibGl0LT5oZWlnaHQ7CisgICAgZG8KKyAgICB7CisgICAgICB1bnNpZ25lZCBjaGFyKiAgX3JlYWQgID0gcmVhZDsKKyAgICAgIHVuc2lnbmVkIGNoYXIqICBfd3JpdGUgPSB3cml0ZTsKKyAgICAgIGludCAgICAgICAgICAgICB4ICAgICAgPSBibGl0LT53aWR0aDsKKworICAgICAgd2hpbGUgKHggPiAwKQorICAgICAgeworICAgICAgICB1bnNpZ25lZCBjaGFyICAgIHZhbDsKKyAgICAgICAgCisgICAgICAgIHZhbCA9ICpfcmVhZDsKKyAgICAgICAgaWYgKHZhbCkKKyAgICAgICAgeworICAgICAgICAgIHVuc2lnbmVkIHNob3J0KiBwaXhlbCA9ICh1bnNpZ25lZCBzaG9ydCopX3dyaXRlOworICAgICAgICAgIAorICAgICAgICAgIGlmICh2YWwgPT0gbWF4KQorICAgICAgICAgIHsKKyAgICAgICAgICAgIHBpeGVsWzBdID0gKHNob3J0KWNvbG9yMjsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGNvbXBvc2UgZ3JheSB2YWx1ZSAqLworICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgIHBpeDE2ID0gKnBpeGVsOworICAgICAgICAgICAgZ3JDb2xvciAgICAgICAgIHBpeDsKKworICAgICAgICAgICAgZXh0cmFjdDU2NSggcGl4MTYsIHBpeCApOyAgICAgICAgICAgIAorCisgICAgICAgICAgICBjb21wb3NlX3BpeGVsKCBwaXgsIGNvbG9yLCB2YWwsIG1heCApOworICAgICAgICAgICAgKnBpeGVsID0gaW5qZWN0NTY1KCBwaXggKTsKKyAgICAgICAgICB9ICAKKyAgICAgICAgfQorICAgICAgICBfd3JpdGUgKz0yOworICAgICAgICBfcmVhZCAgKys7CisgICAgICAgIHgtLTsKKyAgICAgIH0KKyAgICAgIAorICAgICAgcmVhZCAgKz0gYmxpdC0+cmVhZF9saW5lOworICAgICAgd3JpdGUgKz0gYmxpdC0+d3JpdGVfbGluZTsKKyAgICAgIHktLTsKKyAgICB9CisgICAgd2hpbGUgKHkgPiAwKTsKKyAgfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIDxGdW5jdGlvbj4gYmxpdF9ncmF5X3RvXzI0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICBzdGF0aWMKKyAgdm9pZCAgYmxpdF9ncmF5X3RvXzI0KCBnckJsaXR0ZXIqICBibGl0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGdyQ29sb3IgICAgIGNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgIG1heCApCisgIHsKKyAgICBpbnQgICAgICAgICAgICAgeTsKKyAgICB1bnNpZ25lZCBjaGFyKiAgcmVhZDsKKyAgICB1bnNpZ25lZCBjaGFyKiAgd3JpdGU7CisKKyAgICByZWFkICAgPSBibGl0LT5yZWFkICArIGJsaXQtPnhyZWFkOworICAgIHdyaXRlICA9IGJsaXQtPndyaXRlICsgMypibGl0LT54d3JpdGU7CisgICAgCisgICAgeSA9IGJsaXQtPmhlaWdodDsKKyAgICBkbworICAgIHsKKyAgICAgIHVuc2lnbmVkIGNoYXIqICBfcmVhZCAgPSByZWFkOworICAgICAgdW5zaWduZWQgY2hhciogIF93cml0ZSA9IHdyaXRlOworICAgICAgaW50ICAgICAgICAgICAgIHggICAgICA9IGJsaXQtPndpZHRoOworCisgICAgICB3aGlsZSAoeCA+IDApCisgICAgICB7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgICAgdmFsOworICAgICAgICAKKyAgICAgICAgdmFsID0gKl9yZWFkOworICAgICAgICBpZiAodmFsKQorICAgICAgICB7CisgICAgICAgICAgaWYgKHZhbCA9PSBtYXgpCisgICAgICAgICAgeworICAgICAgICAgICAgX3dyaXRlWzBdID0gY29sb3IuY2hyb21hWzBdOworICAgICAgICAgICAgX3dyaXRlWzFdID0gY29sb3IuY2hyb21hWzFdOworICAgICAgICAgICAgX3dyaXRlWzJdID0gY29sb3IuY2hyb21hWzJdOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgeworICAgICAgICAgICAgLyogY29tcG9zZSBncmF5IHZhbHVlICovCisgICAgICAgICAgICBnckNvbG9yIHBpeDsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgcGl4LmNocm9tYVswXSA9IF93cml0ZVswXTsKKyAgICAgICAgICAgIHBpeC5jaHJvbWFbMV0gPSBfd3JpdGVbMV07CisgICAgICAgICAgICBwaXguY2hyb21hWzJdID0gX3dyaXRlWzJdOworCisgICAgICAgICAgICBjb21wb3NlX3BpeGVsKCBwaXgsIGNvbG9yLCB2YWwsIG1heCApOworICAgICAgICAgICAgCisgICAgICAgICAgICBfd3JpdGVbMF0gPSBwaXguY2hyb21hWzBdOworICAgICAgICAgICAgX3dyaXRlWzFdID0gcGl4LmNocm9tYVsxXTsKKyAgICAgICAgICAgIF93cml0ZVsyXSA9IHBpeC5jaHJvbWFbMl07CisgICAgICAgICAgfSAgCisgICAgICAgIH0KKyAgICAgICAgX3dyaXRlICs9IDM7CisgICAgICAgIF9yZWFkICArKzsKKyAgICAgICAgeC0tOworICAgICAgfQorICAgICAgCisgICAgICByZWFkICArPSBibGl0LT5yZWFkX2xpbmU7CisgICAgICB3cml0ZSArPSBibGl0LT53cml0ZV9saW5lOworICAgICAgeS0tOworICAgIH0KKyAgICB3aGlsZSAoeSA+IDApOworICB9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPEZ1bmN0aW9uPiBibGl0X2dyYXlfdG9fMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIHN0YXRpYworICB2b2lkICBibGl0X2dyYXlfdG9fMzIoIGdyQmxpdHRlciogIGJsaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgZ3JDb2xvciAgICAgY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgbWF4ICkKKyAgeworICAgIGludCAgICAgICAgICAgICB5OworICAgIHVuc2lnbmVkIGNoYXIqICByZWFkOworICAgIHVuc2lnbmVkIGNoYXIqICB3cml0ZTsKKworICAgIHJlYWQgICA9IGJsaXQtPnJlYWQgICsgYmxpdC0+eHJlYWQ7CisgICAgd3JpdGUgID0gYmxpdC0+d3JpdGUgKyA0KmJsaXQtPnh3cml0ZTsKKyAgICAKKyAgICB5ID0gYmxpdC0+aGVpZ2h0OworICAgIGRvCisgICAgeworICAgICAgdW5zaWduZWQgY2hhciogIF9yZWFkICA9IHJlYWQ7CisgICAgICB1bnNpZ25lZCBjaGFyKiAgX3dyaXRlID0gd3JpdGU7CisgICAgICBpbnQgICAgICAgICAgICAgeCAgICAgID0gYmxpdC0+d2lkdGg7CisKKyAgICAgIHdoaWxlICh4ID4gMCkKKyAgICAgIHsKKyAgICAgICAgdW5zaWduZWQgY2hhciAgdmFsOworICAgICAgICAKKyAgICAgICAgdmFsID0gKl9yZWFkOworICAgICAgICBpZiAodmFsKQorICAgICAgICB7CisgICAgICAgICAgaWYgKHZhbCA9PSBtYXgpCisgICAgICAgICAgeworICAgICAgICAgICAgX3dyaXRlWzBdID0gY29sb3IuY2hyb21hWzBdOworICAgICAgICAgICAgX3dyaXRlWzFdID0gY29sb3IuY2hyb21hWzFdOworICAgICAgICAgICAgX3dyaXRlWzJdID0gY29sb3IuY2hyb21hWzJdOworICAgICAgICAgICAgX3dyaXRlWzNdID0gY29sb3IuY2hyb21hWzNdOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgeworICAgICAgICAgICAgLyogY29tcG9zZSBncmF5IHZhbHVlICovCisgICAgICAgICAgICBnckNvbG9yIHBpeDsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgcGl4LmNocm9tYVswXSA9IF93cml0ZVswXTsKKyAgICAgICAgICAgIHBpeC5jaHJvbWFbMV0gPSBfd3JpdGVbMV07CisgICAgICAgICAgICBwaXguY2hyb21hWzJdID0gX3dyaXRlWzJdOworCisgICAgICAgICAgICBjb21wb3NlX3BpeGVsKCBwaXgsIGNvbG9yLCB2YWwsIG1heCApOworICAgICAgICAgICAgCisgICAgICAgICAgICBfd3JpdGVbMF0gPSBwaXguY2hyb21hWzBdOworICAgICAgICAgICAgX3dyaXRlWzFdID0gcGl4LmNocm9tYVsxXTsKKyAgICAgICAgICAgIF93cml0ZVsyXSA9IHBpeC5jaHJvbWFbMl07CisgICAgICAgICAgfSAgCisgICAgICAgIH0KKyAgICAgICAgX3dyaXRlICs9IDQ7CisgICAgICAgIF9yZWFkICArKzsKKyAgICAgICAgeC0tOworICAgICAgfQorICAgICAgCisgICAgICByZWFkICArPSBibGl0LT5yZWFkX2xpbmU7CisgICAgICB3cml0ZSArPSBibGl0LT53cml0ZV9saW5lOworICAgICAgeS0tOworICAgIH0KKyAgICB3aGlsZSAoeSA+IDApOworICB9CisKKworIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICoKKyAgKiA8RnVuY3Rpb24+CisgICogICAgZ3JCbGl0R2x5cGhCaXRtYXAKKyAgKgorICAqIDxEZXNjcmlwdGlvbj4KKyAgKiAgICB3cml0ZXMgYSBnaXZlbiBnbHlwaCBiaXRtYXAgdG8gYSB0YXJnZXQgc3VyZmFjZS4KKyAgKgorICAqIDxJbnB1dD4KKyAgKiAgICBzdXJmYWNlIDo6IGhhbmRsZSB0byB0YXJnZXQgc3VyZmFjZQorICAqICAgIHggICAgICAgOjogcG9zaXRpb24gb2YgbGVmdC1tb3N0IHBpeGVsIG9mIGdseXBoIGltYWdlIGluIHN1cmZhY2UKKyAgKiAgICB5ICAgICAgIDo6IHBvc2l0aW9uIG9mIHRvcC1tb3N0IHBpeGVsIG9mIGdseXBoIGltYWdlIGluIHN1cmZhY2UKKyAgKiAgICBiaXRtYXAgIDo6IHNvdXJjZSBnbHlwaCBpbWFnZQorICAqCisgICogPFJldHVybj4KKyAgKiAgIEVycm9yIGNvZGUuIDAgbWVhbnMgc3VjY2VzcworICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgCisgIHR5cGVkZWYgIHZvaWQgKCpnckNvbG9yR2x5cGhCbGl0dGVyKSggZ3JCbGl0dGVyKiAgYmxpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnckNvbG9yICAgICBjb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICBtYXhfZ3JheSApOworCisgIHN0YXRpYworICBjb25zdCBnckNvbG9yR2x5cGhCbGl0dGVyICBncl9jb2xvcl9ibGl0dGVyc1tncl9waXhlbF9tb2RlX21heF0gPQorICB7CisgICAgMCwKKyAgICAwLAorICAgIDAsCisgICAgMCwKKyAgICBibGl0X2dyYXlfdG9fNTU1LAorICAgIGJsaXRfZ3JheV90b181NjUsCisgICAgYmxpdF9ncmF5X3RvXzI0LAorICAgIGJsaXRfZ3JheV90b18zMgorICB9OyAgCisKKyAgIAorICBleHRlcm4gaW50ICBnckJsaXRHbHlwaFRvQml0bWFwKCBnckJpdG1hcCogIHRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JCaXRtYXAqICBnbHlwaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JQb3MgICAgICB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnclBvcyAgICAgIHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyQ29sb3IgICAgY29sb3IgKQorICB7CisgICAgZ3JCbGl0dGVyICAgIGJsaXQ7CisgICAgZ3JQaXhlbE1vZGUgIG1vZGU7CisgIAorICAgIC8qIGNoZWNrIGFyZ3VtZW50cyAqLworICAgIGlmICghdGFyZ2V0IHx8ICFnbHlwaCkKKyAgICB7CisgICAgICBnckVycm9yID0gZ3JfZXJyX2JhZF9hcmd1bWVudDsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgCisKKyAgICAvKiBzZXQgdXAgYmxpdHRlciBhbmQgY29tcHV0ZSBjbGlwcGluZy4gUmV0dXJuIGltbWVkaWF0ZWx5IGlmIG5lZWRlZCAqLworICAgIGJsaXQuc291cmNlID0gKmdseXBoOworICAgIGJsaXQudGFyZ2V0ID0gKnRhcmdldDsKKyAgICBtb2RlICAgICAgICA9IHRhcmdldC0+bW9kZTsKKworICAgIGlmICggY29tcHV0ZV9jbGlwcyggJmJsaXQsIHgsIHkgKSApCisgICAgICByZXR1cm4gMDsKKyAgICAKKworICAgIC8qIGhhbmRsZSBtb25vY2hyb21lIGJpdG1hcCBibGl0dGluZyAqLworICAgIGlmIChnbHlwaC0+bW9kZSA9PSBncl9waXhlbF9tb2RlX21vbm8pCisgICAgeworICAgICAgaWYgKCBtb2RlIDw9IGdyX3BpeGVsX21vZGVfbm9uZSB8fCBtb2RlID49IGdyX3BpeGVsX21vZGVfbWF4ICkKKyAgICAgIHsKKyAgICAgICAgZ3JFcnJvciA9IGdyX2Vycl9iYWRfc291cmNlX2RlcHRoOworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisgICAgICAKKyAgICAgIGdyX21vbm9fYmxpdHRlcnNbbW9kZV0oICZibGl0LCBjb2xvciApOworICAgICAgZ290byBFbmQ7ICAgICAKKyAgICB9CisgICAgCisgICAgLyogaGFuZGxlIGdyYXkgYml0bWFwIGNvbXBvc2l0aW9uICovCisgICAgaWYgKGdseXBoLT5tb2RlID09IGdyX3BpeGVsX21vZGVfZ3JheSAmJgorICAgICAgICBnbHlwaC0+Z3JheXMgPiAxICAgICAgICAgICAgICAgICAgKQorICAgIHsKKyAgICAgIGludCAgICAgICAgICB0YXJnZXRfZ3JheXMgPSB0YXJnZXQtPmdyYXlzOworICAgICAgaW50ICAgICAgICAgIHNvdXJjZV9ncmF5cyA9IGdseXBoLT5ncmF5czsKKyAgICAgIGNvbnN0IGJ5dGUqICBzYXR1cmF0aW9uOworICAgICAgCisgICAgICBpZiAoIG1vZGUgPT0gZ3JfcGl4ZWxfbW9kZV9ncmF5ICYmIHRhcmdldF9ncmF5cyA+IDEgKQorICAgICAgeworICAgICAgICAvKiByZW5kZXJpbmcgaW50byBhIGdyYXkgdGFyZ2V0IC0gdXNlIHNwZWNpYWwgY29tcG9zaXRpb24gKi8KKyAgICAgICAgLyogcm91dGluZXMuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgIGlmICggZ3JfbGFzdF9zYXR1cmF0aW9uLT5jb3VudCA9PSB0YXJnZXRfZ3JheXMgKQorICAgICAgICAgIHNhdHVyYXRpb24gPSBncl9sYXN0X3NhdHVyYXRpb24tPnRhYmxlOworICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBzYXR1cmF0aW9uID0gZ3JHZXRTYXR1cmF0aW9uKCB0YXJnZXRfZ3JheXMgKTsKKyAgICAgICAgICBpZiAoIXNhdHVyYXRpb24pIHJldHVybiAtMzsKKyAgICAgICAgfQorCisKKyAgICAgICAgaWYgKCB0YXJnZXRfZ3JheXMgPT0gc291cmNlX2dyYXlzICkKKyAgICAgICAgICBibGl0X2dyYXlfdG9fZ3JheV9zaW1wbGUoICZibGl0LCBzYXR1cmF0aW9uICk7CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGNvbnN0IGJ5dGUqICBjb252ZXJzaW9uOworCisgICAgICAgICAgaWYgKCBncl9sYXN0X2NvbnZlcnNpb24tPnRhcmdldF9ncmF5cyA9PSB0YXJnZXRfZ3JheXMgJiYKKyAgICAgICAgICAgICAgIGdyX2xhc3RfY29udmVyc2lvbi0+c291cmNlX2dyYXlzID09IHNvdXJjZV9ncmF5cyApCisgICAgICAgICAgICBjb252ZXJzaW9uID0gZ3JfbGFzdF9jb252ZXJzaW9uLT50YWJsZTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgeworICAgICAgICAgICAgY29udmVyc2lvbiA9IGdyR2V0Q29udmVyc2lvbiggdGFyZ2V0X2dyYXlzLCBzb3VyY2VfZ3JheXMgKTsKKyAgICAgICAgICAgIGlmICghY29udmVyc2lvbikgcmV0dXJuIC0zOworICAgICAgICAgIH07CisgICAgICAgICAgICAgIAorICAgICAgICAgIGJsaXRfZ3JheV90b19ncmF5KCAmYmxpdCwgc2F0dXJhdGlvbiwgY29udmVyc2lvbiApOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIHJlbmRlcmluZyBpbnRvIGEgY29sb3IgdGFyZ2V0ICovCisgICAgICAgIGlmICggbW9kZSA8PSBncl9waXhlbF9tb2RlX2dyYXkgfHwKKyAgICAgICAgICAgICBtb2RlID49IGdyX3BpeGVsX21vZGVfbWF4ICApCisgICAgICAgIHsKKyAgICAgICAgICBnckVycm9yID0gZ3JfZXJyX2JhZF90YXJnZXRfZGVwdGg7CisgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBncl9jb2xvcl9ibGl0dGVyc1ttb2RlXSggJmJsaXQsIGNvbG9yLCBzb3VyY2VfZ3JheXMtMSApOworICAgICAgfQorICAgICAgZ290byBFbmQ7ICAgICAgCisgICAgfQorICAgIAorICAgIC8qIHdlIGRvbid0IHN1cHBvcnQgdGhlIGJsaXR0aW5nIG9mIGJpdG1hcHMgb2YgdGhlIGZvbGxvd2luZyAgKi8KKyAgICAvKiB0eXBlcyA6IHBhbDQsIHBhbDgsIHJnYjU1NSwgcmdiNTY1LCByZ2IyNCwgcmdiMzIgICAgICAgICAgICovCisgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGdyRXJyb3IgPSBncl9lcnJfYmFkX3NvdXJjZV9kZXB0aDsKKyAgICByZXR1cm4gLTI7CisgICAgCisgIEVuZDoKKyAgICByZXR1cm4gMDsKKyAgfQorCisKKy8qIEVuZCAqLwpkaWZmIC0tZ2l0IGEvZGVtb3MvZ3JhcGgvZ3JibGl0LmggYi9kZW1vcy9ncmFwaC9ncmJsaXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDBiNmU1Ci0tLSAvZGV2L251bGwKKysrIGIvZGVtb3MvZ3JhcGgvZ3JibGl0LmgKQEAgLTAsMCArMSwyNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGUgRnJlZVR5cGUgcHJvamVjdCAtLSBhIGZyZWUgYW5kIHBvcnRhYmxlIHF1YWxpdHkgVHJ1ZVR5cGUgcmVuZGVyZXIuICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDE5OTYtMTk5OSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBELiBUdXJuZXIsIFIuV2lsaGVsbSwgYW5kIFcuIExlbWJlcmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgYmxpdHRlci5oOiBTdXBwb3J0IGZvciBibGl0dGluZyBvZiBiaXRtYXBzIHdpdGggdmFyaW91cyBkZXB0aC4gICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgR1JCTElUX0gKKyNkZWZpbmUgR1JCTElUX0gKKworI2luY2x1ZGUgImdyb2Jqcy5oIgorCisgIGludCAgZ3JCbGl0TW9ubyggZ3JCaXRtYXAqICB0YXJnZXQsCisgICAgICAgICAgICAgICAgICAgZ3JCaXRtYXAqICBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICB4X29mZnNldCwKKyAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgIHlfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgIGdyQ29sb3IgICAgY29sb3IgKTsKKworCisjZW5kaWYgLyogR1JCTElUX0ggKi8KKy8qIEVuZCAqLwpkaWZmIC0tZ2l0IGEvZGVtb3MvZ3JhcGgvZ3Jjb25maWcuaCBiL2RlbW9zL2dyYXBoL2dyY29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJkOGY0ZAotLS0gL2Rldi9udWxsCisrKyBiL2RlbW9zL2dyYXBoL2dyY29uZmlnLmgKQEAgLTAsMCArMSw5IEBACisjaWZuZGVmIEdSQ09ORklHX0gKKyNkZWZpbmUgR1JDT05GSUdfSAorCisjZGVmaW5lIEdSX01BWF9TQVRVUkFUSU9OUyAgOAorI2RlZmluZSBHUl9NQVhfQ09OVkVSU0lPTlMgIDE2CisKKyNkZWZpbmUgR1JfTUFYX0RFVklDRVMgIDgKKworI2VuZGlmIC8qIEdSQ09ORklHX0ggKi8KZGlmZiAtLWdpdCBhL2RlbW9zL2dyYXBoL2dyZGV2aWNlLmMgYi9kZW1vcy9ncmFwaC9ncmRldmljZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkMmViMjgKLS0tIC9kZXYvbnVsbAorKysgYi9kZW1vcy9ncmFwaC9ncmRldmljZS5jCkBAIC0wLDAgKzEsMzYxIEBACisjaW5jbHVkZSAiZ3JvYmpzLmgiCisjaW5jbHVkZSAiZ3JkZXZpY2UuaCIKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworICBnckRldmljZUNoYWluICAgZ3JfZGV2aWNlX2NoYWluWyBHUl9NQVhfREVWSUNFUyBdOworICBpbnQgICAgICAgICAgICAgZ3JfbnVtX2RldmljZXMgPSAwOworCisgIHN0YXRpYworICBnckRldmljZSogIGZpbmRfZGV2aWNlKCBjb25zdCBjaGFyKiAgZGV2aWNlX25hbWUgKQorICB7CisgICAgaW50ICBpbmRleCA9IDA7CisgICAgCisgICAgaWYgKGRldmljZV9uYW1lKQorICAgIHsKKyAgICAgIGZvciAoIGluZGV4ID0gZ3JfbnVtX2RldmljZXMtMTsgaW5kZXggPiAwOyBpbmRleC0tICkKKyAgICAgICAgaWYgKCBzdHJjbXAoIGRldmljZV9uYW1lLCBncl9kZXZpY2VfY2hhaW5baW5kZXhdLm5hbWUgKSA9PSAwICkKKyAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgCisgICAgaWYgKCBpbmRleCA8IDAgfHwgZ3JfbnVtX2RldmljZXMgPD0gMCB8fCAhZ3JfZGV2aWNlX2NoYWluW2luZGV4XS5kZXZpY2UgKQorICAgIHsKKyAgICAgIGdyRXJyb3IgPSBncl9lcnJfaW52YWxpZF9kZXZpY2U7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIGdyX2RldmljZV9jaGFpbltpbmRleF0uZGV2aWNlOworICB9CisKKworCisgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKgorICAqIDxGdW5jdGlvbj4KKyAgKiAgICBnckdldERldmljZU1vZGVzCisgICoKKyAgKiA8RGVzY3JpcHRpb24+CisgICogICAgcXVlcmllcyB0aGUgYXZhaWxhYmxlIHBpeGVsIG1vZGVzIGZvciBhIGRldmljZS4KKyAgKgorICAqIDxJbnB1dD4KKyAgKiAgICBkZXZpY2VfbmFtZSAgOjogbmFtZSBvZiBkZXZpY2UgdG8gYmUgdXNlZC4gMCBmb3IgdGhlIGRlZmF1bHQKKyAgKiAgICAgICAgICAgICAgICAgICAgZGV2aWNlLiBGb3IgYSBsaXN0IG9mIGF2YWlsYWJsZSBkZXZpY2VzLCBzZWUKKyAgKiAgICAgICAgICAgICAgICAgICAgZ3JJbml0RGV2aWNlcy4KKyAgKgorICAqIDxPdXRwdXQ+CisgICogICAgbnVtX21vZGVzICAgIDo6IG51bWJlciBvZiBhdmFpbGFibGUgbW9kZXMuIDAgaW4gY2FzZSBvZiBlcnJvciwKKyAgKiAgICAgICAgICAgICAgICAgICAgd2hpY2ggcmVhbGx5IGlzIGFuIGludmFsaWQgZGV2aWNlIG5hbWUuCisgICoKKyAgKiAgICBwaXhlbF9tb2RlcyAgOjogYXJyYXkgb2YgYXZhaWxhYmxlIHBpeGVsIG1vZGVzIGZvciB0aGlzIGRldmljZQorICAqICAgICAgICAgICAgICAgICAgICB0aGlzIHRhYmxlIGlzIGludGVybmFsIHRvIHRoZSBkZXZpY2UgYW5kIHNob3VsZAorICAqICAgICAgICAgICAgICAgICAgICBub3QgYmUgZnJlZWQgYnkgY2xpZW50IGFwcGxpY2F0aW9ucy4KKyAgKgorICAqIDxSZXR1cm4+CisgICogICAgZXJyb3IgY29kZS4gMCBtZWFucyBzdWNjZXNzLiBpbnZhbGlkIGRldmljZSBuYW1lIG90aGVyd2lzZQorICAqCisgICogPE5vdGU+CisgICogICAgQWxsIGRyaXZlcnMgYXJlIF9yZXF1aXJlZF8gdG8gc3VwcG9ydCBhdCBsZWFzdCB0aGUgZm9sbG93aW5nCisgICogICAgcGl4ZWwgZm9ybWF0cyA6CisgICoKKyAgKiAgICAtIGdyX3BpeGVsX21vZGVfbW9ubyA6IGkuZS4gbW9ub2Nocm9tZSBiaXRtYXBzCisgICogICAgLSBncl9waXhlbF9tb2RlX2dyYXkgOiB3aXRoIGFueSBudW1iZXIgb2YgZ3JheSBsZXZlbHMgYmV0d2VlbgorICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgMiBhbmQgMjU2LgorICAqCisgICogICAgdGhlIHBpeGVsIG1vZGVzIGRvIG5vdCBwcm92aWRlIHRoZSBudW1iZXIgb2YgZ3JheXMgaW4gdGhlIGNhc2UKKyAgKiAgICBvZiAiZ3JheSIgZGV2aWNlcy4gWW91IHNob3VsZCB0cnkgdG8gY3JlYXRlIGEgc3VyZmFjZSB3aXRoIHRoZSAKKyAgKiAgICBtYXhpbWFsIG51bWJlciAoMjU2LCB0aGF0IGlzKSBhbmQgc2VlIHRoZSB2YWx1ZSByZXR1cm5lZCBpbgorICAqICAgIHRoZSBiaXRtYXAgZGVzY3JpcHRvci4KKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAorICBleHRlcm4gdm9pZCBnckdldERldmljZU1vZGVzKCBjb25zdCBjaGFyKiAgICBkZXZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAqbnVtX21vZGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnclBpeGVsTW9kZSogICpwaXhlbF9tb2RlcyApCisgIHsKKyAgICBnckRldmljZSogIGRldmljZTsKKyAgICAKKyAgICAqbnVtX21vZGVzICAgPSAwOworICAgICpwaXhlbF9tb2RlcyA9IDA7CisKKyAgICBkZXZpY2UgPSBmaW5kX2RldmljZSggZGV2aWNlX25hbWUgKTsKKyAgICBpZiAoZGV2aWNlKQorICAgIHsKKyAgICAgICpudW1fbW9kZXMgICA9IGRldmljZS0+bnVtX3BpeGVsX21vZGVzOworICAgICAgKnBpeGVsX21vZGVzID0gZGV2aWNlLT5waXhlbF9tb2RlczsKKyAgICB9CisgIH0KKworCisgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKgorICAqIDxGdW5jdGlvbj4KKyAgKiAgICBnck5ld1N1cmZhY2UKKyAgKgorICAqIDxEZXNjcmlwdGlvbj4KKyAgKiAgICBjcmVhdGVzIGEgbmV3IGRldmljZS1zcGVjaWZpYyBzdXJmYWNlLiBBIHN1cmZhY2UgaXMgZWl0aGVyCisgICogICAgYSB3aW5kb3cgb3IgYSBzY3JlZW4sIGRlcGVuZGluZyBvbiB0aGUgZGV2aWNlLgorICAqCisgICogPElucHV0PgorICAqICAgIGRldmljZSAgOjogbmFtZSBvZiB0aGUgZGV2aWNlIHRvIHVzZS4gQSB2YWx1ZSBvZiBOVUxMIG1lYW5zCisgICogICAgICAgICAgICAgICB0aGUgZGVmYXVsdCBkZXZpY2UgKHdoaWNoIGRlcGVuZHMgb24gdGhlIHN5c3RlbSkuCisgICogICAgICAgICAgICAgICBmb3IgYSBsaXN0IG9mIGF2YWlsYWJsZSBkZXZpY2VzLCBzZWUgZ3JJbml0RGV2aWNlcy4KKyAgKgorICAqIDxJbk91dD4KKyAgKiAgICBiaXRtYXAgIDo6IGhhbmRsZSB0byBhIGJpdG1hcCBkZXNjcmlwdG9yIGNvbnRhaW5pbmcgdGhlCisgICogICAgICAgICAgICAgICByZXF1ZXN0ZWQgcGl4ZWwgbW9kZSwgbnVtYmVyIG9mIGdyYXlzIGFuZCBkaW1lbnNpb25zCisgICogICAgICAgICAgICAgICBmb3IgdGhlIHN1cmZhY2UuIHRoZSBiaXRtYXAncyAncGl0Y2gnIGFuZCAnYnVmZmVyJworICAqICAgICAgICAgICAgICAgZmllbGRzIGFyZSBpZ25vcmVkIG9uIGlucHV0LgorICAqCisgICogICAgICAgICAgICAgICBPbiBvdXRwdXQsIHRoZSBiaXRtYXAgZGVzY3JpYmVzIHRoZSBzdXJmYWNlJ3MgaW1hZ2UKKyAgKiAgICAgICAgICAgICAgIGNvbXBsZXRlbHkuIEl0IGlzIHBvc3NpYmxlIHRvIHdyaXRlIGRpcmVjdGx5IGluIGl0CisgICogICAgICAgICAgICAgICB3aXRoIGdyQmxpdEdseXBoVG9CaXRtYXAsIGV2ZW4gdGhvdWdoIHRoZSB1c2Ugb2YKKyAgKiAgICAgICAgICAgICAgIGdyQmxpdEdseXBoVG9TdXJmYWNlIGlzIHJlY29tbWVuZGVkLgorICAqCisgICogPFJldHVybj4KKyAgKiAgICBoYW5kbGUgdG8gdGhlIGNvcnJlc3BvbmRpbmcgc3VyZmFjZSBvYmplY3QuIDAgaW4gY2FzZSBvZiBlcnJvcgorICAqCisgICogPE5vdGU+CisgICogICAgQWxsIGRyaXZlcnMgYXJlIF9yZXF1aXJlZF8gdG8gc3VwcG9ydCBhdCBsZWFzdCB0aGUgZm9sbG93aW5nCisgICogICAgcGl4ZWwgZm9ybWF0cyA6CisgICoKKyAgKiAgICAtIGdyX3BpeGVsX21vZGVfbW9ubyA6IGkuZS4gbW9ub2Nocm9tZSBiaXRtYXBzCisgICogICAgLSBncl9waXhlbF9tb2RlX2dyYXkgOiB3aXRoIGFueSBudW1iZXIgb2YgZ3JheSBsZXZlbHMgYmV0d2VlbgorICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgMiBhbmQgMjU2LgorICAqCisgICogICAgVGhpcyBmdW5jdGlvbiBtaWdodCBjaGFuZ2UgdGhlIGJpdG1hcCBkZXNjcmlwdG9yJ3MgZmllbGRzLiBGb3IKKyAgKiAgICBleGFtcGxlLCB3aGVuIGRpc3BsYXlpbmcgYSBmdWxsLXNjcmVlbiBzdXJmYWNlLCB0aGUgYml0bWFwJ3MKKyAgKiAgICBkaW1lbnNpb25zIHdpbGwgYmUgc2V0IHRvIHRob3NlIG9mIHRoZSBzY3JlZW4gKGUuZy4gNjQweDQ4MAorICAqICAgIG9yIDgwMHg2MDApOyBhbHNvLCB0aGUgYml0bWFwJ3MgJ2J1ZmZlcicgZmllbGQgbWlnaHQgcG9pbnQgdG8KKyAgKiAgICB0aGUgVmlkZW8gUmFtIGRlcGVuZGluZyBvbiB0aGUgbW9kZSByZXF1ZXN0ZWQuLgorICAqCisgICogICAgVGhlIHN1cmZhY2UgY29udGFpbnMgYSBjb3B5IG9mIHRoZSByZXR1cm5lZCBiaXRtYXAgZGVzY3JpcHRvciwKKyAgKiAgICB5b3UgY2FuIHRodXMgZGlzY2FyZCB0aGUgJ2JpdG1hcCcgcGFyYW1ldGVyIGFmdGVyIHRoZSBjYWxsLgorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgCisgIGV4dGVybiBnclN1cmZhY2UqICBnck5ld1N1cmZhY2UoIGNvbnN0IGNoYXIqICBkZXZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JCaXRtYXAqICAgIGJpdG1hcCApCisgIHsKKyAgICBnckRldmljZSogICBkZXZpY2U7CisgICAgZ3JTdXJmYWNlKiAgc3VyZmFjZTsKKworICAgIC8qIE5vdyBmaW5kIHRoZSBkZXZpY2UgKi8KKyAgICBkZXZpY2UgPSBmaW5kX2RldmljZSggZGV2aWNlX25hbWUgKTsKKyAgICBpZiAoIWRldmljZSkgcmV0dXJuIDA7CisKKyAgICBzdXJmYWNlID0gKGdyU3VyZmFjZSopZ3JBbGxvYyggZGV2aWNlLT5zdXJmYWNlX29ianNpemUgKTsKKyAgICBpZiAoIXN1cmZhY2UpIHJldHVybiAwOworICAgIAorICAgIGlmICggIWRldmljZS0+aW5pdF9zdXJmYWNlKCBzdXJmYWNlLCBiaXRtYXAgKSApCisgICAgeworICAgICAgZ3JGcmVlKCBzdXJmYWNlICk7CisgICAgICBzdXJmYWNlID0gMDsKKyAgICB9CisgICAgcmV0dXJuIHN1cmZhY2U7CisgIH0KKworCisgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKgorICAqIDxGdW5jdGlvbj4KKyAgKiAgICBnclJlZnJlc2hSZWN0YW5nbGUKKyAgKgorICAqIDxEZXNjcmlwdGlvbj4KKyAgKiAgICB0aGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCBhIGdpdmVuIHN1cmZhY2UgcmVjdGFuZ2xlCisgICogICAgd2FzIG1vZGlmaWVkIGFuZCB0aHVzIG5lZWRzIHJlLXBhaW50aW5nLiBJdCByZWFsbHkgaXMgdXNlZnVsIGZvcgorICAqICAgIHdpbmRvd2VkIG9yIGdyYXkgc3VyZmFjZXMuCisgICoKKyAgKiA8SW5wdXQ+CisgICogICAgc3VyZmFjZSA6OiBoYW5kbGUgdG8gdGFyZ2V0IHN1cmZhY2UKKyAgKiAgICB4ICAgICAgIDo6IHggY29vcmRpbmF0ZSBvZiB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSByZWN0YW5nbGUKKyAgKiAgICB5ICAgICAgIDo6IHkgY29vcmRpbmF0ZSBvZiB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSByZWN0YW5nbGUKKyAgKiAgICB3aWR0aCAgIDo6IHJlY3RhbmdsZSB3aWR0aCBpbiBwaXhlbHMKKyAgKiAgICBoZWlnaHQgIDo6IHJlY3RhbmdsZSBoZWlnaHQgaW4gcGl4ZWxzCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAKKyAgZXh0ZXJuIHZvaWQgIGdyUmVmcmVzaFJlY3RhbmdsZSggZ3JTdXJmYWNlKiAgc3VyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JQb3MgICAgICAgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JQb3MgICAgICAgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JQb3MgICAgICAgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyUG9zICAgICAgIGhlaWdodCApCisgIHsKKyAgICBpZiAoc3VyZmFjZS0+cmVmcmVzaF9yZWN0KQorICAgICAgc3VyZmFjZS0+cmVmcmVzaF9yZWN0KCBzdXJmYWNlLCB4LCB5LCB3aWR0aCwgaGVpZ2h0ICk7CisgIH0KKworCisgCisgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKgorICAqIDxGdW5jdGlvbj4KKyAgKiAgICBncldyaXRlU3VyZmFjZUNoYXIKKyAgKgorICAqIDxEZXNjcmlwdGlvbj4KKyAgKiAgICBUaGlzIGZ1bmN0aW9uIGlzIGVxdWl2YWxlbnQgdG8gY2FsbGluZyBncldyaXRlQ2VsbENoYXIgb24gdGhlCisgICogICAgc3VyZmFjZSdzIGJpdG1hcCwgdGhlbiBpbnZva2luZyBnclJlZnJlc2hSZWN0YW5nbGUuCisgICoKKyAgKiAgICBUaGUgZ3JhcGhpY3Mgc3ViLXN5c3RlbSBjb250YWlucyBhbiBpbnRlcm5hbCBMYXRpbjEgOHg4IGZvbnQKKyAgKiAgICB3aGljaCBjYW4gYmUgdXNlZCB0byBkaXNwbGF5IHNpbXBsZSBzdHJpbmdzIG9mIHRleHQgd2l0aG91dAorICAqICAgIHVzaW5nIEZyZWVUeXBlLgorICAqCisgICogICAgVGhpcyBmdW5jdGlvbiB3cml0ZXMgYSBzaW5nbGUgOHg4IGNoYXJhY3RlciBvbiB0aGUgdGFyZ2V0IGJpdG1hcC4KKyAgKgorICAqIDxJbnB1dD4KKyAgKiAgICB0YXJnZXQgICA6OiBoYW5kbGUgdG8gdGFyZ2V0IHN1cmZhY2UKKyAgKiAgICB4ICAgICAgICA6OiB4IHBpeGVsIHBvc2l0aW9uIG9mIGNoYXJhY3RlciBjZWxsJ3MgdG9wIGxlZnQgY29ybmVyCisgICogICAgeSAgICAgICAgOjogeSBwaXhlbCBwb3NpdGlvbiBvZiBjaGFyYWN0ZXIgY2VsbCdzIHRvcCBsZWZ0IGNvcm5lcgorICAqICAgIGNoYXJjb2RlIDo6IExhdGluLTEgY2hhcmFjdGVyIGNvZGUKKyAgKiAgICBjb2xvciAgICA6OiBjb2xvciB0byBiZSB1c2VkIHRvIGRyYXcgdGhlIGNoYXJhY3RlcgorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIAorICBleHRlcm4KKyAgdm9pZCAgZ3JXcml0ZVN1cmZhY2VDaGFyKCBnclN1cmZhY2UqIHRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgIHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgY2hhcmNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JDb2xvciAgICBjb2xvciApCisgIHsKKyAgICBncldyaXRlQ2VsbENoYXIoICZ0YXJnZXQtPmJpdG1hcCwgeCwgeSwgY2hhcmNvZGUsIGNvbG9yICk7CisgICAgaWYgKHRhcmdldC0+cmVmcmVzaF9yZWN0KQorICAgICAgdGFyZ2V0LT5yZWZyZXNoX3JlY3QoIHRhcmdldCwgeCwgeSwgOCwgOCApOworICB9CisKKworIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICoKKyAgKiA8RnVuY3Rpb24+CisgICogICAgZ3JXcml0ZVN1cmZhY2VTdHJpbmcKKyAgKgorICAqIDxEZXNjcmlwdGlvbj4KKyAgKiAgICBUaGlzIGZ1bmN0aW9uIGlzIGVxdWl2YWxlbnQgdG8gY2FsbGluZyBncldyaXRlQ2VsbFN0cmluZyBvbiB0aGUKKyAgKiAgICBzdXJmYWNlJ3MgYml0bWFwLCB0aGVuIGludm9raW5nIGdyUmVmcmVzaFJlY3RhbmdsZS4KKyAgKgorICAqICAgIFRoZSBncmFwaGljcyBzdWItc3lzdGVtIGNvbnRhaW5zIGFuIGludGVybmFsIExhdGluMSA4eDggZm9udAorICAqICAgIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGRpc3BsYXkgc2ltcGxlIHN0cmluZ3Mgb2YgdGV4dCB3aXRob3V0CisgICogICAgdXNpbmcgRnJlZVR5cGUuCisgICoKKyAgKiAgICBUaGlzIGZ1bmN0aW9uIHdyaXRlcyBhIHN0cmluZyB3aXRoIHRoZSBpbnRlcm5hbCBmb250CisgICoKKyAgKiA8SW5wdXQ+CisgICogICAgdGFyZ2V0ICAgICAgIDo6IGhhbmRsZSB0byB0YXJnZXQgYml0bWFwICAKKyAgKiAgICB4ICAgICAgICAgICAgOjogeCBwaXhlbCBwb3NpdGlvbiBvZiBzdHJpbmcncyB0b3AgbGVmdCBjb3JuZXIKKyAgKiAgICB5ICAgICAgICAgICAgOjogeSBwaXhlbCBwb3NpdGlvbiBvZiBzdHJpbmcncyB0b3AgbGVmdCBjb3JuZXIKKyAgKiAgICBzdHJpbmcgICAgICAgOjogTGF0aW4tMSB0ZXh0IHN0cmluZworICAqICAgIGNvbG9yICAgICAgICA6OiBjb2xvciB0byBiZSB1c2VkIHRvIGRyYXcgdGhlIGNoYXJhY3RlcgorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIAorICBleHRlcm4KKyAgdm9pZCAgZ3JXcml0ZVN1cmZhY2VTdHJpbmcoIGdyU3VyZmFjZSogIHRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgIHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogc3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JDb2xvciAgICAgY29sb3IgKQorICB7CisgICAgaW50ICBsZW47CisKKyAgICBsZW4gPSBzdHJsZW4oc3RyaW5nKTsKKyAgICBncldyaXRlQ2VsbFN0cmluZyggJnRhcmdldC0+Yml0bWFwLCB4LCB5LCBzdHJpbmcsIGNvbG9yICk7CisgICAgaWYgKHRhcmdldC0+cmVmcmVzaF9yZWN0KQorICAgICAgdGFyZ2V0LT5yZWZyZXNoX3JlY3QoIHRhcmdldCwgeCwgeSwgOCpsZW4sIDggKTsKKyAgfQorCisKKyAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqCisgICogPEZ1bmN0aW9uPgorICAqICAgIGdyUmVmcmVzaFN1cmZhY2UKKyAgKgorICAqIDxEZXNjcmlwdGlvbj4KKyAgKiAgICBhIHZhcmlhdGlvbiBvZiBnclJlZnJlc2hSZWN0YW5nbGUgd2hpY2ggcmVwYWludHMgdGhlIHdob2xlIHN1cmZhY2UKKyAgKiAgICB0byB0aGUgc2NyZWVuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgKgorICAqIDxJbnB1dD4KKyAgKiAgICBzdXJmYWNlIDo6IGhhbmRsZSB0byB0YXJnZXQgc3VyZmFjZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgZXh0ZXJuIHZvaWQgIGdyUmVmcmVzaFN1cmZhY2UoIGdyU3VyZmFjZSogIHN1cmZhY2UgKQorICB7CisgICAgaWYgKHN1cmZhY2UtPnJlZnJlc2hfcmVjdCkKKyAgICAgIHN1cmZhY2UtPnJlZnJlc2hfcmVjdCggc3VyZmFjZSwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VyZmFjZS0+Yml0bWFwLndpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXJmYWNlLT5iaXRtYXAucm93cyApOworICB9CisKKworCisgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKgorICAqIDxGdW5jdGlvbj4KKyAgKiAgICBnclNldFRpdGxlCisgICoKKyAgKiA8RGVzY3JpcHRpb24+CisgICogICAgc2V0IHRoZSB3aW5kb3cgdGl0bGUgb2YgYSBnaXZlbiB3aW5kb3dlZCBzdXJmYWNlLgorICAqCisgICogPElucHV0PgorICAqICAgIHN1cmZhY2UgICAgICA6OiBoYW5kbGUgdG8gdGFyZ2V0IHN1cmZhY2UKKyAgKiAgICB0aXRsZV9zdHJpbmcgOjogdGhlIG5ldyB0aXRsZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgZXh0ZXJuIHZvaWQgIGdyU2V0VGl0bGUoIGdyU3VyZmFjZSogIHN1cmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB0aXRsZV9zdHJpbmcgKQorICB7CisgICAgaWYgKHN1cmZhY2UtPnNldF90aXRsZSkKKyAgICAgIHN1cmZhY2UtPnNldF90aXRsZSggc3VyZmFjZSwgdGl0bGVfc3RyaW5nICk7CisgIH0KKworCisKKworIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICoKKyAgKiA8RnVuY3Rpb24+CisgICogICAgZ3JMaXN0ZW5TdXJmYWNlCisgICoKKyAgKiA8RGVzY3JpcHRpb24+CisgICogICAgbGlzdGVuIHRoZSBldmVudHMgZm9yIGEgZ2l2ZW4gc3VyZmFjZQorICAqCisgICogPElucHV0PgorICAqICAgIHN1cmZhY2UgICAgOjogaGFuZGxlIHRvIHRhcmdldCBzdXJmYWNlCisgICogICAgZXZlbnRfbWFzayA6OiB0aGUgZXZlbnQgbWFzayAobW9kZSkKKyAgKgorICAqIDxPdXRwdXQ+CisgICogICAgZXZlbnQgIDo6IHRoZSByZXR1cm5lZCBldmVudAorICAqCisgICogPE5vdGU+CisgICogICAgWFhYIDogRm9yIG5vdywgb25seSBrZXlwcmVzc2VzIGFyZSBzdXBwb3J0ZWQuCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgCisgIGV4dGVybgorICBpbnQgICBnckxpc3RlblN1cmZhY2UoIGdyU3VyZmFjZSogIHN1cmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgZXZlbnRfbWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICBnckV2ZW50ICAgICpldmVudCApCisgIHsKKyAgICByZXR1cm4gc3VyZmFjZS0+bGlzdGVuX2V2ZW50KCBzdXJmYWNlLCBldmVudF9tYXNrLCBldmVudCApOworICB9CisKKworI2lmIDAKKyAgc3RhdGljCisgIHZvaWQgIGdyX2RvbmVfc3VyZmFjZSggZ3JTdXJmYWNlKiAgc3VyZmFjZSApCisgIHsKKyAgICBpZiAoc3VyZmFjZSkKKyAgICB7CisgICAgICAvKiBmaXJzdCBvZiBhbGwsIGNhbGwgdGhlIGRldmljZS1zcGVjaWZpYyBkZXN0cnVjdG9yICovCisgICAgICBzdXJmYWNlLT5kb25lKHN1cmZhY2UpOworICAgICAgCisgICAgICAvKiB0aGVuIHJlbW92ZSB0aGUgYml0bWFwIGlmIHdlJ3JlIG93bmVyICovCisgICAgICBpZiAoc3VyZmFjZS0+b3duZXIpCisgICAgICAgIGdyRnJlZSggc3VyZmFjZS0+Yml0bWFwLmJ1ZmZlciApOworICAgICAgICAKKyAgICAgIHN1cmZhY2UtPm93bmVyICAgICAgICAgPSAwOyAgCisgICAgICBzdXJmYWNlLT5iaXRtYXAuYnVmZmVyID0gMDsKKyAgICAgIGdyRnJlZSggc3VyZmFjZSApOworICAgIH0KKyAgfQorI2VuZGlmCisKZGlmZiAtLWdpdCBhL2RlbW9zL2dyYXBoL2dyZGV2aWNlLmggYi9kZW1vcy9ncmFwaC9ncmRldmljZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0MzQ2MDkKLS0tIC9kZXYvbnVsbAorKysgYi9kZW1vcy9ncmFwaC9ncmRldmljZS5oCkBAIC0wLDAgKzEsMTI2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIGdyZGV2aWNlLmgKKyAqCisgKiAgICBHcmFwaGljcyBkZXZpY2UgaW50ZXJmYWNlCisgKgorICogIENvcHlyaWdodCAxOTk5IC0gVGhlIEZyZWVUeXBlIERldmVsb3BtZW50IFRlYW0gLSB3d3cuZnJlZXR5cGUub3JnCisgKgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgR1JERVZJQ0VfSAorI2RlZmluZSBHUkRFVklDRV9ICisKKyNpbmNsdWRlICJncmFwaC5oIgorCisKKyAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKgorICAqIDxGdW5jVHlwZT4KKyAgKiAgIGdyRGV2aWNlSW5pdEZ1bmMKKyAgKgorICAqIDxEZXNjcmlwdGlvbj4KKyAgKiAgIFNpbXBsZSBkZXZpY2UgaW5pdGlhbGlzZXIgZnVuY3Rpb24KKyAgKgorICAqIDxSZXR1cm4+CisgICogICBlcnJvciBjb2RlLiAwIG1lYW5zIHN1Y2Nlc3MKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICB0eXBlZGVmIGludCAgKCpnckRldmljZUluaXRGdW5jKSggdm9pZCApOworCisKKyAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKgorICAqIDxGdW5jVHlwZT4KKyAgKiAgIGdyRGV2aWNlRG9uZUZ1bmMKKyAgKgorICAqIDxEZXNjcmlwdGlvbj4KKyAgKiAgIFNpbXBsZSBkZXZpY2UgZmluYWxpc2VyIGZ1bmN0aW9uCisgICoKKyAgKiA8UmV0dXJuPgorICAqICAgZXJyb3IgY29kZS4gMCBtZWFucyBzdWNjZXNzCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgdHlwZWRlZiB2b2lkICgqZ3JEZXZpY2VEb25lRnVuYykoIHZvaWQgKTsKKworCisgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICoKKyAgKiA8RnVuY1R5cGU+CisgICogICBnckRldmljZUluaXRTdXJmYWNlRnVuYworICAqCisgICogPERlc2NyaXB0aW9uPgorICAqICAgaW5pdGlhbGl6ZXMgYSBuZXcgc3VyZmFjZSBmb3IgdGhlIGRldmljZS4gVGhpcyBtYXkgYmUgYSB3aW5kb3cKKyAgKiAgIG9yIGEgdmlkZW8gc2NyZWVuLCBkZXBlbmRpbmcgb24gdGhlIGRldmljZS4KKyAgKgorICAqIDxJbnB1dD4KKyAgKiAgIHN1cmZhY2UgIDo6IGhhbmRsZSB0byB0YXJnZXQgc3VyZmFjZQorICAqCisgICogPEluT3V0PgorICAqICAgYml0bWFwICAgOjogaGFuZGxlIHRvIGJpdG1hcCBkZXNjcmlwdG9yCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgdHlwZWRlZiBpbnQgICgqZ3JEZXZpY2VJbml0U3VyZmFjZUZ1bmMpKCBnclN1cmZhY2UqICAgc3VyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnckJpdG1hcCogICAgYml0bWFwICk7CisKKworIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqCisgICogPFN0cnVjdD4KKyAgKiAgIGdyRGV2aWNlCisgICoKKyAgKiA8RGVzY3JpcHRpb24+CisgICogICBTaW1wbGUgZGV2aWNlIGludGVyZmFjZSBzdHJ1Y3R1cmUKKyAgKgorICAqIDxGaWVsZHM+CisgICogICBzdXJmYWNlX29ianNpemUgOjogc2l6ZSBpbiBieXRlcyBvZiBhIHNpbmdsZSBzdXJmYWNlIG9iamVjdCBmb3IKKyAgKiAgICAgICAgICAgICAgICAgICAgICB0aGlzIGRldmljZS4KKyAgKgorICAqICAgZGV2aWNlX25hbWUgOjogbmFtZSBvZiBkZXZpY2UsIGUuZy4gIngxMSIsICJvczJwbSIsICJkaXJlY3R4IiBldGMuLgorICAqICAgaW5pdCAgICAgICAgOjogZGV2aWNlIGluaXRpYWxpc2F0aW9uIHJvdXRpbmUKKyAgKiAgIGRvbmUgICAgICAgIDo6IGRldmljZSBmaW5hbGlzYXRpb24KKyAgKiAgIG5ld19zdXJmYWNlIDo6IGZ1bmN0aW9uIHVzZWQgdG8gY3JlYXRlIGEgbmV3IHN1cmZhY2UgKHNjcmVlbiBvcgorICAqICAgICAgICAgICAgICAgICAgd2luZG93KSBmcm9tIHRoZSBkZXZpY2UKKyAgKgorICAqICAgbnVtX3BpeGVsX21vZGVzIDo6IHRoZSBudW1iZXIgb2YgcGl4ZWwgbW9kZXMgc3VwcG9ydGVkIGJ5IHRoaXMKKyAgKiAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UuIFRoaXMgdmFsdWUgX211c3RfIGJlIHNldCB0byAtMQorICAqICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQsIHVubGVzcyB0aGUgZGV2aWNlIHByb3ZpZGVzIGEKKyAgKiAgICAgICAgICAgICAgICAgICAgICBzdGF0aWMgc2V0IG9mIHBpeGVsIG1vZGVzIChmdWxsc2NyZWVuKS4KKyAgKgorICAqICAgcGl4ZWxfbW9kZXMgICAgIDo6IGFuIGFycmF5IG9mIHBpeGVsIG1vZGVzIHN1cHBvcnRlZCBieSB0aGlzCisgICogICAgICAgICAgICAgICAgICAgICAgZGV2aWNlCisgICoKKyAgKiA8Tm90ZT4KKyAgKiAgIHRoZSBmaWVsZHMgIm51bV9waXhlbF9tb2RlcyIgYW5kICJwaXhlbF9tb2RlcyIgbXVzdCBiZQorICAqICAgc2V0IGJ5IHRoZSAiaW5pdCIgZnVuY3Rpb24uCisgICoKKyAgKiAgIFRoaXMgYWxsb3dzIHdpbmRvd2VkIGRldmljZXMgdG8gImRpc2NvdmVyIiBhdCBydW4tdGltZSB0aGUKKyAgKiAgIGF2YWlsYWJsZSBwaXhlbCBtb2RlcyB0aGV5IGNhbiBwcm92aWRlIGRlcGVuZGluZyBvbiB0aGUKKyAgKiAgIGN1cnJlbnQgc2NyZWVuIGRlcHRoLgorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIHN0cnVjdCBnckRldmljZV8KKyAgeworICAgIGludCAgICAgICAgICBzdXJmYWNlX29ianNpemU7CisgICAgY29uc3QgY2hhciogIGRldmljZV9uYW1lOyAgLyogbmFtZSBvZiBkZXZpY2UgICAgICAgICAgICAgICAgICovCisgIAorICAgIGdyRGV2aWNlSW5pdEZ1bmMgICAgICAgIGluaXQ7CisgICAgZ3JEZXZpY2VEb25lRnVuYyAgICAgICAgZG9uZTsKKworICAgIGdyRGV2aWNlSW5pdFN1cmZhY2VGdW5jIGluaXRfc3VyZmFjZTsKKworICAgIGludCAgICAgICAgICAgICAgICAgICAgIG51bV9waXhlbF9tb2RlczsKKyAgICBnclBpeGVsTW9kZSogICAgICAgICAgICBwaXhlbF9tb2RlczsgCisgIH07CisKKworICBleHRlcm4gZ3JEZXZpY2VDaGFpbiAgIGdyX2RldmljZV9jaGFpbltdOworICBleHRlcm4gaW50ICAgICAgICAgICAgIGdyX251bV9kZXZpY2VzOworCisKKyNlbmRpZiAvKiBHUkRFVklDRV9IICovCmRpZmYgLS1naXQgYS9kZW1vcy9ncmFwaC9ncmV2ZW50cy5oIGIvZGVtb3MvZ3JhcGgvZ3JldmVudHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzJmNzViCi0tLSAvZGV2L251bGwKKysrIGIvZGVtb3MvZ3JhcGgvZ3JldmVudHMuaApAQCAtMCwwICsxLDExNyBAQAorI2lmbmRlZiBHUkVWRU5UU19ICisjZGVmaW5lIEdSRVZFTlRTX0gKKworCisjZGVmaW5lIGdyX2V2ZW50X25vbmUgIDAKKyNkZWZpbmUgZ3JfZXZlbnRfd2FpdCAgMQorI2RlZmluZSBncl9ldmVudF9wb2xsICAyCisjZGVmaW5lIGdyX2V2ZW50X2ZsdXNoIDMKKworI2RlZmluZSBncl9tb3VzZV9kb3duICAweDA0CisjZGVmaW5lIGdyX21vdXNlX21vdmUgIDB4MDgKKyNkZWZpbmUgZ3JfbW91c2VfdXAgICAgMHgxMAorI2RlZmluZSBncl9tb3VzZV9kcmFnICAweDIwCisKKyNkZWZpbmUgZ3Jfa2V5X2Rvd24gMHg0MAorI2RlZmluZSBncl9rZXlfdXAgICAweDgwCisKKworI2RlZmluZSBncl9ldmVudF9tb3VzZSAweDNDCisjZGVmaW5lIGdyX2V2ZW50X2tleSAgIDB4QzAKKworI2RlZmluZSBncl9ldmVudF90eXBlICAoZ3JfZXZlbnRfbW91c2UgfCBncl9ldmVudF9rZXkpICAKKworCisgIHR5cGVkZWYgZW51bSBncktleV8KKyAgeworICAgIGdyS2V5Tm9uZSA9IDAsCisgICAgCisgICAgZ3JLZXlGMSwKKyAgICBncktleUYyLAorICAgIGdyS2V5RjMsCisgICAgZ3JLZXlGNCwKKyAgICBncktleUY1LAorICAgIGdyS2V5RjYsCisgICAgZ3JLZXlGNywKKyAgICBncktleUY4LAorICAgIGdyS2V5RjksCisgICAgZ3JLZXlGMTAsCisgICAgZ3JLZXlGMTEsCisgICAgZ3JLZXlGMTIsCisgICAgCisgICAgZ3JLZXlMZWZ0LAorICAgIGdyS2V5UmlnaHQsCisgICAgZ3JLZXlVcCwKKyAgICBncktleURvd24sCisgICAgCisgICAgZ3JLZXlJbnMsCisgICAgZ3JLZXlEZWwsCisgICAgZ3JLZXlIb21lLAorICAgIGdyS2V5RW5kLAorICAgIGdyS2V5UGFnZVVwLAorICAgIGdyS2V5UGFnZURvd24sCisKKyAgICBncktleUVzYywgICAgCisgICAgZ3JLZXlUYWIsCisgICAgZ3JLZXlCYWNrU3BhY2UsCisgICAgZ3JLZXlSZXR1cm4sCisKKyAgICBncktleU1heCwKKyAgICBncktleUZvcmNlU2hvcnQgPSAweDdGRkYgIC8qIHRoaXMgZm9yY2VzIHRoZSBncktleSB0byBiZSBzdG9yZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9uIGF0IGxlYXN0IG9uZSBzaG9ydCAhICAgICAgICAgICAgKi8KKyAgICAKKyAgfSBncktleTsKKworI2RlZmluZSAgZ3JLRVkoYykgICAgKChncktleSkoYykpCisKKyNkZWZpbmUgIGdyS2V5QWx0ICAgICgoZ3JLZXkpMHg4MDAwKQorI2RlZmluZSAgZ3JLZXlDdHJsICAgKChncktleSkweDQwMDApCisjZGVmaW5lICBncktleVNoaWZ0ICAoKGdyS2V5KTB4MjAwMCkKKworI2RlZmluZSAgZ3JLZXlNb2RpZmllcnMgKChncktleSkweEUwMDApCisKKyNkZWZpbmUgIGdyS2V5MCAgICAgICBncktFWSgnMCcpCisjZGVmaW5lICBncktleTEgICAgICAgZ3JLRVkoJzEnKQorI2RlZmluZSAgZ3JLZXkyICAgICAgIGdyS0VZKCcyJykKKyNkZWZpbmUgIGdyS2V5MyAgICAgICBncktFWSgnMycpCisjZGVmaW5lICBncktleTQgICAgICAgZ3JLRVkoJzQnKQorI2RlZmluZSAgZ3JLZXk1ICAgICAgIGdyS0VZKCc1JykKKyNkZWZpbmUgIGdyS2V5NiAgICAgICBncktFWSgnNicpCisjZGVmaW5lICBncktleTcgICAgICAgZ3JLRVkoJzcnKQorI2RlZmluZSAgZ3JLZXk4ICAgICAgIGdyS0VZKCc4JykKKyNkZWZpbmUgIGdyS2V5OSAgICAgICBncktFWSgnOScpCisKKworI2RlZmluZSAgZ3JLZXlQbHVzICAgICAgICBncktFWSgnKycpCisjZGVmaW5lICBncktleUxlc3MgICAgICAgIGdyS0VZKCctJykKKyNkZWZpbmUgIGdyS2V5RXF1YWwgICAgICAgZ3JLRVkoJz0nKQorI2RlZmluZSAgZ3JLZXlNdWx0ICAgICAgICBncktFWSgnKicpCisjZGVmaW5lICBncktleURvbGxhciAgICAgIGdyS0VZKCckJykKKyNkZWZpbmUgIGdyS2V5U21hbGxlciAgICAgZ3JLRVkoJzwnKQorI2RlZmluZSAgZ3JLZXlHcmVhdGVyICAgICBncktFWSgnPicpCisjZGVmaW5lICBncktleVF1ZXN0aW9uICAgIGdyS0VZKCc/JykKKyNkZWZpbmUgIGdyS2V5Q29tbWEgICAgICAgZ3JLRVkoJywnKQorI2RlZmluZSAgZ3JLZXlEb3QgICAgICAgICBncktFWSgnLicpCisjZGVmaW5lICBncktleVNlbWlDb2x1bW4gIGdyS0VZKCc7JykKKyNkZWZpbmUgIGdyS2V5Q29sdW1uICAgICAgZ3JLRVkoJzonKQorI2RlZmluZSAgZ3JLZXlEaXYgICAgICAgICBncktFWSgnLycpCisjZGVmaW5lICBncktleUV4Y2xhbSAgICAgIGdyS0VZKCchJykKKyNkZWZpbmUgIGdyS2V5UGVyY2VudCAgICAgZ3JLRVkoJyUnKQorI2RlZmluZSAgZ3JLZXlMZWZ0UGFyZW4gICBncktFWSgnKCcpCisjZGVmaW5lICBncktleVJpZ2h0UGFyZW4gIGdyS0VZKCcoJykKKyNkZWZpbmUgIGdyS2V5QXQgICAgICAgICAgZ3JLRVkoJ0AnKQorI2RlZmluZSAgZ3JLZXlVbmRlciAgICAgICBncktFWSgnXycpCisKKyAgCisgIHR5cGVkZWYgc3RydWN0IGdyRXZlbnRfCisgIHsKKyAgICBpbnQgICAgdHlwZTsKKyAgICBncktleSAga2V5OworICAgIGludCAgICB4LCB5OworCisgIH0gZ3JFdmVudDsKKworCisKKyNlbmRpZiAvKiBHUkVWRU5UU19IICovCisKZGlmZiAtLWdpdCBhL2RlbW9zL2dyYXBoL2dyZm9udC5jIGIvZGVtb3MvZ3JhcGgvZ3Jmb250LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI5ZGYzNwotLS0gL2Rldi9udWxsCisrKyBiL2RlbW9zL2dyYXBoL2dyZm9udC5jCkBAIC0wLDAgKzEsMzU0IEBACisjaW5jbHVkZSAiZ3Jmb250LmgiCisKKyAgLyogZm9udCBjaGFyYWN0ZXJzICovCisKKyAgY29uc3QgdW5zaWduZWQgY2hhciAgZm9udF84eDhbMjA0OF0gPQorICB7CisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDdFLCAweDgxLCAweEE1LCAweDgxLCAweEJELCAweDk5LCAweDgxLCAweDdFLAorICAgIDB4N0UsIDB4RkYsIDB4REIsIDB4RkYsIDB4QzMsIDB4RTcsIDB4RkYsIDB4N0UsCisgICAgMHg2QywgMHhGRSwgMHhGRSwgMHhGRSwgMHg3QywgMHgzOCwgMHgxMCwgMHgwMCwKKyAgICAweDEwLCAweDM4LCAweDdDLCAweEZFLCAweDdDLCAweDM4LCAweDEwLCAweDAwLAorICAgIDB4MzgsIDB4N0MsIDB4MzgsIDB4RkUsIDB4RkUsIDB4OTIsIDB4MTAsIDB4N0MsCisgICAgMHgwMCwgMHgxMCwgMHgzOCwgMHg3QywgMHhGRSwgMHg3QywgMHgzOCwgMHg3QywKKyAgICAweDAwLCAweDAwLCAweDE4LCAweDNDLCAweDNDLCAweDE4LCAweDAwLCAweDAwLAorICAgIDB4RkYsIDB4RkYsIDB4RTcsIDB4QzMsIDB4QzMsIDB4RTcsIDB4RkYsIDB4RkYsCisgICAgMHgwMCwgMHgzQywgMHg2NiwgMHg0MiwgMHg0MiwgMHg2NiwgMHgzQywgMHgwMCwKKyAgICAweEZGLCAweEMzLCAweDk5LCAweEJELCAweEJELCAweDk5LCAweEMzLCAweEZGLAorICAgIDB4MEYsIDB4MDcsIDB4MEYsIDB4N0QsIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4NzgsCisgICAgMHgzQywgMHg2NiwgMHg2NiwgMHg2NiwgMHgzQywgMHgxOCwgMHg3RSwgMHgxOCwKKyAgICAweDNGLCAweDMzLCAweDNGLCAweDMwLCAweDMwLCAweDcwLCAweEYwLCAweEUwLAorICAgIDB4N0YsIDB4NjMsIDB4N0YsIDB4NjMsIDB4NjMsIDB4NjcsIDB4RTYsIDB4QzAsCisgICAgMHg5OSwgMHg1QSwgMHgzQywgMHhFNywgMHhFNywgMHgzQywgMHg1QSwgMHg5OSwKKyAgICAweDgwLCAweEUwLCAweEY4LCAweEZFLCAweEY4LCAweEUwLCAweDgwLCAweDAwLAorICAgIDB4MDIsIDB4MEUsIDB4M0UsIDB4RkUsIDB4M0UsIDB4MEUsIDB4MDIsIDB4MDAsCisgICAgMHgxOCwgMHgzQywgMHg3RSwgMHgxOCwgMHgxOCwgMHg3RSwgMHgzQywgMHgxOCwKKyAgICAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDAwLCAweDY2LCAweDAwLAorICAgIDB4N0YsIDB4REIsIDB4REIsIDB4N0IsIDB4MUIsIDB4MUIsIDB4MUIsIDB4MDAsCisgICAgMHgzRSwgMHg2MywgMHgzOCwgMHg2QywgMHg2QywgMHgzOCwgMHg4NiwgMHhGQywKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDdFLCAweDdFLCAweDdFLCAweDAwLAorICAgIDB4MTgsIDB4M0MsIDB4N0UsIDB4MTgsIDB4N0UsIDB4M0MsIDB4MTgsIDB4RkYsCisgICAgMHgxOCwgMHgzQywgMHg3RSwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgwMCwKKyAgICAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDdFLCAweDNDLCAweDE4LCAweDAwLAorICAgIDB4MDAsIDB4MTgsIDB4MEMsIDB4RkUsIDB4MEMsIDB4MTgsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgzMCwgMHg2MCwgMHhGRSwgMHg2MCwgMHgzMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweEMwLCAweEMwLCAweEMwLCAweEZFLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MjQsIDB4NjYsIDB4RkYsIDB4NjYsIDB4MjQsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgxOCwgMHgzQywgMHg3RSwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweEZGLCAweEZGLCAweDdFLCAweDNDLCAweDE4LCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgxOCwgMHgzQywgMHgzQywgMHgxOCwgMHgxOCwgMHgwMCwgMHgxOCwgMHgwMCwKKyAgICAweDZDLCAweDZDLCAweDZDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4NkMsIDB4NkMsIDB4RkUsIDB4NkMsIDB4RkUsIDB4NkMsIDB4NkMsIDB4MDAsCisgICAgMHgxOCwgMHg3RSwgMHhDMCwgMHg3QywgMHgwNiwgMHhGQywgMHgxOCwgMHgwMCwKKyAgICAweDAwLCAweEM2LCAweENDLCAweDE4LCAweDMwLCAweDY2LCAweEM2LCAweDAwLAorICAgIDB4MzgsIDB4NkMsIDB4MzgsIDB4NzYsIDB4REMsIDB4Q0MsIDB4NzYsIDB4MDAsCisgICAgMHgzMCwgMHgzMCwgMHg2MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDE4LCAweDMwLCAweDYwLCAweDYwLCAweDYwLCAweDMwLCAweDE4LCAweDAwLAorICAgIDB4NjAsIDB4MzAsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MzAsIDB4NjAsIDB4MDAsCisgICAgMHgwMCwgMHg2NiwgMHgzQywgMHhGRiwgMHgzQywgMHg2NiwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDE4LCAweDE4LCAweDdFLCAweDE4LCAweDE4LCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTgsIDB4MTgsIDB4MzAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHg3RSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDE4LCAweDE4LCAweDAwLAorICAgIDB4MDYsIDB4MEMsIDB4MTgsIDB4MzAsIDB4NjAsIDB4QzAsIDB4ODAsIDB4MDAsCisgICAgMHg3QywgMHhDRSwgMHhERSwgMHhGNiwgMHhFNiwgMHhDNiwgMHg3QywgMHgwMCwKKyAgICAweDMwLCAweDcwLCAweDMwLCAweDMwLCAweDMwLCAweDMwLCAweEZDLCAweDAwLAorICAgIDB4NzgsIDB4Q0MsIDB4MEMsIDB4MzgsIDB4NjAsIDB4Q0MsIDB4RkMsIDB4MDAsCisgICAgMHg3OCwgMHhDQywgMHgwQywgMHgzOCwgMHgwQywgMHhDQywgMHg3OCwgMHgwMCwKKyAgICAweDFDLCAweDNDLCAweDZDLCAweENDLCAweEZFLCAweDBDLCAweDFFLCAweDAwLAorICAgIDB4RkMsIDB4QzAsIDB4RjgsIDB4MEMsIDB4MEMsIDB4Q0MsIDB4NzgsIDB4MDAsCisgICAgMHgzOCwgMHg2MCwgMHhDMCwgMHhGOCwgMHhDQywgMHhDQywgMHg3OCwgMHgwMCwKKyAgICAweEZDLCAweENDLCAweDBDLCAweDE4LCAweDMwLCAweDMwLCAweDMwLCAweDAwLAorICAgIDB4NzgsIDB4Q0MsIDB4Q0MsIDB4NzgsIDB4Q0MsIDB4Q0MsIDB4NzgsIDB4MDAsCisgICAgMHg3OCwgMHhDQywgMHhDQywgMHg3QywgMHgwQywgMHgxOCwgMHg3MCwgMHgwMCwKKyAgICAweDAwLCAweDE4LCAweDE4LCAweDAwLCAweDAwLCAweDE4LCAweDE4LCAweDAwLAorICAgIDB4MDAsIDB4MTgsIDB4MTgsIDB4MDAsIDB4MDAsIDB4MTgsIDB4MTgsIDB4MzAsCisgICAgMHgxOCwgMHgzMCwgMHg2MCwgMHhDMCwgMHg2MCwgMHgzMCwgMHgxOCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDdFLCAweDAwLCAweDdFLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4NjAsIDB4MzAsIDB4MTgsIDB4MEMsIDB4MTgsIDB4MzAsIDB4NjAsIDB4MDAsCisgICAgMHgzQywgMHg2NiwgMHgwQywgMHgxOCwgMHgxOCwgMHgwMCwgMHgxOCwgMHgwMCwKKyAgICAweDdDLCAweEM2LCAweERFLCAweERFLCAweERDLCAweEMwLCAweDdDLCAweDAwLAorICAgIDB4MzAsIDB4NzgsIDB4Q0MsIDB4Q0MsIDB4RkMsIDB4Q0MsIDB4Q0MsIDB4MDAsCisgICAgMHhGQywgMHg2NiwgMHg2NiwgMHg3QywgMHg2NiwgMHg2NiwgMHhGQywgMHgwMCwKKyAgICAweDNDLCAweDY2LCAweEMwLCAweEMwLCAweEMwLCAweDY2LCAweDNDLCAweDAwLAorICAgIDB4RjgsIDB4NkMsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NkMsIDB4RjgsIDB4MDAsCisgICAgMHhGRSwgMHg2MiwgMHg2OCwgMHg3OCwgMHg2OCwgMHg2MiwgMHhGRSwgMHgwMCwKKyAgICAweEZFLCAweDYyLCAweDY4LCAweDc4LCAweDY4LCAweDYwLCAweEYwLCAweDAwLAorICAgIDB4M0MsIDB4NjYsIDB4QzAsIDB4QzAsIDB4Q0UsIDB4NjYsIDB4M0EsIDB4MDAsCisgICAgMHhDQywgMHhDQywgMHhDQywgMHhGQywgMHhDQywgMHhDQywgMHhDQywgMHgwMCwKKyAgICAweDc4LCAweDMwLCAweDMwLCAweDMwLCAweDMwLCAweDMwLCAweDc4LCAweDAwLAorICAgIDB4MUUsIDB4MEMsIDB4MEMsIDB4MEMsIDB4Q0MsIDB4Q0MsIDB4NzgsIDB4MDAsCisgICAgMHhFNiwgMHg2NiwgMHg2QywgMHg3OCwgMHg2QywgMHg2NiwgMHhFNiwgMHgwMCwKKyAgICAweEYwLCAweDYwLCAweDYwLCAweDYwLCAweDYyLCAweDY2LCAweEZFLCAweDAwLAorICAgIDB4QzYsIDB4RUUsIDB4RkUsIDB4RkUsIDB4RDYsIDB4QzYsIDB4QzYsIDB4MDAsCisgICAgMHhDNiwgMHhFNiwgMHhGNiwgMHhERSwgMHhDRSwgMHhDNiwgMHhDNiwgMHgwMCwKKyAgICAweDM4LCAweDZDLCAweEM2LCAweEM2LCAweEM2LCAweDZDLCAweDM4LCAweDAwLAorICAgIDB4RkMsIDB4NjYsIDB4NjYsIDB4N0MsIDB4NjAsIDB4NjAsIDB4RjAsIDB4MDAsCisgICAgMHg3QywgMHhDNiwgMHhDNiwgMHhDNiwgMHhENiwgMHg3QywgMHgwRSwgMHgwMCwKKyAgICAweEZDLCAweDY2LCAweDY2LCAweDdDLCAweDZDLCAweDY2LCAweEU2LCAweDAwLAorICAgIDB4N0MsIDB4QzYsIDB4RTAsIDB4NzgsIDB4MEUsIDB4QzYsIDB4N0MsIDB4MDAsCisgICAgMHhGQywgMHhCNCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHg3OCwgMHgwMCwKKyAgICAweENDLCAweENDLCAweENDLCAweENDLCAweENDLCAweENDLCAweEZDLCAweDAwLAorICAgIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4NzgsIDB4MzAsIDB4MDAsCisgICAgMHhDNiwgMHhDNiwgMHhDNiwgMHhDNiwgMHhENiwgMHhGRSwgMHg2QywgMHgwMCwKKyAgICAweEM2LCAweEM2LCAweDZDLCAweDM4LCAweDZDLCAweEM2LCAweEM2LCAweDAwLAorICAgIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4NzgsIDB4MzAsIDB4MzAsIDB4NzgsIDB4MDAsCisgICAgMHhGRSwgMHhDNiwgMHg4QywgMHgxOCwgMHgzMiwgMHg2NiwgMHhGRSwgMHgwMCwKKyAgICAweDc4LCAweDYwLCAweDYwLCAweDYwLCAweDYwLCAweDYwLCAweDc4LCAweDAwLAorICAgIDB4QzAsIDB4NjAsIDB4MzAsIDB4MTgsIDB4MEMsIDB4MDYsIDB4MDIsIDB4MDAsCisgICAgMHg3OCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHg3OCwgMHgwMCwKKyAgICAweDEwLCAweDM4LCAweDZDLCAweEM2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsCisgICAgMHgzMCwgMHgzMCwgMHgxOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDc4LCAweDBDLCAweDdDLCAweENDLCAweDc2LCAweDAwLAorICAgIDB4RTAsIDB4NjAsIDB4NjAsIDB4N0MsIDB4NjYsIDB4NjYsIDB4REMsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHg3OCwgMHhDQywgMHhDMCwgMHhDQywgMHg3OCwgMHgwMCwKKyAgICAweDFDLCAweDBDLCAweDBDLCAweDdDLCAweENDLCAweENDLCAweDc2LCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4NzgsIDB4Q0MsIDB4RkMsIDB4QzAsIDB4NzgsIDB4MDAsCisgICAgMHgzOCwgMHg2QywgMHg2NCwgMHhGMCwgMHg2MCwgMHg2MCwgMHhGMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDc2LCAweENDLCAweENDLCAweDdDLCAweDBDLCAweEY4LAorICAgIDB4RTAsIDB4NjAsIDB4NkMsIDB4NzYsIDB4NjYsIDB4NjYsIDB4RTYsIDB4MDAsCisgICAgMHgzMCwgMHgwMCwgMHg3MCwgMHgzMCwgMHgzMCwgMHgzMCwgMHg3OCwgMHgwMCwKKyAgICAweDBDLCAweDAwLCAweDFDLCAweDBDLCAweDBDLCAweENDLCAweENDLCAweDc4LAorICAgIDB4RTAsIDB4NjAsIDB4NjYsIDB4NkMsIDB4NzgsIDB4NkMsIDB4RTYsIDB4MDAsCisgICAgMHg3MCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHg3OCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweENDLCAweEZFLCAweEZFLCAweEQ2LCAweEQ2LCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4QjgsIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHg3OCwgMHhDQywgMHhDQywgMHhDQywgMHg3OCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweERDLCAweDY2LCAweDY2LCAweDdDLCAweDYwLCAweEYwLAorICAgIDB4MDAsIDB4MDAsIDB4NzYsIDB4Q0MsIDB4Q0MsIDB4N0MsIDB4MEMsIDB4MUUsCisgICAgMHgwMCwgMHgwMCwgMHhEQywgMHg3NiwgMHg2MiwgMHg2MCwgMHhGMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDdDLCAweEMwLCAweDcwLCAweDFDLCAweEY4LCAweDAwLAorICAgIDB4MTAsIDB4MzAsIDB4RkMsIDB4MzAsIDB4MzAsIDB4MzQsIDB4MTgsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHhDQywgMHhDQywgMHhDQywgMHhDQywgMHg3NiwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweENDLCAweENDLCAweENDLCAweDc4LCAweDMwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4QzYsIDB4QzYsIDB4RDYsIDB4RkUsIDB4NkMsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHhDNiwgMHg2QywgMHgzOCwgMHg2QywgMHhDNiwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweENDLCAweENDLCAweENDLCAweDdDLCAweDBDLCAweEY4LAorICAgIDB4MDAsIDB4MDAsIDB4RkMsIDB4OTgsIDB4MzAsIDB4NjQsIDB4RkMsIDB4MDAsCisgICAgMHgxQywgMHgzMCwgMHgzMCwgMHhFMCwgMHgzMCwgMHgzMCwgMHgxQywgMHgwMCwKKyAgICAweDE4LCAweDE4LCAweDE4LCAweDAwLCAweDE4LCAweDE4LCAweDE4LCAweDAwLAorICAgIDB4RTAsIDB4MzAsIDB4MzAsIDB4MUMsIDB4MzAsIDB4MzAsIDB4RTAsIDB4MDAsCisgICAgMHg3NiwgMHhEQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDEwLCAweDM4LCAweDZDLCAweEM2LCAweEM2LCAweEZFLCAweDAwLAorICAgIDB4N0MsIDB4QzYsIDB4QzAsIDB4QzYsIDB4N0MsIDB4MEMsIDB4MDYsIDB4N0MsCisgICAgMHgwMCwgMHhDQywgMHgwMCwgMHhDQywgMHhDQywgMHhDQywgMHg3NiwgMHgwMCwKKyAgICAweDFDLCAweDAwLCAweDc4LCAweENDLCAweEZDLCAweEMwLCAweDc4LCAweDAwLAorICAgIDB4N0UsIDB4ODEsIDB4M0MsIDB4MDYsIDB4M0UsIDB4NjYsIDB4M0IsIDB4MDAsCisgICAgMHhDQywgMHgwMCwgMHg3OCwgMHgwQywgMHg3QywgMHhDQywgMHg3NiwgMHgwMCwKKyAgICAweEUwLCAweDAwLCAweDc4LCAweDBDLCAweDdDLCAweENDLCAweDc2LCAweDAwLAorICAgIDB4MzAsIDB4MzAsIDB4NzgsIDB4MEMsIDB4N0MsIDB4Q0MsIDB4NzYsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHg3QywgMHhDNiwgMHhDMCwgMHg3OCwgMHgwQywgMHgzOCwKKyAgICAweDdFLCAweDgxLCAweDNDLCAweDY2LCAweDdFLCAweDYwLCAweDNDLCAweDAwLAorICAgIDB4Q0MsIDB4MDAsIDB4NzgsIDB4Q0MsIDB4RkMsIDB4QzAsIDB4NzgsIDB4MDAsCisgICAgMHhFMCwgMHgwMCwgMHg3OCwgMHhDQywgMHhGQywgMHhDMCwgMHg3OCwgMHgwMCwKKyAgICAweENDLCAweDAwLCAweDcwLCAweDMwLCAweDMwLCAweDMwLCAweDc4LCAweDAwLAorICAgIDB4N0MsIDB4ODIsIDB4MzgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4M0MsIDB4MDAsCisgICAgMHhFMCwgMHgwMCwgMHg3MCwgMHgzMCwgMHgzMCwgMHgzMCwgMHg3OCwgMHgwMCwKKyAgICAweEM2LCAweDEwLCAweDdDLCAweEM2LCAweEZFLCAweEM2LCAweEM2LCAweDAwLAorICAgIDB4MzAsIDB4MzAsIDB4MDAsIDB4NzgsIDB4Q0MsIDB4RkMsIDB4Q0MsIDB4MDAsCisgICAgMHgxQywgMHgwMCwgMHhGQywgMHg2MCwgMHg3OCwgMHg2MCwgMHhGQywgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDdGLCAweDBDLCAweDdGLCAweENDLCAweDdGLCAweDAwLAorICAgIDB4M0UsIDB4NkMsIDB4Q0MsIDB4RkUsIDB4Q0MsIDB4Q0MsIDB4Q0UsIDB4MDAsCisgICAgMHg3OCwgMHg4NCwgMHgwMCwgMHg3OCwgMHhDQywgMHhDQywgMHg3OCwgMHgwMCwKKyAgICAweDAwLCAweENDLCAweDAwLCAweDc4LCAweENDLCAweENDLCAweDc4LCAweDAwLAorICAgIDB4MDAsIDB4RTAsIDB4MDAsIDB4NzgsIDB4Q0MsIDB4Q0MsIDB4NzgsIDB4MDAsCisgICAgMHg3OCwgMHg4NCwgMHgwMCwgMHhDQywgMHhDQywgMHhDQywgMHg3NiwgMHgwMCwKKyAgICAweDAwLCAweEUwLCAweDAwLCAweENDLCAweENDLCAweENDLCAweDc2LCAweDAwLAorICAgIDB4MDAsIDB4Q0MsIDB4MDAsIDB4Q0MsIDB4Q0MsIDB4N0MsIDB4MEMsIDB4RjgsCisgICAgMHhDMywgMHgxOCwgMHgzQywgMHg2NiwgMHg2NiwgMHgzQywgMHgxOCwgMHgwMCwKKyAgICAweENDLCAweDAwLCAweENDLCAweENDLCAweENDLCAweENDLCAweDc4LCAweDAwLAorICAgIDB4MTgsIDB4MTgsIDB4N0UsIDB4QzAsIDB4QzAsIDB4N0UsIDB4MTgsIDB4MTgsCisgICAgMHgzOCwgMHg2QywgMHg2NCwgMHhGMCwgMHg2MCwgMHhFNiwgMHhGQywgMHgwMCwKKyAgICAweENDLCAweENDLCAweDc4LCAweDMwLCAweEZDLCAweDMwLCAweEZDLCAweDMwLAorICAgIDB4RjgsIDB4Q0MsIDB4Q0MsIDB4RkEsIDB4QzYsIDB4Q0YsIDB4QzYsIDB4QzMsCisgICAgMHgwRSwgMHgxQiwgMHgxOCwgMHgzQywgMHgxOCwgMHgxOCwgMHhEOCwgMHg3MCwKKyAgICAweDFDLCAweDAwLCAweDc4LCAweDBDLCAweDdDLCAweENDLCAweDc2LCAweDAwLAorICAgIDB4MzgsIDB4MDAsIDB4NzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4NzgsIDB4MDAsCisgICAgMHgwMCwgMHgxQywgMHgwMCwgMHg3OCwgMHhDQywgMHhDQywgMHg3OCwgMHgwMCwKKyAgICAweDAwLCAweDFDLCAweDAwLCAweENDLCAweENDLCAweENDLCAweDc2LCAweDAwLAorICAgIDB4MDAsIDB4RjgsIDB4MDAsIDB4QjgsIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4MDAsCisgICAgMHhGQywgMHgwMCwgMHhDQywgMHhFQywgMHhGQywgMHhEQywgMHhDQywgMHgwMCwKKyAgICAweDNDLCAweDZDLCAweDZDLCAweDNFLCAweDAwLCAweDdFLCAweDAwLCAweDAwLAorICAgIDB4MzgsIDB4NkMsIDB4NkMsIDB4MzgsIDB4MDAsIDB4N0MsIDB4MDAsIDB4MDAsCisgICAgMHgxOCwgMHgwMCwgMHgxOCwgMHgxOCwgMHgzMCwgMHg2NiwgMHgzQywgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweEZDLCAweEMwLCAweEMwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkMsIDB4MEMsIDB4MEMsIDB4MDAsIDB4MDAsCisgICAgMHhDNiwgMHhDQywgMHhEOCwgMHgzNiwgMHg2QiwgMHhDMiwgMHg4NCwgMHgwRiwKKyAgICAweEMzLCAweEM2LCAweENDLCAweERCLCAweDM3LCAweDZELCAweENGLCAweDAzLAorICAgIDB4MTgsIDB4MDAsIDB4MTgsIDB4MTgsIDB4M0MsIDB4M0MsIDB4MTgsIDB4MDAsCisgICAgMHgwMCwgMHgzMywgMHg2NiwgMHhDQywgMHg2NiwgMHgzMywgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweENDLCAweDY2LCAweDMzLCAweDY2LCAweENDLCAweDAwLCAweDAwLAorICAgIDB4MjIsIDB4ODgsIDB4MjIsIDB4ODgsIDB4MjIsIDB4ODgsIDB4MjIsIDB4ODgsCisgICAgMHg1NSwgMHhBQSwgMHg1NSwgMHhBQSwgMHg1NSwgMHhBQSwgMHg1NSwgMHhBQSwKKyAgICAweERCLCAweEY2LCAweERCLCAweDZGLCAweERCLCAweDdFLCAweEQ3LCAweEVELAorICAgIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsCisgICAgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHhGOCwgMHgxOCwgMHgxOCwgMHgxOCwKKyAgICAweDE4LCAweDE4LCAweEY4LCAweDE4LCAweEY4LCAweDE4LCAweDE4LCAweDE4LAorICAgIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4RjYsIDB4MzYsIDB4MzYsIDB4MzYsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRSwgMHgzNiwgMHgzNiwgMHgzNiwKKyAgICAweDAwLCAweDAwLCAweEY4LCAweDE4LCAweEY4LCAweDE4LCAweDE4LCAweDE4LAorICAgIDB4MzYsIDB4MzYsIDB4RjYsIDB4MDYsIDB4RjYsIDB4MzYsIDB4MzYsIDB4MzYsCisgICAgMHgzNiwgMHgzNiwgMHgzNiwgMHgzNiwgMHgzNiwgMHgzNiwgMHgzNiwgMHgzNiwKKyAgICAweDAwLCAweDAwLCAweEZFLCAweDA2LCAweEY2LCAweDM2LCAweDM2LCAweDM2LAorICAgIDB4MzYsIDB4MzYsIDB4RjYsIDB4MDYsIDB4RkUsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgzNiwgMHgzNiwgMHgzNiwgMHgzNiwgMHhGRSwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDE4LCAweDE4LCAweEY4LCAweDE4LCAweEY4LCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjgsIDB4MTgsIDB4MTgsIDB4MTgsCisgICAgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxRiwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweEZGLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4MTgsIDB4MTgsIDB4MTgsCisgICAgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxRiwgMHgxOCwgMHgxOCwgMHgxOCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4RkYsIDB4MTgsIDB4MTgsIDB4MTgsCisgICAgMHgxOCwgMHgxOCwgMHgxRiwgMHgxOCwgMHgxRiwgMHgxOCwgMHgxOCwgMHgxOCwKKyAgICAweDM2LCAweDM2LCAweDM2LCAweDM2LCAweDM3LCAweDM2LCAweDM2LCAweDM2LAorICAgIDB4MzYsIDB4MzYsIDB4MzcsIDB4MzAsIDB4M0YsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgzRiwgMHgzMCwgMHgzNywgMHgzNiwgMHgzNiwgMHgzNiwKKyAgICAweDM2LCAweDM2LCAweEY3LCAweDAwLCAweEZGLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4RkYsIDB4MDAsIDB4RjcsIDB4MzYsIDB4MzYsIDB4MzYsCisgICAgMHgzNiwgMHgzNiwgMHgzNywgMHgzMCwgMHgzNywgMHgzNiwgMHgzNiwgMHgzNiwKKyAgICAweDAwLCAweDAwLCAweEZGLCAweDAwLCAweEZGLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MzYsIDB4MzYsIDB4RjcsIDB4MDAsIDB4RjcsIDB4MzYsIDB4MzYsIDB4MzYsCisgICAgMHgxOCwgMHgxOCwgMHhGRiwgMHgwMCwgMHhGRiwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDM2LCAweDM2LCAweDM2LCAweDM2LCAweEZGLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4RkYsIDB4MDAsIDB4RkYsIDB4MTgsIDB4MTgsIDB4MTgsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHgzNiwgMHgzNiwgMHgzNiwKKyAgICAweDM2LCAweDM2LCAweDM2LCAweDM2LCAweDNGLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MTgsIDB4MTgsIDB4MUYsIDB4MTgsIDB4MUYsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgxRiwgMHgxOCwgMHgxRiwgMHgxOCwgMHgxOCwgMHgxOCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDNGLCAweDM2LCAweDM2LCAweDM2LAorICAgIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4RkYsIDB4MzYsIDB4MzYsIDB4MzYsCisgICAgMHgxOCwgMHgxOCwgMHhGRiwgMHgxOCwgMHhGRiwgMHgxOCwgMHgxOCwgMHgxOCwKKyAgICAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweEY4LCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MUYsIDB4MTgsIDB4MTgsIDB4MTgsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RjAsIDB4RjAsIDB4RjAsIDB4RjAsIDB4RjAsIDB4RjAsIDB4RjAsIDB4RjAsCisgICAgMHgwRiwgMHgwRiwgMHgwRiwgMHgwRiwgMHgwRiwgMHgwRiwgMHgwRiwgMHgwRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4NzYsIDB4REMsIDB4QzgsIDB4REMsIDB4NzYsIDB4MDAsCisgICAgMHgwMCwgMHg3OCwgMHhDQywgMHhGOCwgMHhDQywgMHhGOCwgMHhDMCwgMHhDMCwKKyAgICAweDAwLCAweEZDLCAweENDLCAweEMwLCAweEMwLCAweEMwLCAweEMwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4RkUsIDB4NkMsIDB4NkMsIDB4NkMsIDB4NkMsIDB4MDAsCisgICAgMHhGQywgMHhDQywgMHg2MCwgMHgzMCwgMHg2MCwgMHhDQywgMHhGQywgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDdFLCAweEQ4LCAweEQ4LCAweEQ4LCAweDcwLCAweDAwLAorICAgIDB4MDAsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4N0MsIDB4NjAsIDB4QzAsCisgICAgMHgwMCwgMHg3NiwgMHhEQywgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgwMCwKKyAgICAweEZDLCAweDMwLCAweDc4LCAweENDLCAweENDLCAweDc4LCAweDMwLCAweEZDLAorICAgIDB4MzgsIDB4NkMsIDB4QzYsIDB4RkUsIDB4QzYsIDB4NkMsIDB4MzgsIDB4MDAsCisgICAgMHgzOCwgMHg2QywgMHhDNiwgMHhDNiwgMHg2QywgMHg2QywgMHhFRSwgMHgwMCwKKyAgICAweDFDLCAweDMwLCAweDE4LCAweDdDLCAweENDLCAweENDLCAweDc4LCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4N0UsIDB4REIsIDB4REIsIDB4N0UsIDB4MDAsIDB4MDAsCisgICAgMHgwNiwgMHgwQywgMHg3RSwgMHhEQiwgMHhEQiwgMHg3RSwgMHg2MCwgMHhDMCwKKyAgICAweDM4LCAweDYwLCAweEMwLCAweEY4LCAweEMwLCAweDYwLCAweDM4LCAweDAwLAorICAgIDB4NzgsIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4Q0MsIDB4MDAsCisgICAgMHgwMCwgMHg3RSwgMHgwMCwgMHg3RSwgMHgwMCwgMHg3RSwgMHgwMCwgMHgwMCwKKyAgICAweDE4LCAweDE4LCAweDdFLCAweDE4LCAweDE4LCAweDAwLCAweDdFLCAweDAwLAorICAgIDB4NjAsIDB4MzAsIDB4MTgsIDB4MzAsIDB4NjAsIDB4MDAsIDB4RkMsIDB4MDAsCisgICAgMHgxOCwgMHgzMCwgMHg2MCwgMHgzMCwgMHgxOCwgMHgwMCwgMHhGQywgMHgwMCwKKyAgICAweDBFLCAweDFCLCAweDFCLCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LAorICAgIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4RDgsIDB4RDgsIDB4NzAsCisgICAgMHgxOCwgMHgxOCwgMHgwMCwgMHg3RSwgMHgwMCwgMHgxOCwgMHgxOCwgMHgwMCwKKyAgICAweDAwLCAweDc2LCAweERDLCAweDAwLCAweDc2LCAweERDLCAweDAwLCAweDAwLAorICAgIDB4MzgsIDB4NkMsIDB4NkMsIDB4MzgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgxOCwgMHgxOCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDE4LCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MEYsIDB4MEMsIDB4MEMsIDB4MEMsIDB4RUMsIDB4NkMsIDB4M0MsIDB4MUMsCisgICAgMHg1OCwgMHg2QywgMHg2QywgMHg2QywgMHg2QywgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDcwLCAweDk4LCAweDMwLCAweDYwLCAweEY4LCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4M0MsIDB4M0MsIDB4M0MsIDB4M0MsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMAorICB9OworCisKKyAgc3RhdGljCisgIGdyQml0bWFwICBncl9jaGFyY2VsbCA9CisgIHsKKyAgICA4LCAgICAgICAgICAgICAgICAgICAgLyogcm93cyAgKi8KKyAgICA4LCAgICAgICAgICAgICAgICAgICAgLyogd2lkdGggKi8KKyAgICBncl9waXhlbF9tb2RlX21vbm8sICAgLyogbW9kZSAgKi8KKyAgICAxLCAgICAgICAgICAgICAgICAgICAgLyogcGl0Y2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgLyogZ3JheXMgKi8KKyAgICAwICAgICAgICAgICAgICAgICAgICAgLyogYnVmZmVyICovCisgIH07CisKKyAgdm9pZCAgZ3JXcml0ZUNlbGxDaGFyKCBnckJpdG1hcCogIHRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgIHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICB5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgY2hhcmNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgZ3JDb2xvciAgICBjb2xvciApCisgIHsKKyAgICBpZiAoY2hhcmNvZGUgPCAwIHx8IGNoYXJjb2RlID4gMjU1KQorICAgICAgcmV0dXJuOworICAgICAgCisgICAgZ3JfY2hhcmNlbGwuYnVmZmVyID0gKGNoYXIqKWZvbnRfOHg4ICsgOCpjaGFyY29kZTsKKyAgICBnckJsaXRHbHlwaFRvQml0bWFwKCB0YXJnZXQsICZncl9jaGFyY2VsbCwgeCwgeSwgY29sb3IgKTsKKyAgfQorICAKKyAgCisgIHZvaWQgIGdyV3JpdGVDZWxsU3RyaW5nKCBnckJpdG1hcCogICB0YXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyQ29sb3IgICAgIGNvbG9yICkKKyAgeworICAgIHdoaWxlICgqc3RyaW5nKQorICAgIHsKKyAgICAgIGdyX2NoYXJjZWxsLmJ1ZmZlciA9IChjaGFyKilmb250Xzh4OCArIDgqKGludCkodW5zaWduZWQgY2hhcikqc3RyaW5nKys7CisgICAgICBnckJsaXRHbHlwaFRvQml0bWFwKCB0YXJnZXQsICZncl9jaGFyY2VsbCwgeCwgeSwgY29sb3IgKTsKKyAgICAgIHggKz0gODsKKyAgICB9CisgIH0KKyAgCisgIHN0YXRpYyBpbnQgICAgICAgIGdyX2N1cnNvcl94ICAgICA9IDA7CisgIHN0YXRpYyBpbnQgICAgICAgIGdyX2N1cnNvcl95ICAgICA9IDA7CisgIHN0YXRpYyBnckJpdG1hcCogIGdyX3RleHRfYml0bWFwICA9IDA7CisgIHN0YXRpYyBpbnQgICAgICAgIGdyX21hcmdpbl9yaWdodCA9IDA7CisgIHN0YXRpYyBpbnQgICAgICAgIGdyX21hcmdpbl90b3AgICA9IDA7CisKKyAgZXh0ZXJuIHZvaWQgZ3JHb3RvYml0bWFwKCBnckJpdG1hcCogIGJpdG1hcCApCisgIHsKKyAgICBncl90ZXh0X2JpdG1hcCA9IGJpdG1hcDsKKyAgfQorICAKKyAgZXh0ZXJuIHZvaWQgZ3JTZXRNYXJnaW4oIGludCByaWdodCwgaW50IHRvcCApCisgIHsKKyAgICBncl9tYXJnaW5fdG9wICAgPSB0b3AgPDwgMzsKKyAgICBncl9tYXJnaW5fcmlnaHQgPSByaWdodCA8PCAzOworICB9CisgCisgIGV4dGVybiB2b2lkIGdyR290b3h5ICggaW50IHgsIGludCB5ICkKKyAgeworICAgIGdyX2N1cnNvcl94ID0geDsKKyAgICBncl9jdXJzb3JfeSA9IHk7CisgIH0KKyAKKyAgZXh0ZXJuIHZvaWQgZ3JXcml0ZSAgKCBjb25zdCBjaGFyKiAgc3RyaW5nICkKKyAgeworICAgIGlmIChzdHJpbmcpCisgICAgeworICAgICAgZ3JXcml0ZUNlbGxTdHJpbmcoIGdyX3RleHRfYml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgIGdyX21hcmdpbl9yaWdodCArIChncl9jdXJzb3JfeCA8PCAzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBncl9tYXJnaW5fdG9wICAgKyAoZ3JfY3Vyc29yX3kgPDwgMyksCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgIChnckNvbG9yKTEyN0wgKTsKKyAKKyAgICAgIGdyX2N1cnNvcl94ICs9IHN0cmxlbihzdHJpbmcpOworICAgIH0KKyAgfQorICAKKyAgZXh0ZXJuIHZvaWQgZ3JMbigpCisgIHsKKyAgICBncl9jdXJzb3JfeSArKzsKKyAgICBncl9jdXJzb3JfeCA9IDA7CisgIH0KKworICBleHRlcm4gdm9pZCBncldyaXRlbG4oIGNvbnN0IGNoYXIqIHN0cmluZyApCisgIHsKKyAgICBncldyaXRlKCBzdHJpbmcgKTsKKyAgICBnckxuKCk7CisgIH0KKworICAKZGlmZiAtLWdpdCBhL2RlbW9zL2dyYXBoL2dyZm9udC5oIGIvZGVtb3MvZ3JhcGgvZ3Jmb250LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ1NmFmMgotLS0gL2Rldi9udWxsCisrKyBiL2RlbW9zL2dyYXBoL2dyZm9udC5oCkBAIC0wLDAgKzEsMTYgQEAKKyNpZm5kZWYgR1JGT05UX0gKKyNkZWZpbmUgR1JGT05UX0gKKworI2luY2x1ZGUgImdyYXBoLmgiCisKKyAgZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGNoYXIgIGZvbnRfOHg4W107CisKKyAgZXh0ZXJuIHZvaWQgZ3JHb3RvYml0bWFwKCBnckJpdG1hcCogIGJpdG1hcCApOworICBleHRlcm4gdm9pZCBnclNldE1hcmdpbiggaW50IHJpZ2h0LCBpbnQgdG9wICk7CisgIGV4dGVybiB2b2lkIGdyR290b3h5ICggaW50IHgsIGludCB5ICk7CisKKyAgZXh0ZXJuIHZvaWQgZ3JXcml0ZSAgKCBjb25zdCBjaGFyKiAgc3RyaW5nICk7CisgIGV4dGVybiB2b2lkIGdyV3JpdGVsbiggY29uc3QgY2hhciogc3RyaW5nICk7CisgIGV4dGVybiB2b2lkIGdyTG4oKTsgCisKKyNlbmRpZiAvKiBHUkZPTlRfSCAqLwpkaWZmIC0tZ2l0IGEvZGVtb3MvZ3JhcGgvZ3Jpbml0LmMgYi9kZW1vcy9ncmFwaC9ncmluaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjM3MTA2Ci0tLSAvZGV2L251bGwKKysrIGIvZGVtb3MvZ3JhcGgvZ3Jpbml0LmMKQEAgLTAsMCArMSw3OCBAQAorI2luY2x1ZGUgImdyb2Jqcy5oIgorI2luY2x1ZGUgImdyZGV2aWNlLmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2RlZmluZSBHUl9JTklUX0RFVklDRV9DSEFJTiAgICgoZ3JEZXZpY2VDaGFpbiopMCkKKyNkZWZpbmUgR1JfSU5JVF9CVUlMRAorCisjaWZkZWYgREVWSUNFX1gxMQorI2luY2x1ZGUgImdyeDExLmgiCisjZW5kaWYKKworI2lmZGVmIERFVklDRV9PUzJfUE0KKyNpbmNsdWRlICJncm9zMnBtLmgiCisjZW5kaWYKKworCisKKyAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqCisgICogPEZ1bmN0aW9uPgorICAqICAgIGdySW5pdERldmljZXMKKyAgKgorICAqIDxEZXNjcmlwdGlvbj4KKyAgKiAgICBUaGlzIGZ1bmN0aW9uIGlzIGluIGNoYXJnZSBvZiBpbml0aWFsaXNpbmcgYWxsIHN5c3RlbS1zcGVjaWZpYworICAqICAgIGRldmljZXMuIEEgZGV2aWNlIGlzIHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyBhbmQgbWFuYWdpbmcgb25lCisgICogICAgb3IgbW9yZSAic3VyZmFjZXMiLiBBIHN1cmZhY2UgaXMgZWl0aGVyIGEgd2luZG93IG9yIGEgc2NyZWVuLAorICAqICAgIGRlcGVuZGluZyBvbiB0aGUgc3lzdGVtLgorICAqCisgICogPFJldHVybj4KKyAgKiAgICBhIHBvaW50ZXIgdG8gdGhlIGZpcnN0IGVsZW1lbnQgb2YgYSBkZXZpY2UgY2hhaW4uIFRoZSBjaGFpbiBjYW4KKyAgKiAgICBiZSBwYXJzZWQgdG8gZmluZCB0aGUgYXZhaWxhYmxlIGRldmljZXMgb24gdGhlIGN1cnJlbnQgc3lzdGVtCisgICoKKyAgKiA8Tm90ZT4KKyAgKiAgICBJZiBhIGRldmljZSBjYW5ub3QgYmUgaW5pdGlhbGlzZWQgY29ycmVjdGx5LCBpdCBpcyBub3QgcGFydCBvZgorICAqICAgIHRoZSBkZXZpY2UgY2hhaW4gcmV0dXJuZWQgYnkgdGhpcyBmdW5jdGlvbi4gRm9yIGV4YW1wbGUsIGlmIGFuCisgICogICAgWDExIGRldmljZSB3YXMgY29tcGlsZWQgaW4gdGhlIGxpYnJhcnksIGl0IHdpbGwgYmUgcGFydCBvZgorICAqICAgIHRoZSByZXR1cm5lZCBkZXZpY2UgY2hhaW4gb25seSBpZiBhIGNvbm5lY3Rpb24gdG8gdGhlIGRpc3BsYXkKKyAgKiAgICBjb3VsZCBiZSBlc3RhYmxpc2dlZAorICAqCisgICogICAgSWYgbm8gZHJpdmVyIGNvdWxkIGJlIGluaXRpYWxpc2VkLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgTlVMTC4KKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIGV4dGVybgorICBnckRldmljZUNoYWluKiAgZ3JJbml0RGV2aWNlcyggdm9pZCApCisgIHsKKyAgICBnckRldmljZUNoYWluKiAgY2hhaW4gPSBHUl9JTklUX0RFVklDRV9DSEFJTjsKKyAgICBnckRldmljZUNoYWluKiAgY3VyICAgPSBncl9kZXZpY2VfY2hhaW47CisKKyAgICB3aGlsZSAoY2hhaW4pCisgICAgeworICAgICAgLyogaW5pdGlhbGllIHRoZSBkZXZpY2UgKi8KKyAgICAgIGdyRGV2aWNlKiAgZGV2aWNlOworCisgICAgICBkZXZpY2UgPSBjaGFpbi0+ZGV2aWNlOworICAgICAgaWYgKCBkZXZpY2UtPmluaXQoKSA9PSAwICAgICAgICAgICAgICYmCisgICAgICAgICAgIGdyX251bV9kZXZpY2VzIDwgR1JfTUFYX0RFVklDRVMgKQorICAgICAgICAgIAorICAgICAgeworICAgICAgICAvKiBzdWNjZXNzZnVsIGRldmljZSBpbml0aWFsaXNhdGlvbiAtIGFkZCBpdCB0byBvdXIgY2hhaW4gKi8KKyAgICAgICAgY3VyLT5uZXh0ICAgPSAwOworICAgICAgICBjdXItPmRldmljZSA9IGRldmljZTsKKyAgICAgICAgY3VyLT5uYW1lICAgPSBkZXZpY2UtPmRldmljZV9uYW1lOworCisgICAgICAgIGlmIChjdXIgPiBncl9kZXZpY2VfY2hhaW4pCisgICAgICAgICAgY3VyWy0xXS5uZXh0ID0gY3VyOworCisgICAgICAgIGN1cisrOworICAgICAgICBncl9udW1fZGV2aWNlcysrOworICAgICAgfQorICAgICAgY2hhaW4gPSBjaGFpbi0+bmV4dDsKKyAgICB9CisKKyAgICByZXR1cm4gKGdyX251bV9kZXZpY2VzID4gMCA/IGdyX2RldmljZV9jaGFpbiA6IDAgKTsKKyAgfQorCisKKwpkaWZmIC0tZ2l0IGEvZGVtb3MvZ3JhcGgvZ3JvYmpzLmMgYi9kZW1vcy9ncmFwaC9ncm9ianMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWJkYjI3Ci0tLSAvZGV2L251bGwKKysrIGIvZGVtb3MvZ3JhcGgvZ3JvYmpzLmMKQEAgLTAsMCArMSwyMTMgQEAKKyNpbmNsdWRlICJncm9ianMuaCIKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworCisgIGludCAgZ3JFcnJvciA9IDA7CisKKworIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqCisgICogPEZ1bmN0aW9uPgorICAqICAgZ3JSZWFsbG9jCisgICoKKyAgKiA8RGVzY3JpcHRpb24+CisgICogICBTaW1wbGUgbWVtb3J5IHJlLWFsbG9jYXRpb24uCisgICoKKyAgKiA8SW5wdXQ+CisgICogICBibG9jayA6OiBvcmlnaW5hbCBtZW1vcnkgYmxvY2sgYWRkcmVzcworICAqICAgc2l6ZSAgOjogbmV3IHJlcXVlc3RlZCBibG9jayBzaXplIGluIGJ5dGVzCisgICoKKyAgKiA8UmV0dXJuPgorICAqICAgdGhlIG1lbW9yeSBibG9jayBhZGRyZXNzLiAwIGluIGNhc2Ugb2YgZXJyb3IKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICBjaGFyKiAgZ3JBbGxvYyggbG9uZyBzaXplICkKKyAgeworICAgIGNoYXIqICBwOworICAgICAKKyAgICBwID0gKGNoYXIqKW1hbGxvYyhzaXplKTsKKyAgICBpZiAoIXAgJiYgc2l6ZSA+IDApCisgICAgeworICAgICAgZ3JFcnJvciA9IGdyX2Vycl9tZW1vcnk7IAorICAgIH0KKyAgICAKKyAgICBpZiAocCkKKyAgICAgIG1lbXNldCggcCwgMCwgc2l6ZSApOworICAgIAorICAgIHJldHVybiBwOworICB9CisKKworIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqCisgICogPEZ1bmN0aW9uPgorICAqICAgZ3JSZWFsbG9jCisgICoKKyAgKiA8RGVzY3JpcHRpb24+CisgICogICBTaW1wbGUgbWVtb3J5IHJlLWFsbG9jYXRpb24uCisgICoKKyAgKiA8SW5wdXQ+CisgICogICBibG9jayA6OiBvcmlnaW5hbCBtZW1vcnkgYmxvY2sgYWRkcmVzcworICAqICAgc2l6ZSAgOjogbmV3IHJlcXVlc3RlZCBibG9jayBzaXplIGluIGJ5dGVzCisgICoKKyAgKiA8UmV0dXJuPgorICAqICAgdGhlIG1lbW9yeSBibG9jayBhZGRyZXNzLiAwIGluIGNhc2Ugb2YgZXJyb3IKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICBjaGFyKiAgZ3JSZWFsbG9jKCBjb25zdCBjaGFyKiAgYmxvY2ssIGxvbmcgc2l6ZSApCisgIHsKKyAgICBjaGFyKiAgcDsKKyAgICAKKyAgICBwID0gcmVhbGxvYyggKGNoYXIqKWJsb2NrLCBzaXplICk7CisgICAgaWYgKCFwICYmIHNpemUgPiAwKQorICAgIHsKKyAgICAgIGdyRXJyb3IgPSBncl9lcnJfbWVtb3J5OworICAgIH0KKyAgICByZXR1cm4gcDsKKyAgfQorCisKKyAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKgorICAqIDxGdW5jdGlvbj4KKyAgKiAgIGdyRnJlZQorICAqCisgICogPERlc2NyaXB0aW9uPgorICAqICAgU2ltcGxlIG1lbW9yeSByZWxlYXNlCisgICoKKyAgKiA8SW5wdXQ+CisgICogICBibG9jayA6OiB0YXJnZXQgYmxvY2sKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICB2b2lkICBnckZyZWUoIGNvbnN0IHZvaWQqICBibG9jayApCisgIHsKKyAgICBpZiAoYmxvY2spCisgICAgICBmcmVlKCAoY2hhciopYmxvY2sgKTsKKyAgfQorCisKKworICBzdGF0aWMKKyAgaW50ICBjaGVja19tb2RlKCBnclBpeGVsTW9kZSAgcGl4ZWxfbW9kZSwKKyAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgbnVtX2dyYXlzICkKKyAgeworICAgIGlmICggcGl4ZWxfbW9kZSA8PSBncl9waXhlbF9tb2RlX25vbmUgfHwKKyAgICAgICAgIHBpeGVsX21vZGUgPj0gZ3JfcGl4ZWxfbW9kZV9tYXggICkKKyAgICAgIGdvdG8gRmFpbDsKKyAgIAorICAgIGlmICggcGl4ZWxfbW9kZSAhPSBncl9waXhlbF9tb2RlX2dyYXkgICAgICB8fAorICAgICAgICAgKCBudW1fZ3JheXMgPj0gMiAmJiBudW1fZ3JheXMgPCAyNTYgKSApCisgICAgICByZXR1cm4gMDsKKworICBGYWlsOgorICAgIGdyRXJyb3IgPSBncl9lcnJfYmFkX2FyZ3VtZW50OworICAgIHJldHVybiBnckVycm9yOworICB9CisKKworIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICoKKyAgKiA8RnVuY3Rpb24+CisgICogICAgZ3JOZXdCaXRtYXAKKyAgKgorICAqIDxEZXNjcmlwdGlvbj4KKyAgKiAgICBjcmVhdGVzIGEgbmV3IGJpdG1hcCAgICAKKyAgKgorICAqIDxJbnB1dD4KKyAgKiAgICBwaXhlbF9tb2RlICAgOjogdGhlIHRhcmdldCBzdXJmYWNlJ3MgcGl4ZWxfbW9kZQorICAqICAgIG51bV9ncmF5cyAgICA6OiBudW1iZXIgb2YgZ3JheXMgbGV2ZWxzIGZvciBQQUw4IHBpeGVsIG1vZGUKKyAgKiAgICB3aWR0aCAgICAgICAgOjogd2lkdGggaW4gcGl4ZWxzCisgICogICAgaGVpZ2h0ICAgICAgIDo6IGhlaWdodCBpbiBwaXhlbHMKKyAgKgorICAqIDxPdXRwdXQ+CisgICogICAgYml0ICA6OiBkZXNjcmlwdG9yIG9mIHRoZSBuZXcgYml0bWFwCisgICoKKyAgKiA8UmV0dXJuPgorICAqICAgIEVycm9yIGNvZGUuIDAgbWVhbnMgc3VjY2Vzcy4KKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIGV4dGVybiAgaW50ICBnck5ld0JpdG1hcCggZ3JQaXhlbE1vZGUgIHBpeGVsX21vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgIG51bV9ncmF5cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnckJpdG1hcCAgICAqYml0ICkKKyAgeworICAgIGludCAgcGl0Y2g7CisKKyAgICAvKiBjaGVjayBtb2RlICovCisgICAgaWYgKGNoZWNrX21vZGUocGl4ZWxfbW9kZSxudW1fZ3JheXMpKQorICAgICAgZ290byBGYWlsOworCisgICAgLyogY2hlY2sgZGltZW5zaW9ucyAqLworICAgIGlmICh3aWR0aCA8IDAgfHwgaGVpZ2h0IDwgMCkKKyAgICB7CisgICAgICBnckVycm9yID0gZ3JfZXJyX2JhZF9hcmd1bWVudDsKKyAgICAgIGdvdG8gRmFpbDsKKyAgICB9CisKKyAgICBiaXQtPndpZHRoID0gd2lkdGg7CisgICAgYml0LT5yb3dzICA9IGhlaWdodDsKKyAgICBiaXQtPm1vZGUgID0gcGl4ZWxfbW9kZTsKKyAgICBiaXQtPmdyYXlzID0gbnVtX2dyYXlzOworCisgICAgcGl0Y2ggPSB3aWR0aDsKKworICAgIHN3aXRjaCAocGl4ZWxfbW9kZSkKKyAgICB7CisgICAgICBjYXNlIGdyX3BpeGVsX21vZGVfbW9ubyAgOiBwaXRjaCA9ICh3aWR0aCs3KSA+PiAzOyBicmVhazsKKyAgICAgIGNhc2UgZ3JfcGl4ZWxfbW9kZV9wYWw0ICA6IHBpdGNoID0gKHdpZHRoKzMpID4+IDI7IGJyZWFrOworICAgICAgCisgICAgICBjYXNlIGdyX3BpeGVsX21vZGVfcGFsOCAgOgorICAgICAgY2FzZSBncl9waXhlbF9tb2RlX2dyYXkgIDogcGl0Y2ggPSB3aWR0aDsgYnJlYWs7CisgICAgICAKKyAgICAgIGNhc2UgZ3JfcGl4ZWxfbW9kZV9yZ2I1NTU6CisgICAgICBjYXNlIGdyX3BpeGVsX21vZGVfcmdiNTY1OiBwaXRjaCA9IHdpZHRoKjI7IGJyZWFrOworICAgICAgCisgICAgICBjYXNlIGdyX3BpeGVsX21vZGVfcmdiMjQgOiBwaXRjaCA9IHdpZHRoKjM7IGJyZWFrOworICAgICAgCisgICAgICBjYXNlIGdyX3BpeGVsX21vZGVfcmdiMzIgOiBwaXRjaCA9IHdpZHRoKjQ7IGJyZWFrOworICAgICAgCisgICAgICBkZWZhdWx0OgorICAgICAgICBnckVycm9yID0gZ3JfZXJyX2JhZF90YXJnZXRfZGVwdGg7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAKKyAgICBiaXQtPnBpdGNoICA9IHBpdGNoOworICAgIGJpdC0+YnVmZmVyID0gZ3JBbGxvYyggKGxvbmcpYml0LT5waXRjaCAqIGJpdC0+cm93cyApOworICAgIGlmICghYml0LT5idWZmZXIpIGdvdG8gRmFpbDsKKyAgICAKKyAgICByZXR1cm4gMDsKKyAgICAKKyAgRmFpbDoKKyAgICByZXR1cm4gZ3JFcnJvcjsKKyAgfQorCisgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKgorICAqIDxGdW5jdGlvbj4KKyAgKiAgICBnckRvbmVCaXRtYXAKKyAgKgorICAqIDxEZXNjcmlwdGlvbj4KKyAgKiAgICBkZXN0cm95cyBhIGJpdG1hcCAgICAKKyAgKgorICAqIDxJbnB1dD4KKyAgKiAgICBiaXRtYXAgOjogaGFuZGxlIHRvIGJpdG1hcCBkZXNjcmlwdG9yCisgICoKKyAgKiA8Tm90ZT4KKyAgKiAgICBUaGlzIGZ1bmN0aW9uIGRvZXMgTk9UIHJlbGVhc2UgdGhlIGJpdG1hcCBkZXNjcmlwdG9yLCBvbmx5CisgICogICAgdGhlIHBpeGVsIGJ1ZmZlci4KKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIGV4dGVybiAgdm9pZCAgZ3JEb25lQml0bWFwKCBnckJpdG1hcCogIGJpdCApCisgIHsKKyAgICBnckZyZWUoIGJpdC0+YnVmZmVyICk7CisgICAgYml0LT5idWZmZXIgPSAwOworICB9CisKKworCmRpZmYgLS1naXQgYS9kZW1vcy9ncmFwaC9ncm9ianMuaCBiL2RlbW9zL2dyYXBoL2dyb2Jqcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5ZWIzMWQKLS0tIC9kZXYvbnVsbAorKysgYi9kZW1vcy9ncmFwaC9ncm9ianMuaApAQCAtMCwwICsxLDE4NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBncm9ianMuaAorICoKKyAqICAgIGJhc2ljIG9iamVjdCBjbGFzc2VzIGRlZmludGlvbnMKKyAqCisgKiAgQ29weXJpZ2h0IDE5OTkgLSBUaGUgRnJlZVR5cGUgRGV2ZWxvcG1lbnQgVGVhbSAtIHd3dy5mcmVldHlwZS5vcmcKKyAqCisgKgorICoKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIEdST0JKU19ICisjZGVmaW5lIEdST0JKU19ICisKKyNpbmNsdWRlICJncmFwaC5oIgorI2luY2x1ZGUgImdyY29uZmlnLmgiCisjaW5jbHVkZSAiZ3J0eXBlcy5oIgorCisKKyAgdHlwZWRlZiBzdHJ1Y3QgZ3JCaUNvbG9yXworICB7CisgICAgZ3JDb2xvciAgIGZvcmVncm91bmQ7CisgICAgZ3JDb2xvciAgIGJhY2tncm91bmQ7CisgICAgCisgICAgaW50ICAgICAgIG51bV9sZXZlbHM7CisgICAgaW50ICAgICAgIG1heF9sZXZlbHM7CisgICAgZ3JDb2xvciogIGxldmVsczsKKworICB9IGdyQmlDb2xvcjsKKworCisKKyAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqCisgICogVGVjaG5pY2FsIG5vdGUgOiBleHBsYWluaW5nIGhvdyB0aGUgYmxpdHRlciB3b3Jrcy4KKyAgKgorICAqICAgVGhlIGJsaXR0ZXIgaXMgdXNlZCB0byAiZHJhdyIgYSBnaXZlbiBzb3VyY2UgYml0bWFwIGludG8KKyAgKiAgIGEgZ2l2ZW4gdGFyZ2V0IGJpdG1hcC4KKyAgKgorICAqICAgVGhlIGZ1bmN0aW9uIGNhbGxlZCAnY29tcHV0ZV9jbGlwcycgaXMgdXNlZCB0byBjb21wdXRlIGNsaXBwaW5nCisgICogICBjb25zdHJhaW50cy4gVGhlc2UgbGVhZCB1cyB0byBjb21wdXRlIHR3byBhcmVhcyA6CisgICoKKyAgKiAgIC0gdGhlIHJlYWQgYXJlYSA6IGlzIHRoZSByZWN0YW5nbGUsIHdpdGhpbiB0aGUgc291cmNlIGJpdG1hcCwKKyAgKiAgICAgICAgICAgICAgICAgICAgIHdoaWNoIHdpbGwgYmUgZWZmZWN0aXZlbHkgImRyYXduIiBpbiB0aGUKKyAgKiAgICAgICAgICAgICAgICAgICAgIHRhcmdldCBiaXRtYXAuCisgICoKKyAgKiAgIC0gdGhlIHdyaXRlIGFyZWEgOiBpcyB0aGUgcmVjdGFuZ2xlLCB3aXRoaW4gdGhlIHRhcmdldCBiaXRtYXAsCisgICogICAgICAgICAgICAgICAgICAgICAgd2hpY2ggd2lsbCBlZmZlY3RpdmVseSAicmVjZWl2ZSIgdGhlIHBpeGVscworICAqICAgICAgICAgICAgICAgICAgICAgIGZyb20gdGhlIHJlYWQgYXJlYQorICAqCisgICogICBOb3RlIHRoYXQgYm90aCBhcmVhcyBoYXZlIHRoZSBzYW1lIGRpbWVuc2lvbnMsIGJ1dCBhcmUKKyAgKiAgIGxvY2F0ZWQgaW4gZGlzdGluY3Qgc3VyZmFjZXMuCisgICoKKyAgKiAgIFRoZXNlIGFyZWFzIGFyZSBjb21wdXRlZCBieSAnY29tcHV0ZV9jbGlwcycgd2hpY2ggaXMgY2FsbGVkCisgICogICBieSBlYWNoIGJsaXR0aW5nIGZ1bmN0aW9uLgorICAqCisgICogICBOb3RlIHRoYXQgd2UgdXNlIHRoZSBZLWRvd253YXJkcyBjb252ZW50aW9uIHdpdGhpbiB0aGUgYmxpdHRlcgorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgdHlwZWRlZiBzdHJ1Y3QgZ3JCbGl0dGVyXworICB7CisgICAgaW50ICB3aWR0aDsgICAvKiB3aWR0aCBpbiBwaXhlbHMgb2YgdGhlIGFyZWFzICAqLworICAgIGludCAgaGVpZ2h0OyAgLyogaGVpZ2h0IGluIHBpeGVscyBvZiB0aGUgYXJlYXMgKi8KKworICAgIGludCAgeHJlYWQ7ICAgLyogeCBwb3NpdGlvbiBvZiBzdGFydCBwb2ludCBpbiByZWFkIGFyZWEgKi8KKyAgICBpbnQgIHlyZWFkOyAgIC8qIHkgcG9zaXRpb24gb2Ygc3RhcnQgcG9pbnQgaW4gcmVhZCBhcmVhICovCisKKyAgICBpbnQgIHh3cml0ZTsgIC8qIHggcG9zaXRpb24gb2Ygc3RhcnQgcG9pbnQgaW4gd3JpdGUgYXJlYSAqLworICAgIGludCAgeXdyaXRlOyAgLyogeSBwb3NpdGlvbiBvZiBzdGFydCBwb2ludCBpbiB3cml0ZSBhcmVhICovCisKKyAgICBpbnQgIHJpZ2h0X2NsaXA7ICAgLyogYW1vdW50IG9mIHJpZ2h0IGNsaXAgICAgICAgICAgICAgICAqLworCisgICAgdW5zaWduZWQgY2hhciogIHJlYWQ7ICAgLyogdG9wIGxlZnQgY29ybmVyIG9mIHJlYWQgYXJlYSBpbiBzb3VyY2UgbWFwICAqLworICAgIHVuc2lnbmVkIGNoYXIqICB3cml0ZTsgIC8qIHRvcCBsZWZ0IGNvcm5lciBvZiB3cml0ZSBhcmVhIGluIHRhcmdldCBtYXAgKi8KKworICAgIGludCAgICByZWFkX2xpbmU7ICAvKiBieXRlIGluY3JlbWVudCB0byBnbyBkb3duIG9uZSByb3cgaW4gcmVhZCBhcmVhICAqLworICAgIGludCAgICB3cml0ZV9saW5lOyAvKiBieXRlIGluY3JlbWVudCB0byBnbyBkb3duIG9uZSByb3cgaW4gd3JpdGUgYXJlYSAqLworCisgICAgZ3JCaXRtYXAgIHNvdXJjZTsgIC8qIHNvdXJjZSBiaXRtYXAgZGVzY3JpcHRvciAqLworICAgIGdyQml0bWFwICB0YXJnZXQ7ICAvKiB0YXJnZXQgYml0bWFwIGRlc2NyaXB0b3IgKi8KKworICB9IGdyQmxpdHRlcjsKKworCisKKyAgdHlwZWRlZiB2b2lkICgqZ3JCbGl0dGVyRnVuYykoIGdyQmxpdHRlciogIGJsaXR0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnckNvbG9yICAgICBjb2xvciApOworCisgIHR5cGVkZWYgdm9pZCAoKmdyU2V0VGl0bGVGdW5jKSggZ3JTdXJmYWNlKiAgIHN1cmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogIHRpdGxlX3N0cmluZyApOworCisgIHR5cGVkZWYgdm9pZCAoKmdyUmVmcmVzaFJlY3RGdW5jKSggZ3JTdXJmYWNlKiAgc3VyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgIHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgaGVpZ2h0ICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgdHlwZWRlZiB2b2lkICgqZ3JEb25lU3VyZmFjZUZ1bmMpKCBnclN1cmZhY2UqICBzdXJmYWNlICk7CisKKyAgdHlwZWRlZiBpbnQgICgqZ3JMaXN0ZW5FdmVudEZ1bmMpKCBnclN1cmZhY2UqIHN1cmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICBldmVudF9tb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyRXZlbnQgICAqZXZlbnQgKTsKKyAKKworCisgIHN0cnVjdCBnclN1cmZhY2VfCisgIHsKKyAgICBnckRldmljZSogICAgICAgICAgZGV2aWNlOworICAgIGdyQml0bWFwICAgICAgICAgICBiaXRtYXA7CisgICAgZ3JCb29sICAgICAgICAgICAgIHJlZnJlc2g7CisgICAgZ3JCb29sICAgICAgICAgICAgIG93bmVyOworICAgICAKKyAgICBjb25zdCBieXRlKiAgICAgICAgc2F0dXJhdGlvbjsgIC8qIHVzZWQgZm9yIGdyYXkgc3VyZmFjZXMgb25seSAgICovCisgICAgZ3JCbGl0dGVyRnVuYyAgICAgIGJsaXRfbW9ubzsgICAvKiAwIGJ5IGRlZmF1bHQsIHNldCBieSBnckJsaXQuLiAqLworCisgICAgZ3JSZWZyZXNoUmVjdEZ1bmMgIHJlZnJlc2hfcmVjdDsKKyAgICBnclNldFRpdGxlRnVuYyAgICAgc2V0X3RpdGxlOworICAgIGdyTGlzdGVuRXZlbnRGdW5jICBsaXN0ZW5fZXZlbnQ7CisgICAgZ3JEb25lU3VyZmFjZUZ1bmMgIGRvbmU7CisgIH07CisKKworCisgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICoKKyAgKiA8RnVuY3Rpb24+CisgICogICBnckFsbG9jCisgICoKKyAgKiA8RGVzY3JpcHRpb24+CisgICogICBTaW1wbGUgbWVtb3J5IGFsbG9jYXRpb24uIFRoZSByZXR1cm5lZCBibG9jayBpcyBhbHdheXMgemVyby1lZAorICAqCisgICogPElucHV0PgorICAqICAgc2l6ZSAgOjogc2l6ZSBpbiBieXRlcyBvZiB0aGUgcmVxdWVzdGVkIGJsb2NrCisgICoKKyAgKiA8UmV0dXJuPgorICAqICAgdGhlIG1lbW9yeSBibG9jayBhZGRyZXNzLiAwIGluIGNhc2Ugb2YgZXJyb3IKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICBleHRlcm4gIGNoYXIqICBnckFsbG9jKCBsb25nIHNpemUgKTsKKyAgCisKKyAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKgorICAqIDxGdW5jdGlvbj4KKyAgKiAgIGdyUmVhbGxvYworICAqCisgICogPERlc2NyaXB0aW9uPgorICAqICAgU2ltcGxlIG1lbW9yeSByZS1hbGxvY2F0aW9uLgorICAqCisgICogPElucHV0PgorICAqICAgYmxvY2sgOjogb3JpZ2luYWwgbWVtb3J5IGJsb2NrIGFkZHJlc3MKKyAgKiAgIHNpemUgIDo6IG5ldyByZXF1ZXN0ZWQgYmxvY2sgc2l6ZSBpbiBieXRlcworICAqCisgICogPFJldHVybj4KKyAgKiAgIHRoZSBtZW1vcnkgYmxvY2sgYWRkcmVzcy4gMCBpbiBjYXNlIG9mIGVycm9yCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgZXh0ZXJuICBjaGFyKiAgZ3JSZWFsbG9jKCBjb25zdCBjaGFyKiAgYmxvY2ssIGxvbmcgc2l6ZSApOworCisKKyAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKgorICAqIDxGdW5jdGlvbj4KKyAgKiAgIGdyRnJlZQorICAqCisgICogPERlc2NyaXB0aW9uPgorICAqICAgU2ltcGxlIG1lbW9yeSByZWxlYXNlCisgICoKKyAgKiA8SW5wdXQ+CisgICogICBibG9jayA6OiB0YXJnZXQgYmxvY2sKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICBleHRlcm4gIHZvaWQgICBnckZyZWUoIGNvbnN0IHZvaWQqICBibG9jayApOworCisKKyAgZXh0ZXJuIGdyRGV2aWNlKiAgZ3JfZGV2aWNlc1tdOworICBleHRlcm4gaW50ICAgICAgICBncl9udW1fZGV2aWNlczsKKyAgZXh0ZXJuIGludCAgICAgICAgZ3JfbWF4X2RldmljZXM7CisKKyNlbmRpZiAvKiBHUk9CSlNfSCAqLwpkaWZmIC0tZ2l0IGEvZGVtb3MvZ3JhcGgvZ3JvczJwbS5jIGIvZGVtb3MvZ3JhcGgvZ3JvczJwbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3YTYzY2UKLS0tIC9kZXYvbnVsbAorKysgYi9kZW1vcy9ncmFwaC9ncm9zMnBtLmMKQEAgLTAsMCArMSw4OTUgQEAKKyNpbmNsdWRlICJncm9zMnBtLmgiCisKKworI2RlZmluZSBJTkNMX0RPUworI2RlZmluZSBJTkNMX1dJTgorI2RlZmluZSBJTkNMX0dQSQorI2RlZmluZSBJTkNMX1NVQgorCisjaW5jbHVkZSA8b3MyLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworCisgIHN0YXRpYyB2b2lkIFBhbmljKCBjb25zdCBjaGFyKiBtZXNzYWdlICkKKyAgeworICAgIGZwcmludGYoIHN0ZGVyciwgIiVzIiwgbWVzc2FnZSApOworICAgIGV4aXQoMSk7CisgIH0KKworICB0eXBlZGVmIHN0cnVjdCBUcmFuc2xhdG9yCisgIHsKKyAgICBVTE9ORyAgIG9zMmtleTsKKyAgICBncktleSAgIGdya2V5OworICAgIAorICB9IFRyYW5zbGF0b3I7CisgIAorCisgIHN0YXRpYworICBUcmFuc2xhdG9yICBrZXlfdHJhbnNsYXRvcnNbXSA9CisgIHsKKyAgICB7IFZLX0JBQ0tTUEFDRSwgZ3JLZXlCYWNrU3BhY2UgfSwKKyAgICB7IFZLX1RBQiwgICAgICAgZ3JLZXlUYWIgICAgICAgfSwKKyAgICB7IFZLX0VOVEVSLCAgICAgZ3JLZXlSZXR1cm4gICAgfSwKKyAgICB7IFZLX0VTQywgICAgICAgZ3JLZXlFc2MgICAgICAgfSwKKyAgICB7IFZLX0hPTUUsICAgICAgZ3JLZXlIb21lICAgICAgfSwKKyAgICB7IFZLX0xFRlQsICAgICAgZ3JLZXlMZWZ0ICAgICAgfSwKKyAgICB7IFZLX1VQLCAgICAgICAgZ3JLZXlVcCAgICAgICAgfSwKKyAgICB7IFZLX1JJR0hULCAgICAgZ3JLZXlSaWdodCAgICAgfSwKKyAgICB7IFZLX0RPV04sICAgICAgZ3JLZXlEb3duICAgICAgfSwKKyAgICB7IFZLX1BBR0VVUCwgICAgZ3JLZXlQYWdlVXAgICAgfSwKKyAgICB7IFZLX1BBR0VET1dOLCAgZ3JLZXlQYWdlRG93biAgfSwKKyAgICB7IFZLX0VORCwgICAgICAgZ3JLZXlFbmQgICAgICAgfSwKKyAgICB7IFZLX0YxLCAgICAgICAgZ3JLZXlGMSAgICAgICAgfSwKKyAgICB7IFZLX0YyLCAgICAgICAgZ3JLZXlGMiAgICAgICAgfSwKKyAgICB7IFZLX0YzLCAgICAgICAgZ3JLZXlGMyAgICAgICAgfSwKKyAgICB7IFZLX0Y0LCAgICAgICAgZ3JLZXlGNCAgICAgICAgfSwKKyAgICB7IFZLX0Y1LCAgICAgICAgZ3JLZXlGNSAgICAgICAgfSwKKyAgICB7IFZLX0Y2LCAgICAgICAgZ3JLZXlGNiAgICAgICAgfSwKKyAgICB7IFZLX0Y3LCAgICAgICAgZ3JLZXlGNyAgICAgICAgfSwKKyAgICB7IFZLX0Y4LCAgICAgICAgZ3JLZXlGOCAgICAgICAgfSwKKyAgICB7IFZLX0Y5LCAgICAgICAgZ3JLZXlGOSAgICAgICAgfSwKKyAgICB7IFZLX0YxMCwgICAgICAgZ3JLZXlGMTAgICAgICAgfSwKKyAgICB7IFZLX0YxMSwgICAgICAgZ3JLZXlGMTEgICAgICAgfSwKKyAgICB7IFZLX0YxMiwgICAgICAgZ3JLZXlGMTIgICAgICAgfQorICB9OworCisKKyNkZWZpbmUgTUFYX1BJWEVMX01PREVTICAzMgorCisgIHN0YXRpYyBpbnQgICAgICAgICAgIG51bV9waXhlbF9tb2RlcyA9IDA7CisgIHN0YXRpYyBnclBpeGVsTW9kZSAgIHBpeGVsX21vZGVzWyBNQVhfUElYRUxfTU9ERVMgXTsgIAorICBzdGF0aWMgaW50ICAgICAgICAgICBwaXhlbF9kZXB0aFsgTUFYX1BJWEVMX01PREVTIF07CisKKyAgc3RhdGljICBIQUIgICBncl9hbmNob3I7ICAgLyogZGV2aWNlIGFuY2hvciBibG9jayAqLworCisgIHR5cGVkZWYgUE9JTlRMICBQTUJsaXRQb2ludHNbNF07CisKKworICB0eXBlZGVmIHN0cnVjdCBnclBNU3VyZmFjZV8KKyAgeworICAgIGdyU3VyZmFjZSAgcm9vdDsKKyAgICBnckJpdG1hcCAgIGltYWdlOworCisgICAgSEFCICAgICAgICBhbmNob3I7ICAgICAgICAgLyogaGFuZGxlIHRvIGFuY2hvciBibG9jayBmb3Igc3VyZmFjZSdzIHdpbmRvdyAqLworICAgIEhXTkQgICAgICAgZnJhbWVfd2luZG93OyAgIC8qIGhhbmRsZSB0byB3aW5kb3cncyBmcmFtZSAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBIV05EICAgICAgIGNsaWVudF93aW5kb3c7ICAvKiBoYW5kbGUgdG8gd2luZG93J3MgY2xpZW50ICAgICAgICAgICAgICAgICAgICovCisgICAgSFdORCAgICAgICB0aXRsZV93aW5kb3c7ICAgLyogaGFuZGxlIHRvIHdpbmRvdydzIHRpdGxlIGJhciAgICAgICAgICAgICAgICAqLworCisgICAgSFBTICAgICAgICBpbWFnZV9wczsgICAgICAgLyogbWVtb3J5IHByZXNlbnRhdGlvbiBzcGFjZSB1c2VkIHRvIGhvbGQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGUgc3VyZmFjZSdzIGNvbnRlbnQgdW5kZXIgUE0gICAgICAgICAqLworICAgIEhEQyAgICAgICAgaW1hZ2VfZGM7ICAgICAgIC8qIG1lbW9yeSBkZXZpY2UgY29udGV4dCBmb3IgdGhlIGltYWdlICAgICovCisKKyAgICBIRVYgICAgICAgIGV2ZW50X2xvY2s7ICAgICAvKiBzZW1hcGhvcmUgdXNlZCBpbiBsaXN0ZW5fc3VyZmFjZSAgICovCisgICAgSE1UWCAgICAgICBpbWFnZV9sb2NrOyAgICAgLyogYSBtdXRleCB1c2VkIHRvIHN5bmNocm9uaXNlIGFjY2VzcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRvIHRoZSBtZW1vcnkgcHJlc2VudGF0aW9uIHNwYWNlICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB1c2VkIHRvIGhvbGQgdGhlIHN1cmZhY2UgICAgICAgICAgICovCisKKyAgICBUSUQgICAgICAgIG1lc3NhZ2VfdGhyZWFkOyAvKiB0aHJlYWQgdXNlZCB0byBwcm9jZXNzIHRoaXMgc3VyZmFjZSdzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbWVzc2FnZXMuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgICAgUEJJVE1BUElORk8yIGJpdG1hcF9oZWFkZXI7Lyogb3MvMiBiaXRtYXAgZGVzY3JpcHRvciAgICAgICAgICAgICAgICAgICAqLworICAgIEhCSVRNQVAgICAgICBvczJfYml0bWFwOyAgIC8qIEhhbmRsZSB0byBPUy8yIGJpdG1hcCBjb250YWluZWQgaW4gaW1hZ2UgKi8KKyAgICBCT09MICAgICAgICAgcmVhZHk7ICAgICAgICAvKiA/Pz8gKi8KKworICAgIGxvbmcgICAgICAgICBzaGFkZXNbMjU2XTsgIC8qIGluZGljZXMgb2YgZ3JheSBsZXZlbHMgaW4gcGl4ZWxfbW9kZV9ncmF5ICovCisKKyAgICBQT0lOVEwgICAgICAgc3VyZmFjZV9ibGl0WzRdOyAgLyogc3VyZmFjZSBibGl0dGluZyB0YWJsZSAgICovCisgICAgUE9JTlRMICAgICAgIG1hZ25pZnlfYmxpdFs0XTsgIC8qIG1hZ25pZmllciBibGl0dGluZyB0YWJsZSAqLworICAgIGludCAgICAgICAgICBtYWduaWZpY2F0aW9uOyAgICAvKiBsZXZlbCBvZiBtYWduaWZpY2F0aW9uICAgKi8KKyAgICBQT0lOVEwgICAgICAgbWFnbmlmeV9jZW50ZXI7CisgICAgU0laRUwgICAgICAgIG1hZ25pZnlfc2l6ZTsKKworICAgIGdyRXZlbnQgICAgICBldmVudDsKKworICAgIFBNQmxpdFBvaW50cyBibGl0X3BvaW50czsKKworICB9IGdyUE1TdXJmYWNlOworCisKKworICBzdGF0aWMKKyAgdm9pZCAgZW5hYmxlX29zMl9pb3N0cmVhbXMoIHZvaWQgKQorICB7CisgICAgUFRJQiAgdGhyZWFkX2Jsb2NrOworICAgIFBQSUIgIHByb2Nlc3NfYmxvY2s7CisKKyAgICAvKiBYWFggOiBUaGlzIGlzIGEgdmVyeSBuYXN0eSBoYWNrLCBpdCBmb29scyBPUy8yIGFuZCBsZXQgdGhlIHByb2dyYW0gKi8KKyAgICAvKiAgICAgICBjYWxsIFBNIGZ1bmN0aW9ucywgZXZlbiB0aG91Z2ggc3RkaW4vc3Rkb3V0L3N0ZGVyciBhcmUgc3RpbGwgKi8KKyAgICAvKiAgICAgICBkaXJlY3RlZCB0byB0aGUgc3RhbmRhcmQgaS9vIHN0cmVhbXMuLiAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgICAgICBUaGUgcHJvZ3JhbSBtdXN0IGJlIGNvbXBpbGVkIHdpdGggV0lORE9XQ09NUEFUICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgIENyZWRpdHMgZ28gdG8gTWljaGFsIGZvciBmaW5kaW5nIHRoaXMgISEgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBEb3NHZXRJbmZvQmxvY2tzKCAmdGhyZWFkX2Jsb2NrLCAmcHJvY2Vzc19ibG9jayApOworICAgIHByb2Nlc3NfYmxvY2stPnBpYl91bHR5cGUgPSAzOworICB9CisKKworCisgIHN0YXRpYworICBpbnQgIGluaXRfZGV2aWNlKCB2b2lkICkKKyAgeworICAgIGVuYWJsZV9vczJfaW9zdHJlYW1zKCk7CisKKyAgICAvKiBjcmVhdGUgYW4gYW5jaG9yIGJsb2NrLiBUaGlzIHdpbGwgYWxsb3cgdGhpcyB0aHJlYWQgKGkuZS4gdGhlICovCisgICAgLyogbWFpbiBvbmUpIHRvIGNhbGwgR3BpIGZ1bmN0aW9ucy4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGdyX2FuY2hvciA9IFdpbkluaXRpYWxpemUoMCk7CisgICAgaWYgKCFncl9hbmNob3IpCisgICAgeworICAgICAgLyogY291bGQgbm90IGluaXRpYWxpc2UgUHJlc2VudGF0aW9uIE1hbmFnZXIgKi8KKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKKyAgfQorCisKKworICBzdGF0aWMKKyAgdm9pZCAgZG9uZV9kZXZpY2UoIHZvaWQgKQorICB7CisgICAgLyogSW5kaWNhdGVzIHRoYXQgd2UgZG8gbm90IHVzZSB0aGUgUHJlc2VudGF0aW9uIE1hbmFnZXIsIHRoaXMgKi8KKyAgICAvKiB3aWxsIGFsc28gcmVsZWFzZSBhbGwgYXNzb2NpYXRlZCByZXNvdXJjZXMuLiAgICAgICAgICAgICAgICAqLworICAgIFdpblRlcm1pbmF0ZSggZ3JfYW5jaG9yICk7CisgIH0KKworCisKKyAgLyogY2xvc2UgYSBnaXZlbiB3aW5kb3cgKi8KKyAgc3RhdGljCisgIHZvaWQgIGRvbmVfc3VyZmFjZSggZ3JQTVN1cmZhY2UqICBzdXJmYWNlICkKKyAgeworICAgIGlmICggc3VyZmFjZS0+ZnJhbWVfd2luZG93ICkKKyAgICAgIFdpbkRlc3Ryb3lXaW5kb3coIHN1cmZhY2UtPmZyYW1lX3dpbmRvdyApOworCisgICAgV2luUmVsZWFzZVBTKCBzdXJmYWNlLT5pbWFnZV9wcyApOworCisgICAgZ3JEb25lQml0bWFwKCAmc3VyZmFjZS0+aW1hZ2UgKTsKKyAgICBnckRvbmVCaXRtYXAoICZzdXJmYWNlLT5yb290LmJpdG1hcCApOworICB9CisKKworCisKKworICBzdGF0aWMKKyAgdm9pZCBhZGRfcGl4ZWxfbW9kZSggZ3JQaXhlbE1vZGUgIHBpeGVsX21vZGUsCisgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICBkZXB0aCApCisgIHsKKyAgICBpZiAoIG51bV9waXhlbF9tb2RlcyA+PSBNQVhfUElYRUxfTU9ERVMgKQorICAgICAgUGFuaWMoICJYMTEuVG9vIG1hbnkgcGl4ZWwgbW9kZXNcbiIgKTsKKyAgICAgIAorICAgIHBpeGVsX21vZGVzWyBudW1fcGl4ZWxfbW9kZXMgXSA9IHBpeGVsX21vZGU7CisgICAgcGl4ZWxfZGVwdGhbIG51bV9waXhlbF9tb2RlcyBdID0gZGVwdGg7CisgICAgCisgICAgbnVtX3BpeGVsX21vZGVzKys7CisgIH0KKworCisjZGVmaW5lIExPQ0soeCkgICAgRG9zUmVxdWVzdE11dGV4U2VtKCB4LCBTRU1fSU5ERUZJTklURV9XQUlUICk7CisjZGVmaW5lIFVOTE9DSyh4KSAgRG9zUmVsZWFzZU11dGV4U2VtKCB4ICkKKworCisgIHN0YXRpYworICBjb25zdCBpbnQgIHBpeGVsX21vZGVfYml0X2NvdW50W10gPQorICB7CisgICAgMCwKKyAgICAxLAorICAgIDQsCisgICAgOCwgICAvKiBwYWw4ICovCisgICAgOCwgICAvKiBncmF5ICovCisgICAgMTUsCisgICAgMTYsCisgICAgMjQsCisgICAgMzIKKyAgfTsKKworCisgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqCisgICogVGVjaG5pY2FsIG5vdGUgOiBob3cgdGhlIE9TLzIgUHJlc250YXRpb24gTWFuYWdlciBkcml2ZXIgd29ya3MKKyAgKgorICAqIFBNIGlzLCBpbiBteSBvcGluaW9uLCBhIGJsb2F0ZWQgYW5kIG92ZXItZW5naW5lZXJlZCBncmFwaGljcworICAqIHN1Yi1zeXN0ZW0sIGV2ZW4gdGhvdWdoIGl0IGhhcyBsb3RzIG9mIG5pY2UgZmVhdHVyZXMuIEhlcmUgYXJlCisgICogYSBmZXcgdGlkYml0cyBhYm91dCBpdCA6CisgICoKKyAgKgorICAqIC0gdW5kZXIgUE0sIGEgImJpdG1hcCIgaXMgYSBkZXZpY2Utc3BlY2lmaWMgb2JqZWN0IHdob3NlIGJpdHMgYXJlCisgICogICBub3QgZGlyZWN0bHkgYWNjZXNzaWJsZSB0byB0aGUgY2xpZW50IGFwcGxpY2F0aW9uLiBUaGlzIG1lYW5zCisgICogICB0aGF0IHdlIG11c3QgdXNlIGEgc2NoZW1lIGxpa2UgdGhlIGZvbGxvd2luZyB0byBkaXNwbGF5IG91cgorICAqICAgc3VyZmFjZXMgOgorICAqCisgICogICAgIC0gaG9sZCwgZm9yIGVhY2ggc3VyZmFjZSwgaXRzIG93biBiaXRtYXAgYnVmZmVyIHdoZXJlIHRoZQorICAqICAgICAgIHJlc3Qgb2YgTWlHUyB3cml0ZXMgZGlyZWN0bHkuCisgICoKKyAgKiAgICAgLSBjcmVhdGUgYSBQTSBiaXRtYXAgb2JqZWN0IHdpdGggdGhlIHNhbWUgZGltZW5zaW9ucyAoYW5kCisgICogICAgICAgcG9zc2libHkgZm9ybWF0KS4KKyAgKgorICAqICAgICAtIGNvcHkgdGhlIGNvbnRlbnQgb2YgZWFjaCB1cGRhdGVkIHJlY3RhbmdsZSBpbnRvIHRoZQorICAqICAgICAgIFBNIGJpdG1hcCB3aXRoIHRoZSBmdW5jdGlvbiAnR3BpU2V0Qml0bWFwQml0cycuCisgICoKKyAgKiAgICAgLSBmaW5hbGx5LCAiYmxpdCIgdGhlIFBNIGJpdG1hcCB0byB0aGUgc2NyZWVuIGNhbGxpbmcKKyAgKiAgICAgICAnR3BpQmxpdEJsdCcKKyAgKgorICAqIC0gYnV0IHRoZXJlIGlzIG1vcmUgOiB5b3UgY2Fubm90IGRpcmVjdGx5IGJsaXQgYSBQTSBiaXRtYXAgdG8gdGhlCisgICogICBzY3JlZW4gd2l0aCBQTS4gVGhlICdHcGlCbGl0Qmx0JyBvbmx5IHdvcmtzIHdpdGggcHJlc2VudGF0aW9uCisgICogICBzcGFjZXMuIFRoaXMgbWVhbnMgdGhhdCB3ZSBhbHNvIG5lZWQgdG8gY3JlYXRlLCBmb3IgZWFjaCBzdXJmYWNlIDoKKyAgKgorICAqICAgICAtIGEgbWVtb3J5IHByZXNlbnRhdGlvbiBzcGFjZSwgdXNlZCB0byBob2xkIHRoZSBQTSBiaXRtYXAKKyAgKiAgICAgLSBhICJtZW1vcnkgZGV2aWNlIGNvbnRleHQiIGZvciB0aGUgcHJlc2VudGF0aW9uIHNwYWNlCisgICoKKyAgKiAgIFRoZSBibGl0IGlzIHRoZW4gcGVyZm9ybWVkIGZyb20gdGhlIG1lbW9yeSBwcmVzZW50YXRpb24gc3BhY2UKKyAgKiAgIHRvIHRoZSBzY3JlZW4ncyBwcmVzZW50YXRpb24gc3BhY2UuLgorICAqCisgICoKKyAgKiAtIGJlY2F1c2UgZWFjaCBzdXJmYWNlIGNyZWF0ZXMgaXRzIG93biBldmVudC1oYW5kbGluZyB0aHJlYWQsCisgICogICB3ZSBtdXN0IHByb3RlY3QgdGhlIHN1cmZhY2UncyBwcmVzZW50YXRpb24gc3BhY2UgZnJvbSBjb25jdXJyZW50CisgICogICBhY2Nlc3NlcyAoaS5lLiBjYWxscyB0byAnR3BpU2V0Qml0bWFwQml0cycgd2hlbiBkcmF3aW5nIHRvIHRoZQorICAqICAgc3VyZmFjZSwgYW5kIGNhbGxzIHRvICdHcGlCbGl0Qmx0JyB3aGVuIGRyYXdpbmcgaXQgb24gdGhlIHNjcmVlbgorICAqICAgYXJlIHBlcmZvcm1lZCBpbiB0d28gZGlmZmVyZW50IHRocmVhZHMpLgorICAqCisgICogICB3ZSB1c2UgYSBzaW1wbGUgbXV0ZXggdG8gZG8gdGhpcy4KKyAgKgorICAqCisgICogLSB3ZSBhbHNvIHVzZSBhIHNlbWFwaG9yZSB0byBwZXJmb3JtIGEgcmVuZGV6LXZvdXMgYmV0d2VlbiB0aGUKKyAgKiAgIG1haW4gYW5kIGV2ZW50LWhhbmRsaW5nIHRocmVhZHMgKG5lZWRlZCBpbiAibGlzdGVuX2V2ZW50IikuCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIHN0YXRpYworICB2b2lkICBSdW5QTVdpbmRvdyggZ3JQTVN1cmZhY2UqICBzdXJmYWNlICk7CisKKworCisKKworCisKKworCisKKworCisgIHN0YXRpYworICB2b2lkICBjb252ZXJ0X2dyYXlfdG9fcGFsOCggZ3JQTVN1cmZhY2UqIHN1cmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgIHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgaCApCisgIHsKKyAgICBnckJpdG1hcCogIHRhcmdldCAgPSAmc3VyZmFjZS0+aW1hZ2U7CisgICAgZ3JCaXRtYXAqICBzb3VyY2UgID0gJnN1cmZhY2UtPnJvb3QuYml0bWFwOworICAgIGJ5dGUqICAgICAgd3JpdGUgICA9IChieXRlKil0YXJnZXQtPmJ1ZmZlciArIHkqdGFyZ2V0LT5waXRjaCArIHg7CisgICAgYnl0ZSogICAgICByZWFkICAgID0gKGJ5dGUqKXNvdXJjZS0+YnVmZmVyICsgeSpzb3VyY2UtPnBpdGNoICsgeDsKKyAgICBsb25nKiAgICAgIHBhbGV0dGUgPSBzdXJmYWNlLT5zaGFkZXM7CisgICAgCisgICAgd2hpbGUgKGggPiAwKQorICAgIHsKKyAgICAgIGJ5dGUqICBfd3JpdGUgPSB3cml0ZTsKKyAgICAgIGJ5dGUqICBfcmVhZCAgPSByZWFkOworICAgICAgYnl0ZSogIGxpbWl0ICA9IF93cml0ZSArIHc7CisgICAgICAKKyAgICAgIGZvciAoIDsgX3dyaXRlIDwgbGltaXQ7IF93cml0ZSsrLCBfcmVhZCsrICkKKyAgICAgICAgKl93cml0ZSA9IChieXRlKSBwYWxldHRlWyAqX3JlYWQgXTsKKworICAgICAgd3JpdGUgKz0gdGFyZ2V0LT5waXRjaDsKKyAgICAgIHJlYWQgICs9IHNvdXJjZS0+cGl0Y2g7CisgICAgICBoLS07CisgICAgfQorICB9CisKKworICBzdGF0aWMKKyAgdm9pZCAgY29udmVydF9ncmF5X3RvXzE2KCBnclBNU3VyZmFjZSogc3VyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgaCApCisgIHsKKyAgICBnckJpdG1hcCogIHRhcmdldCAgPSAmc3VyZmFjZS0+aW1hZ2U7CisgICAgZ3JCaXRtYXAqICBzb3VyY2UgID0gJnN1cmZhY2UtPnJvb3QuYml0bWFwOworICAgIGJ5dGUqICAgICAgd3JpdGUgICA9IChieXRlKil0YXJnZXQtPmJ1ZmZlciArIHkqdGFyZ2V0LT5waXRjaCArIDIqeDsKKyAgICBieXRlKiAgICAgIHJlYWQgICAgPSAoYnl0ZSopc291cmNlLT5idWZmZXIgKyB5KnNvdXJjZS0+cGl0Y2ggKyB4OworICAgIGxvbmcqICAgICAgICAgICBwYWxldHRlID0gc3VyZmFjZS0+c2hhZGVzOworICAgIAorICAgIHdoaWxlIChoID4gMCkKKyAgICB7CisgICAgICBieXRlKiAgX3dyaXRlID0gd3JpdGU7CisgICAgICBieXRlKiAgX3JlYWQgID0gcmVhZDsKKyAgICAgIGJ5dGUqICBsaW1pdCAgPSBfd3JpdGUgKyAyKnc7CisgICAgICAKKyAgICAgIGZvciAoIDsgX3dyaXRlIDwgbGltaXQ7IF93cml0ZSArPSAyLCBfcmVhZCsrICkKKyAgICAgICAgKihzaG9ydCopX3dyaXRlID0gKHNob3J0KXBhbGV0dGVbICpfcmVhZCBdOworCisgICAgICB3cml0ZSArPSB0YXJnZXQtPnBpdGNoOworICAgICAgcmVhZCAgKz0gc291cmNlLT5waXRjaDsKKyAgICAgIGgtLTsKKyAgICB9CisgIH0KKworCisgIHN0YXRpYworICB2b2lkICBjb252ZXJ0X2dyYXlfdG9fMjQoIGdyUE1TdXJmYWNlKiBzdXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICB3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICBoICkKKyAgeworICAgIGdyQml0bWFwKiAgdGFyZ2V0ICA9ICZzdXJmYWNlLT5pbWFnZTsKKyAgICBnckJpdG1hcCogIHNvdXJjZSAgPSAmc3VyZmFjZS0+cm9vdC5iaXRtYXA7CisgICAgYnl0ZSogICAgICB3cml0ZSAgID0gKGJ5dGUqKXRhcmdldC0+YnVmZmVyICsgeSp0YXJnZXQtPnBpdGNoICsgMyp4OworICAgIGJ5dGUqICAgICAgcmVhZCAgICA9IChieXRlKilzb3VyY2UtPmJ1ZmZlciArIHkqc291cmNlLT5waXRjaCArIHg7CisgICAgCisgICAgd2hpbGUgKGggPiAwKQorICAgIHsKKyAgICAgIGJ5dGUqICBfd3JpdGUgPSB3cml0ZTsKKyAgICAgIGJ5dGUqICBfcmVhZCAgPSByZWFkOworICAgICAgYnl0ZSogIGxpbWl0ICA9IF93cml0ZSArIDMqdzsKKyAgICAgIAorICAgICAgZm9yICggOyBfd3JpdGUgPCBsaW1pdDsgX3dyaXRlICs9IDMsIF9yZWFkKysgKQorICAgICAgeworICAgICAgICBieXRlICBjb2xvciA9ICpfcmVhZDsKKyAgICAgICAgCisgICAgICAgIF93cml0ZVswXSA9CisgICAgICAgIF93cml0ZVsxXSA9CisgICAgICAgIF93cml0ZVsyXSA9IGNvbG9yOworICAgICAgfQorCisgICAgICB3cml0ZSArPSB0YXJnZXQtPnBpdGNoOworICAgICAgcmVhZCAgKz0gc291cmNlLT5waXRjaDsKKyAgICAgIGgtLTsKKyAgICB9CisgIH0KKworCisgIHN0YXRpYworICB2b2lkICBjb252ZXJ0X2dyYXlfdG9fMzIoIGdyUE1TdXJmYWNlKiBzdXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICB3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICBoICkKKyAgeworICAgIGdyQml0bWFwKiAgdGFyZ2V0ICA9ICZzdXJmYWNlLT5pbWFnZTsKKyAgICBnckJpdG1hcCogIHNvdXJjZSAgPSAmc3VyZmFjZS0+cm9vdC5iaXRtYXA7CisgICAgYnl0ZSogICAgICB3cml0ZSAgID0gKGJ5dGUqKXRhcmdldC0+YnVmZmVyICsgeSp0YXJnZXQtPnBpdGNoICsgNCp4OworICAgIGJ5dGUqICAgICAgcmVhZCAgICA9IChieXRlKilzb3VyY2UtPmJ1ZmZlciArIHkqc291cmNlLT5waXRjaCArIHg7CisgICAgCisgICAgd2hpbGUgKGggPiAwKQorICAgIHsKKyAgICAgIGJ5dGUqICBfd3JpdGUgPSB3cml0ZTsKKyAgICAgIGJ5dGUqICBfcmVhZCAgPSByZWFkOworICAgICAgYnl0ZSogIGxpbWl0ICA9IF93cml0ZSArIDQqdzsKKyAgICAgIAorICAgICAgZm9yICggOyBfd3JpdGUgPCBsaW1pdDsgX3dyaXRlICs9IDQsIF9yZWFkKysgKQorICAgICAgeworICAgICAgICBieXRlICBjb2xvciA9ICpfcmVhZDsKKyAgICAgICAgCisgICAgICAgIF93cml0ZVswXSA9CisgICAgICAgIF93cml0ZVsxXSA9CisgICAgICAgIF93cml0ZVsyXSA9CisgICAgICAgIF93cml0ZVszXSA9IGNvbG9yOworICAgICAgfQorCisgICAgICB3cml0ZSArPSB0YXJnZXQtPnBpdGNoOworICAgICAgcmVhZCAgKz0gc291cmNlLT5waXRjaDsKKyAgICAgIGgtLTsKKyAgICB9CisgIH0KKworCisgIHN0YXRpYworICB2b2lkICBjb252ZXJ0X3JlY3RhbmdsZSggZ3JQTVN1cmZhY2UqIHN1cmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgIHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgaCApCisgIHsKKyAgICBpbnQgIHo7CisgICAgCisgICAgLyogZmlyc3Qgb2YgYWxsLCBjbGlwIHRvIHRoZSBzdXJmYWNlJ3MgYXJlYSAqLworICAgIGlmICggeCAgID49IHN1cmZhY2UtPmltYWdlLndpZHRoIHx8CisgICAgICAgICB4K3cgPD0gMCAgICAgICAgICAgICAgICAgICAgfHwKKyAgICAgICAgIHkgICA+PSBzdXJmYWNlLT5pbWFnZS5yb3dzICB8fAorICAgICAgICAgeStoIDw9IDAgKQorICAgICAgcmV0dXJuOworIAorICAgIGlmICggeCA8IDAgKQorICAgIHsKKyAgICAgIHcgKz0geDsKKyAgICAgIHggID0gMDsKKyAgICB9CisgCisgICAgeiA9ICh4ICsgdykgLSBzdXJmYWNlLT5pbWFnZS53aWR0aDsKKyAgICBpZiAoeiA+IDApCisgICAgICB3IC09IHo7CisgICAgICAKKyAgICB6ID0gKHkgKyBoKSAtIHN1cmZhY2UtPmltYWdlLnJvd3M7CisgICAgaWYgKHogPiAwKQorICAgICAgaCAtPSB6OworICAgICAgCisgICAgLyogY29udmVydCB0aGUgcmVjdGFuZ2xlIHRvIHRoZSB0YXJnZXQgZGVwdGggZm9yIGdyYXkgc3VyZmFjZXMgKi8KKyAgICBpZiAoc3VyZmFjZS0+cm9vdC5iaXRtYXAubW9kZSA9PSBncl9waXhlbF9tb2RlX2dyYXkpCisgICAgeworICAgICAgc3dpdGNoIChzdXJmYWNlLT5pbWFnZS5tb2RlKQorICAgICAgeworICAgICAgICBjYXNlIGdyX3BpeGVsX21vZGVfcGFsOCAgOgorICAgICAgICAgIGNvbnZlcnRfZ3JheV90b19wYWw4KCBzdXJmYWNlLCB4LCB5LCB3LCBoICk7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBncl9waXhlbF9tb2RlX3JnYjU1NToKKyAgICAgICAgY2FzZSBncl9waXhlbF9tb2RlX3JnYjU2NToKKyAgICAgICAgICBjb252ZXJ0X2dyYXlfdG9fMTYgICggc3VyZmFjZSwgeCwgeSwgdywgaCApOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgZ3JfcGl4ZWxfbW9kZV9yZ2IyNDoKKyAgICAgICAgICBjb252ZXJ0X2dyYXlfdG9fMjQgICggc3VyZmFjZSwgeCwgeSwgdywgaCApOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgZ3JfcGl4ZWxfbW9kZV9yZ2IzMjoKKyAgICAgICAgICBjb252ZXJ0X2dyYXlfdG9fMzIgICggc3VyZmFjZSwgeCwgeSwgdywgaCApOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgOworICAgICAgfQorICAgIH0KKyAgfSAKKworCisgIHN0YXRpYworICB2b2lkICByZWZyZXNoX3JlY3RhbmdsZSggZ3JQTVN1cmZhY2UqIHN1cmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgIHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgaCApCisgIHsKKyAgICBjb252ZXJ0X3JlY3RhbmdsZSggc3VyZmFjZSwgeCwgeSwgdywgaCApOworCisgICAgV2luSW52YWxpZGF0ZVJlY3QoIHN1cmZhY2UtPmNsaWVudF93aW5kb3csIE5VTEwsIEZBTFNFICk7CisgICAgV2luVXBkYXRlV2luZG93KCBzdXJmYWNlLT5mcmFtZV93aW5kb3cgKTsKKyAgfQorCisgIAorICBzdGF0aWMKKyAgdm9pZCAgc2V0X3RpdGxlKCBnclBNU3VyZmFjZSogc3VyZmFjZSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgdGl0bGUgKQorICB7CisgICAgV2luU2V0V2luZG93VGV4dCggc3VyZmFjZS0+dGl0bGVfd2luZG93LCAoUFNaKXRpdGxlICk7CisgIH0KKworCisKKyAgc3RhdGljICAKKyAgdm9pZCAgbGlzdGVuX2V2ZW50KCBnclBNU3VyZmFjZSogc3VyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgZXZlbnRfbWFzaywKKyAgICAgICAgICAgICAgICAgICAgICBnckV2ZW50KiAgICAgZ3JldmVudCApCisgIHsKKyAgICBVTE9ORyAgdWxSZXF1ZXN0Q291bnQ7CisKKyAgICAodm9pZCkgZXZlbnRfbWFzazsgICAvKiBpZ25vcmVkIGZvciBub3cgKi8KKworICAgIC8qIHRoZSBsaXN0ZW5fZXZlbnQgZnVuY3Rpb24gYmxvY2tzIHVudGlsIHRoZXJlIGlzIGFuIGV2ZW50IHRvIHByb2Nlc3MgKi8KKyAgICBEb3NXYWl0RXZlbnRTZW0oIHN1cmZhY2UtPmV2ZW50X2xvY2ssIFNFTV9JTkRFRklOSVRFX1dBSVQgKTsKKyAgICBEb3NRdWVyeUV2ZW50U2VtKCBzdXJmYWNlLT5ldmVudF9sb2NrLCAmdWxSZXF1ZXN0Q291bnQgKTsKKyAgICAqZ3JldmVudCA9IHN1cmZhY2UtPmV2ZW50OworICAgIERvc1Jlc2V0RXZlbnRTZW0oIHN1cmZhY2UtPmV2ZW50X2xvY2ssICZ1bFJlcXVlc3RDb3VudCApOworCisgICAgcmV0dXJuOworICB9CisKKworICBzdGF0aWMKKyAgaW50ICBpbml0X3N1cmZhY2UoIGdyUE1TdXJmYWNlKiAgc3VyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgIGdyQml0bWFwKiAgICAgYml0bWFwICkKKyAgeworICAgIFBCSVRNQVBJTkZPMiAgYml0OworICAgIFNJWkVMICAgICAgICAgc2l6bCA9IHsgMCwgMCB9OworICAgIExPTkcgICAgICAgICAgcGFsZXR0ZVsyNTZdOworCisgICAgLyogY3JlYXRlIHRoZSBiaXRtYXAgLSB1bmRlciBPUy8yLCB3ZSBzdXBwb3J0IGFsbCBtb2RlcyBhcyBQTSAqLworICAgIC8qIGhhbmRsZXMgYWxsIGNvbnZlcnNpb25zIGF1dG9tYXRpY2FsbHkuLiAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBpZiAoIGdyTmV3Qml0bWFwKCBzdXJmYWNlLT5yb290LmJpdG1hcC5tb2RlLAorICAgICAgICAgICAgICAgICAgICAgIHN1cmZhY2UtPnJvb3QuYml0bWFwLmdyYXlzLAorICAgICAgICAgICAgICAgICAgICAgIHN1cmZhY2UtPnJvb3QuYml0bWFwLndpZHRoLAorICAgICAgICAgICAgICAgICAgICAgIHN1cmZhY2UtPnJvb3QuYml0bWFwLnJvd3MsCisgICAgICAgICAgICAgICAgICAgICAgYml0bWFwICkgKQorICAgICAgcmV0dXJuIGdyRXJyb3I7CisKKyAgICBzdXJmYWNlLT5yb290LmJpdG1hcCA9ICpiaXRtYXA7CisKKyAgICAvKiBjcmVhdGUgdGhlIGltYWdlIGFuZCBldmVudCBsb2NrICovCisgICAgRG9zQ3JlYXRlRXZlbnRTZW0oIE5VTEwsICZzdXJmYWNlLT5ldmVudF9sb2NrLCAwLCBUUlVFICApOworICAgIERvc0NyZWF0ZU11dGV4U2VtKCBOVUxMLCAmc3VyZmFjZS0+aW1hZ2VfbG9jaywgMCwgRkFMU0UgKTsKKworICAgIC8qIGNyZWF0ZSB0aGUgaW1hZ2UncyBwcmVzZW50YXRpb24gc3BhY2UgKi8KKyAgICBzdXJmYWNlLT5pbWFnZV9kYyA9IERldk9wZW5EQyggZ3JfYW5jaG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPRF9NRU1PUlksIChQU1opIioiLCAwTCwgMEwsIDBMICk7CisKKyAgICBzdXJmYWNlLT5pbWFnZV9wcyA9IEdwaUNyZWF0ZVBTKCBncl9hbmNob3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VyZmFjZS0+aW1hZ2VfZGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFVfUEVMUyAgICB8IEdQSVRfTUlDUk8gfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQSUFfQVNTT0MgfCBHUElGX0RFRkFVTFQgKTsKKworICAgIEdwaVNldEJhY2tNaXgoIHN1cmZhY2UtPmltYWdlX3BzLCBCTV9PVkVSUEFJTlQgKTsKKworICAgIC8qIGNyZWF0ZSB0aGUgaW1hZ2UncyBQTSBiaXRtYXAgKi8KKyAgICBiaXQgPSAoUEJJVE1BUElORk8yKWdyQWxsb2MoIHNpemVvZihCSVRNQVBJTkZPMikgKyAyNTYqc2l6ZW9mKFJHQjIpICk7CisgICAgc3VyZmFjZS0+Yml0bWFwX2hlYWRlciA9IGJpdDsKKworICAgIGJpdC0+Y2JGaXggICA9IHNpemVvZiggQklUTUFQSU5GT0hFQURFUjIgKTsKKyAgICBiaXQtPmN4ICAgICAgPSBzdXJmYWNlLT5yb290LmJpdG1hcC53aWR0aDsKKyAgICBiaXQtPmN5ICAgICAgPSBzdXJmYWNlLT5yb290LmJpdG1hcC5yb3dzOworICAgIGJpdC0+Y1BsYW5lcyA9IDE7CisKKyAgICBiaXQtPmFyZ2JDb2xvclswXS5iQmx1ZSAgPSAwOworICAgIGJpdC0+YXJnYkNvbG9yWzBdLmJHcmVlbiA9IDA7CisgICAgYml0LT5hcmdiQ29sb3JbMF0uYlJlZCAgID0gMDsKKworICAgIGJpdC0+YXJnYkNvbG9yWzFdLmJCbHVlICA9IDI1NTsKKyAgICBiaXQtPmFyZ2JDb2xvclsxXS5iR3JlZW4gPSAyNTU7CisgICAgYml0LT5hcmdiQ29sb3JbMV0uYlJlZCAgID0gMjU1OworCisgICAgYml0LT5jQml0Q291bnQgPSBwaXhlbF9tb2RlX2JpdF9jb3VudFsgc3VyZmFjZS0+cm9vdC5iaXRtYXAubW9kZSBdOworCisgICAgc3VyZmFjZS0+b3MyX2JpdG1hcCA9IEdwaUNyZWF0ZUJpdG1hcCggc3VyZmFjZS0+aW1hZ2VfcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFBCSVRNQVBJTkZPSEVBREVSMiliaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMEwsIE5VTEwsIE5VTEwgKTsKKworICAgIEdwaVNldEJpdG1hcCggc3VyZmFjZS0+aW1hZ2VfcHMsIHN1cmZhY2UtPm9zMl9iaXRtYXAgKTsKKworICAgIGJpdC0+Y2JGaXggPSBzaXplb2YoIEJJVE1BUElORk9IRUFERVIyICk7CisgICAgR3BpUXVlcnlCaXRtYXBJbmZvSGVhZGVyKCBzdXJmYWNlLT5vczJfYml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFBCSVRNQVBJTkZPSEVBREVSMiliaXQgKTsKKworICAgIC8qIGZvciBncl9waXhlbF9tb2RlX2dyYXksIGNyZWF0ZSBhIGdyYXktbGV2ZWxzIGxvZ2ljYWwgcGFsZXR0ZSAqLworICAgIGlmICggYml0bWFwLT5tb2RlID09IGdyX3BpeGVsX21vZGVfZ3JheSApCisgICAgeworICAgICAgaW50ICAgICB4LCBjb3VudDsKKworICAgICAgY291bnQgPSBiaXRtYXAtPmdyYXlzOworICAgICAgZm9yICggeCA9IDA7IHggPCBjb3VudDsgeCsrICkKKyAgICAgICAgcGFsZXR0ZVt4XSA9ICgoKGNvdW50LXgpKjI1NSkvY291bnQpICogMHgwMTAxMDE7CisKKyAgICAgIC8qIGNyZWF0ZSBsb2dpY2FsIGNvbG9yIHRhYmxlICovCisgICAgICBHcGlDcmVhdGVMb2dDb2xvclRhYmxlKCBzdXJmYWNlLT5pbWFnZV9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChVTE9ORykgTENPTF9QVVJFQ09MT1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTE9ORykgIExDT0xGX0NPTlNFQ1JHQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMT05HKSAgMEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTE9ORykgIGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFBMT05HKSBwYWxldHRlICk7CisKKyAgICAgIC8qIG5vdywgY29weSB0aGUgY29sb3IgaW5kZXhlcyB0byBzdXJmYWNlLT5zaGFkZXMgKi8KKyAgICAgIGZvciAoIHggPSAwOyB4IDwgY291bnQ7IHgrKyApCisgICAgICAgIHN1cmZhY2UtPnNoYWRlc1t4XSA9IEdwaVF1ZXJ5Q29sb3JJbmRleCggc3VyZmFjZS0+aW1hZ2VfcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgcGFsZXR0ZVt4XSApOworICAgIH0KKworICAgIC8qIHNldCB1cCB0aGUgYmxpdCBwb2ludHMgYXJyYXkgKi8KKyAgICBzdXJmYWNlLT5ibGl0X3BvaW50c1sxXS54ID0gc3VyZmFjZS0+cm9vdC5iaXRtYXAud2lkdGg7CisgICAgc3VyZmFjZS0+YmxpdF9wb2ludHNbMV0ueSA9IHN1cmZhY2UtPnJvb3QuYml0bWFwLnJvd3M7CisgICAgc3VyZmFjZS0+YmxpdF9wb2ludHNbM10gICA9IHN1cmZhY2UtPmJsaXRfcG9pbnRzWzFdOworCisgICAgLyogRmluYWxseSwgY3JlYXRlIHRoZSBldmVudCBoYW5kbGluZyB0aHJlYWQgZm9yIHRoZSBzdXJmYWNlJ3Mgd2luZG93ICovCisgICAgRG9zQ3JlYXRlVGhyZWFkKCAmc3VyZmFjZS0+bWVzc2FnZV90aHJlYWQsCisgICAgICAgICAgICAgICAgICAgICAoUEZOVEhSRUFEKSBSdW5QTVdpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgIChVTE9ORykgICAgIHN1cmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAwVUwsCisgICAgICAgICAgICAgICAgICAgICAzMjkyMCApOworCisgICAgc3VyZmFjZS0+cm9vdC5kb25lICAgICAgICAgPSAoZ3JEb25lU3VyZmFjZUZ1bmMpIGRvbmVfc3VyZmFjZTsKKyAgICBzdXJmYWNlLT5yb290LnJlZnJlc2hfcmVjdCA9IChnclJlZnJlc2hSZWN0RnVuYykgcmVmcmVzaF9yZWN0YW5nbGU7CisgICAgc3VyZmFjZS0+cm9vdC5zZXRfdGl0bGUgICAgPSAoZ3JTZXRUaXRsZUZ1bmMpICAgIHNldF90aXRsZTsKKyAgICBzdXJmYWNlLT5yb290Lmxpc3Rlbl9ldmVudCA9IChnckxpc3RlbkV2ZW50RnVuYykgbGlzdGVuX2V2ZW50OworICAgIAorICAgIGNvbnZlcnRfcmVjdGFuZ2xlKCBzdXJmYWNlLCAwLCAwLCBiaXRtYXAtPndpZHRoLCBiaXRtYXAtPnJvd3MgKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisKKworICBNUkVTVUxUIEVYUEVOVFJZICBNZXNzYWdlX1Byb2Nlc3MoIEhXTkQgICAgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVMT05HICAgbWVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUEFSQU0gIHBhcm0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QQVJBTSAgcGFybTIgKTsKKworCisgIHN0YXRpYworICB2b2lkICBSdW5QTVdpbmRvdyggZ3JQTVN1cmZhY2UqICBzdXJmYWNlICkKKyAgeworICAgIHVuc2lnbmVkIGNoYXIgICBjbGFzc19uYW1lW10gPSAiRGlzcGxheUNsYXNzIjsKKyAgICAgICAgICAgICBVTE9ORyAgY2xhc3NfZmxhZ3M7CisKKyAgICBzdGF0aWMgICBITVEgICAgcXVldWU7CisgICAgICAgICAgICAgUU1TRyAgIG1lc3NhZ2U7CisKKyAgICAvKiBjcmVhdGUgYW4gYW5jaG9yIHRvIGFsbG93IHRoaXMgdGhyZWFkIHRvIHVzZSBQTSAqLworICAgIHN1cmZhY2UtPmFuY2hvciA9IFdpbkluaXRpYWxpemUoMCk7CisgICAgaWYgKCFzdXJmYWNlLT5hbmNob3IpCisgICAgeworICAgICAgcHJpbnRmKCAiRXJyb3IgZG9pbmcgV2luSW5pdGlhbGl6ZSgpXG4iICk7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyogY3JlYXRlIGEgbWVzc2FnZSBxdWV1ZSAqLworICAgIHF1ZXVlID0gV2luQ3JlYXRlTXNnUXVldWUoIHN1cmZhY2UtPmFuY2hvciwgMCApOworICAgIGlmICghcXVldWUpCisgICAgeworICAgICAgcHJpbnRmKCAiRXJyb3IgZG9pbmcgPmluQ3JlYXRlTXNnUXVldWUoKVxuIiApOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qIHJlZ2lzdGVyIHRoZSB3aW5kb3cgY2xhc3MgKi8KKyAgICBpZiAoICFXaW5SZWdpc3RlckNsYXNzKCBzdXJmYWNlLT5hbmNob3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFBTWikgICBjbGFzc19uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChQRk5XUCkgTWVzc2FnZV9Qcm9jZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENTX1NJWkVSRURSQVcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCApICkKKyAgICB7CisgICAgICBwcmludGYoICJFcnJvciBkb2luZyBXaW5SZWdpc3RlckNsYXNzKClcbiIgKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKiBjcmVhdGUgdGhlIFBNIHdpbmRvdyAqLworICAgIGNsYXNzX2ZsYWdzID0gRkNGX1RJVExFQkFSIHwgRkNGX01JTkJVVFRPTiB8IEZDRl9ETEdCT1JERVIgfCAKKyAgICAgICAgICAgICAgICAgIEZDRl9UQVNLTElTVCB8IEZDRl9TWVNNRU5VOyAKKworICAgIHN1cmZhY2UtPmZyYW1lX3dpbmRvdyA9IFdpbkNyZWF0ZVN0ZFdpbmRvdygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFdORF9ERVNLVE9QLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU19WSVNJQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2xhc3NfZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChQU1opIGNsYXNzX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChQU1opICJGcmVlVHlwZSBQTSBHcmFwaGljcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdTX1ZJU0lCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdXJmYWNlLT5jbGllbnRfd2luZG93ICk7CisgICAgaWYgKCFzdXJmYWNlLT5mcmFtZV93aW5kb3cpCisgICAgeworICAgICAgcHJpbnRmKCAiRXJyb3IgZG9pbmcgV2luQ3JlYXRlU3RkV2luZG93KClcbiIgKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKiBmaW5kIHRoZSB0aXRsZSB3aW5kb3cgaGFuZGxlICovCisgICAgc3VyZmFjZS0+dGl0bGVfd2luZG93ID0gV2luV2luZG93RnJvbUlEKCBzdXJmYWNlLT5mcmFtZV93aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSURfVElUTEVCQVIgKTsKKworICAgIC8qIHNldCBXaW5kb3cgc2l6ZSBhbmQgcG9zaXRpb24gKi8KKyAgICBXaW5TZXRXaW5kb3dQb3MoIHN1cmZhY2UtPmZyYW1lX3dpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgIDBMLAorICAgICAgICAgICAgICAgICAgICAgKFNIT1JUKSA2MCwKKyAgICAgICAgICAgICAgICAgICAgIChTSE9SVCkgV2luUXVlcnlTeXNWYWx1ZSggSFdORF9ERVNLVE9QLCBTVl9DWVNDUkVFTiApIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VyZmFjZS0+cm9vdC5iaXRtYXAucm93cyArIDEwMCwKKworICAgICAgICAgICAgICAgICAgICAgKFNIT1JUKSBXaW5RdWVyeVN5c1ZhbHVlKCBIV05EX0RFU0tUT1AsIFNWX0NZRExHRlJBTUUgKSoyICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VyZmFjZS0+cm9vdC5iaXRtYXAud2lkdGgsCisKKyAgICAgICAgICAgICAgICAgICAgIChTSE9SVCkgV2luUXVlcnlTeXNWYWx1ZSggSFdORF9ERVNLVE9QLCBTVl9DWVRJVExFQkFSICkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5RdWVyeVN5c1ZhbHVlKCBIV05EX0RFU0tUT1AsIFNWX0NZRExHRlJBTUUgKSoyICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VyZmFjZS0+cm9vdC5iaXRtYXAucm93cywKKworICAgICAgICAgICAgICAgICAgICAgU1dQX1NJWkUgfCBTV1BfTU9WRSApOworCisgICAgLyogc2F2ZSB0aGUgaGFuZGxlIHRvIHRoZSBjdXJyZW50IHN1cmZhY2Ugd2l0aGluIHRoZSB3aW5kb3cgd29yZHMgKi8KKyAgICBXaW5TZXRXaW5kb3dQdHIoIHN1cmZhY2UtPmZyYW1lX3dpbmRvdyxRV0xfVVNFUiwgc3VyZmFjZSApOworCisgICAgLyogcnVuIHRoZSBtZXNzYWdlIHF1ZXVlIHRpbGwgdGhlIGVuZCAqLworICAgIHdoaWxlICggV2luR2V0TXNnKCBzdXJmYWNlLT5hbmNob3IsICZtZXNzYWdlLCAoSFdORClOVUxMLCAwLCAwICkgKQorICAgICAgV2luRGlzcGF0Y2hNc2coIHN1cmZhY2UtPmFuY2hvciwgJm1lc3NhZ2UgKTsKKworICAgIC8qIGNsZWFuLXVwICovCisgICAgV2luRGVzdHJveVdpbmRvdyggc3VyZmFjZS0+ZnJhbWVfd2luZG93ICk7CisgICAgc3VyZmFjZS0+ZnJhbWVfd2luZG93ID0gMDsKKworICAgIFdpbkRlc3Ryb3lNc2dRdWV1ZSggcXVldWUgKTsKKyAgICBXaW5UZXJtaW5hdGUoIHN1cmZhY2UtPmFuY2hvciApOworCisgICAgLyogYXdhaXQgZGVhdGguLi4gKi8KKyAgICB3aGlsZSAoIDEgKQorICAgICAgRG9zU2xlZXAoIDEwMCApOworICB9CisKKworCisKKyAgLyogTWVzc2FnZSBwcm9jZXNzaW5nIGZvciBvdXIgUE0gV2luZG93IGNsYXNzICovCisgIE1SRVNVTFQgRVhQRU5UUlkgIE1lc3NhZ2VfUHJvY2VzcyggSFdORCAgICBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUxPTkcgICBtZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QQVJBTSAgcGFybTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBBUkFNICBwYXJtMiApCisgIHsKKyAgICAgc3RhdGljIEhEQyAgICAgc2NyZWVuX2RjOworICAgICBzdGF0aWMgSFBTICAgICBzY3JlZW5fcHM7CisgICAgIHN0YXRpYyBCT09MICAgIG1pbmltaXplZDsKKworICAgICBTSVpFTCAgIHNpemw7CisgICAgIFNXUCAgICAgc3dwOworCisgICAgIGdyUE1TdXJmYWNlKiAgc3VyZmFjZTsKKworICAgIC8qIGdldCB0aGUgaGFuZGxlIHRvIHRoZSB3aW5kb3cncyBzdXJmYWNlICovCisgICAgc3VyZmFjZSA9IChnclBNU3VyZmFjZSopV2luUXVlcnlXaW5kb3dQdHIoIGhhbmRsZSwgUVdMX1VTRVIgKTsKKworICAgIHN3aXRjaCggbWVzcyApCisgICAgeworICAgIGNhc2UgV01fREVTVFJPWToKKyAgICAgIC8qIHdhcm4gdGhlIG1haW4gdGhyZWFkIHRvIHF1aXQgaWYgaXQgZGlkbid0IGtub3cgKi8KKyAgICAgIHN1cmZhY2UtPmV2ZW50LnR5cGUgPSBncl9ldmVudF9rZXk7CisgICAgICBzdXJmYWNlLT5ldmVudC5rZXkgID0gZ3JLZXlFc2M7CisgICAgICBEb3NQb3N0RXZlbnRTZW0oIHN1cmZhY2UtPmV2ZW50X2xvY2sgKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBXTV9DUkVBVEU6CisgICAgICAvKiBzZXQgb3JpZ2luYWwgbWFnbmlmaWNhdGlvbiAqLworICAgICAgbWluaW1pemVkID0gRkFMU0U7CisKKyAgICAgIC8qIGNyZWF0ZSBEZXZpY2UgQ29udGV4dCBhbmQgUHJlc2VudGF0aW9uIFNwYWNlIGZvciBzY3JlZW4uICovCisgICAgICBzY3JlZW5fZGMgPSBXaW5PcGVuV2luZG93REMoIGhhbmRsZSApOworICAgICAgc2NyZWVuX3BzID0gR3BpQ3JlYXRlUFMoIHN1cmZhY2UtPmFuY2hvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JlZW5fZGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFVfUEVMUyB8IEdQSVRfTUlDUk8gfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQSUFfQVNTT0MgfCBHUElGX0RFRkFVTFQgKTsKKworICAgICAgLyogdGFrZSB0aGUgaW5wdXQgZm9jdXMgKi8KKyAgICAgIFdpbkZvY3VzQ2hhbmdlKCBIV05EX0RFU0tUT1AsIGhhbmRsZSwgMEwgKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBXTV9NSU5NQVhGUkFNRToKKyAgICAgIC8qIHRvIHVwZGF0ZSBtaW5pbWl6ZWQgaWYgY2hhbmdlZCAqLworICAgICAgc3dwID0gKigoUFNXUCkgcGFybTEpOworICAgICAgaWYgKCBzd3AuZmwgJiBTV1BfTUlOSU1JWkUgKSAKKyAgICAgICAgbWluaW1pemVkID0gVFJVRTsKKyAgICAgIGlmICggc3dwLmZsICYgU1dQX1JFU1RPUkUgKQorICAgICAgICBtaW5pbWl6ZWQgPSBGQUxTRTsKKyAgICAgIHJldHVybiBXaW5EZWZXaW5kb3dQcm9jKCBoYW5kbGUsIG1lc3MsIHBhcm0xLCBwYXJtMiApOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFdNX0VSQVNFQkFDS0dST1VORDoKKyAgICBjYXNlIFdNX1BBSU5UOiAgCisgICAgICAvKiBjb3B5IHRoZSBtZW1vcnkgaW1hZ2Ugb2YgdGhlIHNjcmVlbiBvdXQgdG8gdGhlIHJlYWwgc2NyZWVuICovCisgICAgICBEb3NSZXF1ZXN0TXV0ZXhTZW0oIHN1cmZhY2UtPmltYWdlX2xvY2ssIFNFTV9JTkRFRklOSVRFX1dBSVQgKTsKKyAgICAgIFdpbkJlZ2luUGFpbnQoIGhhbmRsZSwgc2NyZWVuX3BzLCBOVUxMICk7CisgICAgICAKKyAgICAgIC8qIG1haW4gaW1hZ2UgYW5kIG1hZ25pZmllZCBwaWN0dXJlICovCisgICAgICBHcGlCaXRCbHQoIHNjcmVlbl9wcywKKyAgICAgICAgICAgICAgICAgc3VyZmFjZS0+aW1hZ2VfcHMsCisgICAgICAgICAgICAgICAgIDRMLAorICAgICAgICAgICAgICAgICBzdXJmYWNlLT5ibGl0X3BvaW50cywKKyAgICAgICAgICAgICAgICAgUk9QX1NSQ0NPUFksIEJCT19BTkQgKTsKKworICAgICAgV2luRW5kUGFpbnQoIHNjcmVlbl9wcyApOworICAgICAgRG9zUmVsZWFzZU11dGV4U2VtKCBzdXJmYWNlLT5pbWFnZV9sb2NrICk7ICAgCisgICAgICBicmVhazsKKworICAgIGNhc2UgV01fQ0hBUjoKKyAgICAgIGlmICggQ0hBUk1TRyggJm1lc3MgKS0+ZnMgJiBLQ19LRVlVUCApCisgICAgICAgIGJyZWFrOworCisgICAgICAvKiBsb29rIGZvciBhIHNwZWNpZmljIHZrZXkgKi8KKyAgICAgIHsKKyAgICAgICAgaW50ICAgICAgICAgIGNvdW50ID0gc2l6ZW9mKCBrZXlfdHJhbnNsYXRvcnMgKS9zaXplb2YoIGtleV90cmFuc2xhdG9yc1swXSApOworICAgICAgICBUcmFuc2xhdG9yKiAgdHJhbnMgPSBrZXlfdHJhbnNsYXRvcnM7CisgICAgICAgIFRyYW5zbGF0b3IqICBsaW1pdCA9IHRyYW5zICsgY291bnQ7CisKKyAgICAgICAgZm9yICggOyB0cmFucyA8IGxpbWl0OyB0cmFucysrICkKKyAgICAgICAgICBpZiAoIENIQVJNU0coJm1lc3MpLT52a2V5ID09IHRyYW5zLT5vczJrZXkgKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIHN1cmZhY2UtPmV2ZW50LmtleSA9IHRyYW5zLT5ncmtleTsKKyAgICAgICAgICAgIGdvdG8gRG9fS2V5X0V2ZW50OworICAgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLyogb3RoZXJ3aXNlLCBzaW1wbHkgcmVjb3JkIHRoZSBjaGFyYWN0ZXIgY29kZSAqLworICAgICAgaWYgKCAoQ0hBUk1TRyggJm1lc3MgKS0+ZnMgJiBLQ19DSEFSKSA9PSAwICkKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIHN1cmZhY2UtPmV2ZW50LmtleSA9IENIQVJNU0coJm1lc3MpLT5jaHI7CisKKyAgICBEb19LZXlfRXZlbnQ6CisgICAgICBzdXJmYWNlLT5ldmVudC50eXBlID0gZ3JfZXZlbnRfa2V5OworICAgICAgRG9zUG9zdEV2ZW50U2VtKCBzdXJmYWNlLT5ldmVudF9sb2NrICk7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gV2luRGVmV2luZG93UHJvYyggaGFuZGxlLCBtZXNzLCBwYXJtMSwgcGFybTIgKTsKKyAgICB9CisKKyAgICByZXR1cm4gKE1SRVNVTFQpIEZBTFNFOworICB9CisKKworCisKKworCisKKyNpZiAwCisgIHN0YXRpYworICBncktleSAgS2V5U3ltVG9ncktleSggICBrZXkgKQorICB7CisgICAgZ3JLZXkgICAgICAgIGs7CisgICAgaW50ICAgICAgICAgIGNvdW50ID0gc2l6ZW9mKGtleV90cmFuc2xhdG9ycykvc2l6ZW9mKGtleV90cmFuc2xhdG9yc1swXSk7CisgICAgVHJhbnNsYXRvciogIHRyYW5zID0ga2V5X3RyYW5zbGF0b3JzOworICAgIFRyYW5zbGF0b3IqICBsaW1pdCA9IHRyYW5zICsgY291bnQ7CisKKyAgICBrID0gZ3JLZXlOb25lOworCisgICAgd2hpbGUgKCB0cmFucyA8IGxpbWl0ICkKKyAgICB7CisgICAgICBpZiAoIHRyYW5zLT54a2V5ID09IGtleSApCisgICAgICB7CisgICAgICAgIGsgPSB0cmFucy0+Z3JrZXk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgdHJhbnMrKzsKKyAgICB9CisKKyAgICByZXR1cm4gazsKKyAgfQorCisKKworICBzdGF0aWMgIAorICB2b2lkICBsaXN0ZW5fZXZlbnQoIGdyUE1TdXJmYWNlKiBzdXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICBldmVudF9tYXNrLAorICAgICAgICAgICAgICAgICAgICAgIGdyRXZlbnQqICAgICBncmV2ZW50ICkKKyAgeworICAgIGdyS2V5ICAgICAgICAgICBncmtleTsKKworICAgIC8qIFhYWFggOiBGb3Igbm93LCBpZ25vcmUgdGhlIGV2ZW50IG1hc2ssIGFuZCBvbmx5IGV4aXQgd2hlbiAqLworICAgIC8qICAgICAgICBhIGtleSBpcyBwcmVzc2VkLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICh2b2lkKWV2ZW50X21hc2s7CisKKworICAgIC8qIE5vdywgdHJhbnNsYXRlIHRoZSBrZXlwcmVzcyB0byBhIGdyS2V5ICovCisgICAgLyogSWYgdGhpcyB3YXNuJ3QgcGFydCBvZiB0aGUgc2ltcGxlIHRyYW5zbGF0ZWQga2V5cywgc2ltcGx5IGdldCB0aGUgY2hhcmNvZGUgKi8KKyAgICAvKiBmcm9tIHRoZSBjaGFyYWN0ZXIgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGdya2V5ID0gZ3JLRVkoa2V5X2J1ZmZlcltrZXlfY3Vyc29yKytdKTsKKyAgICAgIAorICBTZXRfS2V5OgorICAgIGdyZXZlbnQtPnR5cGUgPSBncl9rZXlfZG93bjsKKyAgICBncmV2ZW50LT5rZXkgID0gZ3JrZXk7CisgIH0KKworI2VuZGlmCisKKworCisgIGdyRGV2aWNlICBncl9vczJwbV9kZXZpY2UgPQorICB7CisgICAgc2l6ZW9mKCBnclBNU3VyZmFjZSApLAorICAgICJvczJwbSIsCisgICAgCisgICAgaW5pdF9kZXZpY2UsCisgICAgZG9uZV9kZXZpY2UsCisgICAgCisgICAgKGdyRGV2aWNlSW5pdFN1cmZhY2VGdW5jKSBpbml0X3N1cmZhY2UsCisgICAgCisgICAgMCwKKyAgICAwCisgICAgCisgIH07CisKKwpkaWZmIC0tZ2l0IGEvZGVtb3MvZ3JhcGgvZ3JvczJwbS5oIGIvZGVtb3MvZ3JhcGgvZ3JvczJwbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyOTM1ODAKLS0tIC9kZXYvbnVsbAorKysgYi9kZW1vcy9ncmFwaC9ncm9zMnBtLmgKQEAgLTAsMCArMSwyMyBAQAorI2lmbmRlZiBHUk9TMlBNX0gKKyNkZWZpbmUgR1JPUzJQTV9ICisKKyNpbmNsdWRlICJncm9ianMuaCIKKworICBleHRlcm4KKyAgZ3JEZXZpY2UgIGdyX29zMnBtX2RldmljZTsKKworI2lmZGVmIEdSX0lOSVRfQlVJTEQKKyAgc3RhdGljCisgIGdyRGV2aWNlQ2hhaW4gIGdyX29zMnBtX2RldmljZV9jaGFpbiA9CisgIHsKKyAgICAib3MycG0iLAorICAgICZncl9vczJwbV9kZXZpY2UsCisgICAgR1JfSU5JVF9ERVZJQ0VfQ0hBSU4KKyAgfTsKKworI3VuZGVmIEdSX0lOSVRfREVWSUNFX0NIQUlOCisjZGVmaW5lIEdSX0lOSVRfREVWSUNFX0NIQUlOICAmZ3Jfb3MycG1fZGV2aWNlX2NoYWluCisKKyNlbmRpZiAgLyogR1JfSU5JVF9CVUlMRCAqLworCisjZW5kaWYgLyogR1JPUzJQTV9IICovCmRpZmYgLS1naXQgYS9kZW1vcy9ncmFwaC9ncnR5cGVzLmggYi9kZW1vcy9ncmFwaC9ncnR5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNhMTg1NgotLS0gL2Rldi9udWxsCisrKyBiL2RlbW9zL2dyYXBoL2dydHlwZXMuaApAQCAtMCwwICsxLDUyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIGdydHlwZXMuaAorICoKKyAqICAgIGJhc2ljIHR5cGUgZGVmaW50aW9ucworICoKKyAqICBDb3B5cmlnaHQgMTk5OSAtIFRoZSBGcmVlVHlwZSBEZXZlbG9wbWVudCBUZWFtIC0gd3d3LmZyZWV0eXBlLm9yZworICoKKyAqCisgKgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgR1JUWVBFU19ICisjZGVmaW5lIEdSVFlQRVNfSAorCisgIHR5cGVkZWYgdW5zaWduZWQgY2hhciAgYnl0ZTsKKworI2lmIDAKKyAgdHlwZWRlZiBzaWduZWQgY2hhciAgICB1Y2hhcjsKKworICB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgIHVsb25nOworICB0eXBlZGVmIHVuc2lnbmVkIHNob3J0IHVzaG9ydDsKKyAgdHlwZWRlZiB1bnNpZ25lZCBpbnQgICB1aW50OworI2VuZGlmCisgIAorICB0eXBlZGVmIHN0cnVjdCBnckRpbWVuc2lvbl8KKyAgeworICAgIGludCAgeDsKKyAgICBpbnQgIHk7CisKKyAgfSBnckRpbWVuc2lvbjsKKworI2RlZmluZSBncl9lcnJfb2sgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgZ3JfZXJyX21lbW9yeSAgICAgICAgICAgICAgIC0xCisjZGVmaW5lIGdyX2Vycl9iYWRfYXJndW1lbnQgICAgICAgICAtMgorI2RlZmluZSBncl9lcnJfYmFkX3RhcmdldF9kZXB0aCAgICAgLTMKKyNkZWZpbmUgZ3JfZXJyX2JhZF9zb3VyY2VfZGVwdGggICAgIC00CisjZGVmaW5lIGdyX2Vycl9zYXR1cmF0aW9uX292ZXJmbG93ICAtNQorI2RlZmluZSBncl9lcnJfY29udmVyc2lvbl9vdmVyZmxvdyAgLTYKKyNkZWZpbmUgZ3JfZXJyX2ludmFsaWRfZGV2aWNlICAgICAgIC03CisKKworI2lmZGVmIEdSX01BS0VfT1BUSU9OX1NJTkdMRV9PQkpFQ1QKKyNkZWZpbmUgIEdSX0xPQ0FMX0RFQ0wgICAgc3RhdGljCisjZGVmaW5lICBHUl9MT0NBTF9GVU5DICAgIHN0YXRpYworI2Vsc2UKKyNkZWZpbmUgIEdSX0xPQ0FMX0RFQ0wgICAgZXh0ZXJuCisjZGVmaW5lICBHUl9MT0NBTF9GVU5DICAgIC8qIHZvaWQgKi8KKyNlbmRpZgorCisjZW5kaWYgLyogR1JUWVBFU19IICovCmRpZmYgLS1naXQgYS9kZW1vcy9ncmFwaC9ncngxMS5jIGIvZGVtb3MvZ3JhcGgvZ3J4MTEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWQ4NTM4Ci0tLSAvZGV2L251bGwKKysrIGIvZGVtb3MvZ3JhcGgvZ3J4MTEuYwpAQCAtMCwwICsxLDkzNiBAQAorI2luY2x1ZGUgImdyeDExLmgiCisKKworI2lmZGVmIFRFU1QKKyNpbmNsdWRlICJncmZvbnQuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxYMTEvWGxpYi5oPgorI2luY2x1ZGUgPFgxMS9YdXRpbC5oPgorI2luY2x1ZGUgPFgxMS9jdXJzb3Jmb250Lmg+CisjaW5jbHVkZSA8WDExL2tleXN5bS5oPgorCisgIHN0YXRpYyB2b2lkIFBhbmljKCBjb25zdCBjaGFyKiBtZXNzYWdlICkKKyAgeworICAgIGZwcmludGYoIHN0ZGVyciwgIiVzIiwgbWVzc2FnZSApOworICAgIGV4aXQoMSk7CisgIH0KKworICB0eXBlZGVmIHN0cnVjdCBUcmFuc2xhdG9yCisgIHsKKyAgICBLZXlTeW0gIHhrZXk7CisgICAgZ3JLZXkgICBncmtleTsKKyAgICAKKyAgfSBUcmFuc2xhdG9yOworICAKKyAgc3RhdGljCisgIFRyYW5zbGF0b3IgIGtleV90cmFuc2xhdG9yc1tdID0KKyAgeworICAgIHsgWEtfQmFja1NwYWNlLCBncktleUJhY2tTcGFjZSB9LAorICAgIHsgWEtfVGFiLCAgICAgICBncktleVRhYiAgICAgICB9LAorICAgIHsgWEtfUmV0dXJuLCAgICBncktleVJldHVybiAgICB9LAorICAgIHsgWEtfRXNjYXBlLCAgICBncktleUVzYyAgICAgICB9LAorICAgIHsgWEtfSG9tZSwgICAgICBncktleUhvbWUgICAgICB9LAorICAgIHsgWEtfTGVmdCwgICAgICBncktleUxlZnQgICAgICB9LAorICAgIHsgWEtfVXAsICAgICAgICBncktleVVwICAgICAgICB9LAorICAgIHsgWEtfUmlnaHQsICAgICBncktleVJpZ2h0ICAgICB9LAorICAgIHsgWEtfRG93biwgICAgICBncktleURvd24gICAgICB9LAorICAgIHsgWEtfUGFnZV9VcCwgICBncktleVBhZ2VVcCAgICB9LAorICAgIHsgWEtfUGFnZV9Eb3duLCBncktleVBhZ2VEb3duICB9LAorICAgIHsgWEtfRW5kLCAgICAgICBncktleUVuZCAgICAgICB9LAorICAgIHsgWEtfQmVnaW4sICAgICBncktleUhvbWUgICAgICB9LAorICAgIHsgWEtfRjEsICAgICAgICBncktleUYxICAgICAgICB9LAorICAgIHsgWEtfRjIsICAgICAgICBncktleUYyICAgICAgICB9LAorICAgIHsgWEtfRjMsICAgICAgICBncktleUYzICAgICAgICB9LAorICAgIHsgWEtfRjQsICAgICAgICBncktleUY0ICAgICAgICB9LAorICAgIHsgWEtfRjUsICAgICAgICBncktleUY1ICAgICAgICB9LAorICAgIHsgWEtfRjYsICAgICAgICBncktleUY2ICAgICAgICB9LAorICAgIHsgWEtfRjcsICAgICAgICBncktleUY3ICAgICAgICB9LAorICAgIHsgWEtfRjgsICAgICAgICBncktleUY4ICAgICAgICB9LAorICAgIHsgWEtfRjksICAgICAgICBncktleUY5ICAgICAgICB9LAorICAgIHsgWEtfRjEwLCAgICAgICBncktleUYxMCAgICAgICB9LAorICAgIHsgWEtfRjExLCAgICAgICBncktleUYxMSAgICAgICB9LAorICAgIHsgWEtfRjEyLCAgICAgICBncktleUYxMiAgICAgICB9CisgIH07CisKKworI2lmZGVmIFRFU1QKKyAgCisjZGVmaW5lIGdyQWxsb2MgIG1hbGxvYworICAKKyNlbmRpZgorCisKKyAgc3RhdGljIERpc3BsYXkqICBkaXNwbGF5OworICBzdGF0aWMgY2hhciogICAgIGRpc3BsYXluYW1lID0gIiI7CisKKyAgc3RhdGljIEN1cnNvciAgaWRsZTsKKyAgc3RhdGljIEN1cnNvciAgYnVzeTsKKworI2RlZmluZSBNQVhfUElYRUxfTU9ERVMgIDMyCisKKyAgdHlwZWRlZiBYUGl4bWFwRm9ybWF0VmFsdWVzICBYRGVwdGg7CisKKyAgc3RhdGljIGludCAgICAgICAgICAgbnVtX3BpeGVsX21vZGVzID0gMDsKKyAgc3RhdGljIGdyUGl4ZWxNb2RlICAgcGl4ZWxfbW9kZXNbIE1BWF9QSVhFTF9NT0RFUyBdOyAgCisgIHN0YXRpYyBYRGVwdGggICAgICAgIHBpeGVsX2RlcHRoWyBNQVhfUElYRUxfTU9ERVMgXTsKKworICB0eXBlZGVmIHN0cnVjdCBnclhTdXJmYWNlXworICB7CisgICAgZ3JTdXJmYWNlICAgICAgcm9vdDsKKyAgICBnckJpdG1hcCAgICAgICBpbWFnZTsKKworICAgIFdpbmRvdyAgICAgICAgIHdpbjsKKyAgICBWaXN1YWwqICAgICAgICB2aXN1YWw7CisgICAgQ29sb3JtYXAgICAgICAgY29sb3JtYXA7CisgICAgaW50ICAgICAgICAgICAgZGVwdGg7CisgICAgQm9vbCAgICAgICAgICAgZ3JheTsKKyAgICAKKyAgICBHQyAgICAgICAgICAgICBnYzsKKyAgICAKKyAgICBYQ29sb3IgICAgICAgICBjb2xvclsyNTZdOyAgIC8qIGdyYXkgbGV2ZWxzIHBhbGV0dGUgZm9yIDgtYml0IG1vZGVzICovCisgICAgWEltYWdlKiAgICAgICAgeGltYWdlOworCisgICAgaW50ICAgICAgICAgICAgd2luX29yZ194OworICAgIGludCAgICAgICAgICAgIHdpbl9vcmdfeTsKKyAgICBpbnQgICAgICAgICAgICB3aW5fd2lkdGg7CisgICAgaW50ICAgICAgICAgICAgd2luX2hlaWdodDsKKyAgICAKKyAgICBpbnQgICAgICAgICAgICBpbWFnZV93aWR0aDsKKyAgICBpbnQgICAgICAgICAgICBpbWFnZV9oZWlnaHQ7CisgICAgCisgIH0gZ3JYU3VyZmFjZTsKKworCisKKworICAvKiBjbG9zZSBhIGdpdmVuIHdpbmRvdyAqLworICBzdGF0aWMKKyAgdm9pZCAgZG9uZV9zdXJmYWNlKCBnclhTdXJmYWNlKiAgc3VyZmFjZSApCisgIHsKKyAgICBYVW5tYXBXaW5kb3coIGRpc3BsYXksIHN1cmZhY2UtPndpbiApOworICB9CisKKworCisgIC8qIGNsb3NlIHRoZSBkZXZpY2UsIGkuZS4gdGhlIGRpc3BsYXkgY29ubmVjdGlvbiAqLworICBzdGF0aWMKKyAgdm9pZCAgZG9uZV9kZXZpY2UoIHZvaWQgKQorICB7CisgICAgWENsb3NlRGlzcGxheSggZGlzcGxheSApOworICB9CisKKworCisgIHN0YXRpYworICB2b2lkIGFkZF9waXhlbF9tb2RlKCBnclBpeGVsTW9kZSAgcGl4ZWxfbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgWERlcHRoKiAgICAgIGRlcHRoICkKKyAgeworICAgIGlmICggbnVtX3BpeGVsX21vZGVzID49IE1BWF9QSVhFTF9NT0RFUyApCisgICAgICBQYW5pYyggIlgxMS5Ub28gbWFueSBwaXhlbCBtb2Rlc1xuIiApOworICAgICAgCisgICAgcGl4ZWxfbW9kZXNbIG51bV9waXhlbF9tb2RlcyBdID0gcGl4ZWxfbW9kZTsKKyAgICBwaXhlbF9kZXB0aFsgbnVtX3BpeGVsX21vZGVzIF0gPSAqZGVwdGg7CisgICAgCisgICAgbnVtX3BpeGVsX21vZGVzKys7CisgIH0KKworCisKKyAgc3RhdGljCisgIGludCAgaW5pdF9kZXZpY2UoIHZvaWQgKQorICB7CisgICAgWERlcHRoICBkdW1teTsKKyAgCisgICAgWHJtSW5pdGlhbGl6ZSgpOworICAgIAorICAgIGRpc3BsYXkgPSBYT3BlbkRpc3BsYXkoIGRpc3BsYXluYW1lICk7CisgICAgaWYgKCFkaXNwbGF5KQorICAgIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICAgLyogUGFuaWMoICJHcjplcnJvcjogY2Fubm90IG9wZW4gWDExIGRpc3BsYXlcbiIgKTsgKi8KKyAgICB9CisgICAgICAKKyAgICBpZGxlID0gWENyZWF0ZUZvbnRDdXJzb3IoIGRpc3BsYXksIFhDX2xlZnRfcHRyICk7CisgICAgYnVzeSA9IFhDcmVhdGVGb250Q3Vyc29yKCBkaXNwbGF5LCBYQ193YXRjaCApOworICAgIAorICAgIG51bV9waXhlbF9tb2RlcyA9IDA7CisgICAgCisgICAgLyogYWx3YXlzIGVuYWJsZSB0aGUgOC1iaXQgZ3JheSBsZXZlbHMgcGl4ZWwgbW9kZSAgICAgICAgICAgICAgICAqLworICAgIC8qIGV2ZW4gaWYgaXRzIGRpc3BsYXkgaXMgZW11bGF0ZWQgdGhyb3VnaCBhIGNvbnN0cmFpbmVkIHBhbGV0dGUgKi8KKyAgICAvKiBvciBhbm90aGVyIGNvbG9yIG1vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgZHVtbXkuZGVwdGggICAgICAgICAgPSA4OworICAgIGR1bW15LmJpdHNfcGVyX3BpeGVsID0gODsKKyAgICBkdW1teS5zY2FubGluZV9wYWQgICA9IDg7CisgICAgYWRkX3BpeGVsX21vZGUoIGdyX3BpeGVsX21vZGVfZ3JheSwgJmR1bW15ICk7CisKKyAgICB7CisgICAgICBpbnQgICAgICAgICAgY291bnQ7CisgICAgICBYRGVwdGgqICAgICAgZm9ybWF0OworICAgICAgWERlcHRoKiAgICAgIGZvcm1hdHM7CisgICAgICBYVmlzdWFsSW5mbyAgdGVtcGxhdGU7CisKKyAgICAgIGZvcm1hdHMgPSBYTGlzdFBpeG1hcEZvcm1hdHMoIGRpc3BsYXksICZjb3VudCApOworICAgICAgZm9ybWF0ICA9IGZvcm1hdHM7CisgICAgICAgCisjaWZkZWYgVEVTVAorICAgICAgcHJpbnRmKCAiYXZhaWxhYmxlIHBpeG1hcCBmb3JtYXRzXG4iICk7CisgICAgICBwcmludGYoICJkZXB0aCAgcGl4Yml0cyAgc2NhbnBhZFxuIiApOworI2VuZGlmCisgICAgICAgCisgICAgICB3aGlsZSAoIGNvdW50LS0gPiAwICkKKyAgICAgIHsKKyNpZmRlZiBURVNUIAorICAgICAgICBwcmludGYoICIgJTNkICAgICAlM2QgICAgICAlM2RcbiIsCisgICAgICAgICAgICAgICAgZm9ybWF0LT5kZXB0aCwKKyAgICAgICAgICAgICAgICBmb3JtYXQtPmJpdHNfcGVyX3BpeGVsLAorICAgICAgICAgICAgICAgIGZvcm1hdC0+c2NhbmxpbmVfcGFkICk7CisjZW5kaWYKKyAgICAgIAorICAgICAgICBpZiAoIGZvcm1hdC0+ZGVwdGggPT0gMSApCisgICAgICAgICAgLyogdXN1YWxseSwgdGhpcyBzaG91bGQgYmUgdGhlIGZpcnN0IGZvcm1hdCAqLworICAgICAgICAgIGFkZF9waXhlbF9tb2RlKCBncl9waXhlbF9tb2RlX21vbm8sIGZvcm1hdCApOworICAgICAgICAgIAorICAgICAgICBlbHNlIGlmICggZm9ybWF0LT5kZXB0aCA9PSA4ICkKKyAgICAgICAgICBhZGRfcGl4ZWxfbW9kZSggZ3JfcGl4ZWxfbW9kZV9wYWw4LCBmb3JtYXQgKTsKKworICAgICAgICAvKiBub3RlLCB0aGUgMzItYml0IG1vZGVzIHJldHVybiBhIGRlcHRoIG9mIDI0LCBhbmQgMzIgYml0cyBwZXIgcGl4ZWwgKi8gICAgICAgICAgCisgICAgICAgIGVsc2UgaWYgKCBmb3JtYXQtPmRlcHRoID09IDI0ICkKKyAgICAgICAgeworICAgICAgICAgIGlmICggZm9ybWF0LT5iaXRzX3Blcl9waXhlbCA9PSAyNCApCisgICAgICAgICAgICBhZGRfcGl4ZWxfbW9kZSggZ3JfcGl4ZWxfbW9kZV9yZ2IyNCwgZm9ybWF0ICk7CisgICAgICAgICAgICAKKyAgICAgICAgICBlbHNlIGlmICggZm9ybWF0LT5iaXRzX3Blcl9waXhlbCA9PSAzMiApCisgICAgICAgICAgICBhZGRfcGl4ZWxfbW9kZSggZ3JfcGl4ZWxfbW9kZV9yZ2IzMiwgZm9ybWF0ICk7CisgICAgICAgIH0KKyAgICAgICAgICAKKyAgICAgICAgZWxzZSBpZiAoIGZvcm1hdC0+ZGVwdGggPT0gMTYgKQorICAgICAgICB7CisgICAgICAgICAgaW50ICAgICAgICAgICBjb3VudDI7CisgICAgICAgICAgWFZpc3VhbEluZm8qICB2aXN1YWxzOworICAgICAgICAgIFhWaXN1YWxJbmZvKiAgdmlzdWFsOworCisgICAgICAgICAgdGVtcGxhdGUuZGVwdGggPSBmb3JtYXQtPmRlcHRoOworICAgICAgICAgIHZpc3VhbHMgICAgICAgID0gWEdldFZpc3VhbEluZm8oIGRpc3BsYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlzdWFsRGVwdGhNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZW1wbGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY291bnQyICk7CisgICAgICAgICAgdmlzdWFsID0gdmlzdWFsczsKKyAgICAgICAgICAKKyAgICAgICAgICB3aGlsZSAoIGNvdW50Mi0tID4gMCApCisgICAgICAgICAgeworI2lmZGVmIFRFU1QgCisgICAgICAgICAgICBjb25zdCBjaGFyKiAgc3RyaW5nID0gInVua25vd24iOworICAgICAgICAgICAgCisgICAgICAgICAgICBzd2l0Y2ggKHZpc3VhbC0+Y2xhc3MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGNhc2UgVHJ1ZUNvbG9yOiAgIHN0cmluZyA9ICJUcnVlQ29sb3IiOyAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBEaXJlY3RDb2xvcjogc3RyaW5nID0gIkRpcmVjdENvbG9yIjsgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIFBzZXVkb0NvbG9yOiBzdHJpbmcgPSAiUHNldWRvQ29sb3IiOyAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgU3RhdGljR3JheSA6IHN0cmluZyA9ICJTdGF0aWNHcmF5IjsgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBTdGF0aWNDb2xvcjogc3RyaW5nID0gIlN0YXRpY0NvbG9yIjsgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIEdyYXlTY2FsZTogICBzdHJpbmcgPSAiR3JheVNjYWxlIjsgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHByaW50ZiggIj4gICBSR0IgJTAyeDolMDJ4OiUwMngsIGNvbG9ycyAlM2QsIGJpdHMgJTJkICAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgdmlzdWFsLT5yZWRfbWFzaywKKyAgICAgICAgICAgICAgICAgICAgdmlzdWFsLT5ncmVlbl9tYXNrLAorICAgICAgICAgICAgICAgICAgICB2aXN1YWwtPmJsdWVfbWFzaywKKyAgICAgICAgICAgICAgICAgICAgdmlzdWFsLT5jb2xvcm1hcF9zaXplLAorICAgICAgICAgICAgICAgICAgICB2aXN1YWwtPmJpdHNfcGVyX3JnYiwKKyAgICAgICAgICAgICAgICAgICAgc3RyaW5nICk7CisjZW5kaWYKKyAgICAgICAgICAgIGlmICggdmlzdWFsLT5yZWRfbWFzayAgID09IDB4ZjgwMCAmJgorICAgICAgICAgICAgICAgICB2aXN1YWwtPmdyZWVuX21hc2sgPT0gMHgwN2UwICYmCisgICAgICAgICAgICAgICAgIHZpc3VhbC0+Ymx1ZV9tYXNrICA9PSAweDAwMWYgKQorICAgICAgICAgICAgICBhZGRfcGl4ZWxfbW9kZSggZ3JfcGl4ZWxfbW9kZV9yZ2I1NjUsIGZvcm1hdCApOworICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGVsc2UgaWYgKCB2aXN1YWwtPnJlZF9tYXNrICAgPT0gMHg3YzAwICYmCisgICAgICAgICAgICAgICAgICAgICAgdmlzdWFsLT5ncmVlbl9tYXNrID09IDB4MDNlMCAmJgorICAgICAgICAgICAgICAgICAgICAgIHZpc3VhbC0+Ymx1ZV9tYXNrICA9PSAweDAwMWYgKQorICAgICAgICAgICAgICBhZGRfcGl4ZWxfbW9kZSggZ3JfcGl4ZWxfbW9kZV9yZ2I1NTUsIGZvcm1hdCApOworICAgICAgICAgICAgICAKKyAgICAgICAgICAgIC8qIG90aGVyIDE2LWJpdCBtb2RlcyBhcmUgaWdub3JlZCAqLyAgCisgICAgICAgICAgICB2aXN1YWwrKzsKKyAgICAgICAgICB9CisgICAgICAgICAgCisgICAgICAgICAgWEZyZWUoIHZpc3VhbHMgKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgZm9ybWF0Kys7CisgICAgICB9CisgICAgICAKKyAgICAgIFhGcmVlKCBmb3JtYXRzICk7CisgICAgfQorICAgIAorICAgIGdyX3gxMV9kZXZpY2UubnVtX3BpeGVsX21vZGVzID0gbnVtX3BpeGVsX21vZGVzOworICAgIGdyX3gxMV9kZXZpY2UucGl4ZWxfbW9kZXMgICAgID0gcGl4ZWxfbW9kZXM7CisgICAgCisgICAgcmV0dXJuIDA7CisgIH0KKworCisKKworCisKKworCisKKworCisKKyAgc3RhdGljCisgIHZvaWQgIGNvbnZlcnRfZ3JheV90b19wYWw4KCBnclhTdXJmYWNlKiAgc3VyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgIHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICBoICkKKyAgeworICAgIGdyQml0bWFwKiAgdGFyZ2V0ICA9ICZzdXJmYWNlLT5pbWFnZTsKKyAgICBnckJpdG1hcCogIHNvdXJjZSAgPSAmc3VyZmFjZS0+cm9vdC5iaXRtYXA7CisgICAgYnl0ZSogICAgICB3cml0ZSAgID0gKGJ5dGUqKXRhcmdldC0+YnVmZmVyICsgeSp0YXJnZXQtPnBpdGNoICsgeDsKKyAgICBieXRlKiAgICAgIHJlYWQgICAgPSAoYnl0ZSopc291cmNlLT5idWZmZXIgKyB5KnNvdXJjZS0+cGl0Y2ggKyB4OworICAgIFhDb2xvciogICAgcGFsZXR0ZSA9IHN1cmZhY2UtPmNvbG9yOworICAgIAorICAgIHdoaWxlIChoID4gMCkKKyAgICB7CisgICAgICBieXRlKiAgX3dyaXRlID0gd3JpdGU7CisgICAgICBieXRlKiAgX3JlYWQgID0gcmVhZDsKKyAgICAgIGJ5dGUqICBsaW1pdCAgPSBfd3JpdGUgKyB3OworICAgICAgCisgICAgICBmb3IgKCA7IF93cml0ZSA8IGxpbWl0OyBfd3JpdGUrKywgX3JlYWQrKyApCisgICAgICAgICpfd3JpdGUgPSAoYnl0ZSkgcGFsZXR0ZVsgKl9yZWFkIF0ucGl4ZWw7CisKKyAgICAgIHdyaXRlICs9IHRhcmdldC0+cGl0Y2g7CisgICAgICByZWFkICArPSBzb3VyY2UtPnBpdGNoOworICAgICAgaC0tOworICAgIH0KKyAgfQorCisKKyAgc3RhdGljCisgIHZvaWQgIGNvbnZlcnRfZ3JheV90b18xNiggZ3JYU3VyZmFjZSogIHN1cmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgIHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgIHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgIHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgIGggKQorICB7CisgICAgZ3JCaXRtYXAqICB0YXJnZXQgID0gJnN1cmZhY2UtPmltYWdlOworICAgIGdyQml0bWFwKiAgc291cmNlICA9ICZzdXJmYWNlLT5yb290LmJpdG1hcDsKKyAgICBieXRlKiAgICAgIHdyaXRlICAgPSAoYnl0ZSopdGFyZ2V0LT5idWZmZXIgKyB5KnRhcmdldC0+cGl0Y2ggKyAyKng7CisgICAgYnl0ZSogICAgICByZWFkICAgID0gKGJ5dGUqKXNvdXJjZS0+YnVmZmVyICsgeSpzb3VyY2UtPnBpdGNoICsgeDsKKyAgICBYQ29sb3IqICAgIHBhbGV0dGUgPSBzdXJmYWNlLT5jb2xvcjsKKyAgICAKKyAgICB3aGlsZSAoaCA+IDApCisgICAgeworICAgICAgYnl0ZSogIF93cml0ZSA9IHdyaXRlOworICAgICAgYnl0ZSogIF9yZWFkICA9IHJlYWQ7CisgICAgICBieXRlKiAgbGltaXQgID0gX3dyaXRlICsgMip3OworICAgICAgCisgICAgICBmb3IgKCA7IF93cml0ZSA8IGxpbWl0OyBfd3JpdGUgKz0gMiwgX3JlYWQrKyApCisgICAgICAgICooc2hvcnQqKV93cml0ZSA9IChzaG9ydClwYWxldHRlWyAqX3JlYWQgXS5waXhlbDsKKworICAgICAgd3JpdGUgKz0gdGFyZ2V0LT5waXRjaDsKKyAgICAgIHJlYWQgICs9IHNvdXJjZS0+cGl0Y2g7CisgICAgICBoLS07CisgICAgfQorICB9CisKKworICBzdGF0aWMKKyAgdm9pZCAgY29udmVydF9ncmF5X3RvXzI0KCBnclhTdXJmYWNlKiAgc3VyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgaCApCisgIHsKKyAgICBnckJpdG1hcCogIHRhcmdldCAgPSAmc3VyZmFjZS0+aW1hZ2U7CisgICAgZ3JCaXRtYXAqICBzb3VyY2UgID0gJnN1cmZhY2UtPnJvb3QuYml0bWFwOworICAgIGJ5dGUqICAgICAgd3JpdGUgICA9IChieXRlKil0YXJnZXQtPmJ1ZmZlciArIHkqdGFyZ2V0LT5waXRjaCArIDMqeDsKKyAgICBieXRlKiAgICAgIHJlYWQgICAgPSAoYnl0ZSopc291cmNlLT5idWZmZXIgKyB5KnNvdXJjZS0+cGl0Y2ggKyB4OworICAgIAorICAgIHdoaWxlIChoID4gMCkKKyAgICB7CisgICAgICBieXRlKiAgX3dyaXRlID0gd3JpdGU7CisgICAgICBieXRlKiAgX3JlYWQgID0gcmVhZDsKKyAgICAgIGJ5dGUqICBsaW1pdCAgPSBfd3JpdGUgKyAzKnc7CisgICAgICAKKyAgICAgIGZvciAoIDsgX3dyaXRlIDwgbGltaXQ7IF93cml0ZSArPSAzLCBfcmVhZCsrICkKKyAgICAgIHsKKyAgICAgICAgYnl0ZSAgY29sb3IgPSAqX3JlYWQ7CisgICAgICAgIAorICAgICAgICBfd3JpdGVbMF0gPQorICAgICAgICBfd3JpdGVbMV0gPQorICAgICAgICBfd3JpdGVbMl0gPSBjb2xvcjsKKyAgICAgIH0KKworICAgICAgd3JpdGUgKz0gdGFyZ2V0LT5waXRjaDsKKyAgICAgIHJlYWQgICs9IHNvdXJjZS0+cGl0Y2g7CisgICAgICBoLS07CisgICAgfQorICB9CisKKworICBzdGF0aWMKKyAgdm9pZCAgY29udmVydF9ncmF5X3RvXzMyKCBnclhTdXJmYWNlKiAgc3VyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgaCApCisgIHsKKyAgICBnckJpdG1hcCogIHRhcmdldCAgPSAmc3VyZmFjZS0+aW1hZ2U7CisgICAgZ3JCaXRtYXAqICBzb3VyY2UgID0gJnN1cmZhY2UtPnJvb3QuYml0bWFwOworICAgIGJ5dGUqICAgICAgd3JpdGUgICA9IChieXRlKil0YXJnZXQtPmJ1ZmZlciArIHkqdGFyZ2V0LT5waXRjaCArIDQqeDsKKyAgICBieXRlKiAgICAgIHJlYWQgICAgPSAoYnl0ZSopc291cmNlLT5idWZmZXIgKyB5KnNvdXJjZS0+cGl0Y2ggKyB4OworICAgIAorICAgIHdoaWxlIChoID4gMCkKKyAgICB7CisgICAgICBieXRlKiAgX3dyaXRlID0gd3JpdGU7CisgICAgICBieXRlKiAgX3JlYWQgID0gcmVhZDsKKyAgICAgIGJ5dGUqICBsaW1pdCAgPSBfd3JpdGUgKyA0Knc7CisgICAgICAKKyAgICAgIGZvciAoIDsgX3dyaXRlIDwgbGltaXQ7IF93cml0ZSArPSA0LCBfcmVhZCsrICkKKyAgICAgIHsKKyAgICAgICAgYnl0ZSAgY29sb3IgPSAqX3JlYWQ7CisgICAgICAgIAorICAgICAgICBfd3JpdGVbMF0gPQorICAgICAgICBfd3JpdGVbMV0gPQorICAgICAgICBfd3JpdGVbMl0gPQorICAgICAgICBfd3JpdGVbM10gPSBjb2xvcjsKKyAgICAgIH0KKworICAgICAgd3JpdGUgKz0gdGFyZ2V0LT5waXRjaDsKKyAgICAgIHJlYWQgICs9IHNvdXJjZS0+cGl0Y2g7CisgICAgICBoLS07CisgICAgfQorICB9CisKKworICBzdGF0aWMKKyAgdm9pZCAgY29udmVydF9yZWN0YW5nbGUoIGdyWFN1cmZhY2UqICBzdXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgIHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICB3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgIGggKQorICB7CisgICAgaW50ICB6OworICAgIAorICAgIC8qIGZpcnN0IG9mIGFsbCwgY2xpcCB0byB0aGUgc3VyZmFjZSdzIGFyZWEgKi8KKyAgICBpZiAoIHggICA+PSBzdXJmYWNlLT5pbWFnZS53aWR0aCB8fAorICAgICAgICAgeCt3IDw9IDAgICAgICAgICAgICAgICAgICAgIHx8CisgICAgICAgICB5ICAgPj0gc3VyZmFjZS0+aW1hZ2Uucm93cyAgfHwKKyAgICAgICAgIHkraCA8PSAwICkKKyAgICAgIHJldHVybjsKKyAKKyAgICBpZiAoIHggPCAwICkKKyAgICB7CisgICAgICB3ICs9IHg7CisgICAgICB4ICA9IDA7CisgICAgfQorIAorICAgIHogPSAoeCArIHcpIC0gc3VyZmFjZS0+aW1hZ2Uud2lkdGg7CisgICAgaWYgKHogPiAwKQorICAgICAgdyAtPSB6OworICAgICAgCisgICAgeiA9ICh5ICsgaCkgLSBzdXJmYWNlLT5pbWFnZS5yb3dzOworICAgIGlmICh6ID4gMCkKKyAgICAgIGggLT0gejsKKyAgICAgIAorICAgIC8qIGNvbnZlcnQgdGhlIHJlY3RhbmdsZSB0byB0aGUgdGFyZ2V0IGRlcHRoIGZvciBncmF5IHN1cmZhY2VzICovCisgICAgaWYgKHN1cmZhY2UtPmdyYXkpCisgICAgeworICAgICAgc3dpdGNoIChzdXJmYWNlLT5kZXB0aCkKKyAgICAgIHsKKyAgICAgICAgY2FzZSA4IDogY29udmVydF9ncmF5X3RvX3BhbDgoIHN1cmZhY2UsIHgsIHksIHcsIGggKTsgYnJlYWs7CisgICAgICAgIGNhc2UgMTY6IGNvbnZlcnRfZ3JheV90b18xNiAgKCBzdXJmYWNlLCB4LCB5LCB3LCBoICk7IGJyZWFrOworICAgICAgICBjYXNlIDI0OiBjb252ZXJ0X2dyYXlfdG9fMjQgICggc3VyZmFjZSwgeCwgeSwgdywgaCApOyBicmVhazsKKyAgICAgICAgY2FzZSAzMjogY29udmVydF9ncmF5X3RvXzMyICAoIHN1cmZhY2UsIHgsIHksIHcsIGggKTsgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9IAorCisKKyAgc3RhdGljCisgIHZvaWQgIHJlZnJlc2hfcmVjdGFuZ2xlKCBnclhTdXJmYWNlKiAgc3VyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgIHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICBoICkKKyAgeworICAgIGlmIChzdXJmYWNlLT5ncmF5KQorICAgICAgY29udmVydF9yZWN0YW5nbGUoIHN1cmZhY2UsIHgsIHksIHcsIGggKTsKKyAgICAKKyAgICBYUHV0SW1hZ2UoIGRpc3BsYXksCisgICAgICAgICAgICAgICBzdXJmYWNlLT53aW4sCisgICAgICAgICAgICAgICBzdXJmYWNlLT5nYywKKyAgICAgICAgICAgICAgIHN1cmZhY2UtPnhpbWFnZSwKKyAgICAgICAgICAgICAgIHgsIHksIHgsIHksIHcsIGggKTsKKyAgfQorCisgIAorICBzdGF0aWMKKyAgdm9pZCAgc2V0X3RpdGxlKCBnclhTdXJmYWNlKiAgc3VyZmFjZSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgdGl0bGUgKQorICB7CisgICAgWFN0b3JlTmFtZSggZGlzcGxheSwgc3VyZmFjZS0+d2luLCB0aXRsZSApOworICB9CisKKworCisgIHN0YXRpYworICBncktleSAgS2V5U3ltVG9ncktleSggS2V5U3ltICBrZXkgKQorICB7CisgICAgZ3JLZXkgICAgICAgIGs7CisgICAgaW50ICAgICAgICAgIGNvdW50ID0gc2l6ZW9mKGtleV90cmFuc2xhdG9ycykvc2l6ZW9mKGtleV90cmFuc2xhdG9yc1swXSk7CisgICAgVHJhbnNsYXRvciogIHRyYW5zID0ga2V5X3RyYW5zbGF0b3JzOworICAgIFRyYW5zbGF0b3IqICBsaW1pdCA9IHRyYW5zICsgY291bnQ7CisKKyAgICBrID0gZ3JLZXlOb25lOworCisgICAgd2hpbGUgKCB0cmFucyA8IGxpbWl0ICkKKyAgICB7CisgICAgICBpZiAoIHRyYW5zLT54a2V5ID09IGtleSApCisgICAgICB7CisgICAgICAgIGsgPSB0cmFucy0+Z3JrZXk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgdHJhbnMrKzsKKyAgICB9CisKKyAgICByZXR1cm4gazsKKyAgfQorCisKKworICBzdGF0aWMgIAorICB2b2lkICBsaXN0ZW5fZXZlbnQoIGdyWFN1cmZhY2UqICBzdXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICBldmVudF9tYXNrLAorICAgICAgICAgICAgICAgICAgICAgIGdyRXZlbnQqICAgICBncmV2ZW50ICkKKyAgeworICAgIHN0YXRpYyBjaGFyICAgICBrZXlfYnVmZmVyWzEwXTsKKyAgICBzdGF0aWMgaW50ICAgICAga2V5X2N1cnNvciA9IDA7CisgICAgc3RhdGljIGludCAgICAgIGtleV9udW1iZXIgPSAwOworICAgIHN0YXRpYyBYRXZlbnQgICB4X2V2ZW50OworICAgICAgICAgICBLZXlTeW0gICBrZXk7CisKKyAgICBpbnQgICAgICAgICAgICAgYm9vbF9leGl0OworICAgIGdyS2V5ICAgICAgICAgICBncmtleTsKKworICAgIFhDb21wb3NlU3RhdHVzICBjb21wb3NlOworCisgICAgLyogWFhYWCA6IEZvciBub3csIGlnbm9yZSB0aGUgZXZlbnQgbWFzaywgYW5kIG9ubHkgZXhpdCB3aGVuICovCisgICAgLyogICAgICAgIGEga2V5IGlzIHByZXNzZWQuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgKHZvaWQpZXZlbnRfbWFzazsKKworICAgIGJvb2xfZXhpdCA9IGtleV9jdXJzb3IgPCBrZXlfbnVtYmVyOworCisgICAgWERlZmluZUN1cnNvciggZGlzcGxheSwgc3VyZmFjZS0+d2luLCBpZGxlICk7CisKKyAgICB3aGlsZSAoICFib29sX2V4aXQgKQorICAgIHsKKyAgICAgIFhOZXh0RXZlbnQoIGRpc3BsYXksICZ4X2V2ZW50ICk7CisKKyAgICAgIHN3aXRjaCAoIHhfZXZlbnQudHlwZSApCisgICAgICB7CisgICAgICBjYXNlIEtleVByZXNzOiAKKyAgICAgICAga2V5X251bWJlciA9IFhMb29rdXBTdHJpbmcoICZ4X2V2ZW50LnhrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlfYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mICgga2V5X2J1ZmZlciApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb21wb3NlICk7CisgICAgICAgIGtleV9jdXJzb3IgPSAwOworCisgICAgICAgIGlmICgga2V5X251bWJlciA9PSAwIHx8CisgICAgICAgICAgICAga2V5ID4gNTEyICAgICAgICkKKyAgICAgICAgeworICAgICAgICAgIC8qIHRoaXMgbWF5IGJlIGEgc3BlY2lhbCBrZXkgbGlrZSBGMSwgRjIsIGV0Yy4uICovCisgICAgICAgICAgZ3JrZXkgPSBLZXlTeW1Ub2dyS2V5KGtleSk7CisgICAgICAgICAgaWYgKGdya2V5ICE9IGdyS2V5Tm9uZSkKKyAgICAgICAgICAgIGdvdG8gU2V0X0tleTsgIAorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICBib29sX2V4aXQgPSAxOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBNYXBwaW5nTm90aWZ5OgorICAgICAgICBYUmVmcmVzaEtleWJvYXJkTWFwcGluZyggJnhfZXZlbnQueG1hcHBpbmcgKTsKKyAgICAgICAgYnJlYWs7CisgICAgICAKKyAgICAgIGNhc2UgRXhwb3NlOgorICAgICAgICByZWZyZXNoX3JlY3RhbmdsZSggc3VyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHhfZXZlbnQueGV4cG9zZS54LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgeF9ldmVudC54ZXhwb3NlLnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICB4X2V2ZW50LnhleHBvc2Uud2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB4X2V2ZW50LnhleHBvc2UuaGVpZ2h0ICk7CisgICAgICAgIGJyZWFrOworCisgICAgICAvKiBZb3Ugc2hvdWxkIGFkZCBtb3JlIGNhc2VzIHRvIGhhbmRsZSBtb3VzZSBldmVudHMsIGV0Yy4gKi8KKyAgICAgIH0KKyAgICB9CisKKyAgICBYRGVmaW5lQ3Vyc29yKCBkaXNwbGF5LCBzdXJmYWNlLT53aW4sIGJ1c3kgKTsKKyAgICBYRmx1c2ggICAgICAgKCBkaXNwbGF5ICk7CisKKyAgICAvKiBOb3csIHRyYW5zbGF0ZSB0aGUga2V5cHJlc3MgdG8gYSBncktleSAqLworICAgIC8qIElmIHRoaXMgd2Fzbid0IHBhcnQgb2YgdGhlIHNpbXBsZSB0cmFuc2xhdGVkIGtleXMsIHNpbXBseSBnZXQgdGhlIGNoYXJjb2RlICovCisgICAgLyogZnJvbSB0aGUgY2hhcmFjdGVyIGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBncmtleSA9IGdyS0VZKGtleV9idWZmZXJba2V5X2N1cnNvcisrXSk7CisgICAgICAKKyAgU2V0X0tleToKKyAgICBncmV2ZW50LT50eXBlID0gZ3Jfa2V5X2Rvd247CisgICAgZ3JldmVudC0+a2V5ICA9IGdya2V5OworICB9CisKKworCisKKyAgZ3JYU3VyZmFjZSogIGluaXRfc3VyZmFjZSggZ3JYU3VyZmFjZSogIHN1cmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyQml0bWFwKiAgICBiaXRtYXAgKQorICB7CisgICAgaW50ICAgICAgICBzY3JlZW47CisgICAgZ3JCaXRtYXAqICBpbWFnZTsKKyAgICBjaGFyICAgICAgIGdyYXlzOworICAgIFhEZXB0aCogICAgZm9ybWF0OworICAgIGludCAgICAgICAgaW1hZ2VfZGVwdGg7CisgICAgCisgICAgc2NyZWVuID0gRGVmYXVsdFNjcmVlbiggZGlzcGxheSApOworICAgIAorICAgIHN1cmZhY2UtPmNvbG9ybWFwID0gRGVmYXVsdENvbG9ybWFwKCBkaXNwbGF5LCBzY3JlZW4gKTsKKyAgICBzdXJmYWNlLT5kZXB0aCAgICA9IERlZmF1bHREZXB0aCggZGlzcGxheSwgc2NyZWVuICk7CisgICAgc3VyZmFjZS0+dmlzdWFsICAgPSBEZWZhdWx0VmlzdWFsKCBkaXNwbGF5LCBzY3JlZW4gKTsgCisKKyAgICBpbWFnZSAgPSAmc3VyZmFjZS0+aW1hZ2U7CisKKyAgICAvKiBmb3JjZSB0aGUgc3VyZmFjZSBpbWFnZSBkZXB0aCB0byAxIGlmIG5lY2Vzc2FyeSAqLworICAgIC8qIGFzIHRoaXMgc2hvdWxkIGJlIHN1cHBvcnRlZCBieSBhbGwgd2luZG93cyAgICAgICovCisgICAgaW1hZ2VfZGVwdGggPSBzdXJmYWNlLT5kZXB0aDsKKyAgICBpZiAoYml0bWFwLT5tb2RlID09IGdyX3BpeGVsX21vZGVfbW9ubykKKyAgICAgIGltYWdlX2RlcHRoID0gMTsKKworICAgIGdyYXlzID0gKCBiaXRtYXAtPm1vZGUgPT0gZ3JfcGl4ZWxfbW9kZV9ncmF5ICYmCisgICAgICAgICAgICAgIGJpdG1hcC0+Z3JheXMgPj0gMiApOworCisgICAgc3VyZmFjZS0+Z3JheSA9IGdyYXlzOworIAorICAgIC8qIGNvcHkgZGltZW5zaW9ucyAqLworICAgIGltYWdlLT53aWR0aCAgPSBiaXRtYXAtPndpZHRoOworICAgIGltYWdlLT5yb3dzICAgPSBiaXRtYXAtPnJvd3M7CisgICAgaW1hZ2UtPm1vZGUgICA9IGJpdG1hcC0+bW9kZTsKKyAgICBpbWFnZS0+cGl0Y2ggID0gMDsKKyAgICBpbWFnZS0+Z3JheXMgID0gMDsKKyAgICBpbWFnZS0+YnVmZmVyID0gMDsKKworICAgIC8qIGZpbmQgdGhlIHN1cHBvcnRlZCBmb3JtYXQgY29ycmVzcG9uZGluZyB0byB0aGUgcmVxdWVzdCAqLworICAgIGZvcm1hdCA9IDA7CisKKyAgICBpZiAoZ3JheXMpICAgIAorICAgIHsKKyAgICAgIC8qIGNob29zZSB0aGUgZGVmYXVsdCBkZXB0aCBpbiBjYXNlIG9mIGdyYXlzIHJlbmRlcmluZyAqLworICAgICAgaW50ICBpOworICAgICAgZm9yICggaSA9IDA7IGkgPCBudW1fcGl4ZWxfbW9kZXM7IGkrKyApCisgICAgICAgIGlmICggaW1hZ2VfZGVwdGggPT0gcGl4ZWxfZGVwdGhbaV0uZGVwdGggKQorICAgICAgICB7CisgICAgICAgICAgZm9ybWF0ID0gcGl4ZWxfZGVwdGggKyBpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBvdGhlcndpc2UsIHNlbGVjdCB0aGUgZm9ybWF0IGRlcGVuZGluZyBvbiB0aGUgcGl4ZWwgbW9kZSAqLworICAgICAgaW50ICBpOworICAgICAgCisgICAgICBmb3JtYXQgPSAwOworICAgICAgZm9yICggaSA9IDA7IGkgPCBudW1fcGl4ZWxfbW9kZXM7IGkrKyApCisgICAgICAgIGlmICggcGl4ZWxfbW9kZXNbaV0gPT0gYml0bWFwLT5tb2RlICkKKyAgICAgICAgeworICAgICAgICAgIGZvcm1hdCA9IHBpeGVsX2RlcHRoICsgaTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBpZiAoIWZvcm1hdCkKKyAgICB7CisgICAgICBnckVycm9yID0gZ3JfZXJyX2JhZF9hcmd1bWVudDsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworCisgICAgLyogY29ycmVjdCBzdXJmYWNlLmRlcHRoLiBUaGlzIGlzIHJlcXVpcmVkIGJlY2F1c2UgaW4gdGhlIGNhc2UgICAgKi8KKyAgICAvKiBvZiAzMi1iaXRzIHBpeGVscywgdGhlIHZhbHVlIG9mICJmb3JtYXQuZGVwdGgiIGlzIDI0IHVuZGVyIFgxMSAqLworICAgIGlmICggZm9ybWF0LT5kZXB0aCAgICAgICAgICA9PSAyNCAmJgorICAgICAgICAgZm9ybWF0LT5iaXRzX3Blcl9waXhlbCA9PSAzMiApCisgICAgICBpbWFnZV9kZXB0aCA9IDMyOworICAgICAKKyAgICAvKiBhbGxvY2F0ZSBzdXJmYWNlIGltYWdlICovCisgICAgeworICAgICAgaW50ICBiaXRzLCBvdmVyOworCisgICAgICBiaXRzID0gaW1hZ2UtPndpZHRoICogZm9ybWF0LT5iaXRzX3Blcl9waXhlbDsKKyAgICAgIG92ZXIgPSBiaXRzICUgZm9ybWF0LT5zY2FubGluZV9wYWQ7CisgICAgICAgICAgCisgICAgICBpZiAob3ZlcikKKyAgICAgICAgYml0cyArPSBmb3JtYXQtPnNjYW5saW5lX3BhZCAtIG92ZXI7CisgICAgICAKKyAgICAgIGlmICghZ3JheXMpCisgICAgICB7CisgICAgICAgIGltYWdlLT53aWR0aCAgPSBiaXRzOworICAgICAgICBiaXRtYXAtPndpZHRoID0gYml0czsKKyAgICAgIH0KKyAgICAgIGltYWdlLT5waXRjaCAgPSBiaXRzID4+IDM7CisgICAgfQorCisgICAgaW1hZ2UtPmJ1ZmZlciA9IGdyQWxsb2MoIGltYWdlLT5waXRjaCAqIGltYWdlLT5yb3dzICk7CisgICAgaWYgKCFpbWFnZS0+YnVmZmVyKSByZXR1cm4gMDsKKworICAgIC8qIG5vdywgYWxsb2NhdGUgYSBncmF5IHBhbDggcGl4bWFwLCBvbmx5IHdoZW4gd2UgYXNrZWQgKi8KKyAgICAvKiBmb3IgYW4gOC1iaXQgcGl4bWFwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgaWYgKCBncmF5cyApCisgICAgeworICAgICAgLyogcGFkIHBpdGNoIHRvIDMyIGJpdHMgKi8KKyAgICAgIGJpdG1hcC0+cGl0Y2ggID0gKGJpdG1hcC0+d2lkdGggKyAzKSAmIC00OworICAgICAgYml0bWFwLT5idWZmZXIgPSBnckFsbG9jKCBiaXRtYXAtPnBpdGNoICogYml0bWFwLT5yb3dzICk7CisgICAgICBpZiAoIWJpdG1hcC0+YnVmZmVyKQorICAgICAgICBQYW5pYyggImdyWDExOiBjb3VsZCBub3QgYWxsb2NhdGUgc3VyZmFjZSBiaXRtYXAhXG4iICk7CisgICAgfQorICAgIGVsc2UgIC8qIG90aGVyd2lzZSAqLworICAgIHsKKyAgICAgICpiaXRtYXAgPSAqaW1hZ2U7CisgICAgfQorCisgICAgc3VyZmFjZS0+cm9vdC5iaXRtYXAgPSAqYml0bWFwOworIAorICAgIC8qIE5vdyBjcmVhdGUgdGhlIHN1cmZhY2UgWDExIGltYWdlICovCisgICAgc3VyZmFjZS0+eGltYWdlID0gWENyZWF0ZUltYWdlKCBkaXNwbGF5LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cmZhY2UtPnZpc3VhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdC0+ZGVwdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQtPmRlcHRoID09IDEgPyBYWUJpdG1hcCA6IFpQaXhtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIqKWltYWdlLT5idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZS0+d2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZS0+cm93cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICk7CisgICAgaWYgKCAhc3VyZmFjZS0+eGltYWdlICkKKyAgICAgIFBhbmljKCAiZ3JYMTE6IGNhbm5vdCBjcmVhdGUgc3VyZmFjZSBYMTEgaW1hZ2VcbiIgKTsKKyAKKworICAgIC8qIGFsbG9jYXRlIGdyYXkgbGV2ZWxzIGluIHRoZSBjYXNlIG9mIGdyYXkgc3VyZmFjZSAqLworICAgIGlmICggZ3JheXMgKQorICAgIHsKKyAgICAgIFhDb2xvciogIGNvbG9yID0gc3VyZmFjZS0+Y29sb3I7CisgICAgICBpbnQgICAgICBpOworICAgICAgCisgICAgICBmb3IgKCBpID0gMDsgaSA8IGJpdG1hcC0+Z3JheXM7IGkrKywgY29sb3IrKyApCisgICAgICB7CisgICAgICAgIGNvbG9yLT5yZWQgICA9CisgICAgICAgIGNvbG9yLT5ncmVlbiA9CisgICAgICAgIGNvbG9yLT5ibHVlICA9IDY1NTM1IC0gKCBpICogNjU1MzUgKSAvIGJpdG1hcC0+Z3JheXM7CisgIAorICAgICAgICBpZiAoICFYQWxsb2NDb2xvciggZGlzcGxheSwgc3VyZmFjZS0+Y29sb3JtYXAsIGNvbG9yICkgKQorICAgICAgICAgIFBhbmljKCAiRVJST1I6IGNhbm5vdCBhbGxvY2F0ZSBDb2xvclxuIiApOworICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmICggaW1hZ2VfZGVwdGggPT0gMSApCisgICAgeworICAgICAgc3VyZmFjZS0+eGltYWdlLT5ieXRlX29yZGVyICAgICAgID0gTVNCRmlyc3Q7CisgICAgICBzdXJmYWNlLT54aW1hZ2UtPmJpdG1hcF9iaXRfb3JkZXIgPSBNU0JGaXJzdDsKKyAgICB9CisKKyAgICB7CisgICAgICAgIFhUZXh0UHJvcGVydHkgICAgICAgICB4dHA7CisgICAgICAgIFhTaXplSGludHMgICAgICAgICAgICB4c2g7CisgICAgICAgIFhTZXRXaW5kb3dBdHRyaWJ1dGVzICB4c3dhOworICAgIAorICAgICAgICB4c3dhLmJvcmRlcl9waXhlbCAgICAgPSBCbGFja1BpeGVsKCBkaXNwbGF5LCBzY3JlZW4gKTsKKyAgICAgICAgeHN3YS5iYWNrZ3JvdW5kX3BpeGVsID0gV2hpdGVQaXhlbCggZGlzcGxheSwgc2NyZWVuICk7CisgICAgICAgIHhzd2EuY3Vyc29yICAgICAgICAgICA9IGJ1c3k7CisgICAgCisgICAgICAgIHhzd2EuZXZlbnRfbWFzayA9IEtleVByZXNzTWFzayB8IEV4cG9zdXJlTWFzazsKKyAgICAKKyAgICAgICAgc3VyZmFjZS0+d2luID0gWENyZWF0ZVdpbmRvdyggZGlzcGxheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUm9vdFdpbmRvdyggZGlzcGxheSwgc2NyZWVuICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlLT53aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2UtPnJvd3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXJmYWNlLT5kZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXRPdXRwdXQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXJmYWNlLT52aXN1YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENXQmFja1BpeGVsIHwgQ1dCb3JkZXJQaXhlbCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1dFdmVudE1hc2sgfCBDV0N1cnNvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnhzd2EgKTsKKyAgICAKKyAgICAgICAgWE1hcFdpbmRvdyggZGlzcGxheSwgc3VyZmFjZS0+d2luICk7CisgCisgICAgICAgIHN1cmZhY2UtPmdjID0gWENyZWF0ZUdDKCBkaXNwbGF5LCBSb290V2luZG93KCBkaXNwbGF5LCBzY3JlZW4gKSwgMEwsIE5VTEwgKTsKKyAgICAgICAgWFNldEZvcmVncm91bmQoIGRpc3BsYXksIHN1cmZhY2UtPmdjLCB4c3dhLmJvcmRlcl9waXhlbCAgICAgKTsKKyAgICAgICAgWFNldEJhY2tncm91bmQoIGRpc3BsYXksIHN1cmZhY2UtPmdjLCB4c3dhLmJhY2tncm91bmRfcGl4ZWwgKTsKKyAgICAKKyAgICAKKyAgICAgICAgLyogbWFrZSB3aW5kb3cgbWFuYWdlciBoYXBweSA6LSkgKi8KKyAgICAgICAgeHRwLnZhbHVlICAgID0gKHVuc2lnbmVkIGNoYXIqKSJGcmVlVHlwZSI7CisgICAgICAgIHh0cC5lbmNvZGluZyA9IDMxOworICAgICAgICB4dHAuZm9ybWF0ICAgPSA4OworICAgICAgICB4dHAubml0ZW1zICAgPSBzdHJsZW4oIChjaGFyKil4dHAudmFsdWUgKTsKKyAgICAKKyAgICAgICAgeHNoLnggPSAwOworICAgICAgICB4c2gueSA9IDA7CisgICAgCisgICAgICAgIHhzaC53aWR0aCAgPSBpbWFnZS0+d2lkdGg7CisgICAgICAgIHhzaC5oZWlnaHQgPSBpbWFnZS0+cm93czsKKyAgICAgICAgeHNoLmZsYWdzICA9IChQUG9zaXRpb24gfCBQU2l6ZSk7CisgICAgICAgIHhzaC5mbGFncyAgPSAwOworICAgIAorICAgICAgICBYU2V0V01Qcm9wZXJ0aWVzKCBkaXNwbGF5LCBzdXJmYWNlLT53aW4sICZ4dHAsICZ4dHAsIE5VTEwsIDAsICZ4c2gsIE5VTEwsIE5VTEwgKTsKKyAgICB9CisgICAgCisgICAgc3VyZmFjZS0+cm9vdC5kb25lICAgICAgICAgPSAoZ3JEb25lU3VyZmFjZUZ1bmMpIGRvbmVfc3VyZmFjZTsKKyAgICBzdXJmYWNlLT5yb290LnJlZnJlc2hfcmVjdCA9IChnclJlZnJlc2hSZWN0RnVuYykgcmVmcmVzaF9yZWN0YW5nbGU7CisgICAgc3VyZmFjZS0+cm9vdC5zZXRfdGl0bGUgICAgPSAoZ3JTZXRUaXRsZUZ1bmMpICAgIHNldF90aXRsZTsKKyAgICBzdXJmYWNlLT5yb290Lmxpc3Rlbl9ldmVudCA9IChnckxpc3RlbkV2ZW50RnVuYykgbGlzdGVuX2V2ZW50OworICAgIAorICAgIGNvbnZlcnRfcmVjdGFuZ2xlKCBzdXJmYWNlLCAwLCAwLCBiaXRtYXAtPndpZHRoLCBiaXRtYXAtPnJvd3MgKTsKKyAgICByZXR1cm4gc3VyZmFjZTsKKyAgfQorICAKKworCisKKyAgZ3JEZXZpY2UgIGdyX3gxMV9kZXZpY2UgPQorICB7CisgICAgc2l6ZW9mKCBnclhTdXJmYWNlICksCisgICAgIngxMSIsCisgICAgCisgICAgaW5pdF9kZXZpY2UsCisgICAgZG9uZV9kZXZpY2UsCisgICAgCisgICAgKGdyRGV2aWNlSW5pdFN1cmZhY2VGdW5jKSBpbml0X3N1cmZhY2UsCisgICAgCisgICAgMCwKKyAgICAwCisgICAgCisgIH07CisKKyNpZmRlZiBURVNUCisKK3R5cGVkZWYgc3RydWN0IGdyS2V5TmFtZQoreworICBncktleSAgICAgICBrZXk7CisgIGNvbnN0IGNoYXIqIG5hbWU7CisKK30gZ3JLZXlOYW1lOworCisKK3N0YXRpYworY29uc3QgZ3JLZXlOYW1lICBrZXlfbmFtZXNbXSA9Cit7CisgIHsgZ3JLZXlGMSwgICAiRjEiICB9LAorICB7IGdyS2V5RjIsICAgIkYyIiAgfSwKKyAgeyBncktleUYzLCAgICJGMyIgIH0sCisgIHsgZ3JLZXlGNCwgICAiRjQiICB9LAorICB7IGdyS2V5RjUsICAgIkY1IiAgfSwKKyAgeyBncktleUY2LCAgICJGNiIgIH0sCisgIHsgZ3JLZXlGNywgICAiRjciICB9LAorICB7IGdyS2V5RjgsICAgIkY4IiAgfSwKKyAgeyBncktleUY5LCAgICJGOSIgIH0sCisgIHsgZ3JLZXlGMTAsICAiRjEwIiB9LAorICB7IGdyS2V5RjExLCAgIkYxMSIgfSwKKyAgeyBncktleUYxMiwgICJGMTIiIH0sCisgIHsgZ3JLZXlFc2MsICAiRXNjIiB9LAorICB7IGdyS2V5SG9tZSwgIkhvbWUiIH0sCisgIHsgZ3JLZXlFbmQsICAiRW5kIiAgfSwKKyAgICAKKyAgeyBncktleVBhZ2VVcCwgICAiUGFnZV9VcCIgfSwKKyAgeyBncktleVBhZ2VEb3duLCAiUGFnZV9Eb3duIiB9LAorICB7IGdyS2V5TGVmdCwgICAgICJMZWZ0IiB9LAorICB7IGdyS2V5UmlnaHQsICAgICJSaWdodCIgfSwKKyAgeyBncktleVVwLCAgICAgICAiVXAiIH0sCisgIHsgZ3JLZXlEb3duLCAgICAgIkRvd24iIH0sCisgIHsgZ3JLZXlCYWNrU3BhY2UsICJCYWNrU3BhY2UiIH0sCisgIHsgZ3JLZXlSZXR1cm4sICAgIlJldHVybiIgfQorfTsKKworaW50ICBtYWluKCB2b2lkICkKK3sKKyAgZ3JTdXJmYWNlKiAgc3VyZmFjZTsKKyAgaW50ICAgICAgICAgbjsKKyAgCisgIGdySW5pdCgpOworICBzdXJmYWNlID0gZ3JOZXdTY3JlZW5TdXJmYWNlKCAwLCBncl9waXhlbF9tb2RlX2dyYXksIDMyMCwgNDAwLCAxMjggKTsKKyAgaWYgKCFzdXJmYWNlKQorICAgIFBhbmljKCJDb3VsZCBub3QgY3JlYXRlIHdpbmRvd1xuIiApOworICBlbHNlCisgIHsKKyAgICBnckNvbG9yICAgICAgY29sb3I7CisgICAgZ3JFdmVudCAgICAgIGV2ZW50OworICAgIGNvbnN0IGNoYXIqICBzdHJpbmc7CisgICAgaW50ICAgICAgICAgIHg7CisgICAgCisgICAgZ3JTZXRTdXJmYWNlUmVmcmVzaCggc3VyZmFjZSwgMSApOworICAgIGdyU2V0VGl0bGUoc3VyZmFjZSwiWDExIGRyaXZlciBkZW1vbnN0cmF0aW9uIiApOworICAgIAorICAgIGZvciAoIHggPSAtMTA7IHggPCAxMDsgeCsrICkKKyAgICB7CisgICAgICBmb3IgKCBuID0gMDsgbiA8IDEyODsgbisrICkKKyAgICAgIHsKKyAgICAgICAgY29sb3IudmFsdWUgPSAobiozKSAmIDEyNzsKKyAgICAgICAgZ3JXcml0ZUNlbGxDaGFyKCBzdXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHggKyAoKG4gJSA2MCkgPDwgMyksCisgICAgICAgICAgICAgICAgICAgICAgICAgODAgKyAoeCsxMCkqOCozICsgKChuLzYwKSA8PCAzKSwgbiwgY29sb3IgKTsKKyAgICAgIH0KKworICAgIH0KKyAgICBjb2xvci52YWx1ZSA9IDY0OworICAgIGdyV3JpdGVDZWxsU3RyaW5nKCBzdXJmYWNlLCAwLCAwLCAianVzdCBhbiBleGFtcGxlIiwgY29sb3IgKTsKKyAgICAKKyAgICBkbworICAgIHsKKyAgICAgIGxpc3Rlbl9ldmVudCgoZ3JYU3VyZmFjZSopc3VyZmFjZSwgMCwgJmV2ZW50KTsKKyAgICAKKyAgICAgIC8qIHJldHVybiBpZiBFU0Mgd2FzIHByZXNzZWQgKi8KKyAgICAgIGlmICggZXZlbnQua2V5ID09IGdyS2V5RXNjICkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICAKKyAgICAgIC8qIG90aGVyd2lzZSwgZGlzcGxheSBrZXkgc3RyaW5nICovCisgICAgICBjb2xvci52YWx1ZSA9IChjb2xvci52YWx1ZSArIDgpICYgMTI3OworICAgICAgeworICAgICAgICBpbnQgICAgICAgICBjb3VudCA9IHNpemVvZihrZXlfbmFtZXMpL3NpemVvZihrZXlfbmFtZXNbMF0pOworICAgICAgICBncktleU5hbWUqICBuYW1lICA9IGtleV9uYW1lczsKKyAgICAgICAgZ3JLZXlOYW1lKiAgbGltaXQgPSBuYW1lICsgY291bnQ7CisgICAgICAgIGNvbnN0IGNoYXIqIGtuYW1lICA9IDA7CisgICAgICAgIGNoYXIgICAgICAgIGtuYW1lX3RlbXBbMTZdOworICAgICAgCisgICAgICAgIHdoaWxlIChuYW1lIDwgbGltaXQpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoIG5hbWUtPmtleSA9PSBldmVudC5rZXkgKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGtuYW1lID0gbmFtZS0+bmFtZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBuYW1lKys7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgICBpZiAoIWtuYW1lKQorICAgICAgICB7CisgICAgICAgICAgc3ByaW50Zigga25hbWVfdGVtcCwgImNoYXIgJyVjJyIsIChjaGFyKWV2ZW50LmtleSApOworICAgICAgICAgIGtuYW1lID0ga25hbWVfdGVtcDsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgZ3JXcml0ZUNlbGxTdHJpbmcoIHN1cmZhY2UsIDMwLCAzMCwga25hbWUsIGNvbG9yICk7CisgICAgICAgIGdyUmVmcmVzaFN1cmZhY2Uoc3VyZmFjZSk7CisgICAgICAgIHBhaW50X3JlY3RhbmdsZSggc3VyZmFjZSwgMCwgMCwgc3VyZmFjZS0+Yml0bWFwLndpZHRoLCBzdXJmYWNlLT5iaXRtYXAucm93cyApOworICAgICAgfQorICAgIH0gd2hpbGUgKDEpOworICB9CisgICAgCisgIHJldHVybiAwOworICAKKyAgCit9CisjZW5kaWYgLyogVEVTVCAqLworCmRpZmYgLS1naXQgYS9kZW1vcy9ncmFwaC9ncngxMS5oIGIvZGVtb3MvZ3JhcGgvZ3J4MTEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDc3MTEyCi0tLSAvZGV2L251bGwKKysrIGIvZGVtb3MvZ3JhcGgvZ3J4MTEuaApAQCAtMCwwICsxLDI0IEBACisjaWZuZGVmIEdSWDExX0gKKyNkZWZpbmUgR1JYMTFfSAorCisjaW5jbHVkZSAiZ3JvYmpzLmgiCisjaW5jbHVkZSAiZ3JkZXZpY2UuaCIKKworICBleHRlcm4KKyAgZ3JEZXZpY2UgIGdyX3gxMV9kZXZpY2U7CisKKyNpZmRlZiBHUl9JTklUX0JVSUxECisgIHN0YXRpYworICBnckRldmljZUNoYWluICBncl94MTFfZGV2aWNlX2NoYWluID0KKyAgeworICAgICJ4MTEiLAorICAgICZncl94MTFfZGV2aWNlLAorICAgIEdSX0lOSVRfREVWSUNFX0NIQUlOCisgIH07CisKKyN1bmRlZiBHUl9JTklUX0RFVklDRV9DSEFJTgorI2RlZmluZSBHUl9JTklUX0RFVklDRV9DSEFJTiAgJmdyX3gxMV9kZXZpY2VfY2hhaW4KKworI2VuZGlmICAvKiBHUl9JTklUX0JVSUxEICovCisKKyNlbmRpZiAvKiBHUlgxMV9IICovCmRpZmYgLS1naXQgYS9kZW1vcy9ncmFwaC9taWdzLmh0bWwgYi9kZW1vcy9ncmFwaC9taWdzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY1YjljOQotLS0gL2Rldi9udWxsCisrKyBiL2RlbW9zL2dyYXBoL21pZ3MuaHRtbApAQCAtMCwwICsxLDMwNCBAQAorPCFkb2N0eXBlIGh0bWwgcHVibGljICItLy93M2MvL2R0ZCBodG1sIDQuMCB0cmFuc2l0aW9uYWwvL2VuIj4KKzxodG1sPgorPGhlYWQ+CisgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KKyAgIDxtZXRhIG5hbWU9IkdFTkVSQVRPUiIgY29udGVudD0iTW96aWxsYS80LjYgW2VuXSAoWDExOyBJOyBMaW51eCAyLjIuOS0xOW1kayBpNTg2KSBbTmV0c2NhcGVdIj4KKzwvaGVhZD4KKzxib2R5PgorCis8Y2VudGVyPjxmb250IHNpemU9KzI+TWlHUyBPdmVydmlldzwvZm9udD4KKzxicj48Zm9udCBzaXplPSsyPkEgTWluaW1hbGlzdCBHcmFwaGljcyBTdWJzeXN0ZW08L2ZvbnQ+Cis8cD4KKzxociBXSURUSD0iMTAwJSI+PC9jZW50ZXI+CisKKzxoMT4KKzxmb250IHNpemU9KzA+SW50cm9kdWN0aW9uPC9mb250PjwvaDE+CisKKzxibG9ja3F1b3RlPlRoaXMgZG9jdW1lbnQgZGV0YWlscyB0aGUgZGVzaWduIGFuZCBpbXBsZW1lbnRhdGlvbiBvZiBNaUdTLAordGhlIG1pbmltYWxpc3QgZ3JhcGhpY3Mgc3Vic3lzdGVtIHVzZWQgYnkgdGhlIEZyZWVUeXBlIDIgZGVtb25zdHJhdGlvbgorcHJvZ3JhbXMuIEl0cyBwdXJwb3NlIGlzIG1haW5seSB0byBoZWxwIHdyaXRlcnMgb2YgbmV3IGRlbW8gcHJvZ3JhbXMsIGFzCit3ZWxsIGFzIGRldmVsb3BlcnMgd2hvIHdvdWxkIGxpa2UgcG9ydCB0aGUgc3Vic3lzdGVtIHRvIG90aGVyIHBsYXRmb3Jtcy48L2Jsb2NrcXVvdGU+CisKKzxociBXSURUSD0iMTAwJSI+Cis8aDE+CitJIC0gRGVzaWduIGdvYWxzPC9oMT4KKworPGJsb2NrcXVvdGU+TWlHUyBpcyBhIHRpbnkgZ3JhcGhpY3Mgc3Vic3lzdGVtIHVzZWQgdG8gZGVtbyB0ZXh0IHJlbmRlcmluZwordGhyb3VnaCB0aGUgRnJlZVR5cGUgbGlicmFyeS4gSXQgd2FzIG1haW5seSB3cml0dGVuIHRvIHByb3ZpZGUgdGhlIGFiaWxpdGllcwordG8gOjwvYmxvY2txdW90ZT4KKworPHVsPgorPHVsPgorPGxpPgorZHJhdyBhIG1vbm9jaHJvbWUgZ2x5cGggYml0bWFwIHRvIG1hbnkga2luZHMgb2YgdGFyZ2V0IHN1cmZhY2VzIChpLmUuIHJlYWxseQorYml0bWFwcy9waXhtYXBzKTwvbGk+CisKKzxsaT4KK2RyYXcgYW4gYW50aS1hbGlhc2VkIGdseXBoIGJpdG1hcCwgd2l0aCBhbnkgbGV2ZWwgb2YgZ3JheXMsIHRvIG1hbnkga2luZHMKK29mIHRhcmdldCBzdXJmYWNlczwvbGk+CisKKzxsaT4KK2Rpc3BsYXkgYSBzaW1wbGUgd2luZG93IG9uIG1hbnkgc3lzdGVtcyBsaWtlIFgxMSwgT1MvMiBhbmQgV2luZG93czwvbGk+CisKKzxsaT4KK2FjY2VwdCBzaW1wbGUgZXZlbnRzIChrZXlwcmVzc2VzIGFuZCBtb3VzZSBidXR0b25zKSBpbiB0aGlzIHdpbmRvdy48L2xpPgorCis8bGk+Cit0byBiZSBwb3J0YWJsZSBhbmQgcHJlc2VudCBhIHVuaWZpZWQgQVBJIG9uIGFsbCBydW5uaW5nIHN5c3RlbXM8L2xpPgorPC91bD4KKworPHA+PGJyPk1pR1MgdXNlcyBzeXN0ZW0tc3BlY2lmaWMgImRyaXZlcnMiIGluIG9yZGVyIHRvIHBlcmZvcm0gZGlzcGxheQorYW5kIGV2ZW50IGhhbmRsaW5nLiBUaGUgYmxpdHRpbmcgZnVuY3Rpb25zIGFyZSBub3QgZGV2aWNlLXNwZWNpZmljLiBNaUdTCitjYW4gYmUgYnVpbHQgYW5kL29yIHVzZWQgd2l0aCBubyBzeXN0ZW0tc3BlY2lmaWMgZmVhdHVyZXMsIGxpa2UgZm9yIGV4YW1wbGUsCit0byBnZW5lcmF0ZSBzaW1wbGUgR0lGLCBQTkcsIFRJRkYsIGV0Yy4uIGltYWdlcyB3aXRob3V0IGV2ZXIgbmVlZGluZyB0bworZGlzcGxheSB0aGVtLjwvdWw+CisKKzxoMT4KKworPGhyIFdJRFRIPSIxMDAlIj48L2gxPgorCis8aDE+CitJSSAtIFN1cmZhY2VzLCBiaXRtYXBzIGFuZCB3aW5kb3dzPC9oMT4KKworPGJsb2NrcXVvdGU+QSBzdXJmYWNlIGluIE1pR1MgbW9kZWxzIGEgZHJhd2FibGUgcmVnaW9uIHdoZXJlIGdseXBoIGltYWdlcworY2FuIGJlIHJlbmRlcmVkLCBhIHN1cmZhY2UgYWx3YXlzIGNvbnRhaW5zIGEgYml0bWFwIGRlc2NyaXB0b3IgYXMgd2VsbAorYXMgYSBmZXcgb3RoZXIgdGhpbmdzIHRoYXQgd2lsbCBiZSBkZXNjcmliZWQgbGF0ZXIgaW4gdGhpcyBzZWN0aW9uLgorPHA+U29tZSBzdXJmYWNlcyBjYW4gYmUgZGlzcGxheWVkLCB0aGV5IGFyZSB0aGVuIGVpdGhlciBjYWxsZWQgPGk+d2luZG93ZWQKK3N1cmZhY2VzPC9pPiBvciA8aT5zY3JlZW4gc3VyZmFjZXM8L2k+IGRlcGVuZGluZyBvbiB0aGUgbmF0dXJlIG9mIHRoZSA8aT5kZXZpY2U8L2k+Cit1c2VkIHRvIGRpc3BsYXkgdGhlbS4gRWFjaCA8aT5kZXZpY2U8L2k+IGlzIGltcGxlbWVudGVkIGJ5IGEgdmVyeSBzaW1wbGUKKzxpPmRyaXZlcjwvaT4gaW4gdGhlIE1pR1MgY29kZS4gSGVyZSBhcmUgYSBmZXcgZXhhbXBsZSBkZXZpY2VzIHRoYXQgYXJlCitvciBjb3VsZCBiZSB3cml0dGVuIHRvIGRpc3BsYXkgc3VyZmFjZXMgOgorPHA+LSBhbiBYMTEgZGV2aWNlCis8YnI+LSBhIFdpbiAzMiBHREkgZGV2aWNlCis8YnI+LSBhbiBPUy8yIFByZXNlbnRhdGlvbiBNYW5hZ2VyIGRldmljZQorPGJyPi0gYSBmdWxsc2NyZWVuIFNWR0FMaWIgZGV2aWNlIG9uIExpbnV4Cis8YnI+LSBhIEdHSSB2aXN1YWwgZGV2aWNlCis8YnI+LSBhbiBPUy8yICJEaXZlIiBkZXZpY2UsIG9yIHRoZSBlcXVpdmFsZW50IFdpbjMyICJEaXJlY3RYIiBkZXZpY2UKKzxwPmV0Yy4uCis8cD48Yj5OT1RFOiA8L2I+Rm9yIG5vdywgb25seSB0aGUgWDExIGRldmljZSB3YXMgd3JpdHRlbiBhbmQgdGVzdGVkLi4gTW9yZQorZGV2aWNlcyBzaG91bGQgY29tZSBsYXRlcgorPHA+QmVmb3JlIGV4cGxhaW5pbmcgaG93IHRvIGNyZWF0ZSBhIHN1cmZhY2UsIHdlIG5lZWQgdG8gZXhwbGFpbiBob3cgTWlHUworbWFuYWdlcyBiaXRtYXBzIGFuZCByZW5kZXJzIGdseXBoIGltYWdlcyB0byB0aGVtLgorPGgzPgorMS4gQml0bWFwcyA6PC9oMz4KKworPGJsb2NrcXVvdGU+QSBiaXRtYXAgaW4gTWlHUyBmZWF0dXJlcyB0aGUgZm9sbG93aW5nIHRoaW5ncyA6Cis8dWw+Cis8bGk+CithIDxiPjxpPndpZHRoPC9pPjwvYj4gaW4gcGl4ZWxzPC9saT4KKworPGxpPgorYSA8Yj48aT5oZWlnaHQ8L2k+PC9iPiBpbiBwaXhlbHM8L2xpPgorCis8bGk+CithIDxiPjxpPnBpeGVsIG1vZGU8L2k+PC9iPiwgd2hpY2ggaW5kaWNhdGVzIGhvdyB0aGUgcGl4ZWxzIGFyZSBzdG9yZWQgaW4KK3RoZSBzdXJmYWNlJ3MgYnVmZmVyPC9saT4KKworPGxpPgorYSA8Yj48aT5waXRjaDwvaT48L2I+LCB3aG9zZSBhYnNvbHV0ZSB2YWx1ZXMgaXMgdGhlIG51bWJlciBvZiBieXRlcyB0YWtlbgorYnkgZWFjaCBzdXJmYWNlIHJvdzwvbGk+CisKKzxsaT4KK2EgPGI+PGk+bnVtYmVyPC9pPjwvYj4gb2YgdmFsaWQgPGI+PGk+Z3JheTwvaT48L2I+IGxldmVscyAoc2VlIGJlbG93KTwvbGk+CisKKzxsaT4KK2EgPGI+PGk+YnVmZmVyPC9pPjwvYj4sIGhvbGRpbmcgdGhlIHN1cmZhY2UncyBwaXhlbHM8L2xpPgorPC91bD4KKworPHA+PGJyPk1pR1MgdXNlcyB0aGUgPGk+IlkgZG93bndhcmRzIjwvaT4gY29udmVudGlvbiwgd2hpY2ggbWVhbnMgdGhhdAorPGk+aW5jcmVhc2luZworWTwvaT4gY29vcmRpbmF0ZXMgY29ycmVzcG9uZCB0byA8aT5sb3dlciByb3dzPC9pPiBvZiB0aGUgYml0bWFwLiBIZW5jZSwKK3RoZSBjb29yZGluYXRlIDxpPigwLDApPC9pPiBhbHdheXMgY29ycmVzcG9uZHMgdG8gdGhlIGJpdG1hcCdzCis8aT50b3AtbGVmdAorcGl4ZWw8L2k+LgorPHA+VGhlIGJpdG1hcCdzIHJvd3MgY2FuIGJlIHN0b3JlZCBlaXRoZXIgPGk+ImRvd253YXJkcyI8L2k+IG9yIDxpPiJ1cHdhcmRzIjwvaT4KK2luIHRoZSBwaXhlbCBidWZmZXIuCis8cD5JbiB0aGUgZmlyc3QgY2FzZSAoPGk+ZG93bndhcmRzPC9pPiksIGluY3JlYXNpbmcgbWVtb3J5IGFkZHJlc3NlcyBpbgordGhlIHBpeGVsIGJ1ZmZlciBjb3JyZXNwb25kIHRvIGxvd2VyIHJvd3Mgb2YgdGhlIGJpdG1hcChlLmcuIFBDIHZpZGVvIG1vZGVzKSwKK2FuZCB0aGUgPGI+PGk+cGl0Y2g8L2k+PC9iPiBzaG91bGQgYmUgZXF1YWwgdG8gPGI+PGk+dGhlIG51bWJlciBvZiBieXRlcwordGFrZW4gYnkgZWFjaCByb3c8L2k+PC9iPi4gVGhlIGZpcnN0IHBpeGVsIGJ1ZmZlciBieXRlIGNvcnJlc3BvbmRzIHRvIHRoZQordXBwZXIgcm93LgorPHA+SW4gdGhlIHNlY29uZCBjYXNlICg8aT51cHdhcmRzPC9pPiksIGluY3JlYXNpbmcgbWVtb3J5IGFkZHJlc3NlcyBpbgordGhlIHBpeGVsIGJ1ZmZlciBjb3JyZXNwb25kIHRvIHVwcGVyIHJvd3Mgb2YgdGhlIGJpdG1hcCBhbmQgdGhlIDxiPjxpPnBpdGNoPC9pPjwvYj4KK3Nob3VsZCBiZSBlcXVhbCB0byB0aGUgPGI+PGk+b3Bwb3NpdGU8L2k+PC9iPiBvZiA8aT50aGUgbnVtYmVyIG9mIGJ5dGVzCit0YWtlbiBieSBlYWNoIHJvdzwvaT4uIFRoZSBmaXJzdCBwaXhlbCBidWZmZXIgYnl0ZSBjb3JyZXNwb25kcyB0byB0aGUgbG93ZXIKK3Jvdy4KKzxwPkluIGFsbCBjYXNlcywgdGhlIDxiPjxpPnBpdGNoPC9pPjwvYj4gaXMgdGhlIDxpPmluY3JlbWVudCB0byBiZSB1c2VkCit0byBnbyBmcm9tIG9uZSBiaXRtYXAgcm93IHRvIHRoZSBvbmUgYmVsb3cgaXQ8L2k+LgorPHA+VGhlIHN1cHBvcnRlZCBwaXhlbCBtb2RlcyBhcmUgOgorPHVsPgorPGxpPgorMS1iaXQgbW9ub2Nocm9tZSBiaXRtYXBzLiBXaXRoICIwIiBhcyB0aGUgYmFja2dyb3VuZCwgYW5kICIxIiBhcyB0aGUgZm9yZWdyb3VuZC48L2xpPgorCis8bGk+Cis0LWJpdCBjb2xvciBiaXRtYXBzLCB1c2luZyBhbiBhcmJpdHJhcnkgcGFsZXR0ZS48L2xpPgorCis8bGk+Cis4LWJpdCBjb2xvciBiaXRtYXBzLCB1c2luZyBhbiBhcmJpdHJhcnkgcGFsZXR0ZS48L2xpPgorCis8bGk+Cis4LWJpdCBncmF5IGJpdG1hcHMsIHVzaW5nIGEgZ2l2ZW4gTiBudW1iZXIgb2YgZ3JheSBsZXZlbHMgaW4gdGhlIHJhbmdlCiswLi5OLTEuPC9saT4KKworPGxpPgorMTUtYml0IGNvbG9yIGJpdG1hcHMsIGFsc28ga25vd24gYXMgUkdCNTU1PC9saT4KKworPGxpPgorMTYtYml0IGNvbG9yIGJpdG1hcHMsIGFsc28ga25vd24gYXMgUkdCNTY1PC9saT4KKworPGxpPgorMjQtYml0IGNvbG9yIGJpdG1hcHMsIGFsc28ga25vd24gYXMgUkdCPC9saT4KKworPGxpPgorMzItYml0IGNvbG9yIGJpdG1hcHMsIGFsc28ga25vd24gYXMgUkdCQSAodGhvdWdoIHRoZSBBIGlzIGlnbm9yZWQgYnkgTWlHUyk8L2xpPgorPC91bD4KK1RoZSBiaXRtYXAncyA8Yj48aT5udW1iZXIgb2YgZ3JheSBsZXZlbHM8L2k+PC9iPiBpcyBvbmx5IHJlbGV2YW50IGZvciA8Yj48aT44LWJpdAorZ3JheSBiaXRtYXBzPC9pPjwvYj4sIGFuZCBpbmRpY2F0ZXMgdGhlIHJhbmdlIG9mIGdyYXkgbGV2ZWxzIHRoYXQgY2FuIGJlCitmb3VuZCBpbiB0aGUgYml0bWFwLiBJZiBhIGJpdG1hcCBhcyBOIGdyYXkgbGV2ZWxzLCBpdCBpcyBzYWlkIHRvIGJlIDxpPk4tZ3JheXNjYWxlczwvaT4sCithbmQgdGhlIHBpeGVscyB3aXRoaW4gaXQgbXVzdCBhbGwgaGF2ZSB2YWx1ZXMgYmV0d2VlbiAwLCBjb25zaWRlcmVkIGFzCit0aGUgPGk+YmFja2dyb3VuZDwvaT4gY29sb3IsIGFuZCBOLTEsIGNvbnNpZGVyZWQgYXMgdGhlIDxpPmZvcmVncm91bmQ8L2k+Citjb2xvci4KKzxwPk4tZ3JheXNjYWxlIGJpdG1hcHMgYXJlIGNydWNpYWwgZm9yIHRoZSByZW5kZXJpbmcgb2YgYW50aS1hbGlhc2VkIHRleHQuCis8YnI+Jm5ic3A7PC9ibG9ja3F1b3RlPgorCis8aDM+CisyLiBHbHlwaCBpbWFnZXMgOjwvaDM+CisKKzxibG9ja3F1b3RlPlRoZSBnbHlwaCBpbWFnZXMgdGhhdCBjYW4gYmUgZHJhd24gb24gYml0bWFwcyB0aHJvdWdoIE1pR1MKK2FyZSBiaXRtYXBzIHRoZW1zZWx2ZXMsIHRob3VnaCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgcGl4ZWwgbW9kZXMgOgorPHA+PGI+MS1iaXQgbW9ub2Nocm9tZSBnbHlwaCBiaXRtYXBzPC9iPgorPGJsb2NrcXVvdGU+VGhlc2UgY2FuIGJlIGRyYXduIG9uIGFueSBraW5kIG9mIGJpdG1hcC4gTm90ZSB0aGF0IDxpPm9ubHkKK3RoZSAibGl0IiBwaXhlbHM8L2k+IChpLmUuIHRoZSBiaXRzIHNldCB0byAxKSBhcmUgZWZmZWN0aXZlbHkgZHJhd24gdG8KK3RoZSB0YXJnZXQsIGFzIG9wYXF1ZSBibGl0dGluZyBpc24ndCBzdXBwb3J0ZWQgKHJlbWVtYmVyLCBpdCdzIGEgbWluaW1hbGlzdAorbGlicmFyeSAhKTwvYmxvY2txdW90ZT4KKworPHA+PGJyPjxiPk4tZ3JheXNjYWxlcyBnbHlwaCBpbWFnZXMgPC9iPih3aXRoIGFueSB2YWx1ZSBvZiBOID49IDIpCis8YmxvY2txdW90ZT5UaGVzZSBjYW4gYmUgZHJhd24gdG8gPGk+YWxsIFJHQiBiaXRtYXBzPC9pPiAoMTUsIDE2LCAyNCAmYW1wOworMzIgYml0cy9waXhlbCksIGFzIHdlbGwgYXMgYW55IG90aGVyIE0tZ3JheXNjYWxlcyBiaXRtYXBzLiBJbiB0aGUgbGF0dGVyCitjYXNlLCB0aGUgdmFsdWVzIG9mIE4gYW5kIE0gPGk+bmVlZCBub3QgYmUgZXF1YWw8L2k+LCBhcyB0aGUgbGlicmFyeSBpcworYWJsZSB0byBwZXJmb3JtIGF1dG9tYXRpYyBjb252ZXJzaW9ucyA8aT5vbiB0aGUgZmx5PC9pPi4KKzxwPkZvciBleGFtcGxlLCBpdCBpcyBwb3NzaWJsZSB0byByZW5kZXIgYSA1LWdyYXlzY2FsZXMgZ2x5cGggaW1hZ2UgaW50bworYSAxMjgtZ3JheXNjYWxlcyBiaXRtYXAuIE1vcmVvdmVyLCBpdCBpcyBhbHNvIHBvc3NpYmxlIHRvIHJlbmRlciBhIDE3LWdyYXlzY2FsZXMKK2dseXBoIGltYWdlIGludG8gYSA1LWdyYXlzY2FsZXMgYml0bWFwLCBldmVuIGlmIHRoaXMgd2lsbCByZXN1bHQgaW4gPGk+YQorbG9zcyBvZiBxdWFsaXR5PC9pPi4gVGhpcyBmZWF0dXJlIGlzIGNydWNpYWwgaW4gb3JkZXIgdG8gZXhwZXJpbWVudCBlYXNpbHkKK3dpdGggb3RoZXIgYW50aS1hbGlhc2luZyBhbGdvcml0aG1zIGZvciBGcmVlVHlwZQorPGJyPiZuYnNwOzwvYmxvY2txdW90ZT4KK05vdGUgdGhhdCB5b3UgY2FuIDxpPm9ubHk8L2k+IGRyYXcgPGk+bW9ub2Nocm9tZTwvaT4gYml0bWFwcyB0byB0aGUgZm9sbG93aW5nCitwaXhlbCBtb2RlcyA6IG1vbm9jaHJvbWUsIDQtYml0IGNvbG9yIGFuZCA4LWJpdCBjb2xvci48L2Jsb2NrcXVvdGU+CisKKzxoMz4KKzMuIFdpbmRvd3MgYW5kIFNjcmVlbnM6PC9oMz4KKworPGJsb2NrcXVvdGU+SW4gb3JkZXIgdG8gZGVidWcgRnJlZVR5cGUsIGRpc3BsYXlpbmcgYSBzdXJmYWNlIGluIGEgd2luZG93CitvciBpbiBmdWxsLXNjcmVlbiBtb2RlLCBpcyByZXF1aXJlZC4gTWlHUyB0aHVzIG1ha2VzIGEgZGlmZmVyZW5jZSBiZXR3ZWVuCis8aT5zaW1wbGUKK3N1cmZhY2VzPC9pPiwgd2hpY2ggb25seSBjb250YWluIGEgYml0bWFwLCA8aT53aW5kb3dlZCBzdXJmYWNlczwvaT4sIHdoaWNoCithcmUgdXNlZCB0byBkaXNwbGF5IHRoZWlyIGNvbnRlbnQgaW4gYSB3aW5kb3csIGFuZCA8aT5zY3JlZW4gc3VyZmFjZXM8L2k+LAord2hpY2ggYXJlIHVzZWQgdG8gZGlzcGxheSB0aGVpciBjb250ZW50IGluIGEgZnVsbC1zY3JlZW4gbW9kZSAoU1ZHQWxpYiwKK0RpcmVjdFgsIEdHSSBvciB3YXRoZXZlcikuCis8cD5BIGZldyBpbXBvcnRhbnQgdGhpbmdzIG11c3QgYmUgc2FpZCBhYm91dCBub24tc2ltcGxlIHN1cmZhY2VzLgorPGJyPiZuYnNwOworPHVsPgorPGxpPgorRmlyc3QsIHRoZXkgbWlnaHQgY29udGFpbiBzb21lIHN5c3RlbS1zcGVjaWZpYyBkYXRhIHdoaWNoIGlzIHVzZWQgdG8gbWFuYWdlCit0aGUgZGlzcGxheSBpbiBhIHdpbmRvdyBvciBvbiB0aGUgc2NyZWVuLiBUaGlzIG11c3QgYmUgPGk+Y29tcGxldGVseSBoaWRkZW48L2k+Cit0byBNaUdTIGNsaWVudHMuIEluZGVlZCwgcmVuZGVyaW5nIHRvIGFueSBraW5kIG9mIHN1cmZhY2UgaXMgYWNoaWV2ZWQgdGhyb3VnaAorPGk+ZXhhY3RseQordGhlIHNhbWUgZnVuY3Rpb24gY2FsbHM8L2k+LjwvbGk+Cis8L3VsPgorCis8dWw+Cis8bGk+CitTZWNvbmQsIHRoZXkgbWF5IGNvbnRhaW4gYSBiaXRtYXAgd2hvc2UgcGl4ZWwgbW9kZSBkb2Vzbid0IGNvcnJlc3BvbmQgdG8KK3RoZSBzY3JlZW4ncyBkZXB0aCB1c2VkIHRvIGRpc3BsYXkgaXQuIEZvciBleGFtcGxlLCB0aGUgc3VyZmFjZSBtaWdodCBjb250YWluCithbiAxMjgtZ3JheXNjYWxlIGJpdG1hcCwgd2hpbGUgdGhlIHNjcmVlbiBpcyBpbiBSR0IyNCBtb2RlLiBTb21lIGNvbnZlcnNpb24KK211c3QgYmUgcGVyZm9ybWVkIHRvIGRpc3BsYXkgdGhlIHN1cmZhY2UuIFRoaXMgY2FuIGVpdGhlciBoYXBwZW4gaW4gdGhlCitzeXN0ZW0tc3BlY2lmaWMgZ3JhcGhpY3MgbGlicmFyeSAoZS5nLiBvbiBPUy8yLCBhIHNpbmdsZSBQcmVzZW50YXRpb24gTWFuYWdlcgorY2FsbCBpcyB1c2VkIHRvIGJsaXQgYSBOLWdyYXlzY2FsZSBpbWFnZSB0byA8aT5hbnk8L2k+IGtpbmQgb2Ygd2luZG93KQorb3IgaW4gdGhlIHN5c3RlbS1zcGVjaWZpYyBwYXJ0IG9mIE1pR1MgKGUuZy4gdGhlIFgxMSBNaUdTIGRyaXZlciBtdXN0IGNvbnZlcnQKK3RoZSBzdXJmYWNlJ3MgYml0bWFwIGludG8gdGhlIGFwcHJvcHJpYXRlIDxpPlgxMSBpbWFnZTwvaT4gZWFjaCB0aW1lIGEKK3JlcGFpbnQgaXMgcmVxdWVzdGVkKS4gQWdhaW4gdGhpcyBtdXN0IGJlIGNvbXBsZXRlbHkgaGlkZGVuIHRvIE1pR1MgY2xpZW50czwvbGk+Cis8L3VsPgorU3VyZmFjZXMgaGF2ZSBhbHNvIGEgZmV3IGZpZWxkcyB0aGF0IGFyZSBvbmx5IHVzZWQgd2hlbiBkaXNwbGF5aW5nIHRoZW0KK2luIFdpbmRvd3MgOgorPHA+PGI+YSB0aXRsZSBzdHJpbmc8L2I+Cis8YmxvY2txdW90ZT5UaGlzIGlzIHNpbXBseSBhIHRleHQgc3RyaW5nIHRoYXQgaXMgZGlzcGxheWVkIG9uIHRoZSB0aXRsZQorYmFyIG9mIHRoZSBzdXJmYWNlJ3Mgd2luZG93LiBJdCBjYW4gYWxzbyBhcHBlYXIgYXQgdGhlIHRvcCBvciBib3R0b20gb2YKK2Z1bGwtc2NyZWVuIHN1cmZhY2VzIGlmIHRoZSBNaUdTIGRyaXZlciBzdXBwb3J0cyBpdC4gVGhlIHRpdGxlIHN0cmluZyBjYW4KK2JlIGNoYW5nZWQgd2l0aCBhIGNhbGwgdG8gPHR0PmdyU2V0VGl0bGU8L3R0PiwgYW5kIGlzIGlnbm9yZWQgZm9yIHNpbXBsZQorc3VyZmFjZXMuPC9ibG9ja3F1b3RlPgorCis8cD48YnI+PGI+YSByZWZyZXNoIGZsYWc8L2I+Cis8YmxvY2txdW90ZT5UaGlzIGJvb2xlYW4gZmxhZyBpcyBvbmx5IHVzZWQgZm9yIHdpbmRvdyBzdXJmYWNlcywgYW5kIHNvbWUKK2Z1bGxzY3JlZW4gb25lcyAoZGVwZW5kaW5nIG9uIHRoZSBkcml2ZXIgaW1wbGVtZW50YXRpb24pLiBXaGVuIHNldCwgaXQKK2luZGljYXRlcyB0aGF0IGVhY2ggZ2x5cGggaW1hZ2UgYmxpdCBtdXN0IGJlIGRpc3BsYXllZCBpbW1lZGlhdGVseS4gQnkKK2RlZmF1bHQsIHRoaXMgZmxhZyBpcyBzZXQgdG8gRmFsc2UsIHdoaWNoIG1lYW5zIHRoYXQgZGVtbyBwcm9ncmFtcyBtdXN0CitjYWxsIHRoZSA8dHQ+Z3JSZWZyZXNoU3VyZmFjZShzdXJmYWNlKTwvdHQ+IGZ1bmN0aW9uIHRvIGRpc3BsYXkgdGhlIHdob2xlCitjb250ZW50cyBvZiBhIHN1cmZhY2Ugb25lIGl0IGhhcyBiZWVuIHVwZGF0ZWQuCis8cD5UaGUgcmVmcmVzaCBmbGFnIGNhbiBiZSBzZXQgd2l0aCA8dHQ+Z3JTZXRTdXJmYWNlUmVmcmVzaChzdXJmYWNlLGZsYWcpPC90dD4uCitOb3RlIHRoYXQgYSBzaW5nbGUgc3VyZmFjZSByZWN0YW5nbGUgY2FuIGJlIGZvcmNlZCB0byBiZSBkaXNwbGF5ZWQgd2l0aAorYSBjYWxsIHRvIDx0dD5nclJlZnJlc2hSZWN0YW5nbGUoc3VyZmFjZSx4LHksdyxoKTwvdHQ+IGF0IGFueSB0aW1lLjwvYmxvY2txdW90ZT4KKzwvYmxvY2txdW90ZT4KKworPGgzPgorNC4gRGV2aWNlcyA6PC9oMz4KKworPGJsb2NrcXVvdGU+QXMgc2FpZCBiZWZvcmUsIGVhY2ggZGV2aWNlIGlzIGluIGNoYXJnZSBvZiBkaXNwbGF5aW5nIGEgc3VyZmFjZQoraW4gYSBnaXZlbiB3aW5kb3cgb3Igc2NyZWVuLiBFYWNoIGRldmljZSBpcyBtYW5hZ2VkIHRocm91Z2ggYSB2ZXJ5IHNpbXBsZQorZHJpdmVyLCBkZXNjcmliZWQgdG8gTWlHUyB0aHJvdWdoIGEgdmVyeSBzaW1wbGUgImdyRGV2aWNlIiBzdHJ1Y3R1cmUuCis8cD5BIGdyRGV2aWNlIGNvbnRhaW5zLCBhbW9uZyBvdGhlciB0aGluZ3MsIHBvaW50ZXJzIHRvIHRoZSBmdW5jdGlvbnMgdXNlZAordG86Cis8cD4tIHJlZnJlc2gvZGlzcGxheSBhIGdpdmVuIHJlY3RhbmdsZSBvZiB0aGUgc3VyZmFjZSB0byB0aGUgd2luZG93L3NjcmVlbgorPGJyPi0gbGlzdGVuIGV2ZW50cyAoa2V5IHByZXNzZXMgYW5kIG1vdXNlKSBhbmQgc2VuZCB0aGVtIGJhY2sgdG8gY2xpZW50CithcHBzLgorPGJyPi0gZm9yIHdpbmRvd2VkIGRldmljZXMsIHVwZGF0ZSB0aGUgdGl0bGUgYmFyLgorPHA+QXMgc2FpZCBiZWZvcmUsIHRoaXMgaXMgYSBoaWdobHkgbWluaW1hbGlzdCBzeXN0ZW0uLgorPGJyPiZuYnNwOzwvYmxvY2txdW90ZT4KKzwvYmxvY2txdW90ZT4KKworPGhyIFdJRFRIPSIxMDAlIj4KKzxoMT4KK0lJSSAtIEltcG9ydGFudCBpbXBsZW1lbnRhdGlvbiBpc3N1ZXMgOjwvaDE+CisKKzxibG9ja3F1b3RlPgorPGgzPgorMS4gRGlzcGxheSBzdXJmYWNlIG5lZ29jaWF0aW9uIDo8L2gzPgorCis8YmxvY2txdW90ZT5BIGRpc3BsYXkgc3VyZmFjZSBpcyBjcmVhdGVkIHdpdGggdGhlIGZ1bmN0aW9uIGdyTmV3U2NyZWVuU3VyZmFjZQord2hpY2ggdGFrZXMgcGFyYW1ldGVycyBpbmRpY2F0aW5nIHdoaWNoIGRldmljZSBzaG91bGQgYmUgdXNlZCwgdGhlIHBpeGVsCitkaW1lbnNpb25zIG9mIHRoZSByZXF1ZXN0ZWQgc3VyZmFjZSwgYXMgd2VsbCBhcyBpdHMgcGl4ZWwgbW9kZS4KKzxwPkJlY2F1c2Ugb2Ygc29tZSBkZXZpY2Utc3BlY2lmaWMgbGltaXRhdGlvbnMsIHRoZSByZXN1bHRpbmcgc3VyZmFjZSdzCitwcm9wZXJ0aWVzIG1pZ2h0IG5vdCBtYXRjaCBleGFjdGx5IHRob3NlIHJlcXVlc3RlZCBmb3IgdGhlIGNhbGwuIEhlbmNlLAorYSBkZXZlbG9wcGVyIHNob3VsZCA8Yj5hbHdheXMgdGFrZSBjYXJlIDwvYj5vZiByZWFkaW5nIGEgbmV3IGRpc3BsYXkgc3VyZmFjZSdzCis8Yj5iaXRtYXA8L2I+IGRlc2NyaXB0b3IgaW4gb3JkZXIgdG8gZ2V0IGl0cyA8aT5yZWFsPC9pPiBkaW1lbnNpb25zLCBwaXhlbAorbW9kZSBhbmQgZXZlbnR1YWxseSBudW1iZXIgb2YgZ3JheXMuCis8cD5UaGUgZnVuY3Rpb24gZ3JOZXdTdXJmYWNlIHdpbGwgY3JlYXRlIGEgbWVtb3J5IHN1cmZhY2Ugd2l0aCB0aGUgY29ycmVzcG9uZGluZworYml0bWFwLgorPGJyPlRoZSBmdW5jdGlvbiBnck5ld0JpdG1hcFN1cmZhY2Ugd2lsbCBjcmVhdGUgYSBzdXJmYWNlIGZyb20gYSBwcmUtZXhpc3RpbmcKK2JpdG1hcC4mbmJzcDtUaGlzIGlzIHVzZWZ1bCB0byBkcmF3IHRleHQgb24gbG9hZGVkIGltYWdlcywgZm9yIGV4YW1wbGUuCis8cD5Bbnkgc3VyZmFjZSAoZGlzcGxheSBvciBub3QpIGlzIGRlc3Ryb3llZCB3aXRoIGdyRG9uZVN1cmZhY2UuPC9ibG9ja3F1b3RlPgorCis8aDM+Cis8L2gzPgorCis8aDM+CisyLiBTdXBwb3J0aW5nIDgtYml0IGdyYXlzY2FsZSBtb2RlIDo8L2gzPgorCis8YmxvY2txdW90ZT5JdCBpcyBpbXBvcnRhbnQsIGZvciB0aGUgZGVidWdnaW5nIG9mIEZyZWVUeXBlIGFudGktYWxpYXNlZAorcmVuZGVyZXIocyksIHRoYXQgPGI+PGk+X2FsbF8gZGV2aWNlcyBzaG91bGQgc3VwcG9ydCB0aGUgOC1iaXQgZ3JheSBtb2RlPC9pPjwvYj4uCitUaGUgbnVtYmVyIG9mIGdyYXkgbGV2ZWxzIGNhbiBiZSBmaXhlZCBvciBuZWdvY2lhdGVkIGFzIHJlcXVpcmVkIGJ5IGltcGxlbWVudGF0aW9uLXNwZWNpZmljCitpc3N1ZXMuCis8cD5BcyBtb3N0IGV4aXN0aW5nIGRldmljZXMgZG8gbm90IHByb3ZpZGUgZGlyZWN0IHN1cHBvcnQgZm9yIHN1Y2ggYSBtb2RlLAorZWFjaCA4LWJpdCBzdXJmYWNlIG11c3QgdGh1cyBjb250YWluIDoKKzxwPi0gYW4gaW50ZXJuYWwgTi1ncmF5c2NhbGUgYml0bWFwLCB1c2VkIGFzIHRoZSB0YXJnZXQgb2YgYWxsIGdseXBoIGRyYXdpbmdzCis8YnI+LSBpdHMgb3duIGRldmljZS1zcGVjaWZpYyAiaW1hZ2UiLCB3aGljaCBtYXRjaGVzIHRoZSBkaXNwbGF5IGRlcHRoLgorPHA+RWFjaCB0aW1lIHRoZSBkZXZpY2UncyAicmVmcmVzaF9yZWN0IiBmdW5jdGlvbiBpcyBjYWxsZWQsIGl0IHNob3VsZAordGhlbiA6Cis8YnI+LSBjb252ZXJ0IHRoZSBncmF5c2NhbGVzIHdpdGhpbiB0aGUgYml0bWFwJ3MgcmVjdGFuZ2xlIGludG8gdGhlIGltYWdlJ3MKK2J1ZmZlciBhbmQgZm9ybWF0LgorPGJyPi0gZGlzcGxheSB0aGUgY29ycmVzcG9uZGluZyBpbWFnZSByZWN0YW5nbGUuCis8cD5UaGlzIHNjaGVtZSBpcyB1c2VkLCBmb3IgZXhhbXBsZSwgYnkgdGhlIFgxMSBkZXZpY2UuPC9ibG9ja3F1b3RlPgorPC9ibG9ja3F1b3RlPgorCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9kZW1vcy9ncmFwaC9ydWxlcy5tayBiL2RlbW9zL2dyYXBoL3J1bGVzLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzOTdlNTQKLS0tIC9kZXYvbnVsbAorKysgYi9kZW1vcy9ncmFwaC9ydWxlcy5tawpAQCAtMCwwICsxLDk5IEBACisjKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyMqCisjKiAgRnJlZVR5cGUgZGVtbyB1dGlsaXRpZXMgc3ViLU1ha2VmaWxlCisjKgorIyogIFRoaXMgTWFrZWZpbGUgaXMgdG8gYmUgaW5jbHVkZWQgYnkgImZyZWV0eXBlL2RlbW8vTWFrZWZpbGUiLiBJdHMKKyMqICBwdXJwb3NlIGlzIHRvIGNvbXBpbGUgTWlHUyAodGhlIE1pbmltYWxpc3QgR3JhcGhpY3MgU3Vic3lzdGVtKQorIyoKKyMqICBJdCBpcyB3cml0dGVuIGZvciBHTlUgTWFrZS4gT3RoZXIgbWFrZSB1dGlsaXRpZXMgYXJlIG5vdAorIyogIHN1cHBvcnRlZC4uICEhCisjKgorIyoKKyMqICBUaGUgZm9sbG93aW5nIHZhcmlhYmxlcyBtdXN0IGJlIGRlZmluZWQgOgorIyoKKyMqICBDRkxBR1MgICAgIDogQyBmbGFncyB0byB1c2Ugd2hlbiBjb21waWxpbmcgdGhlIHV0aWxpdGllcy4gVGhpcworIyogICAgICAgICAgICAgICBtdXN0IE5PVCBpbmNsdWRlIHRoZSAnLWMnIGZsYWcgdXNlZCB0byBzcGVjaWZ5IGEKKyMqICAgICAgICAgICAgICAgc2ltcGxlIGNvbXBpbGF0aW9uLgorIyoKKyMqICBJRkxBRyAgICAgIDogaW5jbHVkZSBwYXRoIGZsYWcuIFRoaXMgaXMgdHlwaWNhbGx5ICItSSIgYnV0IHNvbWUKKyMqICAgICAgICAgICAgICAgY29tcGlsZXJzIHVzZSBhIGRpZmZlcmVudCBjb252ZW50aW9uLi4KKyMqCisjKiAgTEZMQUcgICAgICA6IGFkZCBsaW5rIGRpcmVjdG9yeSBmbGFnLiBVc3VhbGx5ICctTCcgYnV0IGNvdWxkIGJlCisjKiAgICAgICAgICAgICAgIGRpZmZlcmVudC4uCisjKgorIyogIE9CSl9ESVIgICAgOiB0YXJnZXQgbG9jYXRpb24gb2YgdGhlIG9iamVjdCBmaWxlcworIyoKKyMqICBVVElMX0RJUiAgIDogbG9jYXRpb24gb2YgdGhlIHV0aWxpdGllcyBzb3VyY2VzLiBJLmUuIHRoaXMKKyMqICAgICAgICAgICAgICAgZGlyZWN0b3J5ICh1c3VhbGx5ICJmcmVldHlwZS9kZW1vL2dyYXBoIikuCisjKgorIyoKKyMqICBJdCBhbHNvIGRlZmluZXMgdGhlIGZvbGxvd2luZyB2YXJpYWJsZXMKKyMqCisjKiAgU0lNUExFX1VUSUxTIDogbGlzdCBvZiBvYmplY3QgZmlsZXMgZm9yIHRoZSBub24tZ3JhcGhpY2FsIHV0aWxpdGllcworIyoKKyMqICBHUkFQSF9VVElMUyAgOiBhbGwgb2JqZWN0IGZpbGVzLCBpbmNsdWRpbmcgdGhlIGdyYXBoaWNzIHN1Yi1zeXN0ZW0KKyMqCisjKiAgR1JBUEhfRkxBR1MgIDogYWRkaXRpb25hbCBjb21waWxlIGZsYWdzIGZvciBncmFwaGljYWwgYXBwcworIyogIEdSQVBIX0xJTksgICA6IGFkZGl0aW9uYWwgbGluayBmbGFncyBmb3IgZ3JhcGhpY2FsIGFwcHMKKyMqCisjKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMKKyMKKyMKKyMKKworR1JBUEhfSU5DTFVERVMgOj0gZ3JhcGgKK0dSQVBIX0xJQiAgICAgIDo9ICQoT0JKXylncmFwaC5hCitHUkFQSF9MSU5LICAgICA6PSAkKEdSQVBIX0xJQikKKworR1JBUEhfIDo9IGdyYXBoJChTRVApCisKK0dSQVBIX0ggOj0gJChHUkFQSF8pZ3JhcGguaCAgICBcCisgICAgICAgICAgICQoR1JBUEhfKWdydHlwZXMuaCAgXAorICAgICAgICAgICAkKEdSQVBIXylncm9ianMuaCAgIFwKKyAgICAgICAgICAgJChHUkFQSF8pZ3JkZXZpY2UuaCBcCisgICAgICAgICAgICQoR1JBUEhfKWdyYmxpdC5oCisKKworR1JBUEhfT0JKUyA6PSAkKE9CSl8pZ3JibGl0LiRPICAgXAorICAgICAgICAgICAgICAkKE9CSl8pZ3JvYmpzLiRPICAgXAorICAgICAgICAgICAgICAkKE9CSl8pZ3Jmb250LiRPICAgXAorICAgICAgICAgICAgICAkKE9CSl8pZ3JkZXZpY2UuJE8gXAorICAgICAgICAgICAgICAkKE9CSl8pZ3Jpbml0LiRPCisKKworIyBBZGQgdGhlIHJ1bGVzIHVzZWQgdG8gZGV0ZWN0IGFuZCBjb21waWxlIGdyYXBoaWNzIGRyaXZlciBkZXBlbmRpbmcKKyMgb24gdGhlIGN1cnJlbnQgcGxhdGZvcm0uLgorIworaW5jbHVkZSAkKHdpbGRjYXJkIGNvbmZpZy8qL3J1bGVzLm1rKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIEJ1aWxkIHRoZSAiZ3JhcGgiIGxpYnJhcnkgZnJvbSBpdHMgb2JqZWN0cy4gVGhpcyBzaG91bGQgYmUgY2hhbmdlZAorIyBpbiB0aGUgZnV0dXJlIGluIG9yZGVyIHRvIHN1cHBvcnQgbW9yZSBzeXN0ZW1zLiBQcm9iYWJseSBzb21ldGhpbmcKKyMgbGlrZSBhIGBjb25maWcvPHN5c3RlbT4nIGhpZXJhcmNoeSB3aXRoIGEgc3lzdGVtLXNwZWNpZmljIHJ1bGVzIGZpbGUKKyMgdG8gaW5kaWNhdGUgaG93IHRvIG1ha2UgYSBsaWJyYXJ5IGZpbGUsIGJ1dCBmb3Iga25vdywgSSdsbCBzdGljayB0bworIyB1bml4IGFuZCBPUy8yLWdjYy4uCisjCisjCiskKEdSQVBIX0xJQik6ICQoR1JBUEhfT0JKUykKKwlhciAtciAkQCAkKEdSQVBIX09CSlMpCisKKworIyBwYXR0ZXJuIHJ1bGUgZm9yIG5vcm1hbCBzb3VyY2VzCisjCiskKE9CSl8pJS4kTzogJChHUkFQSF8pJS5jICQoR1JBUEhfSCkKKwkkKENDKSAkKENGTEFHUykgJChHUkFQSF9JTkNMVURFUzolPSRJJSkgJFQkQCAkPAorCisKKyMgYSBzcGVjaWFsIHJ1bGUgaXMgdXNlZCBmb3IgJ2dyaW5pdC5vJyBhcyBpdCBuZWVkcyB0aGUgZGVmaW5pdGlvbgorIyBvZiBzb21lIG1hY3JvcyBsaWtlICItRERFVklDRV9YMTEiIG9yICItRERFVklDRV9PUzJfUE0iCisjCiskKE9CSl8pZ3Jpbml0LiRPOiAkKEdSQVBIXylncmluaXQuYworCSQoQ0MpICQoQ0ZMQUdTKSAkKEdSQVBIX0lOQ0xVREVTOiU9JEklKSAkSSQoREVWSUNFX0lOQ0xVREVTOiU9JEklKSAkVCRAICQ8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICQoREVWSUNFUzolPSREREVWSUNFXyUpCisKKwpkaWZmIC0tZ2l0IGEvZGVtb3MvZ3JhcGgveHRlc3QuYyBiL2RlbW9zL2dyYXBoL3h0ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGM2Mjk1ZQotLS0gL2Rldi9udWxsCisrKyBiL2RlbW9zL2dyYXBoL3h0ZXN0LmMKQEAgLTAsMCArMSwxMjUgQEAKKyNpbmNsdWRlICJncmFwaC5oIgorI2luY2x1ZGUgImdyZm9udC5oIiAgLyogZGlzcGFyYV5pdHJhIGJpZW50b3QgKi8KKyNpbmNsdWRlIDxzdGRpby5oPgorCisKK3N0YXRpYwordm9pZCBQYW5pYyggY29uc3QgY2hhciogIG1lc3NhZ2UgKQoreworICBmcHJpbnRmKCBzdGRlcnIsICJQQU5JQzogJXNcbiIsIG1lc3NhZ2UgKTsKKyAgZXhpdCgxKTsKK30KKworCit0eXBlZGVmIHN0cnVjdCBncktleU5hbWUKK3sKKyAgZ3JLZXkgICAgICAga2V5OworICBjb25zdCBjaGFyKiBuYW1lOworCit9IGdyS2V5TmFtZTsKKworCitzdGF0aWMKK2NvbnN0IGdyS2V5TmFtZSAga2V5X25hbWVzW10gPQoreworICB7IGdyS2V5RjEsICAgIkYxIiAgfSwKKyAgeyBncktleUYyLCAgICJGMiIgIH0sCisgIHsgZ3JLZXlGMywgICAiRjMiICB9LAorICB7IGdyS2V5RjQsICAgIkY0IiAgfSwKKyAgeyBncktleUY1LCAgICJGNSIgIH0sCisgIHsgZ3JLZXlGNiwgICAiRjYiICB9LAorICB7IGdyS2V5RjcsICAgIkY3IiAgfSwKKyAgeyBncktleUY4LCAgICJGOCIgIH0sCisgIHsgZ3JLZXlGOSwgICAiRjkiICB9LAorICB7IGdyS2V5RjEwLCAgIkYxMCIgfSwKKyAgeyBncktleUYxMSwgICJGMTEiIH0sCisgIHsgZ3JLZXlGMTIsICAiRjEyIiB9LAorICB7IGdyS2V5RXNjLCAgIkVzYyIgfSwKKyAgeyBncktleUhvbWUsICJIb21lIiB9LAorICB7IGdyS2V5RW5kLCAgIkVuZCIgIH0sCisgICAgCisgIHsgZ3JLZXlQYWdlVXAsICAgIlBhZ2VfVXAiIH0sCisgIHsgZ3JLZXlQYWdlRG93biwgIlBhZ2VfRG93biIgfSwKKyAgeyBncktleUxlZnQsICAgICAiTGVmdCIgfSwKKyAgeyBncktleVJpZ2h0LCAgICAiUmlnaHQiIH0sCisgIHsgZ3JLZXlVcCwgICAgICAgIlVwIiB9LAorICB7IGdyS2V5RG93biwgICAgICJEb3duIiB9LAorICB7IGdyS2V5QmFja1NwYWNlLCAiQmFja1NwYWNlIiB9LAorICB7IGdyS2V5UmV0dXJuLCAgICJSZXR1cm4iIH0KK307CisKK2ludCAgbWFpbiggdm9pZCApCit7CisgIGdyU3VyZmFjZSogIHN1cmZhY2U7CisgIGludCAgICAgICAgIG47CisgIAorICBnckluaXQoKTsKKyAgc3VyZmFjZSA9IGdyTmV3U2NyZWVuU3VyZmFjZSggMCwgZ3JfcGl4ZWxfbW9kZV9ncmF5LCAzMjAsIDQwMCwgMTI4ICk7CisgIGlmICghc3VyZmFjZSkKKyAgICBQYW5pYygiQ291bGQgbm90IGNyZWF0ZSB3aW5kb3dcbiIgKTsKKyAgZWxzZQorICB7CisgICAgZ3JDb2xvciAgICAgIGNvbG9yOworICAgIGdyRXZlbnQgICAgICBldmVudDsKKyAgICBjb25zdCBjaGFyKiAgc3RyaW5nOworICAgIGludCAgICAgICAgICB4OworICAgIAorICAgIGdyU2V0U3VyZmFjZVJlZnJlc2goIHN1cmZhY2UsIDEgKTsKKyAgICBnclNldFRpdGxlKHN1cmZhY2UsIlgxMSBkcml2ZXIgZGVtb25zdHJhdGlvbiIgKTsKKyAgICAKKyAgICBmb3IgKCB4ID0gLTEwOyB4IDwgMTA7IHgrKyApCisgICAgeworICAgICAgZm9yICggbiA9IDA7IG4gPCAxMjg7IG4rKyApCisgICAgICB7CisgICAgICAgIGNvbG9yLnZhbHVlID0gKG4qMykgJiAxMjc7CisgICAgICAgIGdyV3JpdGVDZWxsQ2hhciggc3VyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB4ICsgKChuICUgNjApIDw8IDMpLAorICAgICAgICAgICAgICAgICAgICAgICAgIDgwICsgKHgrMTApKjgqMyArICgobi82MCkgPDwgMyksIG4sIGNvbG9yICk7CisgICAgICB9CisKKyAgICB9CisgICAgY29sb3IudmFsdWUgPSA2NDsKKyAgICBncldyaXRlQ2VsbFN0cmluZyggc3VyZmFjZSwgMCwgMCwgImp1c3QgYW4gZXhhbXBsZSIsIGNvbG9yICk7CisgICAgCisgICAgZG8KKyAgICB7CisgICAgICBnckxpc3RlblN1cmZhY2UoIHN1cmZhY2UsIDAsICZldmVudCk7CisgICAgCisgICAgICAvKiByZXR1cm4gaWYgRVNDIHdhcyBwcmVzc2VkICovCisgICAgICBpZiAoIGV2ZW50LmtleSA9PSBncktleUVzYyApCisgICAgICAgIHJldHVybiAwOworICAgICAgCisgICAgICAvKiBvdGhlcndpc2UsIGRpc3BsYXkga2V5IHN0cmluZyAqLworICAgICAgY29sb3IudmFsdWUgPSAoY29sb3IudmFsdWUgKyA4KSAmIDEyNzsKKyAgICAgIHsKKyAgICAgICAgaW50ICAgICAgICAgY291bnQgPSBzaXplb2Yoa2V5X25hbWVzKS9zaXplb2Yoa2V5X25hbWVzWzBdKTsKKyAgICAgICAgZ3JLZXlOYW1lKiAgbmFtZSAgPSAoZ3JLZXlOYW1lKilrZXlfbmFtZXM7CisgICAgICAgIGdyS2V5TmFtZSogIGxpbWl0ID0gbmFtZSArIGNvdW50OworICAgICAgICBjb25zdCBjaGFyKiBrbmFtZSAgPSAwOworICAgICAgICBjaGFyICAgICAgICBrbmFtZV90ZW1wWzE2XTsKKyAgICAgIAorICAgICAgICB3aGlsZSAobmFtZSA8IGxpbWl0KQorICAgICAgICB7CisgICAgICAgICAgaWYgKCBuYW1lLT5rZXkgPT0gZXZlbnQua2V5ICkKKyAgICAgICAgICB7CisgICAgICAgICAgICBrbmFtZSA9IChjb25zdCBjaGFyKiluYW1lLT5uYW1lOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIG5hbWUrKzsKKyAgICAgICAgfQorICAgICAgCisgICAgICAgIGlmICgha25hbWUpCisgICAgICAgIHsKKyAgICAgICAgICBzcHJpbnRmKCBrbmFtZV90ZW1wLCAiY2hhciAnJWMnIiwgKGNoYXIpZXZlbnQua2V5ICk7CisgICAgICAgICAga25hbWUgPSBrbmFtZV90ZW1wOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBncldyaXRlQ2VsbFN0cmluZyggc3VyZmFjZSwgMzAsIDMwLCBrbmFtZSwgY29sb3IgKTsKKyAgICAgICAgZ3JSZWZyZXNoU3VyZmFjZShzdXJmYWNlKTsKKyAgICAgIH0KKyAgICB9IHdoaWxlICgxKTsKKyAgfQorCisgIHJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9kZW1vcy9vYmovUkVBRE1FIGIvZGVtb3Mvb2JqL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTFkMmMxCi0tLSAvZGV2L251bGwKKysrIGIvZGVtb3Mvb2JqL1JFQURNRQpAQCAtMCwwICsxIEBACitUaGlzIGRpcmVjdG9yeSBjb250YWlucyBhbGwgdGhlIG9iamVjdCBmaWxlcyBnZW5lcmF0ZWQgZm9yIHRoZSBkZW1vbnN0cmF0aW9uIHByb2dyYW1zCmRpZmYgLS1naXQgYS9kZW1vcy9zcmMvY29tbW9uLmMgYi9kZW1vcy9zcmMvY29tbW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE1NzQwNQotLS0gL2Rldi9udWxsCisrKyBiL2RlbW9zL3NyYy9jb21tb24uYwpAQCAtMCwwICsxLDI0NCBAQAorLyoKKyAqICBUaGlzIGlzIGEgY2hlYXAgcmVwbGFjZW1lbnQgZm9yIGdldG9wdCgpIGJlY2F1c2UgdGhhdCByb3V0aW5lIGlzIG5vdAorICogIGF2YWlsYWJsZSBvbiBzb21lIHBsYXRmb3JtcyBhbmQgYmVoYXZlcyBkaWZmZXJlbnRseSBvbiBvdGhlciBwbGF0Zm9ybXMuCisgKiAgVGhpcyBjb2RlIHdhcyB3cml0dGVuIGZyb20gc2NyYXRjaCB3aXRob3V0IGxvb2tpbmcgYXQgYW55IG90aGVyCisgKiAgaW1wbGVtZW50YXRpb24uCisgKgorICogIFRoaXMgY29kZSBpcyBoZXJlYnkgZXhwcmVzc2x5IHBsYWNlZCBpbiB0aGUgcHVibGljIGRvbWFpbi4KKyAqICBtbGVpc2hlckBjcmwubm1zdS5lZHUgKE1hcmsgTGVpc2hlcikKKyAqICAxMCBPY3RvYmVyIDE5OTcKKyAqLworCisjaWZuZGVmIGxpbnQKKyNpZmRlZiBfX0dOVUNfXworICBzdGF0aWMgY2hhciByY3NpZFtdIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSA9ICIkSWQkIjsKKyNlbHNlCisgIHN0YXRpYyBjaGFyIHJjc2lkW10gPSAiJElkJCI7CisjZW5kaWYKKyNlbmRpZgorCisjaW5jbHVkZSAiY29tbW9uLmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisgIC8qCisgICAqICBFeHRlcm5hbHMgdmlzaWJsZSB0byBwcm9ncmFtcy4KKyAgICovCisKKyAgaW50ICAgIG9wdGVyciA9IDE7CisgIGludCAgICBvcHRpbmQgPSAxOworICBjaGFyKiAgb3B0YXJnOworCisgIC8qCisgICAqICBJbnRlcm5hbCB2YXJpYWJsZXMgdGhhdCBhcmUgdXNlZCB0byBkZXRlY3Qgd2hlbiB0aGUgZ2xvYmFsIHZhbHVlcworICAgKiAgbmVlZCB0byBiZSByZXNldC4KKyAgICovCisKKyAgc3RhdGljIGludCAgY21kYWM7CisjaWZkZWYgX19TVERDX18KKyAgc3RhdGljIGNvbnN0IGNoYXIqICAgY21kbmFtZTsKKyAgc3RhdGljIGNoYXIqIGNvbnN0KiAgY21kYXY7CisjZWxzZQorICBzdGF0aWMgY2hhciogICBjbWRuYW1lOworICBzdGF0aWMgY2hhcioqICBjbWRhdjsKKyNlbmRpZgorCisgIGludAorI2lmZGVmIF9fU1REQ19fCisgIGdldG9wdCggaW50ICBhYywgY2hhciogY29uc3QqICBhdiwgY29uc3QgY2hhciogIHBhdCApCisjZWxzZQorICBnZXRvcHQoIGFjLCBhdiwgcGF0ICkKKyAgICBpbnQgICAgIGFjOworICAgIGNoYXIqKiAgYXY7CisgICAgY2hhciogICBwYXQ7CisjZW5kaWYKKyAgeworICAgIGludCAgb3B0OworI2lmZGVmIF9fU1REQ19fCisgICAgY29uc3QgY2hhciogIHA7CisgICAgY29uc3QgY2hhciogIHBwOworI2Vsc2UKKyAgICBjaGFyKiAgcDsKKyAgICBjaGFyKiAgcHA7CisjZW5kaWYKKworICAgIC8qCisgICAgICogIElmIHRoZXJlIGlzIG5vIHBhdHRlcm4sIGluZGljYXRlIHRoZSBwYXJzaW5nIGlzIGRvbmUuCisgICAgICovCisgICAgaWYgKCBwYXQgPT0gMCB8fCAqcGF0ID09IDAgKQorICAgICAgcmV0dXJuIC0xOworCisgICAgLyoKKyAgICAgKiAgQWx3YXlzIHJlc2V0IHRoZSBvcHRpb24gYXJndW1lbnQgdG8gTlVMTC4KKyAgICAgKi8KKyAgICBvcHRhcmcgPSAwOworCisgICAgLyoKKyAgICAgKiAgSWYgdGhlIG51bWJlciBvZiBhcmd1bWVudHMgb3IgYXJndW1lbnQgbGlzdCBkbyBub3QgbWF0Y2ggdGhlIGxhc3QKKyAgICAgKiAgdmFsdWVzIHNlZW4sIHJlc2V0IHRoZSBpbnRlcm5hbCBwb2ludGVycyBhbmQgdGhlIGdsb2JhbHMuCisgICAgICovCisgICAgaWYgKCBhYyAhPSBjbWRhYyB8fCBhdiAhPSBjbWRhdiApCisgICAgeworICAgICAgb3B0aW5kID0gMTsKKyAgICAgIGNtZGFjID0gYWM7CisgICAgICBjbWRhdiA9IGF2OworCisgICAgICAvKgorICAgICAgICogIERldGVybWluZSB0aGUgY29tbWFuZCBuYW1lIGluIGNhc2UgaXQgaXMgbmVlZGVkIGZvciB3YXJuaW5nCisgICAgICAgKiAgbWVzc2FnZXMuCisgICAgICAgKi8KKyAgICAgIGZvciAoIGNtZG5hbWUgPSAwLCBwID0gYXZbMF07ICpwOyBwKysgKQorICAgICAgeworICAgICAgICBpZiAoICpwID09ICcvJyB8fCAqcCA9PSAnXFwnICkKKyAgICAgICAgICBjbWRuYW1lID0gcDsKKyAgICAgIH0KKyAgICAgIC8qCisgICAgICAgKiAgU2tpcCB0aGUgcGF0aCBzZXBhcmF0b3IgaWYgdGhlIG5hbWUgd2FzIGFzc2lnbmVkLgorICAgICAgICovCisgICAgICBpZiAoIGNtZG5hbWUgKQorICAgICAgICBjbWRuYW1lKys7CisgICAgICBlbHNlCisgICAgICAgIGNtZG5hbWUgPSBhdlswXTsKKyAgICB9CisKKyAgICAvKgorICAgICAqICBJZiB0aGUgbmV4dCBpbmRleCBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIG51bWJlciBvZgorICAgICAqICBhcmd1bWVudHMsIHRoZW4gdGhlIGNvbW1hbmQgbGluZSBpcyBkb25lLgorICAgICAqLworICAgIGlmICggb3B0aW5kID49IGFjICkKKyAgICAgIHJldHVybiAtMTsKKworICAgIC8qCisgICAgICogIFRlc3QgdGhlIG5leHQgYXJndW1lbnQgZm9yIG9uZSBvZiB0aHJlZSBjYXNlczoKKyAgICAgKiAgICAxLiBUaGUgbmV4dCBhcmd1bWVudCBkb2VzIG5vdCBoYXZlIGFuIGluaXRpYWwgJy0nLgorICAgICAqICAgIDIuIFRoZSBuZXh0IGFyZ3VtZW50IGlzICctJy4KKyAgICAgKiAgICAzLiBUaGUgbmV4dCBhcmd1bWVudCBpcyAnLS0nLgorICAgICAqCisgICAgICogIEluIGVpdGhlciBvZiB0aGVzZSBjYXNlcywgY29tbWFuZCBsaW5lIHByb2Nlc3NpbmcgaXMgZG9uZS4KKyAgICAgKi8KKyAgICBpZiAoIGF2W29wdGluZF1bMF0gIT0gJy0nICAgICAgICAgICAgfHwKKyAgICAgICAgIHN0cmNtcCggYXZbb3B0aW5kXSwgIi0iICkgPT0gMCAgfHwKKyAgICAgICAgIHN0cmNtcCggYXZbb3B0aW5kXSwgIi0tIiApID09IDAgKQorICAgICAgcmV0dXJuIC0xOworCisgICAgLyoKKyAgICAgKiAgUG9pbnQgYXQgdGhlIG5leHQgY29tbWFuZCBsaW5lIGFyZ3VtZW50IGFuZCBpbmNyZW1lbnQgdGhlCisgICAgICogIGNvbW1hbmQgbGluZSBpbmRleC4KKyAgICAgKi8KKyAgICBwID0gYXZbb3B0aW5kKytdOworCisgICAgLyoKKyAgICAgKiAgTG9vayBmb3IgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiB0aGUgY29tbWFuZCBsaW5lIG9wdGlvbi4KKyAgICAgKi8KKyAgICBmb3IgKCBvcHQgPSAqKHAgKyAxKSwgcHAgPSBwYXQ7ICpwcCAmJiAqcHAgIT0gb3B0OyBwcCsrICkKKyAgICAgIDsKKworICAgIC8qCisgICAgICogIElmIG5vdGhpbmcgaW4gdGhlIHBhdHRlcm4gd2FzIHJlY29nbml6ZWQsIHRoZW4gaXNzdWUgYSB3YXJuaW5nCisgICAgICogIGFuZCByZXR1cm4gYSAnPycuCisgICAgICovCisgICAgaWYgKCAqcHAgPT0gMCApCisgICAgeworICAgICAgaWYgKCBvcHRlcnIgKQorICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICIlczogaWxsZWdhbCBvcHRpb24gLS0gJWNcbiIsIGNtZG5hbWUsIG9wdCApOworICAgICAgcmV0dXJuICc/JzsKKyAgICB9CisKKyAgICAvKgorICAgICAqICBJZiB0aGUgb3B0aW9uIGV4cGVjdHMgYW4gYXJndW1lbnQsIGdldCBpdC4KKyAgICAgKi8KKyAgICBpZiAoICoocHAgKyAxKSA9PSAnOicgJiYgKG9wdGFyZyA9IGF2W29wdGluZF0pID09IDAgKQorICAgIHsKKyAgICAgIC8qCisgICAgICAgKiAgSWYgdGhlIG9wdGlvbiBhcmd1bWVudCBpcyBOVUxMLCBpc3N1ZSBhIHdhcm5pbmcgYW5kIHJldHVybiBhICc/Jy4KKyAgICAgICAqLworICAgICAgaWYgKCBvcHRlcnIgKQorICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICIlczogb3B0aW9uIHJlcXVpcmVzIGFuIGFyZ3VtZW50IC0tICVjXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNtZG5hbWUsIG9wdCApOworICAgICAgb3B0ID0gJz8nOworICAgIH0KKyAgICBlbHNlIGlmICggb3B0YXJnICkKKyAgICAvKgorICAgICAqICBJbmNyZW1lbnQgdGhlIG9wdGlvbiBpbmRleCBwYXN0IHRoZSBhcmd1bWVudC4KKyAgICAgKi8KKyAgICAgIG9wdGluZCsrOworCisgICAgLyoKKyAgICAgKiAgUmV0dXJuIHRoZSBvcHRpb24gY2hhcmFjdGVyLgorICAgICAqLworICAgIHJldHVybiBvcHQ7CisgIH0KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoZSBGcmVlVHlwZSBwcm9qZWN0IC0tIGEgZnJlZSBhbmQgcG9ydGFibGUgcXVhbGl0eSBUcnVlVHlwZSByZW5kZXJlci4gICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMTk5Ni0xOTk4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEQuIFR1cm5lciwgUi5XaWxoZWxtLCBhbmQgVy4gTGVtYmVyZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIGZ0X2Jhc2VuYW1lKCk6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBhIHN0dXBpZCBidXQgdXNlZnVsIGZ1bmN0aW9uLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogcmV3cml0dGVuIGJ5IERhdmlkVCB0byBnZXQgcmlkIG9mIEdQTGVkIHByb2dyYW1zIGluIHRoZSBGcmVlVHlwZSBkZW1vcy4gICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIGNoYXIqCisjaWZkZWYgX19TVERDX18KKyAgZnRfYmFzZW5hbWUgKCBjb25zdCBjaGFyKiAgbmFtZSApCisjZWxzZQorICBmdF9iYXNlbmFtZSAoIG5hbWUgKQorICAgIGNoYXIqIG5hbWU7CisjZW5kaWYKKyAgeworI2lmZGVmIF9fU1REQ19fCisgICAgY29uc3QgY2hhciogIGJhc2U7CisgICAgY29uc3QgY2hhciogIGN1cnJlbnQ7CisjZWxzZQorICAgIGNoYXIqICAgICAgICBiYXNlOworICAgIGNoYXIqICAgICAgICBjdXJyZW50OworI2VuZGlmCisgICAgY2hhciAgICAgICAgIGM7CisKKyAgICBiYXNlICAgID0gbmFtZTsKKyAgICBjdXJyZW50ID0gbmFtZTsKKworICAgIGMgPSAqY3VycmVudDsKKyAgCisgICAgd2hpbGUgKCBjICkKKyAgICB7CisgICAgICBpZiAoIGMgPT0gJy8nIHx8IGMgPT0gJ1xcJyApCisgICAgICAgIGJhc2UgPSBjdXJyZW50ICsgMTsKKworICAgICAgY3VycmVudCsrOworICAgICAgYyA9ICpjdXJyZW50OworICAgIH0KKworICAgIHJldHVybiAoY2hhciopYmFzZTsKKyAgfQorCisKKyNpZmRlZiBfX1NURENfXworICB2b2lkIFBhbmljKCBjb25zdCBjaGFyKiAgZm10LCAuLi4gKQorI2Vsc2UKKyAgdm9pZCBQYW5pYyggZm10ICkKKyAgICBjb25zdCBjaGFyKiBmbXQ7CisjZW5kaWYKKyAgeworICAgIHZhX2xpc3QgIGFwOworCisKKyAgICB2YV9zdGFydCggYXAsIGZtdCApOworICAgIHZwcmludGYoIGZtdCwgYXAgKTsKKyAgICB2YV9lbmQoIGFwICk7CisKKyAgICBleGl0KCAxICk7CisgIH0KKworCisvKiBFbmQgKi8KZGlmZiAtLWdpdCBhL2RlbW9zL3NyYy9jb21tb24uaCBiL2RlbW9zL3NyYy9jb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTM3NzA4Ci0tLSAvZGV2L251bGwKKysrIGIvZGVtb3Mvc3JjL2NvbW1vbi5oCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiAgVGhpcyBpcyBhIGNoZWFwIHJlcGxhY2VtZW50IGZvciBnZXRvcHQoKSBiZWNhdXNlIHRoYXQgcm91dGluZSBpcyBub3QKKyAqICBhdmFpbGFibGUgb24gc29tZSBwbGF0Zm9ybXMgYW5kIGJlaGF2ZXMgZGlmZmVyZW50bHkgb24gb3RoZXIgcGxhdGZvcm1zLgorICoKKyAqICBUaGlzIGNvZGUgaXMgaGVyZWJ5IGV4cHJlc3NseSBwbGFjZWQgaW4gdGhlIHB1YmxpYyBkb21haW4uCisgKiAgbWxlaXNoZXJAY3JsLm5tc3UuZWR1IChNYXJrIExlaXNoZXIpCisgKiAgMTAgT2N0b2JlciAxOTk3CisgKi8KKworI2lmbmRlZiBfSF9DT01NT04KKyNkZWZpbmUgX0hfQ09NTU9OCisKKy8qIE5vdGUgdGhhdCBieSBkZWZhdWx0LCBib3RoIGZ1bmN0aW9ucyBhcmUgaW1wbGVtZW50ZWQgaW4gY29tbW9uLmMgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCisgIGV4dGVybiAiQyIgeworI2VuZGlmCisKKyAgZXh0ZXJuIGludCAgICBvcHRlcnI7CisgIGV4dGVybiBpbnQgICAgb3B0aW5kOworICBleHRlcm4gY2hhciogIG9wdGFyZzsKKworICBleHRlcm4gaW50ICBnZXRvcHQoCisjaWZkZWYgX19TVERDX18KKyAgICBpbnQgICAgICAgICAgIGFyZ2MsCisgICAgY2hhciogY29uc3QqICBhcmd2LAorICAgIGNvbnN0IGNoYXIqICAgcGF0dGVybgorI2VuZGlmCisgICk7CisKKworICBleHRlcm4gY2hhciogIGZ0X2Jhc2VuYW1lKAorI2lmZGVmIF9fU1REQ19fCisgICAgY29uc3QgY2hhciogIG5hbWUKKyNlbmRpZgorICApOworCisgIC8qIHByaW50IGEgbWVzc2FnZSBhbmQgZXhpdCAqLworICBleHRlcm4gIHZvaWQgIFBhbmljICAoCisjaWZkZWYgX19TVERDX18KKyAgICBjb25zdCBjaGFyKiAgZm10LCAuLi4KKyNlbmRpZgorICApOworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworICB9CisjZW5kaWYKKworI2VuZGlmIC8qIF9IX0NPTU1PTiAqLworCisKKy8qIEVuZCAqLwpkaWZmIC0tZ2l0IGEvZGVtb3Mvc3JjL2Z0bGludC5jIGIvZGVtb3Mvc3JjL2Z0bGludC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkYzM5MjYKLS0tIC9kZXYvbnVsbAorKysgYi9kZW1vcy9zcmMvZnRsaW50LmMKQEAgLTAsMCArMSwxNjkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhlIEZyZWVUeXBlIHByb2plY3QgLS0gYSBmcmVlIGFuZCBwb3J0YWJsZSBxdWFsaXR5IFRydWVUeXBlIHJlbmRlcmVyLiAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAxOTk2LTE5OTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRC4gVHVybmVyLCBSLldpbGhlbG0sIGFuZCBXLiBMZW1iZXJnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGZ0bGludDogYSBzaW1wbGUgZm9udCB0ZXN0ZXIuIFRoaXMgcHJvZ3JhbSB0cmllcyB0byBsb2FkIGFsbCB0aGUgICAgICAgICovCisvKiAgICAgICAgICBnbHlwaHMgb2YgYSBnaXZlbiBmb250LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE5PVEU6ICBUaGlzIGlzIGp1c3QgYSB0ZXN0IHByb2dyYW0gdGhhdCBpcyB1c2VkIHRvIHNob3cgb2ZmIGFuZCAgICAgICAgICovCisvKiAgICAgICAgIGRlYnVnIHRoZSBjdXJyZW50IGVuZ2luZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJmcmVldHlwZS5oIgorI2luY2x1ZGUgImZ0b2Jqcy5oIgorI2luY2x1ZGUgImZ0ZHJpdmVyLmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisKKyNkZWZpbmUgZ2V0dGV4dCggeCApICAoIHggKQorCisgIEZUX0Vycm9yICAgICAgZXJyb3I7CisKKyAgRlRfTGlicmFyeSAgICBsaWJyYXJ5OworICBGVF9GYWNlICAgICAgIGZhY2U7CisgIEZUX1NpemUgICAgICAgc2l6ZTsKKyAgRlRfR2x5cGhTbG90ICBzbG90OworCisgIHVuc2lnbmVkIGludCAgbnVtX2dseXBoczsKKyAgaW50ICAgICAgICAgICBwdHNpemU7CisKKyAgaW50ICBGYWlsOworICBpbnQgIE51bTsKKworCisKKyAgc3RhdGljIHZvaWQgIFVzYWdlKCBjaGFyKiAgbmFtZSApCisgIHsKKyAgICBwcmludGYoICJmdGxpbnQ6IHNpbXBsZSBmb250IHRlc3RlciAtLSBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0XG4iICk7CisgICAgcHJpbnRmKCAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIiApOworICAgIHByaW50ZiggIlxuIiApOworICAgIHByaW50ZiggIlVzYWdlOiAlcyBwcGVtIGZvbnRuYW1lWy50dGZ8LnR0Y10gW2ZvbnRuYW1lMi4uXVxuIiwgbmFtZSApOworICAgIHByaW50ZiggIlxuIiApOworCisgICAgZXhpdCggMSApOworICB9CisKKworICBzdGF0aWMgdm9pZCAgUGFuaWMoIGNvbnN0IGNoYXIqICBtZXNzYWdlICkKKyAgeworICAgIGZwcmludGYoIHN0ZGVyciwgIiVzXG4gIGVycm9yIGNvZGUgPSAweCUwNHhcbiIsIG1lc3NhZ2UsIGVycm9yICk7CisgICAgZXhpdCgxKTsKKyAgfQorCisKKyAgaW50ICBtYWluKCBpbnQgIGFyZ2MsIGNoYXIqKiAgYXJndiApIAorICB7CisgICAgaW50ICAgICAgICAgICBpLCBmaWxlX2luZGV4OworICAgIHVuc2lnbmVkIGludCAgaWQ7CisgICAgY2hhciAgICAgICAgICBmaWxlbmFtZVsxMjggKyA0XTsKKyAgICBjaGFyICAgICAgICAgIGFsdF9maWxlbmFtZVsxMjggKyA0XTsKKyAgICBjaGFyKiAgICAgICAgIGV4ZWNuYW1lOworICAgIGNoYXIqICAgICAgICAgZm5hbWU7CisKKworICAgIGV4ZWNuYW1lID0gYXJndlswXTsKKworICAgIGlmICggYXJnYyA8IDMgKQorICAgICAgVXNhZ2UoIGV4ZWNuYW1lICk7CisKKyAgICBpZiAoIHNzY2FuZiggYXJndlsxXSwgIiVkIiwgJnB0c2l6ZSApICE9IDEgKQorICAgICAgVXNhZ2UoIGV4ZWNuYW1lICk7CisKKyAgICBlcnJvciA9IEZUX0luaXRfRnJlZVR5cGUoICZsaWJyYXJ5ICk7CisgICAgaWYgKGVycm9yKSBQYW5pYyggIkNvdWxkIG5vdCBjcmVhdGUgbGlicmFyeSBvYmplY3QiICk7CisKKyAgICAvKiBOb3cgY2hlY2sgYWxsIGZpbGVzICovCisgICAgZm9yICggZmlsZV9pbmRleCA9IDI7IGZpbGVfaW5kZXggPCBhcmdjOyBmaWxlX2luZGV4KysgKQorICAgIHsKKyAgICAgIGZuYW1lID0gYXJndltmaWxlX2luZGV4XTsKKyAgICAgIGkgICAgID0gc3RybGVuKCBmbmFtZSApOworICAgICAgd2hpbGUgKCBpID4gMCAmJiBmbmFtZVtpXSAhPSAnXFwnICYmIGZuYW1lW2ldICE9ICcvJyApCisgICAgICB7CisgICAgICAgIGlmICggZm5hbWVbaV0gPT0gJy4nICkKKyAgICAgICAgICBpID0gMDsKKyAgICAgICAgaS0tOworICAgICAgfQorCisgICAgICBmaWxlbmFtZVsxMjhdID0gJ1wwJzsKKyAgICAgIGFsdF9maWxlbmFtZVsxMjhdID0gJ1wwJzsKKworICAgICAgc3RybmNweSggZmlsZW5hbWUsIGZuYW1lLCAxMjggKTsKKyAgICAgIHN0cm5jcHkoIGFsdF9maWxlbmFtZSwgZm5hbWUsIDEyOCApOworCisgICAgICBpZiAoIGkgPj0gMCApCisgICAgICB7CisgICAgICAgIHN0cm5jcHkoIGZpbGVuYW1lICsgc3RybGVuKCBmaWxlbmFtZSApLCAiLnR0ZiIsIDQgKTsKKyAgICAgICAgc3RybmNweSggYWx0X2ZpbGVuYW1lICsgc3RybGVuKCBhbHRfZmlsZW5hbWUgKSwgIi50dGMiLCA0ICk7CisgICAgICB9CisKKyAgICAgIGkgICAgID0gc3RybGVuKCBmaWxlbmFtZSApOworICAgICAgZm5hbWUgPSBmaWxlbmFtZTsKKworICAgICAgd2hpbGUgKCBpID49IDAgKQorICAgICAgICBpZiAoIGZpbGVuYW1lW2ldID09ICcvJyB8fCBmaWxlbmFtZVtpXSA9PSAnXFwnICkKKyAgICAgICAgeworICAgICAgICAgIGZuYW1lID0gZmlsZW5hbWUgKyBpICsgMTsKKyAgICAgICAgICBpID0gLTE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSAKKyAgICAgICAgICBpLS07CisKKyAgICAgIHByaW50ZiggIiVzOiAiLCBmbmFtZSApOworCisgICAgICAvKiBMb2FkIGZhY2UgKi8KKyAgICAgIGVycm9yID0gRlRfTmV3X0ZhY2UoIGxpYnJhcnksIGZpbGVuYW1lLCAwLCAmZmFjZSApOworICAgICAgaWYgKGVycm9yKQorICAgICAgeworICAgICAgICBpZiAoZXJyb3IgPT0gRlRfRXJyX0ludmFsaWRfRmlsZV9Gb3JtYXQpCisgICAgICAgICAgcHJpbnRmKCAidW5rbm93IGZvcm1hdFxuIiApOworICAgICAgICBlbHNlCisgICAgICAgICAgcHJpbnRmKCAiY291bGQgbm90IGZpbmQvb3BlbiBmaWxlXG4iICk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgaWYgKGVycm9yKSBQYW5pYyggIkNvdWxkIG5vdCBvcGVuIGZpbGUiICk7CisKKyAgICAgIG51bV9nbHlwaHMgPSBmYWNlLT5udW1fZ2x5cGhzOworCisgICAgICBlcnJvciA9IEZUX1NldF9DaGFyX1NpemUoIGZhY2UsIHB0c2l6ZSA8PCA2LCBwdHNpemUgPDwgNiwgNzIsIDcyICk7CisgICAgICBpZiAoZXJyb3IpIFBhbmljKCAiQ291bGQgbm90IHNldCBjaGFyYWN0ZXIgc2l6ZSIgKTsKKworICAgICAgRmFpbCA9IDA7CisgICAgICB7CisgICAgICAgIGZvciAoIGlkID0gMDsgaWQgPCBudW1fZ2x5cGhzOyBpZCsrICkKKyAgICAgICAgeworICAgICAgICAgIGVycm9yID0gRlRfTG9hZF9HbHlwaCggZmFjZSwgaWQsIEZUX0xPQURfREVGQVVMVCApOworICAgICAgICAgIGlmIChlcnJvcikKKyAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIEZhaWwgPCAxMCApCisgICAgICAgICAgICAgIHByaW50ZiggImdseXBoICU0dTogMHglMDR4XG4iICwgaWQsIGVycm9yICk7CisgICAgICAgICAgICBGYWlsKys7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmICggRmFpbCA9PSAwICkKKyAgICAgICAgcHJpbnRmKCAiT0suXG4iICk7CisgICAgICBlbHNlCisgICAgICAgIGlmICggRmFpbCA9PSAxICkKKyAgICAgICAgICBwcmludGYoICIxIGZhaWwuXG4iICk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBwcmludGYoICIlZCBmYWlscy5cbiIsIEZhaWwgKTsKKworICAgICAgRlRfRG9uZV9GYWNlKCBmYWNlICk7CisgICAgfQorCisgICAgRlRfRG9uZV9GcmVlVHlwZShsaWJyYXJ5KTsKKyAgICBleGl0KCAwICk7ICAgICAgLyogZm9yIHNhZmV0eSByZWFzb25zICovCisKKyAgICByZXR1cm4gMDsgICAgICAgLyogbmV2ZXIgcmVhY2hlZCAqLworICB9CisKKworLyogRW5kICovCmRpZmYgLS1naXQgYS9kZW1vcy9zcmMvZnRzYml0LmMgYi9kZW1vcy9zcmMvZnRzYml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRmMzU1MwotLS0gL2Rldi9udWxsCisrKyBiL2RlbW9zL3NyYy9mdHNiaXQuYwpAQCAtMCwwICsxLDMxMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGUgRnJlZVR5cGUgcHJvamVjdCAtLSBhIGZyZWUgYW5kIHBvcnRhYmxlIHF1YWxpdHkgVHJ1ZVR5cGUgcmVuZGVyZXIuICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDE5OTYtMTk5OCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBELiBUdXJuZXIsIFIuV2lsaGVsbSwgYW5kIFcuIExlbWJlcmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgZnRzYml0OiBhIF92ZXJ5XyBzaW1wbGUgZW1iZWRkZWQgYml0bWFwIGR1bXBlciBmb3IgRnJlZVR5cGUgMS54LiAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE5PVEU6ICBUaGlzIGlzIGp1c3QgYSB0ZXN0IHByb2dyYW0gdGhhdCBpcyB1c2VkIHRvIHNob3cgb2ZmIGFuZCAgICAgICAgICovCisvKiAgICAgICAgIGRlYnVnIHRoZSBjdXJyZW50IGVuZ2luZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJmcmVldHlwZS5oIgorCisKKyNpZmRlZiBIQVZFX0xJQklOVExfSAorCisjaWZkZWYgSEFWRV9MT0NBTEVfSAorI2luY2x1ZGUgPGxvY2FsZS5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxsaWJpbnRsLmg+CisjaW5jbHVkZSAiZnR4ZXJyMTguaCIKKworI2Vsc2UgLyogIUhBVkVfTElCSU5UTCAqLworCisjZGVmaW5lIGdldHRleHQoIHggKSAgKCB4ICkKKworICAvKiBXZSBpZ25vcmUgZXJyb3IgbWVzc2FnZSBzdHJpbmdzIHdpdGggdGhpcyBmdW5jdGlvbiAqLworCisgIHN0YXRpYyBjaGFyKiAgVFRfRXJyVG9TdHJpbmcxOCggRlRfRXJyb3IgIGVycm9yICkKKyAgeworICAgIHN0YXRpYyBjaGFyICB0ZW1wWzMyXTsKKworICAgIHNwcmludGYoIHRlbXAsICIweCUwNGx4IiwgZXJyb3IgKTsKKyAgICByZXR1cm4gdGVtcDsKKyAgfQorCisjZW5kaWYgLyogIUhBVkVfTElCSU5UTCAqLworCisKKyAgRlRfRXJyb3IgICAgICBlcnJvcjsKKyAgRlRfTGlicmFyeSAgICBlbmdpbmU7CisgIEZUX1Jlc291cmNlICAgcmVzb3VyY2U7CisKKyAgRlRfRmFjZSAgICAgICBmYWNlOworICBGVF9TaXplICAgICAgIGluc3RhbmNlOworICBGVF9HbHlwaFNsb3QgIGdseXBoOworCisgIHVuc2lnbmVkIGludCAgbnVtX2dseXBoczsKKyAgaW50ICAgICAgICAgICBwdHNpemU7CisKKyAgaW50ICBGYWlsOworICBpbnQgIE51bTsKKworCisKKyAgc3RhdGljIHZvaWQgIFVzYWdlKCBjaGFyKiAgbmFtZSApCisgIHsKKyAgICBwcmludGYoIGdldHRleHQoICJmdHNiaXQ6IHNpbXBsZSBUcnVlVHlwZSAnc2JpdCcgZHVtcGVyIC0tIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3RcbiIgKSApOworICAgIHByaW50ZiggICAgICAgICAgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIiApOworICAgIHByaW50ZiggICAgICAgICAgIlxuIiApOworICAgIHByaW50ZiggZ2V0dGV4dCggIlVzYWdlOiAlcyBwcGVtIGZvbnRuYW1lIChpbmRleCkqIChpbmRleDEtaW5kZXgyKSpcblxuIiApLCBuYW1lICk7CisgICAgcHJpbnRmKCBnZXR0ZXh0KCAiICAgb3IgICVzIC1hIHBwZW0gZm9udG5hbWUgICAoZHVtcHMgYWxsIGdseXBocylcbiIgKSwgbmFtZSApOworICAgIHByaW50ZiggICAgICAgICAgIlxuIiApOworCisgICAgZXhpdCggRVhJVF9GQUlMVVJFICk7CisgIH0KKworCisKKyAgc3RhdGljCisgIHZvaWQgIGR1bXBfYml0bWFwKCBGVF9HbHlwaFNsb3QgIGdseXBoLCBpbnQgZ2x5cGhfaW5kZXggKQorICB7CisgICAgLyogRHVtcCB0aGUgcmVzdWx0aW5nIGJpdG1hcCAqLworICAgIHsKKyAgICAgIGludCAgICAgICAgICAgICB5OworICAgICAgdW5zaWduZWQgY2hhciogIGxpbmUgPSAodW5zaWduZWQgY2hhciopZ2x5cGgtPmJpdG1hcC5idWZmZXI7CisKKyAgICAgIHByaW50ZiggImdseXBoIGluZGV4ICVkID0gJWR4JWQgcGl4ZWxzLCAiLAorICAgICAgICAgICAgICBnbHlwaF9pbmRleCwgZ2x5cGgtPmJpdG1hcC5yb3dzLCBnbHlwaC0+Yml0bWFwLndpZHRoICk7CisKKyAgICAgIHByaW50ZiggImFkdmFuY2UgPSAlZCwgbWluQmVhcmluZyA9IFslZCwlZF1cbiIsCisgICAgICAgICAgICAgIGdseXBoLT5tZXRyaWNzLmhvcmlBZHZhbmNlID4+IDYsCisgICAgICAgICAgICAgIGdseXBoLT5tZXRyaWNzLmhvcmlCZWFyaW5nWCA+PiA2LAorICAgICAgICAgICAgICBnbHlwaC0+bWV0cmljcy5ob3JpQmVhcmluZ1kgPj4gNiApOworCisgICAgICBmb3IgKCB5ID0gMDsgeSA8IGdseXBoLT5iaXRtYXAucm93czsgeSsrLCBsaW5lICs9IGdseXBoLT5iaXRtYXAuY29scyApCisgICAgICB7CisgICAgICAgIHVuc2lnbmVkIGNoYXIqICBwdHIgPSBsaW5lOworICAgICAgICBpbnQgICAgICAgICAgICAgeDsKKyAgICAgICAgdW5zaWduZWQgY2hhciAgIG1hc2sgPSAweDgwOworCisgICAgICAgIGZvciAoIHggPSAwOyB4IDwgZ2x5cGgtPmJpdG1hcC53aWR0aDsgeCsrICkKKyAgICAgICAgeworICAgICAgICAgIHByaW50ZiggIiVjIiwgKHB0clswXSAmIG1hc2spID8gJyonIDogJy4nICk7CisgICAgICAgICAgbWFzayA+Pj0gMTsKKyAgICAgICAgICBpZiAobWFzayA9PSAwKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hc2sgPSAweDgwOworICAgICAgICAgICAgcHRyKys7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpbnRmKCAiXG4iICk7CisgICAgICB9CisgICAgfQorICB9CisKKworICAKKyAgc3RhdGljCisgIHZvaWQgIGR1bXBfcmFuZ2UoIEZUX0dseXBoU2xvdCAgZ2x5cGgsCisgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgZmlyc3RfZ2x5cGgsCisgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgbGFzdF9nbHlwaCApCisgIHsKKyAgICBpbnQgIGk7CisgICAgCisgICAgZm9yICggaSA9IGZpcnN0X2dseXBoOyBpIDw9IGxhc3RfZ2x5cGg7IGkrKyApCisgICAgeworICAgICAgZXJyb3IgPSBGVF9Mb2FkX0dseXBoKCBnbHlwaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBzaG9ydClpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9MT0FEX05PX09VVExJTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgKTsKKyAgICAgIGlmIChlcnJvcikKKyAgICAgIHsKKyAgICAgICAgcHJpbnRmKCAiICBubyBiaXRtYXAgZm9yIGdseXBoICVkXG4iLCBpICk7CisgICAgICAgIHByaW50ZiggZ2V0dGV4dCggIkZyZWVUeXBlIGVycm9yIG1lc3NhZ2U6ICVzXG4iICksCisgICAgICAgICAgICAgICAgVFRfRXJyVG9TdHJpbmcxOCggZXJyb3IgKSApOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIAorICAgICAgZHVtcF9iaXRtYXAoZ2x5cGgsaSk7CisgICAgfQorICB9CisKKworCisKKyAgaW50ICBtYWluKCBpbnQgIGFyZ2MsIGNoYXIqKiAgYXJndiApCisgIHsKKyAgICBpbnQgICAgaTsKKyAgICBjaGFyICAgZmlsZW5hbWVbMTI4ICsgNF07CisgICAgY2hhciAgIGFsdF9maWxlbmFtZVsxMjggKyA0XTsKKyAgICBjaGFyKiAgZXhlY25hbWU7CisgICAgY2hhciogIGZuYW1lOworICAgIGludCAgICBkdW1wX2FsbCA9IDA7CisKKworI2lmZGVmIEhBVkVfTElCSU5UTF9ICisgICAgc2V0bG9jYWxlKCBMQ19BTEwsICIiICk7CisgICAgYmluZHRleHRkb21haW4oICJmcmVldHlwZSIsIExPQ0FMRURJUiApOworICAgIHRleHRkb21haW4oICJmcmVldHlwZSIgKTsKKyNlbmRpZgorCisgICAgZXhlY25hbWUgPSBhcmd2WzBdOworCisgICAgaWYgKCBhcmdjIDwgMyApCisgICAgICBVc2FnZSggZXhlY25hbWUgKTsKKworICAgIGlmICggYXJndlsxXVswXSA9PSAnLScgJiYKKyAgICAgICAgIGFyZ3ZbMV1bMV0gPT0gJ2EnICkKKyAgICB7CisgICAgICBhcmd2Kys7CisgICAgICBhcmdjLS07CisgICAgICBkdW1wX2FsbCA9IDE7CisgICAgfQorCisgICAgaWYgKCBzc2NhbmYoIGFyZ3ZbMV0sICIlZCIsICZwdHNpemUgKSAhPSAxICkKKyAgICAgIFVzYWdlKCBleGVjbmFtZSApOworCisgICAgLyogSW5pdGlhbGl6ZSBlbmdpbmUgKi8KKyAgICBpZiAoIChlcnJvciA9IEZUX0luaXRfRnJlZVR5cGUoICZlbmdpbmUgKSkgKQorICAgIHsKKyAgICAgIGZwcmludGYoIHN0ZGVyciwgZ2V0dGV4dCggIkVycm9yIHdoaWxlIGluaXRpYWxpemluZyBlbmdpbmVcbiIgKSApOworICAgICAgZ290byBGYWlsdXJlOworICAgIH0KKworICAgIC8qIE5vdyBjaGVjayBhbGwgZmlsZXMgKi8KKyAgICBmbmFtZSA9IGFyZ3ZbMl07CisgICAgaSAgICAgPSBzdHJsZW4oIGZuYW1lICk7CisgICAgd2hpbGUgKCBpID4gMCAmJiBmbmFtZVtpXSAhPSAnXFwnICYmIGZuYW1lW2ldICE9ICcvJyApCisgICAgeworICAgICAgaWYgKCBmbmFtZVtpXSA9PSAnLicgKQorICAgICAgICBpID0gMDsKKyAgICAgIGktLTsKKyAgICB9CisKKyAgICBmaWxlbmFtZVsxMjhdID0gJ1wwJzsKKyAgICBhbHRfZmlsZW5hbWVbMTI4XSA9ICdcMCc7CisKKyAgICBzdHJuY3B5KCBmaWxlbmFtZSwgZm5hbWUsIDEyOCApOworICAgIHN0cm5jcHkoIGFsdF9maWxlbmFtZSwgZm5hbWUsIDEyOCApOworCisgICAgaWYgKCBpID49IDAgKQorICAgIHsKKyAgICAgIHN0cm5jcHkoIGZpbGVuYW1lICsgc3RybGVuKCBmaWxlbmFtZSApLCAiLnR0ZiIsIDQgKTsKKyAgICAgIHN0cm5jcHkoIGFsdF9maWxlbmFtZSArIHN0cmxlbiggYWx0X2ZpbGVuYW1lICksICIudHRjIiwgNCApOworICAgIH0KKworICAgIC8qIExvYWQgZmFjZSAqLworICAgIGVycm9yID0gRlRfTmV3X1Jlc291cmNlKCBlbmdpbmUsIGZpbGVuYW1lLCAmcmVzb3VyY2UgKTsKKyAgICBpZiAoZXJyb3IpCisgICAgeworICAgICAgc3RyY3B5KCBmaWxlbmFtZSwgYWx0X2ZpbGVuYW1lICk7CisgICAgICBlcnJvciA9IEZUX05ld19SZXNvdXJjZSggZW5naW5lLCBhbHRfZmlsZW5hbWUsICZyZXNvdXJjZSApOworICAgIH0KKworICAgIGkgICAgID0gc3RybGVuKCBmaWxlbmFtZSApOworICAgIGZuYW1lID0gZmlsZW5hbWU7CisKKyAgICB3aGlsZSAoIGkgPj0gMCApCisgICAgICBpZiAoIGZpbGVuYW1lW2ldID09ICcvJyB8fCBmaWxlbmFtZVtpXSA9PSAnXFwnICkKKyAgICAgIHsKKyAgICAgICAgZm5hbWUgPSBmaWxlbmFtZSArIGkgKyAxOworICAgICAgICBpID0gLTE7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIGktLTsKKworICAgIGlmICggZXJyb3IgKQorICAgIHsKKyAgICAgIHByaW50ZiggZ2V0dGV4dCggIkNvdWxkIG5vdCBmaW5kIG9yIG9wZW4gZmlsZS5cbiIgKSApOworICAgICAgZ290byBGYWlsdXJlOworICAgIH0KKworICAgIGVycm9yID0gRlRfTmV3X0ZhY2UoIHJlc291cmNlLCAwLCAmZmFjZSApOworICAgIGlmIChlcnJvcikKKyAgICB7CisgICAgICBwcmludGYoIGdldHRleHQoICJDb3VsZCBub3QgY3JlYXRlIGZhY2Ugb2JqZWN0LlxuICAiICkgKTsKKyAgICAgIGdvdG8gRmFpbHVyZTsKKyAgICB9CisKKyAgICAvKiBnZXQgZmFjZSBwcm9wZXJ0aWVzICovCisgICAgbnVtX2dseXBocyA9IGZhY2UtPm51bV9nbHlwaHM7CisKKyAgICAvKiBjcmVhdGUgaW5zdGFuY2UgKi8KKyAgICBlcnJvciA9IEZUX05ld19TaXplKCBmYWNlLCAmaW5zdGFuY2UgKTsKKyAgICBpZiAoIGVycm9yICkKKyAgICB7CisgICAgICBwcmludGYoIGdldHRleHQoICJDb3VsZCBub3QgY3JlYXRlIGluc3RhbmNlLlxuIiApICk7CisgICAgICBnb3RvIEZhaWx1cmU7CisgICAgfQorCisgICAgZXJyb3IgPSBGVF9TZXRfUGl4ZWxfU2l6ZXMoIGluc3RhbmNlLCBwdHNpemUsIHB0c2l6ZSApOworICAgIGlmIChlcnJvcikKKyAgICB7CisgICAgICBwcmludGYoIGdldHRleHQoICJDb3VsZCBub3Qgc2V0IGNoYXJhY3RlciBzaXplLlxuIiApICk7CisgICAgICBnb3RvIEZhaWx1cmU7CisgICAgfQorCisgICAgZ2x5cGggPSBmYWNlLT5zbG90OworCisgICAgaWYgKGR1bXBfYWxsKQorICAgICAgZHVtcF9yYW5nZSggZ2x5cGgsIDAsIG51bV9nbHlwaHMtMSApOworICAgIGVsc2UKKyAgICB7CisgICAgICBmb3IgKCBpID0gMzsgaSA8IGFyZ2M7IGkrKyApCisgICAgICB7CisgICAgICAgIC8qIGNoZWNrIGZvciByYW5nZSBpbiBhcmd1bWVudCBzdHJpbmcgKi8KKyAgICAgICAgaW50ICAgIHJhbmdlX2NoZWNrID0gMDsKKyAgICAgICAgY2hhciogIGJhc2UgPSBhcmd2W2ldOworICAgICAgICBjaGFyKiAgY3VyICA9IGJhc2U7CisgICAgICAgIGludCAgICBmaXJzdCwgbGFzdDsKKyAgICAgICAgCisgICAgICAgIHdoaWxlICgqY3VyKQorICAgICAgICB7CisgICAgICAgICAgaWYgKCpjdXIgPT0gJy0nKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIHJhbmdlX2NoZWNrID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBjdXIrKzsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChyYW5nZV9jaGVjaykKKyAgICAgICAgeworICAgICAgICAgIGlmICggc3NjYW5mKCBhcmd2W2ldLCAiJWQtJWQiLCAmZmlyc3QsICZsYXN0ICkgIT0gMiApCisgICAgICAgICAgICBVc2FnZSggZXhlY25hbWUgKTsKKyAgICAgICAgICAgIAorICAgICAgICAgIGR1bXBfcmFuZ2UoIGdseXBoLCBmaXJzdCwgbGFzdCApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGlmICggc3NjYW5mKCBhcmd2W2ldLCAiJWQiLCAmZmlyc3QgKSAhPSAxICkKKyAgICAgICAgICAgIFVzYWdlKCBleGVjbmFtZSApOworICAgICAgICAgICAgCisgICAgICAgICAgZHVtcF9yYW5nZSggZ2x5cGgsIGZpcnN0LCBmaXJzdCApOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgRlRfRG9uZV9GcmVlVHlwZSggZW5naW5lICk7CisgICAgZXhpdCggRVhJVF9TVUNDRVNTICk7ICAgICAgLyogZm9yIHNhZmV0eSByZWFzb25zICovCisKKyAgICByZXR1cm4gMDsgICAgICAgLyogbmV2ZXIgcmVhY2hlZCAqLworCisgIEZhaWx1cmU6CisgICAgcHJpbnRmKCBnZXR0ZXh0KCAiRnJlZVR5cGUgZXJyb3IgbWVzc2FnZTogJXNcbiIgKSwKKyAgICAgICAgICAgIFRUX0VyclRvU3RyaW5nMTgoIGVycm9yICkgKTsKKyAgICBleGl0KCBFWElUX0ZBSUxVUkUgKTsKKyAgfQorCisKKy8qIEVuZCAqLwpkaWZmIC0tZ2l0IGEvZGVtb3Mvc3JjL2Z0dGltZXIuYyBiL2RlbW9zL3NyYy9mdHRpbWVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRmYTIyMgotLS0gL2Rldi9udWxsCisrKyBiL2RlbW9zL3NyYy9mdHRpbWVyLmMKQEAgLTAsMCArMSw0NjAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhlIEZyZWVUeXBlIHByb2plY3QgLSBhIEZyZWUgYW5kIFBvcnRhYmxlIFF1YWxpdHkgVHJ1ZVR5cGUgUmVuZGVyZXIuICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAxOTk2LTE5OTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRC4gVHVybmVyLCBSLldpbGhlbG0sIGFuZCBXLiBMZW1iZXJnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGZ0dGltZXI6IEEgc2ltcGxlIHBlcmZvcm1hbmNlIGJlbmNobWFyay4gIE5vdyB3aXRoIGdyYXlsZXZlbCByZW5kZXJpbmcgICovCisvKiAgICAgICAgICAgd2l0aCB0aGUgJy1nJyBvcHRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgIEJlIGF3YXJlIHRoYXQgdGhlIHRpbWVyIHByb2dyYW0gYmVuY2htYXJrcyBkaWZmZXJlbnQgdGhpbmdzICAgICovCisvKiAgICAgICAgICAgaW4gZWFjaCByZWxlYXNlIG9mIHRoZSBGcmVlVHlwZSBsaWJyYXJ5LiAgVGh1cywgcGVyZm9ybWFuY2UgICAgKi8KKy8qICAgICAgICAgICBzaG91bGQgb25seSBiZSBjb21wYXJlZCBiZXR3ZWVuIHNpbWlsYXIgcmVsZWFzZSBudW1iZXJzLiAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOT1RFOiBUaGlzIGlzIGp1c3QgYSB0ZXN0IHByb2dyYW0gdGhhdCBpcyB1c2VkIHRvIHNob3cgb2ZmIGFuZCAgICAgICAgICAqLworLyogICAgICAgIGRlYnVnIHRoZSBjdXJyZW50IGVuZ2luZS4gIEluIG5vIHdheSBkb2VzIGl0IHNob3dzIHRoZSBmaW5hbCAgICAgICovCisvKiAgICAgICAgaGlnaC1sZXZlbCBpbnRlcmZhY2UgdGhhdCBjbGllbnQgYXBwbGljYXRpb25zIHdpbGwgdXNlLiAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJmcmVldHlwZS5oIgorI2luY2x1ZGUgImZ0b3V0bG4uaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dGltZS5oPiAgICAvKiBmb3IgY2xvY2soKSAqLworCisjaW5jbHVkZSAiZ3JhcGguaCIKKworLyogU3VuT1MgNC4xLiogZG9lcyBub3QgZGVmaW5lIENMT0NLU19QRVJfU0VDLCBzbyBpbmNsdWRlIDxzeXMvcGFyYW0uaD4gKi8KKy8qIHRvIGdldCB0aGUgSFogbWFjcm8gd2hpY2ggaXMgdGhlIGVxdWl2YWxlbnQuICAgICAgICAgICAgICAgICAgICAgICAgICovCisjaWYgZGVmaW5lZChfX3N1bl9fKSAmJiAhZGVmaW5lZChTVlI0KSAmJiAhZGVmaW5lZChfX1NWUjQpCisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjZGVmaW5lIENMT0NLU19QRVJfU0VDIEhaCisjZW5kaWYKKworI2RlZmluZSBDSEFSU0laRSAgICA0MDAgICAvKiBjaGFyYWN0ZXIgcG9pbnQgc2l6ZSAqLworI2RlZmluZSBNQVhfR0xZUEhTICA1MTIgICAvKiBNYXhpbXVtIG51bWJlciBvZiBnbHlwaHMgcmVuZGVyZWQgYXQgb25lIHRpbWUgKi8KKworICBjaGFyICBIZWFkZXJbMTI4XTsKKworICBGVF9FcnJvciAgICAgIGVycm9yOworICBGVF9MaWJyYXJ5ICAgIGxpYnJhcnk7CisKKyAgRlRfRmFjZSAgICAgICBmYWNlOworICBGVF9TaXplICAgICAgIHNpemU7CisgIEZUX0dseXBoU2xvdCAgZ2x5cGg7CisKKyAgRlRfT3V0bGluZSAgICBvdXRsaW5lOworCisgIEZUX1BvcyogICBjdXJfeDsKKyAgRlRfUG9zKiAgIGN1cl95OworCisgIHVuc2lnbmVkIHNob3J0KiAgY3VyX2VuZENvbnRvdXI7CisgIHVuc2lnbmVkIGNoYXIqICAgY3VyX3RvdWNoOworCisgIEZUX091dGxpbmUgIG91dGxpbmVzW01BWF9HTFlQSFNdOworCisgIGludCAgICAgICAgICAgICBudW1fZ2x5cGhzOworICBpbnQgICAgICAgICAgICAgdGFiX2dseXBoczsKKyAgaW50ICAgICAgICAgICAgIGN1cl9nbHlwaDsKKyAgaW50ICAgICAgICAgICAgIGN1cl9wb2ludDsKKyAgdW5zaWduZWQgc2hvcnQgIGN1cl9jb250b3VyOworICAKKyAgaW50ICAgICAgICAgICAgIHBpeGVsX3NpemUgICA9IENIQVJTSVpFKjk2LzcyOworICBpbnQgICAgICAgICAgICAgcmVwZWF0X2NvdW50ID0gMTsKKworICBGVF9CaXRtYXAgICAgICBCaXQ7CisgIGdyQml0bWFwICAgICAgIGJpdDsKKworICBpbnQgIEZhaWw7CisgIGludCAgTnVtOworCisgIGludCAgdmlvX0hlaWdodCwgdmlvX1dpZHRoOworCisgIHNob3J0ICB2aXN1YWw7ICAgICAgLyogZGlzcGxheSBnbHlwaHMgd2hpbGUgcmVuZGVyaW5nICovCisgIHNob3J0ICBncmF5X3JlbmRlcjsgLyogc21vb3RoIGZvbnRzIHdpdGggZ3JheSBsZXZlbHMgICovCisKKworCisgIHN0YXRpYyB2b2lkIENsZWFyX0J1ZmZlcigpOworCisgIHN0YXRpYyB2b2lkIFBhbmljKCBjb25zdCBjaGFyKiBtZXNzYWdlICkKKyAgeworICAgIGZwcmludGYoIHN0ZGVyciwgIiVzXG4gIGVycm9yIGNvZGUgPSAweCUwNHhcbiIsIG1lc3NhZ2UsIGVycm9yICk7CisgIH0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBHZXRfVGltZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBSZXR1cm5zIHRoZSBjdXJyZW50IHRpbWUgaW4gbWlsbGlzZWNvbmRzLiAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgbG9uZyAgR2V0X1RpbWUoIHZvaWQgKQorICB7CisgICAgcmV0dXJuIGNsb2NrKCkgKiAxMDAwMCAvIENMT0NLU19QRVJfU0VDOworICB9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbml0X0VuZ2luZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBbGxvY2F0ZXMgYml0bWFwLCByZW5kZXIgcG9vbCBhbmQgb3RoZXIgc3RydWN0cy4uLiAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgdm9pZCAgSW5pdF9FbmdpbmUoIHZvaWQgKQorICB7CisgICAgQml0LnJvd3MgICAgICAgPSBiaXQucm93czsKKyAgICBCaXQud2lkdGggICAgICA9IGJpdC53aWR0aDsKKyAgICBCaXQucGl0Y2ggICAgICA9IGJpdC5waXRjaDsKKyAgICBCaXQuYnVmZmVyICAgICA9IGJpdC5idWZmZXI7CisgICAgQml0LnBpeGVsX21vZGUgPSBncmF5X3JlbmRlciA/IGZ0X3BpeGVsX21vZGVfZ3JheXMgOiBmdF9waXhlbF9tb2RlX21vbm87CisgICAgQml0Lm51bV9ncmF5cyAgPSBiaXQuZ3JheXM7CisgICAgQ2xlYXJfQnVmZmVyKCk7CisgIH0KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENsZWFyX0J1ZmZlcjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIENsZWFycyBjdXJyZW50IGJpdG1hcC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICBzdGF0aWMgdm9pZCAgQ2xlYXJfQnVmZmVyKCB2b2lkICkKKyAgeworICAgIGxvbmcgc2l6ZSA9IEJpdC5yb3dzICogQml0LnBpdGNoOworCisgICAgbWVtc2V0KCBCaXQuYnVmZmVyLCAwLCBzaXplICk7CisgIH0KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExvYWRUcnVlVHlwZUNoYXI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIExvYWRzIGEgZ2x5cGggaW50byBtZW1vcnkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICBGVF9FcnJvciAgTG9hZENoYXIoIGludCAgaWR4ICkKKyAgeworICAgIGVycm9yID0gRlRfTG9hZF9HbHlwaCggZmFjZSwgaWR4LCBGVF9MT0FEX0RFRkFVTFQgKTsKKyAgICBpZiAoIGVycm9yICkKKyAgICAgIHJldHVybiBlcnJvcjsKKworICAgIGdseXBoLT5vdXRsaW5lLnNlY29uZF9wYXNzICAgID0gMDsKKyAgICBnbHlwaC0+b3V0bGluZS5oaWdoX3ByZWNpc2lvbiA9IDA7CisgICAgZ2x5cGgtPm91dGxpbmUuZHJvcG91dF9tb2RlICAgPSAwOworCisgICAgLyogZGVidWdnaW5nICovCisjaWYgMAorICAgIGlmICggaWR4ID09IDAgJiYgIXZpc3VhbCApCisgICAgeworICAgICAgcHJpbnRmKCAicG9pbnRzID0gJWRcbiIsIG91dGxpbmUucG9pbnRzICk7CisgICAgICBmb3IgKCBqID0gMDsgaiA8IG91dGxpbmUucG9pbnRzOyBqKysgKQorICAgICAgICBwcmludGYoICIlMDJ4ICAoJTAxaHgsJTAxaHgpXG4iLAorICAgICAgICAgICAgICAgICBqLCBvdXRsaW5lLnhDb29yZFtqXSwgb3V0bGluZS55Q29vcmRbal0gKTsKKyAgICAgIHByaW50ZiggIlxuIiApOworICAgIH0KKyNlbmRpZgorCisgICAgLyogY3JlYXRlIGEgbmV3IG91dGxpbmUgKi8KKyAgICBGVF9OZXdfT3V0bGluZSggbGlicmFyeSwKKyAgICAgICAgICAgICAgICAgICAgZ2x5cGgtPm91dGxpbmUubl9wb2ludHMsIAorICAgICAgICAgICAgICAgICAgICBnbHlwaC0+b3V0bGluZS5uX2NvbnRvdXJzLCAKKyAgICAgICAgICAgICAgICAgICAgJm91dGxpbmVzW2N1cl9nbHlwaF0gKTsKKworICAgIC8qIGNvcHkgdGhlIGdseXBoIG91dGxpbmUgaW50byBpdCAqLworICAgIGdseXBoLT5vdXRsaW5lLmhpZ2hfcHJlY2lzaW9uID0gMDsKKyAgICBnbHlwaC0+b3V0bGluZS5zZWNvbmRfcGFzcyAgICA9IDA7CisgICAgRlRfQ29weV9PdXRsaW5lKCAmZ2x5cGgtPm91dGxpbmUsICZvdXRsaW5lc1tjdXJfZ2x5cGhdICk7CisKKyAgICAvKiBjZW50ZXIgb3V0bGluZSBhcm91bmQgMCAqLworICAgIHsKKyAgICAgIEZUX0JCb3ggIGJib3g7CisgICAgICAKKyAgICAgIEZUX0dldF9PdXRsaW5lX0NCb3goICZnbHlwaC0+b3V0bGluZSwgJmJib3ggKTsKKyAgICAgIEZUX1RyYW5zbGF0ZV9PdXRsaW5lKCAmb3V0bGluZXNbY3VyX2dseXBoXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAtICggYmJveC54TWF4IC0gYmJveC54TWluICkvMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAtICggYmJveC55TWF4IC0gYmJveC55TWluICkvMiApOworICAgIH0KKyAgICAvKiB0cmFuc2xhdGUgaXQgKi8KKyAgICBGVF9UcmFuc2xhdGVfT3V0bGluZSggJm91dGxpbmVzW2N1cl9nbHlwaF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIEJpdC53aWR0aCAqIDMyICwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQml0LnJvd3MgICogMzIgKTsKKyAgICBjdXJfZ2x5cGgrKzsKKworICAgIHJldHVybiBGVF9FcnJfT2s7CisgIH0KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvbnZlcnRSYXN0ZXI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIFBlcmZvcm1zIHNjYW4gY29udmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICBGVF9FcnJvciAgQ29udmVydFJhc3RlciggaW50ICBpbmRleCApCisgIHsKKyAgICBvdXRsaW5lc1tpbmRleF0uc2Vjb25kX3Bhc3MgICAgPSAwOworICAgIG91dGxpbmVzW2luZGV4XS5oaWdoX3ByZWNpc2lvbiA9IDA7CisKKyAgICByZXR1cm4gRlRfR2V0X091dGxpbmVfQml0bWFwKCBsaWJyYXJ5LCAmb3V0bGluZXNbaW5kZXhdLCAmQml0ICk7CisgIH0KKworCisgIHN0YXRpYyB2b2lkIFVzYWdlKCkKKyAgeworICAgICAgZnByaW50Ziggc3RkZXJyLCAiZnR0aW1lcjogc2ltcGxlIHBlcmZvcm1hbmNlIHRpbWVyIC0tIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3RcbiIgKTsKKyAgICAgIGZwcmludGYoIHN0ZGVyciwgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiIgKTsKKyAgICAgIGZwcmludGYoIHN0ZGVyciwgIlVzYWdlOiBmdHRpbWVyIFtvcHRpb25zXSBmb250bmFtZVsudHRmfC50dGNdXG5cbiIgKTsKKyAgICAgIGZwcmludGYoIHN0ZGVyciwgIm9wdGlvbnM6XG4iKTsKKyAgICAgIGZwcmludGYoIHN0ZGVyciwgIiAgIC1yIDogcmVwZWF0IGNvdW50IHRvIGJlIHVzZWQgKGRlZmF1bHQgaXMgMSlcbiIgKTsKKyAgICAgIGZwcmludGYoIHN0ZGVyciwgIiAgIC1zIDogY2hhcmFjdGVyIHBpeGVsIHNpemUgKGRlZmF1bHQgaXMgNjAwKVxuIiApOworICAgICAgZnByaW50Ziggc3RkZXJyLCAiICAgLXYgOiBkaXNwbGF5IHJlc3VsdHMuLlxuIiApOworICAgICAgZnByaW50Ziggc3RkZXJyLCAiICAgLWcgOiByZW5kZXIgYW50aS1hbGlhc2VkIGdseXBoc1xuIiApOworICAgICAgZXhpdCgxKTsKKyAgfQorCisKKyAgaW50ICBtYWluKCBpbnQgIGFyZ2MsIGNoYXIqKiAgYXJndiApCisgIHsKKyAgICBpbnQgICAgaSwgdG90YWwsIGJhc2UsIHJlbmRlcmVkX2dseXBoczsKKyAgICBjaGFyICAgZmlsZW5hbWVbMTI4ICsgNF07CisgICAgY2hhciAgIGFsdF9maWxlbmFtZVsxMjggKyA0XTsKKyAgICBjaGFyKiAgZXhlY25hbWU7CisgICAgZ3JTdXJmYWNlKiAgc3VyZmFjZSA9IDA7CisKKyAgICBsb25nICAgdCwgdDAsIHR6MDsKKworCisgICAgZXhlY25hbWUgICAgPSBhcmd2WzBdOworCisgICAgZ3JheV9yZW5kZXIgPSAwOworICAgIHZpc3VhbCAgICAgID0gMDsKKworICAgIHdoaWxlICggYXJnYyA+IDEgJiYgYXJndlsxXVswXSA9PSAnLScgKQorICAgIHsKKyAgICAgIHN3aXRjaCAoIGFyZ3ZbMV1bMV0gKQorICAgICAgeworICAgICAgY2FzZSAnZyc6CisgICAgICAgIGdyYXlfcmVuZGVyID0gMTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgJ3YnOgorICAgICAgICB2aXN1YWwgPSAxOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSAncyc6CisgICAgICAgIGFyZ2MtLTsKKyAgICAgICAgYXJndisrOworICAgICAgICBpZiAoIGFyZ2MgPCAyIHx8CisgICAgICAgICAgICBzc2NhbmYoIGFyZ3ZbMV0sICIlZCIsICZwaXhlbF9zaXplICkgIT0gMSApCisgICAgICAgICAgVXNhZ2UoKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgJ3InOgorICAgICAgICBhcmdjLS07CisgICAgICAgIGFyZ3YrKzsKKyAgICAgICAgaWYgKCBhcmdjIDwgMiB8fAorICAgICAgICAgICAgIHNzY2FuZiggYXJndlsxXSwgIiVkIiwgJnJlcGVhdF9jb3VudCApICE9IDEgKQorICAgICAgICAgIFVzYWdlKCk7CisgICAgICAgIGlmIChyZXBlYXRfY291bnQgPCAxKQorICAgICAgICAgIHJlcGVhdF9jb3VudCA9IDE7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJVbmtub3duIGFyZ3VtZW50ICclcychXG4iLCBhcmd2WzFdICk7CisJCVVzYWdlKCk7CisgICAgICB9CisgICAgICBhcmdjLS07CisgICAgICBhcmd2Kys7CisgICAgfQorCisgICAgaWYgKCBhcmdjICE9IDIgKQorCSAgVXNhZ2UoKTsKKworICAgIGkgPSBzdHJsZW4oIGFyZ3ZbMV0gKTsKKyAgICB3aGlsZSAoIGkgPiAwICYmIGFyZ3ZbMV1baV0gIT0gJ1xcJyApCisgICAgeworICAgICAgaWYgKCBhcmd2WzFdW2ldID09ICcuJyApCisgICAgICAgIGkgPSAwOworICAgICAgaS0tOworICAgIH0KKworICAgIGZpbGVuYW1lWzEyOF0gPSAnXDAnOworICAgIGFsdF9maWxlbmFtZVsxMjhdID0gJ1wwJzsKKworICAgIHN0cm5jcHkoIGZpbGVuYW1lLCBhcmd2WzFdLCAxMjggKTsKKyAgICBzdHJuY3B5KCBhbHRfZmlsZW5hbWUsIGFyZ3ZbMV0sIDEyOCApOworCisgICAgaWYgKCBpID49IDAgKQorICAgIHsKKyAgICAgIHN0cm5jcHkoIGZpbGVuYW1lICsgc3RybGVuKCBmaWxlbmFtZSApLCAiLnR0ZiIsIDQgKTsKKyAgICAgIHN0cm5jcHkoIGFsdF9maWxlbmFtZSArIHN0cmxlbiggYWx0X2ZpbGVuYW1lICksICIudHRjIiwgNCApOworICAgIH0KKworICAgIC8qIEluaXRpYWxpemUgZW5naW5lICovCisKKyAgICBpZiAoIChlcnJvciA9IEZUX0luaXRfRnJlZVR5cGUoICZsaWJyYXJ5ICkpICkKKyAgICAgIFBhbmljKCAiRXJyb3Igd2hpbGUgaW5pdGlhbGl6aW5nIGVuZ2luZSIgKTsKKworICAgIC8qIExvYWQgZmFjZSAqLworCisgICAgZXJyb3IgPSBGVF9OZXdfRmFjZSggbGlicmFyeSwgZmlsZW5hbWUsIDAsICZmYWNlICk7CisgICAgaWYgKCBlcnJvciA9PSBGVF9FcnJfQ2Fubm90X09wZW5fU3RyZWFtICkKKyAgICAgIFBhbmljKCAiQ291bGQgbm90IGZpbmQvb3BlbiBmb250IHJlc291cmNlIiApOworICAgIGVsc2UgaWYgKCBlcnJvciApCisgICAgICBQYW5pYyggIkVycm9yIHdoaWxlIG9wZW5pbmcgZm9udCByZXNvdXJjZSIgKTsKKworICAgIC8qIGdldCBmYWNlIHByb3BlcnRpZXMgYW5kIGFsbG9jYXRlIHByZWxvYWQgYXJyYXlzICovCisKKyAgICBudW1fZ2x5cGhzID0gZmFjZS0+bnVtX2dseXBoczsKKyAgICBnbHlwaCAgICAgID0gZmFjZS0+Z2x5cGg7CisgICAgICAgIAorICAgIHRhYl9nbHlwaHMgPSBNQVhfR0xZUEhTOworICAgIGlmICggdGFiX2dseXBocyA+IG51bV9nbHlwaHMgKQorICAgICAgdGFiX2dseXBocyA9IG51bV9nbHlwaHM7CisKKyAgICAvKiBjcmVhdGUgc2l6ZSAqLworCisgICAgZXJyb3IgPSBGVF9TZXRfUGl4ZWxfU2l6ZXMoIGZhY2UsIHBpeGVsX3NpemUsIHBpeGVsX3NpemUgKTsKKyAgICBpZiAoIGVycm9yICkgUGFuaWMoICJDb3VsZCBub3QgcmVzZXQgaW5zdGFuY2UiICk7CisKKyAgICBiaXQubW9kZSAgPSBncmF5X3JlbmRlciA/IGdyX3BpeGVsX21vZGVfZ3JheSA6IGdyX3BpeGVsX21vZGVfbW9ubzsKKyAgICBiaXQud2lkdGggPSA2NDA7CisgICAgYml0LnJvd3MgID0gNDgwOworICAgIGJpdC5ncmF5cyA9IDEyODsKKyAKKyAgICBpZiAoIHZpc3VhbCApCisgICAgeworICAgICAgaWYgKCAhZ3JJbml0RGV2aWNlcygpICkKKyAgICAgICAgUGFuaWMoICJDb3VsZCBub3QgaW5pdGlhbGl6ZSBncmFwaGljcy5cbiIgKTsKKyAgICAgICAgCisgICAgICBzdXJmYWNlID0gZ3JOZXdTdXJmYWNlKCAwLCAmYml0ICk7CisgICAgICBpZiAoIXN1cmZhY2UpCisgICAgICAgIFBhbmljKCAiQ291bGQgbm90IG9wZW4gZ3JhcGhpY3Mgd2luZG93L3NjcmVlbi5cbiIgKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGlmICggZ3JOZXdCaXRtYXAoIGJpdC5tb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgYml0LmdyYXlzLAorICAgICAgICAgICAgICAgICAgICAgICAgYml0LndpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgYml0LnJvd3MsCisgICAgICAgICAgICAgICAgICAgICAgICZiaXQgKSApCisgICAgICAgIFBhbmljKCAiQ291bGQgbm90IGNyZWF0ZSByZW5kZXJpbmcgYnVmZmVyLlxuIiApOworICAgIH0KKworICAgIEluaXRfRW5naW5lKCk7CisKKyAgICBOdW0gID0gMDsKKyAgICBGYWlsID0gMDsKKworICAgIHRvdGFsID0gbnVtX2dseXBoczsKKyAgICBiYXNlICA9IDA7CisKKyAgICByZW5kZXJlZF9nbHlwaHMgPSAwOworCisgICAgdDAgPSAwOyAgLyogSW5pdGlhbCB0aW1lICovCisKKyAgICB0ejAgPSBHZXRfVGltZSgpOworCisgICAgd2hpbGUgKCB0b3RhbCA+IDAgKQorICAgIHsKKyAgICAgIGludCAgcmVwZWF0OworICAgICAgCisgICAgICAvKiBGaXJzdCwgcHJlbG9hZCAndGFiX2dseXBocycgaW4gbWVtb3J5ICovCisgICAgICBjdXJfZ2x5cGggICA9IDA7CisgICAgICBjdXJfcG9pbnQgICA9IDA7CisgICAgICBjdXJfY29udG91ciA9IDA7CisgIAorICAgICAgcHJpbnRmKCAibG9hZGluZyAlZCBnbHlwaHMiLCB0YWJfZ2x5cGhzICk7CisKKyAgICAgIGZvciAoIE51bSA9IDA7IE51bSA8IHRhYl9nbHlwaHM7IE51bSsrICkKKyAgICAgIHsKKyAgICAgICAgZXJyb3IgPSBMb2FkQ2hhciggYmFzZSArIE51bSApOworICAgICAgICBpZiAoIGVycm9yICkKKyAgICAgICAgICBGYWlsKys7CisKKyAgICAgICAgdG90YWwtLTsKKyAgICAgIH0KKworICAgICAgYmFzZSArPSB0YWJfZ2x5cGhzOworCisgICAgICBpZiAoIHRhYl9nbHlwaHMgPiB0b3RhbCApIAorICAgICAgICB0YWJfZ2x5cGhzID0gdG90YWw7CisKKyAgICAgIHByaW50ZiggIiwgcmVuZGVyaW5nLi4uICIgKTsKKworICAgICAgLyogTm93LCByZW5kZXIgdGhlIGxvYWRlZCBnbHlwaHMgKi8KKworICAgICAgdCA9IEdldF9UaW1lKCk7CisKKyAgICAgIGZvciAoIHJlcGVhdCA9IDA7IHJlcGVhdCA8IHJlcGVhdF9jb3VudDsgcmVwZWF0KysgKQorICAgICAgeworICAgICAgICBmb3IgKCBOdW0gPSAwOyBOdW0gPCBjdXJfZ2x5cGg7IE51bSsrICkKKyAgICAgICAgeworICAgICAgICAgIGlmICggKGVycm9yID0gQ29udmVydFJhc3RlciggTnVtICkpICkKKyAgICAgICAgICAgIEZhaWwrKzsKKyAgICAgICAgICAgIAorICAgICAgICAgIGVsc2UKKyAgCSAgeworICAgICAgICAgICAgcmVuZGVyZWRfZ2x5cGhzICsrOworCisgICAgICAgICAgICBpZiAoIE51bSA9PSAwICYmIHZpc3VhbCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHNwcmludGYoIEhlYWRlciwgIkdseXBoOiAlNWQiLCBOdW0gKTsKKyAgICAgICAgICAgICAgZ3JTZXRUaXRsZSggc3VyZmFjZSwgSGVhZGVyICk7CisgICAgICAgICAgICAgIGdyUmVmcmVzaFN1cmZhY2UoIHN1cmZhY2UgKTsKKyAgICAgICAgICAgICAgQ2xlYXJfQnVmZmVyKCk7CisgICAgICAgICAgICB9CisJICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgdCA9IEdldF9UaW1lKCkgLSB0OworICAgICAgaWYgKCB0IDwgMCApCisgICAgICAgIHQgKz0gMTAwMCAqIDYwICogNjA7CisKKyAgICAgIHByaW50ZiggIiA9ICVmIHNcbiIsIChkb3VibGUpdCAvIDEwMDAwICk7CisgICAgICB0MCArPSB0OworCisgICAgICAvKiBOb3cgZnJlZSBhbGwgbG9hZGVkIG91dGxpbmVzICovCisgICAgICBmb3IgKCBOdW0gPSAwOyBOdW0gPCBjdXJfZ2x5cGg7IE51bSsrICkKKyAgICAgICAgRlRfRG9uZV9PdXRsaW5lKCBsaWJyYXJ5LCAmb3V0bGluZXNbTnVtXSApOworICAgIH0KKworICAgIHR6MCA9IEdldF9UaW1lKCkgLSB0ejA7CisKKyAgICBGVF9Eb25lX0ZhY2UoIGZhY2UgKTsKKworICAgIHByaW50ZiggIlxuIiApOworICAgIHByaW50ZiggInJlbmRlcmVkIGdseXBocyAgPSAlZFxuIiwgcmVuZGVyZWRfZ2x5cGhzICk7CisgICAgcHJpbnRmKCAicmVuZGVyIHRpbWUgICAgICA9ICVmIHNcbiIsIChkb3VibGUpdDAgLyAxMDAwMCApOworICAgIHByaW50ZiggImZhaWxzICAgICAgICAgICAgPSAlZFxuIiwgRmFpbCApOworICAgIHByaW50ZiggImF2ZXJhZ2UgZ2x5cGhzL3MgPSAlZlxuIiwgCisgICAgICAgICAgICAgKGRvdWJsZSlyZW5kZXJlZF9nbHlwaHMgLyB0MCAqIDEwMDAwICk7CisKKyAgICBwcmludGYoICJ0b3RhbCB0aW1pbmcgICAgID0gJWYgc1xuIiwgKGRvdWJsZSl0ejAgLyAxMDAwMCApOworICAgIHByaW50ZiggIkZhaWxzID0gJWRcbiIsIEZhaWwgKTsKKworICAgIEZUX0RvbmVfRnJlZVR5cGUoIGxpYnJhcnkgKTsKKworICAgIGV4aXQoIDAgKTsgICAgICAvKiBmb3Igc2FmZXR5IHJlYXNvbnMgKi8KKworICAgIHJldHVybiAwOyAgICAgICAvKiBuZXZlciByZWFjaGVkICovCisgIH0KKworCisvKiBFbmQgKi8KZGlmZiAtLWdpdCBhL2RlbW9zL3NyYy9mdHRyeS5jIGIvZGVtb3Mvc3JjL2Z0dHJ5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWRkODc4ZQotLS0gL2Rldi9udWxsCisrKyBiL2RlbW9zL3NyYy9mdHRyeS5jCkBAIC0wLDAgKzEsMTU1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoZSBGcmVlVHlwZSBwcm9qZWN0IC0tIGEgZnJlZSBhbmQgcG9ydGFibGUgcXVhbGl0eSBUcnVlVHlwZSByZW5kZXJlci4gICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMTk5Ni0xOTk4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEQuIFR1cm5lciwgUi5XaWxoZWxtLCBhbmQgVy4gTGVtYmVyZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBmdGxpbnQ6IGEgc2ltcGxlIFRydWVUeXBlIGluc3RydWN0aW9uIHRlc3Rlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTk9URTogIFRoaXMgaXMganVzdCBhIHRlc3QgcHJvZ3JhbSB0aGF0IGlzIHVzZWQgdG8gc2hvdyBvZmYgYW5kICAgICAgICAgKi8KKy8qICAgICAgICAgZGVidWcgdGhlIGN1cnJlbnQgZW5naW5lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgImZyZWV0eXBlLmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisKKyNkZWZpbmUgZ2V0dGV4dCggeCApICAoIHggKQorCisgIEZUX0Vycm9yICAgICAgZXJyb3I7CisKKyAgRlRfTGlicmFyeSAgICBsaWJyYXJ5OworICBGVF9GYWNlICAgICAgIGZhY2U7CisKKyAgdW5zaWduZWQgaW50ICBudW1fZ2x5cGhzOworICBpbnQgICAgICAgICAgIHB0c2l6ZTsKKworICBpbnQgIEZhaWw7CisgIGludCAgTnVtOworCisKKworICBzdGF0aWMgdm9pZCAgVXNhZ2UoIGNoYXIqICBuYW1lICkKKyAgeworICAgIHByaW50ZiggImZ0dHJ5OiBzaW1wbGUgVHJ1ZVR5cGUgaW5zdHJ1Y3Rpb24gdGVzdGVyIC0tIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3RcbiIgKTsKKyAgICBwcmludGYoICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIiApOworICAgIHByaW50ZiggIlxuIiApOworICAgIHByaW50ZiggIlVzYWdlOiAlcyBwcGVtIGdseXBoIGZvbnRuYW1lIFtmb250bmFtZTIuLl1cblxuIiwgbmFtZSApOworICAgIHByaW50ZiggIiAgICBvciAlcyAtdSBnbHlwaCBmb250bmFtZSBbZm9udG5hbWUyLi5dXG4iLCBuYW1lICk7CisgICAgcHJpbnRmKCAiICAgICAgICAgIHRvIGxvYWQgYW4gdW5zY2FsZWQgZ2x5cGhcblxuIiApOworCisgICAgZXhpdCggMSApOworICB9CisKKworICBzdGF0aWMgdm9pZCAgUGFuaWMoIGNvbnN0IGNoYXIqICBtZXNzYWdlICkKKyAgeworICAgIGZwcmludGYoIHN0ZGVyciwgIiVzXG4gIGVycm9yIGNvZGUgPSAweCUwNHhcbiIsIG1lc3NhZ2UsIGVycm9yICk7CisgICAgZXhpdCgxKTsKKyAgfQorCisgIGludCAgbWFpbiggaW50ICBhcmdjLCBjaGFyKiogIGFyZ3YgKSAKKyAgeworICAgIGludCAgICAgICAgICAgaSwgZmlsZV9pbmRleCwgZ2x5cGhfaW5kZXg7CisgICAgY2hhciAgICAgICAgICBmaWxlbmFtZVsxMjggKyA0XTsKKyAgICBjaGFyICAgICAgICAgIGFsdF9maWxlbmFtZVsxMjggKyA0XTsKKyAgICBjaGFyKiAgICAgICAgIGV4ZWNuYW1lOworICAgIGNoYXIqICAgICAgICAgZm5hbWU7CisgICAgaW50ICAgICAgICAgICBsb2FkX3Vuc2NhbGVkID0gMDsKKworICAgIGV4ZWNuYW1lID0gYXJndlswXTsKKworICAgIGlmICggYXJnYyA8IDMgKQorICAgICAgVXNhZ2UoIGV4ZWNuYW1lICk7CisKKyAgICBpZiAoIGFyZ3ZbMV1bMF0gPT0gJy0nICYmCisgICAgICAgICBhcmd2WzFdWzFdID09ICd1JyApCisgICAgeworICAgICAgbG9hZF91bnNjYWxlZCA9IDE7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBpZiAoIHNzY2FuZiggYXJndlsxXSwgIiVkIiwgJnB0c2l6ZSApICE9IDEgKQorICAgICAgICBVc2FnZSggZXhlY25hbWUgKTsKKyAgICB9CisgICAgYXJnYy0tOworICAgIGFyZ3YrKzsKKworICAgIGlmICggc3NjYW5mKCBhcmd2WzFdLCAiJWQiLCAmZ2x5cGhfaW5kZXggKSAhPSAxICkKKyAgICAgIFVzYWdlKCBleGVjbmFtZSApOworCisgICAgZXJyb3IgPSBGVF9Jbml0X0ZyZWVUeXBlKCAmbGlicmFyeSApOworICAgIGlmIChlcnJvcikgUGFuaWMoICJDb3VsZCBub3QgY3JlYXRlIGxpYnJhcnkgb2JqZWN0IiApOworCisgICAgLyogTm93IGNoZWNrIGFsbCBmaWxlcyAqLworICAgIGZvciAoIGZpbGVfaW5kZXggPSAyOyBmaWxlX2luZGV4IDwgYXJnYzsgZmlsZV9pbmRleCsrICkKKyAgICB7CisgICAgICBmbmFtZSA9IGFyZ3ZbZmlsZV9pbmRleF07CisgICAgICBpICAgICA9IHN0cmxlbiggZm5hbWUgKTsKKyAgICAgIHdoaWxlICggaSA+IDAgJiYgZm5hbWVbaV0gIT0gJ1xcJyAmJiBmbmFtZVtpXSAhPSAnLycgKQorICAgICAgeworICAgICAgICBpZiAoIGZuYW1lW2ldID09ICcuJyApCisgICAgICAgICAgaSA9IDA7CisgICAgICAgIGktLTsKKyAgICAgIH0KKworICAgICAgZmlsZW5hbWVbMTI4XSA9ICdcMCc7CisgICAgICBhbHRfZmlsZW5hbWVbMTI4XSA9ICdcMCc7CisKKyAgICAgIHN0cm5jcHkoIGZpbGVuYW1lLCBmbmFtZSwgMTI4ICk7CisgICAgICBzdHJuY3B5KCBhbHRfZmlsZW5hbWUsIGZuYW1lLCAxMjggKTsKKworICAgICAgaWYgKCBpID49IDAgKQorICAgICAgeworICAgICAgICBzdHJuY3B5KCBmaWxlbmFtZSArIHN0cmxlbiggZmlsZW5hbWUgKSwgIi50dGYiLCA0ICk7CisgICAgICAgIHN0cm5jcHkoIGFsdF9maWxlbmFtZSArIHN0cmxlbiggYWx0X2ZpbGVuYW1lICksICIudHRjIiwgNCApOworICAgICAgfQorCisgICAgICBpICAgICA9IHN0cmxlbiggZmlsZW5hbWUgKTsKKyAgICAgIGZuYW1lID0gZmlsZW5hbWU7CisKKyAgICAgIHdoaWxlICggaSA+PSAwICkKKyAgICAgICAgaWYgKCBmaWxlbmFtZVtpXSA9PSAnLycgfHwgZmlsZW5hbWVbaV0gPT0gJ1xcJyApCisgICAgICAgIHsKKyAgICAgICAgICBmbmFtZSA9IGZpbGVuYW1lICsgaSArIDE7CisgICAgICAgICAgaSA9IC0xOworICAgICAgICB9CisgICAgICAgIGVsc2UgCisgICAgICAgICAgaS0tOworCisgICAgICBwcmludGYoICIlczogIiwgZm5hbWUgKTsKKworICAgICAgLyogTG9hZCBmYWNlICovCisgICAgICBlcnJvciA9IEZUX05ld19GYWNlKCBsaWJyYXJ5LCBmaWxlbmFtZSwgMCwgJmZhY2UgKTsKKyAgICAgIGlmIChlcnJvcikgUGFuaWMoICJDb3VsZCBub3QgY3JlYXRlIGZhY2Ugb2JqZWN0IiApOworCisgICAgICBudW1fZ2x5cGhzID0gZmFjZS0+bnVtX2dseXBoczsKKworICAgICAgZXJyb3IgPSBGVF9TZXRfQ2hhcl9TaXplKCBmYWNlLCBwdHNpemUgPDwgNiwgMCwgMCwgMCApOworICAgICAgaWYgKGVycm9yKSBQYW5pYyggIkNvdWxkIG5vdCBzZXQgY2hhcmFjdGVyIHNpemUiICk7CisgICAgICAKKyAgICAgIGVycm9yID0gRlRfTG9hZF9HbHlwaCggZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGhfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRfdW5zY2FsZWQgPyBGVF9MT0FEX05PX1NDQUxFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBGVF9MT0FEX0RFRkFVTFQgKTsKKyAgICAgIGlmICggZXJyb3IgPT0gMCApCisgICAgICAgIHByaW50ZiggIk9LLlxuIiApOworICAgICAgZWxzZQorICAgICAgICBwcmludGYoICJGYWlsIHdpdGggZXJyb3IgMHglMDR4XG4iLCBlcnJvciApOworCisgICAgICBGVF9Eb25lX0ZhY2UoIGZhY2UgKTsKKyAgICB9CisKKyAgICBGVF9Eb25lX0ZyZWVUeXBlKGxpYnJhcnkpOworICAgIGV4aXQoIDAgKTsgICAgICAvKiBmb3Igc2FmZXR5IHJlYXNvbnMgKi8KKworICAgIHJldHVybiAwOyAgICAgICAvKiBuZXZlciByZWFjaGVkICovCisgIH0KKworCisvKiBFbmQgKi8KZGlmZiAtLWdpdCBhL2RlbW9zL3NyYy9mdHZpZXcuYyBiL2RlbW9zL3NyYy9mdHZpZXcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGViZGUwCi0tLSAvZGV2L251bGwKKysrIGIvZGVtb3Mvc3JjL2Z0dmlldy5jCkBAIC0wLDAgKzEsNjE1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoZSBGcmVlVHlwZSBwcm9qZWN0IC0tIGEgZnJlZSBhbmQgcG9ydGFibGUgcXVhbGl0eSBUcnVlVHlwZSByZW5kZXJlci4gICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMTk5Ni0xOTk5IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEQuIFR1cm5lciwgUi5XaWxoZWxtLCBhbmQgVy4gTGVtYmVyZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEZUVmlldyAtIGEgc2ltcGxlIGZvbnQgdmlld2VyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGlzIGEgbmV3IHZlcnNpb24gdXNpbmcgdGhlIE1pR1MgZ3JhcGhpY3Mgc3Vic3lzdGVtIGZvciAgICAgICAgICAgICAqLworLyogIGJsaXR0aW5nIGFuZCBkaXNwbGF5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQcmVzcyBGMSB3aGVuIHJ1bm5pbmcgdGhpcyBwcm9ncmFtIHRvIGhhdmUgYSBsaXN0IG9mIGtleS1iaW5kaW5ncyAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgImZyZWV0eXBlLmgiCisjaW5jbHVkZSAiZnRvdXRsbi5oIgorI2luY2x1ZGUgImNvbW1vbi5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImdyYXBoLmgiCisjaW5jbHVkZSAiZ3Jmb250LmgiCisKKyNkZWZpbmUgIERJTV9YICAgNTAwCisjZGVmaW5lICBESU1fWSAgIDQwMAorCisjZGVmaW5lICBDRU5URVJfWCAgIChiaXQud2lkdGgvMikKKyNkZWZpbmUgIENFTlRFUl9ZICAgKGJpdC5yb3dzLzIpCisKKyNkZWZpbmUgIE1BWFBUU0laRSAgNTAwICAgICAgICAgICAgICAgICAvKiBkdHAgKi8KKworCisgIGNoYXIgIEhlYWRlclsxMjhdOworICBjaGFyKiBuZXdfaGVhZGVyID0gMDsKKworICBGVF9MaWJyYXJ5ICAgIGxpYnJhcnk7ICAgICAgLyogdGhlIEZyZWVUeXBlIGxpYnJhcnkgICAgICAgICAgICAqLworICBGVF9GYWNlICAgICAgIGZhY2U7ICAgICAgICAgLyogdGhlIGZvbnQgZmFjZSAgICAgICAgICAgICAgICAgICAqLworICBGVF9TaXplICAgICAgIHNpemU7ICAgICAgICAgLyogdGhlIGZvbnQgc2l6ZSAgICAgICAgICAgICAgICAgICAqLworICBGVF9HbHlwaFNsb3QgIGdseXBoOyAgICAgICAgLyogdGhlIGdseXBoIHNsb3QgICAgICAgICAgICAgICAgICAqLworICAKKyAgRlRfRXJyb3IgICAgICBlcnJvcjsgICAgICAgIC8qIGVycm9yIHJldHVybmVkIGJ5IEZyZWVUeXBlID8gICAgKi8KKworICBnclN1cmZhY2UqICAgICBzdXJmYWNlOyAgICAgLyogY3VycmVudCBkaXNwbGF5IHN1cmZhY2UgICAgICAgICAqLworICBnckJpdG1hcCAgICAgICBiaXQ7ICAgICAgICAgLyogY3VycmVudCBkaXNwbGF5IGJpdG1hcCAgICAgICAgICAqLworCisgIGludCAgbnVtX2dseXBoczsgICAgICAgICAgICAvKiBudW1iZXIgb2YgZ2x5cGhzICovCisgIGludCAgcHRzaXplOyAgICAgICAgICAgICAgICAvKiBjdXJyZW50IHBvaW50IHNpemUgKi8KKyAgCisgIGludCAgaGludGVkICAgICAgPSAxOyAgICAgICAvKiBpcyBnbHlwaCBoaW50aW5nIGFjdGl2ZSA/ICAgICovCisgIGludCAgZ3JheV9yZW5kZXIgPSAxOyAgICAgICAvKiBpcyBhbnRpLWFsaWFzaW5nIGFjdGl2ZSA/ICAgICovCisgIGludCAgdXNlX3NiaXRzICAgPSAxOyAgICAgICAvKiBkbyB3ZSB1c2UgZW1iZWRkZWQgYml0bWFwcyA/ICovCisgIGludCAgbG93X3ByZWMgICAgPSAxOyAgICAgICAvKiBmb3JjZSBsb3cgcHJlY2lzaW9uICAgICAgICAgICovCisgIGludCAgTnVtOyAgICAgICAgICAgICAgICAgICAvKiBjdXJyZW50IGZpcnN0IGdseXBoIGluZGV4ICAgICovCisKKyAgaW50ICAgIHJlcyA9IDk2OworCisgIGludCAgICAgICAgICAgIEZhaWw7CisgIHVuc2lnbmVkIGNoYXIgIGF1dG9ydW47CisKKyAgaW50ICBncmFwaF9pbml0ID0gMDsKKworCisgIC8qIFBhbmljWiAqLworICBzdGF0aWMgdm9pZCBQYW5pY1ooIGNvbnN0IGNoYXIqIG1lc3NhZ2UgKQorICB7CisgICAgZnByaW50Ziggc3RkZXJyLCAiJXNcbiAgZXJyb3IgPSAweCUwNHhcbiIsIG1lc3NhZ2UsIGVycm9yICk7CisgICAgZXhpdCgxKTsKKyAgfQorCisKKyAgLyogQ2xlYXJzIHRoZSBCaXQgYml0bWFwL3BpeG1hcCAqLworICBzdGF0aWMgdm9pZCAgQ2xlYXJfRGlzcGxheSggdm9pZCApCisgIHsKKyAgICBsb25nICBzaXplID0gKGxvbmcpYml0LnBpdGNoICogYml0LnJvd3M7CisgICAgbWVtc2V0KCBiaXQuYnVmZmVyLCAwLCBzaXplICk7CisgIH0KKworCisgIC8qIEluaXRpYWxpemUgdGhlIGRpc3BsYXkgYml0bWFwIG5hbWVkIEJpdCAqLworICBzdGF0aWMgaW50ICBJbml0X0Rpc3BsYXkoKQorICB7CisgICAgZ3JJbml0RGV2aWNlcygpOworCisgICAgYml0Lm1vZGUgICA9IGdyX3BpeGVsX21vZGVfZ3JheTsKKyAgICBiaXQud2lkdGggID0gRElNX1g7CisgICAgYml0LnJvd3MgICA9IERJTV9ZOworICAgIGJpdC5ncmF5cyAgPSAxMjg7CisKKyAgICBzdXJmYWNlID0gZ3JOZXdTdXJmYWNlKCAwLCAmYml0ICk7CisgICAgaWYgKCFzdXJmYWNlKQorICAgICAgUGFuaWNaKCAiY291bGQgbm90IGFsbG9jYXRlIGRpc3BsYXkgc3VyZmFjZVxuIiApOworCisgICAgZ3JhcGhfaW5pdCA9IDE7CisgICAgcmV0dXJuIDA7CisgIH0KKworCisjZGVmaW5lIE1BWF9CVUZGRVIgIDY1MDAwCisKKyNkZWZpbmUgRkxPT1IoeCkgICgoeCkgJiAtNjQpCisjZGVmaW5lIENFSUwoeCkgICAoKCh4KSs2MykgJiAtNjQpCisjZGVmaW5lIFRSVU5DKHgpICAoKHgpID4+IDYpCisKKyAgc3RhdGljCisgIGNoYXIgICBiaXRfYnVmZmVyWyBNQVhfQlVGRkVSIF07CisgIAorICAvKiBSZW5kZXIgYSBzaW5nbGUgZ2x5cGggKi8KKyAgc3RhdGljIEZUX0Vycm9yICBSZW5kZXJfR2x5cGgoIGludCAgeF9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgIHlfb2Zmc2V0ICkKKyAgeworICAgIC8qIGZpcnN0LCByZW5kZXIgdGhlIGdseXBoIGludG8gYW4gaW50ZXJtZWRpYXRlIGJ1ZmZlciAqLworICAgIEZUX0JpdG1hcCAgYml0MjsKKyAgICBnckJpdG1hcCAgIGJpdDM7CisgICAgaW50ICAgICAgICB3aWR0aCwgaGVpZ2h0LCBwaXRjaCwgc2l6ZTsKKyAgICBpbnQgICAgICAgIGxlZnQsIHJpZ2h0LCB0b3AsIGJvdHRvbTsKKworICAgIGxlZnQgID0gRkxPT1IoIGdseXBoLT5tZXRyaWNzLmhvcmlCZWFyaW5nWCApOworICAgIHJpZ2h0ID0gQ0VJTCggZ2x5cGgtPm1ldHJpY3MuaG9yaUJlYXJpbmdYICsgZ2x5cGgtPm1ldHJpY3Mud2lkdGggKTsKKyAgICB3aWR0aCA9IFRSVU5DKHJpZ2h0IC0gbGVmdCk7CisgICAgCisgICAgdG9wICAgID0gQ0VJTCggZ2x5cGgtPm1ldHJpY3MuaG9yaUJlYXJpbmdZICk7CisgICAgYm90dG9tID0gRkxPT1IoIGdseXBoLT5tZXRyaWNzLmhvcmlCZWFyaW5nWSAtIGdseXBoLT5tZXRyaWNzLmhlaWdodCApOworICAgIGhlaWdodCA9IFRSVU5DKCB0b3AgLSBib3R0b20gKTsKKworICAgIGlmICggZ2x5cGgtPmZvcm1hdCA9PSBmdF9nbHlwaF9mb3JtYXRfb3V0bGluZSApCisgICAgeyAgICAKKyAgICAgIHBpdGNoICA9ICggZ3JheV9yZW5kZXIgPyAod2lkdGgrMykgJiAtNCA6ICh3aWR0aCs3KSA+PiAzICk7CisgICAgICBzaXplICAgPSBwaXRjaCpoZWlnaHQ7IAorCisgICAgICBpZiAoc2l6ZSA+IE1BWF9CVUZGRVIpCisgICAgICAgIHJldHVybiBGVF9FcnJfT3V0X09mX01lbW9yeTsKKyAgICAKKyAgICAgIGJpdDIud2lkdGggICAgICA9IHdpZHRoOworICAgICAgYml0Mi5yb3dzICAgICAgID0gaGVpZ2h0OworICAgICAgYml0Mi5waXRjaCAgICAgID0gcGl0Y2g7CisgICAgICBiaXQyLnBpeGVsX21vZGUgPSBncmF5X3JlbmRlciA/IGZ0X3BpeGVsX21vZGVfZ3JheXMgOiBmdF9waXhlbF9tb2RlX21vbm87CisgICAgICBiaXQyLmJ1ZmZlciAgICAgPSBiaXRfYnVmZmVyOworCisgICAgICBiaXQzLnJvd3MgICA9IGJpdDIucm93czsKKyAgICAgIGJpdDMud2lkdGggID0gYml0Mi53aWR0aDsKKyAgICAgIGJpdDMucGl0Y2ggID0gYml0Mi5waXRjaDsKKyAgICAgIGJpdDMubW9kZSAgID0gZ3JheV9yZW5kZXIgPyBiaXQubW9kZSA6IGdyX3BpeGVsX21vZGVfbW9ubzsKKyAgICAgIGJpdDMuYnVmZmVyID0gYml0X2J1ZmZlcjsKKyAgICAgIGJpdDMuZ3JheXMgID0gMTI4OworCisgICAgICBGVF9UcmFuc2xhdGVfT3V0bGluZSggJmdseXBoLT5vdXRsaW5lLCAtbGVmdCwgLWJvdHRvbSApOworICAgICAgbWVtc2V0KCBiaXRfYnVmZmVyLCAwLCBzaXplICk7CisKKyAgICAgIGlmIChsb3dfcHJlYykKKyAgICAgICAgZ2x5cGgtPm91dGxpbmUuaGlnaF9wcmVjaXNpb24gPSAwOworICAgICAgICAKKyAgICAgIEZUX0dldF9PdXRsaW5lX0JpdG1hcCggbGlicmFyeSwgJmdseXBoLT5vdXRsaW5lLCAmYml0MiApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgYml0My5yb3dzICAgPSBnbHlwaC0+Yml0bWFwLnJvd3M7CisgICAgICBiaXQzLndpZHRoICA9IGdseXBoLT5iaXRtYXAud2lkdGg7CisgICAgICBiaXQzLnBpdGNoICA9IGdseXBoLT5iaXRtYXAucGl0Y2g7CisgICAgICBiaXQzLm1vZGUgICA9IGdyX3BpeGVsX21vZGVfbW9ubzsKKyAgICAgIGJpdDMuYnVmZmVyID0gZ2x5cGgtPmJpdG1hcC5idWZmZXI7CisgICAgICBiaXQzLmdyYXlzICA9IDA7CisgICAgfQorICAgICAgCisgICAgLyogVGhlbiwgYmxpdCB0aGUgaW1hZ2UgdG8gdGhlIHRhcmdldCBzdXJmYWNlICovCisgICAgZ3JCbGl0R2x5cGhUb0JpdG1hcCggJmJpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmYml0MywKKyAgICAgICAgICAgICAgICAgICAgICAgICB4X29mZnNldCArIFRSVU5DKGxlZnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHlfb2Zmc2V0IC0gVFJVTkModG9wKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoZ3JDb2xvcikxMjdMICk7IAorICAgIHJldHVybiAwOworICB9CisKKworICBzdGF0aWMgRlRfRXJyb3IgIFJlc2V0X1NjYWxlKCBpbnQgIHBvaW50U2l6ZSApCisgIHsKKyAgICBGVF9FcnJvciAgZXJyb3I7CisKKyAgICBlcnJvciA9IEZUX1NldF9DaGFyX1NpemUoIGZhY2UsIHBvaW50U2l6ZSA8PCA2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRTaXplIDw8IDYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMgKTsKKyAgICBpZiAoIGVycm9yICkKKyAgICB7CisgICAgfQorICAgIHJldHVybiBGVF9FcnJfT2s7CisgIH0KKyAgCisKKyAgc3RhdGljIEZUX0Vycm9yICBMb2FkQ2hhciggaW50ICBpZHgsIGludCAgaGludCApCisgIHsKKyAgICBpbnQgIGZsYWdzOworCisgICAgZmxhZ3MgPSBGVF9MT0FEX0RFRkFVTFQ7CisgICAgCisgICAgaWYgKCAhaGludCApCisgICAgICBmbGFncyB8PSBGVF9MT0FEX05PX0hJTlRJTkc7CisKKyAgICBpZiAoICF1c2Vfc2JpdHMgKQorICAgICAgZmxhZ3MgfD0gRlRfTE9BRF9OT19CSVRNQVA7CisKKyAgICByZXR1cm4gRlRfTG9hZF9HbHlwaCggZmFjZSwgaWR4LCBmbGFncyApOworICB9CisKKworCisgIHN0YXRpYyBGVF9FcnJvciAgUmVuZGVyX0FsbCggaW50ICBmaXJzdF9nbHlwaCwgaW50ICBwdHNpemUgKQorICB7CisgICAgRlRfRjI2RG90NiAgc3RhcnRfeCwgc3RhcnRfeSwgc3RlcF94LCBzdGVwX3ksIHgsIHk7CisgICAgaW50ICAgICAgICAgaTsKKworICAgIEZUX0Vycm9yICAgIGVycm9yOworCisKKyAgICBzdGFydF94ID0gNDsKKyAgICBzdGFydF95ID0gMTYgKyBwdHNpemUgOworCisgICAgc3RlcF94ID0gc2l6ZS0+bWV0cmljcy54X3BwZW0gKyA0OworICAgIHN0ZXBfeSA9IHNpemUtPm1ldHJpY3MueV9wcGVtICsgMTA7CisKKyAgICB4ID0gc3RhcnRfeDsKKyAgICB5ID0gc3RhcnRfeTsKKworICAgIGkgPSBmaXJzdF9nbHlwaDsKKworICAgIHdoaWxlICggaSA8IG51bV9nbHlwaHMgKQorICAgIHsKKyAgICAgIGlmICggIShlcnJvciA9IExvYWRDaGFyKCBpLCBoaW50ZWQgKSkgKQorICAgICAgeworICAgICAgICBSZW5kZXJfR2x5cGgoIHgsIHkgKTsKKworICAgICAgICB4ICs9ICggZ2x5cGgtPm1ldHJpY3MuaG9yaUFkdmFuY2UgPj4gNiApICsgMTsKKworICAgICAgICBpZiAoIHggKyBzaXplLT5tZXRyaWNzLnhfcHBlbSA+IGJpdC53aWR0aCApCisgICAgICAgIHsKKyAgICAgICAgICB4ICA9IHN0YXJ0X3g7CisgICAgICAgICAgeSArPSBzdGVwX3k7CisKKyAgICAgICAgICBpZiAoIHkgPj0gYml0LnJvd3MgKQorICAgICAgICAgICAgcmV0dXJuIEZUX0Vycl9PazsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgICBGYWlsKys7CisKKyAgICAgIGkrKzsKKyAgICB9CisKKyAgICByZXR1cm4gRlRfRXJyX09rOworICB9CisKKworICBzdGF0aWMgdm9pZCBIZWxwKCApCisgIHsKKyAgICBnckV2ZW50ICBkdW1teV9ldmVudDsKKworICAgIENsZWFyX0Rpc3BsYXkoKTsKKyAgICBnckdvdG94eSggMCwgMCApOworICAgIGdyU2V0TWFyZ2luKCAyLCAxICk7CisgICAgZ3JHb3RvYml0bWFwKCAmYml0ICk7CisgICAgCisgICAgZ3JXcml0ZWxuKCJGcmVlVHlwZSBHbHlwaCBWaWV3ZXIgLSBwYXJ0IG9mIHRoZSBGcmVlVHlwZSB0ZXN0IHN1aXRlIiApOworICAgIGdyTG4oKTsKKyAgICBncldyaXRlbG4oIlRoaXMgcHJvZ3JhbSBpcyB1c2VkIHRvIGRpc3BsYXkgYWxsIGdseXBocyBmcm9tIG9uZSBvciIgKTsKKyAgICBncldyaXRlbG4oInNldmVyYWwgZm9udCBmaWxlcywgd2l0aCB0aGUgRnJlZVR5cGUgbGlicmFyeS4iKTsKKyAgICBnckxuKCk7CisgICAgZ3JXcml0ZWxuKCJVc2UgdGhlIGZvbGxvd2luZyBrZXlzIDoiKTsKKyAgICBnckxuKCk7CisgICAgZ3JXcml0ZWxuKCIgIEYxIG9yID8gICA6IGRpc3BsYXkgdGhpcyBoZWxwIHNjcmVlbiIgKTsKKyAgICBncldyaXRlbG4oIiAgYSAgICAgICAgIDogdG9nZ2xlIGFudGktYWxpYXNpbmciICk7CisgICAgZ3JXcml0ZWxuKCIgIGggICAgICAgICA6IHRvZ2dsZSBvdXRsaW5lIGhpbnRpbmciICk7CisgICAgZ3JXcml0ZWxuKCIgIGIgICAgICAgICA6IHRvZ2dsZSBlbWJlZGRlZCBiaXRtYXBzIiApOworICAgIGdyV3JpdGVsbigiICBsICAgICAgICAgOiB0b2dnbGUgbG93IHByZWNpc2lvbiByZW5kZXJpbmciICk7CisgICAgZ3JMbigpOworICAgIGdyV3JpdGVsbigiICBVcCAgICAgICAgOiBpbmNyZWFzZSBwb2ludHNpemUgYnkgMSB1bml0IiApOworICAgIGdyV3JpdGVsbigiICBEb3duICAgICAgOiBkZWNyZWFzZSBwb2ludHNpemUgYnkgMSB1bml0IiApOworICAgIGdyV3JpdGVsbigiICBQYWdlIFVwICAgOiBpbmNyZWFzZSBwb2ludHNpemUgYnkgMTAgdW5pdHMiICk7CisgICAgZ3JXcml0ZWxuKCIgIFBhZ2UgRG93biA6IGRlY3JlYXNlIHBvaW50c2l6ZSBieSAxMCB1bml0cyIgKTsKKyAgICBnckxuKCk7CisgICAgZ3JXcml0ZWxuKCIgIFJpZ2h0ICAgICA6IGluY3JlbWVudCBmaXJzdCBnbHlwaCBpbmRleCIgKTsKKyAgICBncldyaXRlbG4oIiAgTGVmdCAgICAgIDogZGVjcmVtZW50IGZpcnN0IGdseXBoIGluZGV4IiApOworICAgIGdyTG4oKTsKKyAgICBncldyaXRlbG4oIiAgRjUgICAgICAgIDogZGVjcmVtZW50IGZpcnN0IGdseXBoIGluZGV4IGJ5IDEwIiApOworICAgIGdyV3JpdGVsbigiICBGNiAgICAgICAgOiBpbmNyZW1lbnQgZmlyc3QgZ2x5cGggaW5kZXggYnkgMTAiICk7CisgICAgZ3JXcml0ZWxuKCIgIEY3ICAgICAgICA6IGRlY3JlbWVudCBmaXJzdCBnbHlwaCBpbmRleCBieSAxMDAiKTsKKyAgICBncldyaXRlbG4oIiAgRjggICAgICAgIDogaW5jcmVtZW50IGZpcnN0IGdseXBoIGluZGV4IGJ5IDEwMCIpOworICAgIGdyV3JpdGVsbigiICBGOSAgICAgICAgOiBkZWNyZW1lbnQgZmlyc3QgZ2x5cGggaW5kZXggYnkgMTAwMCIpOworICAgIGdyV3JpdGVsbigiICBGMTAgICAgICAgOiBpbmNyZW1lbnQgZmlyc3QgZ2x5cGggaW5kZXggYnkgMTAwMCIpOworICAgIGdyTG4oKTsKKyAgICBncldyaXRlbG4oInByZXNzIGFueSBrZXkgdG8gZXhpdCB0aGlzIGhlbHAgc2NyZWVuIik7CisgICAgICAgIAorICAgIGdyUmVmcmVzaFN1cmZhY2UoIHN1cmZhY2UgKTsKKyAgICBnckxpc3RlblN1cmZhY2UoIHN1cmZhY2UsIGdyX2V2ZW50X2tleSwgJmR1bW15X2V2ZW50ICk7CisgIH0KKworCisKKyAgc3RhdGljIGludCAgUHJvY2Vzc19FdmVudCggZ3JFdmVudCogIGV2ZW50ICkKKyAgeworICAgIGludCAgaTsKKyAgICAKKyAgICBzd2l0Y2ggKCBldmVudC0+a2V5ICkKKyAgICB7CisgICAgY2FzZSBncktleUVzYzogICAgICAgICAgICAvKiBFU0Mgb3IgcSAqLworICAgIGNhc2UgZ3JLRVkoJ3EnKToKKyAgICAgIHJldHVybiAwOworCisgICAgY2FzZSBncktFWSgnYScpOgorICAgICAgZ3JheV9yZW5kZXIgPSAhZ3JheV9yZW5kZXI7CisgICAgICBuZXdfaGVhZGVyID0gKCBncmF5X3JlbmRlcgorICAgICAgICAgICAgICAgICAgID8gImFudGktYWxpYXNpbmcgaXMgbm93IG9uIgorICAgICAgICAgICAgICAgICAgIDogImFudGktYWxpYXNpbmcgaXMgbm93IG9mZiIgKTsKKyAgICAgIHJldHVybiAxOworCisgICAgY2FzZSBncktFWSgnYicpOgorICAgICAgdXNlX3NiaXRzICA9ICF1c2Vfc2JpdHM7CisgICAgICBuZXdfaGVhZGVyID0gKCB1c2Vfc2JpdHMKKyAgICAgICAgICAgICAgICAgICA/ICJlbWJlZGRlZCBiaXRtYXBzIGFyZSBub3cgdXNlZCB3aGVuIGF2YWlsYWJsZSIKKyAgICAgICAgICAgICAgICAgICA6ICJlbWJlZGRlZCBiaXRtYXBzIGFyZSBub3cgaWdub3JlZCIgKTsKKyAgICAgIHJldHVybiAxOworICAgICAgCisgICAgY2FzZSBncktFWSgnbicpOgorICAgIGNhc2UgZ3JLRVkoJ3AnKToKKyAgICAgIHJldHVybiAoaW50KWV2ZW50LT5rZXk7CisKKyAgICBjYXNlIGdyS0VZKCdsJyk6CisgICAgICBsb3dfcHJlYyA9ICFsb3dfcHJlYzsKKyAgICAgIG5ld19oZWFkZXIgPSAoIGxvd19wcmVjCisgICAgICAgICAgICAgICAgICAgPyAicmVuZGVyaW5nIHByZWNpc2lvbiBpcyBub3cgZm9yY2VkIHRvIGxvdyIKKyAgICAgICAgICAgICAgICAgICA6ICJyZW5kZXJpbmcgcHJlY2lzaW9uIGlzIG5vdyBub3JtYWwiICk7CisgICAgICBicmVhazsKKyAgICAgIAorICAgIGNhc2UgZ3JLRVkoJ2gnKToKKyAgICAgIGhpbnRlZCA9ICFoaW50ZWQ7CisgICAgICBuZXdfaGVhZGVyID0gKCBoaW50ZWQKKyAgICAgICAgICAgICAgICAgICA/ICJnbHlwaCBoaW50aW5nIGlzIG5vdyBhY3RpdmUiCisgICAgICAgICAgICAgICAgICAgOiAiZ2x5cGggaGludGluZyBpcyBub3cgaWdub3JlZCIgKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBncktleUYxOgorICAgIGNhc2UgZ3JLRVkoJz8nKToKKyAgICAgIEhlbHAoKTsKKyAgICAgIHJldHVybiAxOworCisjaWYgMAorICAgIGNhc2UgZ3JLZXlGMzogIGkgPSAgMTY7IGdvdG8gRG9fUm90YXRlOworICAgIGNhc2UgZ3JLZXlGNDogIGkgPSAtMTY7IGdvdG8gRG9fUm90YXRlOworICAgIGNhc2UgZ3JLZXlGNTogIGkgPSAgIDE7IGdvdG8gRG9fUm90YXRlOworICAgIGNhc2UgZ3JLZXlGNjogIGkgPSAgLTE7IGdvdG8gRG9fUm90YXRlOworI2VuZGlmCisKKyAgICBjYXNlIGdyS2V5UGFnZVVwOiAgIGkgPSAgMTA7IGdvdG8gRG9fU2NhbGU7CisgICAgY2FzZSBncktleVBhZ2VEb3duOiBpID0gLTEwOyBnb3RvIERvX1NjYWxlOworICAgIGNhc2UgZ3JLZXlVcDogICAgICAgaSA9ICAgMTsgZ290byBEb19TY2FsZTsKKyAgICBjYXNlIGdyS2V5RG93bjogICAgIGkgPSAgLTE7IGdvdG8gRG9fU2NhbGU7CisKKyAgICBjYXNlIGdyS2V5TGVmdDogIGkgPSAgLTE7IGdvdG8gRG9fR2x5cGg7CisgICAgY2FzZSBncktleVJpZ2h0OiBpID0gICAxOyBnb3RvIERvX0dseXBoOworICAgIGNhc2UgZ3JLZXlGNzogICAgaSA9IC0xMDsgZ290byBEb19HbHlwaDsKKyAgICBjYXNlIGdyS2V5Rjg6ICAgIGkgPSAgMTA7IGdvdG8gRG9fR2x5cGg7CisgICAgY2FzZSBncktleUY5OiAgICBpID0gLTEwMDsgZ290byBEb19HbHlwaDsKKyAgICBjYXNlIGdyS2V5RjEwOiAgIGkgPSAgMTAwOyBnb3RvIERvX0dseXBoOworICAgIGNhc2UgZ3JLZXlGMTE6ICAgaSA9IC0xMDAwOyBnb3RvIERvX0dseXBoOworICAgIGNhc2UgZ3JLZXlGMTI6ICAgaSA9ICAxMDAwOyBnb3RvIERvX0dseXBoOworICAgIGRlZmF1bHQ6CisgICAgICA7CisgICAgfQorICAgIHJldHVybiAxOworCisjaWYgMCAgICAKKyAgRG9fUm90YXRlOgorICAgIFJvdGF0aW9uID0gKFJvdGF0aW9uICsgaSkgJiAxMDIzOworICAgIHJldHVybiAxOworI2VuZGlmCisKKyAgRG9fU2NhbGU6CisgICAgcHRzaXplICs9IGk7CisgICAgaWYgKHB0c2l6ZSA8IDEpICAgICAgICAgcHRzaXplID0gMTsKKyAgICBpZiAocHRzaXplID4gTUFYUFRTSVpFKSBwdHNpemUgPSBNQVhQVFNJWkU7CisgICAgcmV0dXJuIDE7CisgICAgCisgIERvX0dseXBoOgorICAgIE51bSArPSBpOworICAgIGlmIChOdW0gPCAwKSAgICAgICAgICAgTnVtID0gMDsKKyAgICBpZiAoTnVtID49IG51bV9nbHlwaHMpIE51bSA9IG51bV9nbHlwaHMtMTsKKyAgICByZXR1cm4gMTsKKyAgfQorCisKKworICBzdGF0aWMgdm9pZCAgdXNhZ2UoIGNoYXIqICBleGVjbmFtZSApCisgIHsKKyAgICBmcHJpbnRmKCBzdGRlcnIsICAiXG4iICk7CisgICAgZnByaW50Ziggc3RkZXJyLCAgImZ0dmlldzogc2ltcGxlIGdseXBoIHZpZXdlciAtLSBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0XG4iICk7CisgICAgZnByaW50Ziggc3RkZXJyLCAgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iICk7CisgICAgZnByaW50Ziggc3RkZXJyLCAgIlxuIiApOworICAgIGZwcmludGYoIHN0ZGVyciwgICJVc2FnZTogJXMgW29wdGlvbnMgYmVsb3ddIHBwZW0gZm9udG5hbWVbLnR0ZnwudHRjXSAuLi5cbiIsCisgICAgICAgICAgICAgZXhlY25hbWUgKTsKKyAgICBmcHJpbnRmKCBzdGRlcnIsICAiXG4iICk7CisgICAgZnByaW50Ziggc3RkZXJyLCAgIiAgLXIgUiAgICAgIHVzZSByZXNvbHV0aW9uIFIgZHBpIChkZWZhdWx0OiA3MiBkcGkpXG4iICk7CisgICAgZnByaW50Ziggc3RkZXJyLCAgIiAgLWYgaW5kZXggIHNwZWNpZnkgZmlyc3QgZ2x5cGggaW5kZXggdG8gZGlzcGxheVxuIiApOworICAgIGZwcmludGYoIHN0ZGVyciwgICJcbiIgKTsKKworICAgIGV4aXQoIDEgKTsKKyAgfQorCisKKyAgaW50ICBtYWluKCBpbnQgIGFyZ2MsIGNoYXIqKiAgYXJndiApIAorICB7CisgICAgaW50ICAgIGksIG9sZF9wdHNpemUsIG9yaWdfcHRzaXplLCBmaWxlOworICAgIGludCAgICBmaXJzdF9nbHlwaCA9IDA7CisgICAgaW50ICAgIFhpc1NldHVwID0gMDsKKyAgICBjaGFyICAgZmlsZW5hbWVbMTI4ICsgNF07CisgICAgY2hhciAgIGFsdF9maWxlbmFtZVsxMjggKyA0XTsKKyAgICBjaGFyKiAgZXhlY25hbWU7CisgICAgaW50ICAgIG9wdGlvbjsKKyAgICBpbnQgICAgZmlsZV9sb2FkZWQ7CisKKyAgICBGVF9FcnJvciAgZXJyb3I7CisgICAgZ3JFdmVudCAgIGV2ZW50OworIAorICAgIGV4ZWNuYW1lID0gZnRfYmFzZW5hbWUoIGFyZ3ZbMF0gKTsKKworICAgIHdoaWxlICggMSApCisgICAgeworICAgICAgb3B0aW9uID0gZ2V0b3B0KCBhcmdjLCBhcmd2LCAiZjpyOiIgKTsKKworICAgICAgaWYgKCBvcHRpb24gPT0gLTEgKQorICAgICAgICBicmVhazsKKworICAgICAgc3dpdGNoICggb3B0aW9uICkKKyAgICAgIHsKKyAgICAgIGNhc2UgJ2YnOgorICAgICAgICBmaXJzdF9nbHlwaCA9IGF0b2koIG9wdGFyZyApOworICAgICAgICBicmVhazsKKyAgICAgICAgCisgICAgICBjYXNlICdyJzoKKyAgICAgICAgcmVzID0gYXRvaSggb3B0YXJnICk7CisgICAgICAgIGlmICggcmVzIDwgMSApCisgICAgICAgICAgdXNhZ2UoIGV4ZWNuYW1lICk7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICB1c2FnZSggZXhlY25hbWUgKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorCisgICAgYXJnYyAtPSBvcHRpbmQ7CisgICAgYXJndiArPSBvcHRpbmQ7CisKKyAgICBpZiAoIGFyZ2MgPD0gMSApCisgICAgICB1c2FnZSggZXhlY25hbWUgKTsKKworICAgIGlmICggc3NjYW5mKCBhcmd2WzBdLCAiJWQiLCAmb3JpZ19wdHNpemUgKSAhPSAxICkKKyAgICAgIG9yaWdfcHRzaXplID0gNjQ7CisKKyAgICBmaWxlID0gMTsKKworICAgIC8qIEluaXRpYWxpemUgZW5naW5lICovCisgICAgZXJyb3IgPSBGVF9Jbml0X0ZyZWVUeXBlKCAmbGlicmFyeSApOworICAgIGlmIChlcnJvcikgUGFuaWNaKCAiQ291bGQgbm90IGluaXRpYWxpc2UgRnJlZVR5cGUgbGlicmFyeSIgKTsKKworLyogICAgRlRfU2V0X1Jhc3Rlcl9QYWxldHRlKCBsaWJyYXJ5LCAxNywgcGFsZXR0ZV8xNyApOyAqLworCisgIE5ld0ZpbGU6CisgICAgcHRzaXplICAgICAgPSBvcmlnX3B0c2l6ZTsKKyAgICBoaW50ZWQgICAgICA9IDE7CisgICAgZmlsZV9sb2FkZWQgPSAwOworCisgICAgaSA9IHN0cmxlbiggYXJndltmaWxlXSApOworICAgIHdoaWxlICggaSA+IDAgJiYgYXJndltmaWxlXVtpXSAhPSAnXFwnICYmIGFyZ3ZbZmlsZV1baV0gIT0gJy8nICkKKyAgICB7CisgICAgICBpZiAoIGFyZ3ZbZmlsZV1baV0gPT0gJy4nICkKKyAgICAgICAgaSA9IDA7CisgICAgICAgIGktLTsgCisgICAgfQorCisgICAgZmlsZW5hbWVbMTI4XSA9ICdcMCc7CisgICAgYWx0X2ZpbGVuYW1lWzEyOF0gPSAnXDAnOworCisgICAgc3RybmNweSggZmlsZW5hbWUsIGFyZ3ZbZmlsZV0sIDEyOCApOworICAgIHN0cm5jcHkoIGFsdF9maWxlbmFtZSwgYXJndltmaWxlXSwgMTI4ICk7CisKKyAgICBpZiAoIGkgPj0gMCApCisgICAgeworICAgICAgc3RybmNweSggZmlsZW5hbWUgKyBzdHJsZW4oIGZpbGVuYW1lICksICIudHRmIiwgNCApOworICAgICAgc3RybmNweSggYWx0X2ZpbGVuYW1lICsgc3RybGVuKCBhbHRfZmlsZW5hbWUgKSwgIi50dGMiLCA0ICk7CisgICAgfQorCisgICAgLyogTG9hZCBmYWNlICovCisKKyAgICBlcnJvciA9IEZUX05ld19GYWNlKCBsaWJyYXJ5LCBmaWxlbmFtZSwgMCwgJmZhY2UgKTsKKyAgICBpZiAoZXJyb3IpIGdvdG8gRGlzcGxheV9Gb250OworCisgICAgZmlsZV9sb2FkZWQrKzsKKyAgICAKKyAgICBlcnJvciA9IFJlc2V0X1NjYWxlKCBwdHNpemUgKTsKKyAgICBpZiAoZXJyb3IpIGdvdG8gRGlzcGxheV9Gb250OworICAgICAgICAKKyAgICBudW1fZ2x5cGhzID0gZmFjZS0+bnVtX2dseXBoczsKKyAgICBnbHlwaCAgICAgID0gZmFjZS0+Z2x5cGg7CisgICAgc2l6ZSAgICAgICA9IGZhY2UtPnNpemU7CisKKyAgRGlzcGxheV9Gb250OgorICAgIC8qIGluaXRpYWxpc2UgZ3JhcGhpY3MgaWYgbmVlZGVkICovCisgICAgaWYgKCAhWGlzU2V0dXAgKQorICAgIHsKKyAgICAgIFhpc1NldHVwID0gMTsKKyAgICAgIEluaXRfRGlzcGxheSgpOworICAgIH0KKyAgCisgICAgZ3JTZXRUaXRsZSggc3VyZmFjZSwgIkZyZWVUeXBlIEdseXBoIFZpZXdlciAtIHByZXNzIEYxIGZvciBoZWxwIiApOworICAgIG9sZF9wdHNpemUgPSBwdHNpemU7CisKKyAgICBpZiAoIGZpbGVfbG9hZGVkID49IDEgKQorICAgIHsKKyAgICAgIEZhaWwgPSAwOworICAgICAgTnVtICA9IGZpcnN0X2dseXBoOworICAgIAorICAgICAgaWYgKCBOdW0gPj0gbnVtX2dseXBocyApCisgICAgICAgIE51bSA9IG51bV9nbHlwaHMtMTsKKyAgICAgIAorICAgICAgaWYgKCBOdW0gPCAwICkKKyAgICAgICAgTnVtID0gMDsKKyAgICB9CisKKyAgICBmb3IgKCA7OyApCisgICAgeworICAgICAgaW50ICBrZXk7CisKKyAgICAgIENsZWFyX0Rpc3BsYXkoKTsKKworICAgICAgaWYgKCBmaWxlX2xvYWRlZCA+PSAxICkKKyAgICAgIHsKKyAgICAgICAgUmVuZGVyX0FsbCggTnVtLCBwdHNpemUgKTsKKworICAgICAgICBzcHJpbnRmKCBIZWFkZXIsICIlcyAlcyAoZmlsZSAlcykiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2UtPmZhbWlseV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2UtPnN0eWxlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgZnRfYmFzZW5hbWUoIGZpbGVuYW1lICkgKTsKKworICAgICAgICBpZiAoIW5ld19oZWFkZXIpCisgICAgICAgICAgbmV3X2hlYWRlciA9IEhlYWRlcjsKKyAgICAgICAgICAgICAgCisgICAgICAgIGdyV3JpdGVDZWxsU3RyaW5nKCAmYml0LCAwLCAwLCBuZXdfaGVhZGVyLCAoZ3JDb2xvcikxMjdMICk7CisgICAgICAgIG5ld19oZWFkZXIgPSAwOworCisgICAgICAgIHNwcmludGYoIEhlYWRlciwgImF0ICVkIHBvaW50cywgZmlyc3QgZ2x5cGggPSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgcHRzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgIE51bSApOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBzcHJpbnRmKCBIZWFkZXIsICIlcyA6IGlzIG5vdCBhIGZvbnQgZmlsZSBvciBjb3VsZCBub3QgYmUgb3BlbmVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmdF9iYXNlbmFtZShmaWxlbmFtZSkgKTsKKyAgICAgIH0KKworICAgICAgZ3JXcml0ZUNlbGxTdHJpbmcoICZiaXQsIDAsIDgsIEhlYWRlciwgKGdyQ29sb3IpMTI3TCApOworICAgICAgZ3JSZWZyZXNoU3VyZmFjZSggc3VyZmFjZSApOworICAgICAgCisgICAgICBnckxpc3RlblN1cmZhY2UoIHN1cmZhY2UsIDAsICZldmVudCApOworICAgICAgaWYgKCAhKCBrZXkgPSBQcm9jZXNzX0V2ZW50KCAmZXZlbnQgKSApICkKKyAgICAgICAgZ290byBGaW47CisKKyAgICAgIGlmICgga2V5ID09ICduJyApCisgICAgICB7CisgICAgICAgIGlmIChmaWxlX2xvYWRlZCA+PSAxKQorICAgICAgICAgIEZUX0RvbmVfRmFjZSggZmFjZSApOworICAgICAgICAgIAorICAgICAgICBpZiAoIGZpbGUgPCBhcmdjIC0gMSApCisgICAgICAgICAgZmlsZSsrOworCisgICAgICAgIGdvdG8gTmV3RmlsZTsKKyAgICAgIH0KKworICAgICAgaWYgKCBrZXkgPT0gJ3AnICkKKyAgICAgIHsKKyAgICAgICAgaWYgKGZpbGVfbG9hZGVkID49IDEpCisgICAgICAgICAgRlRfRG9uZV9GYWNlKCBmYWNlICk7CisgICAgICAgICAgCisgICAgICAgIGlmICggZmlsZSA+IDEgKQorICAgICAgICAgIGZpbGUtLTsKKworICAgICAgICBnb3RvIE5ld0ZpbGU7CisgICAgICB9CisKKyAgICAgIGlmICggcHRzaXplICE9IG9sZF9wdHNpemUgKQorICAgICAgeworICAgICAgICBpZiAoIFJlc2V0X1NjYWxlKCBwdHNpemUgKSApCisgICAgICAgICAgUGFuaWNaKCAiQ291bGQgbm90IHJlc2l6ZSBmb250LiIgKTsKKworICAgICAgICBvbGRfcHRzaXplID0gcHRzaXplOworICAgICAgfQorICAgIH0KKworICBGaW46CisjaWYgMAorICAgIGdyRG9uZVN1cmZhY2Uoc3VyZmFjZSk7CisgICAgZ3JEb25lKCk7CisjZW5kaWYKKyAgICBwcmludGYoICJFeGVjdXRpb24gY29tcGxldGVkIHN1Y2Nlc3NmdWxseS5cbiIgKTsKKyAgICBwcmludGYoICJGYWlscyA9ICVkXG4iLCBGYWlsICk7CisKKyAgICBleGl0KCAwICk7ICAgICAgLyogZm9yIHNhZmV0eSByZWFzb25zICovCisgICAgcmV0dXJuIDA7ICAgICAgIC8qIG5ldmVyIHJlYWNoZWQgKi8KK30KKworCisvKiBFbmQgKi8KKwpkaWZmIC0tZ2l0IGEvZGVtb3Mvc3JjL3QxZHVtcC5jIGIvZGVtb3Mvc3JjL3QxZHVtcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzNDllYmYKLS0tIC9kZXYvbnVsbAorKysgYi9kZW1vcy9zcmMvdDFkdW1wLmMKQEAgLTAsMCArMSwxMDMxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogdDFkdW1wLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIENvcHlyaWdodCAxOTk5IC0gVGhlIEZyZWVUeXBlIFByb2plY3QgaHR0cDovL3d3dy5mcmVldHlwZS5vcmcgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBUMUR1bXAgaXMgYSB2ZXJ5IHNpbXBseSBUeXBlIDEgZm9udCBkdW1wZXIuIEl0IGNhbiBiZSB1c2VkIHRvICAgICAgICAgICAgKi8KKy8qIHdyaXRlIHRoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb24gdG8gdGhlIHN0YW5kYXJkIG91cHV0LCBvciBhbnkgICAgICAgICAgICAqLworLyogZ2l2ZW4gZmlsZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAtIGEgZGVzY3JpcHRpb24gb2YgdGhlIGZvbnQgZmlsZSAoaW5jbHVkaW5nIG5hbWUsIHByb3BlcnRpZXMsIGV0Yy4uKSAgICAqLworLyogIC0gdGhlIGRlY3J5cHRlZCBwcml2YXRlIGRpY3Rpb25hcnksICdhcyBpcycsIGkuZS4gaW4gYmluYXJ5IGZvcm0gICAgICAgICovCisvKiAgLSB0aGUgc3RyZWFtIG9mIHRva2VucyBmcm9tIHRoZSBmb250IGZpbGUgKHVzZWZ1bCB0byBkZWJ1ZyB0aGUgICAgICAgICAgKi8KKy8qICAgIFR5cGUxIGRyaXZlciBvciB0byBsb29rIGF0IHRoZSBmb250J3MgaW50ZXJuYWwgc3RydWN0dXJlLi4pICAgICAgICAgICAqLworLyogIC0gdGhlIGNoYXJzdHJpbmcgY29tbWFuZHMgb2YgYSBnaXZlbiBzdWJyb3V0aW5lICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgLSB0aGUgY2hhcnN0cmluZyBjb21tYW5kcyBvZiBhIGdpdmVuIGdseXBoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAtIHRoZSBlbmNvZGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIC0gdGhlIGdseXBoIG5hbWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJmcmVldHlwZS5oIgorI2luY2x1ZGUgPHQxdG9rZW5zLmg+CisjaW5jbHVkZSA8dDFnbG9hZC5oPgorI2luY2x1ZGUgPHQxbG9hZC5oPgorI2luY2x1ZGUgPHQxcGFyc2UuaD4KKworRlRfTGlicmFyeSAgICAgIGxpYnJhcnk7ICAgIC8qIHJvb3QgbGlicmFyeSBvYmplY3QgKi8KK0ZUX0ZhY2UgICAgICAgICBmYWNlOyAgICAgICAvKiB0cnVldHlwZSBmYWNlICovCitUMV9GYWNlICAgICAgICAgdDFfZmFjZTsKK0ZUX0Vycm9yICAgICAgICBlcnJvcjsKK0ZJTEUqICAgICAgICAgICB0YXJnZXQ7CisKKyAgdm9pZCBQYW5pYyggY29uc3QgY2hhciogbWVzc2FnZSApCisgIHsKKyAgICBmcHJpbnRmKCBzdGRlcnIsICIlc1xuICBlcnJvciBjb2RlID0gMHglMDR4XG4iLCBtZXNzYWdlLCBlcnJvciApOworICAgIGV4aXQoMSk7CisgIH0KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKiovCisvKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKiovCisvKioqKioqKioqKiAgICAgICAgICAgICAgRFVNUCBGT05UIElORk9STUFUSU9OICAgICAgICAgICAgICAgICAgICAqKioqKioqKiovCisvKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKiovCisvKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworICBzdGF0aWMKKyAgVDFfRXJyb3IgIER1bXBfRm9udF9JbmZvKCB2b2lkICkKKyAgeworICAgIFQxX0ZvbnRJbmZvKiAgaW5mbyA9ICZ0MV9mYWNlLT5mb250X2luZm87CisgICAgVDFfUHJpdmF0ZSogICBwcml2ID0gJnQxX2ZhY2UtPnByaXZhdGVfZGljdDsKKyAgICBUMV9JbnQgICAgICAgIG47CisKKyAgICBmcHJpbnRmKCB0YXJnZXQsICJGb250IE5hbWUgICAgOiAlc1xuIiwgdDFfZmFjZS0+Zm9udF9uYW1lICk7CisKKyAgICBmcHJpbnRmKCB0YXJnZXQsICJWZXJzaW9uICAgICAgOiAlc1xuIiwgaW5mby0+dmVyc2lvbiApOworICAgIGZwcmludGYoIHRhcmdldCwgIkZ1bGwgTmFtZSAgICA6ICVzXG4iLCBpbmZvLT5mdWxsX25hbWUgKTsKKyAgICBmcHJpbnRmKCB0YXJnZXQsICJGYW1pbHkgICAgICAgOiAlc1xuIiwgaW5mby0+ZmFtaWx5X25hbWUgKTsKKyAgICBmcHJpbnRmKCB0YXJnZXQsICJXZWlnaHQgICAgICAgOiAlc1xuIiwgaW5mby0+d2VpZ2h0ICk7CisgICAgZnByaW50ZiggdGFyZ2V0LCAiSXRhbGljIGFuZ2xlIDogJWxkXG4iLCBpbmZvLT5pdGFsaWNfYW5nbGUgKTsKKworICAgIGZwcmludGYoIHRhcmdldCwgIkZpeGVkIHBpdGNoICA6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgaW5mby0+aXNfZml4ZWRfcGl0Y2ggPyAieWVzIiA6ICJubyIgKTsKKworICAgIGZwcmludGYoIHRhcmdldCwgIlVuZGVybGluZSAgICA6IHBvcyAlZCwgdGhpY2tuZXNzICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgaW5mby0+dW5kZXJsaW5lX3Bvc2l0aW9uLAorICAgICAgICAgICAgICAgICAgICAgaW5mby0+dW5kZXJsaW5lX3RoaWNrbmVzcyApOworCisgICAgZnByaW50ZiggdGFyZ2V0LCAiVW5pcXVlIElEICAgIDogJWRcbiIsIHByaXYtPnVuaXF1ZV9pZCApOworICAgIGZwcmludGYoIHRhcmdldCwgImxlbklWICAgICAgICA6ICVkXG4iLCBwcml2LT5sZW5JViApOworCisgICAgZnByaW50ZiggdGFyZ2V0LCAiYmx1ZXMgICAgICAgIDogWyIgKTsKKyAgICBmb3IgKCBuID0gMDsgbiA8IHByaXYtPm51bV9ibHVlczsgbisrICkKKyAgICBmcHJpbnRmKCB0YXJnZXQsICIgJWQiLCBwcml2LT5ibHVlX3ZhbHVlc1tuXSApOworICAgIGZwcmludGYoIHRhcmdldCwgIiBdXG4iICk7CisKKyAgICBmcHJpbnRmKCB0YXJnZXQsICJvdGhlciBibHVlcyAgOiBbIiApOworICAgIGZvciAoIG4gPSAwOyBuIDwgcHJpdi0+bnVtX290aGVyX2JsdWVzOyBuKysgKQorICAgIGZwcmludGYoIHRhcmdldCwgIiAlZCIsIHByaXYtPm90aGVyX2JsdWVzW25dICk7CisgICAgZnByaW50ZiggdGFyZ2V0LCAiIF1cbiIgKTsKKworICAgIGZwcmludGYoIHRhcmdldCwgImZhbWlseSBibHVlcyA6IFsiICk7CisgICAgZm9yICggbiA9IDA7IG4gPCBwcml2LT5udW1fZmFtaWx5X2JsdWVzOyBuKysgKQorICAgIGZwcmludGYoIHRhcmdldCwgIiAlZCIsIHByaXYtPmZhbWlseV9ibHVlc1tuXSApOworICAgIGZwcmludGYoIHRhcmdldCwgIiBdXG4iICk7CisKKyAgICBmcHJpbnRmKCB0YXJnZXQsICJmYW1pbHkgb3RoZXIgOiBbIiApOworICAgIGZvciAoIG4gPSAwOyBuIDwgcHJpdi0+bnVtX2ZhbWlseV9vdGhlcl9ibHVlczsgbisrICkKKyAgICBmcHJpbnRmKCB0YXJnZXQsICIgJWQiLCBwcml2LT5mYW1pbHlfb3RoZXJfYmx1ZXNbbl0gKTsKKyAgICBmcHJpbnRmKCB0YXJnZXQsICIgXVxuIiApOworCisgICAgZnByaW50ZiggdGFyZ2V0LCAiQmx1ZSBzY2FsZSAgIDogJWZcbiIsIHByaXYtPmJsdWVfc2NhbGUqMS4wLzY1NTM2LjAgKTsKKyAgICBmcHJpbnRmKCB0YXJnZXQsICJCbHVlIHNoaWZ0ICAgOiAlZFxuIiwgcHJpdi0+Ymx1ZV9zaGlmdCApOworICAgIGZwcmludGYoIHRhcmdldCwgIkJsdWUgZnV6eiAgICA6ICVkXG4iLCBwcml2LT5ibHVlX2Z1enogKTsKKworICAgIGZwcmludGYoIHRhcmdldCwgIlN0ZCB3aWR0aCAgICA6ICVkXG4iLCBwcml2LT5zdGFuZGFyZF93aWR0aCApOworICAgIGZwcmludGYoIHRhcmdldCwgIlN0ZCBoZWlnaHQgICA6ICVkXG4iLCBwcml2LT5zdGFuZGFyZF9oZWlnaHQgKTsKKyAgICBmcHJpbnRmKCB0YXJnZXQsICJGb3JjZSBib2xkICAgOiAlc1xuIiwgcHJpdi0+Zm9yY2VfYm9sZCA/ICJ5ZXMiIDogIm5vIiApOworICAgIGZwcmludGYoIHRhcmdldCwgIlJvdW5kIHN0ZW0gICA6ICVzXG4iLCBwcml2LT5yb3VuZF9zdGVtX3VwID8gInllcyIgOiAibm8iICk7CisKKyAgICBmcHJpbnRmKCB0YXJnZXQsICJTdGVtIHNuYXAgVyAgOiBbIiApOworICAgIGZvciAoIG4gPSAwOyBuIDwgcHJpdi0+bnVtX3NuYXBfd2lkdGhzOyBuKysgKQorICAgIGZwcmludGYoIHRhcmdldCwgIiAlZCIsIHByaXYtPnN0ZW1fc25hcF93aWR0aHNbbl0gKTsKKyAgICBmcHJpbnRmKCB0YXJnZXQsICIgXVxuIiApOworCisgICAgZnByaW50ZiggdGFyZ2V0LCAiU3RlbSBzbmFwIEggIDogWyIgKTsKKyAgICBmb3IgKCBuID0gMDsgbiA8IHByaXYtPm51bV9zbmFwX2hlaWdodHM7IG4rKyApCisgICAgZnByaW50ZiggdGFyZ2V0LCAiICVkIiwgcHJpdi0+c3RlbV9zbmFwX2hlaWdodHNbbl0gKTsKKyAgICBmcHJpbnRmKCB0YXJnZXQsICIgXVxuIiApOworCisgICAgZnByaW50ZiggdGFyZ2V0LCAiTGFuZ3VhZ2UgICAgIDogJWxkXG4iLCBwcml2LT5sYW5ndWFnZV9ncm91cCApOworICAgIGZwcmludGYoIHRhcmdldCwgIlBhc3N3b3JkICAgICA6ICVsZFxuIiwgcHJpdi0+cGFzc3dvcmQgKTsKKyAgICBmcHJpbnRmKCB0YXJnZXQsICJNaW4gZmVhdHVyZSAgOiBbICVkICVkIF1cbiIsCisgICAgICAgICAgICAgcHJpdi0+bWluX2ZlYXR1cmVbMF0sCisgICAgICAgICAgICAgcHJpdi0+bWluX2ZlYXR1cmVbMV0gKTsKKworICAgIGZwcmludGYoIHRhcmdldCwgIkZvbnQgQkJPWCAgICA6IFsgJWxkICVsZCAlbGQgJWxkIF1cbiIsCisgICAgICAgICAgICAgICAgICAgICB0MV9mYWNlLT5mb250X2Jib3gueE1pbiwKKyAgICAgICAgICAgICAgICAgICAgIHQxX2ZhY2UtPmZvbnRfYmJveC55TWluLAorICAgICAgICAgICAgICAgICAgICAgdDFfZmFjZS0+Zm9udF9iYm94LnhNYXgsCisgICAgICAgICAgICAgICAgICAgICB0MV9mYWNlLT5mb250X2Jib3gueU1heCApOworCisgICAgZnByaW50ZiggdGFyZ2V0LCAiRm9udCBtYXRyaXggIDogWyAlZiAlZiAlZiAlZiBdXG4iLAorICAgICAgICAgICAgICAgICAgICAgMS4wKnQxX2ZhY2UtPmZvbnRfbWF0cml4Lnh4LzY1NTM2MDAwLjAsCisgICAgICAgICAgICAgICAgICAgICAxLjAqdDFfZmFjZS0+Zm9udF9tYXRyaXgueHkvNjU1MzYwMDAuMCwKKyAgICAgICAgICAgICAgICAgICAgIDEuMCp0MV9mYWNlLT5mb250X21hdHJpeC55eC82NTUzNjAwMC4wLAorICAgICAgICAgICAgICAgICAgICAgMS4wKnQxX2ZhY2UtPmZvbnRfbWF0cml4Lnl5LzY1NTM2MDAwLjAgKTsKKyNpZiAwCisgICAgZnByaW50ZiggdGFyZ2V0LAorICAgIGZwcmludGYoIHRhcmdldCwKKyAgICBmcHJpbnRmKCB0YXJnZXQsCisgICAgZnByaW50ZiggdGFyZ2V0LAorICAgIGZwcmludGYoIHRhcmdldCwKKyAgICBmcHJpbnRmKCB0YXJnZXQsCisjZW5kaWYKKyAgICBmcHJpbnRmKCB0YXJnZXQsICJOdW0gZ2x5cGhzICAgOiAlZFxuIiwgdDFfZmFjZS0+bnVtX2dseXBocyApOworICAgIGZwcmludGYoIHRhcmdldCwgIk51bSBzdWJycyAgICA6ICVkXG4iLCB0MV9mYWNlLT5udW1fc3VicnMgKTsKKyAgICAKKyAgICByZXR1cm4gMDsKKyAgfQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqLworLyoqKioqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqLworLyoqKioqKioqKiogICAgICAgICAgICAgIERVTVAgUFJJVkFURSBESUNUIElOIFJBVyBGT1JNICAgICAgICAgICAgKioqKioqKioqLworLyoqKioqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqLworLyoqKioqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyAgc3RhdGljCisgIFQxX0Vycm9yICBwYXJzZV9pbnQoIFQxX1Rva2VuaXplciAgdG9remVyLAorICAgICAgICAgICAgICAgICAgICAgICBUMV9Mb25nKiAgICAgIHJlc3VsdCApCisgIHsKKyAgICBUMV9Cb29sICAgIHNpZ24gPSAwOworICAgIFQxX0xvbmcgICAgc3VtICA9IDA7CisgICAgVDFfVG9rZW4qICB0b2tlbiA9ICZ0b2t6ZXItPnRva2VuOworICAgIFQxX0J5dGUqICAgYmFzZSAgPSB0b2t6ZXItPmJhc2UgKyB0b2tlbi0+c3RhcnQ7CisgICAgVDFfQnl0ZSogICBsaW1pdCA9IGJhc2UgKyB0b2tlbi0+bGVuOworCisgICAgaWYgKGJhc2UgPj0gbGltaXQpCisgICAgICBnb3RvIEZhaWw7CisKKyAgICAvKiBjaGVjayBzaWduICovCisgICAgaWYgKCAqYmFzZSA9PSAnKycgKQorICAgICAgYmFzZSsrOworCisgICAgZWxzZSBpZiAoICpiYXNlID09ICctJyApCisgICAgeworICAgICAgc2lnbisrOworICAgICAgYmFzZSsrOworICAgIH0KKworICAgIC8qIHBhcnNlIGRpZ2l0cyAqLworICAgIGlmICggYmFzZSA+PSBsaW1pdCApCisgICAgICBnb3RvIEZhaWw7CisKKyAgICBkbworICAgIHsKKyAgICAgIHN1bSA9ICggMTAqc3VtICsgKCpiYXNlKysgLSAnMCcpICk7CisKKyAgICB9IHdoaWxlIChiYXNlIDwgbGltaXQpOworCisgICAgaWYgKHNpZ24pCisgICAgICBzdW0gPSAtc3VtOworCisgICAgKnJlc3VsdCA9IHN1bTsKKyAgICByZXR1cm4gVDFfRXJyX09rOworCisgIEZhaWw6CisgICAgKnJlc3VsdCA9IDA7CisgICAgcmV0dXJuIFQxX0Vycl9TeW50YXhfRXJyb3I7CisgIH0KKworCisKKworCisgIHN0YXRpYworICBUMV9FcnJvciAgRHVtcF9Qcml2YXRlX0RpY3QoIGNvbnN0IGNoYXIqICBmaWxlbmFtZSApCisgIHsKKyAgICBzdHJ1Y3QgRlRfU3RyZWFtUmVjXyAgc3RyZWFtX3JlYzsKKyAgICBGVF9TdHJlYW0gICAgICAgICAgICAgc3RyZWFtID0gJnN0cmVhbV9yZWM7CisgICAgVDFfRXJyb3IgICAgICAgICAgICAgIGVycm9yOworICAgIFQxX1Rva2VuaXplciAgICAgICAgICB0b2tlbml6ZXI7CisKKyAgICBlcnJvciA9IEZUX05ld19TdHJlYW0oIGZpbGVuYW1lLCBzdHJlYW0gKTsKKyAgICBpZiAoZXJyb3IpIHJldHVybiBlcnJvcjsKKworICAgIHN0cmVhbS0+bWVtb3J5ID0gbGlicmFyeS0+bWVtb3J5OworICAgIAorICAgIGVycm9yID0gTmV3X1Rva2VuaXplciggc3RyZWFtLCAmdG9rZW5pemVyICk7CisgICAgaWYgKGVycm9yKSBnb3RvIEV4aXQ7CisKKyAgICAvKiBnbyBkaXJlY3RseSB0byB0aGUgUHJpdmF0ZSBkaWN0aW9uYXJ5ICovCisgICAgZXJyb3IgPSBPcGVuX1ByaXZhdGVEaWN0KCB0b2tlbml6ZXIgKTsKKyAgICBpZiAoZXJyb3IpCisgICAgICBQYW5pYyggIkNvdWxkIG5vdCBvcGVuIHByaXZhdGUgZGljdGlvbmFyeSAhISIgKTsKKworICAgIC8qIFdyaXRlIGl0IHRvIHRoZSB0YXJnZXQgZmlsZSAqLworICAgIGZ3cml0ZSggdG9rZW5pemVyLT5iYXNlLCB0b2tlbml6ZXItPmxpbWl0LCAxLCB0YXJnZXQgKTsKKworICBFeGl0OgorICAgIGlmIChzdHJlYW0tPmNsb3NlKQorICAgICAgc3RyZWFtLT5jbG9zZShzdHJlYW0pOworCisgICAgcmV0dXJuIGVycm9yOworICB9CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKiovCisvKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKiovCisvKioqKioqKioqKiAgICAgICAgICAgICAgRFVNUCBUWVBFIDEgVE9LRU4gU1RSRUFNICAgICAgICAgICAgICAgICAqKioqKioqKiovCisvKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKiovCisvKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworICBzdGF0aWMKKyAgVDFfRXJyb3IgIER1bXBfVHlwZTFfVG9rZW5zKCBjb25zdCBjaGFyKiBmaWxlbmFtZSApCisgIHsKKyAgICBzdHJ1Y3QgRlRfU3RyZWFtUmVjXyAgc3RyZWFtX3JlYzsKKyAgICBGVF9TdHJlYW0gICAgICAgICAgICAgc3RyZWFtID0gJnN0cmVhbV9yZWM7CisKKyAgICBUMV9FcnJvciAgICAgIGVycm9yOworICAgIFQxX1Rva2VuaXplciAgdG9rZW5pemVyOworCisgICAgZXJyb3IgPSBGVF9OZXdfU3RyZWFtKCBmaWxlbmFtZSwgc3RyZWFtICk7CisgICAgaWYgKGVycm9yKSByZXR1cm4gZXJyb3I7CisKKyAgICBzdHJlYW0tPm1lbW9yeSA9IGxpYnJhcnktPm1lbW9yeTsKKyAgICAKKyAgICBlcnJvciA9IE5ld19Ub2tlbml6ZXIoIHN0cmVhbSwgJnRva2VuaXplciApOworICAgIGlmIChlcnJvcikgZ290byBFeGl0OworCisgICAgLyogRHVtcCB0aGUgZmlyc3Qgc2VnbWVudCBvZiB0aGUgVHlwZTEgZm9udCAqLworICAgIGRvCisgICAgeworICAgICAgVDFfVG9rZW4qICB0b2tlbjsKKyAgICAgIFQxX1N0cmluZyAgdGVtcF9zdHJpbmdbMTI4XTsKKyAgICAgIFQxX0ludCAgICAgbGVuOworCisgICAgICBlcnJvciA9IFJlYWRfVG9rZW4oIHRva2VuaXplciApOworICAgICAgaWYgKGVycm9yKSB7IGVycm9yID0gMDsgYnJlYWs7IH0KKworICAgICAgLyogZHVtcCB0aGUgdG9rZW4gKi8KKyAgICAgIHRva2VuID0gJnRva2VuaXplci0+dG9rZW47CisgICAgICBsZW4gICA9IHRva2VuLT5sZW47CisgICAgICBpZiAobGVuID4gMTI3KSBsZW4gPSAxMjc7CisKKyAgICAgIHN0cm5jcHkoIHRlbXBfc3RyaW5nLAorICAgICAgICAgICAgICAgKFQxX1N0cmluZyopKHRva2VuaXplci0+YmFzZSArIHRva2VuLT5zdGFydCksCisgICAgICAgICAgICAgICBsZW4gKTsKKyAgICAgIHRlbXBfc3RyaW5nW2xlbl0gPSAnXDAnOworCisgICAgICBmcHJpbnRmKCB0YXJnZXQsICIlc1xuIiwgdGVtcF9zdHJpbmcgKTsKKworCSAgLyogRXhpdCB0aGUgbG9vcCB3aGVuIHdlIGVuY291bnRlciBhICJjdXJyZW50ZmlsZSIgdG9rZW4gKi8KKwkgIGlmICggdG9rZW4tPmtpbmQgID09IHRva19rZXl3b3JkICYmCisJICAgICAgIHRva2VuLT5raW5kMiA9PSBrZXlfY3VycmVudGZpbGUgKQorCQlicmVhazsKKworICAgIH0gd2hpbGUgKDEpOworCisgICAgZXJyb3IgPSBPcGVuX1ByaXZhdGVEaWN0KCB0b2tlbml6ZXIgKTsKKyAgICBpZiAoZXJyb3IpCisgICAgICBQYW5pYyggIioqIGNvdWxkIG5vdCBvcGVuIHByaXZhdGUgZGljdGlvbmFyeSAqKlxuIiApOworICAgIGVsc2UKKyAgICB7CisgICAgICBUMV9JbnQgICBudW0gPSAwOworICAgICAgVDFfQm9vbCAgbGFzdF9udW0gPSAwOworCisgICAgICBkbworICAgICAgeworICAgICAgICBUMV9Ub2tlbiogIHRva2VuOworICAgICAgICBUMV9TdHJpbmcgIHRlbXBfc3RyaW5nWzEyOF07CisgICAgICAgIFQxX0ludCAgICAgbGVuOworCisgICAgICAgIGVycm9yID0gUmVhZF9Ub2tlbiggdG9rZW5pemVyICk7CisgICAgICAgIGlmIChlcnJvcikgeyBlcnJvciA9IDA7IGJyZWFrOyB9CisKKyAgICAgICAgLyogZHVtcCB0aGUgdG9rZW4gKi8KKyAgICAgICAgdG9rZW4gPSAmdG9rZW5pemVyLT50b2tlbjsKKyAgICAgICAgbGVuICAgPSB0b2tlbi0+bGVuOworICAgICAgICBpZiAobGVuID4gMTI3KSBsZW4gPSAxMjc7CisKKyAgICAgICAgc3RybmNweSggdGVtcF9zdHJpbmcsCisgICAgICAgICAgICAgICAgIChUMV9TdHJpbmcqKSh0b2tlbml6ZXItPmJhc2UgKyB0b2tlbi0+c3RhcnQpLAorICAgICAgICAgICAgICAgICBsZW4gKTsKKyAgICAgICAgdGVtcF9zdHJpbmdbbGVuXSA9ICdcMCc7CisKKyAgICAgICAgLyogZGV0ZWN0ICJSRCIgdXNlcyAqLworICAgICAgICBpZiAoIHRva2VuLT5raW5kICA9PSB0b2tfa2V5d29yZCAgICAgICAgICAmJgorICAgICAgICAgICAgICggdG9rZW4tPmtpbmQyID09IGtleV9SRCB8fAorICAgICAgICAgICAgICAgdG9rZW4tPmtpbmQyID09IGtleV9SRF9hbHRlcm5hdGUgKSAmJgorICAgICAgICAgICAgIGxhc3RfbnVtICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCisgICAgICAgIHsKKyAgICAgICAgICBmcHJpbnRmKCB0YXJnZXQsICIlcyBbJWQgYmluYXJ5IGJ5dGVzXSAiLCB0ZW1wX3N0cmluZywgbnVtICk7CisgICAgICAgICAgdG9rZW5pemVyLT5jdXJzb3IgKz0gbnVtOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGZwcmludGYoIHRhcmdldCwgIiVzXG4iLCB0ZW1wX3N0cmluZyApOworCisgICAgICAgICAgLyogZXhpdCBkdW1wIHdoZW4gd2UgZW5jb3VudGVyIGEgJ2Nsb3NlZmlsZScgKi8KKyAgICAgICAgICBpZiAoIHRva2VuLT5raW5kICA9PSB0b2tfa2V5d29yZCAgICYmCisgICAgICAgICAgICAgICB0b2tlbi0+a2luZDIgPT0ga2V5X2Nsb3NlZmlsZSApCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIC8qIHJlY29yZCBudW1lcmljYWwgdmFsdWUgaWYgYW55ICovCisgICAgICAgICAgaWYgKCB0b2tlbi0+a2luZCA9PSB0b2tfbnVtYmVyICkKKyAgICAgICAgICB7CisgICAgICAgICAgICBUMV9Mb25nICBzdW07CisKKyAgICAgICAgICAgIGlmICggIXBhcnNlX2ludCggdG9rZW5pemVyLCAmc3VtICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBudW0gICAgICA9IHN1bTsKKyAgICAgICAgICAgICAgbGFzdF9udW0gPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBsYXN0X251bSA9IDA7CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGxhc3RfbnVtID0gMDsKKyAgICAgICAgfQorCisgICAgICB9IHdoaWxlICgxKTsKKyAgICB9CisKKyAgRXhpdDoKKyAgICBpZiAoc3RyZWFtLT5jbG9zZSkKKyAgICAgIHN0cmVhbS0+Y2xvc2Uoc3RyZWFtKTsKKyAgICByZXR1cm4gZXJyb3I7CisgIH0KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKiovCisvKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKiovCisvKioqKioqKioqKiAgICAgICAgICAgICAgICBEVU1QIENIQVJBQ1RFUiBFTkNPRElORyAgICAgICAgICAgICAgICAqKioqKioqKiovCisvKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKiovCisvKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworICBzdGF0aWMKKyAgdm9pZCAgRHVtcF9FbmNvZGluZyggdm9pZCApCisgIHsKKwlUMV9FbmNvZGluZyogIGVuY29kZSA9ICZ0MV9mYWNlLT5lbmNvZGluZzsKKwlpbnQgICAgICAgICAgIG47CisKKwlmcHJpbnRmKCB0YXJnZXQsICJjaGFyYWN0ZXJzIGNvdW50ID0gJWRcbiIsIGVuY29kZS0+bnVtX2NoYXJzICk7CisKKwlmcHJpbnRmKCB0YXJnZXQsICJmaXJzdCBjb2RlID0gJWQsIGxhc3QgY29kZSA9ICVkXG4iLAorCQkJIGVuY29kZS0+Y29kZV9maXJzdCwgZW5jb2RlLT5jb2RlX2xhc3QgKTsKKworICAgIGZvciAoIG4gPSAwOyBuIDwgZW5jb2RlLT5udW1fY2hhcnM7IG4rKyApCisgICAgeworCSAgaW50ICBjb2RlID0gKGludCllbmNvZGUtPmNoYXJfaW5kZXhbbl07CisKKwkgIGlmIChjb2RlIHx8IG4gPT0gMCkKKwkgICAgZnByaW50ZiggdGFyZ2V0LCAiJTNkICVzXG4iLCBuLCB0MV9mYWNlLT5nbHlwaF9uYW1lc1tjb2RlXSApOworICAgIH0KKyAgfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKi8KKy8qKioqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKi8KKy8qKioqKioqKioqICAgICAgICBEVU1QIFNVQlJPVVRJTkVTIEFORCBHTFlQSCBDSEFSU1RSSU5HUyAgICAgICAgICoqKioqKioqKi8KKy8qKioqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKi8KKy8qKioqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisgIHN0YXRpYworICB2b2lkICBEdW1wX0NoYXJTdHJpbmdzKCBUMV9CeXRlKiAgYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVDFfSW50ICAgIGxlbiApCisgIHsKKyAgICBUMV9CeXRlKiAgIGN1ciAgID0gYmFzZTsKKyAgICBUMV9CeXRlKiAgIGxpbWl0ID0gYmFzZSArIGxlbjsKKyAgICBUMV9TdHJpbmcgIHRlbXBfbmFtZVsxMjhdOworICAgIFQxX1N0cmluZyogc3RyaW5nOworCisgICAgVDFfSW50ICAgICB4ID0gMDsKKworICAgIHdoaWxlICggY3VyIDwgbGltaXQgKQorICAgIHsKKyAgICAgIHN3aXRjaCAoKmN1cisrKQorICAgICAgeworICAgICAgICBjYXNlIDE6ICBzdHJpbmcgPSAiaHN0ZW0iOyAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAzOiAgc3RyaW5nID0gInZzdGVtIjsgICAgIGJyZWFrOworICAgICAgICBjYXNlIDQ6ICBzdHJpbmcgPSAidm1vdmV0byI7ICAgYnJlYWs7CisgICAgICAgIGNhc2UgNTogIHN0cmluZyA9ICJybGluZXRvIjsgICBicmVhazsKKyAgICAgICAgY2FzZSA2OiAgc3RyaW5nID0gImhsaW5ldG8iOyAgIGJyZWFrOworICAgICAgICBjYXNlIDc6ICBzdHJpbmcgPSAidmxpbmV0byI7ICAgYnJlYWs7CisgICAgICAgIGNhc2UgODogIHN0cmluZyA9ICJycmN1cnZldG8iOyBicmVhazsKKyAgICAgICAgY2FzZSA5OiAgc3RyaW5nID0gImNsb3NlcGF0aCI7IGJyZWFrOworICAgICAgICBjYXNlIDEwOiBzdHJpbmcgPSAiY2FsbHN1YnIiOyAgYnJlYWs7CisgICAgICAgIGNhc2UgMTE6IHN0cmluZyA9ICJyZXR1cm4iOyAgICBicmVhazsKKworICAgICAgICBjYXNlIDEzOiBzdHJpbmcgPSAiaHNidyI7ICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTQ6IHN0cmluZyA9ICJlbmRjaGFyIjsgICBicmVhazsKKworICAgICAgICBjYXNlIDIxOiBzdHJpbmcgPSAicm1vdmV0byI7ICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjI6IHN0cmluZyA9ICJobW92ZXRvIjsgICBicmVhazsKKworICAgICAgICBjYXNlIDMwOiBzdHJpbmcgPSAidmhjdXJ2ZXRvIjsgYnJlYWs7CisgICAgICAgIGNhc2UgMzE6IHN0cmluZyA9ICJodmN1cnZldG8iOyAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAxMjoKKyAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoY3VyID4gbGltaXQpCisgICAgICAgICAgICAgIFBhbmljKCAiaW52YWxpZCBjaGFyc3RyaW5ncyBzdHJlYW1cbiIgKTsKKworICAgICAgICAgICAgc3dpdGNoICgqY3VyKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGNhc2UgMDogIHN0cmluZyA9ICJkb3RzZWN0aW9uIjsgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSAxOiAgc3RyaW5nID0gInZzdGVtMyI7ICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIDI6ICBzdHJpbmcgPSAiaHN0ZW0zIjsgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgNjogIHN0cmluZyA9ICJzZWFjIjsgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSA3OiAgc3RyaW5nID0gInNidyI7ICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIDEyOiBzdHJpbmcgPSAiZGl2IjsgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgMTY6IHN0cmluZyA9ICJjYWxsb3RoZXJzdWJyIjsgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSAxNzogc3RyaW5nID0gInBvcCI7ICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIDMzOiBzdHJpbmcgPSAic2V0Y3VycmVudHBvaW50IjsgYnJlYWs7CisKKyAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBzcHJpbnRmKCB0ZW1wX25hbWUsICJlc2NhcGUoMTIpK3Vua25vd24oJWQpIiwgY3VyWzFdICk7CisgICAgICAgICAgICAgICAgc3RyaW5nID0gdGVtcF9uYW1lOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDI1NTogICAgLyogZm91ciBieXRlcyBpbnRlZ2VyICovCisgICAgICAgICAgeworICAgICAgICAgICAgVDFfTG9uZyAgc3VtOworCisgICAgICAgICAgICBpZiAoY3VyKzQgPiBsaW1pdCkKKyAgICAgICAgICAgICAgUGFuaWMoICJpbnZhbGlkIGNoYXJzdHJpbmdzIHN0cmVhbVxuIiApOworCisgICAgICAgICAgICBzdW0gPSAoKGxvbmcpY3VyWzBdIDw8IDI0KSB8CisgICAgICAgICAgICAgICAgICAoKGxvbmcpY3VyWzFdIDw8IDE2KSB8CisgICAgICAgICAgICAgICAgICAoKGxvbmcpY3VyWzJdIDw8IDgpICB8CisgICAgICAgICAgICAgICAgICAgICAgICAgY3VyWzNdOworICAgICAgICAgICAgc3ByaW50ZiggdGVtcF9uYW1lLCAiJWxkICIsIHN1bSApOworICAgICAgICAgICAgc3RyaW5nID0gdGVtcF9uYW1lOworICAgICAgICAgICAgY3VyICs9IDQ7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgaWYgKGN1clstMV0gPj0gMzIpCisgICAgICAgICAgeworICAgICAgICAgICAgaWYgKGN1clstMV0gPCAyNDcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHNwcmludGYoIHRlbXBfbmFtZSwgIiVsZCIsIChsb25nKWN1clstMV0gLSAxMzkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGN1clstMV0gPCAyNTEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGN1cisrOworICAgICAgICAgICAgICBzcHJpbnRmKCB0ZW1wX25hbWUsICIlbGQiLAorICAgICAgICAgICAgICAgICAgICAgICAoKGxvbmcpKGN1clstMl0tMjQ3KSA8PCA4KSArIGN1clstMV0gKyAxMDggKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgY3VyKys7CisgICAgICAgICAgICAgIHNwcmludGYoIHRlbXBfbmFtZSwgIiVsZCIsCisgICAgICAgICAgICAgICAgICAgICAgIC0oKGxvbmcpKGN1clstMl0tMjUxKSA8PCA4KSAtIGN1clstMV0gLSAxMDggKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0cmluZyA9IHRlbXBfbmFtZTsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgIHsKKyAgICAgICAgICAgIHNwcmludGYoIHRlbXBfbmFtZSwgInVua25vd24oJWQpIiwgY3VyWy0xXSApOworICAgICAgICAgICAgc3RyaW5nID0gdGVtcF9uYW1lOworICAgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLyogbm93IHByaW50IHRoZSBjaGFyc3RyaW5nIGNvbW1hbmQgKi8KKyAgICAgIHsKKyAgICAgICAgaW50ICBsZW4gPSBzdHJsZW4oc3RyaW5nKSsxOworCisgICAgICAgIGlmICggeCtsZW4gPiA2MCApCisgICAgICAgIHsKKyAgICAgICAgICB4ID0gMDsKKyAgICAgICAgICBmcHJpbnRmKCB0YXJnZXQsICJcbiIgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgZnByaW50ZiggdGFyZ2V0LCAiICIgKTsKKworICAgICAgICBmcHJpbnRmKCB0YXJnZXQsICIlcyIsIHN0cmluZyApOworICAgICAgICB4ICs9IGxlbjsKKyAgICAgIH0KKyAgICB9CisgIH0KKworCisKKyAgc3RhdGljCisgIHZvaWQgIER1bXBfR2x5cGgoIGludCAgZ2x5cGhfaW5kZXggKQorICB7CisgICAgZnByaW50ZiggdGFyZ2V0LCAiZ2x5cGggbmFtZTogJXNcbiIsIHQxX2ZhY2UtPmdseXBoX25hbWVzW2dseXBoX2luZGV4XSApOworICAgIER1bXBfQ2hhclN0cmluZ3MoIHQxX2ZhY2UtPmNoYXJzdHJpbmdzICAgICBbZ2x5cGhfaW5kZXhdLAorICAgICAgICAgICAgICAgICAgICAgIHQxX2ZhY2UtPmNoYXJzdHJpbmdzX2xlbiBbZ2x5cGhfaW5kZXhdICk7CisgIH0KKworICBzdGF0aWMKKyAgdm9pZCAgRHVtcF9TdWJycyggaW50ICBzdWJyc19pbmRleCApCisgIHsKKyAgICBEdW1wX0NoYXJTdHJpbmdzKCB0MV9mYWNlLT5zdWJycyAgICBbIHN1YnJzX2luZGV4IF0sCisgICAgICAgICAgICAgICAgICAgICAgdDFfZmFjZS0+c3VicnNfbGVuWyBzdWJyc19pbmRleCBdICk7CisgIH0KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKi8KKy8qKioqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKi8KKy8qKioqKioqKioqICAgICAgICAgICAgICAgIEVYRUNVVEUgR0xZUEggQ0hBUlNUUklOR1MgICAgICAgICAgICAgICoqKioqKioqKi8KKy8qKioqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKi8KKy8qKioqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisgICAgICAgICBzdGF0aWMKKyAgICAgICAgIFQxX0Vycm9yICBvcGVyYXRvcl9lbmRjaGFyKCBUMV9CdWlsZGVyKiAgYnVpbGRlciApCisgICAgICAgICB7CisgICAgICAgICAgICh2b2lkKWJ1aWxkZXI7CisgICAgICAgICAgIGZwcmludGYoIHRhcmdldCwgImVuZGNoYXJcbiIgKTsKKyAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICB9CisgICAgICAgCisgICAgICAgCisgICAgICAgICBzdGF0aWMKKyAgICAgICAgIFQxX0Vycm9yICBvcGVyYXRvcl9zYncoIFQxX0J1aWxkZXIqICBidWlsZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVDFfUG9zICAgICAgIHNieCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQxX1BvcyAgICAgICBzYnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUMV9Qb3MgICAgICAgd3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUMV9Qb3MgICAgICAgd3kgKQorICAgICAgICAgeworICAgICAgICAgICAodm9pZClidWlsZGVyOworICAgICAgICAgICBmcHJpbnRmKCB0YXJnZXQsICJzZXQgYmVhcmluZyBbJWxkLCVsZF0gd2lkdGggWyVsZCwlbGRdXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNieCwgc2J5LCB3eCwgd3kgKTsKKyAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICB9CisgICAgICAgCisjaWYgMAorICAgICAgICAgc3RhdGljCisgICAgICAgICBUMV9FcnJvciAgb3BlcmF0b3Jfc2VhYyggVDFfQnVpbGRlciogIGJ1aWxkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVDFfUG9zICAgICAgIGFzYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUMV9Qb3MgICAgICAgYWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQxX1BvcyAgICAgICBhZHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVDFfSW50ICAgICAgIGJjaGFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQxX0ludCAgICAgICBhY2hhciApCisgICAgICAgICB7CisgICAgICAgICAgICh2b2lkKWJ1aWxkZXI7CisgICAgICAgICAgIGZwcmludGYoIHRhcmdldCwgImFjY2VudGVkIGNoYXI6ICVsZCBbJWxkLCVsZF0gYj0lZCwgYT0lZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc2IsIGFkeCwgYWR5LCBiY2hhciwgYWNoYXIgKTsKKyAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAKKyAgICAgICAgIHN0YXRpYworICAgICAgICAgVDFfRXJyb3IgIG9wZXJhdG9yX2Nsb3NlcGF0aCggVDFfQnVpbGRlciogIGJ1aWxkZXIgKQorICAgICAgICAgeworICAgICAgICAgICAodm9pZClidWlsZGVyOworICAgICAgICAgICBmcHJpbnRmKCB0YXJnZXQsICJjbG9zZXBhdGhcbiIgKTsKKyAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICB9CisgICAgICAgCisgICAgICAgCisgICAgICAgICBzdGF0aWMKKyAgICAgICAgIFQxX0Vycm9yICBvcGVyYXRvcl9ybGluZXRvKCBUMV9CdWlsZGVyKiAgYnVpbGRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUMV9Qb3MgICAgICAgZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVDFfUG9zICAgICAgIGR5ICkKKyAgICAgICAgIHsKKyAgICAgICAgICAgKHZvaWQpYnVpbGRlcjsKKyAgICAgICAgICAgZnByaW50ZiggdGFyZ2V0LCAiJWxkICVsZCBybGluZXRvXG4iLCBkeCwgZHkgKTsKKyAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICB9CisgICAgICAgCisgICAgICAgCisgICAgICAgICBzdGF0aWMKKyAgICAgICAgIFQxX0Vycm9yICBvcGVyYXRvcl9ybW92ZXRvKCBUMV9CdWlsZGVyKiAgYnVpbGRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUMV9Qb3MgICAgICAgZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVDFfUG9zICAgICAgIGR5ICkKKyAgICAgICAgIHsKKyAgICAgICAgICAgKHZvaWQpYnVpbGRlcjsKKyAgICAgICAgICAgZnByaW50ZiggdGFyZ2V0LCAiJWxkICVsZCBybW92ZXRvXG4iLCBkeCwgZHkgKTsKKyAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICB9CisgICAgICAgCisgICAgICAgCisgICAgICAgICBzdGF0aWMKKyAgICAgICAgIFQxX0Vycm9yICBvcGVyYXRvcl9ycmN1cnZldG8oIFQxX0J1aWxkZXIqICBidWlsZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVDFfUG9zICAgICAgIGR4MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQxX1BvcyAgICAgICBkeTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUMV9Qb3MgICAgICAgZHgyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVDFfUG9zICAgICAgIGR5MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQxX1BvcyAgICAgICBkeDMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUMV9Qb3MgICAgICAgZHkzICkKKyAgICAgICAgIHsKKyAgICAgICAgICAgKHZvaWQpYnVpbGRlcjsKKyAgICAgICAgICAgZnByaW50ZiggdGFyZ2V0LCAiJWxkICVsZCAlbGQgJWxkICVsZCAlbGQgcnJjdXJ2ZXRvXG4iLAorICAgICAgICAgICAgICAgICAgICBkeDEsIGR5MSwgZHgyLCBkeTIsIGR4MywgZHkzICk7CisgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgfQorICAgICAgIAorICAgICAgIAorICAgICAgICAgc3RhdGljCisgICAgICAgICBUMV9FcnJvciAgb3BlcmF0b3JfZG90c2VjdGlvbiggVDFfQnVpbGRlciogIGJ1aWxkZXIgKQorICAgICAgICAgeworICAgICAgICAgICAodm9pZClidWlsZGVyOworICAgICAgICAgICBmcHJpbnRmKCB0YXJnZXQsICJkb3RzZWN0aW9uXG4iICk7CisgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgfQorICAgICAgIAorICAgICAgIAorICAgICAgICAgc3RhdGljCisgICAgICAgICBUMV9FcnJvciAgb3BlcmF0b3Jfc3RlbSggVDFfQnVpbGRlciogIGJ1aWxkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVDFfUG9zICAgICAgIHBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUMV9Qb3MgICAgICAgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVDFfQm9vbCAgICAgIHZlcnRpY2FsICkKKyAgICAgICAgIHsKKyAgICAgICAgICAgKHZvaWQpYnVpbGRlcjsKKyAgICAgICAgICAgZnByaW50ZiggdGFyZ2V0LCAiJWxkICVsZCAlc1xuIiwgcG9zLCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgdmVydGljYWwgPyAidnN0ZW0iIDogImhzdGVtIiApOworICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgIH0KKyAgICAgICAKKyAgICAgICAKKyAgICAgICAgIHN0YXRpYworICAgICAgICAgVDFfRXJyb3IgIG9wZXJhdG9yX3N0ZW0zKCBUMV9CdWlsZGVyKiAgYnVpbGRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVDFfUG9zICAgICAgIHBvczAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQxX1BvcyAgICAgICB3aWR0aDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQxX1BvcyAgICAgICBwb3MxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUMV9Qb3MgICAgICAgd2lkdGgxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUMV9Qb3MgICAgICAgcG9zMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVDFfUG9zICAgICAgIHdpZHRoMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVDFfQm9vbCAgICAgIHZlcnRpY2FsICkKKyAgICAgICAgIHsKKyAgICAgICAgICAgKHZvaWQpYnVpbGRlcjsKKyAgICAgICAgICAgZnByaW50ZiggdGFyZ2V0LCAiJWxkICVsZCAlbGQgJWxkICVsZCAlbGQgJXNcbiIsCisgICAgICAgICAgICAgICAgICAgIHBvczAsIHdpZHRoMCwgcG9zMSwgd2lkdGgxLCBwb3MyLCB3aWR0aDIsCisgICAgICAgICAgICAgICAgICAgIHZlcnRpY2FsID8gInZzdGVtMyIgOiAiaHN0ZW0zIiApOworICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgIH0KKyAgICAgICAKKyAgICAgICAKKyNpZiAwCisgICAgICAgICBzdGF0aWMKKyAgICAgICAgIFQxX0Vycm9yICBvcGVyYXRvcl9mbGV4KCBUMV9CdWlsZGVyKiAgYnVpbGRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUMV9Qb3MgICAgICAgdGhyZXNob2xkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQxX1BvcyAgICAgICBlbmRfeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUMV9Qb3MgICAgICAgZW5kX3kgKQorICAgICAgICAgeworICAgICAgICAgICAodm9pZClidWlsZGVyOworICAgICAgICAgICBmcHJpbnRmKCB0YXJnZXQsICIlbGQgJWxkICVsZCBmbGV4XG4iLCB0aHJlc2hvbGQsIGVuZF94LCBlbmRfeSApOworICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgIH0KKyNlbmRpZiAgCisgICAgICAgCisgICAgICAgICBzdGF0aWMKKyAgICAgICAgIFQxX0Vycm9yICBvcGVyYXRvcl9jaGFuZ2VoaW50cyggVDFfQnVpbGRlciogIGJ1aWxkZXIgKQorICAgICAgICAgeworICAgICAgICAgICAodm9pZClidWlsZGVyOworICAgICAgICAgICBmcHJpbnRmKCB0YXJnZXQsICItLSBjaGFuZ2UgaGludHMgLS1cbiIgKTsKKyAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICB9CisgICAgICAgCisgICAgICAgCisgIHN0YXRpYworICBUMV9FcnJvciAgRXhlY3V0ZV9DaGFyU3RyaW5nKCBpbnQgIGdseXBoX2luZGV4ICkKKyAgeworICAgIHN0YXRpYyBjb25zdCBUMV9CdWlsZGVyX0Z1bmNzICAgYnVpbGRzID0KKyAgICB7CisgICAgICBvcGVyYXRvcl9lbmRjaGFyLAorICAgICAgb3BlcmF0b3Jfc2J3LAorICAgICAgb3BlcmF0b3JfY2xvc2VwYXRoLAorICAgICAgb3BlcmF0b3JfcmxpbmV0bywKKyAgICAgIG9wZXJhdG9yX3Jtb3ZldG8sCisgICAgICBvcGVyYXRvcl9ycmN1cnZldG8sCisgICAgfTsKKworICAgIHN0YXRpYyBjb25zdCBUMV9IaW50ZXJfRnVuY3MgIGhpbnRzID0KKyAgICB7CisgICAgICBvcGVyYXRvcl9kb3RzZWN0aW9uLAorICAgICAgb3BlcmF0b3JfY2hhbmdlaGludHMsCisgICAgICBvcGVyYXRvcl9zdGVtLAorICAgICAgb3BlcmF0b3Jfc3RlbTMsCisgICAgfTsKKworICAgIFQxX0RlY29kZXIgIGRlY29kZXI7CisgICAgVDFfRXJyb3IgICAgZXJyb3I7CisKKyAgICBUMV9Jbml0X0RlY29kZXIoICZkZWNvZGVyLCAmaGludHMgKTsKKyAgICBUMV9Jbml0X0J1aWxkZXIoICZkZWNvZGVyLmJ1aWxkZXIsIHQxX2ZhY2UsIDAsIDAsICZidWlsZHMgKTsKKworICAgIGVycm9yID0gVDFfUGFyc2VfQ2hhclN0cmluZ3MoICZkZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQxX2ZhY2UtPmNoYXJzdHJpbmdzICAgIFtnbHlwaF9pbmRleF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdDFfZmFjZS0+Y2hhcnN0cmluZ3NfbGVuW2dseXBoX2luZGV4XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0MV9mYWNlLT5udW1fc3VicnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdDFfZmFjZS0+c3VicnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdDFfZmFjZS0+c3VicnNfbGVuICk7CisgICByZXR1cm4gZXJyb3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICB9CisKKworCisKKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqLworLyoqKioqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqLworLyoqKioqKioqKiogICAgICAgICAgICAgICAgICBERUJVRyBGT05UIExPQURJTkcgICAgICAgICAgICAgICAgICAgKioqKioqKioqLworLyoqKioqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqLworLyoqKioqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIHN0YXRpYworICBUMV9FcnJvciAgRGVidWdfVHlwZTFfRm9udCggY29uc3QgY2hhciogIGZpbGVuYW1lICkKKyAgeworICAgIHN0cnVjdCBGVF9TdHJlYW1SZWNfICBzdHJlYW1fcmVjOworICAgIFQxX0ZhY2VSZWMgICAgdDFmYWNlcmVjOworICAgIFQxX1Rva2VuaXplciAgdG9rZW5pemVyOworICAgIFQxX1BhcnNlciAgICAgcGFyc2VyOworICAgIFQxX0Vycm9yICAgICAgZXJyb3I7CisgICAgRlRfU3RyZWFtICAgICBzdHJlYW0gPSAmc3RyZWFtX3JlYzsKKworICAgIGVycm9yID0gRlRfTmV3X1N0cmVhbSggZmlsZW5hbWUsIHN0cmVhbSApOworICAgIGlmIChlcnJvcikgZ290byBFeGl0OworCisgICAgc3RyZWFtLT5tZW1vcnkgPSBsaWJyYXJ5LT5tZW1vcnk7CisgICAgCisgICAgLyogY3JlYXRlIGFuIGVtcHR5IGZhY2UgcmVjb3JkICovCisgICAgbWVtc2V0KCAmdDFmYWNlcmVjLCAwLCBzaXplb2YodDFmYWNlcmVjKSApOworICAgIHQxZmFjZXJlYy5yb290Lm1lbW9yeSA9IGxpYnJhcnktPm1lbW9yeTsKKyAgICB0MWZhY2VyZWMucm9vdC5zdHJlYW0gPSBzdHJlYW07CisKKyAgICB0MV9mYWNlID0gJnQxZmFjZXJlYzsKKworICAgIC8qIG9wZW4gdGhlIHRva2VuaXplciwgdGhpcyB3aWxsIGFsc28gY2hlY2sgdGhlIGZvbnQgZm9ybWF0ICovCisJZXJyb3IgPSBOZXdfVG9rZW5pemVyKCBzdHJlYW0sICZ0b2tlbml6ZXIgKTsKKyAgICBpZiAoZXJyb3IpIGdvdG8gRmFpbDsKKworICAgIC8qIE5vdywgbG9hZCB0aGUgZm9udCBwcm9ncmFtIGludG8gdGhlIGZhY2Ugb2JqZWN0ICovCisgICAgSW5pdF9UMV9QYXJzZXIoICZwYXJzZXIsIHQxX2ZhY2UsIHRva2VuaXplciApOworCisgICAgLyogZm9yY2UgdG9rZW4gZHVtcCAqLworICAgIHBhcnNlci5kdW1wX3Rva2VucyA9IDE7CisKKyAgICBlcnJvciA9IFBhcnNlX1QxX0ZvbnRQcm9ncmFtKCAmcGFyc2VyICk7CisKKyAgICBEb25lX1Rva2VuaXplciggdG9rZW5pemVyICk7CisKKyAgRmFpbDoKKyAgICBpZiAoc3RyZWFtLT5jbG9zZSkKKyAgICAgIHN0cmVhbS0+Y2xvc2UoIHN0cmVhbSApOworICBFeGl0OgorICAgIHJldHVybiBlcnJvcjsKKyAgfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKiovCisvKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKiovCisvKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAgIE1BSU4gUFJPR1JBTSAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKiovCisvKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKiovCisvKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworICBzdGF0aWMKKyAgdm9pZCBVc2FnZSgpCisgIHsKKyAgICBmcHJpbnRmKCBzdGRlcnIsICJ0MWR1bXAgICAgICAgLSAgYSBzaW1wbGUgVHlwZSAxIGZvbnQgZHVtcGVyXG4iICk7CisgICAgZnByaW50Ziggc3RkZXJyLCAiKGMpIFRoZSBGcmVlVHlwZSBwcm9qZWN0IC0gd3d3LmZyZWV0eXBlLm9yZ1xuIiApOworICAgIGZwcmludGYoIHN0ZGVyciwgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuIiApOworCisgICAgZnByaW50Ziggc3RkZXJyLCAidXNhZ2UgOiAgIHQxZHVtcCAgW29wdGlvbnNdIGZvbnRmaWxlKC5wZmJ8LnBmYSlcblxuIiApOworCisgICAgZnByaW50Ziggc3RkZXJyLCAiICAgIG9wdGlvbnNcbiIgKTsKKyAgICBmcHJpbnRmKCBzdGRlcnIsICIgICAgICAgICAgLW8gZmlsZW5hbWUgOiBkdW1wcyB0byBhIHNwZWNpZmljIGZpbGVcbiIgKTsKKyAgICBmcHJpbnRmKCBzdGRlcnIsICIgICAgICAgICAgLWcgaW5kZXggICAgOiBkdW1wIGdseXBoIGNoYXJzdHJpbmdcbiIgKTsKKyAgICBmcHJpbnRmKCBzdGRlcnIsICIgICAgICAgICAgLXMgaW5kZXggICAgOiBkdW1wIHN1YnJzIGNoYXJzdHJpbmdcbiIgKTsKKyAgICBmcHJpbnRmKCBzdGRlcnIsICIgICAgICAgICAgLXggaW5kZXggICAgOiBleGVjdXRlIGdseXBoIGNoYXJzdHJpbmdcbiIgKTsKKwlmcHJpbnRmKCBzdGRlcnIsICIgICAgICAgICAgLWUgICAgICAgICAgOiBkdW1wIGVuY29kaW5nXG4iICk7CisgICAgZnByaW50Ziggc3RkZXJyLCAiICAgICAgICAgIC10ICAgICAgICAgIDogZHVtcHMgdGhlIFR5cGUgMSB0b2tlbiBzdHJlYW1cbiIgKTsKKyAgICBmcHJpbnRmKCBzdGRlcnIsICIgICAgICAgICAgLWQgICAgICAgICAgOiBkZWJ1ZyBmb250IGxvYWRpbmdcbiIgKTsKKyAgICBmcHJpbnRmKCBzdGRlcnIsICIgICAgICAgICAgLXAgICAgICAgICAgOiBkdW1wcyBwcml2YXRlIGRpY3Rpb25hcnkgJ2FzIGlzJ1xuXG4iICk7CisKKyAgICBleGl0KDEpOworICB9CisKKwordHlwZWRlZiBlbnVtIFJlcXVlc3RfCit7CisgIHJlcV9kdW1wX2luZm8sCisgIHJlcV9kdW1wX3ByaXZhdGUsCisgIHJlcV9kdW1wX3Rva2VucywKKyAgcmVxX2R1bXBfZW5jb2RpbmcsCisgIHJlcV9kdW1wX2dseXBoLAorICByZXFfZHVtcF9zdWJyLAorICByZXFfbG9hZF9mb250LAorICByZXFfZXhlY3V0ZV9nbHlwaCwKKyAgcmVxX2RlYnVnX2ZvbnQKKworfSBSZXF1ZXN0OworCisKK3N0YXRpYyBjaGFyKiAgICBmaWxlX25hbWU7CitzdGF0aWMgaW50ICAgICAgZ2x5cGhfaW5kZXg7CitzdGF0aWMgUmVxdWVzdCAgcmVxdWVzdCA9IHJlcV9kdW1wX2luZm87CisKK3N0YXRpYyBGVF9Ecml2ZXIgdDFfZHJpdmVyOworCisgIGludCAgbWFpbiggaW50IGFyZ2MsIGNoYXIqKiAgYXJndiApCisgIHsKKyAgICBjaGFyICB2YWxpZDsKKworCisgICAgLyogQ2hlY2sgbnVtYmVyIG9mIGFyZ3VtZW50cyAqLworICAgIGlmICggYXJnYyA8IDIgKSBVc2FnZSgpOworCisgICAgLyogQ2hlY2sgb3B0aW9ucyAqLworICAgIHRhcmdldCA9IHN0ZG91dDsKKworICAgIGFyZ3YrKzsKKyAgICB3aGlsZSAoYXJndlswXVswXSA9PSAnLScpCisgICAgeworICAgICAgdmFsaWQgPSAwOworICAgICAgc3dpdGNoIChhcmd2WzBdWzFdKQorICAgICAgeworICAgICAgICBjYXNlICdwJzoKKyAgICAgICAgICByZXF1ZXN0ID0gcmVxX2R1bXBfcHJpdmF0ZTsKKyAgICAgICAgICB2YWxpZCAgID0gMTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICd0JzoKKyAgICAgICAgICByZXF1ZXN0ID0gcmVxX2R1bXBfdG9rZW5zOworICAgICAgICAgIHZhbGlkICAgPSAxOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgJ2UnOgorICAgICAgICAgIHJlcXVlc3QgPSByZXFfZHVtcF9lbmNvZGluZzsKKyAgICAgICAgICB2YWxpZCAgID0gMTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICdkJzoKKyAgICAgICAgICByZXF1ZXN0ID0gcmVxX2RlYnVnX2ZvbnQ7CisgICAgICAgICAgdmFsaWQgICA9IDE7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAnbyc6CisgICAgICAgICAgaWYgKGFyZ2MgPCAyKSBVc2FnZSgpOworICAgICAgICAgIHRhcmdldCA9IGZvcGVuKCBhcmd2WzFdLCAidyIgKTsKKyAgICAgICAgICBpZiAoIXRhcmdldCkKKyAgICAgICAgICAgIFBhbmljKCAiQ291bGQgbm90IG9wZW4vY3JlYXRlIGRlc3RpbmF0aW9uIGZpbGUiICk7CisgICAgICAgICAgYXJndisrOworICAgICAgICAgIGFyZ2MtLTsKKyAgICAgICAgICB2YWxpZCA9IDE7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAnZyc6CisgICAgICAgIGNhc2UgJ3MnOgorICAgICAgICBjYXNlICd4JzoKKyAgICAgICAgICBpZiAoYXJnYyA8IDIpIFVzYWdlKCk7CisgICAgICAgICAgaWYgKCBzc2NhbmYoIGFyZ3ZbMV0sICIlZCIsICZnbHlwaF9pbmRleCApICE9IDEgKQorICAgICAgICAgICAgVXNhZ2UoKTsKKworICAgICAgICAgIHN3aXRjaCAoYXJndlswXVsxXSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBjYXNlICdnJzogcmVxdWVzdCA9IHJlcV9kdW1wX2dseXBoOyAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ3MnOiByZXF1ZXN0ID0gcmVxX2R1bXBfc3VicjsgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAneCc6IHJlcXVlc3QgPSByZXFfZXhlY3V0ZV9nbHlwaDsgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIGFyZ3YrKzsKKyAgICAgICAgICBhcmdjLS07CisgICAgICAgICAgdmFsaWQgPSAxOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgOworICAgICAgfQorCisgICAgICBpZiAodmFsaWQpCisgICAgICB7CisgICAgICAgIGFyZ3YrKzsKKyAgICAgICAgYXJnYy0tOworICAgICAgICBpZiAoYXJnYyA8IDIpIFVzYWdlKCk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8qIEdldCBmaWxlIG5hbWUgKi8KKyAgICBmaWxlX25hbWUgPSBhcmd2WzBdOworCisgICAgLyogSW5zdGVhZCBvZiBjYWxsaW5nIEZUX0luaXRfRnJlZVR5cGUsIHdlIHNldCB1cCBvdXIgb3duIHN5c3RlbSAgKi8KKyAgICAvKiBvYmplY3QgYW5kIGxpYnJhcnkuIFRoaXMgaXMgcmVzZXJ2ZWQgZm9yIEZyZWVUeXBlIDIgd2l6YXJkcyAhISAqLworCisgICAgLyogSW5pdCBsaWJyYXJ5LCByZWFkIGZhY2Ugb2JqZWN0LCBnZXQgZHJpdmVyLCBjcmVhdGUgc2l6ZSAqLworICAgIGVycm9yID0gRlRfSW5pdF9GcmVlVHlwZSggJmxpYnJhcnkgKTsKKyAgICBpZiAoZXJyb3IpIFBhbmljKCAiY291bGQgbm90IGluaXRpYWxpc2UgRnJlZVR5cGUgbGlicmFyeSIgKTsKKworICAgIHQxX2RyaXZlciA9IEZUX0dldF9Ecml2ZXIoIGxpYnJhcnksICJ0eXBlMSIgKTsKKyAgICBpZiAoIXQxX2RyaXZlcikgUGFuaWMoICJubyBUeXBlMSBkcml2ZXIgaW4gY3VycmVudCBGcmVlVHlwZSBsaWIiICk7CisKKyAgICBlcnJvciA9IEZUX05ld19GYWNlKCBsaWJyYXJ5LCBmaWxlX25hbWUsIDAsICZmYWNlICk7CisgICAgaWYgKGVycm9yKSBQYW5pYyggImNvdWxkIG5vdCBmaW5kL29wZW4vY3JlYXRlIGZvbnQgZmlsZSIgKTsKKyAgICAKKyAgICBpZiAoZmFjZS0+ZHJpdmVyICE9IHQxX2RyaXZlcikKKyAgICAgIFBhbmljKCAiZm9udCBmb3JtYXQgaXMgbm90IFR5cGUgMSAhIiApOworCisgICAgc3dpdGNoIChyZXF1ZXN0KQorICAgIHsKKyAgICAgIGNhc2UgcmVxX2R1bXBfcHJpdmF0ZToKKyAgICAgICAgZXJyb3IgPSBEdW1wX1ByaXZhdGVfRGljdChmaWxlX25hbWUpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSByZXFfZHVtcF90b2tlbnM6CisgICAgICAgIGVycm9yID0gRHVtcF9UeXBlMV9Ub2tlbnMoZmlsZV9uYW1lKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgcmVxX2RlYnVnX2ZvbnQ6CisgICAgICAgIGVycm9yID0gRGVidWdfVHlwZTFfRm9udChmaWxlX25hbWUpOworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgZXJyb3IgPSBGVF9OZXdfRmFjZSggbGlicmFyeSwgZmlsZV9uYW1lLCAwLCAmZmFjZSApOworICAgICAgICBpZiAoZXJyb3IpIFBhbmljKCAiY291bGQgbm90IGxvYWQgVHlwZSAxIGZvbnQiICk7CisKKyAgICAgICAgdDFfZmFjZSA9IChUMV9GYWNlKWZhY2U7CisKKyAgICAgICAgLyogY2hlY2sgZ2x5cGggaW5kZXgsIGl0IGlzIDAgYnkgZGVmYXVsdCAqLworICAgICAgICBpZiAoIGdseXBoX2luZGV4IDwgMCB8fCBnbHlwaF9pbmRleCA+PSB0MV9mYWNlLT5udW1fZ2x5cGhzICkKKyAgICAgICAgICBQYW5pYyggImludmFsaWQgZ2x5cGggaW5kZXhcbiIgKTsKKworICAgICAgICBzd2l0Y2ggKHJlcXVlc3QpCisgICAgICAgIHsKKyAgICAgICAgICBjYXNlIHJlcV9kdW1wX2dseXBoOgorICAgICAgICAgICAgRHVtcF9HbHlwaCggZ2x5cGhfaW5kZXggKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSByZXFfZHVtcF9zdWJyOgorICAgICAgICAgICAgRHVtcF9TdWJycyggZ2x5cGhfaW5kZXggKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSByZXFfZXhlY3V0ZV9nbHlwaDoKKyAgICAgICAgICAgIEV4ZWN1dGVfQ2hhclN0cmluZyggZ2x5cGhfaW5kZXggKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSByZXFfZHVtcF9lbmNvZGluZzoKKyAgICAgICAgICAgIER1bXBfRW5jb2RpbmcoKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIER1bXBfRm9udF9JbmZvKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZXJyb3IpIFBhbmljKCAiY291bGQgbm90IGR1bXAgVHlwZSAxIGZvbnQiICk7CisKKyAgICBGVF9Eb25lX0ZyZWVUeXBlKCBsaWJyYXJ5ICk7CisgICAgcmV0dXJuIDA7CisgIH0KZGlmZiAtLWdpdCBhL2RlbW9zL3NyYy90dGRlYnVnLmMgYi9kZW1vcy9zcmMvdHRkZWJ1Zy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4ODVkZGEKLS0tIC9kZXYvbnVsbAorKysgYi9kZW1vcy9zcmMvdHRkZWJ1Zy5jCkBAIC0wLDAgKzEsMTI0NyBAQAorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpZmRlZiBVTklYCisjaWZuZGVmIEhBVkVfUE9TSVhfVEVSTUlPUworI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPHRlcm1pby5oPgorI2Vsc2UKKyNpZm5kZWYgSEFWRV9UQ0dFVEFUVFIKKyNkZWZpbmUgSEFWRV9UQ0dFVEFUVFIKKyNlbmRpZiAvKiBIQVZFX1RDR0VUQVRUUiAqLworI2lmbmRlZiBIQVZFX1RDU0VUQVRUUgorI2RlZmluZSBIQVZFX1RDU0VUQVRUUgorI2VuZGlmIC8qIEhBVkVfVENTRVRBVFRSICovCisjaW5jbHVkZSA8dGVybWlvcy5oPgorI2VuZGlmIC8qIEhBVkVfUE9TSVhfVEVSTUlPUyAqLworI2VuZGlmCisKKy8qIERlZmluZSB0aGUgYGdldGNoKCknIGZ1bmN0aW9uLiAgT24gVW5peCBzeXN0ZW1zLCBpdCBpcyBhbiBhbGlhcyAgKi8KKy8qIGZvciBgZ2V0Y2hhcigpJywgYW5kIHRoZSBkZWJ1Z2dlciBmcm9udCBlbmQgbXVzdCBlbnN1cmUgdGhhdCB0aGUgKi8KKy8qIGBzdGRpbicgZmlsZSBkZXNjcmlwdG9yIGlzIG5vdCBpbiBsaW5lLWJ5LWxpbmUgaW5wdXQgbW9kZS4gICAgICAgKi8KKyNpZm5kZWYgVU5JWAorI2luY2x1ZGUgPGNvbmlvLmg+CisjZWxzZQorI2RlZmluZSBnZXRjaCAgZ2V0Y2hhcgorI2VuZGlmCisKKworI2luY2x1ZGUgImZyZWV0eXBlLmgiCisjaW5jbHVkZSAidHRvYmpzLmgiCisjaW5jbHVkZSAidHRkcml2ZXIuaCIKKyNpbmNsdWRlICJ0dGludGVycC5oIgorCisKK0ZUX0xpYnJhcnkgICAgICBsaWJyYXJ5OyAgICAvKiByb290IGxpYnJhcnkgb2JqZWN0ICovCitGVF9NZW1vcnkgICAgICAgbWVtb3J5OyAgICAgLyogc3lzdGVtIG9iamVjdCAqLworVFRfRHJpdmVyICAgICAgIGRyaXZlcjsgICAgIC8qIHRydWV0eXBlIGRyaXZlciAqLworVFRfRmFjZSAgICAgICAgIGZhY2U7ICAgICAgIC8qIHRydWV0eXBlIGZhY2UgKi8KK1RUX1NpemUgICAgICAgICBzaXplOyAgICAgICAvKiB0cnVldHlwZSBzaXplICovCitUVF9HbHlwaFNsb3QgICAgZ2x5cGg7ICAgICAgLyogdHJ1ZXR5cGUgZ2x5cGggc2xvdCAqLworVFRfRXhlY0NvbnRleHQgIGV4ZWM7ICAgICAgIC8qIHRydWV0eXBlIGV4ZWN1dGlvbiBjb250ZXh0ICovCitUVF9FcnJvciAgICAgICAgZXJyb3I7CisKK1RUX0NvZGVSYW5nZV9UYWcgIGRlYnVnX2NvZGVyYW5nZSA9IHR0X2NvZGVyYW5nZV9nbHlwaDsKKworICB0eXBlZGVmIEZUX0J5dGUgQnl0ZVN0clsyXTsKKyAgdHlwZWRlZiBGVF9CeXRlIFdvcmRTdHJbNF07CisgIHR5cGVkZWYgRlRfQnl0ZSBMb25nU3RyWzhdOworICB0eXBlZGVmIEZUX0J5dGUgRGVidWdTdHJbMTI4XTsKKworICBzdGF0aWMgIERlYnVnU3RyIHRlbXBTdHI7CisKKyN1bmRlZiAgUEFDSworI2RlZmluZSBQQUNLKCB4LCB5ICkgICgoeCA8PCA0KSB8IHkpCisKKyAgc3RhdGljIGNvbnN0IFRUX0J5dGUgIFBvcF9QdXNoX0NvdW50WzI1Nl0gPQorICB7CisgICAgLyogb3Bjb2RlcyBhcmUgZ2F0aGVyZWQgaW4gZ3JvdXBzIG9mIDE2ICovCisgICAgLyogcGxlYXNlIGtlZXAgdGhlIHNwYWNlcyBhcyB0aGV5IGFyZSAgICovCisKKyAgICAvKiAgU1ZUQ0EgIHkgICovICBQQUNLKCAwLCAwICksCisgICAgLyogIFNWVENBICB4ICAqLyAgUEFDSyggMCwgMCApLAorICAgIC8qICBTUHZUQ0EgeSAgKi8gIFBBQ0soIDAsIDAgKSwKKyAgICAvKiAgU1B2VENBIHggICovICBQQUNLKCAwLCAwICksCisgICAgLyogIFNGdlRDQSB5ICAqLyAgUEFDSyggMCwgMCApLAorICAgIC8qICBTRnZUQ0EgeCAgKi8gIFBBQ0soIDAsIDAgKSwKKyAgICAvKiAgU1B2VEwgLy8gICovICBQQUNLKCAyLCAwICksCisgICAgLyogIFNQdlRMICsgICAqLyAgUEFDSyggMiwgMCApLAorICAgIC8qICBTRnZUTCAvLyAgKi8gIFBBQ0soIDIsIDAgKSwKKyAgICAvKiAgU0Z2VEwgKyAgICovICBQQUNLKCAyLCAwICksCisgICAgLyogIFNQdkZTICAgICAqLyAgUEFDSyggMiwgMCApLAorICAgIC8qICBTRnZGUyAgICAgKi8gIFBBQ0soIDIsIDAgKSwKKyAgICAvKiAgR1BWICAgICAgICovICBQQUNLKCAwLCAyICksCisgICAgLyogIEdGViAgICAgICAqLyAgUEFDSyggMCwgMiApLAorICAgIC8qICBTRnZUUHYgICAgKi8gIFBBQ0soIDAsIDAgKSwKKyAgICAvKiAgSVNFQ1QgICAgICovICBQQUNLKCA1LCAwICksCisKKyAgICAvKiAgU1JQMCAgICAgICovICBQQUNLKCAxLCAwICksCisgICAgLyogIFNSUDEgICAgICAqLyAgUEFDSyggMSwgMCApLAorICAgIC8qICBTUlAyICAgICAgKi8gIFBBQ0soIDEsIDAgKSwKKyAgICAvKiAgU1pQMCAgICAgICovICBQQUNLKCAxLCAwICksCisgICAgLyogIFNaUDEgICAgICAqLyAgUEFDSyggMSwgMCApLAorICAgIC8qICBTWlAyICAgICAgKi8gIFBBQ0soIDEsIDAgKSwKKyAgICAvKiAgU1pQUyAgICAgICovICBQQUNLKCAxLCAwICksCisgICAgLyogIFNMT09QICAgICAqLyAgUEFDSyggMSwgMCApLAorICAgIC8qICBSVEcgICAgICAgKi8gIFBBQ0soIDAsIDAgKSwKKyAgICAvKiAgUlRIRyAgICAgICovICBQQUNLKCAwLCAwICksCisgICAgLyogIFNNRCAgICAgICAqLyAgUEFDSyggMSwgMCApLAorICAgIC8qICBFTFNFICAgICAgKi8gIFBBQ0soIDAsIDAgKSwKKyAgICAvKiAgSk1QUiAgICAgICovICBQQUNLKCAxLCAwICksCisgICAgLyogIFNDdlRDaSAgICAqLyAgUEFDSyggMSwgMCApLAorICAgIC8qICBTU3dDaSAgICAgKi8gIFBBQ0soIDEsIDAgKSwKKyAgICAvKiAgU1NXICAgICAgICovICBQQUNLKCAxLCAwICksCisKKyAgICAvKiAgRFVQICAgICAgICovICBQQUNLKCAxLCAyICksCisgICAgLyogIFBPUCAgICAgICAqLyAgUEFDSyggMSwgMCApLAorICAgIC8qICBDTEVBUiAgICAgKi8gIFBBQ0soIDAsIDAgKSwKKyAgICAvKiAgU1dBUCAgICAgICovICBQQUNLKCAyLCAyICksCisgICAgLyogIERFUFRIICAgICAqLyAgUEFDSyggMCwgMSApLAorICAgIC8qICBDSU5ERVggICAgKi8gIFBBQ0soIDEsIDEgKSwKKyAgICAvKiAgTUlOREVYICAgICovICBQQUNLKCAxLCAwICksCisgICAgLyogIEFsaWduUFRTICAqLyAgUEFDSyggMiwgMCApLAorICAgIC8qICBJTlNfJDI4ICAgKi8gIFBBQ0soIDAsIDAgKSwKKyAgICAvKiAgVVRQICAgICAgICovICBQQUNLKCAxLCAwICksCisgICAgLyogIExPT1BDQUxMICAqLyAgUEFDSyggMiwgMCApLAorICAgIC8qICBDQUxMICAgICAgKi8gIFBBQ0soIDEsIDAgKSwKKyAgICAvKiAgRkRFRiAgICAgICovICBQQUNLKCAxLCAwICksCisgICAgLyogIEVOREYgICAgICAqLyAgUEFDSyggMCwgMCApLAorICAgIC8qICBNREFQWzBdICAgKi8gIFBBQ0soIDEsIDAgKSwKKyAgICAvKiAgTURBUFsxXSAgICovICBQQUNLKCAxLCAwICksCisKKyAgICAvKiAgSVVQWzBdICAgICovICBQQUNLKCAwLCAwICksCisgICAgLyogIElVUFsxXSAgICAqLyAgUEFDSyggMCwgMCApLAorICAgIC8qICBTSFBbMF0gICAgKi8gIFBBQ0soIDAsIDAgKSwKKyAgICAvKiAgU0hQWzFdICAgICovICBQQUNLKCAwLCAwICksCisgICAgLyogIFNIQ1swXSAgICAqLyAgUEFDSyggMSwgMCApLAorICAgIC8qICBTSENbMV0gICAgKi8gIFBBQ0soIDEsIDAgKSwKKyAgICAvKiAgU0haWzBdICAgICovICBQQUNLKCAxLCAwICksCisgICAgLyogIFNIWlsxXSAgICAqLyAgUEFDSyggMSwgMCApLAorICAgIC8qICBTSFBJWCAgICAgKi8gIFBBQ0soIDEsIDAgKSwKKyAgICAvKiAgSVAgICAgICAgICovICBQQUNLKCAwLCAwICksCisgICAgLyogIE1TSVJQWzBdICAqLyAgUEFDSyggMiwgMCApLAorICAgIC8qICBNU0lSUFsxXSAgKi8gIFBBQ0soIDIsIDAgKSwKKyAgICAvKiAgQWxpZ25SUCAgICovICBQQUNLKCAwLCAwICksCisgICAgLyogIFJUREcgICAgICAqLyAgUEFDSyggMCwgMCApLAorICAgIC8qICBNSUFQWzBdICAgKi8gIFBBQ0soIDIsIDAgKSwKKyAgICAvKiAgTUlBUFsxXSAgICovICBQQUNLKCAyLCAwICksCisKKyAgICAvKiAgTlB1c2hCICAgICovICBQQUNLKCAwLCAwICksCisgICAgLyogIE5QdXNoVyAgICAqLyAgUEFDSyggMCwgMCApLAorICAgIC8qICBXUyAgICAgICAgKi8gIFBBQ0soIDIsIDAgKSwKKyAgICAvKiAgUlMgICAgICAgICovICBQQUNLKCAxLCAxICksCisgICAgLyogIFdDdnRQICAgICAqLyAgUEFDSyggMiwgMCApLAorICAgIC8qICBSQ3Z0ICAgICAgKi8gIFBBQ0soIDEsIDEgKSwKKyAgICAvKiAgR0NbMF0gICAgICovICBQQUNLKCAxLCAxICksCisgICAgLyogIEdDWzFdICAgICAqLyAgUEFDSyggMSwgMSApLAorICAgIC8qICBTQ0ZTICAgICAgKi8gIFBBQ0soIDIsIDAgKSwKKyAgICAvKiAgTURbMF0gICAgICovICBQQUNLKCAyLCAxICksCisgICAgLyogIE1EWzFdICAgICAqLyAgUEFDSyggMiwgMSApLAorICAgIC8qICBNUFBFTSAgICAgKi8gIFBBQ0soIDAsIDEgKSwKKyAgICAvKiAgTVBTICAgICAgICovICBQQUNLKCAwLCAxICksCisgICAgLyogIEZsaXBPTiAgICAqLyAgUEFDSyggMCwgMCApLAorICAgIC8qICBGbGlwT0ZGICAgKi8gIFBBQ0soIDAsIDAgKSwKKyAgICAvKiAgREVCVUcgICAgICovICBQQUNLKCAxLCAwICksCisKKyAgICAvKiAgTFQgICAgICAgICovICBQQUNLKCAyLCAxICksCisgICAgLyogIExURVEgICAgICAqLyAgUEFDSyggMiwgMSApLAorICAgIC8qICBHVCAgICAgICAgKi8gIFBBQ0soIDIsIDEgKSwKKyAgICAvKiAgR1RFUSAgICAgICovICBQQUNLKCAyLCAxICksCisgICAgLyogIEVRICAgICAgICAqLyAgUEFDSyggMiwgMSApLAorICAgIC8qICBORVEgICAgICAgKi8gIFBBQ0soIDIsIDEgKSwKKyAgICAvKiAgT0REICAgICAgICovICBQQUNLKCAxLCAxICksCisgICAgLyogIEVWRU4gICAgICAqLyAgUEFDSyggMSwgMSApLAorICAgIC8qICBJRiAgICAgICAgKi8gIFBBQ0soIDEsIDAgKSwKKyAgICAvKiAgRUlGICAgICAgICovICBQQUNLKCAwLCAwICksCisgICAgLyogIEFORCAgICAgICAqLyAgUEFDSyggMiwgMSApLAorICAgIC8qICBPUiAgICAgICAgKi8gIFBBQ0soIDIsIDEgKSwKKyAgICAvKiAgTk9UICAgICAgICovICBQQUNLKCAxLCAxICksCisgICAgLyogIERlbHRhUDEgICAqLyAgUEFDSyggMSwgMCApLAorICAgIC8qICBTREIgICAgICAgKi8gIFBBQ0soIDEsIDAgKSwKKyAgICAvKiAgU0RTICAgICAgICovICBQQUNLKCAxLCAwICksCisKKyAgICAvKiAgQUREICAgICAgICovICBQQUNLKCAyLCAxICksCisgICAgLyogIFNVQiAgICAgICAqLyAgUEFDSyggMiwgMSApLAorICAgIC8qICBESVYgICAgICAgKi8gIFBBQ0soIDIsIDEgKSwKKyAgICAvKiAgTVVMICAgICAgICovICBQQUNLKCAyLCAxICksCisgICAgLyogIEFCUyAgICAgICAqLyAgUEFDSyggMSwgMSApLAorICAgIC8qICBORUcgICAgICAgKi8gIFBBQ0soIDEsIDEgKSwKKyAgICAvKiAgRkxPT1IgICAgICovICBQQUNLKCAxLCAxICksCisgICAgLyogIENFSUxJTkcgICAqLyAgUEFDSyggMSwgMSApLAorICAgIC8qICBST1VORFswXSAgKi8gIFBBQ0soIDEsIDEgKSwKKyAgICAvKiAgUk9VTkRbMV0gICovICBQQUNLKCAxLCAxICksCisgICAgLyogIFJPVU5EWzJdICAqLyAgUEFDSyggMSwgMSApLAorICAgIC8qICBST1VORFszXSAgKi8gIFBBQ0soIDEsIDEgKSwKKyAgICAvKiAgTlJPVU5EWzBdICovICBQQUNLKCAxLCAxICksCisgICAgLyogIE5ST1VORFsxXSAqLyAgUEFDSyggMSwgMSApLAorICAgIC8qICBOUk9VTkRbMl0gKi8gIFBBQ0soIDEsIDEgKSwKKyAgICAvKiAgTlJPVU5EWzNdICovICBQQUNLKCAxLCAxICksCisKKyAgICAvKiAgV0N2dEYgICAgICovICBQQUNLKCAyLCAwICksCisgICAgLyogIERlbHRhUDIgICAqLyAgUEFDSyggMSwgMCApLAorICAgIC8qICBEZWx0YVAzICAgKi8gIFBBQ0soIDEsIDAgKSwKKyAgICAvKiAgRGVsdGFDblswXSAqLyBQQUNLKCAxLCAwICksCisgICAgLyogIERlbHRhQ25bMV0gKi8gUEFDSyggMSwgMCApLAorICAgIC8qICBEZWx0YUNuWzJdICovIFBBQ0soIDEsIDAgKSwKKyAgICAvKiAgU1JPVU5EICAgICovICBQQUNLKCAxLCAwICksCisgICAgLyogIFM0NVJvdW5kICAqLyAgUEFDSyggMSwgMCApLAorICAgIC8qICBKUk9UICAgICAgKi8gIFBBQ0soIDIsIDAgKSwKKyAgICAvKiAgSlJPRiAgICAgICovICBQQUNLKCAyLCAwICksCisgICAgLyogIFJPRkYgICAgICAqLyAgUEFDSyggMCwgMCApLAorICAgIC8qICBJTlNfJDdCICAgKi8gIFBBQ0soIDAsIDAgKSwKKyAgICAvKiAgUlVURyAgICAgICovICBQQUNLKCAwLCAwICksCisgICAgLyogIFJEVEcgICAgICAqLyAgUEFDSyggMCwgMCApLAorICAgIC8qICBTQU5HVyAgICAgKi8gIFBBQ0soIDEsIDAgKSwKKyAgICAvKiAgQUEgICAgICAgICovICBQQUNLKCAxLCAwICksCisKKyAgICAvKiAgRmxpcFBUICAgICovICBQQUNLKCAwLCAwICksCisgICAgLyogIEZsaXBSZ09OICAqLyAgUEFDSyggMiwgMCApLAorICAgIC8qICBGbGlwUmdPRkYgKi8gIFBBQ0soIDIsIDAgKSwKKyAgICAvKiAgSU5TXyQ4MyAgICovICBQQUNLKCAwLCAwICksCisgICAgLyogIElOU18kODQgICAqLyAgUEFDSyggMCwgMCApLAorICAgIC8qICBTY2FuQ1RSTCAgKi8gIFBBQ0soIDEsIDAgKSwKKyAgICAvKiAgU0RWUFRMWzBdICovICBQQUNLKCAyLCAwICksCisgICAgLyogIFNEVlBUTFsxXSAqLyAgUEFDSyggMiwgMCApLAorICAgIC8qICBHZXRJTkZPICAgKi8gIFBBQ0soIDEsIDEgKSwKKyAgICAvKiAgSURFRiAgICAgICovICBQQUNLKCAxLCAwICksCisgICAgLyogIFJPTEwgICAgICAqLyAgUEFDSyggMywgMyApLAorICAgIC8qICBNQVggICAgICAgKi8gIFBBQ0soIDIsIDEgKSwKKyAgICAvKiAgTUlOICAgICAgICovICBQQUNLKCAyLCAxICksCisgICAgLyogIFNjYW5UWVBFICAqLyAgUEFDSyggMSwgMCApLAorICAgIC8qICBJbnN0Q1RSTCAgKi8gIFBBQ0soIDIsIDAgKSwKKyAgICAvKiAgSU5TXyQ4RiAgICovICBQQUNLKCAwLCAwICksCisKKyAgICAvKiAgSU5TXyQ5MCAgKi8gICBQQUNLKCAwLCAwICksCisgICAgLyogIElOU18kOTEgICovICAgUEFDSyggMCwgMCApLAorICAgIC8qICBJTlNfJDkyICAqLyAgIFBBQ0soIDAsIDAgKSwKKyAgICAvKiAgSU5TXyQ5MyAgKi8gICBQQUNLKCAwLCAwICksCisgICAgLyogIElOU18kOTQgICovICAgUEFDSyggMCwgMCApLAorICAgIC8qICBJTlNfJDk1ICAqLyAgIFBBQ0soIDAsIDAgKSwKKyAgICAvKiAgSU5TXyQ5NiAgKi8gICBQQUNLKCAwLCAwICksCisgICAgLyogIElOU18kOTcgICovICAgUEFDSyggMCwgMCApLAorICAgIC8qICBJTlNfJDk4ICAqLyAgIFBBQ0soIDAsIDAgKSwKKyAgICAvKiAgSU5TXyQ5OSAgKi8gICBQQUNLKCAwLCAwICksCisgICAgLyogIElOU18kOUEgICovICAgUEFDSyggMCwgMCApLAorICAgIC8qICBJTlNfJDlCICAqLyAgIFBBQ0soIDAsIDAgKSwKKyAgICAvKiAgSU5TXyQ5QyAgKi8gICBQQUNLKCAwLCAwICksCisgICAgLyogIElOU18kOUQgICovICAgUEFDSyggMCwgMCApLAorICAgIC8qICBJTlNfJDlFICAqLyAgIFBBQ0soIDAsIDAgKSwKKyAgICAvKiAgSU5TXyQ5RiAgKi8gICBQQUNLKCAwLCAwICksCisKKyAgICAvKiAgSU5TXyRBMCAgKi8gICBQQUNLKCAwLCAwICksCisgICAgLyogIElOU18kQTEgICovICAgUEFDSyggMCwgMCApLAorICAgIC8qICBJTlNfJEEyICAqLyAgIFBBQ0soIDAsIDAgKSwKKyAgICAvKiAgSU5TXyRBMyAgKi8gICBQQUNLKCAwLCAwICksCisgICAgLyogIElOU18kQTQgICovICAgUEFDSyggMCwgMCApLAorICAgIC8qICBJTlNfJEE1ICAqLyAgIFBBQ0soIDAsIDAgKSwKKyAgICAvKiAgSU5TXyRBNiAgKi8gICBQQUNLKCAwLCAwICksCisgICAgLyogIElOU18kQTcgICovICAgUEFDSyggMCwgMCApLAorICAgIC8qICBJTlNfJEE4ICAqLyAgIFBBQ0soIDAsIDAgKSwKKyAgICAvKiAgSU5TXyRBOSAgKi8gICBQQUNLKCAwLCAwICksCisgICAgLyogIElOU18kQUEgICovICAgUEFDSyggMCwgMCApLAorICAgIC8qICBJTlNfJEFCICAqLyAgIFBBQ0soIDAsIDAgKSwKKyAgICAvKiAgSU5TXyRBQyAgKi8gICBQQUNLKCAwLCAwICksCisgICAgLyogIElOU18kQUQgICovICAgUEFDSyggMCwgMCApLAorICAgIC8qICBJTlNfJEFFICAqLyAgIFBBQ0soIDAsIDAgKSwKKyAgICAvKiAgSU5TXyRBRiAgKi8gICBQQUNLKCAwLCAwICksCisKKyAgICAvKiAgUHVzaEJbMF0gICovICBQQUNLKCAwLCAxICksCisgICAgLyogIFB1c2hCWzFdICAqLyAgUEFDSyggMCwgMiApLAorICAgIC8qICBQdXNoQlsyXSAgKi8gIFBBQ0soIDAsIDMgKSwKKyAgICAvKiAgUHVzaEJbM10gICovICBQQUNLKCAwLCA0ICksCisgICAgLyogIFB1c2hCWzRdICAqLyAgUEFDSyggMCwgNSApLAorICAgIC8qICBQdXNoQls1XSAgKi8gIFBBQ0soIDAsIDYgKSwKKyAgICAvKiAgUHVzaEJbNl0gICovICBQQUNLKCAwLCA3ICksCisgICAgLyogIFB1c2hCWzddICAqLyAgUEFDSyggMCwgOCApLAorICAgIC8qICBQdXNoV1swXSAgKi8gIFBBQ0soIDAsIDEgKSwKKyAgICAvKiAgUHVzaFdbMV0gICovICBQQUNLKCAwLCAyICksCisgICAgLyogIFB1c2hXWzJdICAqLyAgUEFDSyggMCwgMyApLAorICAgIC8qICBQdXNoV1szXSAgKi8gIFBBQ0soIDAsIDQgKSwKKyAgICAvKiAgUHVzaFdbNF0gICovICBQQUNLKCAwLCA1ICksCisgICAgLyogIFB1c2hXWzVdICAqLyAgUEFDSyggMCwgNiApLAorICAgIC8qICBQdXNoV1s2XSAgKi8gIFBBQ0soIDAsIDcgKSwKKyAgICAvKiAgUHVzaFdbN10gICovICBQQUNLKCAwLCA4ICksCisKKyAgICAvKiAgTURSUFswMF0gICovICBQQUNLKCAxLCAwICksCisgICAgLyogIE1EUlBbMDFdICAqLyAgUEFDSyggMSwgMCApLAorICAgIC8qICBNRFJQWzAyXSAgKi8gIFBBQ0soIDEsIDAgKSwKKyAgICAvKiAgTURSUFswM10gICovICBQQUNLKCAxLCAwICksCisgICAgLyogIE1EUlBbMDRdICAqLyAgUEFDSyggMSwgMCApLAorICAgIC8qICBNRFJQWzA1XSAgKi8gIFBBQ0soIDEsIDAgKSwKKyAgICAvKiAgTURSUFswNl0gICovICBQQUNLKCAxLCAwICksCisgICAgLyogIE1EUlBbMDddICAqLyAgUEFDSyggMSwgMCApLAorICAgIC8qICBNRFJQWzA4XSAgKi8gIFBBQ0soIDEsIDAgKSwKKyAgICAvKiAgTURSUFswOV0gICovICBQQUNLKCAxLCAwICksCisgICAgLyogIE1EUlBbMTBdICAqLyAgUEFDSyggMSwgMCApLAorICAgIC8qICBNRFJQWzExXSAgKi8gIFBBQ0soIDEsIDAgKSwKKyAgICAvKiAgTURSUFsxMl0gICovICBQQUNLKCAxLCAwICksCisgICAgLyogIE1EUlBbMTNdICAqLyAgUEFDSyggMSwgMCApLAorICAgIC8qICBNRFJQWzE0XSAgKi8gIFBBQ0soIDEsIDAgKSwKKyAgICAvKiAgTURSUFsxNV0gICovICBQQUNLKCAxLCAwICksCisKKyAgICAvKiAgTURSUFsxNl0gICovICBQQUNLKCAxLCAwICksCisgICAgLyogIE1EUlBbMTddICAqLyAgUEFDSyggMSwgMCApLAorICAgIC8qICBNRFJQWzE4XSAgKi8gIFBBQ0soIDEsIDAgKSwKKyAgICAvKiAgTURSUFsxOV0gICovICBQQUNLKCAxLCAwICksCisgICAgLyogIE1EUlBbMjBdICAqLyAgUEFDSyggMSwgMCApLAorICAgIC8qICBNRFJQWzIxXSAgKi8gIFBBQ0soIDEsIDAgKSwKKyAgICAvKiAgTURSUFsyMl0gICovICBQQUNLKCAxLCAwICksCisgICAgLyogIE1EUlBbMjNdICAqLyAgUEFDSyggMSwgMCApLAorICAgIC8qICBNRFJQWzI0XSAgKi8gIFBBQ0soIDEsIDAgKSwKKyAgICAvKiAgTURSUFsyNV0gICovICBQQUNLKCAxLCAwICksCisgICAgLyogIE1EUlBbMjZdICAqLyAgUEFDSyggMSwgMCApLAorICAgIC8qICBNRFJQWzI3XSAgKi8gIFBBQ0soIDEsIDAgKSwKKyAgICAvKiAgTURSUFsyOF0gICovICBQQUNLKCAxLCAwICksCisgICAgLyogIE1EUlBbMjldICAqLyAgUEFDSyggMSwgMCApLAorICAgIC8qICBNRFJQWzMwXSAgKi8gIFBBQ0soIDEsIDAgKSwKKyAgICAvKiAgTURSUFszMV0gICovICBQQUNLKCAxLCAwICksCisKKyAgICAvKiAgTUlSUFswMF0gICovICBQQUNLKCAyLCAwICksCisgICAgLyogIE1JUlBbMDFdICAqLyAgUEFDSyggMiwgMCApLAorICAgIC8qICBNSVJQWzAyXSAgKi8gIFBBQ0soIDIsIDAgKSwKKyAgICAvKiAgTUlSUFswM10gICovICBQQUNLKCAyLCAwICksCisgICAgLyogIE1JUlBbMDRdICAqLyAgUEFDSyggMiwgMCApLAorICAgIC8qICBNSVJQWzA1XSAgKi8gIFBBQ0soIDIsIDAgKSwKKyAgICAvKiAgTUlSUFswNl0gICovICBQQUNLKCAyLCAwICksCisgICAgLyogIE1JUlBbMDddICAqLyAgUEFDSyggMiwgMCApLAorICAgIC8qICBNSVJQWzA4XSAgKi8gIFBBQ0soIDIsIDAgKSwKKyAgICAvKiAgTUlSUFswOV0gICovICBQQUNLKCAyLCAwICksCisgICAgLyogIE1JUlBbMTBdICAqLyAgUEFDSyggMiwgMCApLAorICAgIC8qICBNSVJQWzExXSAgKi8gIFBBQ0soIDIsIDAgKSwKKyAgICAvKiAgTUlSUFsxMl0gICovICBQQUNLKCAyLCAwICksCisgICAgLyogIE1JUlBbMTNdICAqLyAgUEFDSyggMiwgMCApLAorICAgIC8qICBNSVJQWzE0XSAgKi8gIFBBQ0soIDIsIDAgKSwKKyAgICAvKiAgTUlSUFsxNV0gICovICBQQUNLKCAyLCAwICksCisKKyAgICAvKiAgTUlSUFsxNl0gICovICBQQUNLKCAyLCAwICksCisgICAgLyogIE1JUlBbMTddICAqLyAgUEFDSyggMiwgMCApLAorICAgIC8qICBNSVJQWzE4XSAgKi8gIFBBQ0soIDIsIDAgKSwKKyAgICAvKiAgTUlSUFsxOV0gICovICBQQUNLKCAyLCAwICksCisgICAgLyogIE1JUlBbMjBdICAqLyAgUEFDSyggMiwgMCApLAorICAgIC8qICBNSVJQWzIxXSAgKi8gIFBBQ0soIDIsIDAgKSwKKyAgICAvKiAgTUlSUFsyMl0gICovICBQQUNLKCAyLCAwICksCisgICAgLyogIE1JUlBbMjNdICAqLyAgUEFDSyggMiwgMCApLAorICAgIC8qICBNSVJQWzI0XSAgKi8gIFBBQ0soIDIsIDAgKSwKKyAgICAvKiAgTUlSUFsyNV0gICovICBQQUNLKCAyLCAwICksCisgICAgLyogIE1JUlBbMjZdICAqLyAgUEFDSyggMiwgMCApLAorICAgIC8qICBNSVJQWzI3XSAgKi8gIFBBQ0soIDIsIDAgKSwKKyAgICAvKiAgTUlSUFsyOF0gICovICBQQUNLKCAyLCAwICksCisgICAgLyogIE1JUlBbMjldICAqLyAgUEFDSyggMiwgMCApLAorICAgIC8qICBNSVJQWzMwXSAgKi8gIFBBQ0soIDIsIDAgKSwKKyAgICAvKiAgTUlSUFszMV0gICovICBQQUNLKCAyLCAwICkKKyAgfTsKKworCisgIHN0YXRpYyBjb25zdCBGVF9TdHJpbmcqICBPcFN0clsyNTZdID0geworICAgICAgICAgICAgIlNWVENBIHkiLCAgICAgICAvKiBTZXQgdmVjdG9ycyB0byBjb29yZGluYXRlIGF4aXMgeSAgICAqLworICAgICAgICAgICAgIlNWVENBIHgiLCAgICAgICAvKiBTZXQgdmVjdG9ycyB0byBjb29yZGluYXRlIGF4aXMgeCAgICAqLworICAgICAgICAgICAgIlNQdlRDQSB5IiwgICAgICAvKiBTZXQgUHJvai4gdmVjLiB0byBjb29yZC4gYXhpcyB5ICAgICAqLworICAgICAgICAgICAgIlNQdlRDQSB4IiwgICAgICAvKiBTZXQgUHJvai4gdmVjLiB0byBjb29yZC4gYXhpcyB4ICAgICAqLworICAgICAgICAgICAgIlNGdlRDQSB5IiwgICAgICAvKiBTZXQgRnJlZS4gdmVjLiB0byBjb29yZC4gYXhpcyB5ICAgICAqLworICAgICAgICAgICAgIlNGdlRDQSB4IiwgICAgICAvKiBTZXQgRnJlZS4gdmVjLiB0byBjb29yZC4gYXhpcyB4ICAgICAqLworICAgICAgICAgICAgIlNQdlRMIC8vIiwgICAgICAvKiBTZXQgUHJvai4gdmVjLiBwYXJhbGxlbCB0byBzZWdtZW50ICAqLworICAgICAgICAgICAgIlNQdlRMICsiLCAgICAgICAvKiBTZXQgUHJvai4gdmVjLiBub3JtYWwgdG8gc2VnbWVudCAgICAqLworICAgICAgICAgICAgIlNGdlRMIC8vIiwgICAgICAvKiBTZXQgRnJlZS4gdmVjLiBwYXJhbGxlbCB0byBzZWdtZW50ICAqLworICAgICAgICAgICAgIlNGdlRMICsiLCAgICAgICAvKiBTZXQgRnJlZS4gdmVjLiBub3JtYWwgdG8gc2VnbWVudCAgICAqLworICAgICAgICAgICAgIlNQdkZTIiwgICAgICAgICAvKiBTZXQgUHJvai4gdmVjLiBmcm9tIHN0YWNrICAgICAgICAgICAqLworICAgICAgICAgICAgIlNGdkZTIiwgICAgICAgICAvKiBTZXQgRnJlZS4gdmVjLiBmcm9tIHN0YWNrICAgICAgICAgICAqLworICAgICAgICAgICAgIkdQViIsICAgICAgICAgICAvKiBHZXQgcHJvamVjdGlvbiB2ZWN0b3IgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgIkdGViIsICAgICAgICAgICAvKiBHZXQgZnJlZWRvbSB2ZWN0b3IgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgIlNGdlRQdiIsICAgICAgICAvKiBTZXQgZnJlZS4gdmVjLiB0byBwcm9qLiB2ZWMuICAgICAgICAqLworICAgICAgICAgICAgIklTRUNUIiwgICAgICAgICAvKiBjb21wdXRlIGludGVyc2VjdGlvbiAgICAgICAgICAgICAgICAqLworCisgICAgICAgICAgICAiU1JQMCIsICAgICAgICAgIC8qIFNldCByZWZlcmVuY2UgcG9pbnQgMCAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAiU1JQMSIsICAgICAgICAgIC8qIFNldCByZWZlcmVuY2UgcG9pbnQgMSAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAiU1JQMiIsICAgICAgICAgIC8qIFNldCByZWZlcmVuY2UgcG9pbnQgMiAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAiU1pQMCIsICAgICAgICAgIC8qIFNldCBab25lIFBvaW50ZXIgMCAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAiU1pQMSIsICAgICAgICAgIC8qIFNldCBab25lIFBvaW50ZXIgMSAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAiU1pQMiIsICAgICAgICAgIC8qIFNldCBab25lIFBvaW50ZXIgMiAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAiU1pQUyIsICAgICAgICAgIC8qIFNldCBhbGwgem9uZSBwb2ludGVycyAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAiU0xPT1AiLCAgICAgICAgIC8qIFNldCBsb29wIGNvdW50ZXIgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAiUlRHIiwgICAgICAgICAgIC8qIFJvdW5kIHRvIEdyaWQgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAiUlRIRyIsICAgICAgICAgIC8qIFJvdW5kIHRvIEhhbGYtR3JpZCAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAiU01EIiwgICAgICAgICAgIC8qIFNldCBNaW5pbXVtIERpc3RhbmNlICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAiRUxTRSIsICAgICAgICAgIC8qIEVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAiSk1QUiIsICAgICAgICAgIC8qIEp1bXAgUmVsYXRpdmUgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAiU0N2VENpIiwgICAgICAgIC8qIFNldCBDVlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAiU1N3Q2kiLCAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAiU1NXIiwgICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgICJEVVAiLAorICAgICAgICAgICAgIlBPUCIsCisgICAgICAgICAgICAiQ0xFQVIiLAorICAgICAgICAgICAgIlNXQVAiLAorICAgICAgICAgICAgIkRFUFRIIiwKKyAgICAgICAgICAgICJDSU5ERVgiLAorICAgICAgICAgICAgIk1JTkRFWCIsCisgICAgICAgICAgICAiQWxpZ25QVFMiLAorICAgICAgICAgICAgIklOU18kMjgiLAorICAgICAgICAgICAgIlVUUCIsCisgICAgICAgICAgICAiTE9PUENBTEwiLAorICAgICAgICAgICAgIkNBTEwiLAorICAgICAgICAgICAgIkZERUYiLAorICAgICAgICAgICAgIkVOREYiLAorICAgICAgICAgICAgIk1EQVBbLV0iLAorICAgICAgICAgICAgIk1EQVBbcl0iLAorCisgICAgICAgICAgICAiSVVQW3ldIiwKKyAgICAgICAgICAgICJJVVBbeF0iLAorICAgICAgICAgICAgIlNIUFswXSIsCisgICAgICAgICAgICAiU0hQWzFdIiwKKyAgICAgICAgICAgICJTSENbMF0iLAorICAgICAgICAgICAgIlNIQ1sxXSIsCisgICAgICAgICAgICAiU0haWzBdIiwKKyAgICAgICAgICAgICJTSFpbMV0iLAorICAgICAgICAgICAgIlNIUElYIiwKKyAgICAgICAgICAgICJJUCIsCisgICAgICAgICAgICAiTVNJUlBbMF0iLAorICAgICAgICAgICAgIk1TSVJQWzFdIiwKKyAgICAgICAgICAgICJBbGlnblJQIiwKKyAgICAgICAgICAgICJSVERHIiwKKyAgICAgICAgICAgICJNSUFQWy1dIiwKKyAgICAgICAgICAgICJNSUFQW3JdIiwKKworICAgICAgICAgICAgIk5QdXNoQiIsCisgICAgICAgICAgICAiTlB1c2hXIiwKKyAgICAgICAgICAgICJXUyIsCisgICAgICAgICAgICAiUlMiLAorICAgICAgICAgICAgIldDdnRQIiwKKyAgICAgICAgICAgICJSQ3Z0IiwKKyAgICAgICAgICAgICJHQ1swXSIsCisgICAgICAgICAgICAiR0NbMV0iLAorICAgICAgICAgICAgIlNDRlMiLAorICAgICAgICAgICAgIk1EWzBdIiwKKyAgICAgICAgICAgICJNRFsxXSIsCisgICAgICAgICAgICAiTVBQRU0iLAorICAgICAgICAgICAgIk1QUyIsCisgICAgICAgICAgICAiRmxpcE9OIiwKKyAgICAgICAgICAgICJGbGlwT0ZGIiwKKyAgICAgICAgICAgICJERUJVRyIsCisKKyAgICAgICAgICAgICJMVCIsCisgICAgICAgICAgICAiTFRFUSIsCisgICAgICAgICAgICAiR1QiLAorICAgICAgICAgICAgIkdURVEiLAorICAgICAgICAgICAgIkVRIiwKKyAgICAgICAgICAgICJORVEiLAorICAgICAgICAgICAgIk9ERCIsCisgICAgICAgICAgICAiRVZFTiIsCisgICAgICAgICAgICAiSUYiLAorICAgICAgICAgICAgIkVJRiIsCisgICAgICAgICAgICAiQU5EIiwKKyAgICAgICAgICAgICJPUiIsCisgICAgICAgICAgICAiTk9UIiwKKyAgICAgICAgICAgICJEZWx0YVAxIiwKKyAgICAgICAgICAgICJTREIiLAorICAgICAgICAgICAgIlNEUyIsCisKKyAgICAgICAgICAgICJBREQiLAorICAgICAgICAgICAgIlNVQiIsCisgICAgICAgICAgICAiRElWIiwKKyAgICAgICAgICAgICJNVUwiLAorICAgICAgICAgICAgIkFCUyIsCisgICAgICAgICAgICAiTkVHIiwKKyAgICAgICAgICAgICJGTE9PUiIsCisgICAgICAgICAgICAiQ0VJTElORyIsCisgICAgICAgICAgICAiUk9VTkRbR10iLAorICAgICAgICAgICAgIlJPVU5EW0JdIiwKKyAgICAgICAgICAgICJST1VORFtXXSIsCisgICAgICAgICAgICAiUk9VTkRbP10iLAorICAgICAgICAgICAgIk5ST1VORFtHXSIsCisgICAgICAgICAgICAiTlJPVU5EW0JdIiwKKyAgICAgICAgICAgICJOUk9VTkRbV10iLAorICAgICAgICAgICAgIk5ST1VORFs/XSIsCisKKyAgICAgICAgICAgICJXQ3Z0RiIsCisgICAgICAgICAgICAiRGVsdGFQMiIsCisgICAgICAgICAgICAiRGVsdGFQMyIsCisgICAgICAgICAgICAiRGVsdGFDMSIsCisgICAgICAgICAgICAiRGVsdGFDMiIsCisgICAgICAgICAgICAiRGVsdGFDMyIsCisgICAgICAgICAgICAiU1JPVU5EIiwKKyAgICAgICAgICAgICJTNDVSb3VuZCIsCisgICAgICAgICAgICAiSlJPVCIsCisgICAgICAgICAgICAiSlJPRiIsCisgICAgICAgICAgICAiUk9GRiIsCisgICAgICAgICAgICAiSU5TXyQ3QiIsCisgICAgICAgICAgICAiUlVURyIsCisgICAgICAgICAgICAiUkRURyIsCisgICAgICAgICAgICAiU0FOR1ciLAorICAgICAgICAgICAgIkFBIiwKKworICAgICAgICAgICAgIkZsaXBQVCIsCisgICAgICAgICAgICAiRmxpcFJnT04iLAorICAgICAgICAgICAgIkZsaXBSZ09GRiIsCisgICAgICAgICAgICAiSU5TXyQ4MyIsCisgICAgICAgICAgICAiSU5TXyQ4NCIsCisgICAgICAgICAgICAiU2NhbkNUUkwiLAorICAgICAgICAgICAgIlNEUFZUTFswXSIsCisgICAgICAgICAgICAiU0RQVlRMWzFdIiwKKyAgICAgICAgICAgICJHZXRJTkZPIiwKKyAgICAgICAgICAgICJJREVGIiwKKyAgICAgICAgICAgICJST0xMIiwKKyAgICAgICAgICAgICJNQVgiLAorICAgICAgICAgICAgIk1JTiIsCisgICAgICAgICAgICAiU2NhblRZUEUiLAorICAgICAgICAgICAgIkludENUUkwiLAorICAgICAgICAgICAgIklOU18kOEYiLAorCisgICAgICAgICAgICAiSU5TXyQ5MCIsCisgICAgICAgICAgICAiSU5TXyQ5MSIsCisgICAgICAgICAgICAiSU5TXyQ5MiIsCisgICAgICAgICAgICAiSU5TXyQ5MyIsCisgICAgICAgICAgICAiSU5TXyQ5NCIsCisgICAgICAgICAgICAiSU5TXyQ5NSIsCisgICAgICAgICAgICAiSU5TXyQ5NiIsCisgICAgICAgICAgICAiSU5TXyQ5NyIsCisgICAgICAgICAgICAiSU5TXyQ5OCIsCisgICAgICAgICAgICAiSU5TXyQ5OSIsCisgICAgICAgICAgICAiSU5TXyQ5QSIsCisgICAgICAgICAgICAiSU5TXyQ5QiIsCisgICAgICAgICAgICAiSU5TXyQ5QyIsCisgICAgICAgICAgICAiSU5TXyQ5RCIsCisgICAgICAgICAgICAiSU5TXyQ5RSIsCisgICAgICAgICAgICAiSU5TXyQ5RiIsCisKKyAgICAgICAgICAgICJJTlNfJEEwIiwKKyAgICAgICAgICAgICJJTlNfJEExIiwKKyAgICAgICAgICAgICJJTlNfJEEyIiwKKyAgICAgICAgICAgICJJTlNfJEEzIiwKKyAgICAgICAgICAgICJJTlNfJEE0IiwKKyAgICAgICAgICAgICJJTlNfJEE1IiwKKyAgICAgICAgICAgICJJTlNfJEE2IiwKKyAgICAgICAgICAgICJJTlNfJEE3IiwKKyAgICAgICAgICAgICJJTlNfJEE4IiwKKyAgICAgICAgICAgICJJTlNfJEE5IiwKKyAgICAgICAgICAgICJJTlNfJEFBIiwKKyAgICAgICAgICAgICJJTlNfJEFCIiwKKyAgICAgICAgICAgICJJTlNfJEFDIiwKKyAgICAgICAgICAgICJJTlNfJEFEIiwKKyAgICAgICAgICAgICJJTlNfJEFFIiwKKyAgICAgICAgICAgICJJTlNfJEFGIiwKKworICAgICAgICAgICAgIlB1c2hCWzBdIiwKKyAgICAgICAgICAgICJQdXNoQlsxXSIsCisgICAgICAgICAgICAiUHVzaEJbMl0iLAorICAgICAgICAgICAgIlB1c2hCWzNdIiwKKyAgICAgICAgICAgICJQdXNoQls0XSIsCisgICAgICAgICAgICAiUHVzaEJbNV0iLAorICAgICAgICAgICAgIlB1c2hCWzZdIiwKKyAgICAgICAgICAgICJQdXNoQls3XSIsCisgICAgICAgICAgICAiUHVzaFdbMF0iLAorICAgICAgICAgICAgIlB1c2hXWzFdIiwKKyAgICAgICAgICAgICJQdXNoV1syXSIsCisgICAgICAgICAgICAiUHVzaFdbM10iLAorICAgICAgICAgICAgIlB1c2hXWzRdIiwKKyAgICAgICAgICAgICJQdXNoV1s1XSIsCisgICAgICAgICAgICAiUHVzaFdbNl0iLAorICAgICAgICAgICAgIlB1c2hXWzddIiwKKworICAgICAgICAgICAgIk1EUlBbR10iLAorICAgICAgICAgICAgIk1EUlBbQl0iLAorICAgICAgICAgICAgIk1EUlBbV10iLAorICAgICAgICAgICAgIk1EUlBbP10iLAorICAgICAgICAgICAgIk1EUlBbckddIiwKKyAgICAgICAgICAgICJNRFJQW3JCXSIsCisgICAgICAgICAgICAiTURSUFtyV10iLAorICAgICAgICAgICAgIk1EUlBbcj9dIiwKKyAgICAgICAgICAgICJNRFJQW21HXSIsCisgICAgICAgICAgICAiTURSUFttQl0iLAorICAgICAgICAgICAgIk1EUlBbbVddIiwKKyAgICAgICAgICAgICJNRFJQW20/XSIsCisgICAgICAgICAgICAiTURSUFttckddIiwKKyAgICAgICAgICAgICJNRFJQW21yQl0iLAorICAgICAgICAgICAgIk1EUlBbbXJXXSIsCisgICAgICAgICAgICAiTURSUFttcj9dIiwKKyAgICAgICAgICAgICJNRFJQW3BHXSIsCisgICAgICAgICAgICAiTURSUFtwQl0iLAorCisgICAgICAgICAgICAiTURSUFtwV10iLAorICAgICAgICAgICAgIk1EUlBbcD9dIiwKKyAgICAgICAgICAgICJNRFJQW3ByR10iLAorICAgICAgICAgICAgIk1EUlBbcHJCXSIsCisgICAgICAgICAgICAiTURSUFtwclddIiwKKyAgICAgICAgICAgICJNRFJQW3ByP10iLAorICAgICAgICAgICAgIk1EUlBbcG1HXSIsCisgICAgICAgICAgICAiTURSUFtwbUJdIiwKKyAgICAgICAgICAgICJNRFJQW3BtV10iLAorICAgICAgICAgICAgIk1EUlBbcG0/XSIsCisgICAgICAgICAgICAiTURSUFtwbXJHXSIsCisgICAgICAgICAgICAiTURSUFtwbXJCXSIsCisgICAgICAgICAgICAiTURSUFtwbXJXXSIsCisgICAgICAgICAgICAiTURSUFtwbXI/XSIsCisKKyAgICAgICAgICAgICJNSVJQW0ddIiwKKyAgICAgICAgICAgICJNSVJQW0JdIiwKKyAgICAgICAgICAgICJNSVJQW1ddIiwKKyAgICAgICAgICAgICJNSVJQWz9dIiwKKyAgICAgICAgICAgICJNSVJQW3JHXSIsCisgICAgICAgICAgICAiTUlSUFtyQl0iLAorICAgICAgICAgICAgIk1JUlBbclddIiwKKyAgICAgICAgICAgICJNSVJQW3I/XSIsCisgICAgICAgICAgICAiTUlSUFttR10iLAorICAgICAgICAgICAgIk1JUlBbbUJdIiwKKyAgICAgICAgICAgICJNSVJQW21XXSIsCisgICAgICAgICAgICAiTUlSUFttP10iLAorICAgICAgICAgICAgIk1JUlBbbXJHXSIsCisgICAgICAgICAgICAiTUlSUFttckJdIiwKKyAgICAgICAgICAgICJNSVJQW21yV10iLAorICAgICAgICAgICAgIk1JUlBbbXI/XSIsCisgICAgICAgICAgICAiTUlSUFtwR10iLAorICAgICAgICAgICAgIk1JUlBbcEJdIiwKKworICAgICAgICAgICAgIk1JUlBbcFddIiwKKyAgICAgICAgICAgICJNSVJQW3A/XSIsCisgICAgICAgICAgICAiTUlSUFtwckddIiwKKyAgICAgICAgICAgICJNSVJQW3ByQl0iLAorICAgICAgICAgICAgIk1JUlBbcHJXXSIsCisgICAgICAgICAgICAiTUlSUFtwcj9dIiwKKyAgICAgICAgICAgICJNSVJQW3BtR10iLAorICAgICAgICAgICAgIk1JUlBbcG1CXSIsCisgICAgICAgICAgICAiTUlSUFtwbVddIiwKKyAgICAgICAgICAgICJNSVJQW3BtP10iLAorICAgICAgICAgICAgIk1JUlBbcG1yR10iLAorICAgICAgICAgICAgIk1JUlBbcG1yQl0iLAorICAgICAgICAgICAgIk1JUlBbcG1yV10iLAorICAgICAgICAgICAgIk1JUlBbcG1yP10iCisgICAgICAgICAgfTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogSW5pdF9LZXlib2FyZCA6IHNldCB0aGUgaW5wdXQgZmlsZSBkZXNjcmlwdG9yIHRvIGNoYXItYnktY2hhcgorICogICAgICAgICAgICAgICAgIG1vZGUgb24gVW5peC4uCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmZGVmIFVOSVgKKworIHN0cnVjdCB0ZXJtaW9zICBvbGRfdGVybWlvOworIAorIHN0YXRpYworIHZvaWQgSW5pdF9LZXlib2FyZCggdm9pZCApCisgeworICAgc3RydWN0IHRlcm1pb3MgIHRlcm1pbzsKKworI2lmbmRlZiBIQVZFX1RDR0VUQVRUUgorICAgaW9jdGwoIDAsIFRDR0VUUywgJm9sZF90ZXJtaW8gKTsgCisjZWxzZQorICAgdGNnZXRhdHRyKCAwLCAmb2xkX3Rlcm1pbyApOworI2VuZGlmCisKKyAgIHRlcm1pbyA9IG9sZF90ZXJtaW87CisgICAKKy8qICAgdGVybWlvLmNfbGZsYWcgJj0gfihJQ0FOT04rRUNITytFQ0hPRStFQ0hPSytFQ0hPTkwrRUNIT0tFKTsgKi8KKyAgIHRlcm1pby5jX2xmbGFnICY9IH4oSUNBTk9OK0VDSE8rRUNIT0UrRUNIT0srRUNIT05MKTsKKworI2lmbmRlZiBIQVZFX1RDU0VUQVRUUgorICAgaW9jdGwoIDAsIFRDU0VUUywgJnRlcm1pbyApOworI2Vsc2UKKyAgIHRjc2V0YXR0ciggMCwgVENTQU5PVywgJnRlcm1pbyApOworI2VuZGlmCisgfQorCisgc3RhdGljCisgdm9pZCBSZXNldF9LZXlib2FyZCggdm9pZCApCisgeworI2lmbmRlZiBIQVZFX1RDU0VUQVRUUgorICAgaW9jdGwoIDAsIFRDU0VUUywgJm9sZF90ZXJtaW8gKTsKKyNlbHNlCisgICB0Y3NldGF0dHIoIDAsIFRDU0FOT1csICZvbGRfdGVybWlvICk7CisjZW5kaWYKKworIH0KKworI2Vsc2UKKworIHN0YXRpYworIHZvaWQgSW5pdF9LZXlib2FyZCggdm9pZCApCisgeworIH0KKworIHN0YXRpYworIHZvaWQgUmVzZXRfS2V5Ym9hcmQoIHZvaWQgKQorIHsKKyB9CisKKyNlbmRpZgorCisKKyAgdm9pZCBQYW5pYyggY29uc3QgY2hhciogbWVzc2FnZSApCisgIHsKKyAgICBmcHJpbnRmKCBzdGRlcnIsICIlc1xuICBlcnJvciBjb2RlID0gMHglMDR4XG4iLCBtZXNzYWdlLCBlcnJvciApOworICAgIFJlc2V0X0tleWJvYXJkKCk7CisgICAgZXhpdCgxKTsKKyAgfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgRnVuY3Rpb24gICAgOiAgQ2FsY19MZW5ndGgKKyAqCisgKiAgRGVzY3JpcHRpb24gOiAgQ29tcHV0ZXMgdGhlIGxlbmd0aCBpbiBieXRlcyBvZiBjdXJyZW50IG9wY29kZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgQ1VSICAoKmV4YykKKworCisgIHN0YXRpYyB2b2lkICBDYWxjX0xlbmd0aCggVFRfRXhlY0NvbnRleHQgIGV4YyApCisgIHsKKyAgICBDVVIub3Bjb2RlID0gQ1VSLmNvZGVbQ1VSLklQXTsKKworICAgIHN3aXRjaCAoIENVUi5vcGNvZGUgKQorICAgIHsKKyAgICBjYXNlIDB4NDA6CisgICAgICBpZiAoIENVUi5JUCArIDEgPj0gQ1VSLmNvZGVTaXplICkKKyAgICAgICAgUGFuaWMoICJjb2RlIHJhbmdlIG92ZXJmbG93ICEhIiApOworCisgICAgICBDVVIubGVuZ3RoID0gQ1VSLmNvZGVbQ1VSLklQICsgMV0gKyAyOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIDB4NDE6CisgICAgICBpZiAoIENVUi5JUCArIDEgPj0gQ1VSLmNvZGVTaXplICkKKyAgICAgICAgUGFuaWMoICJjb2RlIHJhbmdlIG92ZXJmbG93ICEhIiApOworCisgICAgICBDVVIubGVuZ3RoID0gQ1VSLmNvZGVbQ1VSLklQICsgMV0gKiAyICsgMjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAweEIwOgorICAgIGNhc2UgMHhCMToKKyAgICBjYXNlIDB4QjI6CisgICAgY2FzZSAweEIzOgorICAgIGNhc2UgMHhCNDoKKyAgICBjYXNlIDB4QjU6CisgICAgY2FzZSAweEI2OgorICAgIGNhc2UgMHhCNzoKKyAgICAgIENVUi5sZW5ndGggPSBDVVIub3Bjb2RlIC0gMHhCMCArIDI7CisgICAgICBicmVhazsKKworICAgIGNhc2UgMHhCODoKKyAgICBjYXNlIDB4Qjk6CisgICAgY2FzZSAweEJBOgorICAgIGNhc2UgMHhCQjoKKyAgICBjYXNlIDB4QkM6CisgICAgY2FzZSAweEJEOgorICAgIGNhc2UgMHhCRToKKyAgICBjYXNlIDB4QkY6CisgICAgICBDVVIubGVuZ3RoID0gKENVUi5vcGNvZGUgLSAweEI4KSAqIDIgKyAzOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgQ1VSLmxlbmd0aCA9IDE7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvKiBtYWtlIHN1cmUgcmVzdWx0IGlzIGluIHJhbmdlICovCisKKyAgICBpZiAoIENVUi5JUCArIENVUi5sZW5ndGggPiBDVVIuY29kZVNpemUgKQorICAgICAgUGFuaWMoICJjb2RlIHJhbmdlIG92ZXJmbG93ICEhIiApOworICB9CisKKworICAvKiBEaXNhc3NlbWJsZSB0aGUgY3VycmVudCBsaW5lICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgY29uc3QgRlRfU3RyaW5nKiBDdXJfVV9MaW5lKCBUVF9FeGVjQ29udGV4dCAgZXhlYyApCisgIHsKKyAgICBGVF9TdHJpbmcgIHNbMzJdOworICAgIEZUX0ludCBvcCwgaSwgbjsKKworICAgIG9wID0gZXhlYy0+Y29kZVsgZXhlYy0+SVAgXTsKKworICAgIHNwcmludGYoIHRlbXBTdHIsICIlMDRseDogJTAyaHggICVzIiwgZXhlYy0+SVAsIG9wLCBPcFN0cltvcF0gKTsKKworICAgIGlmICggb3AgPT0gMHg0MCApCisgICAgeworICAgICAgbiA9IGV4ZWMtPmNvZGVbIGV4ZWMtPklQKzEgXTsKKyAgICAgIHNwcmludGYoIHMsICIoJWQpIiwgbiApOworICAgICAgc3RybmNhdCggdGVtcFN0ciwgcywgOCApOworCisgICAgICBpZiAoIG4gPiAyMCApIG4gPSAyMDsgLyogbGltaXQgb3V0cHV0ICovCisKKyAgICAgIGZvciAoIGkgPSAwOyBpIDwgbjsgaSsrICkKKyAgICAgIHsKKyAgICAgICAgc3ByaW50ZiggcywgIiAkJTAyaHgiLCBleGVjLT5jb2RlWyBleGVjLT5JUCtpKzIgXSApOworICAgICAgICBzdHJuY2F0KCB0ZW1wU3RyLCBzLCA4ICk7CisgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKCBvcCA9PSAweDQxICkKKyAgICB7CisgICAgICBuID0gZXhlYy0+Y29kZVsgZXhlYy0+SVArMSBdOworICAgICAgc3ByaW50ZiggcywgIiglZCkiLCBuICk7CisgICAgICBzdHJuY2F0KCB0ZW1wU3RyLCBzLCA4ICk7CisKKyAgICAgIGlmIChuID4gMjApIG4gPSAyMDsgLyogbGltaXQgb3V0cHV0ICovCisKKyAgICAgIGZvciAoIGkgPSAwOyBpIDwgbjsgaSsrICkKKyAgICAgIHsKKyAgICAgICAgc3ByaW50ZiggcywgIiAkJTAyaHglMDJoeCIsIGV4ZWMtPmNvZGVbIGV4ZWMtPklQK2kqMisyIF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjLT5jb2RlWyBleGVjLT5JUCtpKjIrMyBdICk7CisgICAgICAgIHN0cm5jYXQoIHRlbXBTdHIsIHMsIDggKTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoIChvcCAmIDB4RjgpID09IDB4QjAgKQorICAgIHsKKyAgICAgIG4gPSBvcC0weEIwOworCisgICAgICBmb3IgKCBpPTA7IGkgPD0gbjsgaSsrICkKKyAgICAgIHsKKyAgICAgICAgc3ByaW50ZiggcywgIiAkJTAyaHgiLCBleGVjLT5jb2RlWyBleGVjLT5JUCtpKzEgXSApOworICAgICAgICBzdHJuY2F0KCB0ZW1wU3RyLCBzLCA4ICk7CisgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKCAob3AgJiAweEY4KSA9PSAweEI4ICkKKyAgICB7CisgICAgICBuID0gb3AtMHhCODsKKworICAgICAgZm9yICggaSA9IDA7IGkgPD0gbjsgaSsrICkKKyAgICAgIHsKKyAgICAgICAgc3ByaW50ZiggcywgIiAkJTAyaHglMDJoeCIsIGV4ZWMtPmNvZGVbIGV4ZWMtPklQK2kqMisxIF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlYy0+Y29kZVsgZXhlYy0+SVAraSoyKzIgXSApOworICAgICAgICBzdHJuY2F0KCB0ZW1wU3RyLCBzLCA4ICk7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIChGVF9TdHJpbmcqKXRlbXBTdHI7CisgIH0KKworCisgIHN0YXRpYworICBUVF9FcnJvciAgUnVuSW5zKCBUVF9FeGVjQ29udGV4dCAgZXhjICkKKyAgeworICAgIEZUX0ludCAgICBBLCBkaWZmLCBrZXk7CisgICAgRlRfTG9uZyAgIG5leHRfSVA7CisgICAgRlRfQ2hhciAgIGNoLCBvbGRjaCwgKnRlbXA7CisKKyAgICBUVF9FcnJvciAgZXJyb3IgPSAwOworCisgICAgVFRfR2x5cGhab25lICBzYXZlOworICAgIFRUX0dseXBoWm9uZSAgcHRzOworCisgICAgY29uc3QgRlRfU3RyaW5nKiAgcm91bmRfc3RyWzhdID0KKyAgICB7CisgICAgICAidG8gaGFsZi1ncmlkIiwKKyAgICAgICJ0byBncmlkIiwKKyAgICAgICJ0byBkb3VibGUgZ3JpZCIsCisgICAgICAiZG93biB0byBncmlkIiwKKyAgICAgICJ1cCB0byBncmlkIiwKKyAgICAgICJvZmYiLAorICAgICAgInN1cGVyIiwKKyAgICAgICJzdXBlciA0NSIKKyAgICB9OworCisgICAgLyogb25seSBkZWJ1ZyB0aGUgcmVxdWVzdGVkIGNvZGUgcmFuZ2UgKi8KKyAgICBpZiAoZXhjLT5jdXJSYW5nZSAhPSAoVFRfSW50KWRlYnVnX2NvZGVyYW5nZSkKKyAgICAgIHJldHVybiBUVF9SdW5JbnMoZXhjKTsKKworICAgIGV4Yy0+cHRzLm5fcG9pbnRzICAgPSBleGMtPnpwMC5uX3BvaW50czsKKyAgICBleGMtPnB0cy5uX2NvbnRvdXJzID0gZXhjLT56cDAubl9jb250b3VyczsKKworICAgIHB0cyA9IGV4Yy0+cHRzOworICAgIAorCisgICAgc2F2ZS5uX3BvaW50cyAgID0gcHRzLm5fcG9pbnRzOworICAgIHNhdmUubl9jb250b3VycyA9IHB0cy5uX2NvbnRvdXJzOworCisgICAgc2F2ZS5vcmcgICA9IChUVF9WZWN0b3IqKW1hbGxvYyggMiAqIHNpemVvZiggVFRfRjI2RG90NiApICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhdmUubl9wb2ludHMgKTsKKyAgICBzYXZlLmN1ciAgID0gKFRUX1ZlY3RvciopbWFsbG9jKCAyICogc2l6ZW9mKCBUVF9GMjZEb3Q2ICkgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZS5uX3BvaW50cyApOworICAgIHNhdmUudG91Y2ggPSAoVFRfQnl0ZSopbWFsbG9jKCBzYXZlLm5fcG9pbnRzICk7CisKKyAgICBleGMtPmluc3RydWN0aW9uX3RyYXAgPSAxOworCisgICAgZG8KKyAgICB7CisgICAgICBpZiAoIENVUi5JUCA8IENVUi5jb2RlU2l6ZSApCisgICAgICB7CisgICAgICAgIENhbGNfTGVuZ3RoKCBleGMgKTsKKworICAgICAgICBDVVIuYXJncyA9IENVUi50b3AgLSAoUG9wX1B1c2hfQ291bnRbQ1VSLm9wY29kZV0gPj4gNCk7CisKKyAgICAgICAgLyogYGFyZ3MnIGlzIHRoZSB0b3Agb2YgdGhlIHN0YWNrIG9uY2UgYXJndW1lbnRzIGhhdmUgYmVlbiBwb3BwZWQuICovCisgICAgICAgIC8qIE9uZSBjYW4gYWxzbyBpbnRlcnByZXQgaXQgYXMgdGhlIGluZGV4IG9mIHRoZSBsYXN0IGFyZ3VtZW50LiAgICAqLworCisgICAgICAgIC8qIFByaW50IHRoZSBjdXJyZW50IGxpbmUuICBXZSB1c2UgYSA4MC1jb2x1bW5zIGNvbnNvbGUgd2l0aCB0aGUgICAqLworICAgICAgICAvKiBmb2xsb3dpbmcgZm9ybWF0dGluZzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgIC8qIFtsb2NdOlthZGRyXSBbb3Bjb2RlXSAgW2Rpc2Fzc2VtYnldICAgICAgICAgIFthXVtiXXxbY11bZF0gICAgICAqLworICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICAgICAgICB7CisgICAgICAgICAgY2hhciAgICAgIHRlbXBbODBdOworICAgICAgICAgIGludCAgICAgICBuLCBjb2wsIHBvcDsKKyAgICAgICAgICBpbnQgICAgICAgYXJncyA9IENVUi5hcmdzOworCisgICAgICAgICAgc3ByaW50ZiggdGVtcCwgIiU3OGNcbiIsICcgJyApOworCisgICAgICAgICAgLyogZmlyc3QgbGV0dGVyIG9mIGxvY2F0aW9uICovCisgICAgICAgICAgc3dpdGNoICggQ1VSLmN1clJhbmdlICkKKyAgICAgICAgICB7CisgICAgICAgICAgY2FzZSB0dF9jb2RlcmFuZ2VfZ2x5cGg6CisgICAgICAgICAgICB0ZW1wWzBdID0gJ2cnOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSB0dF9jb2RlcmFuZ2VfY3Z0OgorICAgICAgICAgICAgdGVtcFswXSA9ICdjJzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB0ZW1wWzBdID0gJ2YnOworICAgICAgICAgIH0KKworICAgICAgICAgIC8qIGN1cnJlbnQgSVAgKi8KKyAgICAgICAgICBzcHJpbnRmKCB0ZW1wKzEsICIlMDRseDogJTAyeCAgJS0zNi4zNnMiLAorICAgICAgICAgICAgICAgICAgIENVUi5JUCwKKyAgICAgICAgICAgICAgICAgICBDVVIub3Bjb2RlLAorICAgICAgICAgICAgICAgICAgIEN1cl9VX0xpbmUoJkNVUikgKTsKKworICAgICAgICAgIHN0cm5jcHkoIHRlbXArNDYsICIgKCIsIDIgKTsKKworICAgICAgICAgIGFyZ3MgPSBDVVIudG9wIC0gMTsKKyAgICAgICAgICBwb3AgID0gUG9wX1B1c2hfQ291bnRbQ1VSLm9wY29kZV0gPj4gNDsKKyAgICAgICAgICBjb2wgID0gNDg7CisgICAgICAgICAgZm9yICggbiA9IDY7IG4gPiAwOyBuLS0gKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggcG9wID09IDAgKQorICAgICAgICAgICAgICB0ZW1wW2NvbC0xXSA9ICh0ZW1wW2NvbC0xXSA9PSAnKCcgPyAnICcgOiAnKScgKTsKKworICAgICAgICAgICAgaWYgKCBhcmdzIDwgQ1VSLnRvcCAmJiBhcmdzID49IDAgKQorICAgICAgICAgICAgICBzcHJpbnRmKCB0ZW1wK2NvbCwgIiUwNGx4IiwgQ1VSLnN0YWNrW2FyZ3NdICk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHNwcmludGYoIHRlbXArY29sLCAiICAgICIgKTsKKworICAgICAgICAgICAgdGVtcFtjb2wrNF0gPSAnICc7CisgICAgICAgICAgICBjb2wgKz0gNTsKKyAgICAgICAgICAgIHBvcC0tOworICAgICAgICAgICAgYXJncy0tOworICAgICAgICAgIH0KKyAgICAgICAgICB0ZW1wWzc4XSA9ICdcbic7CisgICAgICAgICAgdGVtcFs3OV0gPSAnXDAnOworICAgICAgICAgIHByaW50ZiggIiVzIiwgdGVtcCApOworICAgICAgICB9CisKKyAgICAgICAgLyogRmlyc3QsIGNoZWNrIGZvciBlbXB0eSBzdGFjayBhbmQgb3ZlcmZsb3cgKi8KKyAgICAgICAgaWYgKCBDVVIuYXJncyA8IDAgKQorICAgICAgICB7CisgICAgICAgICAgcHJpbnRmKCAiRVJST1IgOiBUb28gRmV3IEFyZ3VtZW50c1xuIiApOworICAgICAgICAgIENVUi5lcnJvciA9IFRUX0Vycl9Ub29fRmV3X0FyZ3VtZW50czsKKyAgICAgICAgICBnb3RvIExFcnJvckxhYmVsXzsKKyAgICAgICAgfQorCisgICAgICAgIENVUi5uZXdfdG9wID0gQ1VSLmFyZ3MgKyAoUG9wX1B1c2hfQ291bnRbQ1VSLm9wY29kZV0gJiAxNSk7CisKKyAgICAgIC8qIG5ld190b3AgIGlzIHRoZSBuZXcgdG9wIG9mIHRoZSBzdGFjaywgYWZ0ZXIgdGhlIGluc3RydWN0aW9uJ3MgKi8KKyAgICAgIC8qIGV4ZWN1dGlvbi4gdG9wIHdpbGwgYmUgc2V0IHRvIG5ld190b3AgYWZ0ZXIgdGhlICdjYXNlJyAgICAgICAgKi8KKworICAgICAgICBpZiAoIENVUi5uZXdfdG9wID4gQ1VSLnN0YWNrU2l6ZSApCisgICAgICAgIHsKKyAgICAgICAgICBwcmludGYoICJFUlJPUiA6IFN0YWNrIG92ZXJmbG93XG4iICk7CisgICAgICAgICAgQ1VSLmVycm9yID0gVFRfRXJyX1N0YWNrX092ZXJmbG93OworICAgICAgICAgIGdvdG8gTEVycm9yTGFiZWxfOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHByaW50ZiggIkVuZCBvZiBwcm9ncmFtIHJlYWNoZWQuXG4iICk7CisKKyAgICAgIGtleSA9IDA7CisgICAgICBkbworICAgICAgeworICAgICAgIC8qIHJlYWQga2V5Ym9hcmQgKi8KKworICAgICAgICBjaCA9IGdldGNoKCk7CisKKyAgICAgICAgc3dpdGNoICggY2ggKQorICAgICAgICB7CisgICAgICAgIC8qIEhlbHAgLSBzaG93IGtleWJpbmRpbmdzICovCisgICAgICAgIGNhc2UgJz8nOgorICAgICAgICAgIHByaW50ZiggIlRURGVidWcgSGVscFxuXG4iICk7CisgICAgICAgICAgcHJpbnRmKCAiPyAgIFNob3cgdGhpcyBwYWdlXG4iICk7CisgICAgICAgICAgcHJpbnRmKCAicSAgIFF1aXQgZGVidWdnZXJcbiIgKTsKKyAgICAgICAgICBwcmludGYoICJuICAgU2tpcCB0byBuZXh0IGluc3RydWN0aW9uXG4iICk7CisgICAgICAgICAgcHJpbnRmKCAicyAgIFN0ZXAgaW50b1xuIiApOworICAgICAgICAgIHByaW50ZiggInYgICBTaG93IHZlY3RvciBpbmZvXG4iICk7CisgICAgICAgICAgcHJpbnRmKCAiZyAgIFNob3cgZ3JhcGhpY3Mgc3RhdGVcbiIgKTsKKyAgICAgICAgICBwcmludGYoICJwICAgU2hvdyBwb2ludHMgem9uZVxuXG4iICk7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLyogU2hvdyB2ZWN0b3JzICovCisgICAgICAgIGNhc2UgJ3YnOgorICAgICAgICAgIHByaW50ZiggImZyZWVkb20gICAgKCUwNGh4LCUwNGh4KVxuIiwgZXhjLT5HUy5mcmVlVmVjdG9yLngsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGMtPkdTLmZyZWVWZWN0b3IueSApOworICAgICAgICAgIHByaW50ZiggInByb2plY3Rpb24gKCUwNGh4LCUwNGh4KVxuIiwgZXhjLT5HUy5wcm9qVmVjdG9yLngsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGMtPkdTLnByb2pWZWN0b3IueSApOworICAgICAgICAgIHByaW50ZiggImR1YWwgICAgICAgKCUwNGh4LCUwNGh4KVxuXG4iLCBleGMtPkdTLmR1YWxWZWN0b3IueCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjLT5HUy5kdWFsVmVjdG9yLnkgKTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICAvKiBTaG93IGdyYXBoaWNzIHN0YXRlICovCisgICAgICAgIGNhc2UgJ2cnOgorICAgICAgICAgIHByaW50ZiggInJvdW5kaW5nICAgJXNcbiIsIHJvdW5kX3N0cltleGMtPkdTLnJvdW5kX3N0YXRlXSApOworICAgICAgICAgIHByaW50ZiggIm1pbiBkaXN0ICAgJTA0bHhcbiIsIGV4Yy0+R1MubWluaW11bV9kaXN0YW5jZSApOworICAgICAgICAgIHByaW50ZiggImN2dF9jdXRpbiAgJTA0bHhcbiIsIGV4Yy0+R1MuY29udHJvbF92YWx1ZV9jdXRpbiApOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIC8qIFNob3cgcG9pbnRzIHRhYmxlICovCisgICAgICAgIGNhc2UgJ3AnOgorICAgICAgICAgIGZvciAoIEEgPSAwOyBBIDwgZXhjLT5wdHMubl9wb2ludHM7IEErKyApCisgICAgICAgICAgeworICAgICAgICAgICAgcHJpbnRmKCAiJTAyaHggICIsIEEgKTsKKyAgICAgICAgICAgIHByaW50ZiggIiUwOGx4LCUwOGx4IC0gIiwgcHRzLm9yZ1tBXS54LCBwdHMub3JnW0FdLnkgKTsKKyAgICAgICAgICAgIHByaW50ZiggIiUwOGx4LCUwOGx4XG4iLCAgcHRzLmN1cltBXS54LCBwdHMuY3VyW0FdLnkgKTsKKyAgICAgICAgICB9CisgICAgICAgICAgcHJpbnRmKCggIlxuIiApKTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGtleSA9IDE7CisgICAgICAgIH0KKyAgICAgIH0gd2hpbGUgKCAha2V5ICk7CisKKyAgICAgIE1FTV9Db3B5KCBzYXZlLm9yZywgICBwdHMub3JnLCBwdHMubl9wb2ludHMgKiBzaXplb2YgKCBUVF9WZWN0b3IgKSApOworICAgICAgTUVNX0NvcHkoIHNhdmUuY3VyLCAgIHB0cy5jdXIsIHB0cy5uX3BvaW50cyAqIHNpemVvZiAoIFRUX1ZlY3RvciApICk7CisgICAgICBNRU1fQ29weSggc2F2ZS50b3VjaCwgcHRzLnRvdWNoLCBwdHMubl9wb2ludHMgKTsKKworICAgICAgLyogYSByZXR1cm4gaW5kaWNhdGUgdGhlIGxhc3QgY29tbWFuZCAqLworICAgICAgaWYgKGNoID09ICdccicpCisgICAgICAgIGNoID0gb2xkY2g7CisKKyAgICAgIHN3aXRjaCAoIGNoICkKKyAgICAgIHsKKyAgICAgIC8qIFF1aXQgZGVidWdnZXIgKi8KKyAgICAgIGNhc2UgJ3EnOgorICAgICAgICBnb3RvIExFcnJvckxhYmVsXzsKKworICAgICAgLyogU3RlcCBvdmVyICovCisgICAgICBjYXNlICduJzoKKyAgICAgICAgaWYgKCBleGMtPklQIDwgZXhjLT5jb2RlU2l6ZSApCisgICAgICAgIHsKKyAgICAgICAgICAvKiBgc3RlcCBvdmVyJyBpcyBlcXVpdmFsZW50IHRvIGBzdGVwIGludG8nIGV4Y2VwdCBpZiAgKi8KKyAgICAgICAgICAvKiB0aGUgY3VycmVudCBvcGNvZGUgaXMgYSBDQUxMIG9yIExPT1BDQUxMICAgICAgICAgICAgKi8KKyAgICAgICAgICBpZiAoIENVUi5vcGNvZGUgIT0gMHgyYSAmJiBDVVIub3Bjb2RlICE9IDB4MmIgKQorICAgICAgICAgICAgZ290byBTdGVwX2ludG87CisKKyAgICAgICAgICAvKiBvdGhlcndpc2UsIGxvb3AgZXhlY3V0aW9uIHVudGlsIHdlIHJlYWNoIHRoZSBuZXh0IG9wY29kZSAqLworICAgICAgICAgIG5leHRfSVAgPSBDVVIuSVAgKyBDVVIubGVuZ3RoOworICAgICAgICAgIHdoaWxlICggZXhjLT5JUCAhPSBuZXh0X0lQICkKKyAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoICggZXJyb3IgPSBUVF9SdW5JbnMoIGV4YyApICkgKQorICAgICAgICAgICAgICBnb3RvIExFcnJvckxhYmVsXzsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgb2xkY2ggPSBjaDsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIC8qIFN0ZXAgaW50byAqLworICAgICAgY2FzZSAncyc6CisgICAgICAgIGlmICggZXhjLT5JUCA8IGV4Yy0+Y29kZVNpemUgKQorCisgICAgICBTdGVwX2ludG86CisgICAgICAgICAgaWYgKCAoIGVycm9yID0gVFRfUnVuSW5zKCBleGMgKSApICkKKyAgICAgICAgICAgIGdvdG8gTEVycm9yTGFiZWxfOworICAgICAgICBvbGRjaCA9IGNoOworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcHJpbnRmKCAidW5rbm93biBjb21tYW5kLiBQcmVzcyA/IGZvciBoZWxwXG4iICk7CisgICAgICAgIG9sZGNoID0gJ1wwJzsKKyAgICAgIH0KKworICAgICAgZm9yICggQSA9IDA7IEEgPCBwdHMubl9wb2ludHM7IEErKyApCisgICAgICB7CisgICAgICAgIGRpZmYgPSAwOworICAgICAgICBpZiAoIHNhdmUub3JnW0FdLnggIT0gcHRzLm9yZ1tBXS54ICkgZGlmZiB8PSAxOworICAgICAgICBpZiAoIHNhdmUub3JnW0FdLnkgIT0gcHRzLm9yZ1tBXS55ICkgZGlmZiB8PSAyOworICAgICAgICBpZiAoIHNhdmUuY3VyW0FdLnggIT0gcHRzLmN1cltBXS54ICkgZGlmZiB8PSA0OworICAgICAgICBpZiAoIHNhdmUuY3VyW0FdLnkgIT0gcHRzLmN1cltBXS55ICkgZGlmZiB8PSA4OworICAgICAgICBpZiAoIHNhdmUudG91Y2hbQV0gIT0gcHRzLnRvdWNoW0FdICkgZGlmZiB8PSAxNjsKKworICAgICAgICBpZiAoIGRpZmYgKQorICAgICAgICB7CisgICAgICAgICAgcHJpbnRmKCAiJTAyaHggICIsIEEgKTsKKworICAgICAgICAgIGlmICggZGlmZiAmIDE2ICkgdGVtcCA9ICIoJTAxaHgpIjsgZWxzZSB0ZW1wID0gIiAlMDFoeCAiOworICAgICAgICAgIHByaW50ZiggdGVtcCwgc2F2ZS50b3VjaFtBXSAmIDcgKTsKKworICAgICAgICAgIGlmICggZGlmZiAmIDEgKSB0ZW1wID0gIiglMDhseCkiOyBlbHNlIHRlbXAgPSAiICUwOGx4ICI7CisgICAgICAgICAgcHJpbnRmKCB0ZW1wLCBzYXZlLm9yZ1tBXS54ICk7CisKKyAgICAgICAgICBpZiAoIGRpZmYgJiAyICkgdGVtcCA9ICIoJTA4bHgpIjsgZWxzZSB0ZW1wID0gIiAlMDhseCAiOworICAgICAgICAgIHByaW50ZiggdGVtcCwgc2F2ZS5vcmdbQV0ueSApOworCisgICAgICAgICAgaWYgKCBkaWZmICYgNCApIHRlbXAgPSAiKCUwOGx4KSI7IGVsc2UgdGVtcCA9ICIgJTA4bHggIjsKKyAgICAgICAgICBwcmludGYoIHRlbXAsIHNhdmUuY3VyW0FdLnggKTsKKworICAgICAgICAgIGlmICggZGlmZiAmIDggKSB0ZW1wID0gIiglMDhseCkiOyBlbHNlIHRlbXAgPSAiICUwOGx4ICI7CisgICAgICAgICAgcHJpbnRmKCB0ZW1wLCBzYXZlLmN1cltBXS55ICk7CisKKyAgICAgICAgICBwcmludGYoICJcbiIgKTsKKworICAgICAgICAgIHByaW50ZiggIiUwMmh4ICAiLCBBICk7CisKKyAgICAgICAgICBpZiAoIGRpZmYgJiAxNiApIHRlbXAgPSAiWyUwMWh4XSI7IGVsc2UgdGVtcCA9ICIgJTAxaHggIjsKKyAgICAgICAgICBwcmludGYoIHRlbXAsIHB0cy50b3VjaFtBXSAmIDcgKTsKKworICAgICAgICAgIGlmICggZGlmZiAmIDEgKSB0ZW1wID0gIlslMDhseF0iOyBlbHNlIHRlbXAgPSAiICUwOGx4ICI7CisgICAgICAgICAgcHJpbnRmKCB0ZW1wLCBwdHMub3JnW0FdLnggKTsKKworICAgICAgICAgIGlmICggZGlmZiAmIDIgKSB0ZW1wID0gIlslMDhseF0iOyBlbHNlIHRlbXAgPSAiICUwOGx4ICI7CisgICAgICAgICAgcHJpbnRmKCB0ZW1wLCBwdHMub3JnW0FdLnkgKTsKKworICAgICAgICAgIGlmICggZGlmZiAmIDQgKSB0ZW1wID0gIlslMDhseF0iOyBlbHNlIHRlbXAgPSAiICUwOGx4ICI7CisgICAgICAgICAgcHJpbnRmKCB0ZW1wLCBwdHMuY3VyW0FdLnggKTsKKworICAgICAgICAgIGlmICggZGlmZiAmIDggKSB0ZW1wID0gIlslMDhseF0iOyBlbHNlIHRlbXAgPSAiICUwOGx4ICI7CisgICAgICAgICAgcHJpbnRmKCB0ZW1wLCBwdHMuY3VyW0FdLnkgKTsKKworICAgICAgICAgIHByaW50ZiggIlxuXG4iICk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IHdoaWxlICggVFJVRSApOworCisgIExFcnJvckxhYmVsXzoKKworICAgIGlmIChlcnJvcikKKyAgICAgIFBhbmljKCAiZXJyb3IgZHVyaW5nIGV4ZWN1dGlvbiIgKTsKKyAgICByZXR1cm4gZXJyb3I7CisgIH0KKworCisKKworCisgIHN0YXRpYworICB2b2lkIFVzYWdlKCkKKyAgeworICAgIGZwcmludGYoIHN0ZGVyciwgInR0ZGVidWcgIC0gIGEgc2ltcGx5IFRydWVUeXBlIGZvbnQgZGVidWdnZXJcbiIgKTsKKyAgICBmcHJpbnRmKCBzdGRlcnIsICIoYykgVGhlIEZyZWVUeXBlIHByb2plY3QgLSB3d3cuZnJlZXR5cGUub3JnXG4iICk7CisgICAgZnByaW50Ziggc3RkZXJyLCAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4iICk7CisKKyAgICBmcHJpbnRmKCBzdGRlcnIsICJ1c2FnZSA6ICAgdHRkZWJ1ZyAgW29wdGlvbnNdICBnbHlwaCAgc2l6ZSAgZm9udGZpbGVbLnR0Zl1cblxuIiApOworCisgICAgZnByaW50Ziggc3RkZXJyLCAiICAgIGdseXBoIC0gZ2x5cGggaW5kZXggd2l0aGluIHRoZSBmb250IGZpbGUuIENhbiBiZSBuZWdhdGl2ZSB0byBxdWVyeSBcbiIgKTsKKyAgICBmcHJpbnRmKCBzdGRlcnIsICIgICAgICAgICAgICB0aGUgZGVidWdnaW5nIG9mIHRoZSBmb250ICdjdnQnIHByb2dyYW1cblxuIiApOworCisgICAgZnByaW50Ziggc3RkZXJyLCAiICAgIHNpemUgLSBzaXplIG9mIGdseXBoIGluIHBpeGVsc1xuXG4iICk7CisKKyAgICBmcHJpbnRmKCBzdGRlcnIsICIgICAgZm9udGZpbGUgLSBhIHZhbGlkIFRydWVUeXBlIGZpbGUuXG5cbiIgKTsKKworICAgIGZwcmludGYoIHN0ZGVyciwgIiAgdmFsaWQgb3B0aW9ucyBhcmU6XG5cbiIgKTsKKyAgICBmcHJpbnRmKCBzdGRlcnIsICIgICAgLWQgICAgOiBEdW1wIG1vZGUuIFNob3dzIHRoZSBnbHlwaCBwcm9ncmFtIGFuZCBleGl0IGltbWVkaWF0ZWx5XG4iICk7CisgICAgZnByaW50Ziggc3RkZXJyLCAiICAgIC1uICAgIDogTm9uLWludGVyYWN0aXZlIG1vZGUuIER1bXBzIHRoZSBleGVjdXRpb24gdHJhY2UgYW5kIGV4aXRcbiIgKTsKKworICAgIGV4aXQoMSk7CisgIH0KKworCitpbnQgICAgZHVtcF9tb2RlOworaW50ICAgIG5vbl9pbnRlcmFjdGl2ZV9tb2RlOworY2hhciogIGZpbGVfbmFtZTsKK2ludCAgICBnbHlwaF9pbmRleDsKK2ludCAgICBnbHlwaF9zaXplOworCisgIGludCAgbWFpbiggaW50IGFyZ2MsIGNoYXIqKiAgYXJndiApCisgIHsKKyAgICBjaGFyICB2YWxpZDsKKworICAgIC8qIENoZWNrIG51bWJlciBvZiBhcmd1bWVudHMgKi8KKyAgICBpZiAoIGFyZ2MgPCA0ICkgVXNhZ2UoKTsKKworICAgIC8qIENoZWNrIG9wdGlvbnMgKi8KKyAgICBkdW1wX21vZGUgICAgICAgICAgICA9IDA7CisgICAgbm9uX2ludGVyYWN0aXZlX21vZGUgPSAwOworCisgICAgYXJndisrOworICAgIHdoaWxlIChhcmd2WzBdWzBdID09ICctJykKKyAgICB7CisgICAgICB2YWxpZCA9IDA7CisgICAgICBzd2l0Y2ggKGFyZ3ZbMF1bMV0pCisgICAgICB7CisgICAgICAgIGNhc2UgJ2QnOgorICAgICAgICAgIGR1bXBfbW9kZSA9IDE7CisgICAgICAgICAgdmFsaWQgICAgID0gMTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICduJzoKKyAgICAgICAgICBub25faW50ZXJhY3RpdmVfbW9kZSA9IDE7CisgICAgICAgICAgdmFsaWQgICAgICAgICAgICAgICAgPSAxOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgOworICAgICAgfQorCisgICAgICBpZiAodmFsaWQpCisgICAgICB7CisgICAgICAgIGFyZ3YrKzsKKyAgICAgICAgYXJnYy0tOworICAgICAgICBpZiAoYXJnYyA8IDQpIFVzYWdlKCk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8qIEdldCBHbHlwaCBpbmRleCAqLworICAgIGlmICggc3NjYW5mKCBhcmd2WzBdLCAiJWQiLCAmZ2x5cGhfaW5kZXggKSAhPSAxICkKKyAgICB7CisgICAgICBwcmludGYoICJpbnZhbGlkIGdseXBoIGluZGV4ID0gJXNcbiIsIGFyZ3ZbMV0gKTsKKyAgICAgIFVzYWdlKCk7CisgICAgfQorCisgICAgLyogR2V0IEdseXBoIHNpemUgKi8KKyAgICBpZiAoIHNzY2FuZiggYXJndlsxXSwgIiVkIiwgJmdseXBoX3NpemUgKSAhPSAxICkKKyAgICB7CisgICAgICBwcmludGYoICJpbnZhbGlkIGdseXBoIHNpemUgPSAlc1xuIiwgYXJndlsxXSApOworICAgICAgVXNhZ2UoKTsKKyAgICB9CisKKyAgICAvKiBHZXQgZmlsZSBuYW1lICovCisgICAgZmlsZV9uYW1lID0gYXJndlsyXTsKKworICAgIEluaXRfS2V5Ym9hcmQoKTsKKworICAgIC8qIEluaXQgbGlicmFyeSwgcmVhZCBmYWNlIG9iamVjdCwgZ2V0IGRyaXZlciwgY3JlYXRlIHNpemUgKi8KKyAgICBlcnJvciA9IEZUX0luaXRfRnJlZVR5cGUoICZsaWJyYXJ5ICk7CisgICAgaWYgKGVycm9yKSBQYW5pYyggImNvdWxkIG5vdCBpbml0aWFsaXNlIEZyZWVUeXBlIGxpYnJhcnkiICk7CisKKyAgICBtZW1vcnkgPSBsaWJyYXJ5LT5tZW1vcnk7CisgICAgCisgICAgRlRfU2V0X0RlYnVnX0hvb2soIGxpYnJhcnksCisgICAgICAgICAgICAgICAgICAgICAgIEZUX0RFQlVHX0hPT0tfVFJVRVRZUEUsCisgICAgICAgICAgICAgICAgICAgICAgIChGVF9EZWJ1Z0hvb2tfRnVuYylSdW5JbnMgKTsKKworICAgIGVycm9yID0gRlRfTmV3X0ZhY2UoIGxpYnJhcnksIGZpbGVfbmFtZSwgMCwgKEZUX0ZhY2UqKSZmYWNlICk7CisgICAgaWYgKGVycm9yKSBQYW5pYyggImNvdWxkIG5vdCBvcGVuIGZvbnQgcmVzb3VyY2UiICk7CisKKyAgICAvKiBmaW5kIGRyaXZlciBhbmQgY2hlY2sgZm9ybWF0ICovCisgICAgZHJpdmVyID0gKFRUX0RyaXZlcilmYWNlLT5yb290LmRyaXZlcjsKKyAgICBpZiAoZHJpdmVyLT5yb290LmludGVyZmFjZS5pbml0X2ZhY2UgIT0gdHRfZHJpdmVyX2ludGVyZmFjZS5pbml0X2ZhY2UpCisgICAgeworICAgICAgZXJyb3IgPSBGVF9FcnJfSW52YWxpZF9GaWxlX0Zvcm1hdDsKKyAgICAgIFBhbmljKCAiVGhpcyBpcyBub3QgYSBUcnVlVHlwZSBmb250IiApOworICAgIH0KKyAgCisgICAgc2l6ZSA9IChUVF9TaXplKWZhY2UtPnJvb3Quc2l6ZTsKKworICAgIGlmIChnbHlwaF9pbmRleCA8IDApCisgICAgeworICAgICAgZXhlYyA9IFRUX05ld19Db250ZXh0KCBmYWNlICk7CisgICAgICBzaXplLT5kZWJ1ZyAgID0gMTsKKyAgICAgIHNpemUtPmNvbnRleHQgPSBleGVjOworCisgICAgICBlcnJvciA9IEZUX1NldF9DaGFyX1NpemUoIChGVF9GYWNlKWZhY2UsIGdseXBoX3NpemUgPDwgNiwgZ2x5cGhfc2l6ZSA8PCA2LCA3MiwgNzIgKTsKKyAgICAgIGlmIChlcnJvcikgUGFuaWMoICJjb3VsZCBub3Qgc2V0IGNoYXJhY3RlciBzaXplcyIgKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGVycm9yID0gRlRfU2V0X0NoYXJfU2l6ZSggKEZUX0ZhY2UpZmFjZSwgZ2x5cGhfc2l6ZSA8PCA2LCBnbHlwaF9zaXplIDw8IDYsIDcyLCA3MiApOworICAgICAgaWYgKGVycm9yKSBQYW5pYyggImNvdWxkIG5vdCBzZXQgY2hhcmFjdGVyIHNpemVzIiApOworCisgICAgICBnbHlwaCA9IChUVF9HbHlwaFNsb3QpZmFjZS0+cm9vdC5nbHlwaDsKKworICAgICAgLyogTm93IGxvYWQgZ2x5cGggKi8KKyAgICAgIGVycm9yID0gRlRfTG9hZF9HbHlwaCggKEZUX0ZhY2UpZmFjZSwgZ2x5cGhfaW5kZXgsIEZUX0xPQURfREVGQVVMVCApOworICAgICAgaWYgKGVycm9yKSBQYW5pYyggImNvdWxkIG5vdCBsb2FkIGdseXBoIiApOworICAgIH0KKworICAgIFJlc2V0X0tleWJvYXJkKCk7CisgICAgcmV0dXJuIDA7CisgIH0KZGlmZiAtLWdpdCBhL2RvY3MvQlVJTEQgYi9kb2NzL0JVSUxECm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0YmEzZTUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL0JVSUxECkBAIC0wLDAgKzEsMzc1IEBACisgICAgICAgICAgICAgICAgICAgICAgIFRoZSBGcmVlVHlwZSBCdWlsZCBTeXN0ZW0gSW50ZXJuYWxzCisgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0ludHJvZHVjdGlvbjoKKworICBUaGlzIGRvY3VtZW50IGRlc2NyaWJlcyB0aGUgZGV0YWlscyBvZiB0aGUgRnJlZVR5cGUgYnVpbGQgc3lzdGVtLiBUaGUKKyAgYnVpbGQgc3lzdGVtIGlzIGEgc2V0IG9mIE1ha2VmaWxlcyBhbmQgb3RoZXIgY29uZmlndXJhdGlvbiBmaWxlcyB1c2VkCisgIHRvIHNlbGVjdCwgY29tcGlsZSBhbmQgbGluayB0b2dldGhlciB0aGUgdmFyaW91cyBGcmVlVHlwZSBjb21wb25lbnRzCisgIGFjY29yZGluZyB0byB0aGUgY3VycmVudCBwbGF0Zm9ybSwgY29tcGlsZXIgYW5kIHJlcXVlc3RlZCBmZWF0dXJlIHNldC4KKworICBUaGlzIGRvY3VtZW50IGFsc28gZXhwbGFpbnMgaG93IHRvIHVzZSB0aGUgYnVpbGQgc3lzdGVtIHRvIGRldmVsb3AKKyAgdGhpcmQtcGFydHkgZm9udCBkcml2ZXJzIG9yIGV4dGVuc2lvbnMgdG8gdGhlIGVuZ2luZSwgd2l0aG91dCBhbHRlcmluZworICB0aGUgZ2VuZXJhbCBGcmVlVHlwZSBoaWVyYXJjaHk7CisKKworSS4gUG9ydGFiaWxpdHkgaXNzdWVzIDoKKworICBHaXZlbiB0aGF0IHRoZSBkZXNpZ24gb2YgRnJlZVR5cGUgMiBpcyBtdWNoIG1vcmUgbW9kdWxhciBhbmQgZmxleGlibGUgdGhhbgorICBpbiBwcmV2aW91cyB2ZXJzaW9ucywgaXRzIGJ1aWxkIHN5c3RlbSBpcyBlbnRpcmVseSBiYXNlZCBvbiBHTlUgTWFrZS4gVGhlcmUKKyAgYXJlIHNldmVyYWwgcmVhc29ucyBmb3IgdGhpcyA6CisKKyAgICAtIEl0IGlzIGJ5IGZhciB0aGUgbW9zdCBhdmFpbGFibGUgbWFrZSB0b29sIG9uIHRoZSBwbGFuZXQsIGFuZAorICAgICAgaGFzIHByb2JhYmx5IGJlZW4gcG9ydGVkIHRvIGV2ZXJ5IGRldmVsb3BtZW50IGVudmlyb25tZW50IGtub3duCisgICAgICB0byBob21vIHByb2dyYW1tYXRpY3VzLgorCisgICAgLSBJdCBwcm92aWRlcyB1c2VmdWwgZmVhdHVyZXMgKGxpa2UgY29uZGl0aW9uYWwgZGVmaW5lcywgcGF0dGVybgorICAgICAgYW5kIHdpbGRjYXJkIG1hdGNoaW5nKSB3aGljaCBhcmUgZXNzZW50aWFsIHdoZW4gaW1wbGVtZW50aW5nIGEKKyAgICAgIGZsZXhpYmxlIGNvbmZpZ3VyYXRpb24gc3lzdGVtLCBhcyBkZXNjcmliZWQgYmVsb3cKKworICBOb3RlIHRoYXQgeW91IGRvIG5vdCBuZWVkIHRvIGhhdmUgYSB1bml4LWxpa2Ugc2hlbGwgKGxpa2UgInNoIiBvciAiY3NoIikKKyAgb24geW91ciBzeXN0ZW0gaW4gb3JkZXIgdG8gYnVpbGQgRnJlZVR5cGUuCisgIAorCisKKworSUkuIFRoZSBsaWJyYXJ5IGRlc2lnbiA6CisKKyAgRnJlZVR5cGUgaXMgbWFkZSBvZiBzZXZlcmFsIGNvbXBvbmVudHMsIGVhY2ggd2l0aCBhIHNwZWNpZmljIHJvbGUgOgorCisgICAgLSBUSEUgQkFTRSBMQVlFUjoKKyAgICAgIEl0IGlzIHVzZWQgdG8gaW1wbGVtZW50IGdlbmVyaWMgZm9udCBzZXJ2aWNlcyBhcyB3ZWxsIGFzIHByb3ZpZGUKKyAgICAgIHRoZSBoaWdoLWxldmVsIEFQSSB1c2VkIGJ5IGNsaWVudCBhcHBsaWNhdGlvbnMuCisKKyAgICAtIE9ORSBPUiBNT1JFIEZPTlQgRFJJVkVSUzoKKyAgICAgIEVhY2ggZHJpdmVyIGlzIGEgc21hbGwgY29tcG9uZW50IHVzZWQgdG8gcmVhZCBhbmQgcHJvY2VzcyBhIGdpdmVuCisgICAgICBmb250IGZvcm1hdC4gTm90ZSB0aGF0IHdpdGggRnJlZVR5cGUgMiwgaXQgaXMgcG9zc2libGUgdG8gYWRkLAorICAgICAgcmVtb3ZlIG9yIHVwZ3JhZGUgYSBmb250IGRyaXZlciBhdCAqcnVudGltZSouCisKKyAgICAtIE9ORSBPUiBNT1JFIFJBU1RFUlM6CisgICAgICBBIHJhc3RlciBpcyBhIG1vZHVsZSB1c2VkIHRvIHJlbmRlciBhIHZlY3RvcmlhbCBnbHlwaCBvdXRsaW5lIGludG8KKyAgICAgIGEgYml0bWFwIG9yIGFuIGFudGktYWxpYXNlZCBwaXhtYXAuIFRoZXkgZGlmZmVyIGluIHRoZWlyIG91dHB1dAorICAgICAgcXVhbGl0eSwgc3BlZWQgYW5kIG1lbW9yeSB1c2FnZS4KKworICAgIC0gQSBMT1ctTEVWRUwgTU9EVUxFLCBDQUxMRUQgIkZUU1lTVEVNIjoKKyAgICAgIEl0IGlzIHVzZWQgdG8gaW1wbGVtZW50IG1lbW9yeSBtYW5hZ2VtZW50IGFuZCBmaWxlIGkvby4gVXNlcyB0aGUKKyAgICAgIEFuc2kgQyBMaWJyYXJ5IGJ5IGRlZmF1bHQsIHRob3VnaCBzb21lIHN5c3RlbS1zcGVjaWZpYyByZXBsYWNlbWVudHMKKyAgICAgIGFyZSBwcm92aWRlZCBpbiBvcmRlciB0byBpbXByb3ZlIHBlcmZvcm1hbmNlLgorCisgICAgLSBBTiAiSU5JVCIgTEFZRVI6CisgICAgICBBIHRpbnkgbW9kdWxlIHVzZWQgdG8gaW1wbGVtZW50IHRoZSBsaWJyYXJ5IGluaXRpYWxpc2F0aW9uIHJvdXRpbmUsCisgICAgICBpLmUuIEZUX0luaXRfRnJlZVR5cGUuIEl0IGlzIGluIGNoYXJnZSBvZiByZWdpc3RlcmluZyB0aGUgZm9udCBkcml2ZXJzCisgICAgICBhbmQgcmFzdGVycyBzZWxlY3RlZCBhdCBidWlsZCB0aW1lLgorCisgICAgLSBBTiAiT0xEIEFQSSIgTEFZRVI6CisgICAgICBBIHNpbXBsZSBsYXllciB1c2VkIHRvIGxpbmsgbGVnYWN5IGFwcGxpY2F0aW9ucyB1c2luZyB0aGUgRnJlZVR5cGUKKyAgICAgIDEueCBBUEkuIE5vdGUgdGhhdCBpdCBpcyBiaW5hcnkgYmFja3dhcmRzIGNvbXBhdGlibGUsIHdoaWNoIG1lYW5zIHRoYXQKKyAgICAgIGFwcGxpY2F0aW9ucyBkbyBub3QgbmVlZCB0byBiZSByZWNvbXBpbGVkLCBvbmx5IHJlLWxpbmtlZCB0byB0aGlzCisgICAgICBsYXllci4KKworICBGb3IgbW9yZSBkZXRhaWxzLCBwbGVhc2UgcmVhZCB0aGUgIkZyZWVUeXBlIEludGVybmFscyIgRG9jdW1lbnQuICAgICAgCisKKworICBUaGUgRnJlZVR5cGUgYnVpbGQgc3lzdGVtIGlzIGluIGNoYXJnZSBvZiB0aGUgZm9sbG93aW5nIHRhc2tzIDoKKworICAgIC0gZGV0ZWN0IChvciBzZWxlY3QpIHRoZSBjdXJyZW50IHBsYXRmb3JtIGluIG9yZGVyIHRvIHNlbGVjdCB0aGUKKyAgICAgIGJlc3QgdmVyc2lvbiBvZiB0aGUgImZ0c3lzdGVtIiBtb2R1bGUuIEJ5IGRlZmF1bHQsIGl0IHdpbGwgdXNlCisgICAgICB0aGUgcHVyZS1BTlNJIHZlcnNpb24uCisKKyAgICAtIGRldGVybWluZSB3aGljaCBmb250IGRyaXZlcnMsIGFuZCB3aGljaCByYXN0ZXJzLCBzaG91bGQgYmUKKyAgICAgIHN0YXRpY2FsbHkgbGlua2VkIHRvIHRoZSBsaWJyYXJ5IGF0IGJ1aWxkIHRpbWUuIFRoZXNlIHdpbGwgYWx3YXlzCisgICAgICBiZSBhdmFpbGFibGUgYWZ0ZXIgdGhlIGxpYnJhcnkgaGFzIGJlZW4gaW5pdGlhbGlzZWQgdGhyb3VnaCBhIGNhbGwKKyAgICAgIHRvIEZUX0luaXRfRnJlZVR5cGUuCisKKyAgICAtIGV2ZW50dWFsbHkgY29tcGlsZSBvdGhlciBmb250IGRyaXZlcnMgb3IgcmFzdGVycyBpbiBvcmRlciB0byBsYXRlcgorICAgICAgbGluayB0aGVtIGR5bmFtaWNhbGx5IHRvIHRoZSBsaWJyYXJ5IGF0IHJ1bnRpbWUsIHRocm91Z2gKKyAgICAgIEZUX0FkZF9Ecml2ZXIgLyBGVF9VcGdyYWRlX0RyaXZlci4uCisKKyAgICAtIGNvbXBpbGUgdGhlICJpbml0IiBsYXllciwgcHV0dGluZyBjb2RlIGluIHRoZSBpbXBsZW1lbnRhdGlvbiBvZgorICAgICAgdGhlIEZUX0luaXRfRnJlZVR5cGUgZnVuY3Rpb24gdG8gcmVnaXN0ZXIgZWFjaCBzZWxlY3RlZCBmb250IGRyaXZlcgorICAgICAgb3IgcmFzdGVyIHRvIHRoZSBsaWJyYXJ5LgorCisKKworSUlJLiBHZW5lcmFsIG92ZXJ2aWV3IDoKKworICBUaGUgRnJlZVR5cGUgYnVpbGQgc3lzdGVtIHVzZXMgYSBoaWVyYXJjaHkgb2YgaW5jbHVkZWQgc3ViLU1ha2VmaWxlcworICB0byBjb21waWxlIGFuZCBsaW5rIHRoZSBsaWJyYXJ5LgorCisgIEVhY2ggaW5jbHVkZWQgc3ViLU1ha2VmaWxlIGlzIGNhbGxlZCBhICJydWxlcyIgZmlsZSwgYW5kIGhhcyBhIHZlcnkKKyAgc3BlY2lmaWMgcHVycG9zZS4gVGhlIHN1ZmZpeCBmb3IgcnVsZXMgZmlsZXMgaXMgIi5tayIgYXMgaW4gOgorCisgICAgICAgZGV0ZWN0Lm1rCisgICAgICAgY29uZmlnLm1rCisgICAgICAgcnVsZXMubWsKKyAgICAgICBldGMuLi4KKworCisgIEhlcmUncyBhIHNpbXBsZSBkaWFncmFtIG9mIHRoZSBidWlsZCBoaWVyYXJjaHksIHdoaWNoIGlzIHRoZW4gZXhwbGFpbmVkCisgIHdpdGggZGV0YWlscyA6CisKKworCisgICAgICAgICAgICAgICAgICAgICAgIE1ha2VmaWxlICAgICAgICAgICAgKCAuL01ha2VmaWxlICkKKworICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdgorCisgICAgICAgICAgICAgICAgICAgICBDb25maWcgUnVsZXMgICAgICAgICAgKCAuL2NvbmZpZy88c3lzdGVtPi9jb25maWcubWsgKQorCisgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICB2CisKKyAgICAgICAgICAgICAgICAgICAgTGlicmFyeSAgUnVsZXMgICAgICAgICAoIC4vY29uZmlnL2ZyZWV0eXBlLm1rICkKKworICAgICAgICAgICAgICAgICAgICAgIHwgICB8ICAgfAorICAgICAgICAgICAgICAgICAgICAgIHwgICB8ICAgfAorICAgICAgICAgICAgICAgICAgICAgIHYgICB2ICAgdgorCisgICAgICAgICAgICAgICAgICBDb21wb25lbnQocykgUnVsZXMgICAgICAgKCAuL3NyYy88Y29tcG9uZW50Pi9ydWxlcy5tayApCisKKworCisgIDEuIFRoZSAicm9vdCIgTWFrZWZpbGUgOgorCisgICAgIFRoaXMgZmlsZSBtdXN0IGJlIGludm9rZWQgZnJvbSB0aGUgImZyZWV0eXBlIiBkaXJlY3Rvcnkgd2l0aCBHTlUgTWFrZS4KKworICAgICBhLiBIb3N0IHBsYXRmb3JtIGF1dG8tZGV0ZWN0aW9uOgorCisgICAgICAgV2hlbiBydW4gZm9yIHRoZSBmaXJzdCB0aW1lLCB0aGlzIE1ha2VmaWxlIHdpbGwgdHJ5IHRvIGF1dG8tZGV0ZWN0CisgICAgICAgdGhlIGN1cnJlbnQgaG9zdCBwbGF0Zm9ybSwgYnkgcnVubmluZyB0aGUgcnVsZXMgZmlsZSBuYW1lZAorICAgICAgIGAuL2NvbmZpZy9kZXRlY3QubWsnLiBJZiB0aGUgaG9zdCBzeXN0ZW0gY2Fubm90IGJlIGRldGVjdGVkLAorICAgICAgIGl0IHdpbGwgZGVmYXVsdCB0byB0aGUgYGFuc2knIHN5c3RlbS4KKworICAgICAgIEl0IHdpbGwgdGhlbiBjb3B5IHRoZSBydWxlcyBmaWxlIGAuL2NvbmZpZy88c3lzdGVtPi9jb25maWcubWsnIHRvCisgICAgICAgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGFuZCBkaXNwbGF5IHRoZSByZXN1bHRzIG9mIHRoZSBhdXRvLWRldGVjdGlvbi4KKworICAgICAgIFlvdSBjYW4sIGF0IGFueSB0aW1lLCByZS1ydW4gdGhlIGF1dG8tZGV0ZWN0aW9uIHJvdXRpbmUgYnkgaW52b2tpbmcKKyAgICAgICB0aGUgcm9vdCBNYWtlZmlsZSB3aXRoIHRoZSAic2V0dXAiIHRhcmdldCwgYXMgaW4gOgorCisgICAgICAgICAgICAgICUgbWFrZSBzZXR1cAorCisgICAgICAgTm90ZSBhbHNvIHRoYXQgaXQgaXMgcG9zc2libGUgdG8gdXNlIGEgc2Vjb25kIGFyZ3VtZW50IHRvIGluZGljYXRlCisJICAgYSBzcGVjaWZpYyBjb21waWxlci4gRm9yIGV4YW1wbGUsIGhlcmUgYXJlIHRoZSBsaWduZXMgdG8gYmUgdXNlZAorCSAgIGluIG9yZGVyIHRvIGNvbmZpZ3VyZSBhIGJ1aWxkIHdpdGggTENDLCBWaXN1YWwgQysrIGFuZCBWaXN1YWwgQWdlCisJICAgb24gYSBXaW4zMiBtYWNoaW5lCisJICAgCisJICAgICAgICAgID4gZ21ha2Ugc2V0dXAgbGNjCisJCQkgID4gZ21ha2Ugc2V0dXAgdmlzdWFsYworCQkJICA+IGdtYWtlIHNldHVwIHZpc3VhbGFnZQorCisgICAgICAgVGhlIGxpc3Qgb2YgY29tcGlsZXJzIGlzIHBsYXRmb3JtLXNwZWNpZmljIGFuZCBzaG91bGQgYmUgY29udGFpbmVkCisJICAgaW4gYGNvbmZpZy88c3lzdGVtPi9kZXRlY3QubWsnLgorCisgICAgICAgSWYgdGhlIGRldGVjdGlvbiByZXN1bHRzIGRvIG5vdCBjb3JyZXNwb25kIHRvIHlvdXIgcGxhdGZvcm0gb3IKKyAgICAgICBzZXR0aW5ncywgcmVmZXIgdG8gY2hhcHRlciBWSSB3aGljaCBkZXNjcmliZXMgdGhlIGF1dG8tZGV0ZWN0aW9uCisgICAgICAgc3lzdGVtIGluIGdyZWF0IGRldGFpbHMuLgorCisKKyAgICAgYi4gQnVpbGRpbmcgdGhlIGxpYnJhcnk6CisKKyAgICAgICBPbmNlIHRoZSBob3N0IHBsYXRmb3JtIGhhcyBiZWVuIGRldGVjdGVkLCB5b3UgY2FuIHJ1biBgbWFrZScgb25jZQorICAgICAgIGFnYWluLiBUaGUgcm9vdCBNYWtlZmlsZSB3aWxsIHRoZW4gZGV0ZWN0IHRoZSBjb25maWd1cmF0aW9uIHJ1bGVzCisgICAgICAgZmlsZSBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkgdGhlbiBpbmNsdWRlIGl0LgorCisgICAgIE5vdGUgYWxzbyB0aGF0IHRoZSByb290IE1ha2VmaWxlIGlzIHJlc3BvbnNpYmxlIGZvciBkZWZpbmluZywgaWYgaXQKKyAgICAgaXMgbm90IGFscmVhZHkgcGFydCBvZiB0aGUgY3VycmVudCBlbnZpcm9ubWVudCwgdGhlIHZhcmlhYmxlIFRPUCwgd2hpY2gKKyAgICAgZGVzaWduYXRlcyB0aGUgdG9wIG9mIHRoZSBGcmVlVHlwZSBzb3VyY2UgaGllcmFyY2h5LgorCisgICAgIFdoZW4gdW5kZWZpbmVkLCBpdCBkZWZhdWx0cyB0byBgLicKKworCisgIDIuIFRoZSBDb25maWd1cmF0aW9uIGZpbGUgOgorCisgICAgIFRoZSBjb25maWd1cmF0aW9uIHJ1bGVzIGZpbGUgaXMgdXNlZCB0byBzZXQgbWFueSBpbXBvcnRhbnQgdmFyaWFibGVzCisgICAgIGJlZm9yZSBpbmNsdWRpbmcvY2FsbGluZyB0aGUgbGlicmFyeSBydWxlcyBmaWxlIChzZWUgYmVsb3cpLgorCisgICAgIFRoZXNlIHZhcmlhYmxlcyBhcmUgbWFpbmx5IHVzZWQgdG8gZGVzY3JpYmUgdGhlIGhvc3QgZW52aXJvbm1lbnQKKyAgICAgYW5kIGNvbXBpbGVycy4gSW5kZWVkLCB0aGlzIGZpbGUgZGVmaW5lcywgYW1vbmcgb3RoZXJzLCB0aGUgZm9sbG93aW5nOgorCisgICAgICAgU0VQICAgICBUaGUgZGlyZWN0b3J5IHBhdGggc2VwYXJhdG9yLiBUaGlzIGNhbiBiZSBgLycsYFwnIG9yICc6JworICAgICAgICAgICAgICAgZGVwZW5kaW5nIG9uIHRoZSBjdXJyZW50IHBsYXRmb3JtLiBOb3RlIHRoYXQgYWxsIHBhdGhuYW1lcworICAgICAgICAgICAgICAgYXJlIGNvbXBvc2VkIHdpdGggJChTRVApIGluIGFsbCBydWxlcyBmaWxlIChleGNlcHQgaW4KKyAgICAgICAgICAgICAgIGBpbmNsdWRlJyBzdGF0ZW1lbnRzIHdoaWNoIHdvcmsgd2VsbCB3aXRoICcvJyBvbiBhbGwKKyAgICAgICAgICAgICAgIHBsYXRmb3JtcykKKworICAgICAgIENDICAgICAgVGhlIGNvbXBpbGVyIHRvIHVzZQorCisgICAgICAgQ0ZMQUdTICBUaGUgY29tcGlsZXIgZmxhZ3MgdXNlZCB0byBjb21waWxlIGEgZ2l2ZW4gc291cmNlIHRvIGFuCisgICAgICAgICAgICAgICBvYmplY3QgZmlsZS4gVXN1YWxseSBjb250YWlucyBmbGFncyBmb3Igb3B0aW1pc2F0aW9uLAorICAgICAgICAgICAgICAgZGVidWdnaW5nIGFuZC9vciBhbnNpLWNvbXBsaWFuY2UKKworICAgICAgIEkgICAgICAgVGhlIGZsYWcgdG8gYmUgdXNlZCB0byBpbmRpY2F0ZSBhbiBhZGRpdGlvbm5hbCBpbmNsdWRlIHBhdGgKKyAgICAgICAgICAgICAgIHRvIHRoZSBjb21waWxlci4gVGhpcyBkZWZhdWx0cyB0byBgLUknIGZvciBhbiAiYW5zaSIgc3lzdGVtLAorICAgICAgICAgICAgICAgYnV0IGNhbiBiZSBkaWZmZXJlbnQgZm9yIG90aGVycyAoZS5nLiBgL2k9JyxgLUogJywgZXRjLi4pCisKKyAgICAgICBEICAgICAgIFRoZSBmbGFnIHRvIGJlIHVzZWQgdG8gaW5kaWNhdGUgYSBtYWNybyBkZWZpbml0aW9uIHRvIHRoZQorICAgICAgICAgICAgICAgY29tcGlsZXIuIFRoaXMgZGVmYXVsdHMgdG8gYC1EJyBmb3IgYW4gQU5TSSBzeXN0ZW0uCisKKyAgICAgICBUICAgICAgIFRoZSBmbGFnIHRvIGJlIHVzZWQgdG8gaW5kaWNhdGUgYSB0YXJnZXQgb2JqZWN0IGZpbGUgdG8gdGhlCisgICAgICAgICAgICAgICBjb21waWxlci4gVGhpcyBkZWZhdWx0cyB0byBgLW8gJyBmb3IgYW4gQU5TSSBzeXN0ZW0uIE5vdGUgdGhlCisgICAgICAgICAgICAgICBzcGFjZSBhZnRlciB0aGUgYG8nLiAgICAgICAgCisKKyAgICAgICBPICAgICAgIFRoZSBvYmplY3QgZmlsZSBleHRlbnNpb24gdG8gYmUgdXNlZCBvbiB0aGUgY3VycmVudCBwbGF0Zm9ybS4KKyAgICAgICAgICAgICAgIERlZmF1bHRzIHRvIGBvJyBmb3IgYW4gQU5TSSBzeXN0ZW0sIGJ1dCBjYW4gYmUgYG9iaicsIGBjb2ZmJworICAgICAgICAgICAgICAgb3Igb3RoZXJzLi4gVGhlcmUgaXMgbm8gZG90IGluIHRoZSBleHRlbnNpb24gIQorCisgICAgICAgQSAgICAgICBUaGUgbGlicmFyeSBmaWxlIGV4dGVuc2lvbiB0byBiZSB1c2VkIG9uIHRoZSBjdXJyZW50IHBsYXRmb3JtLgorICAgICAgICAgICAgICAgRGVmYXVsdHMgdG8gJ2EnIGZvciBhbiBBTlNJIHN5c3RlbSwgYnV0IGNhbiBiZSBgbGliJywgYHNvJywKKyAgICAgICAgICAgICAgIGBkbGwnIG9yIG90aGVycy4uIFRoZXJlIGlzIG5vIGRvdCBpbiB0aGUgZXh0ZW5zaW9uICEKKworCisgICAgICAgQlVJTEQgICBUaGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBidWlsZCBzeXN0ZW0gc2hvdWxkIGdyYWIgdGhlCisgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uIGhlYWRlciBmaWxlIGBmdGNvbmZpZy5oJyBhcyB3ZWxsIGFzIHRoZQorICAgICAgICAgICAgICAgc3lzdGVtLXNwZWNpZmljIGltcGxlbWVudGF0aW9uIG9mIGBmdHN5c3RlbScuCisKKyAgICAgICBPQkogICAgIFRoZSBkaXJlY3Rvcnkgd2hlcmUgYWxsIG9iamVjdCBmaWxlcyB3aWxsIGJlIHBsYWNlZAorCisKKyAgMy4gVGhlIExpYnJhcnkgUnVsZXMgZmlsZXMgOgorCisgICAgIE9uY2UgdGhlIHZhcmlhYmxlcyBkZWZpbmVkIGluIHRoZSBjb25maWd1cmF0aW9uIHJ1bGVzIGZpbGUsIHRoZQorICAgICBsaWJyYXJ5IHJ1bGVzIGZpbGUgaXMgaW5jbHVkZWQuIFRoaXMgb25lIGNvbnRhaW5zIGFsbCBydWxlcyByZXF1aXJlZAorICAgICB0byBidWlsZCB0aGUgbGlicmFyeSBvYmplY3RzIGludG8gT0JKCisKKyAgICAgSXRzIHN0cnVjdHVyZSB3b3JrcyBhcyBmb2xsb3dzOgorCisgICAgICAgLSBwcm92aWRlIHJ1bGVzIHRvIGNvbXBpbGUgdGhlIGxvdy1sZXZlbCBgZnRzeXN0ZW0nIG1vZHVsZQorCisgICAgICAgLSBpbmNsdWRlIHRoZSBydWxlcyBmaWxlcyBmcm9tIGVhY2ggZm9udCBkcml2ZXIgb3IgY29tcG9uZW50CisKKyAgICAgICAtIGluY2x1ZGUgdGhlIHJ1bGVzIGZpbGUgZm9yIHRoZSAib2xkIGFwaSIgbGF5ZXIKKworICAgICAgIC0gcHJvdmlkZSBydWxlcyB0byBjb21waWxlIHRoZSBpbml0aWFsaXNhdGlvbiBsYXllcgorCisgICAgICAgLSBwcm92aWRlIGFkZGl0aW9uYWwgdGFyZ2V0cyBsaWtlIGBjbGVhbicsIC4uCisKKworICAgICBOb3RlIHRoYXQgbGlua2luZyBhbGwgb2JqZWN0cyBmaWxlcyB0b2dldGhlciBpbnRvIGEgbGlicmFyeSBpcyBub3QKKyAgICAgcGVyZm9ybWVkIGluIHRoaXMgZmlsZSwgdGhvdWdoIGl0IG1pZ2h0IHNlZW0gcmVhc29uYWJsZSBhdCBmaXJzdAorICAgICBnbGFuY2UuIFRoZSByZWFzb24gZm9yIHRoaXMgaXMgdGhhdCBub3QgYWxsIGxpbmtlcnMgaGF2ZSBhIHNpbXBsZQorICAgICBzeW50YXggb2YgdGhlIGZvcm06CisKKyAgICAgICAgIGxpYnJhcmlhbiBhcmNoaXZlX2ZpbGUgIG9iamVjdDEgb2JqZWN0MiAuLi4uCisKKyAgICAgaGVuY2UsIGxpbmtpbmcgaXMgcGVyZm9ybWVkIHRocm91Z2ggcnVsZXMgcHJvdmlkZWQgaW4gdGhlIGNvbmZpZ3VyYXRpb24KKyAgICAgcnVsZXMgZmlsZSwgdXNpbmcgdGhlIHBob255IGBsaWJyYXJ5JyB0YXJnZXQsIHdoaWNoIGhhcyBiZWVuIGRlZmluZWQgZm9yCisgICAgIHRoaXMgdmVyeSBzcGVjaWZpYyBwdXJwb3NlLgorCisKKyAgNC4gVGhlIENvbXBvbmVudHMgUnVsZXMgZmlsZXMgOgorCisgICAgIEVhY2ggZm9udCBkcml2ZXIgaGFzIGl0cyBvd24gcnVsZXMgZmlsZSwgY2FsbGVkIGBydWxlcy5taycgbG9jYXRlZAorICAgICBpbiBpdHMgb3duIGRpcmVjdG9yeS4gVGhlIGxpYnJhcnkgcnVsZXMgZmlsZSBpbmNsdWRlcyB0aGVzZSBjb21wb25lbnQKKyAgICAgcnVsZXMgZm9yIGVhY2ggZm9udCBkcml2ZXIuCisKKyAgICAgVGhlc2UgcnVsZXMgbXVzdCBwZXJmb3JtIHRoZSBmb2xsb3dpbmc6CisKKyAgICAgICAtIHByb3ZpZGUgcnVsZXMgdG8gY29tcGlsZSB0aGUgY29tcG9uZW50LCBlaXRoZXIgaW50byBhIHNpbmdsZSBgbGFyZ2UnCisgICAgICAgICBvYmplY3QsIG9yIGludG8gbXVsdGlwbGUgc21hbGwgb25lcworCisgICAgICAgLSBmb3IgZm9udCBkcml2ZXJzIGFuZCByYXN0ZXJzLCB1cGRhdGUgc29tZSB2YXJpYWJsZXMsIHRoYXQgYXJlCisgICAgICAgICBpbml0aWFsbHkgZGVmaW5lZCBpbiB0aGUgbGlicmFyeSBydWxlcyBmaWxlLCB3aGljaCBpbmRpY2F0ZSB3ZXRoZXIKKyAgICAgICAgIHRoZSBjb21wb25lbnQgbXVzdCBiZSByZWdpc3RlcmVkIGluIHRoZSBsaWJyYXJ5IGluaXRpYWxpc2F0aW9uIGNvZGUKKworCisgICAgIGEuIENvbXBvbmVudCBDb21waWxlIE1vZGVzIDogICAgIAorCisgICAgICAgVGhlcmUgYXJlIHR3byB3YXlzIHRvIGNvbXBpbGUgYSBnaXZlbiBjb21wb25lbnQgOgorCisgICAgICAgICBpLiBTaW5nbGUtb2JqZWN0IGNvbXBpbGF0aW9uOgorCisgICAgICAgICAgICBJbiB0aGlzIG1vZGUsIHRoZSBjb21wb25lbnQgaXMgY29tcGlsZWQgaW50byBhIHNpbmdsZSBvYmplY3QKKyAgICAgICAgICAgIGZpbGUuIFRoaXMgaXMgcGVyZm9ybWVkIGVhc2lseSBieSBkZWZpbmluZyBhIHNpbmdsZSBDIGZpbGUgd2hvc2UKKyAgICAgICAgICAgIHNvbGUgcHVycG9zZSBpcyB0byBpbmNsdWRlIGFsbCBvdGhlciBjb21wb25lbnQgc291cmNlcy4gRm9yCisgICAgICAgICAgICBleGFtcGxlLCB0aGUgdHJ1ZXR5cGUgZHJpdmVyIGlzIGNvbXBpbGVkIGFzIGEgc2luZ2xlIG9iamVjdAorICAgICAgICAgICAgbmFtZWQgYHRydWV0eXBlLm8nLgorCisKKyAgICAgICAgIGlpLiBNdWx0aXBsZSBvYmplY3RzIGNvbXBpbGF0aW9uOgorCisgICAgICAgICAgICBJbiB0aGlzIG1vZGUsIGFsbCBzb3VyY2UgZmlsZXMgZm9yIGEgc2luZ2xlIGNvbXBvbmVudCBhcmUgY29tcGlsZWQKKyAgICAgICAgICAgIGluZGl2aWR1YWxseSBpbnRvIGFuIG9iamVjdCBmaWxlLgorCisgICAgICAgRHVlIHRvIHRoZSB3YXkgdGhlIEZyZWVUeXBlIHNvdXJjZSBjb2RlIGlzIHdyaXR0ZW4sIHNpbmdsZSBtb2RlCisgICAgICAgaGFzIHRoZSBmb2xsb3dpbmcgYWR2YW50YWdlcyBvdmVyIG11bHRpcGxlIG1vZGU6CisKKyAgICAgICAgIC0gd2l0aCBtYW55IGNvbXBpbGVycywgdGhlIHJlc3VsdGluZyBvYmplY3QgY29kZSBpcyBzbWFsbGVyIHRoYW4KKyAgICAgICAgICAgdGhlIGNvbmNhdGVuYXRpb24gb2YgYWxsIGluZGl2aWR1YWwgb2JqZWN0cyBmcm9tIG11bHRpcGxlIG1vZGUuCisgICAgICAgICAgIHRoaXMsIGJlY2F1c2UgYWxsIGZ1bmN0aW9ucyBpbnRlcm5hbCB0byB0aGUgY29tcG9uZW50IGFzIGEgd2hvbGUKKyAgICAgICAgICAgYXJlIGRlY2xhcmVkIHN0YXRpYywgYWxsb3dpbmcgbW9yZSBvcHRpbWlzYXRpb24uIEl0IG9mdGVuIGFsc28KKyAgICAgICAgICAgY29tcGlsZXMgbXVjaCBmYXN0ZXIuCisKKworICAgICAgICAgLSBtb3N0IGltcG9ydGFudGx5LCB0aGUgc2luZ2xlIG9iamVjdCBvbmx5IGNvbnRhaW5zIHRoZSBleHRlcm5hbAorICAgICAgICAgICBzeW1ib2xzIGl0IG5lZWRzIHRvIGJlIGxpbmtlZCB0byB0aGUgYmFzZSBsYXllciAoYWxsIGV4dGVybiB0aGF0CisgICAgICAgICAgIGFyZSBkdWUgdG8gaW50ZXItc291cmNlIGNhbGxzIHdpdGhpbiB0aGUgY29tcG9uZW50IGFyZSByZW1vdmVkKS4KKyAgICAgICAgICAgdGhpcyBjYW4gcmVkdWNlIHRyZW1lbmRvdXNseSB0aGUgc2l6ZSBvZiBkeW5hbWljIGxpYnJhcmllcyBvbgorICAgICAgICAgICBzb21lIHBsYXRmb3JtcworCisgICAgICAgTXVsdGlwbGUgbW9kZSBpcyB1c2VmdWwgaG93ZXZlciB0byBjaGVjayBzb21lIGRlcGVuZGVuY2llcyBwcm9ibGVtcworICAgICAgIHRoYXQgbWlnaHQgbm90IGFwcGVhciB3aGVuIGNvbXBpbGluZyBpbiBzaW5nbGUgbW9kZSwgc28gaXQgaGFzIGJlZW4KKyAgICAgICBrZXB0IGFzIGEgcG9zc2liaWxpdHkuCisKKworICAgICBiLiBEcml2ZXIgaW5pdGlhbGlzYXRpb24gY29kZSA6CisKKyAgICAgICBUaGUgc291cmNlIGZpbGUgYC4vc3JjL2Jhc2UvZnRpbml0LmMnIGNvbnRhaW5zIHRoZSBpbXBsZW1lbnRhdGlvbgorICAgICAgIG9mIHRoZSBGVF9Jbml0X0ZyZWVUeXBlIGZ1bmN0aW9uIHdoaWNoIG11c3QsIGFtb25nIG90aGVyIHRoaW5ncywKKyAgICAgICByZWdpc3RlciBhbGwgZm9udCBkcml2ZXJzIHRoYXQgYXJlIHN0YXRpY2FsbHkgbGlua2VkIHRvIHRoZSBsaWJyYXJ5LgorCisgICAgICAgQ29udHJvbGxpbmcgd2hpY2ggZHJpdmVycyBhcmUgcmVnaXN0ZXJlZCBhdCBpbml0aWFsaXNhdGlvbiB0aW1lIGlzCisJICAgcGVyZm9ybWVkIGJ5IGV4cGxvaXRpbmcgdGhlIHN0YXRlIG9mIHRoZSBDLXByZXByb2Nlc3NvciBpbiBvcmRlciB0bworCSAgIGJ1aWxkIGEgbGlua2VkIGxpc3QgKGEgImNoYWluIikgb2YgZHJpdmVyIGludGVyZmFjZXMuCisKKyAgICAgICBNb3JlIHByZWNpc2VseSwgZWFjaCBmb250IGRyaXZlciBpbnRlcmZhY2UgZmlsZSAobGlrZSBgdHRkcml2ZXIuaCcKKwkgICBvciBgdDFkcml2ZXIuaCcpIGhhcyBzb21lIHNwZWNpYWwgbGluZXMgdGhhdCBsb29rIGxpa2UgdGhpcyA6CisJICAgCisgIAkJCQorICAgIAkJCSNpZmRlZiBGVElOSVRfRFJJVkVSX0NIQUlOCisgCQkJCisgICAgCQkJc3RhdGljCisgICAgCQkJY29uc3QgRlRfRHJpdmVyQ2hhaW4gIGZ0aW5pdF88Rk9STUFUPl9kcml2ZXJfY2hhaW4gPQorICAgIAkJCXsKKyAgICAgIAkJCUZUX0lOSVRfTEFTVF9EUklWRVJfQ0hBSU4sCisgICAgICAJCQkmPEZPUk1BVD5fZHJpdmVyX2ludGVyZmFjZQorICAgIAkJCX07CisgIAkJCQorICAgIAkJCSN1bmRlZiAgRlRfSU5JVF9MQVNUX0RSSVZFUl9DSEFJTgorICAgIAkJCSNkZWZpbmUgRlRfSU5JVF9MQVNUX0RSSVZFUl9DSEFJTiAgICZmdGluaXRfPEZPUk1BVD5fZHJpdmVyX2NoYWluCisgCQkJCisgICAgCQkJI2VuZGlmIAorCQkJCQorICAJCUFzIG9uZSBjYW4gc2VlLCB0aGlzIGNvZGUgaXMgc3RyaWN0bHkgcmVzZXJ2ZWQgZm9yIGBmdGluaXQuYycgd2hpY2gKKwkJZGVmaW5lcyBGVElOSVRfRFJJVkVSX0NIQUlOIGJlZm9yZSBpbmNsdWRpbmcgYWxsIGZvbnQgZHJpdmVyIGhlYWRlcgorCQlmaWxlcy4KKwkJCisJCVdoZW4gdGhlIEMtcHJvY2Vzc29yIHBhcnNlcyB0aGVzZSBoZWFkZXJzLCBpdCBidWlsZHMgYSBsaW5rZWQgbGlzdCBvZgorCQlGVF9Ecml2ZXJDaGFpbiBlbGVtZW50LiBGb3IgZXhlbXBsZSwgdGhlIHNlcXVlbmNlIDoKKwkJCisJCSAgICNkZWZpbmUgRlRJTklUX0RSSVZFUl9DSEFJTgorCQkgICAjaW5jbHVkZSA8dHRkcml2ZXIuaD4KKwkJICAgI2luY2x1ZGUgPHQxZHJpdmVyLmg+CisJCSAgIAorCQlXaWxsIHJlYWxseSBnZW5lcmF0ZSBzb21ldGhpbmcgbGlrZToKKwkJCisgICAgCQkJc3RhdGljCisgICAgCSotLS0tPgljb25zdCBGVF9Ecml2ZXJDaGFpbiAgZnRpbml0X3R0X2RyaXZlcl9jaGFpbiA9CisgICAgCXwJCXsKKyAgICAgIAl8CQkwLAorICAgICAgCXwJCSZ0dF9kcml2ZXJfaW50ZXJmYWNlCisgICAgCXwJCX07CisgIAkJfAkKKyAgICAJfAkJc3RhdGljCisgICAgCXwJCWNvbnN0IEZUX0RyaXZlckNoYWluICBmdGluaXRfdDFfZHJpdmVyX2NoYWluID0KKyAgICAJfAkJeworICAgICAgCSotLS0tLS0JJmZ0aW5pdF90dF9kcml2ZXJfY2hhaW4sCisgICAgICAJCQkmdDFfZHJpdmVyX2ludGVyZmFjZQorICAgIAkJCX07CisgCSAgIAorCSAgIHdpdGggdGhlIEZUX0lOSVRfTEFTVF9EUklWRVJfQ0hBSU4gc2V0IHRvICImZnRpbml0X3QxX2RyaXZlcl9jaGFpbiIKKwkgICAKKwkgICBIZW5jZSwgdGhlIGxhc3QgaW5jbHVkZWQgZHJpdmVyIHdpbGwgYmUgcmVnaXN0ZXJlZCBmaXJzdCBpbiB0aGUgbGlicmFyeQorCSAgIApkaWZmIC0tZ2l0IGEvZG9jcy9ERVNJR04gYi9kb2NzL0RFU0lHTgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTM5MzYyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9ERVNJR04KQEAgLTAsMCArMSwyMTYgQEAKK1RoZSBEZXNpZ24gb2YgRnJlZVR5cGUgMi4wCis9PT09PT09PT09PT09PT09PT09PT09PT09PQorCitJbnRyb2R1Y3Rpb246CisKKyAgVGhpcyBzaG9ydCBkb2N1bWVudCBwcmVzZW50cyB0aGUgZGVzaWduIG9mIHZlcnNpb24gMiBvZiB0aGUgRnJlZVR5cGUKKyAgbGlicmFyeS4gSXQgaXMgYSBtdXN0IHJlYWQgZm9yIGFueW9uZSB3aWxsaW5nIHRvIHBvcnQsIGRlYnVnIG9yIGhhY2sKKyAgdGhlIEZyZWVUeXBlIHNvdXJjZXMuCisKKworSS4gR29hbHMgOgorCisgIEZyZWVUeXBlIDIgd2FzIGRlc2lnbmVkIHRvIHByb3ZpZGUgYSB1bmlmaWVkIGFuZCB1bml2ZXJzYWwgQVBJIHRvCisgIG1hbmFnZSAoaS5lLiByZWFkKSB0aGUgY29udGVudCBvZiBmb250IGZpbGVzLgorCisgIEl0cyBtYWluIGZlYXR1cmVzIGFyZSA6CisKKworICAgIC0gQSBGT1JNQVQtSU5ERVBFTkRFTlQgSElHSC1MRVZFTCBBUEkKKworICAgICAgICBVc2VkIHRvIG9wZW4sIHJlYWQgYW5kIG1hbmFnZSBmb250IGZpbGVzLgorCisKKyAgICAtIFRIRSBVU0UgT0YgUExVR0dBQkxFICJGT05UIERSSVZFUlMiCisKKyAgICAgICAgRWFjaCBmb250IGRyaXZlciBpcyB1c2VkIHRvIHN1cHBvcnQgYSBnaXZlbiBmb250IGZvcm1hdC4gRm9yCisgICAgICAgIGV4YW1wbGUsIHRoZSBkZWZhdWx0IGJ1aWxkIG9mIEZyZWVUeXBlIDIgY29tZXMgd2l0aCBkcml2ZXJzIGZvciB0aGUKKyAgICAgICAgVHJ1ZVR5cGUgYW5kIFR5cGUgMSBmb250IGZvcm1hdHMuCisKKyAgICAgICAgRm9udCBkcml2ZXJzIGNhbiBhbHNvIGJlIGFkZGVkLCByZW1vdmVkIG9yIHVwZ3JhZGVkIGF0ICpydW50aW1lKiwKKyAgICAgICAgaW4gb3JkZXIgdG8gc3VwcG9ydCBtb3JlIGZvbnQgZm9ybWF0cywgb3IgaW1wcm92ZSB0aGUgY3VycmVudCBvbmVzLgorCisgICAgICAgIEVhY2ggZm9udCBkcml2ZXIgYWxzbyBwcm92aWRlcyBpdHMgb3duICJwdWJsaWMgaW50ZXJmYWNlIiB0byBjbGllbnQKKyAgICAgICAgYXBwbGljYXRpb25zIHdobyB3b3VsZCBsaWtlIHRvIHVzZSBmb3JtYXQtc3BlY2lmaWMgZmVhdHVyZXMuCisKKyAgIAorICAgIC0gVEhFIFVTRSBPRiBQTFVHR0FCTEUgIlJBU1RFUlMiCisKKyAgICAgICAgQSByYXN0ZXIgaXMgYSB0aW55IG1vZHVsZSB1c2VkIHRvIHJlbmRlciBhIGdseXBoIGltYWdlCisgICAgICAgIGludG8gYSBiaXRtYXAgb3IgYW50aS1hbGlhc2VkIHBpeG1hcC4gUmFzdGVycyBkaWZmZXIgaW4gdGhlaXIKKyAgICAgICAgb3V0cHV0IHF1YWxpdHkgKGVzcGVjaWFsbHkgd2l0aCByZWdhcmRzIHRvIGFudGktYWxpYXNpbmcpLCBzcGVlZAorICAgICAgICBhbmQgbWVtb3J5IHVzYWdlLgorCisgICAgICAgIEFuIGFwcGxpY2F0aW9uIGNhbiBhbHNvIHByb3ZpZGUgaXRzIG93biByYXN0ZXIgaWYgaXQgbmVlZHMgdG8uCisKKyAgICAgICAgCisgICAgLSBISUdIIFBPUlRBQklMSVRZIEFORCBQRVJGT1JNQU5DRQorCisgICAgICAgIFRoZSBGcmVlVHlwZSBzb3VyY2UgY29kZSBpcyB3cml0dGVuIGluIGluZHVzdHJ5LXN0YW5kYXJkIEFOU0kgQy4KKworICAgICAgICBNb3Jlb3ZlciwgaXQgYWJzdHJhY3RzIG1lbW9yeSBtYW5hZ2VtZW50IGFuZCBpL28gb3BlcmF0aW9ucyB3aXRoaW4KKyAgICAgICAgYSBzaW5nbGUgbW9kdWxlLCBjYWxsZWQgImZ0c3lzdGVtIi4gVGhlIEZyZWVUeXBlIGJ1aWxkIHN5c3RlbSB0cmllcworICAgICAgICB0byBhdXRvLWRldGVjdCB0aGUgaG9zdCBwbGF0Zm9ybSBpbiBvcmRlciB0byBzZWxlY3QgaXRzIG1vc3QKKyAgICAgICAgZWZmaWNpZW50IGltcGxlbWVudGF0aW9uLiBJdCBkZWZhdWx0cyBvdGhlcndpc2UgdG8gdXNpbmcgdGhlCisgICAgICAgIHN0YW5kYXJkIEFOU0kgQyBMaWJyYXJ5LgorICAgICAgICAKKyAgICAgICAgTm90ZSB0aGF0LCBpbmRlcGVuZGVudGx5IG9mIHRoZSBob3N0IHBsYXRmb3JtIGFuZCBidWlsZCwgYW4KKyAgICAgICAgYXBwbGljYXRpb24gaXMgYWJsZSB0byBwcm92aWRlIGl0cyBvd24gbWVtb3J5IGFuZCBpL28gcm91dGluZXMuCisKKyAgICAgICAgVGhpcyBtYWtlIEZyZWVUeXBlIHN1aXRhYmxlIGZvciB1c2UgaW4gYW55IGtpbmQgb2YgZW52aXJvbm1lbnQsCisgICAgICAgIGZyb20gZW1iZWRkZWQgdG8gZGlzdHJpYnV0ZWQgc3lzdGVtcy4KKworCitJSS4gQ29tcG9uZW50cyBMYXlvdXQgOgorCisgIEZyZWVUeXBlIDIgaXMgbWFkZSBvZiBkaXN0aW5jdCBjb21wb25lbnRzIHdoaWNoIHJlbGF0ZSBkaXJlY3RseSB0byB0aGUKKyAgZGVzaWduIGRlc2NyaWJlZCBwcmV2aW91c2x5OgorCisKKyAgMS4gVEhFIEJBU0UgTEFZRVI6CisKKyAgICAgVGhlIGJhc2UgbGF5ZXIgaW1wbGVtZW50cyB0aGUgaGlnaC1sZXZlbCBBUEksIGFzIHdlbGwgYXMgcHJvdmlkZQorICAgICBnZW5lcmljIGZvbnQgc2VydmljZXMgdGhhdCBjYW4gYmUgdXNlZCBieSBlYWNoIGZvbnQgZHJpdmVyLgorICAgICAKKworICAyLiBUSEUgRk9OVCBEUklWRVJTOgorCisgICAgIEVhY2ggZm9udCBkcml2ZXIgY2FuIGJlIHJlZ2lzdGVyZWQgaW4gdGhlIGJhc2UgbGF5ZXIgYnkgcHJvdmlkaW5nCisgICAgIGFuICJpbnRlcmZhY2UiLCB3aGljaCByZWFsbHkgaXMgYSB0YWJsZSBvZiBmdW5jdGlvbiBwb2ludGVycy4KKworICAgICBBdCBidWlsZCB0aW1lLCB0aGUgc2V0IG9mIGRlZmF1bHQgZm9udCBkcml2ZXJzIGlzIHNlbGVjdGVkLiBUaGVzZQorICAgICBkcml2ZXJzIGFyZSB0aGVuIGNvbXBpbGVkIGFuZCBzdGF0aWNhbGx5IGxpbmtlZCB0byB0aGUgbGlicmFyeS4KKworICAgICBUaGV5IHdpbGwgdGhlbiBiZSBhdmFpbGFibGUgYWZ0ZXIgdGhlIGxpYnJhcnkgaW5pdGlhbGlzYXRpb24uCisKKworICAzLiBUSEUgUkFTVEVSUzoKKworICAgICBGcmVlVHlwZSAyIHByb3ZpZGVzIHRoZSBhYmlsaXR5IHRvIGhvb2sgdmFyaW91cyByYXN0ZXIgbW9kdWxlcyBpbnRvCisgICAgIGl0cyBiYXNlIGxheWVyLiBUaGlzIHByb3ZpZGVzIHNldmVyYWwgYWR2YW50YWdlcyA6CisKKyAgICAgICAtIGRpZmZlcmVudCBzeXN0ZW1zIG1lYW4gZGlmZmVyZW50IHJlcXVpcmVtZW50cywgaGVuY2UgdGhlIG5lZWQgZm9yCisgICAgICAgICBmbGV4aWJpbGl0eS4KKworICAgICAgIC0gZm9yIG5vdywgRnJlZVR5cGUgMiBvbmx5IHN1cHBvcnRzIGdseXBoIGltYWdlcyBzdG9yZWQgaW4gdGhlCisgICAgICAgICBmb2xsb3dpbmcgZm9ybWF0cyA6CisKKyAgICAgICAgICAgKiBiaXRtYXBzCisgICAgICAgICAgICogZ3JheS1sZXZlbCBwaXhtYXBzCisgICAgICAgICAgICogbW9ub2Nocm9tZSB2ZWN0b3JpYWwgb3V0bGluZXMgKHVzaW5nIGJlemllciBjb250cm9sIHBvaW50cykKKworICAgICAgICAgc2hvdWxkIGEgbmV3ICJ0ZWNobm9sb2d5IiBjb21lIGZvciBnbHlwaCBpbWFnZXMsIGl0IGlzIHBvc3NpYmxlCisgICAgICAgICB0byB3cml0ZSBhIG5ldyByYXN0ZXIgZm9yIGl0LCB3aXRob3V0IGFsdGVyaW5nIHRoZSByZXN0IG9mIHRoZQorICAgICAgICAgZW5naW5lLiBTb21lIGV4YW1wbGVzIGNvdWxkIGJlIDoKKworICAgICAgICAgICAqIG11bHRpLWNvbG9yZWQgdmVjdG9yaWFsIG91dGxpbmVzCisgICAgICAgICAgICogb24tdGhlLWZseSByZW5kZXJpbmcgb2YgVGVYJ3MgTWV0YUZvbnRzICEhCisKKworCisgIDQuIFRIRSBTWVNURU0gTU9EVUxFICJGVFNZU1RFTSI6CisKKyAgICAgVGhlIHN5c3RlbSBtb2R1bGUgaXMgdXNlZCB0byBpbXBsZW1lbnQgYmFzaWMgbWVtb3J5IGFuZCBpL28gbWFuYWdlbWVudAorICAgICBzZXJ2aWNlcy4gQnkgZGVmYXVsdCwgaXQgdXNlcyB0aGUgQU5TSSBDIGxpYnJhcnksIGJ1dCBzb21lIHJlcGxhY2VtZW50cworICAgICBhcmUgYWxzbyBwcm92aWRlZCAoYW5kIGF1dG9tYXRpY2FsbHkgc2VsZWN0ZWQgYnkgdGhlIGJ1aWxkIHN5c3RlbSkgd2hlbgorICAgICBhdmFpbGFibGUuCisKKyAgICAgQXMgYSBzaW1wbGUgZXhhbXBsZSwgdGhlIHVuaXggYnVpbGQgdXNlcyBtZW1vcnktbWFwcGVkIGZpbGVzIHRvIHJlYWQKKyAgICAgZm9udCBmaWxlcywgaW5zdGVhZCBvZiB0aGUgc2xvdyBBTlNJICJmb3Blbi9mc2Vlay9mcmVhZCIuIFRoaXMgcmVzdWx0cworICAgICBpbiB0cmVtZW5kb3VzIHBlcmZvcm1hbmNlIGVuaGFuY2VtZW50cy4KKworICAgICBOb3RlIHRoYXQsIGV2ZW4gaWYgdGhlIGJ1aWxkIHN5c3RlbSBjaG9vc2VzIGFuIGltcGxlbWVudGF0aW9uIGZvcgorICAgICAiZnRzeXN0ZW0iIGF0IGNvbXBpbGUgdGltZSwgYW4gYXBwbGljYXRpb24gaXMgc3RpbGwgYWJsZSB0byBwcm92aWRlCisgICAgIGl0cyBvd24gbWVtb3J5IG9yIGkvbyByb3V0aW5lcyB0byB0aGUgbGlicmFyeSBhdCBydW50aW1lLgorCisKKworCisgIDUuIFRIRSAiSU5JVCIgTEFZRVI6CisKKyAgICAgQSB0aW55IG1vZHVsZSB1c2VkIHRvIGltcGxlbWVudCB0aGUgZnVuY3Rpb24gRlRfSW5pdF9GcmVlVHlwZS4KKworICAgICBBcyBpdHMgbmFtZSBzdWdnZXN0cywgaXQgaXMgcmVzcG9uc2libGUgZm9yIGluaXRpYWxpc2luZyB0aGUgbGlicmFyeSwKKyAgICAgd2hpY2ggcmVhbGx5IG1lYW5zIHRoZSBmb2xsb3dpbmcgOgorCisgICAgICAgIC0gYmluZCB0aGUgaW1wbGVtZW50YXRpb24gb2YgImZ0c3lzdGVtIiB0aGF0IGJlc3QgbWF0Y2hlcyB0aGUKKyAgICAgICAgICBob3N0IHBsYXRmb3JtIHRvIHRoZSBsaWJyYXJ5LiBUaGlzIGNob2ljZSBjYW4gYmUgb3ZlcnJpZGVuCisgICAgICAgICAgbGF0ZXIgYnkgY2xpZW50IGFwcGxpY2F0aW9ucyBob3dldmVyLgorCisgICAgICAgIC0gcmVnaXN0ZXIgdGhlIHNldCBvZiBkZWZhdWx0IGZvbnQgZHJpdmVycyB3aXRoaW4gdGhlIGJhc2UgbGF5ZXIuCisgICAgICAgICAgdGhlc2UgZHJpdmVycyBhcmUgc3RhdGljYWxseSBsaW5rZWQgdG8gdGhlIGxpYnJhcnkuIE90aGVyIGRyaXZlcnMKKyAgICAgICAgICBjYW4gYmUgYWRkZWQgYXQgcnVudGltZSBsYXRlciB0aHJvdWdoIEZUX0FkZF9Ecml2ZXIgdGhvdWdoLi4KKworICAgICAgICAtIHJlZ2lzdGVyIHRoZSBzZXQgb2YgZGVmYXVsdCByYXN0ZXJzLiBDbGllbnQgYXBwbGljYXRpb25zIGFyZQorICAgICAgICAgIGFibGUgdG8gYWRkIHRoZWlyIG93biByYXN0ZXJzIGF0IHJ1bnRpbWUgdGhvdWdoLgorCisgICAgIFRoZSBkZXRhaWxzIHJlZ2FyZGluZyB0aGVzZSBvcGVyYXRpb25zIGlzIGdpdmVuIGluIHRoZSBkb2N1bWVudAorICAgICBuYW1lZCAiRnJlZVR5cGUgQnVpbGQgSW50ZXJuYWxzIgorCisKKworSUlJLiBPYmplY3RzIExheW91dCA6CisKKyAgRXZlbiB0aG91Z2ggaXQgaXMgd3JpdHRlbiBpbiBBTlNJIEMsIHRoZSBkZXNpbmcgb2YgRnJlZVR5cGUgMiBpcyBvYmplY3QKKyAgb3JpZW50ZWQsIGFzIGl0J3MgdGhlIGJlc3Qgd2F5IHRvIGltcGxlbWVudCB0aGUgZmxleGlibGUgZm9udCBmb3JtYXQKKyAgc3VwcG9ydCB0aGF0IHdlIHdhbnRlZC4KKworICBJbmRlZWQsIHRoZSBiYXNlIGxheWVyIGRlZmluZXMgYSBzZXQgb2YgYmFzZSBjbGFzc2VzIHRoYXQgY2FuIGJlIGRlcml2ZWQKKyAgYnkgZWFjaCBmb250IGRyaXZlciBpbiBvcmRlciB0byBzdXBwb3J0IGEgZ2l2ZW4gZm9ybWF0LiBUaGUgYmFzZSBsYXllcgorICBhbHNvIGluY2x1ZGVzIG1hbnkgYm9vay1rZWVwaW5nIHJvdXRpbmVzIHRoYXQgbmVlZCBub3QgYmUgaW5jbHVkZWQgaW4gdGhlCisgIGRyaXZlcnMuCisKKyAgVGhlIGJhc2UgY2xhc3NlcyBhcmUgdGhlIGZvbGxvd2luZzoKKworCisgIDEuIEZBQ0UgT0JKRUNUUzoKKworICAgIEFzIGluIEZyZWVUeXBlIDEueCwgYSBmYWNlIG9iamVjdCBtb2RlbHMgdGhlIGNvbnRlbnQgb2YgYSBnaXZlbiBmb250CisgICAgdGhhdCBpc24ndCBkZXBlbmRlbnQgb24gYSBnaXZlbiBzaXplLCB0cmFuc2Zvcm1hdGlvbiBvciBnbHlwaCBpbmRleC4KKworICAgIFRoaXMgaW5jbHVkZXMsIGZvciBleGFtcGxlLCB0aGUgZm9udCBuYW1lLCBmb250IHN0eWxlKHMpLCBhdmFpbGFibGUKKyAgICBjaGFybWFwcyBhbmQgZW5jb2RpbmdzLCBhbmQgYWxsIG90aGVyIGtpbmRzIG9mIGRhdGEgYW5kIHRhYmxlcyB0aGF0CisgICAgaGVscCBkZXNjcmliZSB0aGUgZm9udCBhcyBhIHdob2xlLgorCisKKyAgMi4gU0laRSBPQkpFQ1RTOiAocHJldmlvdXNseSBrbm93biBhcyBJTlNUQU5DRSBPQkpFQ1RTIGluIDEueCkKKworICAgIEEgZmFjZSBvYmplY3QgY2FuIGhhdmUgb25lIG9yIG1vcmUgYXNzb2NpYXRlZCBzaXplIG9iamVjdHMuIEEgU2l6ZQorICAgIG9iamVjdCBpcyB1c2VkIHRvIHN0b3JlZCB0aGUgZm9udCBkYXRhIHRoYXQgaXMgZGVwZW5kZW50IG9uIHRoZSBjdXJyZW50CisgICAgY2hhcmFjdGVyIHNpemUgb3IgdHJhbnNmb3JtIHVzZWQgdG8gbG9hZCBnbHlwaHMuCisKKyAgICBUeXBpY2FsIGRhdGEgaW4gYSBzaXplIG9iamVjdCBpbmNsdWRlIHNjYWxlZCBtZXRyaWNzLCBmYWN0b3JzLCBhbmQKKyAgICB2YXJpb3VzIGtpbmQgb2YgY29udHJvbCBkYXRhIHJlbGF0ZWQgdG8gZ3JpZC1maXR0aW5nLiBUaGUgc2l6ZSBvYmplY3QKKyAgICBpcyBjaGFuZ2VkIGVhY2ggdGltZSB0aGUgY2hhcmFjdGVyIHNpemUgaXMgbW9kaWZpZWQuCisKKworICAzLiBHTFlQSCBTTE9UIE9CSkVDVFM6CisKKyAgICBFYWNoIGZhY2Ugb2JqZWN0IGhhcyBvbmUgImdseXBoIHNsb3QiLCB3aGljaCBpcyBhIHNpbXBsZSBjb250YWluZXIKKyAgICB3aGVyZSBpbmRpdmlkdWFsIGdseXBoIGltYWdlcyBjYW4gYmUgbG9hZGVkIGFuZCBwcm9jZXNzZWQuCisKKyAgICBUaGUgZ2x5cGggaW1hZ2UgY2FuIGJlIHN0b3JlZCBpbiB0aGUgZm9sbG93aW5nIGZvcm1hdHMgaW4gdGhlIGdseXBoCisgICAgc2xvdCA6CisKKyAgICAgICAgLSBtb25vY2hyb21lIGJpdG1hcHMKKyAgICAgICAgLSBncmF5LWxldmVsIHBpeG1hcHMKKyAgICAgICAgLSB2ZWN0b3JpYWwgZ2x5cGggb3V0bGluZXMgKGRlZmluZWQgd2l0aCBiZXppZXIgY29udHJvbCBwb2ludHMpCisKKyAgICBOb3RlIHRoYXQgYSBtb2R1bGUsIGNhbGxlZCB0aGUgInJhc3RlciIgaXMgcHJvdmlkZWQgdG8gY29udmVydCB2ZWN0b3IKKyAgICBvdXRsaW5lcyBpbnRvIGVpdGhlciBtb25vY2hyb21lIG9yIGFudGktYWxpYXNlZCBiaXRtYXBzLiBUaGUgb3V0bGluZQorICAgIGlzIGFsc28gZGlyZWN0bHkgYWNjZXNzaWJsZSBhbmQgY2FuIGJlIHdhbGtlZCBvciBwcm9jZXNzZWQgZnJlZWx5IGJ5CisgICAgY2xpZW50IGFwcGxpY2F0aW9ucy4KKworICAgIG1vcmUgZ2x5cGggaW1hZ2VzIGZvcm1hdHMgY2FuIGJlIGRlZmluZWQsIGJ1dCB0aGV5IHdpbGwgcmVxdWlyZQorICAgIGEgc3BlY2lmaWMgcmFzdGVyIG1vZHVsZSBpZiBvbmUgd2FudHMgdG8gZGlzcGxheSB0aGVtIG9uIGEgdHlwaWNhbAorICAgIGRpc3BsYXkgc3VyZmFjZS4KKworICA0LiBDSEFSTUFQIE9CSkVDVFM6CisKKyAgICBBIGNoYXJtYXAgaXMgdXNlZCB0byBjb252ZXJ0IGNoYXJhY3RlciBjb2RlcywgZm9yIGEgZ2l2ZW4gZW5jb2RpbmcsCisgICAgaW50byBnbHlwaCBpbmRpY2VzLiBBIGdpdmVuIGZhY2UgbWlnaHQgY29udGFpbiBzZXZlcmFsIGNoYXJtYXBzLCBmb3IKKyAgICBleGFtcGxlLCBtb3N0IFRydWVUeXBlIGZvbnRzIGNvbnRhaW4gYm90aCB0aGUgIldpbmRvd3MgVW5pY29kZSIgYW5kCisgICAgIgorICAgIGl0IGlzIG5vdCByYXJlIHRvIHNlZSBUcnVlVHlwZSBmb250cyB3aXRoIGJvdGggdGhlCisgICAgIldpbmRvd3MgVW5pY29kZSIgYW5kICJBcHBsZSBSb21hbiIgY2hhcm1hcAorCmRpZmYgLS1naXQgYS9kb2NzL2Vzc2FpIGIvZG9jcy9lc3NhaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2E2MzM4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9lc3NhaQpAQCAtMCwwICsxLDE3MyBAQAorVW4gYXBlcmN1IGR1IGxheW91dCBkZXMgZmljaGllcnMgc291cmNlcyBkZSBGcmVlVHlwZSAyOgorCisgIGRvY3MvICAgICAgICAgICAgLSBkb2N1bWVudGF0aW9uCisgICAgICBodG1sLyAgICAgICAgLSBkb2N1bWVudGF0aW9uIGF1IGZvcm1hdCBodG1sCisgICAgICAKKyAgICAgIHR4dC8gICAgICAgICAtIGRvY3VtZW50YXRpb24gYXUgZm9ybWF0IHRleHRlCisgICAgCisgICAgCisgIGluY2x1ZGUvICAgICAgICAgLSBsZXMgaGVhZGVycyBwdWJsaXF1ZXMgZGUgbGEgbGlicmFpcmllLCBjZSBzb250IGNldXgKKyAgICAgICAgICAgICAgICAgICAgIHF1aSBzb250IGluc3RhbGxlcyBhdmVjIGxlIHBhcXVldCBmcmVldHlwZS1kZXZlbC5ycG0KKworICBjb25maWcvICAgICAgICAgIC0gbGUgcmVwZXJ0b2lyZSBkZSBjb25maWd1cmF0aW9uLgorICAgICAgYW5zaS8gICAgICAgCisgICAgICAgIGZ0X2NvbmYuaCAgLSBmaWNoaWVyIGRlIGNvbmZpZ3VyYXRpb24KKwlmdHN5cy5jICAgIC0gZmljaGllciBpbXBsZW1lbnRhdGlvbiBiYXMtbml2ZWF1CisKKyAgICAgIHVuaXgvCisgICAgICAKKyAgICAgIG9zMi8KKyAgICAgIAorICAgICAgZG9zLworICAgICAgCisgICAgICBhbWlnYS8KKyAgICAgIAorICAgICAgZGVidWcvCisgICAgICAKKyAgICAgIAorICBzcmMvICAgICAgICAgICAgICAtIHNvdXJjZXMgZGUgbGEgbGlicmFpcmllCisgICAgICBiYXNlLyAgICAgICAgIC0gY291Y2hlIGRlIGJhc2UgKHNlcnZpY2VzIGdlbmVyaXF1ZXMgKyBBUEkpCisgICAgICAKKyAgICAgIHRydWV0eXBlLyAgICAgLSBwaWxvdGUgdHJ1ZXR5cGUKKyAgICAgICAgICBvcHRpb25zLyAgLSBvcHRpb25zIGR1IHBpbG90ZSB0cnVldHlwZQorICAgICAgICAgIGV4dGVuZC8gICAtIGV4dGVuc2lvbnMgZHUgcGlsb3RlIHRydWV0eXBlCisgICAgICAKKyAgICAgIHR5cGUxLyAgICAgICAgLSBwaWxvdGUgdHlwZSAxCisgICAgICAgICAgb3B0aW9ucy8gIC0gb3B0aW9ucyBkdSBwaWxvdGUgdHlwZSAxCisJICBleHRlbmQvICAgLSBleHRlbnNpb25zIGR1IHBpbG90ZSB0eXBlIDEKKyAgICAgIAorICAgICAgdHlwZTIvICAgICAgICAtIHBpbG90ZSB0eXBlIDIKKyAgICAgIAorICAgICAgc3BlZWRvLyAgICAgICAtIHBpbG90ZSBzcGVlZG8KKyAgICAgIAorICAgICAgc2hhcmVkLyAgICAgICAtIHNvdXJjZXMgcGFydGFnZWVzIHBhciBwbHVzaWV1cnMgcGlsb3RlcworICAgICAgCisKKyAgdGVzdHMvICAgICAgICAgICAgLSBwcm9ncmFtbWVzIGRlIHRlc3QKKyAgICAgIGRhdGEvICAgICAgICAgLSBkb25uZWVzIGRlcyB0ZXN0cyA9IGZpY2hpZXJzIGRlIHBvbGljZSA9PiBjb3BpZXMgZGFucyBiaW4KKyAgICAgIHRlc3QxLyAgICAgICAgLSBzb3VyY2UgZHUgdGVzdCBudW1lcm8gMQorICAgICAgdGVzdDIvICAgICAgICAtIHNvdXJjZSBkdSB0ZXN0IG51bWVybyAyCisgICAgICB0ZXN0My8gICAgICAgIC0gLi4uCisgICAgICAuLi4KKworICBvYmovICAgICAgICAgICAgICAtIGVtcGxhY2VtZW50IGRlcyBmaWNoaWVycyBvYmpldHMgY29tcGlsZXMgKyBsaWJyYWlyaWUgPworICBiaW4vICAgICAgICAgICAgICAtIGVtcGxhY2VtZW50IGRlcyBleGVjdXRhYmxlcyAoZGVtb3MrdGVzdHMpCisgIAorICBkZW1vcy8gICAgICAgICAgICAtIHByb2dyYW1tZXMgZGUgZGVtb25zdHJhdGlvbgorICAgICAgZ3JhcGgvICAgICAgICAtIHNvdXMtc3lzdGVtZSBncmFwaGlxdWUgZGVzIHByb2dyYW1tZXMgZGUgZGVtbworICAgICAgCisgIAorICBjb250cmliLyAgICAgICAgICAtIGNvbnRyaWJ1dGlvbnMgZGUgdG91dGVzIHNvcnRlcy4uCisKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1F1ZWxxdWVzIGF1dHJlcyBpZGVlcyBhdSBoYXNhcmQgOgorCistIHZpcmVyIGxlIGNvbnRyb2xlIGRlcyB0aHJlYWRzLCBvbiBzJ2VuIHRhcGUgbWFnaXN0cmFsZW1lbnQKKworLSBzZXBhcmVyIGwnYWxsb2NhdGlvbiBtZW1vaXJlIGRlIGwnYWNjZXMgZGlzcXVlICgrZmxleGlibGUpCisKKy0gbCdhcGkgZGUgYmFzZSBkb2l0IHBlcm1ldHRyZSAiZCdvdXZyaXIiIHVuIGZpY2hpZXIgZGUgcG9saWNlIHNlIHRyb3V2YW50CisgIGRlamEgZW4gbWVtb2lyZS4uICAKKyAgCistIGV4cGxpcXVlciBsZXMgZGlmZmVyZW50cyB0eXBlcyBkZSBkaWN0aW9ubmFpcmVzIDoKKworICAgIGNoYXJfY29kZSAgICAtPiAgZ2x5cGhfaW5kZXggICAgICAgICBjaGFybWFwICAgICh0cnVldHlwZSkKKyAgICBjaGFyX2NvZGUgICAgLT4gIGdseXBoX25hbWUgICAgICAgICAgZW5jb2RpbmcgICAodHlwZSAxKQorICAgIGdseXBoX2luZGV4ICAtPiAgZ2x5cGhfbmFtZSAgICAgICAgICByZXBlcnRvaXJlICguLi4pCisKKy0gcGx1c2lldXJzICJyYXN0ZXIiIHBvc3NpYmxlcyAobGUgcmFzdGVyIHBhciBkZWZhdXQgcGV1dCBldHJlIGTpdGVybWlu6SDgIGxhIGNvbXBpbGF0aW9uLAorICBzaW5vbiBsJ2Fqb3V0IHNlIGZhaXQgc2ltcGxlbWVudCBlbiBwYXNzYW50IHVuIHBvaW50ZXVyIGQnaW50ZXJmYWNlLi4pCisKKworLSBsJ2FwaSBkZSBiYXNlIGRvaXQgZXRyZSBzaW1wbGlmaWVlLiBMYSBwbHVwYXJ0IGRlcyBkZXZlbG9wcGV1cnMgbmUgdmV1bGVudAorICBwYXMgc2F2b2lyIGNlIHF1J2VzdCB1bmUgInNpemUiLCB1biAiZ2x5cGhfc2xvdCIsIGV0Yy4uLCBvbiBjb25zZWlsbGUgZG9uYworICBkJ2VuIGNyZWVyIHVuZSBwYXIgZGVmYXV0LCBsb3JzIGRlIGwnYXBwZWwgZGUgOgorICAKKyAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLSBpbml0aWFsaXNhdGlvbiBldCBsZWN0dXJlIGRlcyBwb2xpY2VzIC0tLS0tLS0tLS0tLQorICAKKyAgICAgRlRfSW5pdF9GcmVlVHlwZSggJmxpYnJhcnkgKTsKKyAgICAgCisgICAgIEZUX1NldF9NZW1vcnlfTWFuYWdlciggbGlicmFyeSwgJm1lbV9tYW5hZ2VyX3JlYyApOworICAgICAKKyAgICAgRlRfU2V0X0lPX01hbmFnZXIoIGxpYnJhcnksICZpb19tYW5hZ2VyX3JlYyApOworICAKKyAgCisgICAgIEZUX05ld19GYWNlKCBsaWJyYXJ5LCBmaWxlX3BhdGhuYW1lLCBmYWNlX2luZGV4LCAmZmFjZSApOworICAgICAKKyAgICAgRlRfTmV3X01lbW9yeV9GYWNlKCBsaWJyYXJ5LCBmaXJzdF9ieXRlLCBsZW5ndGgsIGZhY2VfaW5kZXgsICZmYWNlICk7CisKKyAgICAgb3UgZW5jb3JlOgorICAgICAKKyAgICAgICBGVF9OZXdfRmFjZSggbGlicmFyeSwgJm5ld19mYWNlX3JlYywgJmZhY2UgKTsKKyAgICAgICAKKyAgICAgICBhdmVjIG5ld19mYWNlX3JlYyA6OgorICAgICAgIAorICAgICAgICAgIGZhY2VfaW5kZXgKKyAgICAgICAKKyAgICAgICAgICBwYXRobmFtZQorCSAgCisJICBtZW1vcnlfYWRkcmVzcworCSAgYnl0ZXNfc2l6ZQorICAgICAKKworICAgICBGVF9GbHVzaF9GYWNlKCBmYWNlICk7ICAgLy8gZmVybWUgbGUgc3RyZWFtIGNvcnJlc3BvbmRhbnQuLgorCisKKyAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGNoYW5nZW1lbnQgZGUgdGFpbGxlIC0tLS0tLQorICAgICAKKyAgICAgRlRfU2V0X1NpemUoIGZhY2UsICZmYWNlX3NpemVfcmVjICk7CisgICAgIAorICAgICAgIGZhY2Vfc2l6ZV9yZWMgOjoKKyAgICAgICAgIGNoYXJfaGVpZ2h0CisJIGNoYXJfd2lkdGgKKwkgaG9yel9yZXNvbHV0aW9uCisJIHZlcnRfcmVzb2x1dGlvbgorICAgICAKKyAgICAgRlRfU2V0X1BpeGVsX1NpemVzKCBmYWNlLCA2NCwgNjQgKTsKKworCisgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHNlbGVjdGlvbiBkZSBsYSBjaGFybWFwIC0tLS0KKyAgICAgCisgICAgIEZUX1NlbGVjdF9DaGFybWFwKCBmYWNlLCBmdF9jaGFybWFwX3VuaWNvZGUgKTsKKyAgICAgCisgICAgIEZUX1NlbGVjdF9DaGFybWFwX0luZGV4KCBmYWNlLCBpbmRleCApOworICAgICAKKyAgICAgRlRfTGlzdF9DaGFybWFwcyggZmFjZSwgYnVmZmVyLCBtYXgsIGZpcnN0ICk7CisKKyAgICAgZmFjZS0+Y2hhcm1hcCA9PiBwb2ludGUgdmVycyBsYSBjaGFybWFwIGFjdHVlbGxlLi4KKworCisgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGNoYXJnZW1lbnQgZGVzIGdseXBoZXMgLS0tLS0tLS0KKyAgICAgCisgICAgIEZUX0xvYWRfR2x5cGgoIGZhY2UsIGdseXBoX2luZGV4ICk7IAorICAgICAKKyAgICAgRlRfTG9hZF9DaGFyKCBmYWNlLCBjaGFyX2NvZGUgKTsKKyAgICAgCisgICAgIEZUX1RyYW5zZm9ybV9HbHlwaCggZmFjZS0+Z2x5cGgsICZ0cmFucyApOworICAgICAKKyAgICAgCisgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcmVuZHUgZmluYWwgLS0tLS0tLS0tLS0KKyAgICAgCisgICAgIEZUX0dldF9PdXRsaW5lX0JpdG1hcCggbGlicmFyeSwgZmFjZS0+Z2x5cGgsICZiaXQgKTsKKyAgICAgCisgICAgIEZUX1NldF9SYXN0ZXIoIGxpYnJhcnksICJkZWZhdWx0IiApOworICAgICAKKyAgICAgRlRfU2V0X1Jhc3Rlcl9Nb2RlKCBsaWJyYXJ5LCBtYWpvcl9tb2RlLCBtaW5vcl9tb2RlICk7CisgICAgIAorICAgICAKKyAgICAgCisgICAgIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1N5c3TobWUgZGUgY29uZmlndXJhdGlvbiBhdXRvbWF0aXF1ZQorCisgZnJlZXR5cGUyLworICAgICBNYWtlZmlsZQorICAgICBjb25maWcvCisgICAgICAgICBhbnNpLworICAgICAgICAgICAgY29uZmlnLm1rCisKKyAgbWFrZSBzZXR1cCAgPT4gYXV0b2RldGVjdGlvbiBkdSBzeXN06G1lICsgY29waWUgZGUgZmljaGllciBpbmNsdWRlID8/PworCisgIG1ha2UKZGlmZiAtLWdpdCBhL2RvY3MvZ2x5cGhfY29udmVudGlvbnMvYmJveDEuZ2lmIGIvZG9jcy9nbHlwaF9jb252ZW50aW9ucy9iYm94MS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE3M2NhYQotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvZ2x5cGhfY29udmVudGlvbnMvYmJveDEuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvZ2x5cGhfY29udmVudGlvbnMvYmJveDIuZ2lmIGIvZG9jcy9nbHlwaF9jb252ZW50aW9ucy9iYm94Mi5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA3NjU1NgotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvZ2x5cGhfY29udmVudGlvbnMvYmJveDIuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvZ2x5cGhfY29udmVudGlvbnMvYm9keV9jb21wYXJpc29uLmdpZiBiL2RvY3MvZ2x5cGhfY29udmVudGlvbnMvYm9keV9jb21wYXJpc29uLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjgyZTMxCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9nbHlwaF9jb252ZW50aW9ucy9ib2R5X2NvbXBhcmlzb24uZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvZ2x5cGhfY29udmVudGlvbnMvYnJhdm9fa2VybmVkLmdpZiBiL2RvY3MvZ2x5cGhfY29udmVudGlvbnMvYnJhdm9fa2VybmVkLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzEzNTBjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9nbHlwaF9jb252ZW50aW9ucy9icmF2b19rZXJuZWQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvZ2x5cGhfY29udmVudGlvbnMvYnJhdm9fdW5rZXJuZWQuZ2lmIGIvZG9jcy9nbHlwaF9jb252ZW50aW9ucy9icmF2b191bmtlcm5lZC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGI1ZjM0ZQotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvZ2x5cGhfY29udmVudGlvbnMvYnJhdm9fdW5rZXJuZWQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvZ2x5cGhfY29udmVudGlvbnMvYnVpbGRfZGlhZ3JhbS5naWYgYi9kb2NzL2dseXBoX2NvbnZlbnRpb25zL2J1aWxkX2RpYWdyYW0uZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkYTk4NTUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2dseXBoX2NvbnZlbnRpb25zL2J1aWxkX2RpYWdyYW0uZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvZ2x5cGhfY29udmVudGlvbnMvY2xpcHBpbmcuZ2lmIGIvZG9jcy9nbHlwaF9jb252ZW50aW9ucy9jbGlwcGluZy5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI4ZjcwMQotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvZ2x5cGhfY29udmVudGlvbnMvY2xpcHBpbmcuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvZ2x5cGhfY29udmVudGlvbnMvZG93bl9mbG93LmdpZiBiL2RvY3MvZ2x5cGhfY29udmVudGlvbnMvZG93bl9mbG93LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44M2IyYjdjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9nbHlwaF9jb252ZW50aW9ucy9kb3duX2Zsb3cuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvZ2x5cGhfY29udmVudGlvbnMvZ2x5cGhfY29udmVudGlvbnMuaHRtbCBiL2RvY3MvZ2x5cGhfY29udmVudGlvbnMvZ2x5cGhfY29udmVudGlvbnMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NGNjY2MxCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9nbHlwaF9jb252ZW50aW9ucy9nbHlwaF9jb252ZW50aW9ucy5odG1sCkBAIC0wLDAgKzEsMTYyNiBAQAorPCFkb2N0eXBlIGh0bWwgcHVibGljICItLy93M2MvL2R0ZCBodG1sIDQuMCB0cmFuc2l0aW9uYWwvL2VuIj4KKzxodG1sPgorPGhlYWQ+CisgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KKyAgIDxtZXRhIG5hbWU9IkF1dGhvciIgY29udGVudD0iYmxvYiI+CisgICA8bWV0YSBuYW1lPSJHRU5FUkFUT1IiIGNvbnRlbnQ9Ik1vemlsbGEvNC41IFtmcl0gKFdpbjk4OyBJKSBbTmV0c2NhcGVdIj4KKyAgIDx0aXRsZT5GcmVlVHlwZSBHbHlwaCBDb252ZW50aW9uczwvdGl0bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKworPGJvZHkgdGV4dD0iIzAwMDAwMCIKKyAgICAgIGJnY29sb3I9IiNGRkZGRkYiCisgICAgICBsaW5rPSIjMDAwMEVGIgorICAgICAgdmxpbms9IiM1MTE4OEUiCisgICAgICBhbGluaz0iI0ZGMDAwMCI+CisKKzxjZW50ZXI+Cis8aDE+CitGcmVlVHlwZSBHbHlwaCBDb252ZW50aW9uczwvaDE+PC9jZW50ZXI+CisKKzxjZW50ZXI+Cis8aDI+Cit2ZXJzaW9uIDIuMDwvaDI+PC9jZW50ZXI+CisKKzxjZW50ZXI+Cis8aDM+CitDb3B5cmlnaHQgMTk5OC0xOTk5RGF2aWQgVHVybmVyICg8YSBocmVmPSJtYWlsdG86ZGF2aWRAZnJlZXR5cGUub3JnIj5kYXZpZEBmcmVldHlwZS5vcmc8L2E+KTxicj4KK0NvcHlyaWdodCAxOTk5IFRoZSBGcmVlVHlwZSBEZXZlbG9wbWVudCBUZWFtICg8YSBocmVmPSJkZXZlbEBmcmVldHlwZS5vcmciPmRldmVsQGZyZWV0eXBlLm9yZzwvYT4pPC9oMz48L2NlbnRlcj4KKworPHA+PGJyPgorPGhyIFdJRFRIPSIxMDAlIj4KKzxoMj4KK0ludHJvZHVjdGlvbjwvaDI+CisKKzxibG9ja3F1b3RlPlRoaXMgZG9jdW1lbnQgZGlzY3Vzc2VzIGluIGdyZWF0IGRldGFpbHMgdGhlIGRlZmluaXRpb24gb2YKK3ZhcmlvdXMgY29uY2VwdHMgcmVsYXRlZCB0byBkaWdpdGFsIHR5cG9ncmFwaHksIGFzIHdlbGwgYXMgYSBmZXcgc3BlY2lmaWMKK3RvIHRoZSBGcmVlVHlwZSBsaWJyYXJ5LiBJdCBhbHNvIGV4cGxhaW5zIHRoZSB3YXlzIHR5cG9ncmFwaGljIGluZm9ybWF0aW9uLAorbGlrZSBnbHlwaCBtZXRyaWNzLCBrZXJuaW5nIGRpc3RhbmNlcywgZXRjLi4gaXMgdG8gYmUgbWFuYWdlZCBhbmQgdXNlZC4KK0l0IHJlbGF0ZXMgdG8gdGhlIGxheW91dCBhbmQgZGlzcGxheSBvZiB0ZXh0IHN0cmluZ3MsIGVpdGhlciBpbiBhIGNvbnZlbnRpb25hbAorKGkuZS4gUm9tYW4pIGxheW91dCwgb3Igd2l0aCByaWdodC10by1sZWZ0IG9yIHZlcnRpY2FsIG9uZXMuIFNvbWUgYXNwZWN0cworbGlrZSByb3RhdGlvbiBhbmQgdHJhbnNmb3JtYXRpb24gYXJlIGV4cGxhaW5lZCB0b28uCis8cD5Db21tZW50cyBhbmQgY29ycmVjdGlvbnMgYXJlIGhpZ2hseSB3ZWxjb21lZCwgYW5kIGNhbiBiZSBzZW50IHRvIHRoZQorPGEgaHJlZj0iZGV2ZWxAZnJlZXR5cGUub3JnIj5GcmVlVHlwZQorZGV2ZWxvcGVycyBsaXN0PC9hPi48L2Jsb2NrcXVvdGU+CisKKzxociBXSURUSD0iMTAwJSI+Cis8aDI+CitJLiBCYXNpYyB0eXBvZ3JhcGhpYyBjb25jZXB0czwvaDI+CisKKzxibG9ja3F1b3RlPgorPGgzPgorMS4gRm9udCBmaWxlcywgZm9ybWF0IGFuZCBpbmZvcm1hdGlvbjwvaDM+CisKKzxibG9ja3F1b3RlPkEgZm9udCBpcyBhIGNvbGxlY3Rpb24gb2YgdmFyaW91cyBjaGFyYWN0ZXIgaW1hZ2VzIHRoYXQgY2FuCitiZSB1c2VkIHRvIGRpc3BsYXkgb3IgcHJpbnQgdGV4dC4gVGhlIGltYWdlcyBpbiBhIHNpbmdsZSBmb250IHNoYXJlIHNvbWUKK2NvbW1vbiBwcm9wZXJ0aWVzLCBpbmNsdWRpbmcgbG9vaywgc3R5bGUsIHNlcmlmcywgZXRjLi4gVHlwb2dyYXBoaWNhbGx5CitzcGVha2luZywgb25lIGhhcyB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIGEgPGI+Zm9udCBmYW1pbHk8L2I+IGFuZCBpdHMgbXVsdGlwbGUKKzxiPmZvbnQKK2ZhY2VzPC9iPiwgd2hpY2ggdXN1YWxseSBkaWZmZXIgaW4gc3R5bGUgdGhvdWdoIGNvbWUgZnJvbSB0aGUgc2FtZSB0ZW1wbGF0ZS4KK0ZvciBleGFtcGxlLCAiPGk+UGFsYXRpbm8gUmVndWxhcjwvaT4iIGFuZCAiPGk+UGFsYXRpbm8gSXRhbGljPC9pPiIgYXJlCit0d28gZGlzdGluY3QgPGk+ZmFjZXM8L2k+IGZyb20gdGhlIHNhbWUgZmFtb3VzIDxpPmZhbWlseTwvaT4sIGNhbGxlZCAiPGk+UGFsYXRpbm88L2k+IgoraXRzZWxmLgorPHA+VGhlIHNpbmdsZSB0ZXJtIGZvbnQgaXMgbmVhcmx5IGFsd2F5cyB1c2VkIGluIGFtYmlndW91cyB3YXlzIHRvIHJlZmVyCit0byBlaXRoZXIgYSBnaXZlbiBmYW1pbHkgb3IgZ2l2ZW4gZmFjZSwgZGVwZW5kaW5nIG9uIHRoZSBjb250ZXh0LiBGb3IgZXhhbXBsZSwKK21vc3QgdXNlcnMgb2Ygd29yZC1wcm9jZXNzb3JzIHVzZSAiZm9udCIgdG8gZGVzY3JpYmUgYSBmb250IGZhbWlseSAoZS5nLgorQ291cmllciwgUGFsYXRpbm8sIGV0Yy4uKTsgaG93ZXZlciBtb3N0IG9mIHRoZXNlIGZhbWlsaWVzIGFyZSBpbXBsZW1lbnRlZAordGhyb3VnaCBzZXZlcmFsIGRhdGEgZmlsZXMgZGVwZW5kaW5nIG9uIHRoZSBmaWxlIGZvcm1hdCA6IGZvciBUcnVlVHlwZSwKK3RoaXMgaXMgdXN1YWxseSBvbmUgcGVyIGZhY2UgKGkuZS4gQVJJQUwuVEZGIGZvciAiQXJpYWwgUmVndWxhciIsIEFSSUFMSS5UVEYKK2ZvciAiQXJpYWwgSXRhbGljIiwgZXRjLi4pLiBUaGUgZmlsZSBpcyBhbHNvIGNhbGxlZCBhICJmb250IiBidXQgcmVhbGx5Citjb250YWlucyBhIGZvbnQgZmFjZS4KKzxwPkEgPGk+ZGlnaXRhbCBmb250PC9pPiBpcyB0aHVzIGEgZGF0YSBmaWxlIHRoYXQgbWF5IGNvbnRhaW4gPGk+b25lIG9yCittb3JlIGZvbnQgZmFjZXM8L2k+LiBGb3IgZWFjaCBvZiB0aGVzZSwgaXQgY29udGFpbnMgY2hhcmFjdGVyIGltYWdlcywgY2hhcmFjdGVyCittZXRyaWNzLCBhcyB3ZWxsIGFzIG90aGVyIGtpbmQgb2YgaW5mb3JtYXRpb24gaW1wb3J0YW50IHRvIHRoZSBsYXlvdXQgb2YKK3RleHQgYW5kIHRoZSBwcm9jZXNzaW5nIG9mIHNwZWNpZmljIGNoYXJhY3RlciBlbmNvZGluZ3MuIEluIHNvbWUgYXdrd2FyZAorZm9ybWF0cywgbGlrZSBBZG9iZSBUeXBlMSwgYSBzaW5nbGUgZm9udCBmYWNlIGlzIGRlc2NyaWJlZCB0aHJvdWdoIHNldmVyYWwKK2ZpbGVzIChpLmUuIG9uZSBjb250YWlucyB0aGUgY2hhcmFjdGVyIGltYWdlcywgYW5vdGhlciBvbmUgdGhlIGNoYXJhY3RlcgorbWV0cmljcykuIFdlIHdpbGwgaWdub3JlIHRoaXMgaW1wbGVtZW50YXRpb24gaXNzdWUgaW4gbW9zdCBvZiB0aGlzIGRvY3VtZW50CithbmQgY29uc2lkZXIgZGlnaXRhbCBmb250cyBhcyBzaW5nbGUgZmlsZXMsIHRob3VnaCBGcmVlVHlwZSAyLjAgaXMgYWJsZQordG8gc3VwcG9ydCBtdWx0aXBsZS1maWxlcyBmb250cyBjb3JyZWN0bHkuCis8cD5BcyBhIGNvbnZlbmllbmNlLCBhIGZvbnQgZmlsZSBjb250YWluaW5nIG1vcmUgdGhhbiBvbmUgZmFjZSBpcyBjYWxsZWQKK2EgZm9udCBjb2xsZWN0aW9uLiBUaGlzIGNhc2UgaXMgcmF0aGVyIHJhcmUgYnV0IGNhbiBiZSBzZWVuIGluIG1hbnkgYXNpYW4KK2ZvbnRzLCB3aGljaCBjb250YWluIGltYWdlcyBmb3IgdHdvIG9yIG1vcmUgc2NyaXB0cyBmb3IgYSBnaXZlbiBsYW5ndWFnZS48L2Jsb2NrcXVvdGU+CisKKzxoMz4KKzIuIENoYXJhY3RlciBpbWFnZXMgYW5kIG1hcHBpbmdzIDo8L2gzPgorCis8YmxvY2txdW90ZT5UaGUgY2hhcmFjdGVyIGltYWdlcyBhcmUgY2FsbGVkIDxiPmdseXBoczwvYj4uIEEgc2luZ2xlIGNoYXJhY3RlcgorY2FuIGhhdmUgc2V2ZXJhbCBkaXN0aW5jdCBpbWFnZXMsIGkuZS4gc2V2ZXJhbCBnbHlwaHMsIGRlcGVuZGluZyBvbiBzY3JpcHQsCit1c2FnZSBvciBjb250ZXh0LiBTZXZlcmFsIGNoYXJhY3RlcnMgY2FuIGFsc28gdGFrZSBhIHNpbmdsZSBnbHlwaCAoZ29vZAorZXhhbXBsZXMgYXJlIHJvbWFuIGxpZ2F0dXJlcyBsaWtlICJvZSIgYW5kICJmaSIgd2hpY2ggY2FuIGJlIHJlcHJlc2VudGVkCitieSBhIHNpbmdsZSBnbHlwaCBsaWtlICKcIiBhbmQgIj8iKS4gVGhlIHJlbGF0aW9uc2hpcHMgYmV0d2VlbiBjaGFyYWN0ZXJzCithbmQgZ2x5cGhzIGNhbiBiZSBhIHZlcnkgY29tcGxleCBvbmUgYnV0IHdvbid0IGJlIGRldGFpbGVkIGluIHRoaXMgZG9jdW1lbnQuCitNb3Jlb3Zlciwgc29tZSBmb3JtYXRzIHVzZSBtb3JlIG9yIGxlc3MgYXdrd2FyZCBzY2hlbWVzIHRvIHN0b3JlIGFuZCBhY2Nlc3MKK3RoZSBnbHlwaHMuIEZvciB0aGUgc2FrZSBvZiBjbGFyaXR5LCB3ZSdsbCBvbmx5IHJldGFpbiB0aGUgZm9sbG93aW5nIG5vdGlvbnMKK3doZW4gd29ya2luZyB3aXRoIEZyZWVUeXBlIDoKKzxicj4mbmJzcDsKKzx1bD4KKzxsaT4KK0EgZm9udCBmaWxlIGNvbnRhaW5zIGEgc2V0IG9mIGdseXBocywgZWFjaCBvbmUgY2FuIGJlIHN0b3JlZCBhcyBhIGJpdG1hcCwKK2EgdmVjdG9yIHJlcHJlc2VudGF0aW9uIG9yIGFueSBvdGhlciBzY2hlbWUgKGUuZy4gbW9zdCBzY2FsYWJsZSBmb3JtYXRzCit1c2UgYSBjb21iaW5hdGlvbiBvZiBtYXRoIHJlcHJlc2VudGF0aW9uIGFuZCBjb250cm9sIGRhdGEvcHJvZ3JhbXMpLiBUaGVzZQorZ2x5cGhzIGNhbiBiZSBzdG9yZWQgaW4gYW55IG9yZGVyIGluIHRoZSBmb250IGZpbGUsIGFuZCBpcyB0eXBpY2FsbHkgYWNjZXNzZWQKK3Rocm91Z2ggYSBzaW1wbGUgZ2x5cGggaW5kZXguPC9saT4KKzwvdWw+Cis8L2Jsb2NrcXVvdGU+Cis8L2Jsb2NrcXVvdGU+CisKKzx1bD4KKzx1bD4KKzx1bD4KKzxsaT4KK1RoZSBmb250IGZpbGUgY29udGFpbnMgb25lIChvciBtb3JlKSB0YWJsZSwgY2FsbGVkIGEgY2hhcmFjdGVyIG1hcCAob3IKK2NoYXJtYXAgaW4gc2hvcnQpLCB3aGljaCBpcyB1c2VkIHRvIGNvbnZlcnQgY2hhcmFjdGVyIGNvZGVzIGZvciBhIGdpdmVuCitlbmNvZGluZyAoZS5nLiBBU0NJSSwgVW5pY29kZSwgREJDUywgQmlnNSwgZXRjLi4pIGludG8gZ2x5cGggaW5kZXhlcyByZWxhdGl2ZQordG8gdGhlIGZvbnQgZmlsZS4gQSBzaW5nbGUgZm9udCBmYWNlIG1heSBjb250YWluIHNldmVyYWwgY2hhcm1hcHMuIEZvcgorZXhhbXBsZSwgbW9zdCBUcnVlVHlwZSBmb250cyBjb250YWluIGFuIEFwcGxlLXNwZWNpZmljIGNoYXJtYXAgYXMgd2VsbAorYXMgYSBVbmljb2RlIGNoYXJtYXAsIHdoaWNoIG1ha2VzIHRoZW0gdXNhYmxlIG9uIGJvdGggTWFjIGFuZCBXaW5kb3dzIHBsYXRmb3Jtcy48L2xpPgorPC91bD4KKzwvdWw+CisKKzxoMz4KKzMuIENoYXJhY3RlciBhbmQgZm9udCBtZXRyaWNzIDo8L2gzPgorCis8dWw+RWFjaCBnbHlwaCBpbWFnZSBpcyBhc3NvY2lhdGVkIHRvIHZhcmlvdXMgbWV0cmljcyB3aGljaCBhcmUgdXNlZCB0bworZGVzY3JpYmUgdGhlIHdheSBpdCBtdXN0IGJlIHBsYWNlZCBhbmQgbWFuYWdlZCB3aGVuIHJlbmRlcmluZyB0ZXh0LiBUaG91Z2gKK3RoZXkgYXJlIGRlc2NyaWJlZCBpbiBtb3JlIGRldGFpbHMgaW4gc2VjdGlvbiBJSUksIHRoZXkgcmVsYXRlIHRvIGdseXBoCitwbGFjZW1lbnQsIGN1cnNvciBhZHZhbmNlcyBhcyB3ZWxsIGFzIHRleHQgbGF5b3V0cy4gVGhleSBhcmUgZXh0cmVtZWx5CitpbXBvcnRhbnQgdG8gY29tcHV0ZSB0aGUgZmxvdyBvZiB0ZXh0IHdoZW4gcmVuZGVyaW5nIHN0cmluZyBvZiB0ZXh0LgorPHA+RWFjaCBzY2FsYWJsZSBmb3JtYXQgYWxzbyBjb250YWlucyBzb21lIGdsb2JhbCBtZXRyaWNzLCBleHByZXNzZWQgaW4KK25vdGlvbmFsIHVuaXRzLCB1c2VkIHRvIGRlc2NyaWJlIHNvbWUgcHJvcGVydGllcyBvZiBhbGwgZ2x5cGhzIGluIGEgc2FtZQorZmFjZS4gRm9yIGV4YW1wbGUgOiB0aGUgbWF4aW11bSBnbHlwaCBib3VuZGluZyBib3gsIHRoZSBhc2NlbmRlciwgZGVzY2VuZGVyCithbmQgdGV4dCBoZWlnaHQgZm9yIHRoZSBmb250LgorPHA+VGhvdWdoIHRoZXNlIG1ldHJpY3MgYWxzbyBleGlzdCBmb3Igbm9uLXNjYWxhYmxlIGZvcm1hdHMsIHRoZXkgb25seQorYXBwbHkgZm9yIGEgc2V0IG9mIGdpdmVuIGNoYXJhY3RlciBkaW1lbnNpb25zIGFuZCByZXNvbHV0aW9ucywgYW5kIHRoZXkncmUKK3VzdWFsbHkgZXhwcmVzc2VkIGluIHBpeGVscyB0aGVuLjwvdWw+Cis8L3VsPgorCis8cD48YnI+Cis8aHIgV0lEVEg9IjEwMCUiPgorPGgyPgorSUkuIEdseXBoIE91dGxpbmVzPC9oMj4KKworPGJsb2NrcXVvdGU+VGhpcyBzZWN0aW9uIGRlc2NyaWJlcyB0aGUgdmVjdG9yaWFsIHJlcHJlc2VudGF0aW9uIG9mIGdseXBoCitpbWFnZXMsIGNhbGxlZCBvdXRsaW5lcy4KKzxicj4mbmJzcDsKKzxoMz4KKzEuIFBpeGVscywgUG9pbnRzIGFuZCBEZXZpY2UgUmVzb2x1dGlvbnMgOjwvaDM+CisKKzxibG9ja3F1b3RlPlRob3VnaCBpdCBpcyBhIHZlcnkgY29tbW9uIGFzc3VtcHRpb24gd2hlbiBkZWFsaW5nIHdpdGggY29tcHV0ZXIKK2dyYXBoaWNzIHByb2dyYW1zLCB0aGUgcGh5c2ljYWwgZGltZW5zaW9ucyBvZiBhIGdpdmVuIHBpeGVsIChiZSBpdCBmb3IKK3NjcmVlbnMgb3IgcHJpbnRlcnMpIGFyZSBub3Qgc3F1YXJlZC4gT2Z0ZW4sIHRoZSBvdXRwdXQgZGV2aWNlLCBiZSBpdCBhCitzY3JlZW4gb3IgcHJpbnRlciBleGhpYml0cyB2YXJ5aW5nIHJlc29sdXRpb25zIGluIHRoZSBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbAorZGlyZWN0aW9ucywgYW5kIHRoaXMgbXVzdCBiZSB0YWtlbiBjYXJlIG9mIHdoZW4gcmVuZGVyaW5nIHRleHQuCis8cD5JdCBpcyB0aHVzIGNvbW1vbiB0byBkZWZpbmUgYSBkZXZpY2UncyBjaGFyYWN0ZXJpc3RpY3MgdGhyb3VnaCB0d28gbnVtYmVycworZXhwcmVzc2VkIGluIDxiPmRwaTwvYj4gKGRvdHMgcGVyIGluY2gpLiBGb3IgZXhhbXBsZSwgYSBwcmludGVyIHdpdGggYQorcmVzb2x1dGlvbiBvZiAzMDB4NjAwIGRwaSBoYXMgMzAwIHBpeGVscyBwZXIgaW5jaCBpbiB0aGUgaG9yaXpvbnRhbCBkaXJlY3Rpb24sCithbmQgNjAwIGluIHRoZSB2ZXJ0aWNhbCBvbmUuIFRoZSByZXNvbHV0aW9uIG9mIGEgdHlwaWNhbCBjb21wdXRlciBtb25pdG9yCit2YXJpZXMgd2l0aCBpdHMgc2l6ZSAoYSAxNSIgYW5kIDE3IiBtb25pdG9ycyBkb24ndCBoYXZlIHRoZSBzYW1lIHBpeGVsCitzaXplcyBhdCA2NDB4NDgwKSwgYW5kIG9mIGNvdXJzZSB0aGUgZ3JhcGhpY3MgbW9kZSByZXNvbHV0aW9uLgorPHA+QXMgYSBjb25zZXF1ZW5jZSwgdGhlIHNpemUgb2YgdGV4dCBpcyB1c3VhbGx5IGdpdmVuIGluIDxiPnBvaW50czwvYj4sCityYXRoZXIgdGhhbiBkZXZpY2Utc3BlY2lmaWMgcGl4ZWxzLiBQb2ludHMgYXJlIGEgc2ltcGxlIDxpPnBoeXNpY2FsPC9pPgordW5pdCwgd2hlcmUgMSBwb2ludCA9IDEvNzJ0aCBvZiBhbiBpbmNoLCBpbiBkaWdpdGFsIHR5cG9ncmFwaHkuIEFzIGFuIGV4YW1wbGUsCittb3N0IHJvbWFuIGJvb2tzIGFyZSBwcmludGVkIHdpdGggYSBib2R5IHRleHQgd2hpY2ggc2l6ZSBpcyBjaG9zZW4gYmV0d2VlbgorMTAgYW5kIDE0IHBvaW50cy4KKzxwPkl0IGlzIHRodXMgcG9zc2libGUgdG8gY29tcHV0ZSB0aGUgc2l6ZSBvZiB0ZXh0IGluIHBpeGVscyBmcm9tIHRoZSBzaXplCitpbiBwb2ludHMgdGhyb3VnaCB0aGUgZm9sbG93aW5nIGNvbXB1dGF0aW9uIDoKKzxjZW50ZXI+Cis8cD48dHQ+cGl4ZWxfc2l6ZSA9IHBvaW50X3NpemUgKiByZXNvbHV0aW9uIC8gNzI8L3R0PjwvY2VudGVyPgorCis8cD5XaGVyZSByZXNvbHV0aW9uIGlzIGV4cHJlc3NlZCBpbiBkcGkuIE5vdGUgdGhhdCBiZWNhdXNlIHRoZSBob3Jpem9udGFsCithbmQgdmVydGljYWwgcmVzb2x1dGlvbnMgbWF5IGRpZmZlciwgYSBzaW5nbGUgcG9pbnQgc2l6ZSB1c3VhbGx5IGRlZmluZXMKK2RpZmZlcmVudCB0ZXh0IHdpZHRoIGFuZCBoZWlnaHQgaW4gcGl4ZWxzLgorPGJyPiZuYnNwOworPHA+PGI+SU1QT1JUQU5UIE5PVEU6PC9iPgorPGJyPjxpPlVubGlrZSB3aGF0IGlzIG9mdGVuIHRob3VnaHQsIHRoZSAic2l6ZSBvZiB0ZXh0IGluIHBpeGVscyIgaXMgbm90CitkaXJlY3RseSByZWxhdGVkIHRvIHRoZSByZWFsIGRpbWVuc2lvbnMgb2YgY2hhcmFjdGVycyB3aGVuIHRoZXkncmUgZGlzcGxheWVkCitvciBwcmludGVkLiBUaGUgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlc2UgdHdvIGNvbmNlcHRzIGlzIGEgYml0IG1vcmUgY29tcGxleAorYW5kIHJlbGF0ZSB0byBzb21lIGRlc2lnbiBjaG9pY2UgbWFkZSBieSB0aGUgZm9udCBkZXNpZ25lci4gVGhpcyBpcyBkZXNjcmliZWQKK2luIG1vcmUgZGV0YWlscyB0aGUgbmV4dCBzdWItc2VjdGlvbiAoc2VlIHRoZSBleHBsYW5hdGlvbnMgb24gdGhlIEVNIHNxdWFyZSkuPC9pPjwvYmxvY2txdW90ZT4KKworPGgzPgorMi4gVmVjdG9yaWFsIHJlcHJlc2VudGF0aW9uIDo8L2gzPgorCis8YmxvY2txdW90ZT5UaGUgc291cmNlIGZvcm1hdCBvZiBvdXRsaW5lcyBpcyBhIGNvbGxlY3Rpb24gb2YgY2xvc2VkIHBhdGhzCitjYWxsZWQgPGI+Y29udG91cnM8L2I+LiBFYWNoIGNvbnRvdXIgZGVsaW1pdHMgYW4gb3V0ZXIgb3IgaW5uZXIgPGk+cmVnaW9uPC9pPgorb2YgdGhlIGdseXBoLCBhbmQgY2FuIGJlIG1hZGUgb2YgZWl0aGVyIDxiPmxpbmUgc2VnbWVudHM8L2I+IG9yIDxiPmJlemllcgorYXJjczwvYj4uCis8cD5UaGUgYXJjcyBhcmUgZGVmaW5lZCB0aHJvdWdoIDxiPmNvbnRyb2wgcG9pbnRzPC9iPiwgYW5kIGNhbiBiZSBlaXRoZXIKK3NlY29uZC1vcmRlciAodGhlc2UgYXJlICJjb25pYyBiZXppZXJzIikgb3IgdGhpcmQtb3JkZXIgKCJjdWJpYyIgYmV6aWVycykKK3BvbHlub21pYWxzLCBkZXBlbmRpbmcgb24gdGhlIGZvbnQgZm9ybWF0LiBIZW5jZSwgZWFjaCBwb2ludCBvZiB0aGUgb3V0bGluZQoraGFzIGFuIGFzc29jaWF0ZWQgPGI+ZmxhZzwvYj4gaW5kaWNhdGluZyBpdHMgdHlwZSAobm9ybWFsIG9yIGNvbnRyb2wgcG9pbnQpLgorQW5kIHNjYWxpbmcgdGhlIHBvaW50cyB3aWxsIHNjYWxlIHRoZSB3aG9sZSBvdXRsaW5lLgorPHA+RWFjaCBnbHlwaCdzIG9yaWdpbmFsIG91dGxpbmUgcG9pbnRzIGFyZSBsb2NhdGVkIG9uIGEgZ3JpZCBvZiBpbmRpdmlzaWJsZQordW5pdHMuIFRoZSBwb2ludHMgYXJlIHVzdWFsbHkgc3RvcmVkIGluIGEgZm9udCBmaWxlIGFzIDE2LWJpdCBpbnRlZ2VyIGdyaWQKK2Nvb3JkaW5hdGVzLCB3aXRoIHRoZSBncmlkIG9yaWdpbidzIGJlaW5nIGF0ICgwLDApOyB0aGV5IHRodXMgcmFuZ2UgZnJvbQorLTE2Mzg0IHRvIDE2MzgzLiAoZXZlbiB0aG91Z2ggcG9pbnQgY29vcmRpbmF0ZXMgY2FuIGJlIGZsb2F0cyBpbiBvdGhlcgorZm9ybWF0cyBzdWNoIGFzIFR5cGUgMSwgd2UnbGwgcmVzdHJpY3Qgb3VyIGFuYWx5c2lzIHRvIGludGVnZXIgb25lcywgZHJpdmVuCitieSB0aGUgbmVlZCBmb3Igc2ltcGxpY2l0eS4uKS4KKzxwPjxiPklNUE9SVEFOVCBOT1RFOjwvYj4KKzxicj48aT5UaGUgZ3JpZCBpcyBhbHdheXMgb3JpZW50ZWQgbGlrZSB0aGUgdHJhZGl0aW9uYWwgbWF0aGVtYXRpY2FsIDJECitwbGFuZSwgaS5lLiB0aGUgWCBheGlzIGZyb20gdGhlIGxlZnQgdG8gdGhlIHJpZ2h0LCBhbmQgdGhlIFkgYXhpcyBmcm9tCitib3R0b20gdG8gdG9wLjwvaT4KKzxwPkluIGNyZWF0aW5nIHRoZSBnbHlwaCBvdXRsaW5lcywgYSB0eXBlIGRlc2lnbmVyIHVzZXMgYW4gaW1hZ2luYXJ5IHNxdWFyZQorY2FsbGVkIHRoZSAiRU0gc3F1YXJlIi4gVHlwaWNhbGx5LCB0aGUgRU0gc3F1YXJlIGNhbiBiZSB0aG91Z2h0IG9mIGFzIGEKK3RhYmxldCBvbiB3aGljaCB0aGUgY2hhcmFjdGVyIGFyZSBkcmF3bi4gVGhlIHNxdWFyZSdzIHNpemUsIGkuZS4sIHRoZSBudW1iZXIKK29mIGdyaWQgdW5pdHMgb24gaXRzIHNpZGVzLCBpcyB2ZXJ5IGltcG9ydGFudCBmb3IgdHdvIHJlYXNvbnM6Cis8YnI+Jm5ic3A7Cis8YmxvY2txdW90ZT4KKzxsaT4KK2l0IGlzIHRoZSByZWZlcmVuY2UgdXNlZCB0byBzY2FsZSB0aGUgb3V0bGluZXMgdG8gYSBnaXZlbiB0ZXh0IGRpbWVuc2lvbi4KK0ZvciBleGFtcGxlLCBhIHNpemUgb2YgMTJwdCBhdCAzMDB4MzAwIGRwaSBjb3JyZXNwb25kcyB0byAxMiozMDAvNzIgPSA1MAorcGl4ZWxzLiBUaGlzIGlzIHRoZSBzaXplIHRoZSBFTSBzcXVhcmUgd291bGQgYXBwZWFyIG9uIHRoZSBvdXRwdXQgZGV2aWNlCitpZiBpdCB3YXMgcmVuZGVyZWQgZGlyZWN0bHkuIEluIG90aGVyIHdvcmRzLCBzY2FsaW5nIGZyb20gZ3JpZCB1bml0cyB0bworcGl4ZWxzIHVzZXMgdGhlIGZvcm11bGE6PC9saT4KKzwvYmxvY2txdW90ZT4KKworPGNlbnRlcj48dHQ+cGl4ZWxfc2l6ZSA9IHBvaW50X3NpemUgKiByZXNvbHV0aW9uIC8gNzI8L3R0PgorPGJyPjx0dD5waXhlbF9jb29yZGluYXRlID0gZ3JpZF9jb29yZGluYXRlICogcGl4ZWxfc2l6ZSAvIEVNX3NpemU8L3R0PjwvY2VudGVyPgorCis8YmxvY2txdW90ZT4KKzxsaT4KK3RoZSBncmVhdGVyIHRoZSBFTSBzaXplIGlzLCB0aGUgbGFyZ2VyIHJlc29sdXRpb24gdGhlIGRlc2lnbmVyIGNhbiB1c2UKK3doZW4gZGlnaXRpemluZyBvdXRsaW5lcy4gRm9yIGV4YW1wbGUsIGluIHRoZSBleHRyZW1lIGV4YW1wbGUgb2YgYW4gRU0KK3NpemUgb2YgNCB1bml0cywgdGhlcmUgYXJlIG9ubHkgMjUgcG9pbnQgcG9zaXRpb25zIGF2YWlsYWJsZSB3aXRoaW4gdGhlCitFTSBzcXVhcmUgd2hpY2ggaXMgY2xlYXJseSBub3QgZW5vdWdoLiBUeXBpY2FsIFRydWVUeXBlIGZvbnRzIHVzZSBhbiBFTQorc2l6ZSBvZiAyMDQ4IHVuaXRzIChub3RlOiB3aXRoIFR5cGUgMSBQb3N0U2NyaXB0IGZvbnRzLCB0aGUgRU0gc2l6ZSBpcworZml4ZWQgdG8gMTAwMCBncmlkIHVuaXRzLiBIb3dldmVyLCBwb2ludCBjb29yZGluYXRlcyBjYW4gYmUgZXhwcmVzc2VkIGluCitmbG9hdGluZyB2YWx1ZXMpLjwvbGk+Cis8L2Jsb2NrcXVvdGU+CitOb3RlIHRoYXQgZ2x5cGhzIGNhbiBmcmVlbHkgZXh0ZW5kIGJleW9uZCB0aGUgRU0gc3F1YXJlIGlmIHRoZSBmb250IGRlc2lnbmVyCit3YW50cyBzby4gVGhlIEVNIGlzIHVzZWQgYXMgYSBjb252ZW5pZW5jZSwgYW5kIGlzIGEgdmFsdWFibGUgY29udmVuaWVuY2UKK2Zyb20gdHJhZGl0aW9uYWwgdHlwb2dyYXBoeS4KKzxjZW50ZXI+Cis8cD48Yj5Ob3RlIDogR3JpZCB1bml0cyBhcmUgdmVyeSBvZnRlbiBjYWxsZWQgImZvbnQgdW5pdHMiIG9yICJFTSB1bml0cyIuPC9iPjwvY2VudGVyPgorCis8cD48Yj5OT1RFOjwvYj4KKzxicj48aT5BcyBzYWlkIGJlZm9yZSwgdGhlIHBpeGVsX3NpemUgY29tcHV0ZWQgaW4mbmJzcDsgdGhlIGFib3ZlIGZvcm11bGEKK2RvZXMgbm90IHJlbGF0ZSBkaXJlY3RseSB0byB0aGUgc2l6ZSBvZiBjaGFyYWN0ZXJzIG9uIHRoZSBzY3JlZW4uIEl0IHNpbXBseQoraXMgdGhlIHNpemUgb2YgdGhlIEVNIHNxdWFyZSBpZiBpdCB3YXMgdG8gYmUgZGlzcGxheWVkIGRpcmVjdGx5LiBFYWNoIGZvbnQKK2Rlc2lnbmVyIGlzIGZyZWUgdG8gcGxhY2UgaXRzIGdseXBocyBhcyBpdCBwbGVhc2VzIGhpbSB3aXRoaW4gdGhlIHNxdWFyZS4KK1RoaXMgZXhwbGFpbnMgd2h5IHRoZSBsZXR0ZXJzIG9mIHRoZSBmb2xsb3dpbmcgdGV4dCBoYXZlIG5vdCB0aGUgc2FtZSBoZWlnaHQsCitldmVuIHRob3VnaCB0aGV5J3JlIGRpc3BsYXllZCBhdCB0aGUgc2FtZSBwb2ludCBzaXplIHdpdGggZGlzdGluY3QgZm9udHMKKzo8L2k+Cis8Y2VudGVyPgorPHA+PGltZyBTUkM9ImJvZHlfY29tcGFyaXNvbi5naWYiIGhlaWdodD00MCB3aWR0aD01ODA+PC9jZW50ZXI+CisKKzxwPkFzIG9uZSBjYW4gc2VlLCB0aGUgZ2x5cGhzIG9mIHRoZSBDb3VyaWVyIGZhbWlseSBhcmUgc21hbGxlciB0aGFuIHRob3NlCitvZiBUaW1lcyBOZXcgUm9tYW4sIHdoaWNoIHRoZW1zZWx2ZXMgYXJlIHNsaWdodGx5IHNtYWxsZXIgdGhhbiB0aG9zZSBvZgorQXJpYWwsIGV2ZW4gdGhvdWdoIGV2ZXJ5dGhpbmcgaXMgZGlzcGxheWVkIG9yIHByaW50ZWQmbmJzcDsgYXQgYSBzaXplIG9mCisxNiBwb2ludHMuIFRoaXMgb25seSByZWZsZWN0IGRlc2lnbiBjaG9pY2VzLgorPGJyPiZuYnNwOzwvYmxvY2txdW90ZT4KKworPGgzPgorMy4gSGludGluZyBhbmQgQml0bWFwIHJlbmRlcmluZzwvaDM+CisKKzxibG9ja3F1b3RlPlRoZSBvdXRsaW5lIGFzIHN0b3JlZCBpbiBhIGZvbnQgZmlsZSBpcyBjYWxsZWQgdGhlICJtYXN0ZXIiCitvdXRsaW5lLCBhcyBpdHMgcG9pbnRzIGNvb3JkaW5hdGVzIGFyZSBleHByZXNzZWQgaW4gZm9udCB1bml0cy4gQmVmb3JlCitpdCBjYW4gYmUgY29udmVydGVkIGludG8gYSBiaXRtYXAsIGl0IG11c3QgYmUgc2NhbGVkIHRvIGEgZ2l2ZW4gc2l6ZS9yZXNvbHV0aW9uLgorVGhpcyBpcyBkb25lIHRocm91Z2ggYSB2ZXJ5IHNpbXBsZSB0cmFuc2Zvcm0sIGJ1dCBhbHdheXMgY3JlYXRlcyB1bmRlc2lyYWJsZQorYXJ0aWZhY3RzLCBlLmcuIHN0ZW1zIG9mIGRpZmZlcmVudCB3aWR0aHMgb3IgaGVpZ2h0cyBpbiBsZXR0ZXJzIGxpa2UgIkUiCitvciAiSCIuCis8cD5BcyBhIGNvbnNlcXVlbmNlLCBwcm9wZXIgZ2x5cGggcmVuZGVyaW5nIG5lZWRzIHRoZSBzY2FsZWQgcG9pbnRzIHRvCitiZSBhbGlnbmVkIGFsb25nIHRoZSB0YXJnZXQgZGV2aWNlIHBpeGVsIGdyaWQsIHRocm91Z2ggYW4gb3BlcmF0aW9uIGNhbGxlZAorImdyaWQtZml0dGluZyIsIGFuZCBvZnRlbiAiaGludGluZyIuIE9uZSBvZiBpdHMgbWFpbiBwdXJwb3NlIGlzIHRvIGVuc3VyZQordGhhdCBpbXBvcnRhbnQgd2lkdGhzIGFuZCBoZWlnaHRzIGFyZSByZXNwZWN0ZWQgdGhyb3VnaG91dCB0aGUgd2hvbGUgZm9udAorKGZvciBleGFtcGxlLCBpdCBpcyB2ZXJ5IG9mdGVuIGRlc2lyYWJsZSB0aGF0IHRoZSAiSSIgYW5kIHRoZSAiVCIgaGF2ZQordGhlaXIgY2VudHJhbCB2ZXJ0aWNhbCBsaW5lIG9mIHRoZSBzYW1lIHBpeGVsIHdpZHRoKSwgYXMgd2VsbCBhcyBtYW5hZ2UKK2ZlYXR1cmVzIGxpa2Ugc3RlbXMgYW5kIG92ZXJzaG9vdHMsIHdoaWNoIGNhbiBjYXVzZSBwcm9ibGVtcyBhdCBzbWFsbCBwaXhlbAorc2l6ZXMuCis8cD5UaGVyZSBhcmUgc2V2ZXJhbCB3YXlzIHRvIHBlcmZvcm0gZ3JpZC1maXR0aW5nIHByb3Blcmx5LCBmb3IgZXhhbXBsZQorbW9zdCBzY2FsYWJsZSBmb3JtYXRzIGFzc29jaWF0ZSBzb21lIGNvbnRyb2wgZGF0YSBvciBwcm9ncmFtcyB3aXRoIGVhY2gKK2dseXBoIG91dGxpbmUuIEhlcmUgaXMgYW4gb3ZlcnZpZXcgOgorPGJyPiZuYnNwOworPGJsb2NrcXVvdGU+Cis8YmxvY2txdW90ZT48Yj5leHBsaWNpdCBncmlkLWZpdHRpbmcgOjwvYj4KKzxibG9ja3F1b3RlPlRoZSBUcnVlVHlwZSBmb3JtYXQgZGVmaW5lcyBhIHN0YWNrLWJhc2VkIHZpcnR1YWwgbWFjaGluZSwKK2ZvciB3aGljaCBwcm9ncmFtcyBjYW4gYmUgd3JpdHRlbiB3aXRoIHRoZSBoZWxwIG9mIG1vcmUgdGhhbiAyMDAgb3Bjb2RlcworKG1vc3Qgb2YgdGhlc2UgcmVsYXRpbmcgdG8gZ2VvbWV0cmljYWwgb3BlcmF0aW9ucykuIEVhY2ggZ2x5cGggaXMgdGh1cworbWFkZSBvZiBib3RoIGFuIG91dGxpbmUgYW5kIGEgY29udHJvbCBwcm9ncmFtLCBpdHMgcHVycG9zZSBiZWluZyB0byBwZXJmb3JtCit0aGUgYWN0dWFsIGdyaWQtZml0dGluZyBpbiB0aGUgd2F5IGRlZmluZWQgYnkgdGhlIGZvbnQgZGVzaWduZXIuPC9ibG9ja3F1b3RlPgorCis8cD48YnI+PGI+aW1wbGljaXQgZ3JpZC1maXR0aW5nIChhbHNvIGNhbGxlZCBoaW50aW5nKSA6PC9iPgorPGJsb2NrcXVvdGU+VGhlIFR5cGUgMSBmb3JtYXQgdGFrZXMgYSBtdWNoIHNpbXBsZXIgYXBwcm9hY2ggOiBlYWNoIGdseXBoCitpcyBtYWRlIG9mIGFuIG91dGxpbmUgYXMgd2VsbCBhcyBzZXZlcmFsIHBpZWNlcyBjYWxsZWQgImhpbnRzIiB3aGljaCBhcmUKK3VzZWQgdG8gZGVzY3JpYmUgc29tZSBpbXBvcnRhbnQgZmVhdHVyZXMgb2YgdGhlIGdseXBoLCBsaWtlIHRoZSBwcmVzZW5jZQorb2Ygc3RlbXMsIHNvbWUgd2lkdGggcmVndWxhcml0aWVzLCBhbmQgdGhlIGxpa2UuIFRoZXJlIGFyZW4ndCBhIGxvdCBvZgoraGludCB0eXBlcywgYW5kIGl0J3MgdXAgdG8gdGhlIGZpbmFsIHJlbmRlcmVyIHRvIGludGVycHJldCB0aGUgaGludHMgaW4KK29yZGVyIHRvIHByb2R1Y2UgYSBmaXR0ZWQgb3V0bGluZS48L2Jsb2NrcXVvdGU+CisKKzxwPjxicj48Yj5hdXRvbWF0aWMgZ3JpZC1maXR0aW5nIDo8L2I+Cis8YmxvY2txdW90ZT5Tb21lIGZvcm1hdHMgc2ltcGx5IGluY2x1ZGUgbm8gY29udHJvbCBpbmZvcm1hdGlvbiB3aXRoIGVhY2gKK2dseXBoIG91dGxpbmUsIGFwYXJ0IG1ldHJpY3MgbGlrZSB0aGUgYWR2YW5jZSB3aWR0aCBhbmQgaGVpZ2h0LiBJdCdzIHRoZW4KK3VwIHRvIHRoZSByZW5kZXJlciB0byAiZ3Vlc3MiIHRoZSBtb3JlIGludGVyZXN0aW5nIGZlYXR1cmVzIG9mIHRoZSBvdXRsaW5lCitpbiBvcmRlciB0byBwZXJmb3JtIHNvbWUgZGVjZW50IGdyaWQtZml0dGluZy48L2Jsb2NrcXVvdGU+Cis8L2Jsb2NrcXVvdGU+Cis8L2Jsb2NrcXVvdGU+CisKKzxjZW50ZXI+Cis8cD48YnI+VGhlIGZvbGxvd2luZyB0YWJsZSBzdW1tYXJpc2VzIHRoZSBwcm9zIGFuZCBjb25zIG9mIGVhY2ggc2NoZW1lCis6PC9jZW50ZXI+Cis8L2Jsb2NrcXVvdGU+CisKKzxjZW50ZXI+PHRhYmxlIEJPUkRFUj0wIFdJRFRIPSI4MCUiIEJHQ09MT1I9IiNDQ0NDQ0MiID4KKzx0ciBCR0NPTE9SPSIjOTk5OTk5Ij4KKzx0ZD4KKzxibG9ja3F1b3RlPgorPGNlbnRlcj48Yj48Zm9udCBjb2xvcj0iIzAwMDAwMCI+R3JpZC1maXR0aW5nIHNjaGVtZTwvZm9udD48L2I+PC9jZW50ZXI+Cis8L2Jsb2NrcXVvdGU+Cis8L3RkPgorCis8dGQ+Cis8YmxvY2txdW90ZT4KKzxjZW50ZXI+PGI+PGZvbnQgY29sb3I9IiMwMDAwMDAiPlByb3M8L2ZvbnQ+PC9iPjwvY2VudGVyPgorPC9ibG9ja3F1b3RlPgorPC90ZD4KKworPHRkPgorPGJsb2NrcXVvdGU+Cis8Y2VudGVyPjxiPjxmb250IGNvbG9yPSIjMDAwMDAwIj5Db25zPC9mb250PjwvYj48L2NlbnRlcj4KKzwvYmxvY2txdW90ZT4KKzwvdGQ+Cis8L3RyPgorCis8dHI+Cis8dGQ+Cis8YmxvY2txdW90ZT4KKzxjZW50ZXI+PGI+PGZvbnQgY29sb3I9IiMwMDAwMDAiPkV4cGxpY2l0PC9mb250PjwvYj48L2NlbnRlcj4KKzwvYmxvY2txdW90ZT4KKzwvdGQ+CisKKzx0ZD4KKzxibG9ja3F1b3RlPgorPGNlbnRlcj48Yj48Zm9udCBjb2xvcj0iIzAwMDAwMCI+UXVhbGl0eTwvZm9udD48L2I+Cis8YnI+PGZvbnQgY29sb3I9IiMwMDAwMDAiPmV4Y2VsbGVuY2UgYXQgc21hbGwgc2l6ZXMgaXMgcG9zc2libGUuIFRoaXMgaXMKK3ZlcnkgaW1wb3J0YW50IGZvciBzY3JlZW4gZGlzcGxheS48L2ZvbnQ+Cis8cD48Yj48Zm9udCBjb2xvcj0iIzAwMDAwMCI+Q29uc2lzdGVuY3k8L2ZvbnQ+PC9iPgorPGJyPjxmb250IGNvbG9yPSIjMDAwMDAwIj5hbGwgcmVuZGVyZXJzIHByb2R1Y2UgdGhlIHNhbWUgZ2x5cGggYml0bWFwcy48L2ZvbnQ+PC9jZW50ZXI+Cis8L2Jsb2NrcXVvdGU+Cis8L3RkPgorCis8dGQ+Cis8YmxvY2txdW90ZT4KKzxjZW50ZXI+PGI+PGZvbnQgY29sb3I9IiMwMDAwMDAiPlNwZWVkPC9mb250PjwvYj4KKzxicj48Zm9udCBjb2xvcj0iIzAwMDAwMCI+aW50ZXByZXRpbmcgYnl0ZWNvZGUgY2FuIGJlIHNsb3cgaWYgdGhlIGdseXBoCitwcm9ncmFtcyBhcmUgY29tcGxleC48L2ZvbnQ+Cis8cD48Yj48Zm9udCBjb2xvcj0iIzAwMDAwMCI+U2l6ZTwvZm9udD48L2I+Cis8YnI+PGZvbnQgY29sb3I9IiMwMDAwMDAiPmdseXBoIHByb2dyYW1zIGNhbiBiZSBsb25nPC9mb250PgorPHA+PGI+PGZvbnQgY29sb3I9IiMwMDAwMDAiPlRlY2huaWNpdHk8L2ZvbnQ+PC9iPgorPGJyPjxmb250IGNvbG9yPSIjMDAwMDAwIj5pdCBpcyBleHRyZW1lbHkgZGlmZmljdWx0IHRvIHdyaXRlIGdvb2QgaGludGluZworcHJvZ3JhbXMuIFZlcnkgZmV3IHRvb2xzIGF2YWlsYWJsZS48L2ZvbnQ+PC9jZW50ZXI+Cis8L2Jsb2NrcXVvdGU+Cis8L3RkPgorPC90cj4KKworPHRyPgorPHRkPgorPGJsb2NrcXVvdGU+Cis8Y2VudGVyPjxiPjxmb250IGNvbG9yPSIjMDAwMDAwIj5JbXBsaWNpdDwvZm9udD48L2I+PC9jZW50ZXI+Cis8L2Jsb2NrcXVvdGU+Cis8L3RkPgorCis8dGQ+Cis8YmxvY2txdW90ZT4KKzxjZW50ZXI+PGI+PGZvbnQgY29sb3I9IiMwMDAwMDAiPlNpemU8L2ZvbnQ+PC9iPgorPGJyPjxmb250IGNvbG9yPSIjMDAwMDAwIj5oaW50cyBhcmUgdXN1YWxseSBtdWNoIHNtYWxsZXIgdGhhbiBleHBsaWNpdAorZ2x5cGggcHJvZ3JhbXMuPC9mb250PgorPHA+PGI+PGZvbnQgY29sb3I9IiMwMDAwMDAiPlNwZWVkPC9mb250PjwvYj4KKzxicj48Zm9udCBjb2xvcj0iIzAwMDAwMCI+Z3JpZC1maXR0aW5nIGlzIHVzdWFsbHkgYSBmYXN0IHByb2Nlc3M8L2ZvbnQ+PC9jZW50ZXI+Cis8L2Jsb2NrcXVvdGU+Cis8L3RkPgorCis8dGQ+Cis8YmxvY2txdW90ZT4KKzxjZW50ZXI+PGI+PGZvbnQgY29sb3I9IiMwMDAwMDAiPlF1YWxpdHk8L2ZvbnQ+PC9iPgorPGJyPjxmb250IGNvbG9yPSIjMDAwMDAwIj5vZnRlbiBxdWVzdGlvbmFibGUgYXQgc21hbGwgc2l6ZXMuIEJldHRlciB3aXRoCithbnRpLWFsaWFzaW5nIHRob3VnaC48L2ZvbnQ+Cis8cD48Yj48Zm9udCBjb2xvcj0iIzAwMDAwMCI+SW5jb25zaXN0ZW5jeTwvZm9udD48L2I+Cis8YnI+PGZvbnQgY29sb3I9IiMwMDAwMDAiPnJlc3VsdHMgY2FuIHZhcnkgYmV0d2VlbiBkaWZmZXJlbnQgcmVuZGVyZXJzLAorb3IgZXZlbiBkaXN0aW5jdCB2ZXJzaW9ucyBvZiB0aGUgc2FtZSBlbmdpbmUuPC9mb250PjwvY2VudGVyPgorPC9ibG9ja3F1b3RlPgorPC90ZD4KKzwvdHI+CisKKzx0cj4KKzx0ZD4KKzxibG9ja3F1b3RlPgorPGNlbnRlcj48Yj48Zm9udCBjb2xvcj0iIzAwMDAwMCI+QXV0b21hdGljPC9mb250PjwvYj48L2NlbnRlcj4KKzwvYmxvY2txdW90ZT4KKzwvdGQ+CisKKzx0ZD4KKzxibG9ja3F1b3RlPgorPGNlbnRlcj48Yj48Zm9udCBjb2xvcj0iIzAwMDAwMCI+U2l6ZTwvZm9udD48L2I+Cis8YnI+PGZvbnQgY29sb3I9IiMwMDAwMDAiPm5vIG5lZWQgZm9yIGNvbnRyb2wgaW5mb3JtYXRpb24sIHJlc3VsdGluZyBpbgorc21hbGxlciBmb250IGZpbGVzLjwvZm9udD4KKzxwPjxiPjxmb250IGNvbG9yPSIjMDAwMDAwIj5TcGVlZDwvZm9udD48L2I+Cis8YnI+PGZvbnQgY29sb3I9IiMwMDAwMDAiPmRlcGVuZHMgb24gdGhlIGdyaWQtZml0dGluZyBhbGdvLlVzdWFsbHkgZmFzdGVyCit0aGFuIGV4cGxpY2l0IGdyaWQtZml0dGluZy48L2ZvbnQ+PC9jZW50ZXI+Cis8L2Jsb2NrcXVvdGU+Cis8L3RkPgorCis8dGQ+Cis8YmxvY2txdW90ZT4KKzxjZW50ZXI+PGI+PGZvbnQgY29sb3I9IiMwMDAwMDAiPlF1YWxpdHk8L2ZvbnQ+PC9iPgorPGJyPjxmb250IGNvbG9yPSIjMDAwMDAwIj5vZnRlbiBxdWVzdGlvbmFibGUgYXQgc21hbGwgc2l6ZXMuIEJldHRlciB3aXRoCithbnRpLWFsaWFzaW5nIHRob3VnaDwvZm9udD4KKzxwPjxiPjxmb250IGNvbG9yPSIjMDAwMDAwIj5TcGVlZDwvZm9udD48L2I+Cis8YnI+PGZvbnQgY29sb3I9IiMwMDAwMDAiPmRlcGVuZHMgb24gdGhlIGdyaWQtZml0dGluZyBhbGdvLjwvZm9udD4KKzxwPjxiPjxmb250IGNvbG9yPSIjMDAwMDAwIj5JbmNvbnNpc3RlbmN5PC9mb250PjwvYj4KKzxicj48Zm9udCBjb2xvcj0iIzAwMDAwMCI+cmVzdWx0cyBjYW4gdmFyeSBiZXR3ZWVuIGRpZmZlcmVudCByZW5kZXJlcnMsCitvciBldmVuIGRpc3RpbmN0IHZlcnNpb25zIG9mIHRoZSBzYW1lIGVuZ2luZS48L2ZvbnQ+PC9jZW50ZXI+Cis8L2Jsb2NrcXVvdGU+Cis8L3RkPgorPC90cj4KKzwvdGFibGU+PC9jZW50ZXI+Cis8L2Jsb2NrcXVvdGU+CisKKzxociBXSURUSD0iMTAwJSI+Cis8aDI+CitJSUkuIEdseXBoIG1ldHJpY3M8L2gyPgorCis8YmxvY2txdW90ZT4KKzxoMz4KKzEuIEJhc2VsaW5lLCBQZW5zIGFuZCBMYXlvdXRzPC9oMz4KK1RoZSBiYXNlbGluZSBpcyBhbiBpbWFnaW5hcnkgbGluZSB0aGF0IGlzIHVzZWQgdG8gImd1aWRlIiBnbHlwaHMgd2hlbiByZW5kZXJpbmcKK3RleHQuIEl0IGNhbiBiZSBob3Jpem9udGFsIChlLmcuIFJvbWFuLCBDeXJpbGxpYywgQXJhYmljLCBldGMuKSBvciB2ZXJ0aWNhbAorKGUuZy4gQ2hpbmVzZSwgSmFwYW5lc2UsIEtvcmVhbiwgZXRjKS4gTW9yZW92ZXIsIHRvIHJlbmRlciB0ZXh0LCBhIHZpcnR1YWwKK3BvaW50LCBsb2NhdGVkIG9uIHRoZSBiYXNlbGluZSwgY2FsbGVkIHRoZSAicGVuIHBvc2l0aW9uIiBvciAib3JpZ2luIiwKK2lzIHVzZWQgdG8gbG9jYXRlIGdseXBocy4KKzxwPkVhY2ggbGF5b3V0IHVzZXMgYSBkaWZmZXJlbnQgY29udmVudGlvbiBmb3IgZ2x5cGggcGxhY2VtZW50OgorPGJyPiZuYnNwOworPGJsb2NrcXVvdGU+Cis8bGk+Cit3aXRoIGhvcml6b250YWwgbGF5b3V0LCBnbHlwaHMgc2ltcGx5ICJyZXN0IiBvbiB0aGUgYmFzZWxpbmUuIFRleHQgaXMgcmVuZGVyZWQKK2J5IGluY3JlbWVudGluZyB0aGUgcGVuIHBvc2l0aW9uLCBlaXRoZXIgdG8gdGhlIHJpZ2h0IG9yIHRvIHRoZSBsZWZ0LjwvbGk+Cis8L2Jsb2NrcXVvdGU+Cis8L2Jsb2NrcXVvdGU+CisKKzx1bD4KKzx1bD50aGUgZGlzdGFuY2UgYmV0d2VlbiB0d28gc3VjY2Vzc2l2ZSBwZW4gcG9zaXRpb25zIGlzIGdseXBoLXNwZWNpZmljCithbmQgaXMgY2FsbGVkIHRoZSAiYWR2YW5jZSB3aWR0aCIuIE5vdGUgdGhhdCBpdHMgdmFsdWUgaXMgX2Fsd2F5c18gcG9zaXRpdmUsCitldmVuIGZvciByaWdodC10by1sZWZ0IG9yaWVudGVkIGFscGhhYmV0cywgbGlrZSBBcmFiaWMuIFRoaXMgaW50cm9kdWNlcworc29tZSBkaWZmZXJlbmNlcyBpbiB0aGUgd2F5IHRleHQgaXMgcmVuZGVyZWQuCis8cD5JTVBPUlRBTlQgTk9URTombmJzcDsgVGhlIHBlbiBwb3NpdGlvbiBpcyBhbHdheXMgcGxhY2VkIG9uIHRoZSBiYXNlbGluZS48L3VsPgorCis8Y2VudGVyPjxpbWcgU1JDPSJJbWFnZTEuZ2lmIiBoZWlnaHQ9MTc5IHdpZHRoPTQ1OD48L2NlbnRlcj4KKworPHVsPgorPGxpPgord2l0aCBhIHZlcnRpY2FsIGxheW91dCwgZ2x5cGhzIGFyZSBjZW50ZXJlZCBhcm91bmQgdGhlIGJhc2VsaW5lOjwvbGk+Cis8L3VsPgorCis8Y2VudGVyPjxpbWcgU1JDPSJJbWFnZTIuZ2lmIiBoZWlnaHQ9Mjc1IHdpZHRoPTE2Mj48L2NlbnRlcj4KKworPHA+PGJyPgorPGgzPgorMi4gVHlwb2dyYXBoaWMgbWV0cmljcyBhbmQgYm91bmRpbmcgYm94ZXM8L2gzPgorCis8dWw+QSB2YXJpb3VzIG51bWJlciBvZiBmYWNlIG1ldHJpY3MgYXJlIGRlZmluZWQgZm9yIGFsbCBnbHlwaHMgaW4gYSBnaXZlbgorZm9udC4KKzxwPjxiPnRoZSBhc2NlbnQ8L2I+Cis8dWw+dGhpcyBpcyB0aGUgZGlzdGFuY2UgZnJvbSB0aGUgYmFzZWxpbmUgdG8gdGhlIGhpZ2hlc3QvdXBwZXIgZ3JpZCBjb29yZGluYXRlCit1c2VkIHRvIHBsYWNlIGFuIG91dGxpbmUgcG9pbnQuIEl0IGlzIGEgcG9zaXRpdmUgdmFsdWUsIGR1ZSB0byB0aGUgZ3JpZCdzCitvcmllbnRhdGlvbiB3aXRoIHRoZSBZIGF4aXMgdXB3YXJkcy48L3VsPgorCis8cD48YnI+PGI+dGhlIGRlc2NlbnQ8L2I+Cis8dWw+dGhlIGRpc3RhbmNlIGZyb20gdGhlIGJhc2VsaW5lIHRvIHRoZSBsb3dlc3QgZ3JpZCBjb29yZGluYXRlIHVzZWQgdG8KK3BsYWNlIGFuIG91dGxpbmUgcG9pbnQuIFRoaXMgaXMgYSBuZWdhdGl2ZSB2YWx1ZSwgZHVlIHRvIHRoZSBncmlkJ3Mgb3JpZW50YXRpb24uPC91bD4KKworPHA+PGJyPjxiPnRoZSBsaW5lZ2FwPC9iPgorPHVsPnRoZSBkaXN0YW5jZSB0aGF0IG11c3QgYmUgcGxhY2VkIGJldHdlZW4gdHdvIGxpbmVzIG9mIHRleHQuIFRoZSBiYXNlbGluZS10by1iYXNlbGluZQorZGlzdGFuY2Ugc2hvdWxkIGJlIGNvbXB1dGVkIGFzOgorPGNlbnRlcj4KKzxwPjx0dD5hc2NlbnQgLSBkZXNjZW50ICsgbGluZWdhcDwvdHQ+PC9jZW50ZXI+CitpZiB5b3UgdXNlIHRoZSB0eXBvZ3JhcGhpYyB2YWx1ZXMuPC91bD4KK090aGVyLCBzaW1wbGVyIG1ldHJpY3MgYXJlOgorPHA+PGI+dGhlIGdseXBoJ3MgYm91bmRpbmcgYm94PC9iPiwgYWxzbyBjYWxsZWQgIjxiPmJib3g8L2I+IgorPHVsPnRoaXMgaXMgYW4gaW1hZ2luYXJ5IGJveCB0aGF0IGVuY2xvc2VzIGFsbCBnbHlwaHMgZnJvbSB0aGUgZm9udCwgYXMKK3RpZ2h0bHkgYXMgcG9zc2libGUuIEl0IGlzIHJlcHJlc2VudGVkIGJ5IGZvdXIgZmllbGRzLCBuYW1lbHkgPHR0PnhNaW48L3R0PiwKKzx0dD55TWluPC90dD4sCis8dHQ+eE1heDwvdHQ+LAorYW5kIDx0dD55TWF4PC90dD4sIHRoYXQgY2FuIGJlIGNvbXB1dGVkIGZvciBhbnkgb3V0bGluZS4gVGhlaXIgdmFsdWVzIGNhbgorYmUgaW4gZm9udCB1bml0cyAoaWYgbWVhc3VyZWQgaW4gdGhlIG9yaWdpbmFsIG91dGxpbmUpIG9yIGluIGZyYWN0aW9uYWwvaW50ZWdlcgorcGl4ZWwgdW5pdHMgKHdoZW4gbWVhc3VyZWQgb24gc2NhbGVkIG91dGxpbmVzKS4KKzxwPk5vdGUgdGhhdCBpZiBpdCB3YXNuJ3QgZm9yIGdyaWQtZml0dGluZywgeW91IHdvdWxkbid0IG5lZWQgdG8ga25vdyBhCitib3gncyBjb21wbGV0ZSB2YWx1ZXMsIGJ1dCBvbmx5IGl0cyBkaW1lbnNpb25zIHRvIGtub3cgaG93IGJpZyBpcyBhIGdseXBoCitvdXRsaW5lL2JpdG1hcC4gSG93ZXZlciwgY29ycmVjdCByZW5kZXJpbmcgb2YgaGludGVkIGdseXBocyBuZWVkcyB0aGUgcHJlc2VydmF0aW9uCitvZiBpbXBvcnRhbnQgZ3JpZCBhbGlnbm1lbnQgb24gZWFjaCBnbHlwaCB0cmFuc2xhdGlvbi9wbGFjZW1lbnQgb24gdGhlCitiYXNlbGluZS48L3VsPgorPGI+dGhlIGludGVybmFsIGxlYWRpbmc8L2I+Cis8dWw+dGhpcyBjb25jZXB0IGNvbWVzIGRpcmVjdGx5IGZyb20gdGhlIHdvcmxkIG9mIHRyYWRpdGlvbmFsIHR5cG9ncmFwaHkuCitJdCByZXByZXNlbnRzIHRoZSBhbW91bnQgb2Ygc3BhY2Ugd2l0aGluIHRoZSAibGVhZGluZyIgd2hpY2ggaXMgcmVzZXJ2ZWQKK2ZvciBnbHlwaCBmZWF0dXJlcyB0aGF0IGxheSBvdXRzaWRlIG9mIHRoZSBFTSBzcXVhcmUgKGxpa2UgYWNjZW50dWF0aW9uKS4KK0l0IHVzdWFsbHkgY2FuIGJlIGNvbXB1dGVkIGFzOgorPGNlbnRlcj4KKzxwPjx0dD5pbnRlcm5hbCBsZWFkaW5nID0gYXNjZW50IC0gZGVzY2VudCAtIEVNX3NpemU8L3R0PjwvY2VudGVyPgorPC91bD4KKzxiPnRoZSBleHRlcm5hbCBsZWFkaW5nPC9iPgorPHVsPnRoaXMgaXMgYW5vdGhlciBuYW1lIGZvciB0aGUgbGluZSBnYXAuPC91bD4KKzwvdWw+CisKKzxoMz4KKzMuIEJlYXJpbmdzIGFuZCBBZHZhbmNlczwvaDM+CisKKzx1bD5FYWNoIGdseXBoIGhhcyBhbHNvIGRpc3RhbmNlcyBjYWxsZWQgImJlYXJpbmdzIiBhbmQgImFkdmFuY2VzIi4gVGhlaXIKK2RlZmluaXRpb24gaXMgY29uc3RhbnQsIGJ1dCB0aGVpciB2YWx1ZXMgZGVwZW5kIG9uIHRoZSBsYXlvdXQsIGFzIHRoZSBzYW1lCitnbHlwaCBjYW4gYmUgdXNlZCB0byByZW5kZXIgdGV4dCBlaXRoZXIgaG9yaXpvbnRhbGx5IG9yIHZlcnRpY2FsbHk6Cis8cD48Yj50aGUgbGVmdCBzaWRlIGJlYXJpbmc6IGEuay5hLiBiZWFyaW5nWDwvYj4KKzx1bD50aGlzIGlzIHRoZSBob3Jpem9udGFsIGRpc3RhbmNlIGZyb20gdGhlIGN1cnJlbnQgcGVuIHBvc2l0aW9uIHRvIHRoZQorZ2x5cGgncyBsZWZ0IGJib3ggZWRnZS4gSXQgaXMgcG9zaXRpdmUgZm9yIGhvcml6b250YWwgbGF5b3V0cywgYW5kIG1vc3QKK2dlbmVyYWxseSBuZWdhdGl2ZSBmb3IgdmVydGljYWwgb25lLjwvdWw+CisKKzxwPjxicj48Yj50aGUgdG9wIHNpZGUgYmVhcmluZzogYS5rLmEuIGJlYXJpbmdZPC9iPgorPHVsPnRoaXMgaXMgdGhlIHZlcnRpY2FsIGRpc3RhbmNlIGZyb20gdGhlIGJhc2VsaW5lIHRvIHRoZSB0b3Agb2YgdGhlIGdseXBoJ3MKK2Jib3guIEl0IGlzIHVzdWFsbHkgcG9zaXRpdmUgZm9yIGhvcml6b250YWwgbGF5b3V0cywgYW5kIG5lZ2F0aXZlIGZvciB2ZXJ0aWNhbAorb25lczwvdWw+CisKKzxwPjxicj48Yj50aGUgYWR2YW5jZSB3aWR0aDogYS5rLmEuIGFkdmFuY2VYPC9iPgorPHVsPmlzIHRoZSBob3Jpem9udGFsIGRpc3RhbmNlIHRoZSBwZW4gcG9zaXRpb24gbXVzdCBiZSBpbmNyZW1lbnRlZCAoZm9yCitsZWZ0LXRvLXJpZ2h0IHdyaXRpbmcpIG9yIGRlY3JlbWVudGVkIChmb3IgcmlnaHQtdG8tbGVmdCB3cml0aW5nKSBieSBhZnRlcgorZWFjaCBnbHlwaCBpcyByZW5kZXJlZCB3aGVuIHByb2Nlc3NpbmcgdGV4dC4gSXQgaXMgYWx3YXlzIHBvc2l0aXZlIGZvcgoraG9yaXpvbnRhbCBsYXlvdXRzLCBhbmQgbnVsbCBmb3IgdmVydGljYWwgb25lcy48L3VsPgorCis8cD48YnI+PGI+dGhlIGFkdmFuY2UgaGVpZ2h0OiBhLmsuYS4gYWR2YW5jZVk8L2I+Cis8dWw+aXMgdGhlIHZlcnRpY2FsIGRpc3RhbmNlIHRoZSBwZW4gcG9zaXRpb24gbXVzdCBiZSBkZWNyZW1lbnRlZCBieSBhZnRlcgorZWFjaCBnbHlwaCBpcyByZW5kZXJlZC4gSXQgaXMgYWx3YXlzIG51bGwgZm9yIGhvcml6b250YWwgbGF5b3V0cywgYW5kIHBvc2l0aXZlCitmb3IgdmVydGljYWwgbGF5b3V0cy48L3VsPgorCis8cD48YnI+PGI+dGhlIGdseXBoIHdpZHRoPC9iPgorPHVsPnRoaXMgaXMgc2ltcGx5IHRoZSBnbHlwaCdzIGhvcml6b250YWwgZXh0ZW50LiBNb3JlIHNpbXBseSBpdCBpcyAoYmJveC54TWF4LWJib3gueE1pbikKK2ZvciB1bnNjYWxlZCBmb250IGNvb3JkaW5hdGVzLiBGb3Igc2NhbGVkIGdseXBocywgaXRzIGNvbXB1dGF0aW9uIHJlcXVlc3RzCitzcGVjaWZpYyBjYXJlLCBkZXNjcmliZWQgaW4gdGhlIGdyaWQtZml0dGluZyBjaGFwdGVyIGJlbG93LjwvdWw+CisKKzxwPjxicj48Yj50aGUgZ2x5cGggaGVpZ2h0PC9iPgorPHVsPnRoaXMgaXMgc2ltcGx5IHRoZSBnbHlwaCdzIHZlcnRpY2FsIGV4dGVudC4gTW9yZSBzaW1wbHksIGl0IGlzIChiYm94LnlNYXgtYmJveC55TWluKQorZm9yIHVuc2NhbGVkIGZvbnQgY29vcmRpbmF0ZXMuIEZvciBzY2FsZWQgZ2x5cGhzLCBpdHMgY29tcHV0YXRpb24gcmVxdWVzdHMKK3NwZWNpZmljIGNhcmUsIGRlc2NyaWJlZCBpbiB0aGUgZ3JpZC1maXR0aW5nIGNoYXB0ZXIgYmVsb3cuPC91bD4KKworPHA+PGJyPjxiPnRoZSByaWdodCBzaWRlIGJlYXJpbmc8L2I+Cis8dWw+aXMgb25seSB1c2VkIGZvciBob3Jpem9udGFsIGxheW91dHMgdG8gZGVzY3JpYmUgdGhlIGRpc3RhbmNlIGZyb20gdGhlCitiYm94J3MgcmlnaHQgZWRnZSB0byB0aGUgYWR2YW5jZSB3aWR0aC4gSXQgaXMgaW4gbW9zdCBjYXNlcyBhIG5vbi1uZWdhdGl2ZQorbnVtYmVyLjwvdWw+CisKKzxjZW50ZXI+PHR0PmFkdmFuY2Vfd2lkdGggLSBsZWZ0X3NpZGVfYmVhcmluZyAtICh4TWF4LXhNaW4pPC90dD48L2NlbnRlcj4KKworPHA+SGVyZSBpcyBhIHBpY3R1cmUgZ2l2aW5nIGFsbCB0aGUgZGV0YWlscyBmb3IgaG9yaXpvbnRhbCBtZXRyaWNzIDoKKzxjZW50ZXI+Cis8cD48aW1nIFNSQz0iSW1hZ2UzLmdpZiIgaGVpZ2h0PTI1MyB3aWR0aD0zODg+PC9jZW50ZXI+CisKKzxwPkFuZCBoZXJlIGlzIGFub3RoZXIgb25lIGZvciB0aGUgdmVydGljYWwgbWV0cmljcyA6Cis8Y2VudGVyPgorPHA+PGltZyBTUkM9IkltYWdlNC5naWYiIGhlaWdodD0yNzggd2lkdGg9Mjk0PjwvY2VudGVyPgorPC91bD4KKworPGgzPgorNC4gVGhlIGVmZmVjdHMgb2YgZ3JpZC1maXR0aW5nPC9oMz4KKworPHVsPkJlY2F1c2UgaGludGluZyBhbGlnbnMgdGhlIGdseXBoJ3MgY29udHJvbCBwb2ludHMgdG8gdGhlIHBpeGVsIGdyaWQsCit0aGlzIHByb2Nlc3Mgc2xpZ2h0bHkgbW9kaWZpZXMgdGhlIGRpbWVuc2lvbnMgb2YgY2hhcmFjdGVyIGltYWdlcyBpbiB3YXlzCit0aGF0IGRpZmZlciBmcm9tIHNpbXBsZSBzY2FsaW5nLgorPHA+Rm9yIGV4YW1wbGUsIHRoZSBpbWFnZSBvZiB0aGUgbG93ZXJjYXNlICJtIiBsZXR0ZXIgc29tZXRpbWVzIGZpdHMgYQorc3F1YXJlIGluIHRoZSBtYXN0ZXIgZ3JpZC4gSG93ZXZlciwgdG8gbWFrZSBpdCByZWFkYWJsZSBhdCBzbWFsbCBwaXhlbAorc2l6ZXMsIGhpbnRpbmcgdGVuZHMgdG8gZW5sYXJnZSBpdHMgc2NhbGVkIG91dGxpbmUgaW4gb3JkZXIgdG8ga2VlcCBpdHMKK3RocmVlIGxlZ3MgZGlzdGluY3RseSB2aXNpYmxlLCByZXN1bHRpbmcgaW4gYSBsYXJnZXIgY2hhcmFjdGVyIGJpdG1hcC4KKzxwPlRoZSBnbHlwaCBtZXRyaWNzIGFyZSBhbHNvIGluZmx1ZW5jZWQgYnkgdGhlIGdyaWQtZml0dGluZyBwcm9jZXNzLiBNYWlubHkKK2JlY2F1c2UgOgorPGJyPiZuYnNwOworPHVsPgorPGxpPgorVGhlIGltYWdlJ3Mgd2lkdGggYW5kIGhlaWdodCBhcmUgYWx0ZXJlZC4gRXZlbiBpZiB0aGlzIGlzIG9ubHkgYnkgb25lIHBpeGVsLAoraXQgY2FuIG1ha2UgYSBiaWcgZGlmZmVyZW5jZSBhdCBzbWFsbCBwaXhlbCBzaXplczwvbGk+CisKKzxsaT4KK1RoZSBpbWFnZSdzIGJvdW5kaW5nIGJveCBpcyBtb2RpZmllZCwgdGh1cyBtb2RpZnlpbmcgdGhlIGJlYXJpbmdzPC9saT4KKworPGxpPgorVGhlIGFkdmFuY2VzIG11c3QgYmUgdXBkYXRlZC4gRm9yIGV4YW1wbGUsIHRoZSBhZHZhbmNlIHdpZHRoIG11c3QgYmUgaW5jcmVtZW50ZWQKK3doZW4gdGhlIGhpbnRlZCBiaXRtYXAgaXMgbGFyZ2VyIHRoYW4gdGhlIHNjYWxlZCBvbmUsIHRvIHJlZmxlY3QgdGhlIGF1Z21lbnRlZAorZ2x5cGggd2lkdGguPC9saT4KKzwvdWw+CisKKzxwPjxicj5Ob3RlIGFsc28gdGhhdCA6Cis8YnI+Jm5ic3A7Cis8dWw+Cis8bGk+CitCZWNhdXNlIG9mIGhpbnRpbmcsIHNpbXBseSBzY2FsaW5nIHRoZSBmb250IGFzY2VudCBvciBkZXNjZW50IG1pZ2h0IG5vdAorZ2l2ZSBjb3JyZWN0IHJlc3VsdHMuIEEgc2ltcGxlIHNvbHV0aW9uIGNvbnNpc3RzIGluIGtlZXBpbmcgdGhlIGNlaWxpbmcKK29mIHRoZSBzY2FsZWQgYXNjZW50LCBhbmQgZmxvb3Igb2YgdGhlIHNjYWxlZCBkZXNjZW50LjwvbGk+Cis8L3VsPgorCis8dWw+Cis8bGk+CitUaGVyZSBpcyBubyBlYXN5IHdheSB0byBnZXQgdGhlIGhpbnRlZCBnbHlwaCBhbmQgYWR2YW5jZSB3aWR0aHMgb2YgYSByYW5nZQorb2YgZ2x5cGhzLCBhcyBoaW50aW5nIHdvcmtzIGRpZmZlcmVudGx5IG9uIGVhY2ggb3V0bGluZS4gVGhlIG9ubHkgc29sdXRpb24KK2lzIHRvIGhpbnQgZWFjaCBnbHlwaCBzZXBhcmF0ZWx5IGFuZCByZWNvcmQgdGhlIHJldHVybmVkIHZhbHVlcy4gU29tZSBmb3JtYXRzLAorbGlrZSBUcnVlVHlwZSwgZXZlbiBpbmNsdWRlIGEgdGFibGUgb2YgcHJlLWNvbXB1dGVkIHZhbHVlcyBmb3IgYSBzbWFsbAorc2V0IG9mIGNvbW1vbiBjaGFyYWN0ZXIgcGl4ZWwgc2l6ZXMuPC9saT4KKzwvdWw+CisKKzx1bD4KKzxsaT4KK0hpbnRpbmcgZGVwZW5kcyBvbiB0aGUgZmluYWwgY2hhcmFjdGVyIHdpZHRoIGFuZCBoZWlnaHQgaW4gcGl4ZWxzLCB3aGljaAorbWVhbnMgdGhhdCBpdCBpcyBoaWdobHkgcmVzb2x1dGlvbi1kZXBlbmRlbnQuIFRoaXMgcHJvcGVydHkgbWFrZXMgY29ycmVjdAorV1lTSVdZRyBsYXlvdXRzIGRpZmZpY3VsdCB0byBpbXBsZW1lbnQuPC9saT4KKzwvdWw+CisKKzxwPjxicj48Yj5JTVBPUlRBTlQgTk9URTo8L2I+Cis8YnI+UGVyZm9ybWluZyAyRCB0cmFuc2Zvcm1zIG9uIGdseXBoIG91dGxpbmVzIGlzIHZlcnkgZWFzeSB3aXRoIEZyZWVUeXBlLgorSG93ZXZlciwgd2hlbiB1c2luZyB0cmFuc2xhdGlvbiBvbiBhIGhpbnRlZCBvdXRsaW5lcywgb25lIHNob3VsZCBhd2F5cwordGFrZSBjYXJlIG9mJm5ic3A7IDxiPmV4Y2x1c2l2ZWx5IHVzaW5nIGludGVnZXIgcGl4ZWwgZGlzdGFuY2VzPC9iPiAod2hpY2gKK21lYW5zIHRoYXQgdGhlIHBhcmFtZXRlcnMgdG8gdGhlIEZUX1RyYW5zbGF0ZV9PdXRsaW5lIEFQSSBzaG91bGQgYWxsIGJlCittdWx0aXBsZXMgb2YgNjQsIGFzIHRoZSBwb2ludCBjb29yZGluYXRlcyBhcmUgaW4gMjYuNiBmaXhlZCBmbG9hdCBmb3JtYXQpLgorPHA+PGI+T3RoZXJ3aXNlPC9iPiwgdGhlIHRyYW5zbGF0aW9uIHdpbGwgc2ltcGx5IDxiPnJ1aW4gdGhlIGhpbnRlcidzIHdvcms8L2I+LAorcmVzdWx0aW5nIGluIGEgdmVyeSBsb3cgcXVhbGl0eSBiaXRtYXBzLgorPGJyPiZuYnNwOworPGJyPiZuYnNwOzwvdWw+CisKKzxoMz4KKyZuYnNwOzUuIFRleHQgd2lkdGhzIGFuZCBib3VuZGluZyBib3ggOjwvaDM+CisKKzx1bD5BcyBzZWVuIGJlZm9yZSwgdGhlICJvcmlnaW4iIG9mIGEgZ2l2ZW4gZ2x5cGggY29ycmVzcG9uZHMgdG8gdGhlIHBvc2l0aW9uCitvZiB0aGUgcGVuIG9uIHRoZSBiYXNlbGluZS4gSXQgaXMgbm90IG5lY2Vzc2FyaWx5IGxvY2F0ZWQgb24gb25lIG9mIHRoZQorZ2x5cGgncyBib3VuZGluZyBib3ggY29ybmVycywgdW5saWtlIG1hbnkgdHlwaWNhbCBiaXRtYXBwZWQgZm9udCBmb3JtYXRzLgorSW4gc29tZSBjYXNlcywgdGhlIG9yaWdpbiBjYW4gYmUgb3V0IG9mIHRoZSBib3VuZGluZyBib3gsIGluIG90aGVycywgaXQKK2NhbiBiZSB3aXRoaW4gaXQsIGRlcGVuZGluZyBvbiB0aGUgc2hhcGUgb2YgdGhlIGdpdmVuIGdseXBoLgorPHA+TGlrZXdpc2UsIHRoZSBnbHlwaCdzICJhZHZhbmNlIHdpZHRoIiBpcyB0aGUgaW5jcmVtZW50IHRvIGFwcGx5IHRvIHRoZQorcGVuIHBvc2l0aW9uIGR1cmluZyBsYXlvdXQsIGFuZCBpcyBub3QgcmVsYXRlZCB0byB0aGUgZ2x5cGgncyAid2lkdGgiLAord2hpY2ggcmVhbGx5IGlzIHRoZSBnbHlwaCdzIGJvdW5kaW5nIHdpZHRoLgorPGJyPiZuYnNwOworPHA+VGhlIHNhbWUgY29udmVudGlvbnMgYXBwbHkgdG8gc3RyaW5ncyBvZiB0ZXh0LiBUaGlzIG1lYW5zIHRoYXQgOgorPGJyPiZuYnNwOworPHVsPgorPHVsPgorPGxpPgorVGhlIGJvdW5kaW5nIGJveCBvZiBhIGdpdmVuIHN0cmluZyBvZiB0ZXh0IGRvZXNuJ3QgbmVjZXNzYXJpbHkgY29udGFpbgordGhlIHRleHQgY3Vyc29yLCBub3IgaXMgdGhlIGxhdHRlciBsb2NhdGVkIG9uIG9uZSBvZiBpdHMgY29ybmVycy48L2xpPgorPC91bD4KKworPHVsPgorPGxpPgorVGhlIHN0cmluZydzIGFkdmFuY2Ugd2lkdGggaXNuJ3QgcmVsYXRlZCB0byBpdHMgYm91bmRpbmcgYm94J3MgZGltZW5zaW9ucy4KK0VzcGVjaWFsbHkgaWYgaXQgY29udGFpbnMgYmVnaW5uaW5nIGFuZCB0ZXJtaW5hbCBzcGFjZXMgb3IgdGFicy48L2xpPgorPC91bD4KKworPHVsPgorPGxpPgorRmluYWxseSwgYWRkaXRpb25hbCBwcm9jZXNzaW5nIGxpa2Uga2VybmluZyBjcmVhdGVzIHN0cmluZ3Mgb2YgdGV4dCB3aG9zZQorZGltZW5zaW9ucyBhcmUgbm90IGRpcmVjdGx5IHJlbGF0ZWQgdG8gdGhlIHNpbXBsZSBqdXh0YXBvc2l0aW9uIG9mIGluZGl2aWR1YWwKK2dseXBoIG1ldHJpY3MuIEZvciBleGFtcGxlLCB0aGUgYWR2YW5jZSB3aWR0aCBvZiAiVkEiIGlzbid0IHRoZSBzdW0gb2YKK3RoZSBhZHZhbmNlcyBvZiAiViIgYW5kICJBIiB0YWtlbiBzZXBhcmF0ZWx5LjwvbGk+Cis8L3VsPgorPC91bD4KKzwvdWw+Cis8L3VsPgorCis8aHIgV0lEVEg9IjEwMCUiPgorPGgyPgorJm5ic3A7SVYuIEtlcm5pbmc8L2gyPgorCis8YmxvY2txdW90ZT5UaGUgdGVybSAna2VybmluZycgcmVmZXJzIHRvIHNwZWNpZmljIGluZm9ybWF0aW9uIHVzZWQgdG8gYWRqdXN0Cit0aGUgcmVsYXRpdmUgcG9zaXRpb25zIG9mIGNvaW5jaWRlbnQgZ2x5cGhzIGluIGEgc3RyaW5nIG9mIHRleHQuIFRoaXMgc2VjdGlvbgorZGVzY3JpYmVzIHNldmVyYWwgdHlwZXMgb2Yga2VybmluZyBpbmZvcm1hdGlvbiwgYXMgd2VsbCBhcyB0aGUgd2F5IHRvIHByb2Nlc3MKK3RoZW0gd2hlbiBwZXJmb3JtaW5nIHRleHQgbGF5b3V0LgorPGJyPiZuYnNwOworPGgzPgorMS4gS2VybmluZyBwYWlyczwvaDM+CisKKzxibG9ja3F1b3RlPktlcm5pbmcgY29uc2lzdHMgaW4gbW9kaWZ5aW5nIHRoZSBzcGFjaW5nIGJldHdlZW4gdHdvIHN1Y2Nlc3NpdmUKK2dseXBocyBhY2NvcmRpbmcgdG8gdGhlaXIgb3V0bGluZXMuIEZvciBleGFtcGxlLCBhICJUIiBhbmQgYSAieSIgY2FuIGJlCitlYXNpbHkgbW92ZWQgY2xvc2VyLCBhcyB0aGUgdG9wIG9mIHRoZSAieSIgZml0cyBuaWNlbHkgdW5kZXIgdGhlICJUIidzCit1cHBlciByaWdodCBiYXIuCis8cD5XaGVuIGxheWluZyBvdXQgdGV4dCB3aXRoIG9ubHkgdGhlaXIgc3RhbmRhcmQgd2lkdGhzLCBzb21lIGNvbnNlY3V0aXZlCitnbHlwaHMgc29tZXRpbWVzIHNlZW0gYSBiaXQgdG9vIGNsb3NlIG9yIHRvbyBkaXN0YW50LiBGb3IgZXhhbXBsZSwgdGhlCitzcGFjZSBiZXR3ZWVuIHRoZSAnQScgYW5kIHRoZSAnVicgaW4gdGhlIGZvbGxvd2luZyB3b3JkIHNlZW1zIGEgbGl0dGxlCit3aWRlciB0aGFuIG5lZWRlZC4KKzxjZW50ZXI+Cis8cD48aW1nIFNSQz0iYnJhdm9fdW5rZXJuZWQuZ2lmIiBoZWlnaHQ9Mzcgd2lkdGg9MTE2PjwvY2VudGVyPgorCis8cD5Db21wYXJlIHRoaXMgdG8gdGhlIHNhbWUgd29yZCwgd2hlbiB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGVzZSB0d28gbGV0dGVycworaGFzIGJlZW4gc2xpZ2h0bHkgcmVkdWNlZCA6Cis8Y2VudGVyPgorPHA+PGltZyBTUkM9ImJyYXZvX2tlcm5lZC5naWYiIGhlaWdodD0zNyB3aWR0aD0xMDc+PC9jZW50ZXI+CisKKzxwPkFzIHlvdSBjYW4gc2VlLCB0aGlzIGFkanVzdG1lbnQgY2FuIG1ha2UgYSBncmVhdCBkaWZmZXJlbmNlLiBTb21lIGZvbnQKK2ZhY2VzIHRodXMgaW5jbHVkZSBhIHRhYmxlIGNvbnRhaW5pbmcga2VybmluZyBkaXN0YW5jZXMgZm9yIGEgc2V0IG9mIGdpdmVuCitnbHlwaCBwYWlycywgdXNlZCBkdXJpbmcgdGV4dCBsYXlvdXQuIE5vdGUgdGhhdCA6Cis8YnI+Jm5ic3A7Cis8YmxvY2txdW90ZT4KKzx1bD4KKzxsaT4KK1RoZSBwYWlycyBhcmUgb3JkZXJlZCwgaS5lLiB0aGUgc3BhY2UgZm9yIHBhaXIgKEEsVikgaXNuJ3QgbmVjZXNzYXJpbHkKK3RoZSBzcGFjZSBmb3IgcGFpciAoVixBKS4gVGhleSBhbHNvIGluZGV4IGdseXBocywgYW5kIG5vdCBjaGFyYWN0ZXJzLjwvbGk+Cis8L3VsPgorCis8dWw+Cis8bGk+CitLZXJuaW5nIGRpc3RhbmNlcyBjYW4gYmUgZXhwcmVzc2VkIGluIGhvcml6b250YWwgb3IgdmVydGljYWwgZGlyZWN0aW9ucywKK2RlcGVuZGluZyBvbiBsYXlvdXQgYW5kL29yIHNjcmlwdC4gRm9yIGV4YW1wbGUsIHNvbWUgaG9yaXpvbnRhbCBsYXlvdXRzCitsaWtlIGFyYWJpYyBjYW4gbWFrZSB1c2Ugb2YgdmVydGljYWwga2VybmluZyBhZGp1c3RtZW50cyBiZXR3ZWVuIHN1Y2Nlc3NpdmUKK2dseXBocy4gQSB2ZXJ0aWNhbCBzY3JpcHQgY2FuIGhhdmUgdmVydGljYWwga2VybmluZyBkaXN0YW5jZXMuPC9saT4KKzwvdWw+CisKKzx1bD4KKzxsaT4KK0tlcm5pbmcgZGlzdGFuY2VzIGFyZSBleHByZXNzZWQgaW4gZ3JpZCB1bml0cy4gVGhleSBhcmUgdXN1YWxseSBvcmllbnRlZAoraW4gdGhlIFggYXhpcywgd2hpY2ggbWVhbnMgdGhhdCBhIG5lZ2F0aXZlIHZhbHVlIGluZGljYXRlcyB0aGF0IHR3byBnbHlwaHMKK211c3QgYmUgc2V0IGNsb3NlciBpbiBhIGhvcml6b250YWwgbGF5b3V0LjwvbGk+Cis8L3VsPgorPC9ibG9ja3F1b3RlPgorPC9ibG9ja3F1b3RlPgorCis8aDM+CisyLiBBcHBseWluZyBrZXJuaW5nPC9oMz4KKworPGJsb2NrcXVvdGU+QXBwbHlpbmcga2VybmluZyB3aGVuIHJlbmRlcmluZyB0ZXh0IGlzIGEgcmF0aGVyIGVhc3kgcHJvY2Vzcy4KK0l0IG1lcmVseSBjb25zaXN0cyBpbiBhZGRpbmcgdGhlIHNjYWxlZCBrZXJuIGRpc3RhbmNlIHRvIHRoZSBwZW4gcG9zaXRpb24KK2JlZm9yZSB3cml0aW5nIGVhY2ggbmV4dCBnbHlwaC4gSG93ZXZlciwgdGhlIHR5cG9ncmFwaGljYWxseSBjb3JyZWN0IHJlbmRlcmVyCittdXN0IHRha2UgYSBmZXcgbW9yZSBkZXRhaWxzIGluIGNvbnNpZGVyYXRpb24uCis8cD5UaGUgInNsaWRpbmcgZG90IiBwcm9ibGVtIGlzIGEgZ29vZCBleGFtcGxlIDogbWFueSBmb250IGZhY2VzIGluY2x1ZGUKK2Ega2VybmluZyBkaXN0YW5jZSBiZXR3ZWVuIGNhcGl0YWwgbGV0dGVycyBsaWtlICJUIiBvciAiRiIgYW5kIGEgZm9sbG93aW5nCitkb3QgKCIuIiksIGluIG9yZGVyIHRvIHNsaWRlIHRoZSBsYXR0ZXIgZ2x5cGgganVzdCByaWdodCB0byB0aGVpciBtYWluCitsZWcuIEkuZS4KKzxjZW50ZXI+Cis8cD48aW1nIFNSQz0idHdsZXdpczEuZ2lmIiBoZWlnaHQ9Mzggd2lkdGg9MzE0PjwvY2VudGVyPgorCis8cD5Ib3dldmVyLCB0aGlzIHNvbWV0aW1lcyByZXF1aXJlcyBhZGRpdGlvbmFsIGFkanVzdG1lbnRzIGJldHdlZW4gdGhlCitkb3QgYW5kIHRoZSBsZXR0ZXIgZm9sbG93aW5nIGl0LCBkZXBlbmRpbmcgb24gdGhlIHNoYXBlcyBvZiB0aGUgZW5jbG9zaW5nCitsZXR0ZXJzLiBXaGVuIGFwcGx5aW5nICJzdGFuZGFyZCIga2VybmluZyBhZGp1c3RtZW50cywgdGhlIHByZXZpb3VzIHNlbnRlbmNlCit3b3VsZCBiZWNvbWUgOgorPGNlbnRlcj4KKzxwPjxpbWcgU1JDPSJ0d2xld2lzMi5naWYiIGhlaWdodD0zNiB3aWR0aD0xMTU+PC9jZW50ZXI+CisKKzxwPldoaWNoIGNsZWFybHkgaXMgdG9vIGNvbnRyYWN0ZWQuIFRoZSBzb2x1dGlvbiBoZXJlLCBhcyBleGhpYml0ZWQgaW4KK3RoZSBmaXJzdCBleGFtcGxlIGlzIHRvIG9ubHkgc2xpZGUgdGhlIGRvdHMgd2hlbiBwb3NzaWJsZS4gT2YgY291cnNlLCB0aGlzCityZXF1aXJlcyBhIGNlcnRhaW4ga25vd2xlZGdlIG9mIHRoZSB0ZXh0J3MgbWVhbmluZy4gVGhlIGFib3ZlIGFkanVzdG1lbnRzCit3b3VsZCBub3QgbmVjZXNzYXJpbHkgYmUgd2VsY29tZWQgaWYgd2Ugd2VyZSByZW5kZXJpbmcgdGhlIGZpbmFsIGRvdCBvZgorYSBnaXZlbiBwYXJhZ3JhcGguCis8cD5UaGlzIGlzIG9ubHkgb25lIGV4YW1wbGUsIGFuZCB0aGVyZSBhcmUgbWFueSBvdGhlcnMgc2hvd2luZyB0aGF0IGEgcmVhbAordHlwb2dyYXBoZXIgaXMgbmVlZGVkIHRvIGxheW91dCB0ZXh0IHByb3Blcmx5LiBJZiBub3QgYXZhaWxhYmxlLCBzb21lIGtpbmQKK29mIHVzZXIgaW50ZXJhY3Rpb24gb3IgdGFnZ2luZyBvZiB0aGUgdGV4dCBjb3VsZCBiZSB1c2VkIHRvIHNwZWNpZnkgc29tZQorYWRqdXN0bWVudHMsIGJ1dCBpbiBhbGwgY2FzZXMsIHRoaXMgcmVxdWlyZXMgc29tZSBzdXBwb3J0IGluIGFwcGxpY2F0aW9ucworYW5kIHRleHQgbGlicmFyaWVzLgorPHA+Rm9yIG1vcmUgbXVuZGFuZSBhbmQgY29tbW9uIHVzZXMsIGhvd2V2ZXIsIHdlIGNhbiBoYXZlIGEgdmVyeSBzaW1wbGUKK2FsZ29yaXRobSwgd2hpY2gmbmJzcDsgYXZvaWRzIHRoZSBzbGlkaW5nIGRvdCBwcm9ibGVtLCBhbmQgb3RoZXJzLCB0aG91Z2gKK25vdCBwcm9kdWNpbmcgb3B0aW1hbCByZXN1bHRzLiBJdCBjYW4gYmUgc2VlbiBhcyA6Cis8YnI+Jm5ic3A7Cis8YmxvY2txdW90ZT4KKzxvbD4KKzxsaT4KK3BsYWNlIHRoZSBmaXJzdCBnbHlwaCBvbiB0aGUgYmFzZWxpbmU8L2xpPgorCis8bGk+CitzYXZlIHRoZSBsb2NhdGlvbiBvZiB0aGUgcGVuIHBvc2l0aW9uL29yaWdpbiBpbiBwZW4xPC9saT4KKworPGxpPgorYWRqdXN0IHRoZSBwZW4gcG9zaXRpb24gd2l0aCB0aGUga2VybmluZyBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBmaXJzdCBhbmQKK3NlY29uZCBnbHlwaDwvbGk+CisKKzxsaT4KK3BsYWNlIHRoZSBzZWNvbmQgZ2x5cGggYW5kIGNvbXB1dGUgdGhlIG5leHQgcGVuIHBvc2l0aW9uL29yaWdpbiBpbiBwZW4yLjwvbGk+CisKKzxsaT4KK3VzZSBwZW4xIGFzIHRoZSBuZXh0IHBlbiBwb3NpdGlvbiBpZiBpdCBpcyBiZXlvbmQgcGVuMiwgdXNlIHBlbjIgb3RoZXJ3aXNlLjwvbGk+Cis8L29sPgorPC9ibG9ja3F1b3RlPgorPC9ibG9ja3F1b3RlPgorPC9ibG9ja3F1b3RlPgorCis8aDI+CisKKzxociBXSURUSD0iMTAwJSI+PC9oMj4KKworPGgyPgorVi4gVGV4dCBwcm9jZXNzaW5nPC9oMj4KKworPGJsb2NrcXVvdGU+VGhpcyBzZWN0aW9uIGRlbW9uc3RyYXRlcyBob3cgdG8gdXNlIHRoZSBjb25jZXB0cyBwcmV2aW91c2x5CitkZWZpbmVkIHRvIHJlbmRlciB0ZXh0LCB3aGF0ZXZlciB0aGUgbGF5b3V0IHlvdSB1c2UuCis8YnI+Jm5ic3A7Cis8aDM+CisxLiBXcml0aW5nIHNpbXBsZSB0ZXh0IHN0cmluZ3MgOjwvaDM+CisKKzxibG9ja3F1b3RlPkluIHRoaXMgZmlyc3QgZXhhbXBsZSwgd2UnbGwgZ2VuZXJhdGUgYSBzaW1wbGUgc3RyaW5nIG9mIFJvbWFuCit0ZXh0LCBpLmUuIHdpdGggYSBob3Jpem9udGFsIGxlZnQtdG8tcmlnaHQgbGF5b3V0LiBVc2luZyBleGNsdXNpdmVseSBwaXhlbAorbWV0cmljcywgdGhlIHByb2Nlc3MgbG9va3MgbGlrZSA6Cis8YmxvY2txdW90ZT48dHQ+MSkgY29udmVydCB0aGUgY2hhcmFjdGVyIHN0cmluZyBpbnRvIGEgc2VyaWVzIG9mIGdseXBoCitpbmRleGVzLjwvdHQ+Cis8YnI+PHR0PjIpIHBsYWNlIHRoZSBwZW4gdG8gdGhlIGN1cnNvciBwb3NpdGlvbi48L3R0PgorPGJyPjx0dD4zKSBnZXQgb3IgbG9hZCB0aGUgZ2x5cGggaW1hZ2UuPC90dD4KKzxicj48dHQ+NCkgdHJhbnNsYXRlIHRoZSBnbHlwaCBzbyB0aGF0IGl0cyAnb3JpZ2luJyBtYXRjaGVzIHRoZSBwZW4gcG9zaXRpb248L3R0PgorPGJyPjx0dD41KSByZW5kZXIgdGhlIGdseXBoIHRvIHRoZSB0YXJnZXQgZGV2aWNlPC90dD4KKzxicj48dHQ+NikgaW5jcmVtZW50IHRoZSBwZW4gcG9zaXRpb24gYnkgdGhlIGdseXBoJ3MgYWR2YW5jZSB3aWR0aCBpbiBwaXhlbHM8L3R0PgorPGJyPjx0dD43KSBzdGFydCBvdmVyIGF0IHN0ZXAgMyBmb3IgZWFjaCBvZiB0aGUgcmVtYWluaW5nIGdseXBoczwvdHQ+Cis8YnI+PHR0PjgpIHdoZW4gYWxsIGdseXBocyBhcmUgZG9uZSwgc2V0IHRoZSB0ZXh0IGN1cnNvciB0byB0aGUgbmV3IHBlbgorcG9zaXRpb248L3R0PjwvYmxvY2txdW90ZT4KK05vdGUgdGhhdCBrZXJuaW5nIGlzbid0IHBhcnQgb2YgdGhpcyBhbGdvcml0aG0uPC9ibG9ja3F1b3RlPgorCis8aDM+CisyLiBTdWItcGl4ZWwgcG9zaXRpb25pbmcgOjwvaDM+CisKKzxibG9ja3F1b3RlPkl0IGlzIHNvbWV3aGF0IHVzZWZ1bCB0byB1c2Ugc3ViLXBpeGVsIHBvc2l0aW9uaW5nIHdoZW4gcmVuZGVyaW5nCit0ZXh0LiBUaGlzIGlzIGNydWNpYWwsIGZvciBleGFtcGxlLCB0byBwcm92aWRlIHNlbWktV1lTSVdZRyB0ZXh0IGxheW91dHMuCitUZXh0IHJlbmRlcmluZyBpcyB2ZXJ5IHNpbWlsYXIgdG8gdGhlIGFsZ29yaXRobSBkZXNjcmliZWQgaW4gc3ViLXNlY3Rpb24KKzEsIHdpdGggdGhlIGZvbGxvd2luZyBmZXcgZGlmZmVyZW5jZXMgOgorPHVsPgorPGxpPgorVGhlIHBlbiBwb3NpdGlvbiBpcyBleHByZXNzZWQgaW4gZnJhY3Rpb25hbCBwaXhlbHMuPC9saT4KKworPGxpPgorQmVjYXVzZSB0cmFuc2xhdGluZyBhIGhpbnRlZCBvdXRsaW5lIGJ5IGEgbm9uLWludGVnZXIgZGlzdGFuY2Ugd2lsbCBydWluCitpdHMgZ3JpZC1maXR0aW5nLCB0aGUgcG9zaXRpb24gb2YgdGhlIGdseXBoIG9yaWdpbiBtdXN0IGJlIHJvdW5kZWQgYmVmb3JlCityZW5kZXJpbmcgdGhlIGNoYXJhY3RlciBpbWFnZS48L2xpPgorCis8bGk+CitUaGUgYWR2YW5jZSB3aWR0aCBpcyBleHByZXNzZWQgaW4gZnJhY3Rpb25hbCBwaXhlbHMsIGFuZCBpc24ndCBuZWNlc3NhcmlseQorYW4gaW50ZWdlci48L2xpPgorPC91bD4KKworPHA+PGJyPldoaWNoIGZpbmFsbHkgbG9va3MgbGlrZSA6Cis8YmxvY2txdW90ZT48dHQ+MS4gY29udmVydCB0aGUgY2hhcmFjdGVyIHN0cmluZyBpbnRvIGEgc2VyaWVzIG9mIGdseXBoCitpbmRleGVzLjwvdHQ+Cis8YnI+PHR0PjIuIHBsYWNlIHRoZSBwZW4gdG8gdGhlIGN1cnNvciBwb3NpdGlvbi4gVGhpcyBjYW4gYmUgYSBub24taW50ZWdlcgorcG9pbnQuPC90dD4KKzxicj48dHQ+My4gZ2V0IG9yIGxvYWQgdGhlIGdseXBoIGltYWdlLjwvdHQ+Cis8YnI+PHR0PjQuIHRyYW5zbGF0ZSB0aGUgZ2x5cGggc28gdGhhdCBpdHMgJ29yaWdpbicgbWF0Y2hlcyB0aGUgcm91bmRlZAorcGVuIHBvc2l0aW9uLjwvdHQ+Cis8YnI+PHR0PjUuIHJlbmRlciB0aGUgZ2x5cGggdG8gdGhlIHRhcmdldCBkZXZpY2U8L3R0PgorPGJyPjx0dD42LiBpbmNyZW1lbnQgdGhlIHBlbiBwb3NpdGlvbiBieSB0aGUgZ2x5cGgncyBhZHZhbmNlIHdpZHRoIGluIGZyYWN0aW9uYWwKK3BpeGVscy48L3R0PgorPGJyPjx0dD43LiBzdGFydCBvdmVyIGF0IHN0ZXAgMyBmb3IgZWFjaCBvZiB0aGUgcmVtYWluaW5nIGdseXBoczwvdHQ+Cis8YnI+PHR0PjguIHdoZW4gYWxsIGdseXBocyBhcmUgZG9uZSwgc2V0IHRoZSB0ZXh0IGN1cnNvciB0byB0aGUgbmV3IHBlbgorcG9zaXRpb248L3R0PjwvYmxvY2txdW90ZT4KK05vdGUgdGhhdCB3aXRoIGZyYWN0aW9uYWwgcGl4ZWwgcG9zaXRpb25pbmcsIHRoZSBzcGFjZSBiZXR3ZWVuIHR3byBnaXZlbgorbGV0dGVycyBpc24ndCBmaXhlZCwgYnV0IGRldGVybWluZWQgYnkgdGhlIGFjY3VtdWxhdGlvbiBvZiBwcmV2aW91cyByb3VuZGluZworZXJyb3JzIGluIGdseXBoIHBvc2l0aW9uaW5nLjwvYmxvY2txdW90ZT4KKworPGgzPgorMy4mbmJzcDsgU2ltcGxlIGtlcm5pbmcgOjwvaDM+CisKKzxibG9ja3F1b3RlPkFkZGluZyBrZXJuaW5nIHRvIHRoZSBiYXNpYyB0ZXh0IHJlbmRlcmluZyBhbGdvcml0aG0gaXMgZWFzeQorOiB3aGVuIGEga2VybmluZyBwYWlyIGlzIGZvdW5kLCBzaW1wbHkgYWRkIHRoZSBzY2FsZWQga2VybmluZyBkaXN0YW5jZQordG8gdGhlIHBlbiBwb3NpdGlvbiBiZWZvcmUgc3RlcCA0LiBPZiBjb3Vyc2UsIHRoZSBkaXN0YW5jZSBzaG91bGQgYmUgcm91bmRlZAoraW4gdGhlIGNhc2Ugb2YgYWxnb3JpdGhtIDEsIHRob3VnaCBpdCBkb2Vzbid0IG5lZWQgdG8gZm9yIGFsZ29yaXRobSAyLgorVGhpcyBnaXZlcyB1cyA6Cis8cD5BbGdvcml0aG0gMSB3aXRoIGtlcm5pbmc6Cis8YmxvY2txdW90ZT48dHQ+MykgZ2V0IG9yIGxvYWQgdGhlIGdseXBoIGltYWdlLjwvdHQ+Cis8YnI+PHR0PjQpIEFkZCB0aGUgcm91bmRlZCBzY2FsZWQga2VybmluZyBkaXN0YW5jZSwgaWYgYW55LCB0byB0aGUgcGVuCitwb3NpdGlvbjwvdHQ+Cis8YnI+PHR0PjUpIHRyYW5zbGF0ZSB0aGUgZ2x5cGggc28gdGhhdCBpdHMgJ29yaWdpbicgbWF0Y2hlcyB0aGUgcGVuIHBvc2l0aW9uPC90dD4KKzxicj48dHQ+NikgcmVuZGVyIHRoZSBnbHlwaCB0byB0aGUgdGFyZ2V0IGRldmljZTwvdHQ+Cis8YnI+PHR0PjcpIGluY3JlbWVudCB0aGUgcGVuIHBvc2l0aW9uIGJ5IHRoZSBnbHlwaCdzIGFkdmFuY2Ugd2lkdGggaW4gcGl4ZWxzPC90dD4KKzxicj48dHQ+OCkgc3RhcnQgb3ZlciBhdCBzdGVwIDMgZm9yIGVhY2ggb2YgdGhlIHJlbWFpbmluZyBnbHlwaHM8L3R0PjwvYmxvY2txdW90ZT4KKworPHA+PGJyPkFsZ29yaXRobSAyIHdpdGgga2VybmluZzoKKzxibG9ja3F1b3RlPjx0dD4zKSBnZXQgb3IgbG9hZCB0aGUgZ2x5cGggaW1hZ2UuPC90dD4KKzxicj48dHQ+NCkgQWRkIHRoZSBzY2FsZWQgdW5yb3VuZGVkIGtlcm5pbmcgZGlzdGFuY2UsIGlmIGFueSwgdG8gdGhlIHBlbgorcG9zaXRpb24uPC90dD4KKzxicj48dHQ+NSkgdHJhbnNsYXRlIHRoZSBnbHlwaCBzbyB0aGF0IGl0cyAnb3JpZ2luJyBtYXRjaGVzIHRoZSByb3VuZGVkCitwZW4gcG9zaXRpb24uPC90dD4KKzxicj48dHQ+NikgcmVuZGVyIHRoZSBnbHlwaCB0byB0aGUgdGFyZ2V0IGRldmljZTwvdHQ+Cis8YnI+PHR0PjcpIGluY3JlbWVudCB0aGUgcGVuIHBvc2l0aW9uIGJ5IHRoZSBnbHlwaCdzIGFkdmFuY2Ugd2lkdGggaW4gZnJhY3Rpb25hbAorcGl4ZWxzLjwvdHQ+Cis8YnI+PHR0PjgpIHN0YXJ0IG92ZXIgYXQgc3RlcCAzIGZvciBlYWNoIG9mIHRoZSByZW1haW5pbmcgZ2x5cGhzPC90dD48L2Jsb2NrcXVvdGU+CitPZiBjb3Vyc2UsIHRoZSBhbGdvcml0aG0gZGVzY3JpYmVkIGluIHNlY3Rpb24gSVYgY2FuIGFsc28gYmUgYXBwbGllZCB0bworcHJldmVudCB0aGUgc2xpZGluZyBkb3QgcHJvYmxlbSBpZiBvbmUgd2FudHMgdG8uLjwvYmxvY2txdW90ZT4KKworPGgzPgorNC4gUmlnaHQtVG8tTGVmdCBMYXlvdXQgOjwvaDM+CisKKzxibG9ja3F1b3RlPlRoZSBwcm9jZXNzIG9mIGxheWluZyBvdXQgYXJhYmljIG9yIGhlYnJldyB0ZXh0IGlzIGV4dHJlbWVseQorc2ltaWxhci4gVGhlIG9ubHkgZGlmZmVyZW5jZSBpcyB0aGF0IHRoZSBwZW4gcG9zaXRpb24gbXVzdCBiZSBkZWNyZW1lbnRlZAorYmVmb3JlIHRoZSBnbHlwaCByZW5kZXJpbmcgKHJlbWVtYmVyIDogdGhlIGFkdmFuY2Ugd2lkdGggaXMgYWx3YXlzIHBvc2l0aXZlLAorZXZlbiBmb3IgYXJhYmljIGdseXBocykuIFRodXMsIGFsZ29yaXRobSAxIGJlY29tZXMgOgorPHA+UmlnaHQtdG8tbGVmdCBBbGdvcml0aG0gMToKKzxibG9ja3F1b3RlPjx0dD4zKSBnZXQgb3IgbG9hZCB0aGUgZ2x5cGggaW1hZ2UuPC90dD4KKzxicj48dHQ+NCkgRGVjcmVtZW50IHRoZSBwZW4gcG9zaXRpb24gYnkgdGhlIGdseXBoJ3MgYWR2YW5jZSB3aWR0aCBpbiBwaXhlbHM8L3R0PgorPGJyPjx0dD41KSB0cmFuc2xhdGUgdGhlIGdseXBoIHNvIHRoYXQgaXRzICdvcmlnaW4nIG1hdGNoZXMgdGhlIHBlbiBwb3NpdGlvbjwvdHQ+Cis8YnI+PHR0PjYpIHJlbmRlciB0aGUgZ2x5cGggdG8gdGhlIHRhcmdldCBkZXZpY2U8L3R0PgorPGJyPjx0dD43KSBzdGFydCBvdmVyIGF0IHN0ZXAgMyBmb3IgZWFjaCBvZiB0aGUgcmVtYWluaW5nIGdseXBoczwvdHQ+PC9ibG9ja3F1b3RlPgorCis8cD48YnI+VGhlIGNoYW5nZXMgdG8gQWxnb3JpdGhtIDIsIGFzIHdlbGwgYXMgdGhlIGluY2x1c2lvbiBvZiBrZXJuaW5nCithcmUgbGVmdCBhcyBhbiBleGVyY2lzZSB0byB0aGUgcmVhZGVyLgorPGJyPiZuYnNwOworPGJyPiZuYnNwOzwvYmxvY2txdW90ZT4KKworPGgzPgorNS4gVmVydGljYWwgbGF5b3V0cyA6PC9oMz4KKworPGJsb2NrcXVvdGU+TGF5aW5nIG91dCB2ZXJ0aWNhbCB0ZXh0IHVzZXMgZXhhY3RseSB0aGUgc2FtZSBwcm9jZXNzZXMsIHdpdGgKK3RoZSBmb2xsb3dpbmcgc2lnbmlmaWNhbnQgZGlmZmVyZW5jZXMgOgorPGJyPiZuYnNwOworPGJsb2NrcXVvdGU+Cis8bGk+CitUaGUgYmFzZWxpbmUgaXMgdmVydGljYWwsIGFuZCB0aGUgdmVydGljYWwgbWV0cmljcyBtdXN0IGJlIHVzZWQgaW5zdGVhZAorb2YgdGhlIGhvcml6b250YWwgb25lLjwvbGk+CisKKzxsaT4KK1RoZSBsZWZ0IGJlYXJpbmcgaXMgdXN1YWxseSBuZWdhdGl2ZSwgYnV0IHRoaXMgZG9lc24ndCBjaGFuZ2UgdGhlIGZhY3QKK3RoYXQgdGhlIGdseXBoIG9yaWdpbiBtdXN0IGJlIGxvY2F0ZWQgb24gdGhlIGJhc2VsaW5lLjwvbGk+CisKKzxsaT4KK1RoZSBhZHZhbmNlIGhlaWdodCBpcyBhbHdheXMgcG9zaXRpdmUsIHNvIHRoZSBwZW4gcG9zaXRpb24gbXVzdCBiZSBkZWNyZW1lbnRlZAoraWYgb25lIHdhbnRzIHRvIHdyaXRlIHRvcCB0byBib3R0b20gKGFzc3VtaW5nIHRoZSBZIGF4aXMgaXMgb3JpZW50ZWQgdXB3YXJkcykuPC9saT4KKzwvYmxvY2txdW90ZT4KK1Rocm91Z2ggdGhlIGZvbGxvd2luZyBhbGdvcml0aG0gOgorPGJsb2NrcXVvdGU+PHR0PjEpIGNvbnZlcnQgdGhlIGNoYXJhY3RlciBzdHJpbmcgaW50byBhIHNlcmllcyBvZiBnbHlwaAoraW5kZXhlcy48L3R0PgorPGJyPjx0dD4yKSBwbGFjZSB0aGUgcGVuIHRvIHRoZSBjdXJzb3IgcG9zaXRpb24uPC90dD4KKzxicj48dHQ+MykgZ2V0IG9yIGxvYWQgdGhlIGdseXBoIGltYWdlLjwvdHQ+Cis8YnI+PHR0PjQpIHRyYW5zbGF0ZSB0aGUgZ2x5cGggc28gdGhhdCBpdHMgJ29yaWdpbicgbWF0Y2hlcyB0aGUgcGVuIHBvc2l0aW9uPC90dD4KKzxicj48dHQ+NSkgcmVuZGVyIHRoZSBnbHlwaCB0byB0aGUgdGFyZ2V0IGRldmljZTwvdHQ+Cis8YnI+PHR0PjYpIGRlY3JlbWVudCB0aGUgdmVydGljYWwgcGVuIHBvc2l0aW9uIGJ5IHRoZSBnbHlwaCdzIGFkdmFuY2UgaGVpZ2h0CitpbiBwaXhlbHM8L3R0PgorPGJyPjx0dD43KSBzdGFydCBvdmVyIGF0IHN0ZXAgMyBmb3IgZWFjaCBvZiB0aGUgcmVtYWluaW5nIGdseXBoczwvdHQ+Cis8YnI+PHR0PjgpIHdoZW4gYWxsIGdseXBocyBhcmUgZG9uZSwgc2V0IHRoZSB0ZXh0IGN1cnNvciB0byB0aGUgbmV3IHBlbgorcG9zaXRpb248L3R0PjwvYmxvY2txdW90ZT4KKzwvYmxvY2txdW90ZT4KKworPGgzPgorNi4gV1lTSVdZRyB0ZXh0IGxheW91dHMgOjwvaDM+CisKKzxibG9ja3F1b3RlPkFzIHlvdSBwcm9iYWJseSBrbm93LCB0aGUgYWNyb255bSBXWVNJV1lHIHN0YW5kcyBmb3IgJzxpPldoYXQKK1lvdSBTZWUgSXMgV2hhdCBZb3UgR2V0PC9pPicuIEJhc2ljYWxseSwgdGhpcyBtZWFucyB0aGF0IHRoZSBvdXRwdXQgb2YKK2EgZG9jdW1lbnQgb24gdGhlIHNjcmVlbiBzaG91bGQgbWF0Y2ggInBlcmZlY3RseSIgaXRzIHByaW50ZWQgdmVyc2lvbi4KK0EgPGI+PGk+dHJ1ZTwvaT48L2I+IHd5c2l3eWcgc3lzdGVtIHJlcXVpcmVzIHR3byB0aGluZ3MgOgorPHA+PGI+ZGV2aWNlLWluZGVwZW5kZW50IHRleHQgbGF5b3V0PC9iPgorPGJsb2NrcXVvdGU+V2hpY2ggbWVhbnMgdGhhdCB0aGUgZG9jdW1lbnQncyBmb3JtYXR0aW5nIGlzIHRoZSBzYW1lIG9uIHRoZQorc2NyZWVuIHRoYW4gb24gYW55IHByaW50ZWQgb3V0cHV0LCBpbmNsdWRpbmcgbGluZSBicmVha3MsIGp1c3RpZmljYXRpb24sCitsaWdhdHVyZXMsIGZvbnRzLCBwb3NpdGlvbiBvZiBpbmxpbmUgaW1hZ2VzLCBldGMuLjwvYmxvY2txdW90ZT4KKworPHA+PGJyPjxiPm1hdGNoaW5nIGRpc3BsYXkgYW5kIHByaW50IGNoYXJhY3RlciBzaXplczwvYj4KKzxibG9ja3F1b3RlPldoaWNoIG1lYW5zIHRoYXQgdGhlIGRpc3BsYXllZCBzaXplIG9mIGEgZ2l2ZW4gY2hhcmFjdGVyIHNob3VsZAorbWF0Y2ggaXRzIGRpbWVuc2lvbnMgd2hlbiBwcmludGVkLiBGb3IgZXhhbXBsZSwgYSB0ZXh0IHN0cmluZyB3aGljaCBpcworZXhhY3RseSAxIGluY2ggdGFsbCB3aGVuIHByaW50ZWQgc2hvdWxkIGFsc28gYXBwZWFyIDEgaW5jaCB0YWxsIG9uIHRoZQorc2NyZWVuICh3aGVuIHVzaW5nIGEgc2NhbGUgb2YgMTAwJSkuPC9ibG9ja3F1b3RlPgorCis8cD48YnI+SXQgaXMgY2xlYXIgdGhhdCBtYXRjaGluZyBzaXplcyBjYW5ub3QgYmUgcG9zc2libGUgaWYgdGhlIGNvbXB1dGVyCitoYXMgbm8ga25vd2xlZGdlIG9mIHRoZSBwaHlzaWNhbCByZXNvbHV0aW9ucyBvZiB0aGUgZGlzcGxheSBkZXZpY2UocykgaXQKK2lzIHVzaW5nLiBBbmQgb2YgY291cnNlLCB0aGlzIGlzIHRoZSBtb3N0IGNvbW1vbiBjYXNlICEgVGhhdCdzIG5vdCB0b28KK3VuZm9ydHVuYXRlLCBob3dldmVyJm5ic3A7IGJlY2F1c2UgbW9zdCB1c2VycyByZWFsbHkgZG9uJ3QgY2FyZSBhYm91dCB0aGlzCitmZWF0dXJlLiBMZWdpYmlsaXR5IGlzIG11Y2ggbW9yZSBpbXBvcnRhbnQuCis8cD5XaGVuIHRoZSBNYWMgYXBwZWFyZWQsIEFwcGxlIGRlY2lkZWQgdG8gY2hvb3NlIGEgcmVzb2x1dGlvbiBvZiA3MiBkcGkKK3RvIGRlc2NyaWJlIHRoZSBNYWNpbnRvc2ggc2NyZWVuIHRvIHRoZSBmb250IHN1Yi1zeXN0ZW0gKHdoYXRldmVyIHRoZSBtb25pdG9yCit1c2VkKS4gVGhpcyBjaG9pY2Ugd2FzIG1vc3QgcHJvYmFibHkgZHJpdmVuIGJ5IHRoZSBmYWN0IHRoYXQsIGF0IHRoaXMgcmVzb2x1dGlvbiwKKzEgcG9pbnQgPSAxIHBpeGVsLiBIb3dldmVyOyBpdCBuZWdsZWN0ZWQgb25lIGNydWNpYWwgZmFjdCA6IGFzIG1vc3QgdXNlcnMKK3RlbmQgdG8gY2hvb3NlIGEgZG9jdW1lbnQgY2hhcmFjdGVyIHNpemUgYmV0d2VlbiAxMCBhbmQgMTQgcG9pbnRzLCB0aGUKK3Jlc3VsdGFudCBkaXNwbGF5ZWQgdGV4dCB3YXMgcmF0aGVyIHNtYWxsIGFuZCBub3QgdG9vIGxlZ2libGUgd2l0aG91dCBzY2FsaW5nLgorTWljcm9zb2Z0IGVuZ2luZWVycyB0b29rIG5vdGljZSBvZiB0aGlzIHByb2JsZW0gYW5kIGNob3NlIGEgcmVzb2x1dGlvbgorb2YgOTYgZHBpIG9uIFdpbmRvd3MsIHdoaWNoIHJlc3VsdGVkIGluIHNsaWdodGx5IGxhcmdlciwgYW5kIG1vcmUgbGVnaWJsZSwKK2Rpc3BsYXllZCBjaGFyYWN0ZXJzIChmb3IgdGhlIHNhbWUgcHJpbnRlZCB0ZXh0IHNpemUpLgorPHA+VGhlc2UgZGlzdGluY3QgcmVzb2x1dGlvbnMgZXhwbGFpbiBzb21lIGRpZmZlcmVuY2VzIHdoZW4gZGlzcGxheWluZwordGV4dCBhdCB0aGUgc2FtZSBjaGFyYWN0ZXIgc2l6ZSBvbiBhIE1hYyBhbmQgYSBXaW5kb3dzIG1hY2hpbmUuIE1vcmVvdmVyLAoraXQgaXMgbm90IHVudXN1YWwgdG8gZmluZCBzb21lIFRydWVUeXBlIGZvbnRzIHdpdGggZW5oYW5jZWQgaGludGluZyAodGVjaAorbm90ZTogdGhyb3VnaCBkZWx0YS1oaW50aW5nKSBmb3IgdGhlIHNpemVzIG9mIDEwLCAxMiwgMTQgYW5kIDE2IHBvaW50cworYXQgOTYgZHBpLgorPGJyPiZuYnNwOworPHA+QXMgZm9yIGRldmljZS1pbmRlcGVuZGVudCB0ZXh0LCBpdCBpcyBhIG5vdGlvbiB0aGF0IGlzLCB1bmZvcnR1bmF0ZWx5LAorb2Z0ZW4gYWJ1c2VkLiBGb3IgZXhhbXBsZSwgbWFueSB3b3JkIHByb2Nlc3NvcnMsIGluY2x1ZGluZyBNUyBXb3JkLCBkbworbm90IHJlYWxseSB1c2UgZGV2aWNlLWluZGVwZW5kZW50IGdseXBoIHBvc2l0aW9uaW5nIGFsZ29yaXRobXMgd2hlbiBsYXlpbmcKK291dCB0ZXh0LiBSYXRoZXIsIHRoZXkgdXNlIHRoZSB0YXJnZXQgcHJpbnRlcidzIHJlc29sdXRpb24gdG8gY29tcHV0ZSA8aT5oaW50ZWQ8L2k+CitnbHlwaCBtZXRyaWNzIGZvciB0aGUgbGF5b3V0LiBUaG91Z2ggaXQgZ3VhcmFudGVlcyB0aGF0IHRoZSBwcmludGVkIHZlcnNpb24KK2lzIGFsd2F5cyB0aGUgIm5pY2VzdCIgaXQgY2FuIGJlLCBlc3BlY2lhbGx5IGZvciB2ZXJ5IGxvdyByZXNvbHV0aW9uIHByaW50ZXJzCisobGlrZSBkb3QtbWF0cml4KSwgaXQgaGFzIGEgdmVyeSBzYWQgZWZmZWN0IDogY2hhbmdpbmcgdGhlIHByaW50ZXIgY2FuCitoYXZlIGRyYW1hdGljIGVmZmVjdHMgb24gdGhlIDxpPndob2xlPC9pPiBkb2N1bWVudCBsYXlvdXQsIGVzcGVjaWFsbHkgaWYKK2l0IG1ha2VzIHN0cm9uZyB1c2Ugb2YganVzdGlmaWNhdGlvbiwgdXNlcyBmZXcgcGFnZSBicmVha3MsIGV0Yy4uCis8cD5CZWNhdXNlIHRoZSBnbHlwaCBtZXRyaWNzIHZhcnkgc2xpZ2h0bHkgd2hlbiB0aGUgcmVzb2x1dGlvbiBjaGFuZ2VzCisoZHVlIHRvIGhpbnRpbmcpLCBsaW5lIGJyZWFrcyBjYW4gY2hhbmdlIGVub3Jtb3VzbHksIHdoZW4gdGhlc2UgZGlmZmVyZW5jZXMKK2FjY3VtdWxhdGUgb3ZlciBsb25nIHJ1bnMgb2YgdGV4dC4gVHJ5IGZvciBleGFtcGxlIHByaW50aW5nIGEgdmVyeSBsb25nCitkb2N1bWVudCAod2l0aCBubyBwYWdlIGJyZWFrcykgb24gYSAzMDAgZHBpIGluay1qZXQgcHJpbnRlciwgdGhlbiB0aGUgc2FtZQorb25lIG9uIGEgMzAwMCBkcGkgbGFzZXIgcHJpbnRlciA6IHlvdSdsbCBiZSBleHRyZW1lbHkgbHVja3kgaWYgeW91ciBmaW5hbAorcGFnZSBjb3VudCBkaWRuJ3QgY2hhbmdlIGJldHdlZW4gdGhlIHByaW50cyAhIE9mIGNvdXJzZSwgd2UgY2FuIHN0aWxsIGNhbGwKK3RoaXMgV1lTSVdZRywgYXMgbG9uZyBhcyB0aGUgcHJpbnRlciByZXNvbHV0aW9uIGlzIGZpeGVkICEhCis8cD5Tb21lIGFwcGxpY2F0aW9ucywgbGlrZSBBZG9iZSBBY3JvYmF0LCB3aGljaCB0YXJnZXRlZCBkZXZpY2UtaW5kZXBlbmRlbnQKK3BsYWNlbWVudCBmcm9tIHRoZSBzdGFydCwgZG8gbm90IHN1ZmZlciBmcm9tIHRoaXMgcHJvYmxlbS4gVGhlcmUgYXJlIHR3bword2F5cyB0byBhY2hpZXZlIHRoaXMgOiBlaXRoZXIgdXNlIHRoZSBzY2FsZWQgYW5kIHVuaGludGVkIGdseXBoIG1ldHJpY3MKK3doZW4gbGF5aW5nIG91dCB0ZXh0IGJvdGggaW4gdGhlIHJlbmRlcmluZyBhbmQgcHJpbnRpbmcgcHJvY2Vzc2VzLCBvciBzaW1wbHkKK3VzZSB3YXRoZXZlciBtZXRyaWNzIHlvdSB3YW50IGFuZCBzdG9yZSB0aGVtIHdpdGggdGhlIHRleHQgaW4gb3JkZXIgdG8KK2dldCBzdXJlIHRoZXkncmUgcHJpbnRlZCB0aGUgc2FtZSBvbiBhbGwgZGV2aWNlcyAodGhlIGxhdHRlciBiZWluZyBwcm9iYWJseQordGhlIGJlc3Qgc29sdXRpb24sIGFzIGl0IGFsc28gZW5hYmxlcyBmb250IHN1YnN0aXR1dGlvbiB3aXRob3V0IGJyZWFraW5nCit0ZXh0IGxheW91dHMpLgorPHA+SnVzdCBsaWtlIG1hdGNoaW5nIHNpemVzLCBkZXZpY2UtaW5kZXBlbmRlbnQgcGxhY2VtZW50IGlzbid0IG5lY2Vzc2FyaWx5CithIGZlYXR1cmUgdGhhdCBtb3N0IHVzZXJzIHdhbnQuIEhvd2V2ZXIsIGl0IGlzIHByZXR0eSBjbGVhciB0aGF0IGZvciBhbnkKK2tpbmQgb2YgcHJvZmVzc2lvbmFsIGRvY3VtZW50IHByb2Nlc3Npbmcgd29yaywgaXQgPGI+PGk+aXM8L2k+PC9iPiBhIHJlcXVpcmVtZW50LjwvYmxvY2txdW90ZT4KKzwvYmxvY2txdW90ZT4KKworPGgyPgorCis8aHIgV0lEVEg9IjEwMCUiPjwvaDI+CisKKzxoMj4KK1ZJLiBGcmVlVHlwZSBvdXRsaW5lcyA6PC9oMj4KKworPGJsb2NrcXVvdGU+VGhlIHB1cnBvc2Ugb2YgdGhpcyBzZWN0aW9uIGlzIHRvIHByZXNlbnQgdGhlIHdheSBGcmVlVHlwZQorbWFuYWdlcyB2ZWN0b3JpYWwgb3V0bGluZXMsIGFzIHdlbGwgYXMgdGhlIG1vc3QgY29tbW9uIG9wZXJhdGlvbnMgdGhhdAorY2FuIGJlIGFwcGxpZWQgb24gdGhlbS4KKzxicj4mbmJzcDsKKzxoMz4KKzEuIEZyZWVUeXBlIG91dGxpbmUgZGVzY3JpcHRpb24gYW5kIHN0cnVjdHVyZSA6PC9oMz4KKworPGJsb2NrcXVvdGU+Cis8aDQ+CithLiBPdXRsaW5lIGN1cnZlIGRlY29tcG9zaXRpb24gOjwvaDQ+CisKKzxibG9ja3F1b3RlPkFuIG91dGxpbmUgaXMgZGVzY3JpYmVkIGFzIGEgc2VyaWVzIG9mIGNsb3NlZCBjb250b3VycyBpbiB0aGUKKzJEIHBsYW5lLiBFYWNoIGNvbnRvdXIgaXMgbWFkZSBvZiBhIHNlcmllcyBvZiBsaW5lIHNlZ21lbnRzIGFuZCBiZXppZXIKK2FyY3MuIERlcGVuZGluZyBvbiB0aGUgZmlsZSBmb3JtYXQsIHRoZXNlIGNhbiBiZSBzZWNvbmQtb3JkZXIgb3IgdGhpcmQtb3JkZXIKK3BvbHlub21pYWxzLiBUaGUgZm9ybWVyIGFyZSBhbHNvIGNhbGxlZCBxdWFkcmF0aWMgb3IgY29uaWMgYXJjcywgYW5kIHRoZXkKK2NvbWUgZnJvbSB0aGUgVHJ1ZVR5cGUgZm9ybWF0LiBUaGUgbGF0dGVyIGFyZSBjYWxsZWQgY3ViaWMgYXJjcyBhbmQgbW9zdGx5Citjb21lIGZyb20gdGhlIFR5cGUxIGZvcm1hdC4KKzxwPkVhY2ggYXJjIGlzIGRlc2NyaWJlZCB0aHJvdWdoIGEgc2VyaWVzIG9mIHN0YXJ0LCBlbmQgYW5kIGNvbnRyb2wgcG9pbnRzLgorRWFjaCBwb2ludCBvZiB0aGUgb3V0bGluZSBoYXMgYSBzcGVjaWZpYyB0YWcgd2hpY2ggaW5kaWNhdGVzIHdldGhlciBpdAoraXMgdXNlZCB0byBkZXNjcmliZSBhIGxpbmUgc2VnbWVudCBvciBhbiBhcmMuIFRoZSB0YWdzIGNhbiB0YWtlIHRoZSBmb2xsb3dpbmcKK3ZhbHVlcyA6Cis8YnI+Jm5ic3A7Cis8YnI+Jm5ic3A7PC9ibG9ja3F1b3RlPgorCis8Y2VudGVyPjx0YWJsZSBDRUxMU1BBQ0lORz01IENFTExQQURESU5HPTUgV0lEVEg9IjYwJSIgPgorPHRyIFZBTElHTj1UT1A+Cis8dGQ+Cis8YmxvY2txdW90ZT48Yj5GVF9DdXJ2ZV9UYWdfT24mbmJzcDs8L2I+PC9ibG9ja3F1b3RlPgorPC90ZD4KKworPHRkIFZBTElHTj1UT1A+Cis8YmxvY2txdW90ZT5Vc2VkIHdoZW4gdGhlIHBvaW50IGlzICJvbiIgdGhlIGN1cnZlLiBUaGlzIGNvcnJlc3BvbmRzIHRvCitzdGFydCBhbmQgZW5kIHBvaW50cyBvZiBzZWdtZW50cyBhbmQgYXJjcy4gVGhlIG90aGVyIHRhZ3Mgc3BlY2lmeSB3aGF0CitpcyBjYWxsZWQgYW4gIm9mZiIgcG9pbnQsIGkuZS4gb25lIHdoaWNoIGlzbid0IGxvY2F0ZWQgb24gdGhlIGNvbnRvdXIgaXRzZWxmLAorYnV0IHNlcnZlcyBhcyBhIGNvbnRyb2wgcG9pbnQgZm9yIGEgYmV6aWVyIGFyYy48L2Jsb2NrcXVvdGU+Cis8L3RkPgorPC90cj4KKworPHRyPgorPHRkPgorPGJsb2NrcXVvdGU+PGI+RlRfQ3VydmVfVGFnX0NvbmljPC9iPjwvYmxvY2txdW90ZT4KKzwvdGQ+CisKKzx0ZD4KKzxibG9ja3F1b3RlPlVzZWQgZm9yIGFuICJvZmYiIHBvaW50IHVzZWQgdG8gY29udHJvbCBhIGNvbmljIGJlemllciBhcmMuPC9ibG9ja3F1b3RlPgorPC90ZD4KKzwvdHI+CisKKzx0cj4KKzx0ZD4KKzxibG9ja3F1b3RlPjxiPkZUX0N1cnZlX1RhZ19DdWJpYzwvYj48L2Jsb2NrcXVvdGU+Cis8L3RkPgorCis8dGQ+Cis8YmxvY2txdW90ZT5Vc2VkIGZvciBhbiAib2ZmIiBwb2ludCB1c2VkIHRvIGNvbnRyb2wgYSBjdWJpYyBiZXppZXIgYXJjLjwvYmxvY2txdW90ZT4KKzwvdGQ+Cis8L3RyPgorPC90YWJsZT48L2NlbnRlcj4KKworPGJsb2NrcXVvdGU+Jm5ic3A7Cis8cD5UaGUgZm9sbG93aW5nIHJ1bGVzIGFyZSBhcHBsaWVkIHRvIGRlY29tcG9zZSB0aGUgY29udG91cidzIHBvaW50cyBpbnRvCitzZWdtZW50cyBhbmQgYXJjcyA6Cis8YmxvY2txdW90ZT4KKzxsaT4KK3R3byBzdWNjZXNzaXZlICJvbiIgcG9pbnRzIGluZGljYXRlIGEgbGluZSBzZWdtZW50IGpvaW5pbmcgdGhlbS48L2xpPgorPC9ibG9ja3F1b3RlPgorPC9ibG9ja3F1b3RlPgorCis8dWw+Cis8dWw+Cis8bGk+CitvbmUgY29uaWMgIm9mZiIgcG9pbnQgYW1pZHN0IHR3byAib24iIHBvaW50cyBpbmRpY2F0ZXMgYSBjb25pYyBiZXppZXIgYXJjLAordGhlICJvZmYiIHBvaW50IGJlaW5nIHRoZSBjb250cm9sIHBvaW50LCBhbmQgdGhlICJvbiIgb25lcyB0aGUgc3RhcnQgYW5kCitlbmQgcG9pbnRzLjwvbGk+Cis8L3VsPgorPC91bD4KKworPHVsPgorPHVsPgorPGxpPgorVHdvIHN1Y2Nlc3NpdmUgY3ViaWMgIm9mZiIgcG9pbnRzIGFtaWRzdCB0d28gIm9uIiBwb2ludHMgaW5kaWNhdGUgYSBjdWJpYworYmV6aWVyIGFyYy4gVGhlcmUgbXVzdCBiZSBleGFjdGx5IHR3byBjdWJpYyBjb250cm9sIHBvaW50cyBhbmQgdHdvIG9uIHBvaW50cworZm9yIGVhY2ggY3ViaWMgYXJjICh1c2luZyBhIHNpbmdsZSBjdWJpYyAib2ZmIiBwb2ludCBiZXR3ZWVuIHR3byAib24iIHBvaW50cworaXMgZm9yYmlkZGVuLCBmb3IgZXhhbXBsZSkuPC9saT4KKzwvdWw+Cis8L3VsPgorCis8dWw+Cis8dWw+Cis8bGk+CitmaW5hbGx5LCB0d28gc3VjY2Vzc2l2ZSBjb25pYyAib2ZmIiBwb2ludHMgZm9yY2VzIHRoZSByYXN0ZXJpemVyIHRvIGNyZWF0ZQorKGR1cmluZyB0aGUgc2Nhbi1saW5lIGNvbnZlcnNpb24gcHJvY2VzcyBleGNsdXNpdmVseSkgYSB2aXJ0dWFsICJvbiIgcG9pbnQKK2FtaWRzdCB0aGVtLCBhdCB0aGVpciBleGFjdCBtaWRkbGUuIFRoaXMgZ3JlYXRseSBmYWNpbGl0YXRlcyB0aGUgZGVmaW5pdGlvbgorb2Ygc3VjY2Vzc2l2ZSBjb25pYyBiZXppZXIgYXJjcy4gTW9yZW92ZXIsIGl0J3MgdGhlIHdheSBvdXRsaW5lcyBhcmUgZGVzY3JpYmVkCitpbiB0aGUgVHJ1ZVR5cGUgc3BlY2lmaWNhdGlvbi48L2xpPgorPC91bD4KKworPHA+PGJyPk5vdGUgdGhhdCBpdCBpcyBwb3NzaWJsZSB0byBtaXggY29uaWMgYW5kIGN1YmljIGFyY3MgaW4gYSBzaW5nbGUKK2NvbnRvdXIsIGV2ZW4gdGhvdWdoIG5vIGN1cnJlbnQgZm9udCBkcml2ZXIgcHJvZHVjZXMgc3VjaCBvdXRsaW5lcy4KKzxicj4mbmJzcDs8L3VsPgorCis8Y2VudGVyPjx0YWJsZT4KKzx0cj4KKzx0ZD4KKzxibG9ja3F1b3RlPjxpbWcgU1JDPSJwb2ludHNfc2VnbWVudC5naWYiIGhlaWdodD0xNjYgd2lkdGg9MjIxPjwvYmxvY2txdW90ZT4KKzwvdGQ+CisKKzx0ZD4KKzxibG9ja3F1b3RlPjxpbWcgU1JDPSJwb2ludHNfY29uaWMuZ2lmIiBoZWlnaHQ9MTgzIHdpZHRoPTIzNj48L2Jsb2NrcXVvdGU+Cis8L3RkPgorPC90cj4KKworPHRyPgorPHRkPgorPGJsb2NrcXVvdGU+PGltZyBTUkM9InBvaW50c19jdWJpYy5naWYiIGhlaWdodD0xNjIgd2lkdGg9MjE0PjwvYmxvY2txdW90ZT4KKzwvdGQ+CisKKzx0ZD4KKzxibG9ja3F1b3RlPjxpbWcgU1JDPSJwb2ludHNfY29uaWMyLmdpZiIgaGVpZ2h0PTIwNCB3aWR0aD0yMjU+PC9ibG9ja3F1b3RlPgorPC90ZD4KKzwvdHI+Cis8L3RhYmxlPjwvY2VudGVyPgorCis8aDQ+CitiLiBPdXRsaW5lIGRlc2NyaXB0b3IgOjwvaDQ+CisKKzxibG9ja3F1b3RlPkEgRnJlZVR5cGUgb3V0bGluZSBpcyBkZXNjcmliZWQgdGhyb3VnaCBhIHNpbXBsZSBzdHJ1Y3R1cmUsCitjYWxsZWQgPHR0PkZUX091dGxpbmU8L3R0Piwgd2hpY2ggZmllbGRzIGFyZSA6Cis8YnI+Jm5ic3A7Cis8YnI+Jm5ic3A7Cis8Y2VudGVyPjx0YWJsZSBDRUxMU1BBQ0lORz0zIENFTExQQURESU5HPTMgQkdDT0xPUj0iI0NDQ0NDQyIgPgorPHRyPgorPHRkPjxiPjx0dD5uX3BvaW50czwvdHQ+PC9iPjwvdGQ+CisKKzx0ZD50aGUgbnVtYmVyIG9mIHBvaW50cyBpbiB0aGUgb3V0bGluZTwvdGQ+Cis8L3RyPgorCis8dHI+Cis8dGQ+PGI+PHR0Pm5fY29udG91cnM8L3R0PjwvYj48L3RkPgorCis8dGQ+dGhlIG51bWJlciBvZiBjb250b3VycyBpbiB0aGUgb3V0bGluZTwvdGQ+Cis8L3RyPgorCis8dHI+Cis8dGQ+PGI+PHR0PnBvaW50czwvdHQ+PC9iPjwvdGQ+CisKKzx0ZD5hcnJheSBvZiBwb2ludCBjb29yZGluYXRlczwvdGQ+Cis8L3RyPgorCis8dHI+Cis8dGQ+PGI+PHR0PmNvbnRvdXJzPC90dD48L2I+PC90ZD4KKworPHRkPmFycmF5IG9mIGNvbnRvdXIgZW5kIGluZGljZXM8L3RkPgorPC90cj4KKworPHRyPgorPHRkPjxiPjx0dD5mbGFnczwvdHQ+PC9iPjwvdGQ+CisKKzx0ZD5hcnJheSBvZiBwb2ludCBmbGFnczwvdGQ+Cis8L3RyPgorPC90YWJsZT48L2NlbnRlcj4KKworPHA+SGVyZSwgPGI+PHR0PnBvaW50czwvdHQ+PC9iPiBpcyBhIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgPHR0PkZUX1ZlY3RvcjwvdHQ+CityZWNvcmRzLCB1c2VkIHRvIHN0b3JlIHRoZSB2ZWN0b3JpYWwgY29vcmRpbmF0ZXMgb2YgZWFjaCBvdXRsaW5lIHBvaW50LgorVGhlc2UgYXJlIGV4cHJlc3NlZCBpbiAxLzY0dGggb2YgYSBwaXhlbCwgd2hpY2ggaXMgYWxzbyBrbm93biBhcyB0aGUgPGk+MjYuNgorZml4ZWQgZmxvYXQgZm9ybWF0PC9pPi4KKzxwPjxiPjx0dD5jb250b3VyczwvdHQ+PC9iPiBpcyBhbiBhcnJheSBvZiBwb2ludCBpbmRpY2VzIHVzZWQgdG8gZGVsaW1pdAorY29udG91cnMgaW4gdGhlIG91dGxpbmUuIEZvciBleGFtcGxlLCB0aGUgZmlyc3QgY29udG91ciBhbHdheXMgc3RhcnRzIGF0Citwb2ludCAwLCBhbmQgZW5kcyBhIHBvaW50IDxiPjx0dD5jb250b3Vyc1swXTwvdHQ+PC9iPi4gVGhlIHNlY29uZCBjb250b3VyCitzdGFydHMgYXQgcG9pbnQgIjxiPjx0dD5jb250b3Vyc1swXSsxPC90dD48L2I+IiBhbmQgZW5kcyBhdCA8Yj48dHQ+Y29udG91cnNbMV08L3R0PjwvYj4sCitldGMuLgorPHA+Tm90ZSB0aGF0IGVhY2ggY29udG91ciBpcyBjbG9zZWQsIGFuZCB0aGF0IDxiPjx0dD5uX3BvaW50czwvdHQ+PC9iPgorc2hvdWxkIGJlIGVxdWFsIHRvICI8Yj48dHQ+Y29udG91cnNbbl9jb250b3Vycy0xXSsxPC90dD48L2I+IiBmb3IgYSB2YWxpZAorb3V0bGluZS4KKzxwPkZpbmFsbHksIDxiPjx0dD5mbGFnczwvdHQ+PC9iPiBpcyBhbiBhcnJheSBvZiBieXRlcywgdXNlZCB0byBzdG9yZSBlYWNoCitvdXRsaW5lIHBvaW50J3MgdGFnLgorPGJyPiZuYnNwOworPGJyPiZuYnNwOzwvYmxvY2txdW90ZT4KKzwvYmxvY2txdW90ZT4KKworPGgzPgorMi4gQm91bmRpbmcgYW5kIGNvbnRyb2wgYm94IGNvbXB1dGF0aW9ucyA6PC9oMz4KKworPGJsb2NrcXVvdGU+QSA8Yj5ib3VuZGluZyBib3g8L2I+IChhbHNvIGNhbGxlZCAiPGI+YmJveDwvYj4iKSBpcyBzaW1wbHkKK3RoZSBzbWFsbGVzdCBwb3NzaWJsZSByZWN0YW5nbGUgdGhhdCBlbmNsb3NlcyB0aGUgc2hhcGUgb2YgYSBnaXZlbiBvdXRsaW5lLgorQmVjYXVzZSBvZiB0aGUgd2F5IGFyY3MgYXJlIGRlZmluZWQsIGJlemllciBjb250cm9sIHBvaW50cyBhcmUgbm90IG5lY2Vzc2FyaWx5Citjb250YWluZWQgd2l0aGluIGFuIG91dGxpbmUncyBib3VuZGluZyBib3guCis8cD5UaGlzIHNpdHVhdGlvbiBoYXBwZW5zIHdoZW4gb25lIGJlemllciBhcmMgaXMsIGZvciBleGFtcGxlLCB0aGUgdXBwZXIKK2VkZ2Ugb2YgYW4gb3V0bGluZSBhbmQgYW4gb2ZmIHBvaW50IGhhcHBlbnMgdG8gYmUgYWJvdmUgdGhlIGJib3guIEhvd2V2ZXIsCitpdCBpcyB2ZXJ5IHJhcmUgaW4gdGhlIGNhc2Ugb2YgY2hhcmFjdGVyIG91dGxpbmVzIGJlY2F1c2UgbW9zdCBmb250IGRlc2lnbmVycworYW5kIGNyZWF0aW9uIHRvb2xzIGFsd2F5cyBwbGFjZSBvbiBwb2ludHMgYXQgdGhlIGV4dHJlbWEgb2YgZWFjaCBjdXJ2ZWQKK2VkZ2VzLCBhcyBpdCBtYWtlcyBoaW50aW5nIG11Y2ggZWFzaWVyLgorPHA+V2UgdGh1cyBkZWZpbmUgdGhlIDxiPmNvbnRyb2wgYm94PC9iPiAoYS5rLmEuIHRoZSAiPGI+Y2JveDwvYj4iKSBhcwordGhlIHNtYWxsZXN0IHBvc3NpYmxlIHJlY3RhbmdsZSB0aGF0IGVuY2xvc2VzIGFsbCBwb2ludHMgb2YgYSBnaXZlbiBvdXRsaW5lCisoaW5jbHVkaW5nIGl0cyBvZmYgcG9pbnRzKS4gQ2xlYXJseSwgaXQgYWx3YXlzIGluY2x1ZGVzIHRoZSBiYm94LCBhbmQgZXF1YXRlcworaXQgaW4gbW9zdCBjYXNlcy4KKzxwPlVubGlrZSB0aGUgYmJveCwgdGhlIGNib3ggaXMgYWxzbyBtdWNoIGZhc3RlciB0byBjb21wdXRlLgorPGJyPiZuYnNwOworPGNlbnRlcj48dGFibGU+Cis8dHI+Cis8dGQ+PGltZyBTUkM9ImJib3gxLmdpZiIgaGVpZ2h0PTI2NCB3aWR0aD0yMjg+PC90ZD4KKworPHRkPjxpbWcgU1JDPSJiYm94Mi5naWYiIGhlaWdodD0yMjkgd2lkdGg9MjE3PjwvdGQ+Cis8L3RyPgorPC90YWJsZT48L2NlbnRlcj4KKworPHA+Q29udHJvbCBhbmQgYm91bmRpbmcgYm94ZXMgY2FuIGJlIGNvbXB1dGVkIGF1dG9tYXRpY2FsbHkgdGhyb3VnaCB0aGUKK2Z1bmN0aW9ucyA8Yj48dHQ+RlRfR2V0X091dGxpbmVfQ0JveDwvdHQ+PC9iPiBhbmQgPGI+PHR0PkZUX0dldF9PdXRsaW5lX0JCb3g8L3R0PjwvYj4uCitUaGUgZm9ybWVyIGZ1bmN0aW9uIGlzIGFsd2F5cyB2ZXJ5IGZhc3QsIHdoaWxlIHRoZSBsYXR0ZXIgPGk+bWF5PC9pPiBiZQorc2xvdyBpbiB0aGUgY2FzZSBvZiAib3V0c2lkZSIgY29udHJvbCBwb2ludHMgKGFzIGl0IG5lZWRzIHRvIGZpbmQgdGhlIGV4dHJlbWUKK29mIGNvbmljIGFuZCBjdWJpYyBhcmNzIGZvciAicGVyZmVjdCIgY29tcHV0YXRpb25zKS4gSWYgdGhpcyBpc24ndCB0aGUKK2Nhc2UsIGl0J3MgYXMgZmFzdCBhcyBjb21wdXRpbmcgdGhlIGNvbnRyb2wgYm94LgorPHA+Tm90ZSBhbHNvIHRoYXQgZXZlbiB0aG91Z2ggbW9zdCBnbHlwaCBvdXRsaW5lcyBoYXZlIGVxdWFsIGNib3ggYW5kIGJib3gKK3RvIGVhc2UgaGludGluZywgdGhpcyBpcyBub3QgbmVjZXNzYXJ5IHRoZSBjYXNlIGFueW1vcmUgd2hlbiBhCis8YnI+dHJhbnNmb3JtIGxpa2Ugcm90YXRpb24gaXMgYXBwbGllZCB0byB0aGVtLgorPGJyPiZuYnNwOzwvYmxvY2txdW90ZT4KKworPGgzPgorJm5ic3A7My4gQ29vcmRpbmF0ZXMsIHNjYWxpbmcgYW5kIGdyaWQtZml0dGluZyA6PC9oMz4KKworPGJsb2NrcXVvdGU+QW4gb3V0bGluZSBwb2ludCdzIHZlY3RvcmlhbCBjb29yZGluYXRlcyBhcmUgZXhwcmVzc2VkIGluIHRoZQorMjYuNiBmb3JtYXQsIGkuZS4gaW4gMS82NHRoIG9mIGEgcGl4ZWwsIGhlbmNlIGNvb3JkaW5hdGVzICgxLjAsIC0yLjUpIGlzCitzdG9yZWQgYXMgdGhlIGludGVnZXIgcGFpciAoIHg6NjQsIHk6IC0xOTIgKS4KKzxwPkFmdGVyIGEgbWFzdGVyIGdseXBoIG91dGxpbmUgaXMgc2NhbGVkIGZyb20gdGhlIEVNIGdyaWQgdG8gdGhlIGN1cnJlbnQKK2NoYXJhY3RlciBkaW1lbnNpb25zLCB0aGUgaGludGVyIG9yIGdyaWQtZml0dGVyIGlzIGluIGNoYXJnZSBvZiBhbGlnbmluZworaW1wb3J0YW50IG91dGxpbmUgcG9pbnRzIChtYWlubHkgZWRnZSBkZWxpbWl0ZXJzKSB0byB0aGUgcGl4ZWwgZ3JpZC4gRXZlbgordGhvdWdoIHRoaXMgcHJvY2VzcyBpcyBtdWNoIHRvbyBjb21wbGV4IHRvIGJlIGRlc2NyaWJlZCBpbiBhIGZldyBsaW5lcywKK2l0cyBwdXJwb3NlIGlzIG1haW5seSB0byByb3VuZCBwb2ludCBwb3NpdGlvbnMsIHdoaWxlIHRyeWluZyB0byBwcmVzZXJ2ZQoraW1wb3J0YW50IHByb3BlcnRpZXMgbGlrZSB3aWR0aHMsIHN0ZW1zLCBldGMuLgorPHA+VGhlIGZvbGxvd2luZyBvcGVyYXRpb25zIGNhbiBiZSB1c2VkIHRvIHJvdW5kIHZlY3RvcmlhbCBkaXN0YW5jZXMgaW4KK3RoZSAyNi42IGZvcm1hdCB0byB0aGUgZ3JpZCA6Cis8Y2VudGVyPgorPHA+PHR0PnJvdW5kKHgpJm5ic3A7Jm5ic3A7ID09Jm5ic3A7ICh4KzMyKSAmYW1wOyAtNjQ8L3R0PgorPGJyPjx0dD5mbG9vcih4KSZuYnNwOyZuYnNwOyA9PSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyB4ICZhbXA7CistNjQ8L3R0PgorPGJyPjx0dD5jZWlsaW5nKHgpID09Jm5ic3A7ICh4KzYzKSAmYW1wOyAtNjQ8L3R0PjwvY2VudGVyPgorCis8cD5PbmNlIGEgZ2x5cGggb3V0bGluZSBpcyBncmlkLWZpdHRlZCBvciB0cmFuc2Zvcm1lZCwgaXQgb2Z0ZW4gaXMgaW50ZXJlc3RpbmcKK3RvIGNvbXB1dGUgdGhlIGdseXBoIGltYWdlJ3MgcGl4ZWwgZGltZW5zaW9ucyBiZWZvcmUgcmVuZGVyaW5nIGl0LiBUbyBkbworc28sIG9uZSBoYXMgdG8gY29uc2lkZXIgdGhlIGZvbGxvd2luZyA6Cis8cD5UaGUgc2Nhbi1saW5lIGNvbnZlcnRlciBkcmF3cyBhbGwgdGhlIHBpeGVscyB3aG9zZSA8aT5jZW50ZXJzPC9pPiBmYWxsCitpbnNpZGUgdGhlIGdseXBoIHNoYXBlLiBJdCBjYW4gYWxzbyBkZXRlY3QgIjxiPjxpPmRyb3Atb3V0czwvaT48L2I+IiwgaS5lLgorZGlzY29udGludWl0aWVzIGNvbWluZyBmcm9tIGV4dHJlbWVseSB0aGluIHNoYXBlIGZyYWdtZW50cywgaW4gb3JkZXIgdG8KK2RyYXcgdGhlICJtaXNzaW5nIiBwaXhlbHMuIFRoZXNlIG5ldyBwaXhlbHMgYXJlIGFsd2F5cyBsb2NhdGVkIGF0IGEgZGlzdGFuY2UKK2xlc3MgdGhhbiBoYWxmIG9mIGEgcGl4ZWwgYnV0IG9uZSBjYW5ub3QgcHJlZGljdCBlYXNpbHkgd2hlcmUgdGhleSdsbCBhcHBlYXIKK2JlZm9yZSByZW5kZXJpbmcuCis8cD5UaGlzIGxlYWRzIHRvIHRoZSBmb2xsb3dpbmcgY29tcHV0YXRpb25zIDoKKzxicj4mbmJzcDsKKzx1bD4KKzxsaT4KK2NvbXB1dGUgdGhlIGJib3g8L2xpPgorPC91bD4KKworPHVsPgorPGxpPgorZ3JpZC1maXQgdGhlIGJvdW5kaW5nIGJveCB3aXRoIHRoZSBmb2xsb3dpbmcgOjwvbGk+Cis8L3VsPgorCis8dWw+Cis8dWw+PHR0PnhtaW4gPSBmbG9vciggYmJveC54TWluICk8L3R0PgorPGJyPjx0dD54bWF4ID0gY2VpbGluZyggYmJveC54TWF4ICk8L3R0PgorPGJyPjx0dD55bWluID0gZmxvb3IoIGJib3gueU1pbiApPC90dD4KKzxicj48dHQ+eW1heCA9IGNlaWxpbmcoIGJib3gueU1heCApPC90dD48L3VsPgorCis8bGk+CityZXR1cm4gcGl4ZWwgZGltZW5zaW9ucywgaS5lLiA8dHQ+d2lkdGggPSAoeG1heCAtIHhtaW4pLzY0PC90dD4gYW5kIDx0dD5oZWlnaHQKKz0gKHltYXggLSB5bWluKS82NDwvdHQ+PC9saT4KKzwvdWw+CisKKzxwPjxicj5CeSBncmlkLWZpdHRpbmcgdGhlIGJvdW5kaW5nIGJveCwgb25lIGd1YXJhbnRlZXMgdGhhdCBhbGwgdGhlIHBpeGVsCitjZW50ZXJzIHRoYXQgYXJlIHRvIGJlIGRyYXduLCA8Yj48aT5pbmNsdWRpbmcgdGhvc2UgY29taW5nIGZyb20gZHJvcC1vdXQKK2NvbnRyb2w8L2k+PC9iPiwgd2lsbCBiZSA8Yj48aT53aXRoaW48L2k+PC9iPiB0aGUgYWRqdXN0ZWQgYm94LiBUaGVuIHRoZQorYm94J3MgZGltZW5zaW9ucyBpbiBwaXhlbHMgY2FuIGJlIGNvbXB1dGVkLgorPHA+Tm90ZSBhbHNvIHRoYXQsIHdoZW4gPGk+dHJhbnNsYXRpbmc8L2k+IGEgPGk+Z3JpZC1maXR0ZWQgb3V0bGluZTwvaT4sCitvbmUgc2hvdWxkIDxiPjxpPmFsd2F5czwvaT48L2I+IHVzZSA8Yj48aT5pbnRlZ2VyIGRpc3RhbmNlczwvaT48L2I+IHRvCittb3ZlIGFuIG91dGxpbmUgaW4gdGhlIDJEIHBsYW5lLiBPdGhlcndpc2UsIGdseXBoIGVkZ2VzIHdvbid0IGJlIGFsaWduZWQKK29uIHRoZSBwaXhlbCBncmlkIGFueW1vcmUsIGFuZCB0aGUgaGludGVyJ3Mgd29yayB3aWxsIGJlIGxvc3QsIHByb2R1Y2luZworPGI+PGk+dmVyeQorbG93IHF1YWxpdHkgPC9pPjwvYj5iaXRtYXBzIGFuZCBwaXhtYXBzLi48L2Jsb2NrcXVvdGU+Cis8L2Jsb2NrcXVvdGU+CisKKzxociBXSURUSD0iMTAwJSI+Cis8aDI+CitWSUkuIEZyZWVUeXBlIGJpdG1hcHMgOjwvaDI+CisKKzxibG9ja3F1b3RlPlRoZSBwdXJwb3NlIG9mIHRoaXMgc2VjdGlvbiBpcyB0byBwcmVzZW50IHRoZSB3YXkgRnJlZVR5cGUKK21hbmFnZXMgYml0bWFwcyBhbmQgcGl4bWFwcywgYW5kIGhvdyB0aGV5IHJlbGF0ZSB0byB0aGUgY29uY2VwdHMgcHJldmlvdXNseQorZGVmaW5lZC4gVGhlIHJlbGF0aW9uc2hpcHMgYmV0d2VlbiB2ZWN0b3JpYWwgYW5kIHBpeGVsIGNvb3JkaW5hdGVzIGlzIGV4cGxhaW5lZC4KKzxicj4mbmJzcDsKKzxoMz4KKzEuIEZyZWVUeXBlIGJpdG1hcCBhbmQgcGl4bWFwIGRlc2NyaXB0b3IgOjwvaDM+CisKKzxibG9ja3F1b3RlPkEgYml0bWFwIG9yIHBpeG1hcCBpcyBkZXNjcmliZWQgdGhyb3VnaCBhIHNpbmdsZSBzdHJ1Y3R1cmUsCitjYWxsZWQgPHR0PkZUX1Jhc3Rlcl9NYXA8L3R0Pi4gSXQgaXMgYSBzaW1wbGUgZGVzY3JpcHRvciB3aG9zZSBmaWVsZHMgYXJlCis6Cis8YnI+Jm5ic3A7Cis8YnI+Jm5ic3A7Cis8Y2VudGVyPjx0YWJsZSBDRUxMU1BBQ0lORz0zIENFTExQQURESU5HPTUgQkdDT0xPUj0iI0NDQ0NDQyIgPgorPGNhcHRpb24+PHR0PkZUX1Jhc3Rlcl9NYXA8L3R0PjwvY2FwdGlvbj4KKworPHRyPgorPHRkPjxiPnJvd3M8L2I+PC90ZD4KKworPHRkPnRoZSBudW1iZXIgb2Ygcm93cywgaS5lLiBsaW5lcywgaW4gdGhlIGJpdG1hcDwvdGQ+Cis8L3RyPgorCis8dHI+Cis8dGQ+PGI+d2lkdGg8L2I+PC90ZD4KKworPHRkPnRoZSBudW1iZXIgb2YgaG9yaXpvbnRhbCBwaXhlbHMgaW4gdGhlIGJpdG1hcDwvdGQ+Cis8L3RyPgorCis8dHI+Cis8dGQ+PGI+Y29sczwvYj48L3RkPgorCis8dGQ+dGhlIG51bWJlciBvZiAiY29sdW1ucyIsIGkuZS4gYnl0ZXMgcGVyIGxpbmUsIGluIHRoZSBiaXRtYXA8L3RkPgorPC90cj4KKworPHRyPgorPHRkPjxiPmZsb3c8L2I+PC90ZD4KKworPHRkPnRoZSBiaXRtYXAncyBmbG93LCBpLmUuIG9yaWVudGF0aW9uIG9mIHJvd3MgKHNlZSBiZWxvdyk8L3RkPgorPC90cj4KKworPHRyPgorPHRkPjxiPnBpeF9iaXRzPC9iPjwvdGQ+CisKKzx0ZD50aGUgbnVtYmVyIG9mIGJpdHMgcGVyIHBpeGVscy4gdmFsaWQgdmFsdWVzIGFyZSAxLCA0LCA4IGFuZCAxNjwvdGQ+Cis8L3RyPgorCis8dHI+Cis8dGQ+PGI+YnVmZmVyPC9iPjwvdGQ+CisKKzx0ZD5hIHR5cGVsZXNzIHBvaW50ZXIgdG8gdGhlIGJpdG1hcCBwaXhlbCBidWZlcjwvdGQ+Cis8L3RyPgorPC90YWJsZT48L2NlbnRlcj4KKworPHA+VGhlIGJpdG1hcCdzIDxiPjx0dD5mbG93PC90dD48L2I+IGRldGVybWluZXMgd2V0aGVyIHRoZSByb3dzIGluIHRoZQorcGl4ZWwgYnVmZmVyIGFyZSBzdG9yZWQgaW4gYXNjZW5kaW5nIG9yIGRlc2NlbmRpbmcgb3JkZXIuIFBvc3NpYmxlIHZhbHVlcworYXJlIDxiPjx0dD5GVF9GbG93X1VwPC90dD48L2I+ICh2YWx1ZSAxKSBhbmQgPGI+PHR0PkZUX0Zsb3dfRG93bjwvdHQ+PC9iPgorKHZhbHVlIC0xKS4KKzxwPlJlbWVtYmVyIHRoYXQgRnJlZVR5cGUgdXNlcyB0aGUgPGk+WSB1cHdhcmRzPC9pPiBjb252ZW50aW9uIGluIHRoZSAyRAorcGxhbmUuIFdoaWNoIG1lYW5zIHRoYXQgYSBjb29yZGluYXRlIG9mICgwLDApIGFsd2F5cyByZWZlciB0byB0aGUgPGk+bG93ZXItbGVmdAorY29ybmVyPC9pPiBvZiBhIGJpdG1hcC4KKzxwPkluIHRoZSBjYXNlIG9mIGFuICc8aT51cDwvaT4nIGZsb3csIHRoZSByb3dzIGFyZSBzdG9yZWQgaW4gaW5jcmVhc2luZwordmVydGljYWwgcG9zaXRpb24sIHdoaWNoIG1lYW5zIHRoYXQgdGhlIGZpcnN0IGJ5dGVzIG9mIHRoZSBwaXhlbCBidWZmZXIKK2FyZSBwYXJ0IG9mIHRoZSA8aT5sb3dlcjwvaT4gYml0bWFwIHJvdy4gT24gdGhlIG9wcG9zaXRlLCBhICc8aT5kb3duPC9pPicKK2Zsb3cgbWVhbnMgdGhhdCB0aGUgZmlyc3QgYnVmZmVyIGJ5dGVzIGFyZSBwYXJ0IG9mIHRoZSA8aT51cHBlcjwvaT4gYml0bWFwCityb3csIGkuZS4gdGhlIGxhc3Qgb25lIGluIGFzY2VuZGluZyBvcmRlci4KKzxwPkFzIGEgaGludCwgY29uc2lkZXIgdGhhdCB3aGVuIHJlbmRlcmluZyBhbiBvdXRsaW5lIGludG8gYSBXaW5kb3dzIG9yCitYMTEgYml0bWFwIGJ1ZmZlciwgb25lIHNob3VsZCBhbHdheXMgdXNlIGEgZG93biBmbG93IGluIHRoZSBiaXRtYXAgZGVzY3JpcHRvci4KKzxicj4mbmJzcDsKKzxjZW50ZXI+PHRhYmxlPgorPHRyPgorPHRkPjxpbWcgU1JDPSJ1cF9mbG93LmdpZiIgaGVpZ2h0PTI5OCB3aWR0aD0yOTE+PC90ZD4KKworPHRkPjxpbWcgU1JDPSJkb3duX2Zsb3cuZ2lmIiBoZWlnaHQ9Mjk4IHdpZHRoPTMxMz48L3RkPgorPC90cj4KKworPHRyPgorPHRkPjwvdGQ+CisKKzx0ZD48L3RkPgorPC90cj4KKzwvdGFibGU+PC9jZW50ZXI+Cis8L2Jsb2NrcXVvdGU+CisKKzxoMz4KKzIuIFZlY3RvcmlhbCB2ZXJzdXMgcGl4ZWwgY29vcmRpbmF0ZXMgOjwvaDM+CisKKzxibG9ja3F1b3RlPlRoaXMgc3ViLXNlY3Rpb24gZXhwbGFpbnMgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gdmVjdG9yaWFsCithbmQgcGl4ZWwgY29vcmRpbmF0ZXMuIFRvIG1ha2UgdGhpbmdzIGNsZWFyLCBicmFja2V0cyB3aWxsIGJlIHVzZWQgdG8gZGVzY3JpYmUKK3BpeGVsIGNvb3JkaW5hdGVzLCBlLmcuIFszLDVdLCB3aGlsZSBwYXJlbnRoZXNlcyB3aWxsIGJlIHVzZWQgZm9yIHZlY3RvcmlhbAorb25lcywgZS5nLiAoLTIsMy41KS4KKzxwPkluIHRoZSBwaXhlbCBjYXNlLCBhcyB3ZSB1c2UgdGhlIDxpPlkgdXB3YXJkczwvaT4gY29udmVudGlvbiwgdGhlIGNvb3JkaW5hdGUKK1swLDBdIGFsd2F5cyByZWZlcnMgdG8gdGhlIDxpPmxvd2VyIGxlZnQgcGl4ZWw8L2k+IG9mIGEgYml0bWFwLCB3aGlsZSBjb29yZGluYXRlCitbd2lkdGgtMSwgcm93cy0xXSB0byBpdHMgPGk+dXBwZXIgcmlnaHQgcGl4ZWw8L2k+LgorPHA+SW4gdGhlIHZlY3RvcmlhbCBjYXNlLCBwb2ludCBjb29yZGluYXRlcyBhcmUgZXhwcmVzc2VkIGluIGZsb2F0aW5nIHVuaXRzLAorbGlrZSAoMS4yNSwgLTIuMykuIFN1Y2ggYSBwb3NpdGlvbiBkb2Vzbid0IHJlZmVyIHRvIGEgZ2l2ZW4gcGl4ZWwsIGJ1dAorc2ltcGx5IHRvIGFuIGltbWF0ZXJpYWwgcG9pbnQgaW4gdGhlIDJEIHBsYW5lCis8cD5UaGUgcGl4ZWxzIHRoZW1zZWx2ZXMgYXJlIGluZGVlZCA8aT5zcXVhcmUgYm94ZXM8L2k+IG9mIHRoZSAyRCBwbGFuZSwKK3doaWNoIGNlbnRlcnMgbGllIGluIGhhbGYgcGl4ZWwgY29vcmRpbmF0ZXMuIEZvciBleGFtcGxlLCB0aGUgPGk+bG93ZXIKK2xlZnQgcGl4ZWw8L2k+IG9mIGEgYml0bWFwIGlzIGRlbGltaXRlZCBieSB0aGUgPGk+c3F1YXJlPC9pPiAoMCwwKS0oMSwxKSwKK2l0cyBjZW50ZXIgYmVpbmcgYXQgbG9jYXRpb24gKDAuNSwwLjUpLgorPHA+VGhpcyBpbnRyb2R1Y2VzIHNvbWUgZGlmZmVyZW5jZXMgd2hlbiBjb21wdXRpbmcgZGlzdGFuY2VzLiBGb3IgZXhhbXBsZSwKK3RoZSAiPGk+bGVuZ3RoPC9pPiIgaW4gcGl4ZWxzIG9mIHRoZSBsaW5lIFswLDBdLVsxMCwwXSBpcyAxMS4gSG93ZXZlciwKK3RoZSB2ZWN0b3JpYWwgZGlzdGFuY2UgYmV0d2VlbiAoMCwwKS0oMTAsMCkgY292ZXJzIGV4YWN0bHkgMTAgcGl4ZWwgY2VudGVycywKK2hlbmNlIGl0cyBsZW5ndGggaWYgMTAuCis8Y2VudGVyPjxpbWcgU1JDPSJncmlkXzEuZ2lmIiBoZWlnaHQ9MzkwIHdpZHRoPTQwMj48L2NlbnRlcj4KKzwvYmxvY2txdW90ZT4KKworPGgzPgorMy4gQ29udmVydGluZyBvdXRsaW5lcyBpbnRvIGJpdG1hcHMgYW5kIHBpeG1hcHMgOjwvaDM+CisKKzxibG9ja3F1b3RlPkdlbmVyYXRpbmcgYSBiaXRtYXAgb3IgcGl4bWFwIGltYWdlIGZyb20gYSB2ZWN0b3JpYWwgaW1hZ2UKK2lzIGVhc3kgd2l0aCBGcmVlVHlwZS4gSG93ZXZlciwgb25lIG11c3QgdW5kZXJzdGFuZCBhIGZldyBwb2ludHMgcmVnYXJkaW5nCit0aGUgcG9zaXRpb25pbmcgb2YgdGhlIG91dGxpbmUgaW4gdGhlIDJEIHBsYW5lIGJlZm9yZSBjYWxsaW5nIHRoZSBmdW5jdGlvbgorPGI+PHR0PkZUX0dldF9PdXRsaW5lX0JpdG1hcDwvdHQ+PC9iPi4KK1RoZXNlIGFyZSA6Cis8YnI+Jm5ic3A7Cis8dWw+Cis8bGk+CitUaGUgZ2x5cGggbG9hZGVyIGFuZCBoaW50ZXIgYWx3YXlzIHBsYWNlcyB0aGUgb3V0bGluZSBpbiB0aGUgMkQgcGxhbmUgc28KK3RoYXQgKDAsMCkgbWF0Y2hlcyBpdHMgY2hhcmFjdGVyIG9yaWdpbi4gVGhpcyBtZWFucyB0aGF0IHRoZSBnbHlwaJJzIG91dGxpbmUsCithbmQgY29ycmVzcG9uZGluZyBib3VuZGluZyBib3gsIGNhbiBiZSBwbGFjZWQgYW55d2hlcmUgaW4gdGhlIDJEIHBsYW5lCisoc2VlIHRoZSBncmFwaGljcyBpbiBzZWN0aW9uIElJSSkuPC9saT4KKzwvdWw+CisKKzx1bD4KKzxsaT4KK1RoZSB0YXJnZXQgYml0bWFwknMgYXJlYSBpcyBtYXBwZWQgdG8gdGhlIDJEIHBsYW5lLCB3aXRoIGl0cyBsb3dlciBsZWZ0Citjb3JuZXIgYXQgKDAsMCkuIFRoaXMgbWVhbnMgdGhhdCBhIGJpdG1hcCBvciBwaXhtYXAgb2YgZGltZW5zaW9ucyBbPHR0PncsaDwvdHQ+XQord2lsbCBiZSBtYXBwZWQgdG8gYSAyRCByZWN0YW5nbGUgd2luZG93IGRlbGltaXRlZCBieSAoMCwwKS0oPHR0PncsaDwvdHQ+KS48L2xpPgorPC91bD4KKworPHVsPgorPGxpPgorV2hlbiBjYWxsaW5nIDxiPjx0dD5GVF9HZXRfT3V0bGluZV9CaXRtYXA8L3R0PjwvYj4sIGV2ZXJ5dGhpbmcgdGhhdCBmYWxscword2l0aGluIHRoZSBiaXRtYXAgd2luZG93IGlzIHJlbmRlcmVkLCB0aGUgcmVzdCBpcyBpZ25vcmVkLjwvbGk+Cis8L3VsPgorCis8cD48YnI+QSBjb21tb24gbWlzdGFrZSBtYWRlIGJ5IG1hbnkgZGV2ZWxvcGVycyB3aGVuIHRoZXkgYmVnaW4gdXNpbmcgRnJlZVR5cGUKK2lzIGJlbGlldmluZyB0aGF0IGEgbG9hZGVkIG91dGxpbmUgY2FuIGJlIGRpcmVjdGx5IHJlbmRlcmVkIGluIGEgYml0bWFwCitvZiBhZGVxdWF0ZSBkaW1lbnNpb25zLiBUaGUgZm9sbG93aW5nIGltYWdlcyBpbGx1c3RyYXRlIHdoeSB0aGlzIGlzIGEgcHJvYmxlbQorOgorPHVsPgorPHVsPgorPGxpPgordGhlIGZpcnN0IGltYWdlIHNob3dzIGEgbG9hZGVkIG91dGxpbmUgaW4gdGhlIDJEIHBsYW5lLjwvbGk+CisKKzxsaT4KK3RoZSBzZWNvbmQgb25lIHNob3dzIHRoZSB0YXJnZXQgd2luZG93IGZvciBhIGJpdG1hcCBvZiBhcmJpdHJhcnkgZGltZW5zaW9ucworW3csaF08L2xpPgorCis8bGk+Cit0aGUgdGhpcmQgb25lIHNob3dzIHRoZSBqdXh0YXBvc2l0aW9uIG9mIHRoZSBvdXRsaW5lIGFuZCB3aW5kb3cgaW4gdGhlCisyRCBwbGFuZTwvbGk+CisKKzxsaT4KK3RoZSBsYXN0IGltYWdlIHNob3dzIHdoYXQgd2lsbCByZWFsbHkgYmUgcmVuZGVyZWQgaW4gdGhlIGJpdG1hcC48L2xpPgorPC91bD4KKzwvdWw+CisKKzxjZW50ZXI+PGltZyBTUkM9ImNsaXBwaW5nLmdpZiIgaGVpZ2h0PTE1MSB3aWR0aD01Mzk+PC9jZW50ZXI+CisKKzxwPjxicj4KKzxicj4KKzxicj4KKzxicj4KKzxicj4KKzxwPkluZGVlZCwgaW4gbmVhcmx5IGFsbCBjYXNlcywgdGhlIGxvYWRlZCBvciB0cmFuc2Zvcm1lZCBvdXRsaW5lIG11c3QKK2JlIHRyYW5zbGF0ZWQgYmVmb3JlIGl0IGlzIHJlbmRlcmVkIGludG8gYSB0YXJnZXQgYml0bWFwLCBpbiBvcmRlciB0byBhZGp1c3QKK2l0cyBwb3NpdGlvbiByZWxhdGl2ZSB0byB0aGUgdGFyZ2V0IHdpbmRvdy4KKzxwPkZvciBleGFtcGxlLCB0aGUgY29ycmVjdCB3YXkgb2YgY3JlYXRpbmcgYSA8aT5zdGFuZGFsb25lPC9pPiBnbHlwaCBiaXRtYXAKK2lzIHRodXMgdG8gOgorPGJyPiZuYnNwOworPHVsPgorPGxpPgorQ29tcHV0ZSB0aGUgc2l6ZSBvZiB0aGUgZ2x5cGggYml0bWFwLiBJdCBjYW4gYmUgY29tcHV0ZWQgZGlyZWN0bHkgZnJvbQordGhlIGdseXBoIG1ldHJpY3MsIG9yIGJ5IGNvbXB1dGluZyBpdHMgYm91bmRpbmcgYm94ICh0aGlzIGlzIHVzZWZ1bCB3aGVuCithIHRyYW5zZm9ybSBoYXMgYmVlbiBhcHBsaWVkIHRvIHRoZSBvdXRsaW5lIGFmdGVyIHRoZSBsb2FkLCBhcyB0aGUgZ2x5cGgKK21ldHJpY3MgYXJlIG5vdCB2YWxpZCBhbnltb3JlKS48L2xpPgorPC91bD4KKworPHVsPgorPGxpPgorQ3JlYXRlIHRoZSBiaXRtYXAgd2l0aCB0aGUgY29tcHV0ZWQgZGltZW5zaW9ucy4gRG9uknQgZm9yZ2V0IHRvIGZpbGwgdGhlCitwaXhlbCBidWZmZXIgd2l0aCB0aGUgYmFja2dyb3VuZCBjb2xvci48L2xpPgorPC91bD4KKworPHVsPgorPGxpPgorVHJhbnNsYXRlIHRoZSBvdXRsaW5lIHNvIHRoYXQgaXRzIGxvd2VyIGxlZnQgY29ybmVyIG1hdGNoZXMgKDAsMCkuIERvbpJ0Citmb3JnZXQgdGhhdCBpbiBvcmRlciB0byBwcmVzZXJ2ZSBoaW50aW5nLCBvbmUgc2hvdWxkIHVzZSBpbnRlZ2VyLCBpLmUuCityb3VuZGVkIGRpc3RhbmNlcyAob2YgY291cnNlLCB0aGlzIGlzbpJ0IHJlcXVpcmVkIGlmIHByZXNlcnZpbmcgaGludGluZworaW5mb3JtYXRpb24gZG9lc26SdCBtYXR0ZXIsIGxpa2Ugd2l0aCByb3RhdGVkIHRleHQpLiBVc3VhbGx5LCB0aGlzIG1lYW5zCit0cmFuc2xhdGluZyB3aXRoIGEgdmVjdG9yIDx0dD4oIC1ST1VORCh4TWluKSwgLVJPVU5EKHlNaW4pICk8L3R0Pi48L2xpPgorPC91bD4KKworPHVsPgorPGxpPgorQ2FsbCB0aGUgZnVuY3Rpb24gPGI+PHR0PkZUX0dldF9PdXRsaW5lX0JpdG1hcDwvdHQ+PC9iPi48L2xpPgorPC91bD4KKworPHA+PGJyPkluIHRoZSBjYXNlIHdoZXJlIG9uZSB3YW50cyB0byB3cml0ZSBnbHlwaCBpbWFnZXMgZGlyZWN0bHkgaW50bworYSBsYXJnZSBiaXRtYXAsIHRoZSBvdXRsaW5lcyBtdXN0IGJlIHRyYW5zbGF0ZWQgc28gdGhhdCB0aGVpciB2ZWN0b3JpYWwKK3Bvc2l0aW9uIGNvcnJlc3BvbmQgdG8gdGhlIGN1cnJlbnQgdGV4dCBjdXJzb3IvY2hhcmFjdGVyIG9yaWdpbi48L2Jsb2NrcXVvdGU+Cis8L2Jsb2NrcXVvdGU+CisKKzxoMj4KKworPGhyIFdJRFRIPSIxMDAlIj48L2gyPgorCis8aDI+CitWSUkuIEZyZWVUeXBlIGFudGktYWxpYXNpbmcgOjwvaDI+Cis8Yj48aT5JTVBPUlRBTlQgTk9URSA6PC9pPjwvYj4KKzxicj5UaGlzIHNlY3Rpb24gaXMgc3RpbGwgaW4gcHJvZ3Jlc3MsIGFzIHRoZSB3YXkgRnJlZVR5cGUgMiBoYW5kbGVzIGFudGktYWxpYXNlZAorcmVuZGVyaW5nIGhhc24ndCBiZWVuIGRlZmluaXRlbHkgc2V0IHlldC4gVGhlIG1haW4gcmVhc29uIGJlaW5nIHRoYXQgYQorZmxleGlibGUgd2F5IG9mIGRvaW5nIHRoaW5ncyBpcyBuZWVkZWQgaW4gb3JkZXIgdG8gYWxsb3cgZnVydGhlciBpbXByb3ZlbWVudHMKK2luIHRoZSByYXN0ZXIgKGkuZS4gbnVtYmVyIG9mIGdyYXkgbGV2ZWxzID4gMTAwLCBldGMuLikuCis8YmxvY2txdW90ZT4KKzxoMz4KKzEuIFdoYXQgaXMgYW50aS1hbGlhc2luZyA6PC9oMz4KKworPGJsb2NrcXVvdGU+QW50aS1hbGlhc2luZyB3b3JrcyBieSB1c2luZyB2YXJpb3VzIGxldmVscyBvZiBncmF5cyB0byByZWR1Y2UKK3RoZSAic3RhaXJjYXNlIiBhcnRlZmFjdHMgdmlzaWJsZSBvbiB0aGUgZGlhZ29uYWxzIGFuZCBjdXJ2ZXMgb2YgZ2x5cGgKK2JpdG1hcHMuIEl0IGlzIGEgd2F5IHRvIGFydGlmaWNpYWxseSBlbmhhbmNlIHRoZSBkaXNwbGF5IHJlc29sdXRpb24gb2YKK3RoZSB0YXJnZXQgZGV2aWNlLiBJdCBjYW4gc21vb3RoIG91dCBjb25zaWRlcmFibHkgZGlzcGxheWVkIG9yIHByaW50ZWQKK3RleHQuPC9ibG9ja3F1b3RlPgorCis8aDM+CisyLiBIb3cgZG9lcyBpdCB3b3JrIHdpdGggRnJlZVR5cGUgOjwvaDM+CisKKzxibG9ja3F1b3RlPkZyZWVUeXBlJ3Mgc2Nhbi1saW5lIGNvbnZlcnRlciBpcyBhYmxlIHRvIHByb2R1Y2UgYW50aS1hbGlhc2VkCitvdXRwdXQgZGlyZWN0bHkuIEl0IGlzIGhvd2V2ZXIgbGltaXRlZCB0byA4LWJpdCBwaXhtYXBzIGFuZCA1IGxldmVscyBvZgorZ3JheXMgKG9yIDE3IGxldmVscywgZGVwZW5kaW5nIG9uIGEgYnVpbGQgY29uZmlndXJhdGlvbiBvcHRpb24pLiBIZXJlJ3MKK2hvdyBvbmUgc2hvdWxkIHVzZSBpdCA6Cis8aDQ+CithLiBTZXQgdGhlIGdyYXktbGV2ZWwgcGFsZXR0ZSA6PC9oND4KKworPGJsb2NrcXVvdGU+VGhlIHNjYW4tbGluZSBjb252ZXJ0ZXIgdXNlcyA1IGxldmVscyBmb3IgYW50aS1hbGlhc2VkIG91dHB1dC4KK0xldmVsIDAgY29ycmVzcG9uZHMgdG8gdGhlIHRleHQgYmFja2dyb3VuZCBjb2xvciAoZS5nLiB3aGl0ZSksIGFuZCBsZXZlbAorNSB0byB0aGUgdGV4dCBmb3JlZ3JvdW5kIGNvbG9yLiBJbnRlcm1lZGlhdGUgbGV2ZWxzIGFyZSB1c2VkIGZvciBpbnRlcm1lZGlhdGUKK3NoYWRlcyBvZiBncmF5cy4KKzxwPllvdSBtdXN0IHNldCB0aGUgcmFzdGVyJ3MgcGFsZXR0ZSB3aGVuIHlvdSB3YW50IHRvIHVzZSBkaWZmZXJlbnQgY29sb3JzLAordXNlIHRoZSBmdW5jdGlvbiA8Yj48dHQ+RlRfUmFzdGVyX1NldF9QYWxldHRlPC90dD48L2I+IGFzIGluIDoKKzxwPjx0dD57PC90dD4KKzxicj48dHQ+Jm5ic3A7IHN0YXRpYyBjb25zdCBjaGFyJm5ic3A7IGdyYXlfcGFsZXR0ZVs1XSA9IHsgMCwgNywgMTUsIDMxLAorNjMgfTs8L3R0PgorPGJyPjx0dD4mbmJzcDsghTwvdHQ+Cis8YnI+PHR0PiZuYnNwOyBlcnJvciA9IEZUX1NldF9SYXN0ZXJfUGFsZXR0ZSggbGlicmFyeSwgNSwgcGFsZXR0ZSApOzwvdHQ+Cis8YnI+PHR0Pn08L3R0PgorPGJyPiZuYnNwOworPHVsPgorPGxpPgorVGhlIGZpcnN0IHBhcmFtZXRlciBpcyBhIGhhbmRsZSB0byBhIEZyZWVUeXBlIGxpYnJhcnkgb2JqZWN0LiBTZWUgdGhlIHVzZXIKK2d1aWRlIGZvciBtb3JlIGRldGFpbHMgKHRoZSBsaWJyYXJ5IGNvbnRhaW5zIGEgc2Nhbi1saW5lIGNvbnZlcnRlciBvYmplY3QpLjwvbGk+Cis8L3VsPgorCis8dWw+Cis8bGk+CitUaGUgc2Vjb25kIHBhcmFtZXRlciBpcyB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIGdyYXktbGV2ZWwgcGFsZXR0ZS4KK1ZhbGlkIHZhbHVlcyBhcmUgNSBhbmQgMTcgZm9yIG5vdywgYnV0IHRoaXMgbWF5IGNoYW5nZSBpbiBsYXRlciBpbXBsZW1lbnRhdGlvbnMuPC9saT4KKzwvdWw+CisKKzx1bD4KKzxsaT4KK1RoZSBsYXN0IHBhcmFtZXRlciBpcyBhIHBvaW50ZXIgdG8gYSBjaGFyIHRhYmxlIGNvbnRhaW5pbmcgdGhlIHBpeGVsIHZhbHVlCitmb3IgZWFjaCBvZiB0aGUgZ3JheS1sZXZlbHMuIEluIHRoaXMgZXhhbXBsZSwgd2UgdXNlIGEgYmFja2dyb3VuZCBjb2xvcgorb2YgMCwgYSBmb3JlZ3JvdW5kIGNvbG9yIG9mIDYzLCBhbmQgaW50ZXJtZWRpYXRlIHZhbHVlcyBpbi1iZXR3ZWVuLjwvbGk+Cis8L3VsPgorCis8cD48YnI+VGhlIHBhbGV0dGUgaXMgY29waWVkIGluIHRoZSByYXN0ZXIgb2JqZWN0LCBhcyB3ZWxsIGFzIHByb2Nlc3NlZAordG8gYnVpbGQgc2V2ZXJhbCBsb29rdXAtdGFibGVzIG5lY2Vzc2FyeSBmb3IgdGhlIGludGVybmFsIGFudGktYWxpYXNpbmcKK2FsZ29yaXRobS4KKzxicj4mbmJzcDs8L2Jsb2NrcXVvdGU+CisKKzxoND4KK2IuIFJlbmRlciB0aGUgcGl4bWFwIDo8L2g0PgorCis8YmxvY2txdW90ZT5UaGUgc2Nhbi1saW5lIGNvbnZlcnRlciBkb2Vzbid0IGNyZWF0ZSBiaXRtYXBzIG9yIHBpeG1hcHMsCitpdCBzaW1wbHkgcmVuZGVycyBpbnRvIHRob3NlIHRoYXQgYXJlIHBhc3NlZCBhcyBwYXJhbWV0ZXJzIHRvIHRoZSBmdW5jdGlvbgorPGI+PHR0PkZUX0dldF9PdXRsaW5lX0JpdG1hcDwvdHQ+PC9iPi4KK1RvIHJlbmRlciBhbiBhbnRpLWFsaWFzZWQgcGl4bWFwLCBzaW1wbHkgc2V0IHRoZSB0YXJnZXQgYml0bWFwknMgZGVwdGgKK3RvIDguIE5vdGUgaG93ZXZlciB0aGF0IHRoaXMgdGFyZ2V0IDgtYml0IHBpeG1hcCBtdXN0IGFsd2F5cyBoYXZlIGEgJzxiPjx0dD5jb2xzPC90dD48L2I+JworZmllbGQgcGFkZGVkIHRvIDMyLWJpdHMsIHdoaWNoIG1lYW5zIHRoYXQgdGhlIG51bWJlciBvZiBieXRlcyBwZXIgbGluZXMKK29mIHRoZSBwaXhtYXAgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQgIQorPHA+T25jZSB0aGUgcGFsZXR0ZSBoYXMgYmVlbiBzZXQsIGFuZCB0aGUgcGl4bWFwIGJ1ZmZlciBoYXMgYmVlbiBjcmVhdGVkCit0byByZWNlaXZlIHRoZSBnbHlwaCBpbWFnZSwgc2ltcGx5IGNhbGwgPGI+PHR0PkZUX0dldF9PdXRsaW5lX0JpdG1hcDwvdHQ+PC9iPi4KK1Rha2UgY2FyZSBvZiBjbGVhcmluZyB0aGUgdGFyZ2V0IHBpeG1hcCB3aXRoIHRoZSBiYWNrZ3JvdW5kIGNvbG9yIGJlZm9yZQorY2FsbGluZyB0aGlzIGZ1bmN0aW9uLiBGb3IgdGhlIHNha2Ugb2Ygc2ltcGxpY2l0eSBhbmQgZWZmaWNpZW5jeSwgdGhlIHJhc3RlcgoraXMgbm90IGFibGUgdG8gY29tcG9zZSBhbnRpLWFsaWFzZWQgZ2x5cGggaW1hZ2VzIG9uIGEgcHJlLWV4aXN0aW5nIGltYWdlcy4KKzxwPkhlcmUncyBzb21lIGNvZGUgZGVtb25zdHJhdGluZyBob3cgdG8gbG9hZCBhbmQgcmVuZGVyIGEgc2luZ2xlIGdseXBoCitwaXhtYXAgOgorPHA+PHR0Pns8L3R0PgorPGJyPjx0dD4mbmJzcDsgRlRfT3V0bGluZSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBvdXRsaW5lOzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyBGVF9SYXN0ZXJfTWFwJm5ic3A7IHBpeG1hcDs8L3R0PgorPGJyPjx0dD4mbmJzcDsgRlRfQkJveCZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBjYm94OzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyCFPC90dD4KKzxwPjxpPjx0dD4mbmJzcDsgLy8gbG9hZCB0aGUgb3V0bGluZTwvdHQ+PC9pPgorPGJyPjx0dD4mbmJzcDsghTwvdHQ+Cis8cD48aT48dHQ+Jm5ic3A7IC8vIGNvbXB1dGUgZ2x5cGggZGltZW5zaW9ucyAoZ3JpZC1maXQgY2JveCwgZXRjLi4pPC90dD48L2k+Cis8YnI+PHR0PiZuYnNwOyBGVF9HZXRfT3V0bGluZV9DQm94KCAmYW1wO291dGxpbmUsICZhbXA7Y2JveCApOzwvdHQ+Cis8cD48dHQ+Jm5ic3A7IGNib3gueE1pbiA9IGNib3gueE1pbiAmYW1wOyAtNjQ7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7CisvLyBmbG9vcih4TWluKTwvdHQ+Cis8YnI+PHR0PiZuYnNwOyBjYm94LnlNaW4gPSBjYm94LnlNaW4gJmFtcDsgLTY0OyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOworLy8gZmxvb3IoeU1pbik8L3R0PgorPGJyPjx0dD4mbmJzcDsgY2JveC54TWF4ID0gKGNib3gueE1heCszMikgJmFtcDsgLTY0OyZuYnNwOyAvLyBjZWlsaW5nKHhNYXgpPC90dD4KKzxicj48dHQ+Jm5ic3A7IGNib3gueU1heCA9IChjYm94LnlNYXgrMzIpICZhbXA7IC02NDsmbmJzcDsgLy8gY2VpbGluZyh5TWF4KTwvdHQ+Cis8cD48dHQ+Jm5ic3A7IHBpeG1hcC53aWR0aCA9IChjYm94LnhNYXggLSBjYm94LnhNaW4pLzY0OzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyBwaXhtYXAucm93cyZuYnNwOyA9IChjYm94LnlNYXggLSBjYm94LnlNaW4pLzY0OzwvdHQ+Cis8cD48aT48dHQ+Jm5ic3A7IC8vIGZpbGwgdGhlIHBpeG1hcCBkZXNjcmlwdG9yIGFuZCBjcmVhdGUgdGhlIHBpeG1hcCBidWZmZXI8L3R0PjwvaT4KKzxicj48aT48dHQ+Jm5ic3A7IC8vIGRvbid0IGZvcmdldCB0byBwYWQgdGhlICdjb2xzJyBmaWVsZCB0byAzMiBiaXRzPC90dD48L2k+Cis8YnI+PHR0PiZuYnNwOyBwaXhtYXAucGl4X2JpdHMgPSA4OzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyBwaXhtYXAuZmxvdyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA9IEZUX0Zsb3dfRG93bjs8L3R0PgorPGJyPjx0dD4mbmJzcDsgcGl4bWFwLmNvbHMmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgPSAocGl4bWFwLndpZHRoKzMpICZhbXA7CistNDsmbmJzcDsgLy8gcGFkICdjb2xzJyB0byAzMiBiaXRzPC90dD4KKzxicj48dHQ+Jm5ic3A7IHBpeG1hcC5idWZmZXImbmJzcDsmbmJzcDsgPSBtYWxsb2MoIHBpeG1hcC5jb2xzICogcGl4bWFwLnJvd3MKKyk7PC90dD4KKzxwPjxpPjx0dD4mbmJzcDsgLy8gZmlsbCB0aGUgcGl4bWFwIGJ1ZmZlciB3aXRoIHRoZSBiYWNrZ3JvdW5kIGNvbG9yPC90dD48L2k+Cis8YnI+PGk+PHR0PiZuYnNwOyAvLzwvdHQ+PC9pPgorPGJyPjx0dD4mbmJzcDsgbWVtc2V0KCBwaXhtYXAuYnVmZmVyLCAwLCBwaXhtYXAuY29scypwaXhtYXAucm93cyApOzwvdHQ+Cis8cD48aT48dHQ+Jm5ic3A7IC8vIHRyYW5zbGF0ZSB0aGUgb3V0bGluZSB0byBtYXRjaCAoMCwwKSB3aXRoIHRoZSBnbHlwaCdzPC90dD48L2k+Cis8YnI+PGk+PHR0PiZuYnNwOyAvLyBsb3dlciBsZWZ0IGNvcm5lciAoaWdub3JlIHRoZSBiZWFyaW5ncyk8L3R0PjwvaT4KKzxicj48aT48dHQ+Jm5ic3A7IC8vIHRoZSBjYm94IGlzIGdyaWQtZml0dGVkLCB3ZSB3b24ndCBydWluIHRoZSBoaW50aW5nLjwvdHQ+PC9pPgorPGJyPjxpPjx0dD4mbmJzcDsgLy88L3R0PjwvaT4KKzxicj48dHQ+Jm5ic3A7IEZUX1RyYW5zbGF0ZV9PdXRsaW5lKCAmYW1wO291dGxpbmUsIC1jYm94LnhNaW4sIC1jYm94LnlNaW4KKyk7PC90dD4KKzxwPjxpPjx0dD4mbmJzcDsgLy8gcmVuZGVyIHRoZSBhbnRpLWFsaWFzZWQgZ2x5cGggcGl4bWFwPC90dD48L2k+Cis8YnI+PHR0PiZuYnNwOyBlcnJvciA9IEZUX0dldF9PdXRsaW5lX0JpdG1hcCggbGlicmFyeSwgJmFtcDtvdXRsaW5lLCAmYW1wO3BpeG1hcAorKTs8L3R0PgorPHA+PHR0PiZuYnNwOyAvLyBzYXZlIHRoZSBiZWFyaW5ncyBmb3IgbGF0ZXIgdXNlLi48L3R0PgorPGJyPjx0dD4mbmJzcDsgY29ybmVyX3ggPSBjYm94LnhNaW4gLyA2NDs8L3R0PgorPGJyPjx0dD4mbmJzcDsgY29ybmVyX3kgPSBjYm94LnlNaW4gLyA2NDs8L3R0PgorPGJyPjx0dD59PC90dD4KKzxwPlRoZSByZXN1bHRpbmcgcGl4bWFwIGlzIGFsd2F5cyBhbnRpLWFsaWFzZWQuPC9ibG9ja3F1b3RlPgorPC9ibG9ja3F1b3RlPgorCis8aDM+CiszLiBQb3NzaWJsZSBlbmhhbmNlbWVudHMgOjwvaDM+CisKKzxibG9ja3F1b3RlPkZyZWVUeXBlJ3MgcmFzdGVyIChpLmUuIGl0cyBzY2FuLWxpbmUgY29udmVydGVyKSBpcyBjdXJyZW50bHkKK2xpbWl0ZWQgdG8gcHJvZHVjaW5nIGVpdGhlciAxLWJpdCBiaXRtYXBzIG9yIGFudGktYWxpYXNlZCA4LWJpdCBwaXhtYXBzLgorSXQgaXMgbm90IHBvc3NpYmxlLCBmb3IgZXhhbXBsZSwgdG8gZHJhdyBkaXJlY3RseSBhIGJpdG1hcHBlZCBnbHlwaCBpbWFnZQoraW50byBhIDQsIDggb3IgMTYtYml0IHBpeG1hcCB0aHJvdWdoIGEgY2FsbCB0byBGVF9HZXRfT3V0bGluZV9CaXRtYXAuCis8cD5Nb3Jlb3ZlciwgdGhlIGFudGktYWxpYXNpbmcgZmlsdGVyIGlzIGxpbWl0ZWQgdG8gdXNlIDUgb3IgMTcgbGV2ZWxzCitvZiBncmF5cyAodGhyb3VnaCAyeDIgYW5kIDR4NCBzdWItc2FtcGxpbmcpLiBUaGVyZSBhcmUgY2FzZXMgd2hlcmUgdGhpcworY291bGQgc2VlbSBpbnN1ZmZpY2llbnQgZm9yIG9wdGltYWwgcmVzdWx0cyBhbmQgd2hlcmUgYSBoaWdoZXIgbnVtYmVyIG9mCitsZXZlbHMgbGlrZSA2NCBvciAxMjggd291bGQgYmUgYSBnb29kIHRoaW5nLgorPHA+VGhlc2UgZW5oYW5jZW1lbnRzIGFyZSBhbGwgcG9zc2libGUgYnV0IG5vdCBwbGFubmVkIGZvciBhbiBpbW1lZGlhdGUKK2Z1dHVyZSBvZiB0aGUgRnJlZVR5cGUgZW5naW5lLjwvYmxvY2txdW90ZT4KKzwvYmxvY2txdW90ZT4KKworPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvZG9jcy9nbHlwaF9jb252ZW50aW9ucy9ncmlkXzEuZ2lmIGIvZG9jcy9nbHlwaF9jb252ZW50aW9ucy9ncmlkXzEuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxMjkxYTgKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2dseXBoX2NvbnZlbnRpb25zL2dyaWRfMS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9nbHlwaF9jb252ZW50aW9ucy9vYmplY3RzX2RpYWdyYW0uZ2lmIGIvZG9jcy9nbHlwaF9jb252ZW50aW9ucy9vYmplY3RzX2RpYWdyYW0uZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4ZTE4NDMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2dseXBoX2NvbnZlbnRpb25zL29iamVjdHNfZGlhZ3JhbS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9nbHlwaF9jb252ZW50aW9ucy9vYmplY3RzX2RpYWdyYW0yLmdpZiBiL2RvY3MvZ2x5cGhfY29udmVudGlvbnMvb2JqZWN0c19kaWFncmFtMi5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGMyYmJmZQotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvZ2x5cGhfY29udmVudGlvbnMvb2JqZWN0c19kaWFncmFtMi5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9nbHlwaF9jb252ZW50aW9ucy9wb2ludHNfY29uaWMuZ2lmIGIvZG9jcy9nbHlwaF9jb252ZW50aW9ucy9wb2ludHNfY29uaWMuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5YmQyMDAKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2dseXBoX2NvbnZlbnRpb25zL3BvaW50c19jb25pYy5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9nbHlwaF9jb252ZW50aW9ucy9wb2ludHNfY29uaWMyLmdpZiBiL2RvY3MvZ2x5cGhfY29udmVudGlvbnMvcG9pbnRzX2NvbmljMi5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTYxN2E3YgotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvZ2x5cGhfY29udmVudGlvbnMvcG9pbnRzX2NvbmljMi5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9nbHlwaF9jb252ZW50aW9ucy9wb2ludHNfY3ViaWMuZ2lmIGIvZG9jcy9nbHlwaF9jb252ZW50aW9ucy9wb2ludHNfY3ViaWMuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2MjQ0NjgKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2dseXBoX2NvbnZlbnRpb25zL3BvaW50c19jdWJpYy5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9nbHlwaF9jb252ZW50aW9ucy9wb2ludHNfc2VnbWVudC5naWYgYi9kb2NzL2dseXBoX2NvbnZlbnRpb25zL3BvaW50c19zZWdtZW50LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTQwNTNkCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9nbHlwaF9jb252ZW50aW9ucy9wb2ludHNfc2VnbWVudC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9nbHlwaF9jb252ZW50aW9ucy90d2xld2lzMS5naWYgYi9kb2NzL2dseXBoX2NvbnZlbnRpb25zL3R3bGV3aXMxLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjJkNGJhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9nbHlwaF9jb252ZW50aW9ucy90d2xld2lzMS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9nbHlwaF9jb252ZW50aW9ucy90d2xld2lzMi5naWYgYi9kb2NzL2dseXBoX2NvbnZlbnRpb25zL3R3bGV3aXMyLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmQwNmNlCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9nbHlwaF9jb252ZW50aW9ucy90d2xld2lzMi5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9nbHlwaF9jb252ZW50aW9ucy91cF9mbG93LmdpZiBiL2RvY3MvZ2x5cGhfY29udmVudGlvbnMvdXBfZmxvdy5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDRmMGI1YQotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvZ2x5cGhfY29udmVudGlvbnMvdXBfZmxvdy5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pbnRlcm5hbHMvSW1hZ2UxLmdpZiBiL2RvY3MvaW50ZXJuYWxzL0ltYWdlMS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDcyNWNhNAotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvaW50ZXJuYWxzL0ltYWdlMS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pbnRlcm5hbHMvSW1hZ2UyLmdpZiBiL2RvY3MvaW50ZXJuYWxzL0ltYWdlMi5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk1ZTA5YwotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvaW50ZXJuYWxzL0ltYWdlMi5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pbnRlcm5hbHMvSW1hZ2UzLmdpZiBiL2RvY3MvaW50ZXJuYWxzL0ltYWdlMy5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmI1YWUyNgotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvaW50ZXJuYWxzL0ltYWdlMy5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pbnRlcm5hbHMvSW1hZ2U0LmdpZiBiL2RvY3MvaW50ZXJuYWxzL0ltYWdlNC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA5YjEwYQotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvaW50ZXJuYWxzL0ltYWdlNC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pbnRlcm5hbHMvZnJlZXR5cGVfaW50ZXJuYWxzLmh0bWwgYi9kb2NzL2ludGVybmFscy9mcmVldHlwZV9pbnRlcm5hbHMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjU5ZTdlCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9pbnRlcm5hbHMvZnJlZXR5cGVfaW50ZXJuYWxzLmh0bWwKQEAgLTAsMCArMSw3ODggQEAKKzwhZG9jdHlwZSBodG1sIHB1YmxpYyAiLS8vdzNjLy9kdGQgaHRtbCA0LjAgdHJhbnNpdGlvbmFsLy9lbiI+Cis8aHRtbD4KKzxoZWFkPgorICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+CisgICA8bWV0YSBuYW1lPSJBdXRob3IiIGNvbnRlbnQ9IkRhdmlkIFR1cm5lciI+CisgICA8bWV0YSBuYW1lPSJHRU5FUkFUT1IiIGNvbnRlbnQ9Ik1vemlsbGEvNC41IFtmcl0gKFdpbjk4OyBJKSBbTmV0c2NhcGVdIj4KKyAgIDx0aXRsZT5GcmVlVHlwZSAyIEludGVybmFsczwvdGl0bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKworPGJvZHkgdGV4dD0iIzAwMDAwMCIKKyAgICAgIGJnY29sb3I9IiNGRkZGRkYiCisgICAgICBsaW5rPSIjMDAwMEVGIgorICAgICAgdmxpbms9IiM1MTE4OEUiCisgICAgICBhbGluaz0iI0ZGMDAwMCI+CisKKzxjZW50ZXI+Cis8aDE+CitGcmVlVHlwZSAyLjAgSW50ZXJuYWxzPC9oMT48L2NlbnRlcj4KKworPGNlbnRlcj4KKzxoMj4KK1ZlcnNpb24gMS4wPC9oMj48L2NlbnRlcj4KKworPGNlbnRlcj4KKzxoMz4KKyZjb3B5OyAxOTk5IERhdmlkIFR1cm5lciAoPGEgaHJlZj0iZmljaGllciA6Ly8vZGF2aWRAZnJlZXR5cGUub3JnIj5kYXZpZEBmcmVldHlwZS5vcmc8L2E+KTxicj4KKyZjb3B5OyAxOTk5IFRoZSBGcmVlVHlwZSBEZXZlbG9wbWVudCBUZWFtICg8YSBocmVmPSJmaWNoaWVyIDovLy9kZXZlbEBmcmVldHlwZS5vcmciPmRldmVsQGZyZWV0eXBlLm9yZzwvYT4pPC9oMz48L2NlbnRlcj4KKworPHA+PGJyPgorPGhyIFdJRFRIPSIxMDAlIj4KKzxicj4mbmJzcDsKKzxoMj4KK0ludHJvZHVjdGlvbjo8L2gyPgorCis8YmxvY2txdW90ZT5UaGlzIGRvY3VtZW50IGRlc2NyaWJlcyBpbiBncmVhdCBkZXRhaWxzIHRoZSBpbnRlcm5hbHMgb2YgdGhlCitGcmVlVHlwZSAyLjAgbGlicmFyeS4gSXQgaXMgYSBtdXN0IHJlYWQgZm9yIHBvcnRlcnMgYW5kIGRldmVsb3BlcnMgYWxpa2UuCitJdHMgcHVycG9zZSBpcyB0byBwcmVzZW50IHRoZSBlbmdpbmUncyBvYmplY3RzLCB0aGVpciByb2xlcyBhbmQgaW50ZXJhY3Rpb25zLgorSXQgaXMgYXNzdW1lZCB0aGF0IHRoZSA8Yj48aT5GcmVlVHlwZSBHbHlwaCBDb252ZW50aW9uczwvaT48L2I+IGRvY3VtZW50CitoYXMgYmVlbiByZWFkLgorPHA+V2UgYWR2aXNlIHBvcnRlcnMgdG8gYWxzbyByZWFkIHRoZSA8Yj48aT5GcmVlVHlwZSBQb3J0aW5nIEd1aWRlPC9pPjwvYj4KK2FmdGVyIHRoaXMgZG9jdW1lbnQuIFdvdWxkLWJlIGhhY2tlcnMgYW5kIG1haW50YWluZXJzIGFyZSBvZiBjb3Vyc2UgZW5jb3VyYWdlZAordG8gcmVhZCB0aGUgPGI+PGk+RnJlZVR5cGUgQ29kaW5nIENvbnZlbnRpb25zPC9pPjwvYj4gZG9jdW1lbnQgdG9vLiBUaGUKK2RldmVsb3BtZW50IG9mIGEgbmV3IGRyaXZlciBpcyBkZXNjcmliZWQgaW4gbW9yZSBkZXRhaWxzIGluIHRoZSA8Yj48aT5GcmVlVHlwZQorRHJpdmVyIEhvd1RvPC9pPjwvYj4gZG9jdW1lbnQuPC9ibG9ja3F1b3RlPgorCis8cD48YnI+Cis8aHIgV0lEVEg9IjEwMCUiPgorPGgyPgorSS4gT3ZlcnZpZXcgOjwvaDI+CisKKzxibG9ja3F1b3RlPgorPGgzPgorMS4gRmVhdHVyZXMgKGFuZCB3aGF0J3MgbmV3KSA6PC9oMz4KKworPGJsb2NrcXVvdGU+RnJlZVR5cGUgMi4wIGhhcyBhIG51bWJlciBvZiBpbXBvcnRhbnQgbmV3IGZlYXR1cmVzIHRoYXQgd2VyZQorbm90IGZvdW5kIGluIHRoZSAxLnggcmVsZWFzZXMgOgorPGJyPiZuYnNwOworPGJsb2NrcXVvdGU+PGI+Zm9udC1mb3JtYXQgaW5kZXBlbmRlbnQgQVBJPC9iPgorPGJyPkZyZWVUeXBlIDIuMCBpcyBhYmxlIHRvIHN1cHBvcnQgYW55IGtpbmQgb2YgZm9udCBmb3JtYXQsIGJlIGl0IGZpeGVkCitvciBzY2FsYWJsZSwgdGhyb3VnaCB0aGUgdXNlIG9mIHBsdWdnYWJsZSAiZm9udCBkcml2ZXJzIi4gVGhlc2UgZHJpdmVycworY2FuIGJlIGFkZGVkIG9yIHJlcGxhY2VkIGF0IHJ1biB0aW1lLCB3aGlsZSBhcHBsaWNhdGlvbnMgdXNlIGEgbmV3IGZvbnQKK2Zvcm1hdC1pbmRlcGVuZGVudCBBUEkuCis8cD48Yj5hZHZhbmNlZCBzdHJlYW0gY2FjaGluZzwvYj4KKzxicj4yLjAgaXMgYWJsZSB0byBjb250cm9sIHRoZSBudW1iZXIgb2YgY29uY3VycmVudGx5IG9wZW5lZCBzdHJlYW1zIHdoZW4KK3VzaW5nIGZvbnRzLiBJdCBpcyB0aHVzIHBvc3NpYmxlIHRvIG9wZW4gZG96ZW5zIG9yIGh1bmRyZWRzIG9mIGZvbnQgZmFjZXMKK3dpdGhvdXQgcnVubmluZyBvdXQgb2Ygc3lzdGVtIHJlc291cmNlcy4KKzxwPjxiPnJlYWwgcmVlbnRyYW5jeSBzdXBwb3J0PC9iPgorPGJyPkl0IGlzIG5vdyBwb3NzaWJsZSB0byB1c2UgRnJlZVR5cGUgYXMgYSBzaGFyZWQgbGlicmFyeSB3aXRoIG5vIHN0YXRpYworZGF0YSBpbiBhIG11bHRpLXRocmVhZGVkIGVudmlyb25tZW50LiBUaGUgc3luY2hyb25pemF0aW9uIG1vZGVsIGhhcyBhbHNvCitiZWVuIHNpbXBsaWZpZWQgaW4gb3JkZXIgdG8gbWFrZSBmb250IGRyaXZlciB3cml0aW5nIGVhc2llci4gT2YgY291cnNlLAoreW91IGNhbiBidWlsZCBGcmVlVHlwZSB3aXRoIG5vIHRocmVhZCBzdXBwb3J0IHRvIGdldCBhIHNtYWxsZXIgbGlicmFyeS4KKzxwPjxiPnN1cHBvcnQgZm9yIGN1YmljIGJlemllcnMgYW5kIDE3LWxldmVscyBhbnRpLWFsaWFzaW5nPC9iPgorPGJyPlRoZSBGcmVlVHlwZSBzY2FuLWxpbmUgY29udmVydGVyIChhLmsuYS4gcmFzdGVyKSBub3cgc3VwcG9ydHMgY3ViaWMKK2JlemllciBhcmNzIHNlYW1sZXNzbHkuIEl0IGFsc28gcHJvdmlkZXMgYSBuZXcgYW50aS1hbGlhc2luZyBtb2RlIHdoaWNoCit1c2VzIGEgcGFsZXR0ZSBvZiAxNyBsZXZlbHMgb2YgZ3JheXMuCis8YnI+Jm5ic3A7PC9ibG9ja3F1b3RlPgorSXQgYWxzbyBmZWF0dXJlcyB0aGUgZm9sbG93aW5nIDoKKzxibG9ja3F1b3RlPjxiPnBlcmZvcm1hbmNlIGltcHJvdmVtZW50cyA6PC9iPgorPGJyPlRoZSBGcmVlVHlwZSByYXN0ZXIgaGFzIGJlZW4gb3B0aW1pemVkLCBhbmQgdGhlIGdlbmVyYXRpb24gb2YgYW50aS1hbGlhc2VkCitwaXhtYXBzIGlzIG5vdyA2MCUgZmFzdGVyIHRoYW4gaW4gdGhlIDEueCByZWxlYXNlLiBNb3Jlb3ZlciwgdGhlIFRydWVUeXBlCitieXRlY29kZSBpbnRlcnByZXRlciBoYXMgYmVlbiBwcm9maWxlZCBhbmQgZ3JlYXRseSBvcHRpbWlzZWQuCis8cD48Yj5lYXNpZXIgcG9ydGFiaWxpdHk8L2I+Cis8YnI+UG9ydGluZyBhbmQgY29uZmlndXJpbmcgRnJlZVR5cGUgaXMgbm93IG11Y2ggZWFzaWVyLiBBIHNpbmdsZSBmaWxlCittdXN0IGJlIHByb3ZpZGVkIGZvciBzeXN0ZW0tc3BlY2lmaWMgb3BlcmF0aW9ucyAobGlrZSBtZW1vcnksIGkvbywgdGhyZWFkCittYW5hZ2VtZW50KSwgYW5kIGEgc2luZ2xlIGNvbmZpZ3VyYXRpb24gaGVhZGVyIGlzIHVzZWQgdG8gc2VsZWN0IHRoZSBidWlsZAoreW91IG5lZWQuCis8YnI+Jm5ic3A7PC9ibG9ja3F1b3RlPgorPC9ibG9ja3F1b3RlPgorCis8aDM+CisyLiBBcmNoaXRlY3R1cmUgOjwvaDM+CisKKzxibG9ja3F1b3RlPlRoZSBlbmdpbmUgaXMgbm93IHNwbGl0IGluIHNldmVyYWwgcGFydHMsIHdoaWNoIGFyZSA6Cis8aDQ+CithLiBUaGUgYmFzZSBsYXllciA6PC9oND4KKworPGJsb2NrcXVvdGU+VGhpcyBwYXJ0IGNvbnRhaW5zIGFsbCB0aGUgZm9udC1mb3JtYXQgaW5kZXBlbmRlbnQgZmVhdHVyZXMKK29mIHRoZSBlbmdpbmUgd2hpY2ggYXJlIDoKKzx1bD4KKzxsaT4KK2NvbXB1dGF0aW9ucy9zY2FsaW5nPC9saT4KKworPGxpPgorbGlzdCBwcm9jZXNzaW5nPC9saT4KKworPGxpPgorb3V0bGluZSBwcm9jZXNzaW5nPC9saT4KKworPGxpPgorc2Nhbi1saW5lIGNvbnZlcnRlcjwvbGk+CisKKzxsaT4KK3N0cmVhbSBtYW5hZ2VyPC9saT4KKworPGxpPgorYmFzZSBvYmplY3QgY2xhc3NlczwvbGk+CisKKzxsaT4KK2RlYnVnZ2luZyAmYW1wOyB0cmFjZXM8L2xpPgorCis8bGk+CitoaWdoLWxldmVsIEFQSSBmdW5jdGlvbnM8L2xpPgorCis8bGk+Citsb3ctbGV2ZWwgc3lzdGVtIG9iamVjdCAobWVtb3J5LCBpL28sIHRocmVhZHMpPC9saT4KKzwvdWw+Cis8L2Jsb2NrcXVvdGU+CisKKzxoND4KK2IuIFRoZSBmb250IGRyaXZlcnMgOjwvaDQ+CisKKzxibG9ja3F1b3RlPkVhY2ggZm9udCBmb3JtYXQgaXMgbWFuYWdlZCB3aXRoIHRoZSB1c2Ugb2YgYSBzaW5nbGUgZm9udCBkcml2ZXIKK29iamVjdC4gVGhlIGJhc2UgbGF5ZXIgaXMgYWJsZSB0byBtYW5hZ2Ugc2V2ZXJhbCBkcml2ZXJzLCBhbmQgdGhlc2UgY2FuCitiZSBlYXNpbHkgYWRkZWQsIHJlbW92ZWQgb3IgdXBncmFkZWQgYXQgcnVudGltZS4gRWFjaCBkcml2ZXIgaGFzIHRoZSBmb2xsb3dpbmcKK2ZlYXR1cmVzIGFuZCBmdW5jdGlvbnMgOgorPHVsPgorPGxpPgorYXV0by1jaGVjayBmb250IGZvcm1hdCB3aGVuIG9wZW5pbmcgYSBmb250IHJlc291cmNlIChpLmUuIGZpbGUpPC9saT4KKworPGxpPgorYWNjZXNzLCBsb2FkIGFuZC9vciBleHRyYWN0IGFsbCB0YWJsZXMgYW5kIGRhdGEgZnJvbSB0aGUgZm9udCBmaWxlPC9saT4KKworPGxpPgorZ3JpZC1maXQvaGludCB0aGUgZ2x5cGggb3V0bGluZXMgKGluIHRoZSBjYXNlIG9mIHNjYWxhYmxlIGZvcm1hdHMgbGlrZQorVHJ1ZVR5cGUgb3IgVHlwZTEpPC9saT4KKworPGxpPgorcHJvdmlkZSBleHRlbnNpb25zIHRvIGFjY2VzcyBmb250IGZvcm1hdC1zcGVjaWZpYyBkYXRhIGFuZCB0YWJsZXMgZnJvbQordGhlIGZvbnQgZmlsZTwvbGk+Cis8L3VsPgorTm90ZSB0aGF0IEZyZWVUeXBlIDIuMCBpcyBhIGZvbnQgc2VydmljZS4gSXRzIHB1cnBvc2UgaXMgdG8gcHJvdmlkZSBhIHVuaWZpZWQKK0FQSSBmb3IgYWxsIGtpbmRzIG9mIGZvbnRzIGFuZCBleHRyYWN0IGluZGl2aWR1YWwgZ2x5cGggaW1hZ2VzIGFuZCBtZXRyaWNzLgorSG93ZXZlciwgaXQgZG9lcyBub3QgcmVuZGVyIHRleHQgaXRzZWxmLCBhcyB0aGlzIG9wZXJhdGlvbiBpcyBsZWZ0IHRvIHRoZQorZGV2ZWxvcGVyLCBvciB0byBoaWdoZXItbGV2ZWwgbGlicmFyaWVzIGJ1aWx0IG9uIHRvcCBvZiBGcmVlVHlwZS4gSGVyZQorYXJlIGEgZmV3IGZlYXR1cmVzIHRoYXQgYXJlIHRodXMgbm90IGltcGxlbWVudGVkIDoKKzxibG9ja3F1b3RlPjEpIFRleHQgc3RyaW5nIHJlbmRlcmluZworPGJyPjIpIEdseXBoIGJpdG1hcC9vdXRsaW5lIGNhY2hpbmcgZm9yIGltcHJvdmVkIHBlcmZvcm1hbmNlCis8YnI+MykgU3ludGhldGljIGZvbnRzIChpLmUuIGl0YWxpY2lzaW5nLCBlbWJvbGRlbmluZywgdW5kZXJsaW5pbmcpCis8YnI+NCkgQ29udGV4dHVhbCBnbHlwaCBzdWJzdGl0dXRpb24gYW5kIG90aGVyIGFkdmFuY2VkIGxheW91dCBwcm9jZXNzZXM8L2Jsb2NrcXVvdGU+CitOb3RlIHRoYXQgZmVhdHVyZXMgMSB0aHJvdWdoIDMgc2hvdWxkIGJlIHByb3ZpZGVkIGJ5IHRoZSBTZW1UZXggbGlicmFyeSwKK3doaWNoIG1heSBzb29uIGJlY29tZSBwYXJ0IG9mIHRoZSBzdGFuZGFyZCBGcmVlVHlwZSBkaXN0cmlidXRpb24uPC9ibG9ja3F1b3RlPgorPC9ibG9ja3F1b3RlPgorPC9ibG9ja3F1b3RlPgorCis8cD48YnI+Cis8aHIgV0lEVEg9IjEwMCUiPgorPGgyPgorSUkuIERlc2lnbiA6PC9oMj4KKworPGJsb2NrcXVvdGU+Cis8aDM+CisxLiBPYmplY3RzIDo8L2gzPgorCis8YmxvY2txdW90ZT5UaGV5IGFyZSBzZXZlcmFsIGtpbmRzIG9mIG9iamVjdHMgaW4gRnJlZVR5cGUsIHdoaWNoIGNhbiBiZQorZGVzY3JpYmVkIGFzIGZvbGxvd3MgOgorPGJsb2NrcXVvdGU+PGI+QmFzZSBvYmplY3RzPC9iPgorPGJyPlRoZXNlIG9iamVjdHMgZG8gbm90IHJlbGF0ZSBkaXJlY3RseSB0byBmb250IGRhdGEsIGJ1dCB0byB0aGUgd2F5IGl0CitpcyBvcmdhbmlzZWQgYW5kIG1hbmFnZWQuIEl0IGlzIHRoZSBiYXNpYyBjb3JlIGFuZCBwcm92aWRlcyBmdW5jdGlvbnMgdGhhdAorYXJlIGhlYXZpbHkgdXNlZCBieSBlYWNoIGZvbnQgZHJpdmVyLiBFeGFtcGxlcyBhcmUgdGhlIHJlc291cmNlIG9iamVjdHMsCit1c2VkIHRvIGRlc2NyaWJlIGZvbnQgZmlsZXMsIHRoZSBzeXN0ZW0gb2JqZWN0IHVzZWQgdG8gbWFuYWdlIGxvdy1sZXZlbAorc3lzdGVtIG9wZXJhdGlvbnMsIG9yIHRoZSByYXN0ZXIgb2JqZWN0LCB1c2VkIHRvIGNvbnZlcnQgdmVjdG9yIG91dGxpbmVzCitpbnRvIGJpdG1hcHMgb3IgYW50aS1hbGlhc2VkIHBpeG1hcHMuIE1vc3Qgb2YgdGhlIGJhc2Ugb2JqZWN0cyBhcmUgbm90CitkaXJlY3RseSB2aXNpYmxlIGZvciBjbGllbnQgYXBwbGljYXRpb25zIG9mIEZyZWVUeXBlLgorPHA+PGI+Rm9udCBvYmplY3RzPC9iPgorPGJyPlRoZSBmb250IG9iamVjdHMgZGlyZWN0bHkgbW9kZWwgdGhlIGRhdGEgYXMgaXQgaXMgZm91bmQgaW4gZm9udCBmaWxlcy4KK1RoZSByb290IGNsYXNzZXMgaW1wbGVtZW50ZWQgaW4gdGhlIGJhc2UgbGF5ZXIgbGlrZSA8dHQ+RlRfRmFjZTwvdHQ+LCA8dHQ+RlRfU2l6ZTwvdHQ+LAorPHR0PkZUX0dseXBoU2xvdDwvdHQ+LAorbXVzdCBiZSBkZXJpdmVkIGluIGVhY2ggZm9udCBkcml2ZXIuPC9ibG9ja3F1b3RlPgorT2JqZWN0cyBhcmUgZGVmaW5lZCBpbiB0aGUgZmlsZXMgIjx0dD5iYXNlL2ZyZWV0eXBlLmg8L3R0PiIgYW5kICI8dHQ+YmFzZS9mdG9ianMuaDwvdHQ+Ii4KK1RoZSBmb3JtZXIgY29udGFpbnMgYWxsIHRoZSBwdWJsaWMgb2JqZWN0IGRlZmluaXRpb25zIHVzYWJsZSBieSBjbGllbnQKK2FwcGxpY2F0aW9ucy4gVGhlIGxhdHRlciBjb250YWlucyBwcml2YXRlIGRlZmluaXRpb25zIHVzZWQgYnkgdGhlIHJlc3QKK29mIHRoZSBiYXNlIGxheWVyIGFuZCBlYWNoIGZvbnQgZHJpdmVyLjwvYmxvY2txdW90ZT4KKworPGgzPgorMi4gTGlzdCBtYW5hZ2VtZW50PC9oMz4KKworPGJsb2NrcXVvdGU+VGhlICI8dHQ+YmFzZS9mdGxpc3QuYzwvdHQ+IiBjb21wb25lbnQgYSB2ZXJ5IHNpbXBsZSBkb3VibHktbGlua2VkCitsaXN0IGZhY2lsaXR5IHdoaWNoIGlzIHVzZWQgYnkgdGhlIHJlc3Qgb2YgdGhlIGVuZ2luZSB0byBjcmVhdGUgYW5kIHByb2Nlc3MKK2xpc3RzLCBpbmNsdWRpbmcgaXRlcmF0aW9uIGFuZCBmaW5hbGlzYXRpb24uIFRoZSBkZWZpbml0aW9uIG9mIHRoZSBsaXN0Citub2RlIGFuZCBmdW5jdGlvbnMgYXJlIHBsYWNlZCBpbiB0aGUgIjx0dD5iYXNlL2ZyZWV0eXBlLmg8L3R0PiIgdG8gbGV0CitjbGllbnQgYXBwbGljYXRpb25zIGFjY2VzcyBsaXN0ZWQgb2JqZWN0cyBhcyB0aGV5IGxpa2UuCis8cD5UaGUgYmFzZSBsaXN0IHR5cGUgaXMgPHR0PkZUX0xpc3Q8L3R0Piwgd2hpY2ggbGlua3Mgbm9kZXMgb2YgdHlwZSA8dHQ+RlRfTGlzdE5vZGU8L3R0PgordG9nZXRoZXIuCis8YnI+Jm5ic3A7PC9ibG9ja3F1b3RlPgorCis8aDM+CiszLiBMaW1pdGVkIGVuY2Fwc3VsYXRpb248L2gzPgorCis8YmxvY2txdW90ZT5Vbmxpa2Ugd2hhdCBoYXBwZW5lZCBpbiB0aGUgMS54IHJlbGVhc2VzLCB0aGUgPHR0PkZUX0ZhY2U8L3R0PiwKKzx0dD5GVF9TaXplPC90dD4sCis8dHQ+RlRfR2x5cGhTbG90PC90dD4gYW5kIDx0dD5GVF9DaGFyTWFwPC90dD4gdHlwZXMgYXJlIG5vIGxvbmdlciBibGluZAorcG9pbnRlcnMgdG8gb3BhcXVlIHR5cGVzLiBSYXRoZXIsIHRoZSBjb3JyZXNwb25kaW5nIHN0cnVjdHVyZXMgYXJlIG5vdworcHVibGljIChhbmQgZGVmaW5lZCBpbiAiPHR0PmJhc2UvZnJlZXR5cGUuaDwvdHQ+Iiwgc2VlIDx0dD5GVF9GYWNlUmVjPC90dD4sCis8dHQ+RlRfU2l6ZVJlYzwvdHQ+LAorZXRjLi4pIGluIG9yZGVyIHRvIGxldCBjbGllbnQgYXBwbGljYXRpb25zIHJlYWQgZGlyZWN0bHkgdGhlIHZhcmlvdXMgb2JqZWN0CithdHRyaWJ1dGVzIHRoZXkncmUgaW50ZXJlc3RlZCBpbi4KKzxwPlRoaXMgYnJlYWtzIGVuY2Fwc3VsYXRpb24gb2YgaW1wbGVtZW50YXRpb24sIGZhbWVkIGJ5IE9PUCwgYnV0IHdhcyBjaG9zZW4KK2JlY2F1c2U6Cis8YnI+Jm5ic3A7Cis8dWw+Cis8bGk+CitpdCBzaW1wbGlmaWVzIGEgbG90IHRoZSB3b3JrIG9mIGNsaWVudCBhcHBsaWNhdGlvbnMgYW5kIGxpYnJhcmllcyB3aGljaAorZG9uJ3QgbmVlZCB0byBwZXJmb3JtIGEgZnVuY3Rpb24gY2FsbCBldmVyeXRpbWUgdGhleSB3YW50IHRvIHJlYWQgb25lIGltcG9ydGFudAorb2JqZWN0IGF0dHJpYnV0ZSAobm9yIGRvZXMgaXQgZm9yY2UgdGhlbSB0byBjYWNoZSB0aGVzZSBhdHRyaWJ1dGVzIGluIHRoZWlyCitvd24gc3RydWN0dXJlcykuPC9saT4KKzwvdWw+CisKKzx1bD4KKzxsaT4KK0l0IHJlZHVjZXMgZ3JlYXRseSB0aGUgQVBJLCBhcyBtYW55IDx0dD5GVF9HZXRfWFhYPC90dD4gZnVuY3Rpb25zIGFyZSBhdm9pZGVkLjwvbGk+Cis8L3VsPgorCis8dWw+Cis8bGk+CitIaWdoZXItbGV2ZWwgbGlicmFyaWVzIGFyZSBhYmxlIHRvJm5ic3A7IGFjY2VzcyBkYXRhIGRpcmVjdGx5LiBXaGVuIGl0CitpcyB1c2VkIGZyZXF1ZW50bHksIHRoZXkgZG9uJ3QgbmVlZCB0byBjYWNoZSBpdCBpbiB0aGVpciBvd24gc3RydWN0dXJlcy48L2xpPgorPC91bD4KKworPHVsPgorPGxpPgorSXQgaXMgcG9zc2libGUgdG8gdGlnaHRseSBsaW5rIEZyZWVUeXBlIG9iamVjdHMgd2l0aCBoaWdoZXItbGV2ZWwgb25lcywKK2luIGEgY2xlYXJlciBhbmQgbW9yZSBlZmZpY2llbnQgd2F5LiBUaGlzIGlzIHZlcnkgaW1wb3J0YW50IHdoZW4gb25lIHdhbnRzCit0byB3cml0ZSBhIEMrKyB3cmFwcGVyIG9yIGEgdGV4dCByZW5kZXJpbmcgbGlicmFyeSBvbiB0b3Agb2YgRnJlZVR5cGUgKGFjdHVhbGx5LAorYm90aCBwcm9qZWN0cyB3ZXJlIHBlcmZvcm1lZCBpbiBhbiBlYXJsaWVyIHZlcnNpb24gb2YgRnJlZVR5cGUgMi4wIHdoaWNoCitmZWF0dXJlZCBjbGFzc2ljIGVuY2Fwc3VsYXRpb24gdGhyb3VnaCBnZXQvc2V0IG1ldGhvZHMuIFRoZSByZXN1bHRpbmcgY29kZQord2FzIHVnbHkgYW5kIHNsb3cuIE1vdmluZyB0byBhIGxpbWl0ZWQgZW5jYXBzdWxhdGlvbiBhcHByb2FjaCBzaW1wbGlmaWVkCitzbyBtYW55IHRoaW5ncyB0aGF0IHRoZSBjb21waWxlZCBjb2RlIHNpemUgd2FzIHJlZHVjZWQgYnkgYSBmYWN0b3Igb2YgdHdvCishKS48L2xpPgorPC91bD4KKworPHVsPgorPGxpPgorRmluYWxseSwgdGhlIEFQSSBhbmQgZm9udCBvYmplY3Qgc3RydWN0dXJlcyB3ZXJlIGRlc2lnbmVkIGFmdGVyIHRoZSBjcmVhdGlvbgorb2YgdHdvIHNjYWxhYmxlIGZvbnQgZHJpdmVycyBhbmQgb25lIGJpdG1hcCBmb250IGRyaXZlci4gVGhleSBhcmUgbm93IHZlcnkKK3N0YWJsZSBhbmQgdGhlIHB1YmxpYyAodmlzaWJsZSkgYXR0cmlidXRlcyBhcmUgbm90IGdvaW5nIHRvIGNoYW5nZS48L2xpPgorPC91bD4KKzwvYmxvY2txdW90ZT4KKzwvYmxvY2txdW90ZT4KKworPHA+PGJyPgorPGhyIFdJRFRIPSIxMDAlIj4KKzxoMj4KK0lJSS4gQmFzZSBvYmplY3RzIDo8L2gyPgorCis8YmxvY2txdW90ZT5UaGlzIHNlY3Rpb24gZGVzY3JpYmVzIHRoZSBGcmVlVHlwZSBiYXNlIG9iamVjdCBjbGFzc2VzIDoKKzxicj4mbmJzcDsKKzxoMz4KKzEuIFN5c3RlbSBvYmplY3RzIDo8L2gzPgorCis8YmxvY2txdW90ZT5UaGUgc3lzdGVtIGNsYXNzIGlzIGluIGNoYXJnZSBvZiBtYW5hZ2luZyBhbGwgbG93LWxldmVsIGFuZAorc3lzdGVtLXNwZWNpZmljIG9wZXJhdGlvbnMuIFRoaXMgbWVhbnMgc2ltcGx5IG1lbW9yeSBtYW5hZ2VtZW50LCBpL28gYWNjZXNzCithbmQgdGhyZWFkIHN5bmNocm9uaXNhdGlvbi4gSXQgaXMgaW1wbGVtZW50ZWQgYnkgdGhlICI8dHQ+ZnRzeXMuYzwvdHQ+IgorY29tcG9uZW50LCB3aG9zZSBzb3VyY2UgbXVzdCBiZSBsb2NhdGVkIGluIHRoZSBjb25maWd1cmF0aW9uIGRpcmVjdG9yeQord2hlbiBidWlsZGluZyBGcmVlVHlwZS4gKGUuZy4gIjx0dD5saWIvYXJjaC9hbnNpL2Z0c3lzLmM8L3R0PiIgZm9yIGFuIEFOU0kKK2J1aWxkLCAiPHR0PmxpYi9hcmNoL3VuaXgvZnRzeXMuYzwvdHQ+IiBmb3IgYSBVbml4IG9uZSwgZXRjLi4pLgorPHA+UG9ydGluZyBGcmVlVHlwZSAyLjAgcmVhbGx5IG1lYW5zIHByb3ZpZGluZyBhIG5ldyBpbXBsZW1lbnRhdGlvbiBvZgorPHR0PmZ0c3lzPC90dD4KKyhhbG9uZyB3aXRoIGEgZmV3IGNvbmZpZ3VyYXRpb24gZmlsZSBjaGFuZ2VzKS4gTm90ZSBob3dldmVyIHRoYXQgaXRzIGludGVyZmFjZQoraXMgY29tbW9uIHRvIGFsbCBwb3J0cywgYW5kIGxvY2F0ZWQgaW4gIjx0dD5iYXNlL2Z0c3lzLmg8L3R0PiIuPC9ibG9ja3F1b3RlPgorCis8aDM+CisyLiBSZXNvdXJjZXMgYW5kIFN0cmVhbXM6PC9oMz4KKworPGJsb2NrcXVvdGU+VGhlIGNvbmNlcHRzIG9mIGZpbGVzIGFzIHN0b3JhZ2VzLCBhbmQgZmlsZXMgYXMgc3RyZWFtcyBoYXMKK2JlZW4gc2VwYXJhdGVkIGZvciBGcmVlVHlwZSAyLjAuIFRoZSAiPGI+PGk+cmVzb3VyY2U8L2k+PC9iPiIgY29uY2VwdCB3YXMKK2ludHJvZHVjZWQgd2hpbGUgdGhlICI8Yj48aT5zdHJlYW08L2k+PC9iPiIgb25lIGhhcyBiZWVuIHJlZGVmaW5lZC4gSGVyZQoraXMgaG93IHRoZXkgd29yayB0b2dldGhlciA6Cis8dWw+Cis8bGk+CithICI8Yj5yZXNvdXJjZTwvYj4iIGlzIGFuIG9iamVjdCB3aGljaCBtb2RlbHMgYSBmaWxlLCBzZWVuIGFzIGEgc3RvcmFnZS4KK1RoZXJlIGFyZSBzZXZlcmFsIGNsYXNzZXMgb2YgcmVzb3VyY2VzLCB3aGljaCBkaWZmZXIgdXN1YWxseSBpbiB0d28gd2F5cworOiB0aGUgd2F5IHRoZWlyIGRhdGEgaXMgYWNjZXNzZWQgYnkgYXBwbGljYXRpb25zLCBhbmQgdGhlIHdheSB0aGV5J3JlIG5hbWVkCit3aXRoaW4gdGhlIHN5c3RlbS48L2xpPgorPC91bD4KKworPHVsPkZvciBleGFtcGxlLCB3aGVuIHBhcnNpbmcgZmlsZXMgd2l0aCB0aGUgQU5TSSBDIGxpYnJhcnksIGRhdGEgaGFzIHRvCitiZSByZWFkICh0aHJvdWdoIGZzZWVrL2ZyZWFkKSBpbnRvIGludGVybWVkaWF0ZSBidWZmZXJzIGJlZm9yZSBpdCBjYW4gYmUKK2RlY29kZWQuIFRoaXMgc2NoZW1lIGlzIGhpZ2hseSBwb3J0YWJsZSwgYnV0IHJhdGhlciBpbmVmZmljaWVudDsgd2hlbiB1c2luZworaXQsIHdlJ2xsIGRlc2NyaWJlIHRoZSBmaWxlIGFzIGEgZGlzay1iYXNlZCByZXNvdXJjZS4KKzxwPkFzIG1vc3QgbW9kZXJuIG9wZXJhdGluZyBzeXN0ZW1zIG5vdyBwcm92aWRlIG1lbW9yeS1tYXBwZWQgZmlsZXMsIHdoaWNoCithbGxvdyBkaXJlY3QgYWNjZXNzIHdoaWxlIGltcHJvdmluZyBwZXJmb3JtYW5jZSBhbmQgcmVkdWNpbmcgbWVtb3J5IHVzYWdlLgorQmVjYXVzZSBkYXRhIGNhbiBiZSByZWFkIGRpcmVjdGx5IGluIG1lbW9yeSwgd2UnbGwgc3BlYWsgb2YgYSBtZW1vcnktYmFzZWQKK3Jlc291cmNlIGluIHRoaXMgY2FzZS4gRm9yIGVtYmVkZGVkIHN5c3RlbXMgKGxpa2UgcHJpbnRlcnMsIFBEQXMsIGV0Yy4uKSwKK1JPTS1mb250cyBmaXQgaW50byB0aGlzIGNhdGVnb3J5IGFzIHdlbGwuCis8cD5SZWdhcmRpbmcgbmFtaW5nLCBtb3N0IHN5c3RlbXMgdXNlIGEgc3RyaW5nIHRvIG5hbWUgZmlsZXMgaW4gdGhlaXIgc3RvcmFnZQoraGllcmFyY2h5LiBUaG91Z2ggYSB0eXBpY2FsIHBhdGhuYW1lIGlzIGFuIEFTQ0lJIHN0cmluZyAoPHR0PidjOlx3aW5kb3dzXGZvbnRzXHRpbWVzLnR0Zic8L3R0Pgorb24gV2luZG93cywgPHR0PicvaG9tZS9mb250cy90aW1lcy50dGYnPC90dD4gb24gVW5peCksIHNvbWUgT1NlcyB1c2UgZGlmZmVyZW50CitzY2hlbWVzLCB2YXJ5aW5nIGZyb20gVW5pY29kZSBjaGFyYWN0ZXIgc3RyaW5ncyB0byBmaWxlIGktbm9kZSBudW1iZXJzLgorVGhlc2UgZGV0YWlscyBhcmUgcGxhdGZvcm0tc3BlY2lmaWMgYW5kIG11c3QgYmUgaGlkZGVuIHRvIHRoZSByZXN0IG9mIHRoZQorbGlicmFyeSBpbiByZXNvdXJjZSBvYmplY3RzLgorPHA+QSByZXNvdXJjZSBlbmNhcHN1bGF0ZXMgdGhlIGxvd2VzdCBkZXRhaWxzIHJlZ2FyZGluZyBhIGZpbGUsIHRob3VnaAoraXQgc2hvdWxkIGhhdmUgTk8gU1RBVEUuIE5vdGUgdGhhdCB0aGUgbmF0dXJlIG9yIHR5cGUgb2YgYSByZXNvdXJjZSAoaS5lLgorZGlzayBvciBtZW1vcnkgYmFzZWQpIGlzIGltcG9ydGFudCB0byB0aGUgInN0cmVhbSIgY29tcG9uZW50IG9ubHkuIFRoZQorcmVzdCBvZiB0aGUgbGlicmFyeSBhbmQgZm9udCBkcml2ZXJzIHdvcmsgdHJhbnNwYXJlbnRseSBmcm9tIHRoZWlyIGltcGxlbWVudGF0aW9uLgorPHA+Tm90ZSBhbHNvIHRoYXQgaXQgaXMgcGVyZmVjdGx5IHBvc3NpYmxlIHRvIG1peCByZXNvdXJjZXMgb2YgZGlzdGluY3QKK25hdHVyZXMgaW4gYSBzaW5nbGUgYnVpbGQ8L3VsPgorCis8dWw+Cis8bGk+CithICI8Yj5zdHJlYW08L2I+IiBpcyBhbiBvYmplY3Qgd2hpY2ggaXMgdXNlZCB0byBleHRyYWN0IGJ5dGVzIGZyb20gYSByZXNvdXJjZS4KK09ubHkgcmVzb3VyY2Ugb2JqZWN0cyBjYW4gY3JlYXRlIHN0cmVhbXMsIHRocm91Z2ggaXRzIDxpPjx0dD5PcGVuX1N0cmVhbSgpPC90dD48L2k+CittZXRob2QuIEEgc3RyZWFtIGhhcyBzdGF0ZSwgd2hpY2ggdHlwaWNhbGx5IGNvbnNpc3Qgb2YgYSBmaWxlICJjdXJzb3IiLAorc29tZSBpbnRlcm1lZGlhdGUgYnVmZmVycywgYSAiY3VycmVudCBmcmFtZSIgYW5kLCBvZiBjb3Vyc2UsIG1ldGhvZHMgdXNlZAordG8gZXh0cmFjdCB0aGUgZGF0YSBmcm9tIHN0cmVhbXMsIHJlc29sdmluZyBlbmRpYW5lc3MgYW5kIGFsaWduZW1lbnQgaXNzdWVzLjwvbGk+Cis8L3VsPgorRGF0YSBjYW4gYmUgZXh0cmFjdGVkIGZyb20gc3RyZWFtcyB0aHJvdWdoIGRpcmVjdCByZWFkcywgb3IgdGhyb3VnaCB0aGUKK3VzZSBvZiA8Yj5mcmFtZXM8L2I+LiBBIGZyYW1lIG1vZGVscyA8aT5hIHJ1biBvZiBjb250aWd1b3VzIGJ5dGVzPC9pPiBzdGFydGluZworZnJvbSB0aGUgY3VycmVudCBzdHJlYW0gcG9zaXRpb24sIGFuZCBvZiBsaWJlcmFsIHNpemUuCis8cD5NZXRob2RzIGV4aXN0IHRvIGV4dHJhY3Qgc3VjY2Vzc2l2ZSBpbnRlZ2VycyBvZiBhbnkgc2l6ZXMsIHdoaWxlIHJlc29sdmluZworZW5kaWFuZXNzIGFuZCBhbGlnbmVtZW50IGlzc3Vlcy4gUmF0aGVyIHRoYW4gYSBsb25nIHJldGhvcmljYWwgZXhwbGFuYXRpb24sCitoZXJlJ3MgaG93IGZyYW1lcyBhcmUgdHlwaWNhbGx5IHVzZWQgOgorPGJsb2NrcXVvdGU+PHR0Pns8L3R0PgorPGJyPjx0dD4mbmJzcDsghTwvdHQ+Cis8YnI+PHR0PiZuYnNwOyBGVF9FcnJvciZuYnNwOyBlcnJvcjs8L3R0PgorPHA+PHR0PiZuYnNwOyBlcnJvciA9IEZUX0FjY2Vzc19GcmFtZSggc3RyZWFtLCAxNCApOzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyBpZiAoZXJyb3IpIGdvdG8gRmFpbDs8L3R0PgorPHA+PHR0PiZuYnNwOyB2YWwxID0gRlRfR2V0X1Nob3J0KHN0cmVhbSk7PC90dD4KKzxicj48dHQ+Jm5ic3A7IHZhbDIgPSBGVF9HZXRfTG9uZyhzdHJlYW0pOzwvdHQ+Cis8YnI+PHR0PiZuYnNwOyB2YWwzID0gRlRfR2V0X0xvbmcoc3RyZWFtKTs8L3R0PgorPGJyPjx0dD4mbmJzcDsgdmFsNCA9IEZUX0dldF9Mb25nKHN0cmVhbSk7PC90dD4KKzxwPjx0dD4mbmJzcDsgRlRfRm9yZ2V0X0ZyYW1lKHN0cmVhbSk7PC90dD4KKzxicj48dHQ+Jm5ic3A7IIU8L3R0PgorPGJyPjx0dD59PC90dD48L2Jsb2NrcXVvdGU+CitUaGlzIGNvZGUgZG9lcyB0aGUgZm9sbG93aW5nIDoKKzxibG9ja3F1b3RlPgorPG9sPgorPGxpPgorJm5ic3A7Zmlyc3QsIGl0ICJsb2FkcyIgdGhlIG5leHQgMTQgYnl0ZXMgZnJvbSB0aGUgY3VycmVudCBjdXJzb3IgcG9zaXRpb24KK2ludG8gdGhlIHN0cmVhbSdzIGZyYW1lLCB1c2luZyB0aGUgPHR0PkZUX0FjY2Vzc19GcmFtZTwvdHQ+IEFQSS4gQW4gZXJyb3IKK2lzIHJldHVybmVkIGlmLCBmb3IgZXhhbXBsZSwgbGVzcyB0aGFuIDE0IGJ5dGVzIGFyZSBsZWZ0IGluIHRoZSBzdHJlYW0KK3doZW4gdGhlIGNhbGwgb2NjdXJzLi48L2xpPgorPC9vbD4KKworPG9sPgorPGxpPgorJm5ic3A7aXQgZXh0cmFjdCBmb3VyIGludGVnZXJzIChvbmUgMTYtYml0IHNob3J0LCB0aHJlZSAzMi1iaXQgbG9uZ3MpIGZyb20KK3RoZSBmcmFtZSB1c2luZyA8dHQ+RlRfR2V0X1Nob3J0PC90dD4gYW5kIDx0dD5GVF9HZXRfTG9uZzwvdHQ+LiBUaGVzZSBmdW5jdGlvbgoraW5jcmVtZW50IHRoZSBmcmFtZSdzIGN1cnNvciBmaW5hbGx5LCBpdCAicmVsZWFzZXMiIHRoZSBzdHJlYW0ncyBmcmFtZS48L2xpPgorPC9vbD4KKworPG9sPgorPGxpPgorJm5ic3A7RWFjaCBzdHJlYW0gaGFzIGl0cyBvd24gZnJhbWUgd2hpY2ggY2FuIGJlIGFjY2Vzc2VkIGluZGVwZW5kZW50bHksCitob3dldmVyLCBuZXN0ZWQgZnJhbWUgYWNjZXNzZXMgYXJlIG5vdCBhbGxvd2VkLiBOb3RlIGFsc28gdGhhdCB0aGUgYnl0ZXMKK2FyZSBlZmZlY3RpdmVseSByZWFkIGZyb20gdGhlIHN0cmVhbSBvbiB0aGUgY2FsbCB0byA8dHQ+RlRfQWNjZXNzX0ZyYW1lPC90dD4uCitBbnkgc3Vic2VxdWVudCByZWFkIHdpbGwgb2NjdXIgYWZ0ZXIgdGhlc2UgMTQgYnl0ZXMsIGV2ZW4gaWYgbGVzcyBhcmUgZXh0cmFjdGVkCit0aHJvdWdoIDx0dD5GVF9HZXRfeHh4eDwvdHQ+IGZ1bmN0aW9ucy48L2xpPgorPC9vbD4KKzwvYmxvY2txdW90ZT4KK1RoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgcmVzb3VyY2UgY2xhc3MgaXMgbG9jYXRlZCBpbiB0aGUgc3lzdGVtIGNvbXBvbmVudAorKGkuZS4gIjx0dD5hcmNoLzxpPiZsdDtzeXN0ZW0+PC9pPi9mdHN5cy5jPC90dD4iKSBhbmQgY2FuIHRodXMgYmUgdGFpbG9yZWQKK2ZvciBhIHNwZWNpZmljIHBvcnQgb2YgdGhlIGVuZ2luZS4KKzxwPkEgcmVzb3VyY2UgY2FuIGJlIGNyZWF0ZWQgdGhyb3VnaCB0aGUgPHR0PkZUX05ld19SZXNvdXJjZTwvdHQ+IEFQSTsKK2hvd2V2ZXIgdGhpcyBmdW5jdGlvbiBvbmx5IGFjY2VwdHMgYW4gOC1iaXQgcGF0aG5hbWUgdG8gbmFtZSB0aGUgdGFyZ2V0Citmb250IGZpbGUsIHdoaWNoIG1heSBiZSBpbmFwcHJvcHJpYXRlIGZvciBzeXN0ZW1zIHVzaW5nIGEgZGlmZmVyZW50IG5hbWluZworc2NoZW1lIChlLmcuIFVURi0xNiBwYXRobmFtZSwgaS1ub2RlIG51bWJlciwgZXRjLi4pLiBJdCdzIHVwIHRvIHRoZSBwb3J0ZXIKK3RoZW4gdG8gcHJvdmlkZSBpdHMgb3duIHJlc291cmNlIGNyZWF0aW9uIGZ1bmN0aW9uIChsaWtlLiA8dHQ+RlRfTmV3X1VURjE2X1Jlc291cmNlPC90dD4sCitmb3IgZXhhbXBsZSkgaW4gaXRzIHZlcnNpb24gb2YgIjx0dD5mdHN5cy5jPC90dD4iLgorPHA+Tm90ZSB0aGF0IDx0dD5GVF9OZXdfUmVzb3VyY2U8L3R0PiB3aWxsIGZhaWwgYW5kIHJldHVybiBhbiBlcnJvciBjb2RlCitpZiB0aGUgZm9udCBmaWxlIGNhbm5vdCBiZSBmb3VuZCwgb3Igd2hlbiBpdHMgZm9udCBmb3JtYXQgaXNuJ3QgcmVjb2duaXplZAorYnkgb25lIG9mIHRoZSBkcml2ZXJzIGluc3RhbGxlZCBpbiB0aGUgbGlicmFyeS4gVGhlIGxpc3Qgb3IgcmVzb3VyY2VzIGNyZWF0ZWQKK2ZvciBhIGdpdmVuIGxpYnJhcnkgaW5zdGFuY2UgaXMgdGh1cyB0aGUgbGlzdCBvZiAiaW5zdGFsbGVkIGZvbnQgZmlsZXMiLgorPGJyPiZuYnNwOzwvYmxvY2txdW90ZT4KKworPGgzPgorMy4gU3RyZWFtIE1hbmFnZXIgOjwvaDM+CisKKzxibG9ja3F1b3RlPkFzIHNhaWQgYmVmb3JlLCByZXNvdXJjZXMgZG8gbm90IGJlYXIgc3RhdGVzLCB3aGlsZSBzdHJlYW1zCitkby4gU3RyZWFtIGNyZWF0aW9uIGlzIGFsc28gYSB2ZXJ5IGxlbmd0aHkgcHJvY2VzcywgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQKK29wZXJhdGluZyBzeXN0ZW0gKGUuZy4gIjx0dD5mb3BlbjwvdHQ+IiBpcyB1c3VhbGx5IHZlcnkgc2xvdykuCis8cD5CZWNhdXNlIGEgdHlwaWNhbCBmb250IGRyaXZlciB3aWxsIHdhbnQgdG8gdXNlIGEgbmV3IHN0cmVhbSBvbiBlYWNoCithY2Nlc3MgdG8gaW5kaXZpZHVhbCBnbHlwaHMsIGJlaW5nIGFibGUgdG8gY2FjaGUgdGhlIG1vc3QgcmVjZW50bHkgdXNlZAorc3RyZWFtcyBpcyBhIHJlcXVpcmVtZW50IGluIG9yZGVyIHRvIGF2b2lkIGNvbnNpZGVyYWJsZSBwZXJmb3JtYW5jZSBwZW5hbHRpZXMuCis8cD5TdHJlYW0gY2FjaGluZyBpcyB0aHVzIGltcGxlbWVudGVkIGluIHRoZSAiPHR0PmZ0c3RyZWFtPC90dD4iIGNvbXBvbmVudC4KK0l0IG1haW50YWlucyBhIHNpbXBsZSBMUlUgbGlzdCBvZiB0aGUgbGVhc3QgcmVjZW50bHkgdXNlZCBzdHJlYW1zLiBFYWNoCitzdHJlYW0gaW4gdGhlIGNhY2hlIGlzIHN0aWxsIG9wZW5lZCBhbmQgYXZhaWxhYmxlIGZvciBpbW1lZGlhdGUgcHJvY2Vzc2luZy4KK1doZW4gYSByZXNvdXJjZSBpcyBkZXN0cm95ZWQsIHRoZSBzdHJlYW0gY2FjaGUgaXMgcGFyc2VkIHRvIHJlbW92ZSBhbGwKK3JlbGF0ZWQgY2FjaGVkIHN0cmVhbXMuCis8cD5TdHJlYW0gY2FjaGluZyBjYW4gYWxzbyBiZSBkaXNhYmxlZCB3aXRoIGEgY29uZmlndXJhdGlvbiBtYWNybyB3aGVuCit1c2luZyBvbmx5IFJPTSBiYXNlZCByZXNvdXJjZXMgKHdoZXJlIHN0cmVhbSBvcGVuaW5nIGlzIHJlYWxseSBxdWljaykuCitJdCBpcyBpbXBsZW1lbnRlZCB0aHJvdWdoIGEgU3RyZWFtIE1hbmFnZXIgb2JqZWN0IChzZWUgPHR0PmZ0c3RyZWFtLmM8L3R0PikuCis8YnI+Jm5ic3A7PC9ibG9ja3F1b3RlPgorCis8aDM+Cis0LiBSYXN0ZXIgOjwvaDM+CisKKzxibG9ja3F1b3RlPlRoZSByYXN0ZXIgaXMgdGhlIGNvbXBvbmVudCBpcyBjaGFyZ2Ugb2YgZ2VuZXJhdGluZyBiaXRtYXBzCithbmQgYW50aS1hbGlhc2VkIHBpeG1hcHMgZnJvbSB2ZWN0b3JpYWwgb3V0bGluZSBkZWZpbml0aW9ucy4gSXQgaXMgYWxzbworc29tZXRpbWVzIGNhbGxlZCB0aGUgc2Nhbi1saW5lIGNvbnZlcnRlci4gSXQgaGFzIGJlZW4gY29tcGxldGVseSByZXdyaXR0ZW4KK2ZvciBGcmVlVHlwZSAyLjAgaW4gb3JkZXIgdG8gc3VwcG9ydCB0aGlyZC1vcmRlciBiZXppZXIgYXJjcywgMTctbGV2ZWxzCithbnRpLWFsaWFzaW5nICh0aHJvdWdoIDR4NCBzdWItc2FtcGxpbmcpLCBpbXByb3ZlZCBwZXJmb3JtYW5jZSwgYXMgd2VsbAorYXMgc3RhbmQtYWxvbmUgY29tcGlsYXRpb24gKGluIG9yZGVyIHRvIGluY2x1ZGUgaXQgaW4gb3RoZXIgZ3JhcGhpY3MgcGFja2FnZQord2l0aG91dCByZXF1aXJpbmcgdGhlIHJlc3Qgb2YgdGhlIEZyZWVUeXBlIGVuZ2luZSkuCis8cD5CZWNhdXNlIGl0IHdhcyBkZXNpZ25lZCBmb3IgZWFzeSByZS11c2UgYW5kIGVtYmVkZGVkIHN5c3RlbXMsIHRoZSByYXN0ZXIKK2lzIGEgcnRhaGVyICd1bnVzdWFsJyBwaWVjZSBvZiBjb2RlLCBiZWNhdXNlIGl0IGRvZXNuJ3QgcGVyZm9ybSBhIHNpbmdsZQorbWVtb3J5IGFsbG9jYXRpb24sIG5vciBjb250YWluIGFueSBzdGF0aWMgb3IgZ2xvYmFsIHZhcmlhYmxlLiBSYXRoZXIsIGl0CitpcyB1cCB0byBjbGllbnQgYXBwbGljYXRpb25zIHRvIGFsbG9jYXRlIGEgcmFzdGVyIG9iamVjdCBpbiB0aGVpciBvd24gaGVhcAorb3IgbWVtb3J5IHNwYWNlLgorPHA+RWFjaCByYXN0ZXIgb2JqZWN0IGFsc28gbmVlZHMgYSByYXRoZXIgbGFyZ2UgYmxvY2sgb2YgbWVtb3J5IGNhbGxlZAoraXRzIHJlbmRlciBwb29sLiBUaGUgcG9vbCBpcyB1c2VkIGR1cmluZyByZW5kZXJpbmcgKGFuZCBvbmx5IGR1cmluZyBpdCkKK2luIG9yZGVyIHRvIHBlcmZvcm0gdGhlIHNjYW4tbGluZSBjb252ZXJzaW9uLiBCZWNhdXNlIGl0IGFjY2Vzc2VzIGFuZCBtYW5hZ2VzCitkYXRhIGRpcmVjdGx5IHdpdGhpbiB0aGUgcG9vbCwgdGhlIHJhc3RlciB5ZWxkcyBpbXByZXNzaXZlIHBlcmZvcm1hbmNlCithcyB3ZWxsIGFzIGJvdW5kZWQgbWVtb3J5IGNvbnN1bXB0aW9uLiBJdCBjYW4gYWxzbyBhdXRvbWF0aWNhbGx5IGRlY29tcG9zZQorbGFyZ2UgcmVxdWVzdHMgaW50byBzbWFsbGVyIGluZGl2aWR1YWwgc3ViLXRhc2tzLgorPHA+RmluYWxseSwgaXQgbmV2ZXIgY3JlYXRlcyBiaXRtYXBzIG9yIHBpeG1hcHMsIGJ1dCBzaW1wbHkgcmVuZGVycyBpbnRvCit0aGVtIChwcm92aWRpbmcgY2xpcHBpbmcgdG9vKS4gVGhlc2UgbXVzdCBiZSBkZXNjcmliZWQgdG8gdGhlIHJhc3RlciB3aXRoCit0aGUgaGVscCBvZiBhIDx0dD5GVF9SYXN0ZXJfTWFwPC90dD4gc3RydWN0dXJlIChhIHZlcnkgc2ltcGxlIGJpdG1hcC9waXhtYXAKK2Rlc2NyaXB0b3IpLgorPHA+Tm90ZSB0aGF0IHdoZW4gcmVuZGVyaW5nIGFudGktYWxpYXNlZCBwaXhtYXBzLCB0aGUgcmFzdGVyIGRvZXNuJ3QgdXNlCithbiBpbnRlcm1lZGlhdGUgYml0bWFwIGJ1ZmZlciwgYXMgZmlsdGVyaW5nIGlzIHBhcnQgb2YgdGhlIHNjYW4tbGluZSBjb252ZXJzaW9uCitwcm9jZXNzLgorPGJyPiZuYnNwOzwvYmxvY2txdW90ZT4KKworPGgzPgorNS4gTGlicmFyeSBvYmplY3RzIDo8L2gzPgorCis8YmxvY2txdW90ZT5BIGxpYnJhcnkgb2JqZWN0IG1vZGVscyBhIHNpbmdsZSBpbnN0YW5jZSBvZiB0aGUgRnJlZVR5cGUgZW5naW5lLgorVGhpcyBpcyB1c2VmdWwgd2hlbiBGcmVlVHlwZSBpcyBjb21waWxlZCBhcyBhIHNoYXJlZCBvYmplY3QgKERMTCksIGFzIGl0CitjYW4gdGhlbiBiZSB1c2VkIGJ5IHNldmVyYWwgYXBwbGljYXRpb25zLCBlYWNoIHdpdGggaXRzIG93biByZXNvdXJjZXMgYW5kCitvYmplY3RzLgorPHA+VGhlIDx0dD5GVF9MaWJyYXJ5PC90dD4gdHlwZSBpcyBhbiBvcGFxdWUgaGFuZGxlIHRvIGEgbGlicmFyeSBvYmplY3QuCitTdWNoIGFuIG9iamVjdCBpcyBjcmVhdGVkIHRocm91Z2ggYSBjYWxsJm5ic3A7IHRvIDx0dD5GVF9Jbml0X0ZyZWVUeXBlPC90dD4uCitPbmNlIHlvdSBkb24ndCBuZWVkIGl0IGFueW1vcmUsIG9uZSBjYW4gZGVzdHJveSBhIGxpYnJhcnkgb2JqZWN0IHRocm91Z2gKKzx0dD5GVF9Eb25lX0ZyZWVUeXBlPC90dD4uCis8cD5Ob3RlIHRoYXQgaW4gcmVlbnRyYW50IGJ1aWxkcywgc2V2ZXJhbCB0aHJlYWRzIGNhbiBhY2Nlc3MgYSBzaW5nbGUgbGlicmFyeQorb2JqZWN0IGNvbmN1cnJlbnRseS4gU3VjaCBhIGJ1aWxkIGNhbiBiZSBjaG9zZW4gYnkgc3dpdGNoaW5nIG9uZSBjb25maWd1cmF0aW9uCittYWNybyBpbiB0aGUgZmlsZSAnPHR0PmFyY2gvPGk+Jmx0O3N5c3RlbT48L2k+L2Z0Y29uZmlnLmg8L3R0Pic8L2Jsb2NrcXVvdGU+CisKKzxoMz4KKzYuIERyaXZlciBvYmplY3RzIDo8L2gzPgorCis8YmxvY2txdW90ZT5BIGRyaXZlciBvYmplY3QgbW9kZWxzIGFuIGluc3RhbmNlIG9mIGEgZ2l2ZW4gZm9udCBkcml2ZXIsCitpLmUuIGFuIGVsZW1lbnQgb2YgRnJlZVR5cGUgY29kZSBpbiBjaGFyZ2Ugb2YgaGFuZGxpbmcgYSBnaXZlbiBmb250IGZvcm1hdCwKK2xpa2UgVHJ1ZVR5cGUsIFR5cGUxLCBGTlQsIFBDRiwgZXRjLi4KKzxwPkVhY2ggbGlicmFyeSBvYmplY3QgY29udGFpbnMgYSBnaXZlbiBzZXQgb2YgZHJpdmVyIG9iamVjdHMgd2hlbiBpdCBpcworY3JlYXRlZCB0aHJvdWdoIEZUX0luaXRfRnJlZVR5cGUsIHRoaXMgc2V0IGJlaW5nIGRldGVybWluZWQgYXQgY29tcGlsZQordGltZSAoc2VlIHRoZSBmaWxlICdiYXNlL2Z0YXBpLmMnKS4gSG93ZXZlciwgcmVtb3Zpbmcgb3IgYWRkaW5nIGRyaXZlcnMKK2lzIHBvc3NpYmxlIGF0IHJ1bi10aW1lLCBpbiBvcmRlciB0byBtYWtlIHVwZ3JhZGVzIGVhc3kuPC9ibG9ja3F1b3RlPgorCis8aDM+Cis3LiBEaWFncmFtPC9oMz4KKworPGJsb2NrcXVvdGU+VGhpcyBkaWFncmFtIHNob3cgdGhlIG9iamVjdCByZWxhdGlvbnNoaXBzIGZvciB0aGUgc29sZSBiYXNlCitsYXllci4gVGhlIGxpYnJhcnkgb2JqZWN0IGlzIHRoZSByb290IG9mIHRoZSBvYmplY3QgZ3JhcGggOgorPGNlbnRlcj4KKzxwPjxpbWcgU1JDPSJvYmplY3RzX2RpYWdyYW0uZ2lmIiBoZWlnaHQ9MzAwIHdpZHRoPTU2Mj48L2NlbnRlcj4KKworPHA+SXQgY2FuIGJlIHJlYWQgYXMgZm9sbG93cyA6Cis8YnI+Jm5ic3A7Cis8dWw+Cis8bGk+CitFYWNoIGxpYnJhcnkgb2JqZWN0IGhhcyBvbmUgc3lzdGVtLCBvbmUgcmFzdGVyIGFuZCBvbmUgc3RyZWFtIG1hbmFnZXIgb2JqZWN0cy4KK1RoZXNlIG9iamVjdHMgY2FuIG9ubHkgYmVsb25nIHRvIG9uZSBnaXZlbiBsaWJyYXJ5LjwvbGk+Cis8L3VsPgorCis8dWw+Cis8bGk+CitFYWNoIGxpYnJhcnkgY29udGFpbnMgb25lIGxpc3Qgb2YgMCBvciBtb3JlIHJlc291cmNlcywgYXMgd2VsbCBhcyBvbmUgbGlzdAorb2YgMCBvciBtb3JlIGRyaXZlciBvYmplY3RzLjwvbGk+Cis8L3VsPgorCis8dWw+Cis8bGk+CitFYWNoIHN0cmVhbSBtYW5hZ2VyIGhvbGRzIGEgYm91bmRlZCBsaXN0ICgiMC4ubiIgd2hlcmUgJ24nIGlzIHRoZSBzdHJlYW0KK2NhY2hlJ3Mgc2l6ZSkgb2Ygc3RyZWFtIG9iamVjdHMuIEVhY2ggc3RyZWFtIGlzIHJlbGF0ZWQgdG8gb25lIGdpdmVuIHJlc291cmNlCitvYmplY3QuIEVhY2ggcmVzb3VyY2UgbWF5IGJlIHJlbGF0ZWQgdG8gemVybyBvciBvbmUgc3RyZWFtLjwvbGk+Cis8L3VsPgorCis8dWw+Cis8bGk+CitFYWNoIHJlc291cmNlIGlzIHJlbGF0ZWQgdG8gb25lIGRyaXZlciBvYmplY3QuIEEgZHJpdmVyIGlzIHJlbGF0ZWQgdG8gMAorb3IgbW9yZSByZXNvdXJjZXMuPC9saT4KKzwvdWw+Cis8L2Jsb2NrcXVvdGU+Cis8L2Jsb2NrcXVvdGU+CisKKzxwPjxicj4KKzxociBXSURUSD0iMTAwJSI+Cis8aDI+CitJVi4gRm9udCBvYmplY3RzIDo8L2gyPgorCis8YmxvY2txdW90ZT5Gb250IG9iamVjdHMgYXJlIHVzZWQgdG8gZGlyZWN0bHkgbWFwIHRoZSBpbmZvcm1hdGlvbiBmb3VuZAoraW4gZm9udCBmaWxlcyBpbnRvIHNldmVyYWwgY2F0ZWdvcmllcyA6Cis8YnI+Jm5ic3A7Cis8aDM+CisxLiBGYWNlIG9iamVjdHMgOjwvaDM+CisKKzxibG9ja3F1b3RlPkZhY2Ugb2JqZWN0cyBhcmUgdXNlZCB0byBtb2RlbCBpbmRpdmlkdWFsIGZvbnQgZmFjZXMuIFRoZXkKK2VuY2Fwc3VsYXRlIGRhdGEgd2hpY2ggaXNuJ3QgcmVsYXRlZCB0byBhIHNwZWNpZmljIGNoYXJhY3RlciBzaXplLCBvciBhCitzcGVjaWZpYyBnbHlwaCBvciBnbHlwaCBzZXQuIFVzdWFsbHksIHRoaXMgbWVhbnMgOgorPHVsPgorPGxpPgordGhlIGZvbnQgZmFjZSdzIGZhbWlseSBhbmQgc3R5bGUgbmFtZXMgKGUuZy4gIlBhbGF0aW5vIiArICJSZWd1bGFyIik8L2xpPgorCis8bGk+Citzb21lIGZsYWdzIGluZGljYXRpbmcgd2hpY2gga2luZCBvZiBmb250IHRoaXMgaXMgKHNjYWxhYmxlIG9yIGZpeGVkID8gZml4ZWQtd2lkdGgKK29yIHByb3BvcnRpb25hbCA/IGhvcml6b250YWwgb3IgdmVydGljYWwgPyBldGOFKTwvbGk+CisKKzxsaT4KK3RoZSBudW1iZXIgb2YgZ2x5cGhzLCBjaGFybWFwcyBhbmQgZXZlbnR1YWxseSBmaXhlZCBjaGFyYWN0ZXIgc2l6ZXMgKGZvcgorYml0bWFwIGZvcm1hdHMpIGZvdW5kIGluIHRoZSBmb250IGZhY2UuPC9saT4KKworPGxpPgorZm9yIHNjYWxhYmxlIGZvcm1hdHMsIHNvbWUgaW1wb3J0YW50IG1ldHJpY3MgbGlrZSB0aGUgYXNjZW5kZXIsIGRlc2NlbmRlciwKK2dsb2JhbCBmb250IGJvdW5kaW5nIGJveCwgbWF4aW11bSBhZHZhbmNlIHdpZHRoLCBldGMuLiBleHByZXNzZWQgaW4gbm90aW9uYWwKK2ZvbnQvZ3JpZCB1bml0cyAoYXMgd2VsbCBhcyB0aGUgbnVtYmVyIG9mIHVuaXRzIG9uIHRoZSBFTSBncmlkKS48L2xpPgorPC91bD4KK0EgZmFjZSBpcyBjcmVhdGVkIGZyb20gYSByZXNvdXJjZSBvYmplY3QsIHdpdGggdGhlIDx0dD5GVF9OZXdfRmFjZTwvdHQ+CitBUEkuIEVhY2ggZHJpdmVyIGNvbnRhaW5zIGEgbGlzdCBvZiBvcGVuZWQgZmFjZSBvYmplY3RzIGZvciB0aGUgcmVzb3VyY2VzCitpdCBtYW5hZ2VzLiBXaGVuIGEgZHJpdmVyIGlzIHJlbW92ZWQgb3IgZGVzdHJveWVkLCBhbGwgaXRzIGNoaWxkIGZhY2VzCithcmUgZGlzY2FyZGVkIGF1dG9tYXRpY2FsbHkgd2l0aCBpdC48L2Jsb2NrcXVvdGU+CisKKzxoMz4KKzIuIFNpemUgb2JqZWN0cyA6PC9oMz4KKworPGJsb2NrcXVvdGU+U2l6ZSBvYmplY3RzIGFyZSB1c2VkIHRvIG1vZGVsIGEgZ2l2ZW4gY2hhcmFjdGVyIGRpbWVuc2lvbgorZm9yIGEgZ2l2ZW4gZGV2aWNlIHJlc29sdXRpb24gKHdoaWNoIHJlYWxseSBtZWFucyBhIGdpdmVuIGNoYXJhY3RlciBwaXhlbAorZGltZW5zaW9ucykuCis8cD5FYWNoIHNpemUgb2JqZWN0IGlzIGNyZWF0ZWQgZnJvbSBhIHBhcmVudCBmYWNlIG9iamVjdC4gVGhlIG9iamVjdCBjYW4KK2JlIHJlc2V0IHRvIG5ldyBkaW1lbnNpb25zIGF0IGFueSB0aW1lLiBFYWNoIGZhY2Ugb2JqZWN0IGhvbGRzIGEgbGlzdCBvZgorYWxsIGl0cyBjaGlsZCBzaXplcywgdGhlc2UgYXJlIGRlc3Ryb3llZCBhdXRvbWF0aWNhbGx5IHdoZW4gdGhlIGZhY2Ugb2JqZWN0CitpcyBkaXNjYXJkZWQuCis8cD5UaGUgbWV0cmljcyBjb250YWlucyBtZXRyaWNzLCBleHByZXNzZWQgaW4gcGl4ZWxzLCBmb3IgdGhlIGFzY2VuZGVyLAorZGVzY2VuZGVyLCBtYXhpbXVtIGFkdmFuY2Ugd2lkdGgsIGV0Yy4uCis8YnI+Jm5ic3A7PC9ibG9ja3F1b3RlPgorCis8aDM+CiszLiBHbHlwaCBTbG90IG9iamVjdHMgOjwvaDM+CisKKzxibG9ja3F1b3RlPkEgZ2x5cGggc2xvdCBpcyBhIGNvbnRhaW5lciB3aGVyZSBvbmUgY2FuIGxvYWQgaW5kaXZpZHVhbCBnbHlwaHMsCitiZSB0aGV5IGluIHZlY3RvciBvZiBiaXRtYXAgZm9ybWF0LiBFYWNoIHNsb3QgYWxzbyBjb250YWlucyBtZXRyaWNzIGZvcgordGhlIGdseXBoIGl0IGNvbnRhaW5zLgorPHA+RWFjaCBmYWNlIG9iamVjdCBjb250YWlucyBvbmUgb3IgbW9yZSBnbHlwaCBzbG90IG9iamVjdCA6IHRoZSBmaXJzdAorZ2x5cGggc2xvdCBpcyBjcmVhdGVkIGF1dG9tYXRpY2FsbHkgd2l0aCBpdHMgcGFyZW50IGZhY2UsIGFuZCBpdCBpcyBwb3NzaWJsZQordG8gYWRkIG5ldyBnbHlwaCBzbG90cyAodGhpcyBpcyByYXJlbHkgdXNlZCBvdXRzaWRlIG9mIGRlYnVnZ2luZyBwdXJwb3NlcykuCis8YnI+Jm5ic3A7PC9ibG9ja3F1b3RlPgorCis8aDM+Cis0LiBDaGFyTWFwIG9iamVjdHMgOjwvaDM+CisKKzxibG9ja3F1b3RlPkEgY2hhcm1hcCBvYmplY3QgaXMgYSBzb3J0IG9mIGRpY3Rpb25hcnkgd2hvc2UgdGFzayBpcyB0byB0cmFuc2xhdGUKK2NoYXJhY3RlciBjb2RlcyBpbiBhIGdpdmVuIGNoYXJhY3RlciBlbmNvZGluZyAobGlrZSBTaGlmdEpJUywgVW5pY29kZSwKK0FOU0ksIGV0Yy4uKSBpbnRvIGdseXBoIGluZGV4ZXMgaW4gYSBnaXZlbiBmb250IGZhY2UuCis8cD5BIGZhY2Ugb2JqZWN0IGNvbnRhaW5zIG9uZSBvciBtb3JlIGNoYXJtYXAgb2JqZWN0cy4gQWxsIGNoYXJtYXAgb2JqZWN0cworYXJlIGNyZWF0ZWQgd2hlbiB0aGUgcGFyZW50IGZhY2UgaXMgY3JlYXRlZCwgdGhvdWdoIHRoZXkncmUgbm90IGRpcmVjdGx5Cit2aXNpYmxlIHRvIGNsaWVudCBhcHBsaWNhdGlvbnMgKHJhdGhlciwgdGhleSBjYW4gYmUgZW51bWVyYXRlZCB0aHJvdWdoCitGVF9HZXRfRmlyc3RfQ2hhck1hcCBhbmQgRlRfR2V0X05leHRfQ2hhck1hcCwgb3IgbW9yZSBzaW1wbHkgcGlja2VkIGFkZXF1YXRlbHkKK3dpdGggRlRfRmluZF9DaGFyTWFwIGZvciBhIHNldCBvZiBnaXZlbiBlbmNvZGluZ3MpLgorPGJyPiZuYnNwOzwvYmxvY2txdW90ZT4KKworPGgzPgorNS4gRGlhZ3JhbTwvaDM+CisKKzxibG9ja3F1b3RlPlRoZSBmb2xsb3dpbmcgZGlhZ3JhbSBpbGx1c3RyYXRlcyB0aGUgcmVsYXRpb25zaGlwcyBiZXR3ZWVuCitmb250IG9iamVjdHMgOgorPGNlbnRlcj4KKzxwPjxpbWcgU1JDPSJvYmplY3RzX2RpYWdyYW0yLmdpZiIgaGVpZ2h0PTMyNyB3aWR0aD01NjE+PC9jZW50ZXI+CisKKzxwPldoaWNoIGNhbiBiZSByZWFkIGFzIDoKKzxicj4mbmJzcDsKKzx1bD4KKzxsaT4KK2VhY2ggcmVzb3VyY2UgbWF5IGhhdmUgemVybyBvciBtb3JlIGNoaWxkIGZhY2Ugb2JqZWN0cyAib3BlbmVkIiBmb3IgaXQuCitUaGUgbnVtYmVyIG9mIGZhY2VzIGlzIGJvdW5kZWQgYnkgdGhlIG51bWJlciBvZiBmb250IGZhY2VzIHdpdGhpbiB0aGUgZm9udAorcmVzb3VyY2UuPC9saT4KKzwvdWw+CisKKzx1bD4KKzxsaT4KK2VhY2ggZHJpdmVyIGhvbGRzIGEgbGlzdCBvZiBhbGwgdGhlIGZhY2VzIG9wZW5lZCBmb3IgdGhlIHJlc291cmNlcyBpdCBtYW5hZ2VzLgorV2hlbiB0aGUgZHJpdmVyIGlzIHJlbW92ZWQsIGl0cyBjaGlsZCBmYWNlcyBhcmUgZGlzY2FyZGVkIGF1dG9tYXRpY2FsbHkuPC9saT4KKzwvdWw+CisKKzx1bD4KKzxsaT4KK2VhY2ggZmFjZSBvYmplY3QgaGFzIG9uZSBzaW5nbGUgcGFyZW50IHJlc291cmNlLCBhbmQgb25lIHNpbmdsZSBkcml2ZXIuPC9saT4KKzwvdWw+CisKKzx1bD4KKzxsaT4KK2VhY2ggZmFjZSBoYXMgb25lIG9yIG1vcmUgY2hhcm1hcHMsIGFuZCBvbmUgb3IgbW9yZSBnbHlwaCBzbG90czwvbGk+Cis8L3VsPgorCis8dWw+Cis8bGk+CitlYWNoIGZhY2UgaG9sZHMgYSBsaXN0IG9mIHplcm8gb3IgbW9yZSBjaGlsZCBzaXplIG9iamVjdHM8L2xpPgorPC91bD4KKworPHVsPgorPGxpPgorZWFjaCBjaGFybWFwLCBnbHlwaCBzbG90IGFuZCBzaXplIGlzIHJlbGF0ZWQgdG8gb25lIGdpdmVuIHBhcmVudCBmYWNlLgorVGhlc2Ugb2JqZWN0cyBhcmUgZGVzdHJveWVkIGF1dG9tYXRpY2FsbHkgd2hlbiB0aGUgcGFyZW50IGZhY2UgaXMgZGlzY2FyZGVkLjwvbGk+Cis8L3VsPgorPC9ibG9ja3F1b3RlPgorPC9ibG9ja3F1b3RlPgorCis8cD48YnI+Cis8aHIgV0lEVEg9IjEwMCUiPgorPGgyPgorVi4gRHJpdmVyIEludGVyZmFjZSA6PC9oMj4KKworPGJsb2NrcXVvdGU+QSBmb250IGRyaXZlciBpcyBhZGRlZCB0byBhIGdpdmVuIGxpYnJhcnkgb2JqZWN0IHRocm91Z2ggdGhlCis8dHQ+RlRfQWRkX0RyaXZlcjwvdHQ+CitBUEkuIFRoaXMgZnVuY3Rpb24gcmVjZWl2ZXMgYSBzdHJ1Y3R1cmUga25vd24gYXMgYSA8dHQ+RlRfRHJpdmVySW50ZXJmYWNlPC90dD4sCit3aGljaCBkZXNjcmliZXMgdGhlIGRyaXZlcidzIGJhc2ljIHByb3BlcnRpZXMuCis8cD5UaGUgPHR0PkZUX0RyaXZlckludGVyZmFjZTwvdHQ+IGNvbnRhaW5zIGEgc2V0IG9mIGZ1bmN0aW9uIHBvaW50ZXJzCit1c2VkIGZvciB0aGUgYmFzZSBGcmVlVHlwZSBmdW5jdGlvbmFsaXRpZXMuIEhvd2V2ZXIsIGVhY2ggZHJpdmVyIGNhbiBhbHNvCitwcm92aWRlIGEgZm9udC1mb3JtYXQtc3BlY2lmaWMgZXh0ZW5kZWQgaW50ZXJmYWNlIHRvIGFsbG93IGNsaWVudCBhcHBsaWNhdGlvbnMKK3RvIHVzZSBtb3JlIGFkdmFuY2VkIGZlYXR1cmVzLgorPGJyPiZuYnNwOworPGgzPgorMS4gQ29tbW9uIEludGVyZmFjZTwvaDM+CisKKzxibG9ja3F1b3RlPlRoZSBzdHJ1Y3R1cmUgb2YgPHR0PkZUX0RyaXZlckludGVyZmFjZTwvdHQ+IGlzIHJhdGhlciBzaW1wbGUsCithbmQgZGVmaW5lZCBpbiAiPHR0PmJhc2UvZnRkcml2ZXIuaDwvdHQ+Ii4gSXQgbXVzdCBiZSB3ZWxsIGtub3duIGJ5IGFueQorZGV2ZWxvcGVyIHdobyB3YW50cyB0byB3cml0ZSBhIG5ldyBkcml2ZXIgZm9yIHRoZSBlbmdpbmUuIFdlIGFkdmlzZSByZWFkaW5nCit0aGUgPGI+PGk+RnJlZVR5cGUgRHJpdmVyIEhvd1RvPC9pPjwvYj4gYXMgd2VsbCBhcyB0aGUgc291cmNlIGNvZGUgb2YgZXhpc3RpbmcKK2RyaXZlcnMuIFNvdXJjZSBjb21tZW50cy48L2Jsb2NrcXVvdGU+CisKKzxoMz4KKzIuIERyaXZlci1zcGVjaWZpYyBleHRlbnNpb25zPC9oMz4KKworPGJsb2NrcXVvdGU+VGhlIGZpZWxkIG9mIHRoZSA8dHQ+RlRfRHJpdmVySW50ZXJmYWNlPC90dD4gc3RydWN0dXJlIGlzIGEKK3R5cGVsZXNzIHBvaW50ZXIgdG8gYSBmb3JtYXQtc3BlY2lmaWMgaW50ZXJmYWNlLiBUaGlzIGV4dGVuZGVkIGludGVyZmFjZQoraXMgdXN1YWxseSBhIHN0cnVjdHVyZSBjb250YWluaW5nIGZ1bmN0aW9uIHBvaW50ZXJzIGFzIHdlbGwgYXMgb3RoZXIga2luZAorb2YgaW5mb3JtYXRpb24gcmVsYXRlZCB0byB0aGUgZHJpdmVyLgorPHA+SXQgaXMgYXNzdW1lZCB0aGF0IGNsaWVudCBhcHBsaWNhdGlvbnMgdGhhdCB3aXNoIHRvIHVzZSB0aGUgZHJpdmVyLXNwZWNpZmljCitleHRlbnNpb25zIGFyZSBhYmxlIHRvIDx0dD4jaW5jbHVkZTwvdHQ+IHRoZSByZWxldmFudCBoZWFkZXIgZmlsZXMgdG8gdW5kZXJzdGFuZAordGhlIGZvcm1hdC1zcGVjaWZpYyBpbnRlcmZhY2Ugc3RydWN0dXJlLjwvYmxvY2txdW90ZT4KKzwvYmxvY2txdW90ZT4KKworPGhyIFdJRFRIPSIxMDAlIj4KKzxoMj4KK1ZJLiBDb25maWd1cmF0aW9uOjwvaDI+CisKKzxibG9ja3F1b3RlPlRoaXMgc2VjdGlvbiByZWxhdGVzIHRvIHRoZSBjb25maWd1cmF0aW9uIG9mIHRoZSBGcmVlVHlwZSBsaWJyYXJ5LgorQnkgY29uZmlndXJhdGlvbiwgd2UgbWVhbiBzZWxlY3Rpb24gb2YgYnVpbGQgb3B0aW9ucyBhcyB3ZWxsIGFzIHRoZSBjaG9pY2UKK29mIGZvbnQgZHJpdmVycyB0byBiZSB1c2VkIGZvciBlYWNoIG5ldyBsaWJyYXJ5IG9iamVjdC4KKzxicj4mbmJzcDsKKzxoMz4KKzEuIENvbmZpZ3VyYXRpb24gZmlsZXMgOjwvaDM+CisKKzxibG9ja3F1b3RlPkEgc2luZ2xlIGZpbGUgaXMgdXNlZCB0byBjb25maWd1cmUgdGhlIEZyZWVUeXBlIGJhc2UgZW5naW5lLgorQXMgaXQgaXMgY29uc2lkZXJlZCBzeXN0ZW0tc3BlY2lmaWMsIGl0IGlzIGxvY2F0ZWQgaW4gdGhlIGFyY2hpdGVjdHVyZQorZGlyZWN0b3JpZXMgb2YgdGhlIGxpYnJhcnksIHVuZGVyIHRoZSBuYW1lICJhcmNoLyZsdDtzeXN0ZW0+L2Z0Y29uZmlnLmgiLgorTm90ZSB0aGF0IHRoZSBzYW1lIGRpcmVjdG9yeSBzaG91bGQgYWxzbyBjb250YWluIGEgcGxhdGZvcm0tc3BlY2lmaWMgaW1wbGVtZW50YXRpb24KK29mICJmdHN5cy5jIi4KKzxwPlRoZSBjb25maWd1cmF0aW9uIGZpbGVzIGlzIGEgc2ltcGxlIEMgaGVhZGVyIHdoaWNoIGlzIGluY2x1ZGVkIGJ5IHRoZQorZW5naW5lJ3Mgc291cmNlcyBkdXJpbmcgY29tcGlsYXRpb24uIEl0IGlzIG5vdCBpbmNsdWRlZCBpbiAiZnJlZXR5cGUuaCIsCithbmQgaGVuY2UgZG9lc24ndCBuZWVkIHRvIGJlIGNvcGllZCB3aGVuIGluc3RhbGxpbmcgdGhlIEZyZWVUeXBlIGhlYWRlcnMKK29uIHlvdXIgc3lzdGVtLgorPHA+SXQgaXMgbWFkZSBvZiBhIHNlcmllcyBvZiAjZGVmaW5lIG9yICN1bmRlZiBzdGF0ZW1lbnRzLCB3aGljaCBhcmUgdXNlZAordG8gc2VsZWN0IG9yIHR1cm4gb2ZmIGEgc3BlY2lmaWMgb3B0aW9uLiBFYWNoIG9wdGlvbiBpcyBkb2N1bWVudGVkIHdpdGgKK2hlYXZ5IGNvbW1lbnRzLCBhbmQgc29tZSBvZiB0aGVtIGFyZSBleHBsYWluZWQgYmVsb3cuPC9ibG9ja3F1b3RlPgorCis8aDM+CisyLiBCdWlsZGluZyBhbmQgTWFrZWZpbGVzIDo8L2gzPgorCis8YmxvY2txdW90ZT5GcmVlVHlwZSAyLjAgaXMgbW9yZSBjb21wbGV4IHRoYW4gaXRzIDEueCByZWxlYXNlLiBJbiBvcmRlcgordG8gZmFjaWxpdGF0ZSBtYWludGVuYW5jZSwgYXMgd2VsbCBhcyBlYXNlIGNvbnNpZGVyYWJseSB0aGUgd3JpdGluZyBvZgorbmV3IGZvbnQgZHJpdmVycywgPGI+PGk+b25seSBHTlUgTWFrZSBpcyBzdXBwb3J0ZWQgd2l0aCBGcmVlVHlwZSAyLjA8L2k+PC9iPi4KK0hvd2V2ZXIsIGl0IGlzIHBvc3NpYmxlIHRvIHVzZSBhbnkgY29tcGlsZXIsIGFzIHdlbGwgYXMgYW55IG9iamVjdCBvciBsaWJyYXJ5CitwcmVmaXggKDx0dD4ubywgLm9iaiwgLmEsIC5saWI8L3R0PiBldGMuLikgd2l0aCB0aGVtLgorPHA+VG8gYnVpbGQgRnJlZVR5cGUgMi4wLCBvbmUgaGFzIHRvIGJlIGluIHRoZSBsaWJyYXJ5IGRpcmVjdG9yeSwgdGhlbgoraW52b2tlIGl0cyBwbGF0Zm9ybS1zcGVjaWZpYyBtYWtlZmlsZS4gRm9yIGEgVW5peCBzeXN0ZW0sIHRoaXMgd291bGQgYmUKKzoKKzxibG9ja3F1b3RlPgorPGJsb2NrcXVvdGU+PHR0PiUgY2QgZnJlZXR5cGUyL2xpYjwvdHQ+Cis8YnI+PHR0PiUgbWFrZSAtZiBhcmNoL3VuaXgvTWFrZWZpbGU8L3R0PgorPHA+d2hlcmUgJzx0dD5tYWtlPC90dD4nIGlzIHJlYWxseSBHTlUgTWFrZSAhPC9ibG9ja3F1b3RlPgorPC9ibG9ja3F1b3RlPgorVGhlIHN5c3RlbS1zcGVjaWZpYyA8dHQ+TWFrZWZpbGU8L3R0PiBsb2NhdGVkIGluICc8dHQ+YXJjaC88aT4mbHQ7c3lzdGVtPjwvaT48L3R0PicKK2lzIGEgdGlueSBmaWxlIHVzZWQgdG8gZGVmaW5lIHNldmVyYWwgdmFyaWFibGVzLiBJdCB0aGVuIGluY2x1ZGVzIHRoZSBmaWxlCis8dHQ+ZnJlZXR5cGUyL2xpYi9NYWtlZmlsZS5saWI8L3R0PiwKK3doaWNoIGNvbnRhaW5zIGFsbCB0aGUgZ29yeSBkZXRhaWxzIGFib3V0IGxpYnJhcnkgY29tcGlsYXRpb24uIFRoZSBzeXN0ZW0tc3BlY2lmaWMKKzx0dD5NYWtlZmlsZTwvdHQ+IGNhbiBiZSB2ZXJ5IGVhc2lseSBtb2RpZmllZCB0byBhY2NvbW9kYXRlIGEgbmV3IGNvbXBpbGVyL3BsYXRmb3JtCisoc2VlIHRoZSBjb21tZW50cyB3aXRoaW4gb25lIG9mIHRoZXNlIGZpbGVzKS4KKzxwPkVhY2ggZm9udCBkcml2ZXIgaXMgbG9jYXRlZCBpbiBhIGRpcmVjdG9yeSBsaWtlICI8dHQ+ZnJlZXR5cGUyL2xpYi9kcml2ZXJzLzxpPiZsdDtmb3JtYXRkaXI+PC9pPjwvdHQ+Ii4KK0ZvciBleGFtcGxlLCB0aGUgVHJ1ZVR5cGUgZHJpdmVyIGlzIGxvY2F0ZWQgaW4gIjx0dD5kcml2ZXJzL3RydWV0eXBlPC90dD4iLgorRWFjaCBkcml2ZXIgZGlyZWN0b3J5IG11c3QgY29udGFpbiBhIDx0dD5NYWtlZmlsZTwvdHQ+IHdoaWNoIHdpbGwgYmUgaW5jbHVkZWQKK2J5IDx0dD5NYWtlZmlsZS5saWI8L3R0Pi4gVGhlIGZvcm1lciBpcyB1c2VkIHRvIGRlZmluZSBhbmQgYnVpbGQgZHJpdmVyCitvYmplY3QgZmlsZXMuCis8YnI+Jm5ic3A7Cis8cD48YnI+Cis8Y2VudGVyPgorPHA+PGltZyBTUkM9ImJ1aWxkX2RpYWdyYW0uZ2lmIiBoZWlnaHQ9Mjg0IHdpZHRoPTU1OT48L2NlbnRlcj4KKzwvYmxvY2txdW90ZT4KKworPGgzPgorMy4gTWFrZSBvcHRpb25zIDo8L2gzPgorCis8YmxvY2txdW90ZT5UaGUgYmFzZSBsYXllciwgYXMgd2VsbCBhcyBlYWNoIGZvbnQgZHJpdmVyLCBhcmUgbWFkZSB1cCBvZgorc2V2ZXJhbCBDIHNvdXJjZXMuIFRyYWRpdGlvbmFsbHksIG9uZSBjb21waWxlcyBlYWNoIHNvdXJjZSAoaS5lLiAnPHR0Pi5jPC90dD4nCitmaWxlKSBpbnRvIGFuIG9iamVjdCAoJzx0dD4ubzwvdHQ+JyBvciAnPHR0Pi5vYmo8L3R0PicpIGZpbGUsIGFuZCBhbGwgb2YKK3RoZW0gYXJlIGdyb3VwZWQgaW50byBhIGxpYnJhcnkgZmlsZSAoaS5lLiAnPHR0Pi5hPC90dD4nIG9yICc8dHQ+LmxpYjwvdHQ+JykuCis8cD5CeSBkZWZhdWx0LCBGcmVlVHlwZSB0YWtlcyBhIHNsaWdodGx5IGRpZmZlcmVudCBhcHByb2FjaCB3aGVuIGl0IGNvbWVzCit0byBjb21waWxpbmcgZWFjaCBwYXJ0IG9mIHRoZSBlbmdpbmUuIFVzdWFsbHksIGEgc2luZ2xlIHRpbnkgc291cmNlIGlzCitjb21waWxlZCwgd2hpY2ggaW5jbHVkZXMgYWxsIG90aGVyIGNvbXBvbmVudCBzb3VyY2VzLiBUaGlzIHJlc3VsdHMgaW4gYQorc2luZ2xlIG9iamVjdCBmaWxlcywgd2l0aCB0aGUgYmVuZWZpdHMgb3IgcmVkdWNlZCBjb2RlIHNpemUsIHVzdWFsbHkgYmV0dGVyCitjb21waWxhdGlvbiBhcyB3ZWxsIGFzIGEgZHJhc3RpYyByZWR1Y3Rpb24gb2YgdGhlIG51bWJlciBvZiBzeW1ib2xzIGV4cG9ydGVkCitieSB0aGUgbGlicmFyeS4gT2YgY291cnNlLCBpdCBpcyBtYWRlIHBvc3NpYmxlIHRocm91Z2ggdGhlIHVzZSBvZiBzcGVjaWZpYworZGVjbGFyYXRpb24gbWFjcm9zIGluIHRoZSBGcmVlVHlwZSBzb3VyY2UgKHNlZSB0aGUgZGVmaW5pdGlvbiBvZiA8dHQ+TE9DQUxfREVGPC90dD4KK2FuZCA8dHQ+TE9DQUxfRlVOQzwvdHQ+IGluIDx0dD5mdGNvbmZpZy5oPC90dD4gZm9yIGRldGFpbHMpLgorPHA+Rm9yIGEgY29uY3JldGUgZXhhbXBsZSwgc2VlIHRoZSBzb3VyY2UgY29kZSBpbiAiPHR0PmJhc2UvZnRiYXNlLmM8L3R0PiIKK3doaWNoIGdlbmVyYXRlcyB0aGUgd2hvbGUgYmFzZSBsYXllciBpbiBhIHNpbmdsZSBvYmplY3QgZmlsZS4gVGhlIHNhbWUKK2J1aWxkIHByb2Nlc3MgaXMgYXBwbGllZCB0byBmb250IGRyaXZlcnMsIGluIG9yZGVyIHRvIGdlbmVyYXRlIG9uZSBzaW5nbGUKK29iamVjdCBmaWxlIHBlciBnaXZlbiBmb250IGZvcm1hdCAoZS5nLiA8dHQ+dHJ1ZXR5cGUubzwvdHQ+LCA8dHQ+dHlwZTEubzwvdHQ+LAorZXRjLi4pLgorPHA+Q29tcGlsaW5nIHRoZSBsaWJyYXJ5IGFuZCBkcml2ZXJzIGluICJub3JtYWwiIG1vZGUgaXMgcG9zc2libGUsIHRocm91Z2gKK3RoZSB1c2Ugb2YgdGhlICc8dHQ+bXVsdGk8L3R0PicgdGFyZ2V0ICh3aGljaCByZWFsbHkgbWVhbnMgJmxhcXVvOyBtdWx0aXBsZQorb2JqZWN0cyAmcmFxdW87KS4gRm9yIGV4YW1wbGUsIGNhbGxpbmcgOgorPGJsb2NrcXVvdGU+PHR0PiUgbWFrZSAtZiBhcmNoL2Fuc2kvTWFrZWZpbGUgbXVsdGk8L3R0PjwvYmxvY2txdW90ZT4KK1dpbGwgYnVpbGQgdGhlIEZyZWVUeXBlIGxpYnJhcnkgYnkgY29tcGlsaW5nIGVhY2ggc291cmNlIGZpbGUgdG8gYW4gaW5kaXZpZHVhbAorb2JqZWN0LCB0aGVuIGxpbmtpbmcgdGhlbSB0b2dldGhlci4gWW91J2xsIG5vdGljZSB0aGF0IHRoZSBsaWJyYXJ5IGlzIHNpZ25pZmljYW50bHkKK2JpZ2dlciBpbiB0aGlzIGNhc2UuIENyZWF0aW5nIGEgc2hhcmVkIGRsbCBmcm9tIGEgJ211bHRpJyBidWlsZCBpcyBjZXJ0YWlubHkKK2EgdmVyeSBwb29yIGlkZWEsIGFzIHRoaXMgd2lsbCBleHBvcnQgYSBodWdlIHF1YW50aXR5IG9mIHN5bWJvbHMgdGhhdCBhcmVuJ3QKK3VzZWZ1bCB0byBhbnkgY2xpZW50IGFwcGxpY2F0aW9uLjwvYmxvY2txdW90ZT4KKworPGgzPgorNC4gQWRkaW5nIGEgZHJpdmVyIGF0IGNvbXBpbGUgdGltZTwvaDM+CisKKzxibG9ja3F1b3RlPkEgZHJpdmVyIGNhbiBiZSBpbmNsdWRlZCB2ZXJ5IGVhc2lseSBpbiB0aGUgYnVpbGQgcHJvY2VzcyBieQoraW5jbHVkaW5nIGl0cyA8dHQ+TWFrZWZpbGU8L3R0PiBpbiA8dHQ+TWFrZWZpbGUubGliPC90dD4uIEZvciBleGFtcGxlLAordGhlIFRydWVUeXBlIGRyaXZlciBpcyBzaW1wbHkgaW5jbHVkZWQgd2l0aCB0aGUgZm9sbG93aW5nIGxpbmVzIChzZWUgPHR0Pk1ha2VmaWxlLmxpYjwvdHQ+KToKKzxibG9ja3F1b3RlPjx0dD4jIFRydWVUeXBlIGRyaXZlciBydWxlczwvdHQ+Cis8YnI+PHR0PiM8L3R0PgorPGJyPjx0dD5pbmNsdWRlICQoRFJJVkVSU19ESVIpL3RydWV0eXBlL01ha2VmaWxlPC90dD48L2Jsb2NrcXVvdGU+CisKKzxwPjxicj5XaGVyZSA8dHQ+RFJJVkVSU19ESVI8L3R0PiByZWFsbHkgaXMgIjx0dD5mcmVldHlwZTIvbGliL2RyaXZlcnM8L3R0PiIsCit0aG91Z2ggdGhpcyBjYW4gYmUgcmVkZWZpbmVkLiBZb3UgY2FuLCBvZiBjb3Vyc2Ugc3BlY2lmeSBhIGRpZmZlcmVudCBwYXRoCitpZiB5b3Ugd2FudCB0byBwbGFjZSB5b3VyIGRyaXZlciBzb3VyY2VzIGluIGFub3RoZXIgbG9jYXRpb24uCis8cD5Ob3RlIHRoYXQgdGhpcyBvbmx5IGFkZHMgdGhlIGRyaXZlcidzIG9iamVjdCBmaWxlcyB0byB0aGUgZ2VuZXJhdGVkCitsaWJyYXJ5IGZpbGUuIEEgZmV3IG1vcmUgc3RlcHMgYXJlIG5lZWRlZCB0byBtYWtlIHlvdXIgPHR0PkZUX0xpYnJhcnk8L3R0Pgorb2JqZWN0cyB1c2UgdGhlIGRyaXZlci4gVGhleSBjb25zaXN0IGluIG1vZGlmeWluZyB0aGUgZmlsZSAiPHR0PmJhc2UvZnRpbml0LmM8L3R0PiIsCit3aG9zZSBzb2xlIHB1cnBvc2UgaXMgdG8gZGVmaW5lIHRoZSBzZXQgb2YgZHJpdmVyIG9iamVjdHMgdGhhdCBhcmUgdG8gYmUKK2NyZWF0ZWQgd2l0aCBlYWNoIG5ldyBsaWJyYXJ5IG9iamVjdC4KKzxicj4mbmJzcDs8L2Jsb2NrcXVvdGU+CisKKzxoMz4KKzUuIEFkZGluZyBhIGRyaXZlciBhdCBydW4gdGltZTwvaDM+CisKKzxibG9ja3F1b3RlPk5ldyBkcml2ZXIgb2JqZWN0cyBjYW4gYmUgYWRkZWQgYXQgcnVuLXRpbWUgdGhyb3VnaCB0aGUgPHR0PkZUX0FkZF9Ecml2ZXI8L3R0PgorQVBJLiBUaGlzIGZ1bmN0aW9uIHRha2VzIGEgaGFuZGxlIHRvIGFuIGV4aXN0aW5nIGxpYnJhcnkgb2JqZWN0LCBhcyB3ZWxsCithcyBhIHBvaW50ZXIgdG8gYSBnaXZlbiBkcml2ZXIgaW50ZXJmYWNlLiBUaGlzIGludGVyZmFjZSBpcyB1c2VkIHRvIGNyZWF0ZQorYSBuZXcgZHJpdmVyIG9iamVjdCBhbmQgcmVnaXN0ZXIgaXQgd2l0aGluIHRoZSBsaWJyYXJ5LgorPHA+U2ltaWxhcmx5LCBhIHNpbmdsZSBkcml2ZXIgY2FuIGJlIHJlbW92ZWQgZnJvbSBhIGxpYnJhcnkgYW55dGltZSB0aHJvdWdoCis8dHQ+RlRfUmVtb3ZlX0RyaXZlcjwvdHQ+LgorVGhpcyB3aWxsIGF1dG9tYXRpY2FsbHkgZGlzY2FyZCB0aGUgcmVzb3VyY2VzIGFuZCBmYWNlIG9iamVjdHMgbWFuYWdlZAorYnkgdGhlIGRyaXZlci48L2Jsb2NrcXVvdGU+CisKKzxoMz4KKzYuIEN1c3RvbSBsaWJyYXJ5IG9iamVjdHMgOjwvaDM+CisKKzxibG9ja3F1b3RlPkZpbmFsbHksIGl0IGlzIHBvc3NpYmxlIHRvIGJ1aWxkIGN1c3RvbSBsaWJyYXJ5IG9iamVjdHMuIFlvdQorbmVlZCB0byBwYXNzIGEgaGFuZGxlIHRvIGEgdmFsaWQgPHR0PkZUX1N5c3RlbTwvdHQ+IG9iamVjdCB0byB0aGUgPHR0PkZUX0J1aWxkX0xpYnJhcnk8L3R0PgorQVBJLiBUaGUgZnVuY3Rpb24gd2lsbCByZXR1cm4gYSBoYW5kbGUgdG8gdGhlIG5ldyBmcmVzaCBsaWJyYXJ5IG9iamVjdC4KK05vdGUgdGhhdCB0aGUgbGlicmFyeSBoYXMgbm8gcmVnaXN0ZXJlZCBkcml2ZXJzIGFmdGVyIHRoZSBjYWxsLCBkZXZlbG9wZXJzCitoYXZlIHRvIGFkZCB0aGVtIGJ5IGhhbmQgd2l0aCA8dHQ+RlRfQWRkX0RyaXZlcjwvdHQ+LgorPHA+SXQgaXMgdGh1cyBwb3NzaWJsZSB0byBjcmVhdGUgdHdvIGRpc3RpbmN0IGxpYnJhcnkgb2JqZWN0cyB3aXRoIGRpc3RpbmN0Cis8dHQ+RlRfU3lzdGVtPC90dD4KK2ltcGxlbWVudGF0aW9ucyBpbiB0aGUgc2FtZSBzZXNzaW9uLCB3aGljaCBjYW4gYmUgdXNlZnVsIGZvciBkZWJ1Z2dpbmcKK3B1cnBvc2UuPC9ibG9ja3F1b3RlPgorCis8YnI+Jm5ic3A7PC9ibG9ja3F1b3RlPgorCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZyZWV0eXBlLmggYi9pbmNsdWRlL2ZyZWV0eXBlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVkYWVjNQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvZnJlZXR5cGUuaApAQCAtMCwwICsxLDIxNTYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGZyZWV0eXBlLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGcmVlVHlwZSBoaWdoLWxldmVsIEFQSSBhbmQgY29tbW9uIHR5cGVzIChzcGVjaWZpY2F0aW9uIG9ubHkpLiAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMTk5Ni0xOTk5IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQgICAgICAgICovCisvKiAgbW9kaWZpZWQgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICAqLworLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KKy8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCisvKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgRlJFRVRZUEVfSAorI2RlZmluZSBGUkVFVFlQRV9ICisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFRoZSBgcmFzdGVyJyBjb21wb25lbnQgZHVwbGljYXRlcyBzb21lIG9mIHRoZSBkZWNsYXJhdGlvbnMgaW4gICAgICAgICAqLworICAvKiBmcmVldHlwZS5oIGZvciBzdGFuZC1hbG9uZSB1c2UgaWYgX0ZSRUVUWVBFXyBpc24ndCBkZWZpbmVkLiAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIF9GUkVFVFlQRV8KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogVGhlIEZSRUVUWVBFX01BSk9SIGFuZCBGUkVFVFlQRV9NSU5PUiBtYWNyb3MgYXJlIHVzZWQgdG8gdmVyc2lvbiB0aGUgICovCisgIC8qIG5ldyBGcmVlVHlwZSBkZXNpZ24sIHdoaWNoIGlzIGFibGUgdG8gaG9zdCBzZXZlcmFsIGtpbmRzIG9mIGZvbnQgICAgICAqLworICAvKiBkcml2ZXJzLiAgSXQgc3RhcnRzIGF0IDIuMC4gIE5vdGUgdGhhdCBlYWNoIGRyaXZlciBoYXMgaXRzIG93biAgICAgICAgKi8KKyAgLyogdmVyc2lvbiBudW1iZXIgKGZvciBleGFtcGxlLCB0aGUgVHJ1ZVR5cGUgZHJpdmVyIGlzIGF0IDEuMiwgYXMgICAgICAgICovCisgIC8qIGRlZmluZWQgYnkgdGhlIG1hY3JvcyBUVF9GUkVFVFlQRV9NQUpPUiBhbmQgVFRfRlJFRVRZUEVfTUlOT1IgaW4gdGhlICAqLworICAvKiBmaWxlIGB0dGxpYi90cnVldHlwZS5oJy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZSRUVUWVBFX01BSk9SIDIKKyNkZWZpbmUgRlJFRVRZUEVfTUlOT1IgMAorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBUbyBtYWtlIGZyZWV0eXBlLmggaW5kZXBlbmRlbnQgZnJvbSBjb25maWd1cmF0aW9uIGZpbGVzIHdlIGNoZWNrICAgICAgKi8KKyAgLyogd2hldGhlciBFWFBPUlRfREVGIGhhcyBiZWVuIGRlZmluZWQgYWxyZWFkeS4gICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBPbiBzb21lIHN5c3RlbXMgYW5kIGNvbXBpbGVycyAoV2luMzIgbW9zdGx5KSwgYW4gZXh0cmEga2V5d29yZCBpcyAgICAgKi8KKyAgLyogbmVjZXNzYXJ5IHRvIGNvbXBpbGUgdGhlIGxpYnJhcnkgYXMgYSBETEwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2lmbmRlZiBFWFBPUlRfREVGCisjZGVmaW5lIEVYUE9SVF9ERUYgIGV4dGVybgorI2VuZGlmCisKKyNpbmNsdWRlIDxmdGVycm9ycy5oPgorI2luY2x1ZGUgPGZ0c3lzdGVtLmg+CisjaW5jbHVkZSA8ZnRpbWFnZS5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKKyAgZXh0ZXJuICJDIiB7CisjZW5kaWYKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0Jvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgdHlwZWRlZiBvZiB1bnNpZ25lZCBjaGFyLCB1c2VkIGZvciBzaW1wbGUgYm9vbGVhbnMuICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiB1bnNpZ25lZCBjaGFyICBGVF9Cb29sOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfRldvcmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSBzaWduZWQgMTYtYml0IGludGVnZXIgdXNlZCB0byBzdG9yZSBhIGRpc3RhbmNlIGluIG9yaWdpbmFsIGZvbnQgICovCisgIC8qICAgIHVuaXRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBzaWduZWQgc2hvcnQgICAgRlRfRldvcmQ7ICAgLyogRGlzdGFuY2UgaW4gRlVuaXRzICovCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9VRldvcmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBbiB1bnNpZ25lZCAxNi1iaXQgaW50ZWdlciB1c2VkIHRvIHN0b3JlIGEgZGlzdGFuY2UgaW4gb3JpZ2luYWwgICAgKi8KKyAgLyogICAgZm9udCB1bml0cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHVuc2lnbmVkIHNob3J0ICBGVF9VRldvcmQ7ICAvKiBVbnNpZ25lZCBkaXN0YW5jZSAqLworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfQ2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSBzaW1wbGUgdHlwZWRlZiBmb3IgdGhlIF9zaWduZWRfIGNoYXIgdHlwZS4gICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHNpZ25lZCBjaGFyICBGVF9DaGFyOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfQnl0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSBzaW1wbGUgdHlwZWRlZiBmb3IgdGhlIF91bnNpZ25lZF8gY2hhciB0eXBlLiAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHVuc2lnbmVkIGNoYXIgIEZUX0J5dGU7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9TdHJpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBIHNpbXBsZSB0eXBlZGVmIGZvciB0aGUgY2hhciB0eXBlLCB1c3VhbGx5IHVzZWQgZm9yIHN0cmluZ3MuICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgY2hhciAgRlRfU3RyaW5nOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfU2hvcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSB0eXBlZGVmIGZvciBzaWduZWQgc2hvcnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHNpZ25lZCBzaG9ydCAgRlRfU2hvcnQ7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9VU2hvcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBIHR5cGVkZWYgZm9yIHVuc2lnbmVkIHNob3J0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgdW5zaWduZWQgc2hvcnQgIEZUX1VTaG9ydDsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0ludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgdHlwZWRlZiBmb3IgdGhlIGludCB0eXBlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBpbnQgIEZUX0ludDsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX1VJbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgdHlwZWRlZiBmb3IgdGhlIHVuc2lnbmVkIGludCB0eXBlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiB1bnNpZ25lZCBpbnQgIEZUX1VJbnQ7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9Mb25nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBIHR5cGVkZWYgZm9yIHNpZ25lZCBsb25nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgc2lnbmVkIGxvbmcgIEZUX0xvbmc7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9VTG9uZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBIHR5cGVkZWYgZm9yIHVuc2lnbmVkIGxvbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgdW5zaWduZWQgbG9uZyAgRlRfVUxvbmc7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9GMkRvdDE0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBIHNpZ25lZCAyLjE0IGZpeGVkIGZsb2F0IHR5cGUgdXNlZCBmb3IgdW5pdCB2ZWN0b3JzLiAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgc2lnbmVkIHNob3J0ICBGVF9GMkRvdDE0OworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfRjI2RG90NiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSBzaWduZWQgMjYuNiBmaXhlZCBmbG9hdCB0eXBlIHVzZWQgZm9yIHZlY3RvcmlhbCBwaXhlbCAgICAgICAgICAgICovCisgIC8qICAgIGNvb3JkaW5hdGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBzaWduZWQgbG9uZyAgRlRfRjI2RG90NjsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0ZpeGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoaXMgdHlwZSBpcyB1c2VkIHRvIHN0b3JlIDE2LjE2IGZpeGVkIGZsb2F0IHZhbHVlcywgbGlrZSBzY2FsZXMgICAqLworICAvKiAgICBvciBtYXRyaXggY29lZmZpY2llbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgc2lnbmVkIGxvbmcgIEZUX0ZpeGVkOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfRXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhlIEZyZWVUeXBlIGVycm9yIGNvZGUgdHlwZS4gIEEgdmFsdWUgb2YgMCBpcyBhbHdheXMgaW50ZXJwcmV0ZWQgICovCisgIC8qICAgIGFzIGEgc3VjY2Vzc2Z1bCBvcGVyYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBpbnQgIEZUX0Vycm9yOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfVW5pdFZlY3RvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSBzaW1wbGUgc3RydWN0dXJlIHVzZWQgdG8gc3RvcmUgYSAyZCB2ZWN0b3IgdW5pdCB2ZWN0b3IuICBVc2VzICAgICovCisgIC8qICAgIEZUX0YyRG90MTQgdHlwZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHggOjogSG9yaXpvbnRhbCBjb29yZGluYXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB5IDo6IFZlcnRpY2FsIGNvb3JkaW5hdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgc3RydWN0ICBGVF9Vbml0VmVjdG9yXworICB7CisgICAgRlRfRjJEb3QxNCAgeDsKKyAgICBGVF9GMkRvdDE0ICB5OworCisgIH0gRlRfVW5pdFZlY3RvcjsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX01hdHJpeCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgc2ltcGxlIHN0cnVjdHVyZSB1c2VkIHRvIHN0b3JlIGEgMngyIG1hdHJpeC4gIENvZWZmaWNpZW50cyBhcmUgICAqLworICAvKiAgICBpbiAxNi4xNiBmaXhlZCBmbG9hdCBmb3JtYXQuICBUaGUgY29tcHV0YXRpb24gcGVyZm9ybWVkIGlzOiAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICB4JyA9IHgqeHggKyB5Knh5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgeScgPSB4Knl4ICsgeSp5eSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHh4IDo6IE1hdHJpeCBjb2VmZmljaWVudC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB4eSA6OiBNYXRyaXggY29lZmZpY2llbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgeXggOjogTWF0cml4IGNvZWZmaWNpZW50LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHl5IDo6IE1hdHJpeCBjb2VmZmljaWVudC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBzdHJ1Y3QgIEZUX01hdHJpeF8KKyAgeworICAgIEZUX0ZpeGVkICB4eCwgeHk7CisgICAgRlRfRml4ZWQgIHl4LCB5eTsKKworICB9IEZUX01hdHJpeDsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0JCb3ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgc3RydWN0dXJlIHVzZWQgdG8gaG9sZCBhbiBvdXRsaW5lJ3MgYm91bmRpbmcgYm94LCBpLmUuLCB0aGUgICAgICAqLworICAvKiAgICBjb29yZGluYXRlcyBvZiBpdHMgZXh0cmVtYSBpbiB0aGUgaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgICAgICAgICAgKi8KKyAgLyogICAgZGlyZWN0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgeE1pbiA6OiBUaGUgaG9yaXpvbnRhbCBtaW5pbXVtIChsZWZ0LW1vc3QpLiAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHlNaW4gOjogVGhlIHZlcnRpY2FsIG1pbmltdW0gKGJvdHRvbS1tb3N0KS4gICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB4TWF4IDo6IFRoZSBob3Jpem9udGFsIG1heGltdW0gKHJpZ2h0LW1vc3QpLiAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgeU1heCA6OiBUaGUgdmVydGljYWwgbWF4aW11bSAodG9wLW1vc3QpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHN0cnVjdCAgRlRfQkJveF8KKyAgeworICAgIEZUX1BvcyAgeE1pbiwgeU1pbjsKKyAgICBGVF9Qb3MgIHhNYXgsIHlNYXg7CisKKyAgfSBGVF9CQm94OworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8TWFjcm8+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfTUFLRV9UQUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhpcyBtYWNybyBjb252ZXJ0cyBmb3VyIGxldHRlciB0YWdzIHdoaWNoIGFyZSB1c2VkIHRvIGxhYmVsICAgICAgICovCisgIC8qICAgIFRydWVUeXBlIHRhYmxlcyBpbnRvIGFuIHVuc2lnbmVkIGxvbmcgdG8gYmUgdXNlZCB3aXRoaW4gRnJlZVR5cGUuICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRlRfTUFLRV9UQUcoIF94MSwgX3gyLCBfeDMsIF94NCApIFwKKyAgICAgICAgICAoKChGVF9VTG9uZylfeDEgPDwgMjQpIHwgICAgICAgIFwKKyAgICAgICAgICAgKChGVF9VTG9uZylfeDIgPDwgMTYpIHwgICAgICAgIFwKKyAgICAgICAgICAgKChGVF9VTG9uZylfeDMgPDwgOCkgIHwgICAgICAgIFwKKyAgICAgICAgICAgIChGVF9VTG9uZylfeDQpCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgTCBJIFMgVCAgIE0gQSBOIEEgRyBFIE0gRSBOIFQgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0xpc3ROb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICBNYW55IGVsZW1lbnRzIGFuZCBvYmplY3RzIGluIEZyZWVUeXBlIGFyZSBsaXN0ZWQgdGhyb3VnaCBhICAgICAgICAqLworICAvKiAgICAgRlRfTGlzdCByZWNvcmQgKHNlZSBGVF9MaXN0UmVjKS4gIEFzIGl0cyBuYW1lIHN1Z2dlc3RzLCBhICAgICAgICAgKi8KKyAgLyogICAgIEZUX0xpc3ROb2RlIGlzIGEgaGFuZGxlIHRvIGEgc2luZ2xlIGxpc3QgZWxlbWVudC4gICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHN0cnVjdCBGVF9MaXN0Tm9kZVJlY18qICBGVF9MaXN0Tm9kZTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0xpc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgaGFuZGxlIHRvIGEgbGlzdCByZWNvcmQgKHNlZSBGVF9MaXN0UmVjKS4gICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBzdHJ1Y3QgRlRfTGlzdFJlY18qICBGVF9MaXN0OworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfTGlzdE5vZGVSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSBzdHJ1Y3R1cmUgdXNlZCB0byBob2xkIGEgc2luZ2xlIGxpc3QgZWxlbWVudC4gICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgcHJldiA6OiBQcmV2aW91cyBlbGVtZW50IGluIHRoZSBsaXN0LiAgTlVMTCBpZiBmaXJzdC4gICAgICAgICAgICAgICovCisgIC8qICAgIG5leHQgOjogTmV4dCBlbGVtZW50IGluIHRoZSBsaXN0LiAgTlVMTCBpZiBsYXN0LiAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBkYXRhIDo6IFR5cGVsZXNzIHBvaW50ZXIgdG8gdGhlIGxpc3RlZCBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgc3RydWN0ICBGVF9MaXN0Tm9kZVJlY18KKyAgeworICAgIEZUX0xpc3ROb2RlICBwcmV2OworICAgIEZUX0xpc3ROb2RlICBuZXh0OworICAgIHZvaWQqICAgICAgICBkYXRhOworCisgIH0gRlRfTGlzdE5vZGVSZWM7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9MaXN0UmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBIHN0cnVjdHVyZSB1c2VkIHRvIGhvbGQgYSBzaW1wbGUgZG91Ymx5LWxpbmtlZCBsaXN0LiAgVGhlc2UgYXJlICAgKi8KKyAgLyogICAgdXNlZCBpbiBtYW55IHBhcnRzIG9mIEZyZWVUeXBlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgaGVhZCA6OiBIZWFkIChmaXJzdCBlbGVtZW50KSBvZiBkb3VibHktbGlua2VkIGxpc3QuICAgICAgICAgICAgICAgICovCisgIC8qICAgIHRhaWwgOjogVGFpbCAobGFzdCBlbGVtZW50KSBvZiBkb3VibHktbGlua2VkIGxpc3QuICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBzdHJ1Y3QgIEZUX0xpc3RSZWNfCisgIHsKKyAgICBGVF9MaXN0Tm9kZSAgaGVhZDsKKyAgICBGVF9MaXN0Tm9kZSAgdGFpbDsKKworICB9IEZUX0xpc3RSZWM7CisKKworI2RlZmluZSBGVF9JU19FTVBUWShsaXN0KSAgKCAobGlzdCkuaGVhZCA9PSAwICkKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgQiBBIFMgSSBDICAgVCBZIFAgRSBTICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfR2x5cGhfTWV0cmljcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSBzdHJ1Y3R1cmUgdXNlZCB0byBtb2RlbCB0aGUgbWV0cmljcyBvZiBhIHNpbmdsZSBnbHlwaC4gIE5vdGUgICAgICovCisgIC8qICAgIHRoYXQgdmFsdWVzIGFyZSBleHByZXNzZWQgaW4gMjYuNiBmcmFjdGlvbmFsIHBpeGVsIGZvcm1hdCBvciBpbiAgICAqLworICAvKiAgICBmb250IHVuaXRzLCBkZXBlbmRpbmcgb24gY29udGV4dC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB3aWR0aCAgICAgICAgOjogVGhlIGdseXBoJ3Mgd2lkdGguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgaGVpZ2h0ICAgICAgIDo6IFRoZSBnbHlwaCdzIGhlaWdodC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBob3JpQmVhcmluZ1ggOjogSG9yaXpvbnRhbCBsZWZ0IHNpZGUgYmVhcmluZy4gICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgaG9yaUJlYXJpbmdZIDo6IEhvcml6b250YWwgdG9wIHNpZGUgYmVhcmluZy4gICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGhvcmlBZHZhbmNlICA6OiBIb3Jpem9udGFsIGFkdmFuY2Ugd2lkdGguICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgdmVydEJlYXJpbmdYIDo6IFZlcnRpY2FsIGxlZnQgc2lkZSBiZWFyaW5nLiAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHZlcnRCZWFyaW5nWSA6OiBWZXJ0aWNhbCB0b3Agc2lkZSBiZWFyaW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB2ZXJ0QWR2YW5jZSAgOjogVmVydGljYWwgYWR2YW5jZSBoZWlnaHQuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgc3RydWN0ICBGVF9HbHlwaF9NZXRyaWNzXworICB7CisgICAgRlRfUG9zICB3aWR0aDsgICAgICAgICAvKiBnbHlwaCB3aWR0aCAgKi8KKyAgICBGVF9Qb3MgIGhlaWdodDsgICAgICAgIC8qIGdseXBoIGhlaWdodCAqLworCisgICAgRlRfUG9zICBob3JpQmVhcmluZ1g7ICAvKiBsZWZ0IHNpZGUgYmVhcmluZyBpbiBob3Jpem9udGFsIGxheW91dHMgKi8KKyAgICBGVF9Qb3MgIGhvcmlCZWFyaW5nWTsgIC8qIHRvcCBzaWRlIGJlYXJpbmcgaW4gaG9yaXpvbnRhbCBsYXlvdXRzICAqLworICAgIEZUX1BvcyAgaG9yaUFkdmFuY2U7ICAgLyogYWR2YW5jZSB3aWR0aCBmb3IgaG9yaXpvbnRhbCBsYXlvdXQgICAgICovCisKKyAgICBGVF9Qb3MgIHZlcnRCZWFyaW5nWDsgIC8qIGxlZnQgc2lkZSBiZWFyaW5nIGluIHZlcnRpY2FsIGxheW91dHMgKi8KKyAgICBGVF9Qb3MgIHZlcnRCZWFyaW5nWTsgIC8qIHRvcCBzaWRlIGJlYXJpbmcgaW4gdmVydGljYWwgbGF5b3V0cyAgKi8KKyAgICBGVF9Qb3MgIHZlcnRBZHZhbmNlOyAgIC8qIGFkdmFuY2UgaGVpZ2h0IGZvciB2ZXJ0aWNhbCBsYXlvdXQgICAgKi8KKworICB9IEZUX0dseXBoX01ldHJpY3M7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9HZW5lcmljX0ZpbmFsaXplciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBEZXNjcmliZXMgYSBmdW5jdGlvbiB1c2VkIHRvIGRlc3Ryb3kgdGhlIGBjbGllbnQnIGRhdGEgb2YgYW55ICAgICAgKi8KKyAgLyogICAgRnJlZVR5cGUgb2JqZWN0LiAgU2VlIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgRlRfR2VuZXJpYyB0eXBlIGZvciAgICovCisgIC8qICAgIGRldGFpbHMgb2YgdXNhZ2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoZSBhZGRyZXNzIG9mIHRoZSBGcmVlVHlwZSBvYmplY3Qgd2hpY2ggaXMgdW5kZXIgZmluYWxpc2F0aW9uLiAgICAqLworICAvKiAgICBJdHMgY2xpZW50IGRhdGEgaXMgYWNjZXNzZWQgdGhyb3VnaCBpdHMgYGdlbmVyaWMnIGZpZWxkLiAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgdm9pZCAgKCpGVF9HZW5lcmljX0ZpbmFsaXplcikodm9pZCogIG9iamVjdCk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9HZW5lcmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBDbGllbnQgYXBwbGljYXRpb25zIG9mdGVuIG5lZWQgdG8gYXNzb2NpYXRlIHRoZWlyIG93biBkYXRhIHRvIGEgICAgKi8KKyAgLyogICAgdmFyaWV0eSBvZiBGcmVlVHlwZSBjb3JlIG9iamVjdHMuICBGb3IgZXhhbXBsZSwgYSB0ZXh0IGxheW91dCBBUEkgICovCisgIC8qICAgIG1pZ2h0IHdhbnQgdG8gYXNzb2NpYXRlIGEgZ2x5cGggY2FjaGUgdG8gYSBnaXZlbiBzaXplIG9iamVjdC4gICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgTW9zdCBGcmVlVHlwZSBvYmplY3QgY29udGFpbnMgYSBgZ2VuZXJpYycgZmllbGQsIG9mIHR5cGUgICAgICAgICAgICovCisgIC8qICAgIEZUX0dlbmVyaWMsIHdoaWNoIHVzYWdlIGlzIGxlZnQgdG8gY2xpZW50IGFwcGxpY2F0aW9ucyBhbmQgZm9udCAgICAqLworICAvKiAgICBzZXJ2ZXJzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEl0IGNhbiBiZSB1c2VkIHRvIHN0b3JlIGEgcG9pbnRlciB0byBjbGllbnQtc3BlY2lmaWMgZGF0YSwgYXMgd2VsbCAqLworICAvKiAgICBhcyB0aGUgYWRkcmVzcyBvZiBhIGBmaW5hbGl6ZXInIGZ1bmN0aW9uLCB3aGljaCB3aWxsIGJlIGNhbGxlZCBieSAgKi8KKyAgLyogICAgRnJlZVR5cGUgd2hlbiB0aGUgb2JqZWN0IGlzIGRlc3Ryb3llZCAoZm9yIGV4YW1wbGUsIHRoZSBwcmV2aW91cyAgICovCisgIC8qICAgIGNsaWVudCBleGFtcGxlIHdvdWxkIHB1dCB0aGUgYWRkcmVzcyBvZiB0aGUgZ2x5cGggY2FjaGUgZGVzdHJ1Y3RvciAqLworICAvKiAgICBpbiB0aGUgYGZpbmFsaXplcicgZmllbGQpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBkYXRhICAgICAgOjogQSB0eXBlbGVzcyBwb2ludGVyIHRvIGFueSBjbGllbnQtc3BlY2lmaWVkIGRhdGEuIFRoaXMgKi8KKyAgLyogICAgICAgICAgICAgICAgIGZpZWxkIGlzIGNvbXBsZXRlbHkgaWdub3JlZCBieSB0aGUgRnJlZVR5cGUgbGlicmFyeS4gICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBmaW5hbGl6ZXIgOjogQSBwb2ludGVyIHRvIGEgYGdlbmVyaWMgZmluYWxpemVyJyBmdW5jdGlvbiwgd2hpY2ggICAgKi8KKyAgLyogICAgICAgICAgICAgICAgIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIG9iamVjdCBpcyBkZXN0cm95ZWQuICBJZiB0aGlzICovCisgIC8qICAgICAgICAgICAgICAgICBmaWVsZCBpcyBzZXQgdG8gTlVMTCwgbm8gY29kZSB3aWxsIGJlIGNhbGxlZC4gICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBzdHJ1Y3QgIEZUX0dlbmVyaWNfCisgIHsKKyAgICB2b2lkKiAgICAgICAgICAgICAgICAgZGF0YTsKKyAgICBGVF9HZW5lcmljX0ZpbmFsaXplciAgZmluYWxpemVyOworCisgIH0gRlRfR2VuZXJpYzsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0JpdG1hcF9TaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEFuIGV4dHJlbWVseSBzaW1wbGUgc3RydWN0dXJlIHVzZWQgdG8gbW9kZWwgdGhlIHNpemUgb2YgYSBiaXRtYXAgICAqLworICAvKiAgICBzdHJpa2UgKGkuZS4sIGEgYml0bWFwIGluc3RhbmNlIG9mIHRoZSBmb250IGZvciBhIGdpdmVuICAgICAgICAgICAgKi8KKyAgLyogICAgcmVzb2x1dGlvbikgaW4gYSBmaXhlZC1zaXplIGZvbnQgZmFjZS4gIFRoaXMgaXMgdXNlZCBmb3IgdGhlICAgICAgICovCisgIC8qICAgIGBhdmFpbGFibGVfc2l6ZXMnIGZpZWxkIG9mIHRoZSBGVF9GYWNlX1Byb3BlcnRpZXMgc3RydWN0dXJlLiAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGhlaWdodCA6OiBUaGUgY2hhcmFjdGVyIGhlaWdodCBpbiBwaXhlbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB3aWR0aCAgOjogVGhlIGNoYXJhY3RlciB3aWR0aCBpbiBwaXhlbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgc3RydWN0ICBGVF9CaXRtYXBfU2l6ZV8KKyAgeworICAgIEZUX1Nob3J0ICBoZWlnaHQ7CisgICAgRlRfU2hvcnQgIHdpZHRoOworCisgIH0gRlRfQml0bWFwX1NpemU7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgIE8gQiBKIEUgQyBUICAgQyBMIEEgUyBTIEUgUyAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9MaWJyYXJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBIGhhbmRsZSB0byBhIEZyZWVUeXBlIGxpYnJhcnkgaW5zdGFuY2UuICBFYWNoIGBsaWJyYXJ5JyBpcyAgICAgICAgKi8KKyAgLyogICAgY29tcGxldGVseSBpbmRlcGVuZGVudCBmcm9tIHRoZSBvdGhlcnM7IGl0IGlzIHRoZSBgcm9vdCcgb2YgYSBzZXQgICovCisgIC8qICAgIG9mIG9iamVjdHMgbGlrZSBmb250cywgZmFjZXMsIHNpemVzLCBldGMuICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgSXQgYWxzbyBlbWJlZHMgYSBzeXN0ZW0gb2JqZWN0IChzZWUgRlRfU3lzdGVtKSwgYXMgd2VsbCBhcyBhICAgICAgICovCisgIC8qICAgIHNjYW4tbGluZSBjb252ZXJ0ZXIgb2JqZWN0IChzZWUgRlRfUmFzdGVyKS4gICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIExpYnJhcnkgb2JqZWN0cyBhcmUgY3JlYXRlZCB0aHJvdWdoIEZUX0luaXRfRnJlZVR5cGUoKS4gICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBzdHJ1Y3QgRlRfTGlicmFyeVJlY18gICpGVF9MaWJyYXJ5OworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfRHJpdmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSBoYW5kbGUgdG8gYSBnaXZlbiBGcmVlVHlwZSBmb250IGRyaXZlciBvYmplY3QuICBFYWNoIGZvbnQgZHJpdmVyICovCisgIC8qICAgIGlzIGFibGUgdG8gY3JlYXRlIGZhY2VzLCBzaXplcywgZ2x5cGggc2xvdHMsIGFuZCBjaGFybWFwcyBmcm9tIHRoZSAqLworICAvKiAgICByZXNvdXJjZXMgd2hvc2UgZm9ybWF0IGl0IHN1cHBvcnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgZHJpdmVyIGNhbiBzdXBwb3J0IGVpdGhlciBiaXRtYXAsIGdyYXltYXAsIG9yIHNjYWxhYmxlIGZvbnQgICAgICAqLworICAvKiAgICBmb3JtYXRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgc3RydWN0IEZUX0RyaXZlclJlY18qICBGVF9Ecml2ZXI7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9GYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBIGhhbmRsZSB0byBhIGdpdmVuIGRyaXZlciBmYWNlIG9iamVjdC4gIEEgZmFjZSBvYmplY3QgY29udGFpbnMgICAgKi8KKyAgLyogICAgYWxsIHRoZSBpbnN0YW5jZSBhbmQgZ2x5cGggaW5kZXBlbmRlbnQgZGF0YSBvZiBhIGZvbnQgZmlsZSAgICAgICAgICovCisgIC8qICAgIHR5cGVmYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSBmYWNlIG9iamVjdCBpcyBjcmVhdGVkIGZyb20gYSByZXNvdXJjZSBvYmplY3QgdGhyb3VnaCB0aGUgICAgICAgICovCisgIC8qICAgIG5ld19mYWNlKCkgbWV0aG9kIG9mIGEgZ2l2ZW4gZHJpdmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBzdHJ1Y3QgRlRfRmFjZVJlY18qICBGVF9GYWNlOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSBoYW5kbGUgdG8gYSBnaXZlbiBkcml2ZXIgc2l6ZSBvYmplY3QuICBTdWNoIGFuIG9iamVjdCBtb2RlbHMgdGhlICovCisgIC8qICAgIF9yZXNvbHV0aW9uXyBBTkQgX3NpemVfIGRlcGVuZGVudCBzdGF0ZSBvZiBhIGdpdmVuIGRyaXZlciBmYWNlICAgICAqLworICAvKiAgICBzaXplLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgc2l6ZSBvYmplY3QgaXMgYWx3YXlzIGNyZWF0ZWQgZnJvbSBhIGdpdmVuIGZhY2Ugb2JqZWN0LiAgSXQgaXMgICAqLworICAvKiAgICBkaXNjYXJkZWQgYXV0b21hdGljYWxseSBieSBpdHMgcGFyZW50IGZhY2UuICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgc3RydWN0IEZUX1NpemVSZWNfKiAgRlRfU2l6ZTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0dseXBoU2xvdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgaGFuZGxlIHRvIGEgZ2l2ZW4gYGdseXBoIHNsb3QnLiAgQSBzbG90IGlzIGEgY29udGFpbmVyIHdoZXJlIGl0ICAqLworICAvKiAgICBpcyBwb3NzaWJsZSB0byBsb2FkIGFueSBvZiB0aGUgZ2x5cGhzIGNvbnRhaW5lZCB3aXRoaW4gaXRzIHBhcmVudCAgKi8KKyAgLyogICAgZmFjZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBIGdseXBoIHNsb3QgaXMgY3JlYXRlZCBmcm9tIGEgZ2l2ZW4gZmFjZSBvYmplY3QuICBJdCBpcyBkaXNjYXJkZWQgKi8KKyAgLyogICAgYXV0b21hdGljYWxseSBieSBpdHMgcGFyZW50IGZhY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHN0cnVjdCBGVF9HbHlwaFNsb3RSZWNfKiAgRlRfR2x5cGhTbG90OworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfQ2hhck1hcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSBoYW5kbGUgdG8gYSBnaXZlbiBjaGFyYWN0ZXIgbWFwLiAgQSBjaGFybWFwIGlzIHVzZWQgdG8gdHJhbnNsYXRlICovCisgIC8qICAgIGNoYXJhY3RlciBjb2RlcyBpbiBhIGdpdmVuIGVuY29kaW5nIGludG8gZ2x5cGggaW5kZXhlcyBmb3IgaXRzICAgICAqLworICAvKiAgICBwYXJlbnQncyBmYWNlLiAgU29tZSBmb250IGZvcm1hdHMgbWF5IHByb3ZpZGUgc2V2ZXJhbCBjaGFybWFwcyBwZXIgKi8KKyAgLyogICAgZm9udC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBIGNoYXJtYXAgaXMgY3JlYXRlZCBmcm9tIGEgZ2l2ZW4gZmFjZSBvYmplY3QuICBJdCBpcyBkaXNjYXJkZWQgICAgKi8KKyAgLyogICAgYXV0b21hdGljYWxseSBieSBpdHMgcGFyZW50IGZhY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHN0cnVjdCBGVF9DaGFyTWFwUmVjXyogIEZUX0NoYXJNYXA7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxFbnVtPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9FbmNvZGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBbiBlbnVtZXJhdGlvbiB1c2VkIHRvIHNwZWNpZnkgZW5jb2RpbmdzIHN1cHBvcnRlZCBieSBjaGFybWFwcy4gICAgKi8KKyAgLyogICAgVXNlZCBpbiB0aGUgRlRfU2VsZWN0X0NoYXJNYXAoKSBBUEkgZnVuY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQmVjYXVzZSBvZiAzMi1iaXQgY2hhcmNvZGVzIGRlZmluZWQgaW4gVW5pY29kZSAoaS5lLiwgc3Vycm9nYXRlcyksICovCisgIC8qICAgIGFsbCBjaGFyYWN0ZXIgY29kZXMgbXVzdCBiZSBleHByZXNzZWQgYXMgRlRfTG9uZ3MuICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBlbnVtICBGVF9FbmNvZGluZ18KKyAgeworICAgIGZ0X2VuY29kaW5nX25vbmUgICAgPSAwLAorICAgIGZ0X2VuY29kaW5nX3N5bWJvbCAgPSAwLAorICAgIGZ0X2VuY29kaW5nX3VuaWNvZGUgPSBGVF9NQUtFX1RBRygndScsJ24nLCdpJywnYycpLAorICAgIGZ0X2VuY29kaW5nX2xhdGluXzIgPSBGVF9NQUtFX1RBRygnbCcsJ2EnLCd0JywnMicpLAorICAgIGZ0X2VuY29kaW5nX3NqaXMgICAgPSBGVF9NQUtFX1RBRygncycsJ2onLCdpJywncycpLAorICAgIGZ0X2VuY29kaW5nX2JpZzUgICAgPSBGVF9NQUtFX1RBRygnYicsJ2knLCdnJywnNScpLAorCisgICAgZnRfZW5jb2RpbmdfYWRvYmVfc3RhbmRhcmQgPSBGVF9NQUtFX1RBRygnYScsJ2QnLCdvJywnYicpLAorICAgIGZ0X2VuY29kaW5nX2Fkb2JlX2V4cGVydCAgID0gRlRfTUFLRV9UQUcoJ2EnLCdkJywnYicsJ2UnKSwgICAgCisKKyAgICBmdF9lbmNvZGluZ19hcHBsZV9yb21hbiAgICA9IEZUX01BS0VfVEFHKCdhJywncicsJ20nLCduJykKKworICAgIC8qIG90aGVyIGVuY29kaW5ncyBtaWdodCBiZSBkZWZpbmVkIGluIHRoZSBmdXR1cmUgKi8KKworICB9IEZUX0VuY29kaW5nOworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0NoYXJNYXBSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoZSBiYXNlIGNoYXJtYXAgY2xhc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZhY2UgICAgICAgIDo6IEEgaGFuZGxlIHRvIHRoZSBwYXJlbnQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZmxhZ3MgICAgICAgOjogQSBzZXQgb2YgYml0IGZsYWdzIHVzZWQgdG8gZGVzY3JpYmUgdGhlIGNoYXJtYXAuICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgIEVhY2ggYml0IGluZGljYXRlcyB0aGF0IGEgZ2l2ZW4gZW5jb2RpbmcgaXMgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICBzdXBwb3J0ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHBsYXRmb3JtX2lkIDo6IEFuIElEIG51bWJlciBkZXNjcmliaW5nIHRoZSBwbGF0Zm9ybSBmb3IgdGhlICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICBmb2xsb3dpbmcgZW5jb2RpbmcgSUQuICBUaGlzIGNvbWVzIGRpcmVjdGx5IGZyb20gICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgdGhlIFRydWVUeXBlIHNwZWNpZmljYXRpb24gYW5kIHNob3VsZCBiZSBlbXVsYXRlZCAgICovCisgIC8qICAgICAgICAgICAgICAgICAgIGZvciBvdGhlciBmb3JtYXRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZW5jb2RpbmdfaWQgOjogQSBwbGF0Zm9ybSBzcGVjaWZpYyBlbmNvZGluZyBudW1iZXIuICBUaGlzIGFsc28gICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgIGNvbWVzIGZyb20gdGhlIFRydWVUeXBlIHNwZWNpZmljYXRpb24gYW5kIHNob3VsZCBiZSAqLworICAvKiAgICAgICAgICAgICAgICAgICBlbXVsYXRlZCBzaW1pbGFybHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBXZSBTVFJPTkdMWSByZWNvbW1tZW5kIGVtdWxhdGluZyBhIFVuaWNvZGUgY2hhcm1hcCBmb3IgZHJpdmVycyAgICAgKi8KKyAgLyogICAgdGhhdCBkbyBub3Qgc3VwcG9ydCBUcnVlVHlwZSBvciBPcGVuVHlwZS4gICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHN0cnVjdCAgRlRfQ2hhck1hcFJlY18KKyAgeworICAgIEZUX0ZhY2UgICAgICBmYWNlOworICAgIEZUX0VuY29kaW5nICBlbmNvZGluZzsKKyAgICBGVF9VU2hvcnQgICAgcGxhdGZvcm1faWQ7CisgICAgRlRfVVNob3J0ICAgIGVuY29kaW5nX2lkOworCisgIH0gRlRfQ2hhck1hcFJlYzsKKworCisKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICBCIEEgUyBFICAgTyBCIEogRSBDIFQgICBDIEwgQSBTIFMgRSBTICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICBGcmVlVHlwZSBiYXNlIGZhY2UgY2xhc3MgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0ZhY2VSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZyZWVUeXBlIHJvb3QgZmFjZSBjbGFzcyBzdHJ1Y3R1cmUuICBBIGZhY2Ugb2JqZWN0IG1vZGVscyB0aGUgICAgICAqLworICAvKiAgICByZXNvbHV0aW9uIGFuZCBwb2ludC1zaXplIGluZGVwZW5kZW50IGRhdGEgZm91bmQgaW4gYSBmb250IGZpbGUuICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBkcml2ZXIgICAgICAgICAgICAgIDo6IEEgaGFuZGxlIHRvIHRoZSBmYWNlJ3MgcGFyZW50IGRyaXZlciAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBtZW1vcnkgICAgICAgICAgICAgIDo6IEEgaGFuZGxlIHRvIHRoZSBmYWNlJ3MgcGFyZW50IG1lbW9yeSAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3QuICBVc2VkIGZvciB0aGUgYWxsb2NhdGlvbiBvZiAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vic2VxdWVudCBvYmplY3RzLiAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgc3RyZWFtICAgICAgICAgICAgICA6OiBBIGhhbmRsZSB0byB0aGUgZmFjZSdzIHN0cmVhbS4gICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBudW1fZmFjZXMgICAgICAgICAgIDo6IEluIHRoZSBjYXNlIHdoZXJlIHRoZSBmYWNlIGlzIGxvY2F0ZWQgaW4gYSAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xsZWN0aW9uIChpLmUuLCBhIHJlc291cmNlIHdoaWNoIGVtYmVkcyAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V2ZXJhbCBmYWNlcyksIHRoaXMgaXMgdGhlIHRvdGFsIG51bWJlciBvZiAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2VzIGZvdW5kIGluIHRoZSByZXNvdXJjZS4gIDEgYnkgZGVmYXVsdC4gKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZhY2VfaW5kZXggICAgICAgICAgOjogVGhlIGluZGV4IG9mIHRoZSBmYWNlIGluIGl0cyByZXNvdXJjZS4gICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzdWFsbHksIHRoaXMgaXMgMCBmb3IgYWxsIG5vcm1hbCBmb250ICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXRzLiAgSXQgY2FuIGJlIG1vcmUgaW4gdGhlIGNhc2Ugb2YgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGVjdGlvbnMgKHdoaWNoIGVtYmVkIHNldmVyYWwgZm9udHMgaW4gYSAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbmdsZSByZXNvdXJjZS9maWxlKS4gICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGdlbmVyaWMgICAgICAgICAgICAgOjogQSBmaWVsZCByZXNlcnZlZCBmb3IgY2xpZW50IHVzZXMuICBTZWUgdGhlICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0dlbmVyaWMgdHlwZSBkZXNjcmlwdGlvbi4gICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGdseXBoICAgICAgICAgICAgICAgOjogVGhlIGZhY2UncyBhc3NvY2lhdGVkIGdseXBoIHNsb3QocykuICBUaGlzICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdCBpcyBjcmVhdGVkIGF1dG9tYXRpY2FsbHkgd2l0aCBhIG5ldyAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlIG9iamVjdC4gIEhvd2V2ZXIsIGNlcnRhaW4ga2luZHMgb2YgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb25zIChtYWlubHkgdG9vbHMgbGlrZSBjb252ZXJ0ZXJzKSAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbiBuZWVkIG1vcmUgdGhhbiBvbmUgc2xvdCB0byBlYXNlIHRoZWlyICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzaXplc19saXN0ICAgICAgICAgIDo6IFRoZSBsaXN0IG9mIGNoaWxkIHNpemVzIGZvciB0aGlzIGZhY2UuICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZhY2VfZmxhZ3MgICAgICAgICAgOjogQSBzZXQgb2YgYml0IGZsYWdzIHRoYXQgZ2l2ZSBpbXBvcnRhbnQgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWF0aW9uIGFib3V0IHRoZSBmYWNlOyBzZWUgdGhlICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GQUNFX0ZMQUdfWFhYIG1hY3JvcyBmb3IgZGV0YWlscy4gICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzdHlsZV9mbGFncyAgICAgICAgIDo6IEEgc2V0IG9mIGJpdCBmbGFncyBpbmRpY2F0aW5nIHRoZSBzdHlsZSBvZiAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgZmFjZSAoaS5lLiwgaXRhbGljLCBib2xkLCB1bmRlcmxpbmUsICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgZXRjKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbnVtX2dseXBocyAgICAgICAgICA6OiBUaGUgdG90YWwgbnVtYmVyIG9mIGdseXBocyBpbiB0aGUgZmFjZS4gICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBudW1fY2hhcm1hcHMgICAgICAgIDo6IFRoZSB0b3RhbCBudW1iZXIgb2YgY2hhcmFjdGVyIG1hcHMgaW4gdGhlICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBmYW1pbHlfbmFtZSAgICAgICAgIDo6IFRoZSBmYWNlJ3MgZmFtaWx5IG5hbWUuICBUaGlzIGlzIGFuIEFTQ0lJICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcsIHVzdWFsbHkgaW4gRW5nbGlzaCwgd2hpY2ggZGVzY3JpYmVzICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHR5cGVmYWNlJ3MgZmFtaWx5IChsaWtlIGBUaW1lcyBOZXcgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIFJvbWFuJywgYEJvZG9uaScsIGBHYXJhbW9uZCcsIGV0YykuICBUaGlzICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBhIGxlYXN0IGNvbW1vbiBkZW5vbWluYXRvciB1c2VkIHRvIGxpc3QgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udHMuICBTb21lIGZvcm1hdHMgKFRydWVUeXBlICYgT3BlblR5cGUpICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGUgbG9jYWxpemVkIGFuZCBVbmljb2RlIHZlcnNpb25zIG9mICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIHN0cmluZy4gIEFwcGxpY2F0aW9ucyBzaG91bGQgdXNlIHRoZSAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0IHNwZWNpZmljIGludGVyZmFjZSB0byBhY2Nlc3MgdGhlbS4gICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgc3R5bGVfbmFtZSAgICAgICAgICA6OiBUaGUgZmFjZSdzIHN0eWxlIG5hbWUuICBUaGlzIGlzIGFuIEFTQ0lJICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nLCB1c3VhbGx5IGluIEVuZ2xpc2gsIHdoaWNoIGRlc2NyaWJlcyAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSB0eXBlZmFjZSdzIHN0eWxlIChsaWtlIGBJdGFsaWMnLCAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBgQm9sZCcsIGBDb25kZW5zZWQnLCBldGMpLiAgTm90IGFsbCBmb250ICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0cyBwcm92aWRlIGEgc3R5bGUgbmFtZSwgc28gdGhpcyBmaWVsZCAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIG9wdGlvbmFsLCBhbmQgY2FuIGJlIHNldCB0byBOVUxMLiAgQXMgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgYGZhbWlseV9uYW1lJywgc29tZSBmb3JtYXRzIHByb3ZpZGUgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxpemVkL1VuaWNvZGUgdmVyc2lvbnMgb2YgdGhpcyBzdHJpbmcuICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwcGxpY2F0aW9ucyBzaG91bGQgdXNlIHRoZSBmb3JtYXQgc3BlY2lmaWMgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2UgdG8gYWNjZXNzIHRoZW0uICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBudW1fZml4ZWRfc2l6ZXMgICAgIDo6IFRoZSBudW1iZXIgb2YgZml4ZWQgc2l6ZXMgYXZhaWxhYmxlIGluIHRoaXMgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlLiAgVGhpcyBzaG91bGQgYmUgc2V0IHRvIDAgZm9yIHNjYWxhYmxlICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udHMsIHVubGVzcyBpdHMgcmVzb3VyY2UgaW5jbHVkZXMgYSAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlIHNldCBvZiBnbHlwaHMgKGNhbGxlZCBhIGBzdHJpa2UnKSAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgdGhlIHNwZWNpZmllZCBzaXplLiAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBhdmFpbGFibGVfc2l6ZXMgICAgIDo6IEFuIGFycmF5IG9mIHNpemVzIHNwZWNpZnlpbmcgdGhlIGF2YWlsYWJsZSAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRtYXAvZ3JheW1hcCBzaXplcyB0aGF0IGFyZSBjb250YWluZWQgaW4gICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIGZvbnQgcmVzb3VyY2UuICBTaG91bGQgYmUgc2V0IHRvICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwgaWYgdGhlIGZpZWxkIGBudW1fZml4ZWRfc2l6ZXMnIGlzIHNldCAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICB0byAwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBiYm94ICAgICAgICAgICAgICAgIDo6IFRoZSBmb250IGJvdW5kaW5nIGJveC4gIENvb3JkaW5hdGVzIGFyZSAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzZWQgaW4gZm9udCB1bml0cyAoc2VlIHVuaXRzX3Blcl9FTSkuICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGJveCBpcyBsYXJnZSBlbm91Z2ggdG8gY29udGFpbiBhbnkgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBoIGZyb20gdGhlIGZvbnQuICBUaHVzLCBiYm94LnlNYXggY2FuICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBzZWVuIGFzIHRoZSBgbWF4aW1hbCBhc2NlbmRlcicsICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgYmJveC55TWluIGFzIHRoZSBgbWluaW1hbCBkZXNjZW5kZXInLCBhbmQgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBtYXhpbXVtIGdseXBoIHdpZHRoIGlzIGdpdmVuIGJ5ICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBgYmJveC54TWF4LWJib3gueE1pbicgKG5vdCB0byBiZSBjb25mdXNlZCAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCB0aGUgbWF4aW11bSBfYWR2YW5jZV93aWR0aF8pLiAgT25seSAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGV2YW50IGZvciBzY2FsYWJsZSBmb3JtYXRzLiAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHVuaXRzX3Blcl9FTSAgICAgICAgOjogVGhlIG51bWJlciBvZiBmb250IHVuaXRzIHBlciBFTSBzcXVhcmUgZm9yICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgZmFjZS4gIFRoaXMgaXMgdHlwaWNhbGx5IDIwNDggZm9yICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBUcnVlVHlwZSBmb250cywgMTAwMCBmb3IgVHlwZTEgZm9udHMsIGFuZCAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkIGJlIHNldCB0byB0aGUgKHVucmVhbGlzdGljKSB2YWx1ZSAxICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBmaXhlZC1zaXplcyBmb250cy4gIE9ubHkgcmVsZXZhbnQgZm9yICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsYWJsZSBmb3JtYXRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBhc2NlbmRlciAgICAgICAgICAgIDo6IFRoZSBmYWNlJ3MgYXNjZW5kZXIgaXMgdGhlIHZlcnRpY2FsICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBkaXN0YW5jZSBmcm9tIHRoZSBiYXNlbGluZSB0byB0aGUgdG9wbW9zdCAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnQgb2YgYW55IGdseXBoIGluIHRoZSBmYWNlLiAgVGhpcyAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkJ3MgdmFsdWUgaXMgcG9zaXRpdmUsIGV4cHJlc3NlZCBpbiAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBmb250IHVuaXRzLiAgU29tZSBmb250IGRlc2lnbnMgdXNlIGEgdmFsdWUgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZmVyZW50IGZyb20gYGJib3gueU1heCcuICBPbmx5IHJlbGV2YW50ICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBzY2FsYWJsZSBmb3JtYXRzLiAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGRlc2NlbmRlciAgICAgICAgICAgOjogVGhlIGZhY2UncyBkZXNjZW5kZXIgaXMgdGhlIHZlcnRpY2FsICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3RhbmNlIGZyb20gdGhlIGJhc2VsaW5lIHRvIHRoZSAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBib3R0b21tb3N0IHBvaW50IG9mIGFueSBnbHlwaCBpbiB0aGUgZmFjZS4gICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmaWVsZCdzIHZhbHVlIGlzIHBvc2l0aXZlLCBleHByZXNzZWQgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIGZvbnQgdW5pdHMuICBTb21lIGZvbnQgZGVzaWducyB1c2UgYSAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBkaWZmZXJlbnQgZnJvbSBgLWJib3gueU1pbicuICBPbmx5ICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsZXZhbnQgZm9yIHNjYWxhYmxlIGZvcm1hdHMuICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgaGVpZ2h0ICAgICAgICAgICAgICA6OiBUaGUgZmFjZSdzIGhlaWdodCBpcyB0aGUgdmVydGljYWwgZGlzdGFuY2UgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBvbmUgYmFzZWxpbmUgdG8gdGhlIG5leHQgd2hlbiB3cml0aW5nICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldmVyYWwgbGluZXMgb2YgdGV4dC4gIEl0cyB2YWx1ZSBpcyBhbHdheXMgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGl2ZSwgZXhwcmVzc2VkIGluIGZvbnQgdW5pdHMuICBUaGUgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgY2FuIGJlIGNvbXB1dGVkIGFzICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGBhc2NlbmRlcitkZXNjZW5kZXIrbGluZV9nYXAnIHdoZXJlIHRoZSAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBvZiBgbGluZV9nYXAnIGlzIGFsc28gY2FsbGVkICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgYGV4dGVybmFsIGxlYWRpbmcnLiAgT25seSByZWxldmFudCBmb3IgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxhYmxlIGZvcm1hdHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG1heF9hZHZhbmNlX3dpZHRoICAgOjogVGhlIG1heGltdW0gYWR2YW5jZSB3aWR0aCwgaW4gZm9udCB1bml0cywgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBhbGwgZ2x5cGhzIGluIHRoaXMgZmFjZS4gIFRoaXMgY2FuIGJlICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkIHRvIG1ha2Ugd29yZCB3cmFwcGluZyBjb21wdXRhdGlvbnMgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFzdGVyLiAgT25seSByZWxldmFudCBmb3Igc2NhbGFibGUgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG1heF9hZHZhbmNlX2hlaWdodCAgOjogVGhlIG1heGltdW0gYWR2YW5jZSBoZWlnaHQsIGluIGZvbnQgdW5pdHMsICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBhbGwgZ2x5cGhzIGluIHRoaXMgZmFjZS4gIFRoaXMgaXMgb25seSAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICByZWxldmFudCBmb3IgdmVydGljYWwgbGF5b3V0cywgYW5kIHNob3VsZCAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgc2V0IHRvIHRoZSBgaGVpZ2h0JyBmb3IgZm9udHMgdGhhdCBkbyAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBwcm92aWRlIHZlcnRpY2FsIG1ldHJpY3MuICBPbmx5ICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICByZWxldmFudCBmb3Igc2NhbGFibGUgZm9ybWF0cy4gICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB1bmRlcmxpbmVfcG9zaXRpb24gIDo6IFRoZSBwb3NpdGlvbiwgaW4gZm9udCB1bml0cywgb2YgdGhlICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlcmxpbmUgbGluZSBmb3IgdGhpcyBmYWNlLiAgSXQncyB0aGUgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VudGVyIG9mIHRoZSB1bmRlcmxpbmluZyBzdGVtLiAgT25seSAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGV2YW50IGZvciBzY2FsYWJsZSBmb3JtYXRzLiAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHVuZGVybGluZV90aGlja25lc3MgOjogVGhlIHRoaWNrbmVzcywgaW4gZm9udCB1bml0cywgb2YgdGhlICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVybGluZSBmb3IgdGhpcyBmYWNlLiAgT25seSByZWxldmFudCBmb3IgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsYWJsZSBmb3JtYXRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBtYXhfcG9pbnRzICAgICAgICAgIDo6IFRoZSBtYXhpbXVtIG51bWJlciBvZiBwb2ludHMgdXNlZCB0byBzdG9yZSAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgdmVjdG9yaWFsIG91dGxpbmUgb2YgYW55IGdseXBoIGluIHRoaXMgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZS4gIElmIHRoaXMgdmFsdWUgY2Fubm90IGJlIGtub3duIGluICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkdmFuY2UsIG9yIGlmIHRoZSBmYWNlIGlzbid0IHNjYWxhYmxlLCAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIHNob3VsZCBiZSBzZXQgdG8gMC4gIE9ubHkgcmVsZXZhbnQgZm9yICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGFibGUgZm9ybWF0cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbWF4X2NvbnRvdXJzICAgICAgICA6OiBUaGUgbWF4aW11bSBudW1iZXIgb2YgY29udG91cnMgdXNlZCB0byAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmUgdGhlIHZlY3RvcmlhbCBvdXRsaW5lIG9mIGFueSBnbHlwaCBpbiAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgZmFjZS4gIElmIHRoaXMgdmFsdWUgY2Fubm90IGJlIGtub3duICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBhZHZhbmNlLCBvciBpZiB0aGUgZmFjZSBpc24ndCBzY2FsYWJsZSwgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBzaG91bGQgYmUgc2V0IHRvIDAuICBPbmx5IHJlbGV2YW50IGZvciAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxhYmxlIGZvcm1hdHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgc3RydWN0ICBGVF9GYWNlUmVjXworICB7CisgICAgRlRfRHJpdmVyICAgICAgICBkcml2ZXI7CisgICAgRlRfTWVtb3J5ICAgICAgICBtZW1vcnk7CisgICAgRlRfU3RyZWFtICAgICAgICBzdHJlYW07CisKKyAgICBGVF9Mb25nICAgICAgICAgIG51bV9mYWNlczsKKyAgICBGVF9Mb25nICAgICAgICAgIGZhY2VfaW5kZXg7CisKKyAgICAvKiBhIGdlbmVyaWMgcG9pbnRlciBmb3IgY2xpZW50IHVzZSAqLworICAgIEZUX0dlbmVyaWMgICAgICAgZ2VuZXJpYzsKKworICAgIC8qIHRoZSBmYWNlJ3MgY3VycmVudCBnbHlwaCBzbG90KHMpICovCisgICAgRlRfR2x5cGhTbG90ICAgICBnbHlwaDsKKworICAgIC8qIHRoZSBmYWNlJ3MgY3VycmVudCBzaXplLCBtYXkgYmUgbmlsICovCisgICAgRlRfU2l6ZSAgICAgICAgICBzaXplOworCisgICAgLyogdGhlIGZhY2UncyBjdXJyZW50IGNoYXJtYXAgKi8KKyAgICBGVF9DaGFyTWFwICAgICAgIGNoYXJtYXA7CisgICAgCisgICAgLyogdGhlIGZhY2UncyB0YWJsZSBvZiBhdmFpbGFibGUgY2hhcm1hcHMgKi8KKyAgICBGVF9JbnQgICAgICAgICAgIG51bV9jaGFybWFwczsKKyAgICBGVF9DaGFyTWFwKiAgICAgIGNoYXJtYXBzOworCisgICAgLyogdGhlIGZhY2UncyBjdXJyZW50IHNpemVzIGxpc3QgKi8KKyAgICBGVF9MaXN0UmVjICAgICAgIHNpemVzX2xpc3Q7CisKKyAgICAvKiBhIHBvaW50ZXIgdG8gdGhlIGZhY2UncyBleHRlbnNpb25zIGJsb2NrLCBpZiBzdXBwb3J0ZWQgKi8KKyAgICB2b2lkKiAgICAgICAgICAgIGV4dGVuc2lvbnM7CisKKyAgICBGVF9Mb25nICAgICAgICAgIGZhY2VfZmxhZ3M7CisgICAgRlRfTG9uZyAgICAgICAgICBzdHlsZV9mbGFnczsKKworICAgIEZUX0xvbmcgICAgICAgICAgbnVtX2dseXBoczsKKworICAgIEZUX1N0cmluZyogICAgICAgZmFtaWx5X25hbWU7CisgICAgRlRfU3RyaW5nKiAgICAgICBzdHlsZV9uYW1lOworCisgICAgRlRfSW50ICAgICAgICAgICBudW1fZml4ZWRfc2l6ZXM7CisgICAgRlRfQml0bWFwX1NpemUqICBhdmFpbGFibGVfc2l6ZXM7CisKKyAgICAvKiB0aGUgZm9sbG93aW5nIGFyZSBvbmx5IHJlbGV2YW50IGZvciBzY2FsYWJsZSBvdXRsaW5lcyAqLworCisgICAgRlRfQkJveCAgICAgICAgICBiYm94OworCisgICAgRlRfVVNob3J0ICAgICAgICB1bml0c19wZXJfRU07CisgICAgRlRfU2hvcnQgICAgICAgICBhc2NlbmRlcjsKKyAgICBGVF9TaG9ydCAgICAgICAgIGRlc2NlbmRlcjsKKyAgICBGVF9TaG9ydCAgICAgICAgIGhlaWdodDsKKworICAgIEZUX1Nob3J0ICAgICAgICAgbWF4X2FkdmFuY2Vfd2lkdGg7CisgICAgRlRfU2hvcnQgICAgICAgICBtYXhfYWR2YW5jZV9oZWlnaHQ7CisKKyAgICBGVF9TaG9ydCAgICAgICAgIHVuZGVybGluZV9wb3NpdGlvbjsKKyAgICBGVF9TaG9ydCAgICAgICAgIHVuZGVybGluZV90aGlja25lc3M7CisKKyAgICBGVF9VU2hvcnQgICAgICAgIG1heF9wb2ludHM7CisgICAgRlRfU2hvcnQgICAgICAgICBtYXhfY29udG91cnM7CisKKyAgfSBGVF9GYWNlUmVjOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8Q29uc3RhbnQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfRkFDRV9GTEFHX1NDQUxBQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSBiaXQtZmllbGQgY29uc3RhbnQsIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCBhIGdpdmVuIGZhY2UgcHJvdmlkZXMgICovCisgIC8qICAgIHZlY3RvcmlhbCBvdXRsaW5lcyAoaS5lLiwgVHJ1ZVR5cGUgb3IgVHlwZTEpLiAgVGhpcyBkb2Vzbid0ICAgICAgICAqLworICAvKiAgICBwcmV2ZW50IGVtYmVkZGluZyBvZiBiaXRtYXAgc3RyaWtlcyB0aG91Z2gsIGkuZS4sIGEgZ2l2ZW4gZmFjZSBjYW4gKi8KKyAgLyogICAgaGF2ZSBib3RoIHRoaXMgYml0IHNldCwgYW5kIGEgYG51bV9maXhlZF9zaXplcycgcHJvcGVydHkgPiAwLiAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBGVF9GQUNFX0ZMQUdfU0NBTEFCTEUgIDEKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPENvbnN0YW50PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0ZBQ0VfRkxBR19GSVhFRF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgYml0LWZpZWxkIGNvbnN0YW50LCB1c2VkIHRvIGluZGljYXRlIHRoYXQgYSBnaXZlbiBmYWNlIGNvbnRhaW5zICAqLworICAvKiAgICBmaXhlZC13aWR0aCBjaGFyYWN0ZXJzIChsaWtlIENvdXJpZXIsIE1vbm9UeXBlLCBldGMpLiAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZUX0ZBQ0VfRkxBR19GSVhFRF9XSURUSCAgNAorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8Q29uc3RhbnQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfRkFDRV9GTEFHX0ZJWEVEX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSBiaXQtZmllbGQgY29uc3RhbnQsIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCBhIGdpdmVuIGZhY2UgY29udGFpbnMgICovCisgIC8qICAgIGBmaXhlZCBzaXplcycsIGkuZS4sIGJpdG1hcCBzdHJpa2VzIGZvciBzb21lIGdpdmVuIHBpeGVsIHNpemVzLiAgICAqLworICAvKiAgICBTZWUgdGhlIGBudW1fZml4ZWRfc2l6ZXMnIGFuZCBgYXZhaWxhYmxlX3NpemVzJyBmYWNlIHByb3BlcnRpZXMgICAgKi8KKyAgLyogICAgZm9yIG1vcmUgaW5mb3JtYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBGVF9GQUNFX0ZMQUdfRklYRURfU0laRVMgIDIKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPENvbnN0YW50PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0ZBQ0VfRkxBR19TRk5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgYml0LWZpZWxkIGNvbnN0YW50LCB1c2VkIHRvIGluZGljYXRlIHRoYXQgYSBnaXZlbiBmYWNlIHVzZXMgdGhlICAqLworICAvKiAgICBgc2ZudCcgc3RvcmFnZSBmb21hdC4gIEZvciBub3csIHRoaXMgbWVhbnMgVHJ1ZVR5cGUgb3IgT3BlblR5cGUuICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZUX0ZBQ0VfRkxBR19TRk5UICA4CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxDb25zdGFudD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9GQUNFX0ZMQUdfSE9SSVpPTlRBTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBIGJpdC1maWVsZCBjb25zdGFudCwgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IGEgZ2l2ZW4gZmFjZSBjb250YWlucyAgKi8KKyAgLyogICAgaG9yaXpvbnRhbCBnbHlwaCBtZXRyaWNzLiAgVGhpcyBzaG91bGQgYmUgc2V0IGZvciBhbGwgY29tbW9uICAgICAgICovCisgIC8qICAgIGZvcm1hdHMsIGJ1dCB3aG8ga25vd3MuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRlRfRkFDRV9GTEFHX0hPUklaT05UQUwgIDB4MTAKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPENvbnN0YW50PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0ZBQ0VfRkxBR19WRVJUSUNBTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgYml0LWZpZWxkIGNvbnN0YW50LCB1c2VkIHRvIGluZGljYXRlIHRoYXQgYSBnaXZlbiBmYWNlIGNvbnRhaW5zICAqLworICAvKiAgICB2ZXJ0aWNhbCBnbHlwaCBtZXRyaWNzLiAgSWYgbm90IHNldCwgdGhlIGdseXBoIGxvYWRlciB3aWxsICAgICAgICAgKi8KKyAgLyogICAgc3ludGhldGl6ZSB2ZXJ0aWNhbCBtZXRyaWNzIGl0c2VsZiB0byBoZWxwIGRpc3BsYXkgdmVydGljYWwgdGV4dCAgICovCisgIC8qICAgIGNvcnJlY3RseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRlRfRkFDRV9GTEFHX1ZFUlRJQ0FMICAweDIwCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxDb25zdGFudD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9GQUNFX0ZMQUdfS0VSTklORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBIGJpdC1maWVsZCBjb25zdGFudCwgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IGEgZ2l2ZW4gZmFjZSBjb250YWlucyAgKi8KKyAgLyogICAga2VybmluZyBpbmZvcm1hdGlvbi4gIFdoZW4gc2V0LCB0aGlzIGluZm9ybWF0aW9uIGNhbiBiZSByZXRyaWV2ZWQgICovCisgIC8qICAgIHRocm91Z2ggdGhlIGZ1bmN0aW9uIEZUX0dldF9LZXJuaW5nKCkuICBOb3RlIHRoYXQgd2hlbiB1bnNldCwgdGhpcyAqLworICAvKiAgICBmdW5jdGlvbiB3aWxsIGFsd2F5cyByZXR1cm4gdGhlIGtlcm5pbmcgdmVjdG9yICgwLDApLiAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZUX0ZBQ0VfRkxBR19LRVJOSU5HICAweDQwCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxDb25zdGFudD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9GQUNFX0ZMQUdfRkFTVF9HTFlQSFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBIGJpdC1maWVsZCBjb25zdGFudCwgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IHRoZSBnbHlwaHMgaW4gYSBnaXZlbiAgKi8KKyAgLyogICAgZm9udCBjYW4gYmUgcmV0cmlldmVkIHZlcnkgcXVpY2tseSwgYW5kIHRoYXQgYSBnbHlwaCBjYWNoZSBpcyB0aHVzICovCisgIC8qICAgIG5vdCBuZWNlc3NhcnkgZm9yIGFueSBvZiBpdHMgY2hpbGQgc2l6ZSBvYmplY3RzLiAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhpcyBmbGFnIHNob3VsZCByZWFsbHkgYmUgc2V0IGZvciBmaXhlZC1zaXplIGZvcm1hdHMgbGlrZSBGTlQsICAgICovCisgIC8qICAgIHdoZXJlIGVhY2ggZ2x5cGggYml0bWFwIGlzIGF2YWlsYWJsZSBkaXJlY3RseSBpbiBiaW5hcnkgZm9ybSAgICAgICAqLworICAvKiAgICB3aXRob3V0IGFueSBraW5kIG9mIGNvbXByZXNzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZUX0ZBQ0VfRkxBR19GQVNUX0dMWVBIUyAgMHg4MAorCisKKyNkZWZpbmUgRlRfSEFTX0hPUklaT05UQUwoZmFjZSkgIChmYWNlLT5mYWNlX2ZsYWdzICYgRlRfRkFDRV9GTEFHX0hPUklaT05UQUwpCisjZGVmaW5lIEZUX0hBU19WRVJUSUNBTChmYWNlKSAgICAoZmFjZS0+ZmFjZV9mbGFncyAmIEZUX0ZBQ0VfRkxBR19WRVJUSUNBTCkKKyNkZWZpbmUgRlRfSEFTX0tFUk5JTkcoZmFjZSkgICAgIChmYWNlLT5mYWNlX2ZsYWdzICYgRlRfRkFDRV9GTEFHX0tFUk5JTkcpCisjZGVmaW5lIEZUX0lTX1NDQUxBQkxFKGZhY2UpICAgICAoZmFjZS0+ZmFjZV9mbGFncyAmIEZUX0ZBQ0VfRkxBR19TQ0FMQUJMRSkKKyNkZWZpbmUgRlRfSVNfU0ZOVChmYWNlKSAgICAgICAgIChmYWNlLT5mYWNlX2ZsYWdzICYgRlRfRkFDRV9GTEFHX1NGTlQpCisjZGVmaW5lIEZUX0lTX0ZJWEVEX1dJRFRIKGZhY2UpICAoZmFjZS0+ZmFjZV9mbGFncyAmIEZUX0ZBQ0VfRkxBR19GSVhFRF9XSURUSCkKKyNkZWZpbmUgRlRfSEFTX0ZJWEVEX1NJWkVTKGZhY2UpIChmYWNlLT5mYWNlX2ZsYWdzICYgRlRfRkFDRV9GTEFHX0ZJWEVEX1NJWkVTKQorI2RlZmluZSBGVF9IQVNfRkFTVF9HTFlQSFMoZmFjZSkgKGZhY2UtPmZhY2VfZmxhZ3MgJiBGVF9GQUNFX0ZMQUdfRkFTVF9HTFlQSFMpCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxDb25zdGFudD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9TVFlMRV9GTEFHX0lUQUxJQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBIGJpdC1maWVsZCBjb25zdGFudCwgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IGEgZ2l2ZW4gZmFjZSBpcyAgICAgICAgKi8KKyAgLyogICAgaXRhbGljaXplZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBGVF9TVFlMRV9GTEFHX0lUQUxJQyAgMQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8Q29uc3RhbnQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfU1RZTEVfRkxBR19CT0xEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSBiaXQtZmllbGQgY29uc3RhbnQsIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCBhIGdpdmVuIGZhY2UgaXMgICAgICAgICovCisgIC8qICAgIGVtYm9sZGVuZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRlRfU1RZTEVfRkxBR19CT0xEICAyCisKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgIEZyZWVUeXBlIGJhc2Ugc2l6ZSBtZXRyaWNzICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfU2l6ZV9NZXRyaWNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhlIHNpemUgbWV0cmljcyBzdHJ1Y3R1cmUgcmV0dXJuZWQgc2NhbGVkIGltcG9ydGFudCBkaXN0YW5jZXMgZm9yICovCisgIC8qICAgIGEgZ2l2ZW4gc2l6ZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHBvaW50U2l6ZSAgICA6OiBUaGUgY3VycmVudCBwb2ludCBzaXplIGluIDI2LjYgcG9pbnRzLCB3aGVyZSAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgMSBwb2ludCBlcXVhbHMgMS83MiBpbmNoLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHhfcHBlbSAgICAgICA6OiBUaGUgY2hhcmFjdGVyIHdpZHRoLCBleHByZXNzZWQgaW4gaW50ZWdlciBwaXhlbHMuICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgVGhpcyBpcyB0aGUgd2lkdGggb2YgdGhlIEVNIHNxdWFyZSBleHByZXNzZWQgaW4gICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgIHBpeGVscywgaGVuY2UgdGhlIHRlcm0gYHBwZW0nIChwaXhlbHMgcGVyIEVNKS4gICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB5X3BwZW0gICAgICAgOjogVGhlIGNoYXJhY3RlciBoZWlnaHQsIGV4cHJlc3NlZCBpbiBpbnRlZ2VyIHBpeGVscy4gKi8KKyAgLyogICAgICAgICAgICAgICAgICAgIFRoaXMgaXMgdGhlIGhlaWdodCBvZiB0aGUgRU0gc3F1YXJlIGV4cHJlc3NlZCBpbiAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICBwaXhlbHMsIGhlbmNlIHRoZSB0ZXJtIGBwcGVtJyAocGl4ZWxzIHBlciBFTSkuICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgeF9zY2FsZSAgICAgIDo6IEEgc2ltcGxlIDE2LjE2IGZpeGVkIHBvaW50IGZvcm1hdCBjb2VmZmljaWVudCB1c2VkICovCisgIC8qICAgICAgICAgICAgICAgICAgICB0byBzY2FsZSBob3Jpem9udGFsIGRpc3RhbmNlcyBleHByZXNzZWQgaW4gZm9udCAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgdW5pdHMgdG8gZnJhY3Rpb25hbCAoMjYuNikgcGl4ZWwgY29vcmRpbmF0ZXMuICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHlfc2NhbGUgICAgICA6OiBBIHNpbXBsZSAxNi4xNiBmaXhlZCBwb2ludCBmb3JtYXQgY29lZmZpY2llbnQgdXNlZCAqLworICAvKiAgICAgICAgICAgICAgICAgICAgdG8gc2NhbGUgdmVydGljYWwgZGlzdGFuY2VzIGV4cHJlc3NlZCBpbiBmb250ICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgIHVuaXRzIHRvIGZyYWN0aW9uYWwgKDI2LjYpIHBpeGVsIGNvb3JkaW5hdGVzLiAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB4X3Jlc29sdXRpb24gOjogVGhlIGhvcml6b250YWwgZGV2aWNlIHJlc29sdXRpb24gZm9yIHRoaXMgc2l6ZSAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgIG9iamVjdCwgZXhwcmVzc2VkIGluIGludGVnZXIgZG90cyBwZXIgaW5jaGVzICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAoZHBpKS4gIEFzIGEgY29udmVudGlvbiwgZml4ZWQgZm9udCBmb3JtYXRzIHNldCAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgdGhpcyB2YWx1ZSB0byA3Mi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHlfcmVzb2x1dGlvbiA6OiBUaGUgdmVydGljYWwgZGV2aWNlIHJlc29sdXRpb24gZm9yIHRoaXMgc2l6ZSAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgb2JqZWN0LCBleHByZXNzZWQgaW4gaW50ZWdlciBkb3RzIHBlciBpbmNoZXMgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgIChkcGkpLiAgQXMgYSBjb252ZW50aW9uLCBmaXhlZCBmb250IGZvcm1hdHMgc2V0ICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICB0aGlzIHZhbHVlIHRvIDcyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgYXNjZW5kZXIgICAgIDo6IFRoZSBhc2NlbmRlciwgZXhwcmVzc2VkIGluIDI2LjYgZml4ZWQgcG9pbnQgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICBwaXhlbHMuICBBbHdheXMgcG9zaXRpdmUuICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZGVzY2VuZGVyICAgIDo6IFRoZSBkZXNjZW5kZXIsIGV4cHJlc3NlZCBpbiAyNi42IGZpeGVkIHBvaW50ICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICBwaXhlbHMuICBBbHdheXMgcG9zaXRpdmUuICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgaGVpZ2h0ICAgICAgIDo6IFRoZSB0ZXh0IGhlaWdodCwgZXhwcmVzc2VkIGluIDI2LjYgZml4ZWQgcG9pbnQgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICBwaXhlbHMuICBBbHdheXMgcG9zaXRpdmUuICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbWF4X2FkdmFuY2UgIDo6IE1heGltdW0gaG9yaXpvbnRhbCBhZHZhbmNlLCBleHByZXNzZWQgaW4gMjYuNiAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICBmaXhlZCBwb2ludCBwaXhlbHMuICBBbHdheXMgcG9zaXRpdmUuICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoaXMgc3RydWN0dXJlIGRvZXNuJ3QgcmV0dXJuIHRoZSB2ZXJ0aWNhbCBhc2NlbmRlciwgZGVzY2VuZGVyLCAgICAqLworICAvKiAgICBhbmQgaGVpZ2h0LCBhcyB3ZWxsIGFzIGEgZmV3IG90aGVyIGVzb3RlcmljIHByb3BlcnRpZXMuICBPbmUgY2FuICAgKi8KKyAgLyogICAgaG93ZXZlciBjb21wdXRlIHRoZXNlIHRocm91Z2ggdGhlIHNpemUncyB4X3NjYWxlIGFuZCB5X3NjYWxlLCAgICAgICovCisgIC8qICAgIGFwcGxpZWQgdG8gdGhlIHJlbGV2YW50IGZhY2UgcHJvcGVydGllcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBzdHJ1Y3QgIEZUX1NpemVfTWV0cmljc18KKyAgeworICAgIEZUX1VTaG9ydCAgIHhfcHBlbTsgICAgICAgIC8qIGhvcml6b250YWwgcGl4ZWxzIHBlciBFTSAgICAgICAgICAgICAgICovCisgICAgRlRfVVNob3J0ICAgeV9wcGVtOyAgICAgICAgLyogdmVydGljYWwgcGl4ZWxzIHBlciBFTSAgICAgICAgICAgICAgICAgKi8KKworICAgIEZUX0ZpeGVkICAgIHhfc2NhbGU7ICAgICAgIC8qIHR3byBzY2FsZXMgdXNlZCB0byBjb252ZXJ0IGZvbnQgdW5pdHMgICovCisgICAgRlRfRml4ZWQgICAgeV9zY2FsZTsgICAgICAgLyogdG8gMjYuNiBmcmFjLiBwaXhlbCBjb29yZGluYXRlcy4uICAgICAgKi8KKworICAgIEZUX1BvcyAgICAgIGFzY2VuZGVyOyAgICAgIC8qIGFzY2VuZGVyIGluIDI2LjYgZnJhYy4gcGl4ZWxzICAgICAgICAgICovCisgICAgRlRfUG9zICAgICAgZGVzY2VuZGVyOyAgICAgLyogZGVzY2VuZGVyIGluIDI2LjYgZnJhYy4gcGl4ZWxzICAgICAgICAgKi8KKyAgICBGVF9Qb3MgICAgICBoZWlnaHQ7ICAgICAgICAvKiB0ZXh0IGhlaWdodCBpbiAyNi42IGZyYWMuIHBpeGVscyAgICAgICAqLworICAgIEZUX1BvcyAgICAgIG1heF9hZHZhbmNlOyAgIC8qIG1heCBob3Jpem9udGFsIGFkdmFuY2UsIGluIDI2LjYgcGl4ZWxzICovCisKKyAgfSBGVF9TaXplX01ldHJpY3M7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICBGcmVlVHlwZSBiYXNlIHNpemUgY2xhc3MgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX1NpemVSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZyZWVUeXBlIHJvb3Qgc2l6ZSBjbGFzcyBzdHJ1Y3R1cmUuICBBIHNpemUgb2JqZWN0IG1vZGVscyB0aGUgICAgICAqLworICAvKiAgICByZXNvbHV0aW9uIGFuZCBwb2ludHNpemUgZGVwZW5kZW50IGRhdGEgb2YgYSBnaXZlbiBmYWNlLiAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBmYWNlICAgIDo6IEhhbmRsZSB0byB0aGUgcGFyZW50IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGdlbmVyaWMgOjogQSB0eXBlbGVzcyBwb2ludGVyLCB3aGljaCBpcyB1bnVzZWQgYnkgdGhlIEZyZWVUeXBlICAgICAqLworICAvKiAgICAgICAgICAgICAgIGxpYnJhcnkgb3IgYW55IG9mIGl0cyBkcml2ZXJzLiAgSXQgY2FuIGJlIHVzZWQgYnkgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICBjbGllbnQgYXBwbGljYXRpb25zIHRvIGxpbmsgdGhlaXIgb3duIGRhdGEgdG8gZWFjaCBzaXplICovCisgIC8qICAgICAgICAgICAgICAgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbWV0cmljcyA6OiBNZXRyaWNzIGZvciB0aGlzIHNpemUgb2JqZWN0LiAgVGhpcyBmaWVsZCBpcyByZWFkLW9ubHkuICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHN0cnVjdCAgRlRfU2l6ZVJlY18KKyAgeworICAgIEZUX0ZhY2UgICAgICAgICAgZmFjZTsgICAgICAvKiBwYXJlbnQgZmFjZSBvYmplY3QgICAgICAgICAgICAgICovCisgICAgRlRfR2VuZXJpYyAgICAgICBnZW5lcmljOyAgIC8qIGdlbmVyaWMgcG9pbnRlciBmb3IgY2xpZW50IHVzZXMgKi8KKyAgICBGVF9TaXplX01ldHJpY3MgIG1ldHJpY3M7ICAgLyogc2l6ZSBtZXRyaWNzICAgICAgICAgICAgICAgICAgICAqLworCisgIH0gRlRfU2l6ZVJlYzsKKworCisKKyAgdHlwZWRlZiBzdHJ1Y3QgRlRfU3ViR2x5cGhfICBGVF9TdWJHbHlwaDsKKyAgCisgIHN0cnVjdCBGVF9TdWJHbHlwaF8KKyAgeworICAgIEZUX0ludCAgICAgICAgaW5kZXg7CisgICAgCisgICAgRlRfQnl0ZSogICAgICBjb250cm9sX2RhdGE7CisgICAgRlRfSW50ICAgICAgICBjb250cm9sX2xlbjsKKyAgICAKKyAgICBGVF9VU2hvcnQgICAgIGZsYWdzOworICAgIAorICAgIEZUX0ludCAgICAgICAgYXJnMTsKKyAgICBGVF9JbnQgICAgICAgIGFyZzI7CisgICAgCisgICAgRlRfTWF0cml4ICAgICB0cmFuc2Zvcm07CisgICAgRlRfU3ViR2x5cGgqICBwYXJlbnQ7CisgIH07CisKKworI2RlZmluZSBGVF9TVUJHTFlQSF9GTEFHX0FSR1NfQVJFX1dPUkRTICAgICAgICAgICAgMQorI2RlZmluZSBGVF9TVUJHTFlQSF9GTEFHX0FSR1NfQVJFX1hZX1ZBTFVFUyAgICAgICAgMgorI2RlZmluZSBGVF9TVUJHTFlQSF9GTEFHX1JPVU5EX1hZX1RPX0dSSUQgICAgICAgICAgNAorI2RlZmluZSBGVF9TVUJHTFlQSF9GTEFHX1NDQUxFICAgICAgICAgICAgICAgICAgICAgOAorI2RlZmluZSBGVF9TVUJHTFlQSF9GTEFHX1hZX1NDQUxFICAgICAgICAgICAgICAgMHg0MAorI2RlZmluZSBGVF9TVUJHTFlQSF9GTEFHXzJYMiAgICAgICAgICAgICAgICAgICAgMHg4MAorI2RlZmluZSBGVF9TVUJHTFlQSF9GTEFHX1VTRV9NWV9NRVRSSUNTICAgICAgICAweDIwMAorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgIEZyZWVUeXBlIEdseXBoIFNsb3QgYmFzZSBjbGFzcyAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9HbHlwaFNsb3RSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGcmVlVHlwZSByb290IGdseXBoIHNsb3QgY2xhc3Mgc3RydWN0dXJlLiBBIGdseXBoIHNsb3QgaXMgYSAgICAgICAgKi8KKyAgLyogICAgY29udGFpbmVyIHdoZXJlIGluZGl2aWR1YWwgZ2x5cGhzIGNhbiBiZSBsb2FkZWQsIGJlIHRoZXkgICAgICAgICAgICovCisgIC8qICAgIHZlY3RvcmlhbCBvciBiaXRtYXAvZ3JheW1hcHMuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZhY2UgICAgIDo6IEEgaGFuZGxlIHRvIHRoZSBwYXJlbnQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbmV4dCAgICAgOjogSW4gc29tZSBjYXNlcyAobGlrZSBzb21lIGZvbnQgdG9vbHMpLCBzZXZlcmFsIGdseXBoICAgICovCisgIC8qICAgICAgICAgICAgICAgIHNsb3RzIHBlciBmYWNlIG9iamVjdCBjYW4gYmUgYSBnb29kIHRoaW5nLiAgQXMgdGhpcyBpcyAqLworICAvKiAgICAgICAgICAgICAgICByYXJlLCB0aGUgZ2x5cGggc2xvdHMgYXJlIGxpc3RlZCB0aHJvdWdoIGEgZGlyZWN0LCAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgc2luZ2xlLWxpbmtlZCBsaXN0IHVzaW5nIGl0cyBgbmV4dCcgZmllbGQuICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBtZXRyaWNzICA6OiBUaGUgbWV0cmljcyBvZiB0aGUgbGFzdCBsb2FkZWQgZ2x5cGggaW4gdGhlIHNsb3QuICBUaGUgKi8KKyAgLyogICAgICAgICAgICAgICAgcmV0dXJuZWQgdmFsdWVzIGRlcGVuZCBvbiB0aGUgbGFzdCBsb2FkIGZsYWdzIChzZWUgdGhlICovCisgIC8qICAgICAgICAgICAgICAgIEZUX0xvYWRfR2x5cGgoKSBBUEkgZnVuY3Rpb24pIGFuZCBjYW4gYmUgZXhwcmVzc2VkICAgICAqLworICAvKiAgICAgICAgICAgICAgICBlaXRoZXIgaW4gMjYuNiBmcmFjdGlvbmFsIHBpeGVscyBvciBmb250IHVuaXRzLiAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG1ldHJpY3MyIDo6IFRoaXMgZmllbGQgY2FuIGJlIHVzZWQgdG8gcmV0dXJuIGFsdGVybmF0ZSBnbHlwaCAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICBtZXRyaWNzIGFmdGVyIGEgc2luZ2xlIGxvYWQuICBJdCBjYW4gY29udGFpbiBlaXRoZXIgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgdGhlIGdseXBoJ3MgbWV0cmljcyBpbiBmb250IHVuaXRzLCBvciB0aGUgc2NhbGVkIGJ1dCAgICovCisgIC8qICAgICAgICAgICAgICAgIHVuaGludGVkIG9uZXMuICBTZWUgdGhlIGxvYWQgZmxhZ3MgdGhhdCBhcHBseSB3aGVuICAgICAqLworICAvKiAgICAgICAgICAgICAgICBjYWxsaW5nIHRoZSBBUEkgZnVuY3Rpb24gRlRfTG9hZF9HbHlwaCgpLiAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGdlbmVyaWMgIDo6IEEgdHlwZWxlc3MgcG9pbnRlciB3aGljaCBpcyB1bnVzZWQgYnkgdGhlIEZyZWVUeXBlICAgICAqLworICAvKiAgICAgICAgICAgICAgICBsaWJyYXJ5IG9yIGFueSBvZiBpdHMgZHJpdmVycy4gIEl0IGNhbiBiZSB1c2VkIGJ5ICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgY2xpZW50IGFwcGxpY2F0aW9ucyB0byBsaW5rIHRoZWlyIG93biBkYXRhIHRvIGVhY2ggICAgICovCisgIC8qICAgICAgICAgICAgICAgIHNpemUgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgb3V0bGluZSAgOjogVGhlIG91dGxpbmUgZGVzY3JpcHRvciBmb3IgdGhlIGN1cnJlbnQgZ2x5cGgsIGlmIGl0ICAgICovCisgIC8qICAgICAgICAgICAgICAgIGlzIGEgdmVjdG9yaWFsIG9uZS4gIFRoZSBuYXR1cmUgb2YgdGhlIGxhc3QgbG9hZGVkICAgICAqLworICAvKiAgICAgICAgICAgICAgICBnbHlwaCBjYW4gYmUgcmV0cmlldmVkIHRocm91Z2ggdGhlIHJlc3VsdCB2YWx1ZSAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgcmV0dXJuZWQgYnkgRlRfTG9hZF9HbHlwaCgpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBiaXRtYXAgICA6OiBUaGUgYml0bWFwL2dyYXltYXAgZGVzY3JpcHRvciBmb3IgdGhlIGN1cnJlbnQgZ2x5cGgsICAgKi8KKyAgLyogICAgICAgICAgICAgICAgaWYgaXQgaXMgYSBmaXhlZC13aWR0aCBvbmUuICBUaGUgbmF0dXJlIG9mIHRoZSBsYXN0ICAgICovCisgIC8qICAgICAgICAgICAgICAgIGxvYWRlZCBnbHlwaCBjYW4gYmUgcmV0cmlldmVkIHRocm91Z2ggdGhlIHJlc3VsdCB2YWx1ZSAqLworICAvKiAgICAgICAgICAgICAgICByZXR1cm5lZCBieSBGVF9Mb2FkX0dseXBoKCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHN0cnVjdCAgRlRfR2x5cGhTbG90UmVjXworICB7CisgICAgRlRfRmFjZSAgICAgICAgICAgZmFjZTsKKyAgICBGVF9HbHlwaFNsb3QgICAgICBuZXh0OworCisgICAgRlRfR2x5cGhfTWV0cmljcyAgbWV0cmljczsKKyAgICBGVF9HbHlwaF9NZXRyaWNzICBtZXRyaWNzMjsKKworICAgIEZUX0dseXBoX1RhZyAgICAgIGZvcm1hdDsKKyAgICBGVF9CaXRtYXAgICAgICAgICBiaXRtYXA7CisgICAgRlRfT3V0bGluZSAgICAgICAgb3V0bGluZTsKKyAgICAKKyAgICBGVF9JbnQgICAgICAgICAgICBudW1fc3ViZ2x5cGhzOworICAgIEZUX0ludCAgICAgICAgICAgIG1heF9zdWJnbHlwaHM7CisgICAgRlRfU3ViR2x5cGgqICAgICAgc3ViZ2x5cGhzOworCisgICAgdm9pZCogICAgICAgICAgICAgY29udHJvbF9kYXRhOworICAgIHZvaWQqICAgICAgICAgICAgIGNvbnRyb2xfbGVuOworCisgICAgdm9pZCogICAgICAgICAgICAgb3RoZXI7CisKKyAgfSBGVF9HbHlwaFNsb3RSZWM7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBGIFUgTiBDIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0luaXRfRnJlZVR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEluaXRpYWxpemVzIGEgbmV3IEZyZWVUeXBlIGxpYnJhcnkgb2JqZWN0LiAgVGhlIHNldCBvZiBkcml2ZXJzICAgICAqLworICAvKiAgICB0aGF0IGFyZSByZWdpc3RlcmVkIGJ5IHRoaXMgZnVuY3Rpb24gaXMgZGV0ZXJtaW5lZCBhdCBidWlsZCB0aW1lLiAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBsaWJyYXJ5IDo6IEEgaGFuZGxlIHRvIGEgbmV3IGxpYnJhcnkgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBFcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEVYUE9SVF9ERUYKKyAgRlRfRXJyb3IgIEZUX0luaXRfRnJlZVR5cGUoIEZUX0xpYnJhcnkqICBsaWJyYXJ5ICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9Eb25lX0ZyZWVUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBEZXN0cm95cyBhIGdpdmVuIEZyZWVUeXBlIGxpYnJhcnkgb2JqZWN0LCBhbmQgYWxsIG9mIGl0cyBjaGlsZHMsICAgKi8KKyAgLyogICAgaW5jbHVkaW5nIHJlc291cmNlcywgZHJpdmVycywgZmFjZXMsIHNpemVzLCBldGMuICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbGlicmFyeSA6OiBBIGhhbmRsZSB0byBhIHRhcmdldCBsaWJyYXJ5IG9iamVjdC4gICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBFWFBPUlRfREVGCisgIEZUX0Vycm9yICBGVF9Eb25lX0ZyZWVUeXBlKCBGVF9MaWJyYXJ5ICBsaWJyYXJ5ICk7CisKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX09wZW5fRmFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIENyZWF0ZXMgYSBuZXcgZmFjZSBvYmplY3QgZnJvbSBhIGdpdmVuIHJlc291cmNlIGFuZCB0eXBlZmFjZSAgICAgICAqLworICAvKiAgICBpbmRleC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICByZXNvdXJjZSAgIDo6IEEgaGFuZGxlIHRvIGEgc291cmNlIHJlc291cmNlLiAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZhY2VfaW5kZXggOjogVGhlIGluZGV4IG9mIHRoZSBmYWNlIHdpdGhpbiB0aGUgcmVzb3VyY2UuICBUaGUgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgIGZpcnN0IGZhY2UgaGFzIGluZGV4IDAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZhY2UgICAgICAgOjogQSBoYW5kbGUgdG8gYSBuZXcgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFVubGlrZSBGcmVlVHlwZSAxLjEsIHRoaXMgZnVuY3Rpb24gYXV0b21hdGljYWxseSBjcmVhdGVzIGEgZ2x5cGggICAqLworICAvKiAgICBzbG90IGZvciB0aGUgZmFjZSBvYmplY3Qgd2hpY2ggY2FuIGJlIGFjY2Vzc2VkIGRpcmVjdGx5IHRocm91Z2ggICAgKi8KKyAgLyogICAgYGZhY2UtPnNsb3QnLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBOb3RlIHRoYXQgYWRkaXRpb25hbCBzbG90cyBjYW4gYmUgYWRkZWQgdG8gZWFjaCBmYWNlIHRocm91Z2ggdGhlICAgKi8KKyAgLyogICAgRlRfTmV3X0dseXBoU2xvdCgpIEFQSSBmdW5jdGlvbi4gIFNsb3RzIGFyZSBsaW5rZWQgaW4gYSBzaW5nbGUgICAgICovCisgIC8qICAgIGxpc3QgdGhyb3VnaCB0aGVpciBgbmV4dCcgZmllbGQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfTmV3X0ZhY2UoKSBjYW4gYmUgdXNlZCB0byBkZXRlcm1pbmUgYW5kL29yIGNoZWNrIHRoZSBmb250ICAgICAgICovCisgIC8qICAgIGZvcm1hdCBvZiBhIGdpdmVuIGZvbnQgcmVzb3VyY2UuICBJZiB0aGUgYGZhY2VfaW5kZXgnIGZpZWxkIGlzICAgICAqLworICAvKiAgICBuZWdhdGl2ZSwgdGhlIGZ1bmN0aW9uIHdpbGwgX25vdF8gcmV0dXJuIGFueSBmYWNlIGhhbmRsZSBpbiAgICAgICAgKi8KKyAgLyogICAgYCpmYWNlJy4gIEl0cyByZXR1cm4gdmFsdWUgc2hvdWxkIGJlIDAgaWYgdGhlIHJlc291cmNlIGlzICAgICAgICAgICovCisgIC8qICAgIHJlY29nbml6ZWQsIG9yIG5vbi16ZXJvIGlmIG5vdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgRVhQT1JUX0RFRgorICBGVF9FcnJvciAgRlRfTmV3X0ZhY2UoIEZUX0xpYnJhcnkgICBsaWJyYXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICBmaWxlcGF0aG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAgIGZhY2VfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRmFjZSogICAgIGZhY2UgKTsKKworCisgIEVYUE9SVF9ERUYKKyAgRlRfRXJyb3IgIEZUX09wZW5fRmFjZSggRlRfTGlicmFyeSAgbGlicmFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICAgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgICBmYWNlX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GYWNlKiAgICBmYWNlICk7CisKKyAgRVhQT1JUX0RFRgorICBGVF9FcnJvciAgRlRfTmV3X01lbW9yeV9GYWNlKCBGVF9MaWJyYXJ5ICBsaWJyYXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICBmaWxlX2Jhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgIGZpbGVfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAgZmFjZV9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRmFjZSAgICAqZmFjZSApOworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0RvbmVfRmFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIERpc2NhcmRzIGEgZ2l2ZW4gZmFjZSBvYmplY3QsIGFzIHdlbGwgYXMgYWxsIG9mIGl0cyBjaGlsZCBzbG90cyAgICAqLworICAvKiAgICBhbmQgc2l6ZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBmYWNlIDo6IEEgaGFuZGxlIHRvIGEgdGFyZ2V0IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBFcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEVYUE9SVF9ERUYKKyAgRlRfRXJyb3IgIEZUX0RvbmVfRmFjZSggRlRfRmFjZSAgZmFjZSApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfTmV3X1NpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQ3JlYXRlcyBhIG5ldyBzaXplIG9iamVjdCBmcm9tIGEgZ2l2ZW4gZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZmFjZSA6OiBBIGhhbmRsZSB0byBhIHBhcmVudCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgc2l6ZSA6OiBBIGhhbmRsZSB0byBhIG5ldyBzaXplIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBFWFBPUlRfREVGCisgIEZUX0Vycm9yICBGVF9OZXdfU2l6ZSggRlRfRmFjZSAgIGZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU2l6ZSogIHNpemUgKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0RvbmVfU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIERpc2NhcmRzIGEgZ2l2ZW4gc2l6ZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHNpemUgOjogQSBoYW5kbGUgdG8gYSB0YXJnZXQgc2l6ZSBvYmplY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgRVhQT1JUX0RFRgorICBGVF9FcnJvciAgRlRfRG9uZV9TaXplKCBGVF9TaXplICBzaXplICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9TZXRfQ2hhcl9TaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBTZXRzIHRoZSBjaGFyYWN0ZXIgZGltZW5zaW9ucyBvZiBhIGdpdmVuIHNpemUgb2JqZWN0LiAgVGhlICAgICAgICAgKi8KKyAgLyogICAgYGNoYXJfc2l6ZScgdmFsdWUgaXMgdXNlZCBmb3IgdGhlIHdpZHRoIGFuZCBoZWlnaHQsIGV4cHJlc3NlZCBpbiAgICovCisgIC8qICAgIDI2LjYgZnJhY3Rpb25hbCBwb2ludHMuICAxIHBvaW50ID0gMS83MiBpbmNoLiAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHNpemUgICAgICA6OiBBIGhhbmRsZSB0byBhIHRhcmdldCBzaXplIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBjaGFyX3NpemUgOjogVGhlIGNoYXJhY3RlciBzaXplLCBpbiAyNi42IGZyYWN0aW9uYWwgcG9pbnRzLiAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBFcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBXaGVuIGRlYWxpbmcgd2l0aCBmaXhlZC1zaXplIGZhY2VzIChpLmUuLCBub24tc2NhbGFibGUgZm9ybWF0cyksICAgKi8KKyAgLyogICAgdXNlIHRoZSBmdW5jdGlvbiBGVF9TZXRfUGl4ZWxfU2l6ZXMoKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBFWFBPUlRfREVGCisgIEZUX0Vycm9yICBGVF9TZXRfQ2hhcl9TaXplKCBGVF9GYWNlICAgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRjI2RG90NiAgY2hhcl93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0YyNkRvdDYgIGNoYXJfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgaG9yel9yZXNvbHV0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgdmVydF9yZXNvbHV0aW9uICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9TZXRfUGl4ZWxfU2l6ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBTZXRzIHRoZSBjaGFyYWN0ZXIgZGltZW5zaW9ucyBvZiBhIGdpdmVuIHNpemUgb2JqZWN0LiAgVGhlIHdpZHRoICAgKi8KKyAgLyogICAgYW5kIGhlaWdodCBhcmUgZXhwcmVzc2VkIGluIGludGVnZXIgcGl4ZWxzLiAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgc2l6ZSAgICAgICAgIDo6IEEgaGFuZGxlIHRvIGEgdGFyZ2V0IHNpemUgb2JqZWN0LiAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHBpeGVsX3dpZHRoICA6OiBUaGUgY2hhcmFjdGVyIHdpZHRoLCBpbiBpbnRlZ2VyIHBpeGVscy4gICAgICAgICAgICAqLworICAvKiAgICBwaXhlbF9oZWlnaHQgOjogVGhlIGNoYXJhY3RlciBoZWlnaHQsIGluIGludGVnZXIgcGl4ZWxzLiAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBFcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEVYUE9SVF9ERUYKKyAgRlRfRXJyb3IgIEZUX1NldF9QaXhlbF9TaXplcyggRlRfRmFjZSAgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgIHBpeGVsX3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgIHBpeGVsX2hlaWdodCApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfTmV3X0dseXBoU2xvdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgSXQgaXMgc29tZXRpbWVzIHVzZWZ1bCB0byBoYXZlIG1vcmUgdGhhbiBvbmUgZ2x5cGggc2xvdCBmb3IgYSAgICAgICovCisgIC8qICAgIGdpdmVuIGZhY2Ugb2JqZWN0LiAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGNyZWF0ZSBhZGRpdGlvbmFsICAgICAqLworICAvKiAgICBzbG90cy4gIEFsbCBvZiB0aGVtIGFyZSBhdXRvbWF0aWNhbGx5IGRpc2NhcmRlZCB3aGVuIHRoZSBmYWNlIGlzICAgKi8KKyAgLyogICAgZGVzdHJveWVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZmFjZSA6OiBBIGhhbmRsZSB0byBhIHBhcmVudCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgc2xvdCA6OiBBIGhhbmRsZSB0byBhIG5ldyBnbHlwaCBzbG90IG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBFWFBPUlRfREVGCisgIEZUX0Vycm9yICBGVF9OZXdfR2x5cGhTbG90KCBGVF9GYWNlICAgICAgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfR2x5cGhTbG90KiAgYXNsb3QgKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0RvbmVfR2x5cGhTbG90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIERlc3Ryb3lzIGEgZ2l2ZW4gZ2x5cGggc2xvdC4gIFJlbWVtYmVyIGhvd2V2ZXIgdGhhdCBhbGwgc2xvdHMgYXJlICAqLworICAvKiAgICBhdXRvbWF0aWNhbGx5IGRlc3Ryb3llZCB3aXRoIGl0cyBwYXJlbnQuICBVc2luZyB0aGlzIGZ1bmN0aW9uIGlzICAgKi8KKyAgLyogICAgbm90IGFsd2F5cyBtYW5kYXRvcnkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgc2xvdCA6OiBBIGhhbmRsZSB0byBhIHRhcmdldCBnbHlwaCBzbG90LiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBFWFBPUlRfREVGCisgIHZvaWQgIEZUX0RvbmVfR2x5cGhTbG90KCBGVF9HbHlwaFNsb3QgIHNsb3QgKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0xvYWRfR2x5cGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgZnVuY3Rpb24gdXNlZCB0byBsb2FkIGEgc2luZ2xlIGdseXBoIHdpdGhpbiBhIGdpdmVuIGdseXBoIHNsb3QsICAqLworICAvKiAgICBmb3IgYSBnaXZlbiBzaXplLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBmYWNlICAgICAgICA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGZhY2Ugb2JqZWN0IHdoZXJlIHRoZSBnbHlwaCAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgd2lsbCBiZSBsb2FkZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBnbHlwaF9pbmRleCA6OiBUaGUgaW5kZXggb2YgdGhlIGdseXBoIGluIHRoZSBmb250IGZpbGUuICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGxvYWRfZmxhZ3MgIDo6IEEgZmxhZyBpbmRpY2F0aW5nIHdoYXQgdG8gbG9hZCBmb3IgdGhpcyBnbHlwaC4gIFRoZSAqLworICAvKiAgICAgICAgICAgICAgICAgICBGVF9MT0FEX1hYWCBjb25zdGFudHMgY2FuIGJlIHVzZWQgdG8gY29udHJvbCB0aGUgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgZ2x5cGggbG9hZGluZyBwcm9jZXNzIChlLmcuLCB3aGV0aGVyIHRoZSBvdXRsaW5lICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgIHNob3VsZCBiZSBzY2FsZWQsIHdoZXRoZXIgdG8gbG9hZCBiaXRtYXBzIG9yIG5vdCwgICAqLworICAvKiAgICAgICAgICAgICAgICAgICB3aGV0aGVyIHRvIGhpbnQgdGhlIG91dGxpbmUsIGV0YykuICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEVYUE9SVF9ERUYKKyAgRlRfRXJyb3IgIEZUX0xvYWRfR2x5cGgoIEZUX0ZhY2UgIGZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICBnbHlwaF9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgIGxvYWRfZmxhZ3MgKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0xvYWRfQ2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgZnVuY3Rpb24gdXNlZCB0byBsb2FkIGEgc2luZ2xlIGdseXBoIHdpdGhpbiBhIGdpdmVuIGdseXBoIHNsb3QsICAqLworICAvKiAgICBmb3IgYSBnaXZlbiBzaXplLCBhY2NvcmRpbmcgdG8gaXRzIGNoYXJhY3RlciBjb2RlICEgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBmYWNlICAgICAgICA6OiBBIGhhbmRsZSB0byBhIHRhcmdldCBmYWNlIG9iamVjdCB3aGVyZSB0aGUgZ2x5cGggICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgd2lsbCBiZSBsb2FkZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBjaGFyX2NvZGUgICA6OiBUaGUgZ2x5cGgncyBjaGFyYWN0ZXIgY29kZSwgYWNjb3JkaW5nIHRvIHRoZSAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgY3VycmVudCBjaGFybWFwIHVzZWQgaW4gdGhlIGZhY2UuICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBsb2FkX2ZsYWdzICA6OiBBIGZsYWcgaW5kaWNhdGluZyB3aGF0IHRvIGxvYWQgZm9yIHRoaXMgZ2x5cGguICBUaGUgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgRlRfTE9BRF9YWFggY29uc3RhbnRzIGNhbiBiZSB1c2VkIHRvIGNvbnRyb2wgdGhlICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgIGdseXBoIGxvYWRpbmcgcHJvY2VzcyAoZS5nLiwgd2hldGhlciB0aGUgb3V0bGluZSAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICBzaG91bGQgYmUgc2NhbGVkLCB3aGV0aGVyIHRvIGxvYWQgYml0bWFwcyBvciBub3QsICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgd2hldGhlciB0byBoaW50IHRoZSBvdXRsaW5lLCBldGMpLiAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBJZiB0aGUgZmFjZSBoYXMgbm8gY3VycmVudCBjaGFybWFwLCBvciBpZiB0aGUgY2hhcmFjdGVyIGNvZGUgICAgICAgKi8KKyAgLyogICAgaXMgbm90IGRlZmluZWQgaW4gdGhlIGNoYXJtYXAsIHRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gYW4gICAgICAgICovCisgIC8qICAgIGVycm9yLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgRVhQT1JUX0RFRgorICBGVF9FcnJvciAgRlRfTG9hZF9DaGFyKCBGVF9GYWNlICAgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgIGNoYXJfY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgIGxvYWRfZmxhZ3MgKTsKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxDb25zdGFudD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9MT0FEX05PX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBIGJpdCBmaWVsZCBjb25zdGFudCwgdXNlZCB3aXRoIEZUX0xvYWRfR2x5cGgoKSB0byBpbmRpY2F0ZSB0aGF0ICAgKi8KKyAgLyogICAgdGhlIHZlY3RvciBvdXRsaW5lIGJlaW5nIGxvYWRlZCBzaG91bGQgbm90IGJlIHNjYWxlZCB0byAyNi42ICAgICAgICovCisgIC8qICAgIGZyYWN0aW9uYWwgcGl4ZWxzLCBidXQga2VwdCBpbiBub3Rpb25hbCB1bml0cy4gICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRlRfTE9BRF9OT19TQ0FMRSAgMQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8Q29uc3RhbnQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfTE9BRF9OT19ISU5USU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSBiaXQtZmllbGQgY29uc3RhbnQsIHVzZWQgd2l0aCBGVF9Mb2FkX0dseXBoKCkgdG8gaW5kaWNhdGUgdGhhdCAgICovCisgIC8qICAgIHRoZSB2ZWN0b3Igb3V0bGluZSBiZWluZyBsb2FkZWQgc2hvdWxkIG5vdCBiZSBmaXR0ZWQgdG8gdGhlIHBpeGVsICAqLworICAvKiAgICBncmlkIGJ1dCBzaW1wbHkgc2NhbGVkIHRvIDI2LjYgZnJhY3Rpb25hbCBwaXhlbHMuICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoaXMgZmxhZyBpcyBpZ25vcmVkIHdoZW4gRlRfTE9BRF9OT19TQ0FMRSBpcyBzZXQuICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRlRfTE9BRF9OT19ISU5USU5HICAyCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxDb25zdGFudD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9MT0FEX05PX09VVExJTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBIGJpdC1maWVsZCBjb25zdGFudCwgdXNlZCB3aXRoIEZUX0xvYWRfR2x5cGgoKSB0byBpbmRpY2F0ZSB0aGF0ICAgKi8KKyAgLyogICAgdGhlIGZ1bmN0aW9uIHNob3VsZCBub3QgbG9hZCB0aGUgdmVjdG9yIG91dGxpbmUgb2YgYSBnaXZlbiBnbHlwaC4gICovCisgIC8qICAgIElmIGFuIGVtYmVkZGVkIGJpdG1hcCBleGlzdHMgZm9yIHRoZSBnbHlwaCBpbiB0aGUgZm9udCwgaXQgd2lsbCBiZSAqLworICAvKiAgICBsb2FkZWQsIG90aGVyd2lzZSBub3RoaW5nIGlzIHJldHVybmVkIGFuZCBhbiBlcnJvciBpcyBwcm9kdWNlZC4gICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZUX0xPQURfTk9fT1VUTElORSAgNAorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8Q29uc3RhbnQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfTE9BRF9OT19CSVRNQVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSBiaXQtZmllbGQgY29uc3RhbnQsIHVzZWQgd2l0aCBGVF9Mb2FkX0dseXBoKCkgdG8gaW5kaWNhdGUgdGhhdCAgICovCisgIC8qICAgIHRoZSBmdW5jdGlvbiBzaG91bGQgbm90IGxvYWQgdGhlIGJpdG1hcCBvciBwaXhtYXAgb2YgYSBnaXZlbiAgICAgICAqLworICAvKiAgICBnbHlwaC4gIElmIGFuIG91dGxpbmUgZXhpc3RzIGZvciB0aGUgZ2x5cGggaW4gdGhlIGZvbnQsIGl0IGlzICAgICAgKi8KKyAgLyogICAgbG9hZGVkLCBvdGhlcndpc2Ugbm90aGluZyBpcyByZXR1cm5lZCBhbmQgYW4gZXJyb3IgaXMgcHJvZHVjZWQuICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBGVF9MT0FEX05PX0JJVE1BUCAgOAorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8Q29uc3RhbnQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfTE9BRF9MSU5FQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSBiaXQtZmllbGQgY29uc3RhbnQsIHVzZWQgd2l0aCBGVF9Mb2FkX0dseXBoKCkgdG8gaW5kaWNhdGUgdGhhdCAgICovCisgIC8qICAgIHRoZSBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIHRoZSBsaW5lYXJseSBzY2FsZWQgbWV0cmljcyBmb3IgdGhlICAgICAqLworICAvKiAgICBnbHlwaCBpbiBgc2xvdC0+bWV0cmljczInICh0aGVzZSBtZXRyaWNzIGFyZSBub3QgZ3JpZC1maXR0ZWQpLiAgICAgKi8KKyAgLyogICAgT3RoZXJ3aXNlLCBgbWV0cmljczInIGdpdmVzIHRoZSBvcmlnaW5hbCBmb250IHVuaXRzIHZhbHVlcy4gICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBGVF9MT0FEX0xJTkVBUiAgMTYKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPENvbnN0YW50PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0xPQURfUEVEQU5USUMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgYml0LWZpZWxkIGNvbnN0YW50LCB1c2VkIHdpdGggRlRfTG9hZF9HbHlwaCgpIHRvIGluZGljYXRlIHRoYXQgICAqLworICAvKiAgICB0aGUgZ2x5cGggbG9hZGVyIHNob3VsZCBwZXJmb3JtIGEgcGVkYW50aWMgYnl0ZWNvZGUuICAgICAgICAgICAgICAgKi8KKyAgLyogICAgaW50ZXJwcmV0YXRpb24uICBNYW55IHBvcHVsYXIgZm9udHMgY29tZSB3aXRoIGJyb2tlbiBnbHlwaCAgICAgICAgICovCisgIC8qICAgIHByb2dyYW1zLiAgV2hlbiB0aGlzIGZsYWcgaXMgc2V0LCBsb2FkaW5nIHRoZW0gd2lsbCByZXR1cm4gYW4gICAgICAqLworICAvKiAgICBlcnJvci4gIE90aGVyd2lzZSwgZXJyb3JzIGFyZSBpZ25vcmVkIGJ5IHRoZSBsb2FkZXIsIHNvbWV0aW1lcyAgICAgKi8KKyAgLyogICAgcmVzdWx0aW5nIGluIHVnbHkgZ2x5cGhzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBGVF9MT0FEX1BFREFOVElDICAxMjgKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPENvbnN0YW50PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0xPQURfTk9fUkVDVVJTRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgYml0LWZpZWxkIGNvbnN0YW50LCB1c2VkIHdpdGggRlRfTG9hZF9HbHlwaCgpIHRvIGluZGljYXRlIHRoYXQgICAqLworICAvKiAgICB0aGUgZ2x5cGggbG9hZGVyIHNob3VsZCBub3QgbG9hZCBjb21wb3NpdGUgZ2x5cGggcmVjdXJzaXZlbHkuICAgICAgKi8KKyAgLyogICAgUmF0aGVyLCB3aGVuIGEgY29tcG9zaXRlIGdseXBoIGlzIGVuY291bnRlcmVkLCBpdCBzaG91bGQgc2V0ICAgICAgICovCisgIC8qICAgIHRoZSB2YWx1ZXMgb2YgYG51bV9zdWJnbHlwaHMnIGFuZCBgc3ViZ2x5cGhzJywgYXMgd2VsbCBhcyBzZXQgICAgICAqLworICAvKiAgICBgZmFjZS0+Z2x5cGguZm9ybWF0JyB0byBmdF9nbHlwaF9mb3JtYXRfY29tcG9zaXRlLiAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFhYWFhYIDogSU1QT1JUQU5UIE5PVEUsIFRISVMgRkxBRyBJUyBOT1QgWUVUIElNUExFTUVOVEVEICEhICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRlRfTE9BRF9OT19SRUNVUlNFIDI1NgorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8Q29uc3RhbnQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfTE9BRF9ERUZBVUxUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSBiaXQtZmllbGQgY29uc3RhbnQsIHVzZWQgd2l0aCBGVF9Mb2FkX0dseXBoKCkgdG8gaW5kaWNhdGUgdGhhdCAgICovCisgIC8qICAgIHRoZSBmdW5jdGlvbiBzaG91bGQgdHJ5IHRvIGxvYWQgdGhlIGdseXBoIG5vcm1hbGx5LCBpLmUuLCAgICAgICAgICAqLworICAvKiAgICBlbWJlZGRlZCBiaXRtYXBzIGFyZSBmYXZvcmVkIG92ZXIgb3V0bGluZXMsIHZlY3RvcnMgYXJlIGFsd2F5cyAgICAgKi8KKyAgLyogICAgc2NhbGVkIGFuZCBncmlkLWZpdHRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBGVF9MT0FEX0RFRkFVTFQgIDAKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0dldF9HbHlwaF9CaXRtYXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFJlbmRlcnMgYSBnaXZlbiBnbHlwaCBpbnRvIGEgYml0bWFwIG9yIHBpeG1hcC4gVGhpcyBmdW5jdGlvbiB3aWxsICAqLworICAvKiAgICB1c2UgdGhlIHJlZ2lzdGVyZWQgcmFzdGVycyB0byByZW5kZXIgdGhlIGdseXBoIGltYWdlLiAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBmYWNlICAgIDo6IGhhbmRsZSB0byB0aGUgZmFjZSBvYmplY3Qgd2hvc2UgZ2x5cGggc2xvdCBjb250YWlucyAgICAgKi8KKyAgLyogICAgICAgICAgICAgICB0aGUgZ2x5cGggaW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG1hcCAgICAgOjogQSBwb2ludGVyIHRvIHRoZSB0YXJnZXQgYml0bWFwIGRlc2NyaXB0b3IuICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE1ULU5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFlFUy4gIFJlbmRlcmluZyBpcyBzeW5jaHJvbml6ZWQsIHNvIHRoYXQgY29uY3VycmVudCBjYWxscyB0byB0aGUgICAqLworICAvKiAgICBzY2FuLWxpbmUgY29udmVydGVyIHdpbGwgYmUgc2VyaWFsaXplZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGlzIGZ1bmN0aW9uIGRvZXMgTk9UIENSRUFURSB0aGUgYml0bWFwLCBpdCBvbmx5IHJlbmRlcnMgYSAgICAgICAgKi8KKyAgLyogICAgZ2x5cGggaW1hZ2UgaW50byBpdCEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBFWFBPUlRfREVGCisgIEZUX0Vycm9yICBGVF9HZXRfR2x5cGhfQml0bWFwKCBGVF9GYWNlICAgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQml0bWFwKiAgbWFwICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9HZXRfS2VybmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBSZXR1cm5zIHRoZSBrZXJuaW5nIHZlY3RvciBiZXR3ZWVuIHR3byBnbHlwaHMgb2YgYSBzYW1lIGZhY2UuICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBmYWNlICAgICAgICA6OiBBIGhhbmRsZSB0byBhIHNvdXJjZSBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGxlZnRfZ2x5cGggIDo6IFRoZSBpbmRleCBvZiB0aGUgbGVmdCBnbHlwaCBpbiB0aGUga2VybiBwYWlyLiAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgcmlnaHRfZ2x5cGggOjogVGhlIGluZGV4IG9mIHRoZSByaWdodCBnbHlwaCBpbiB0aGUga2VybiBwYWlyLiAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAga2VybmluZyAgICAgOjogVGhlIGtlcm5pbmcgdmVjdG9yLiAgVGhpcyBpcyBpbiBmb250IHVuaXRzIGZvciAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgIHNjYWxhYmxlIGZvcm1hdHMsIGFuZCBpbiBwaXhlbHMgZm9yIGZpeGVkLXNpemVzICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICBmb3JtYXRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBPbmx5IGhvcml6b250YWwgbGF5b3V0cyAobGVmdC10by1yaWdodCAmIHJpZ2h0LXRvLWxlZnQpIGFyZSAgICAgICAgKi8KKyAgLyogICAgc3VwcG9ydGVkIGJ5IHRoaXMgbWV0aG9kLiAgT3RoZXIgbGF5b3V0cywgb3IgbW9yZSBzb3BoaXN0aWNhdGVkICAgICovCisgIC8qICAgIGtlcm5pbmdzLCBhcmUgb3V0IG9mIHRoZSBzY29wZSBvZiB0aGlzIEFQSSBmdW5jdGlvbiAtLSB0aGV5IGNhbiBiZSAqLworICAvKiAgICBpbXBsZW1lbnRlZCB0aHJvdWdoIGZvcm1hdC1zcGVjaWZpYyBpbnRlcmZhY2VzLiAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEVYUE9SVF9ERUYKKyAgRlRfRXJyb3IgIEZUX0dldF9LZXJuaW5nKCBGVF9GYWNlICAgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgIGxlZnRfZ2x5cGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgcmlnaHRfZ2x5cGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVmVjdG9yKiAga2VybmluZyApOworCisKKworLyogWFhYIDogTm90IGltcGxlbWVudGVkIHlldCwgYnV0IHNob3VsZCBjb21lIHNvb24gKi8KKyNpZiAwCisgIEVYUE9SVF9ERUYKKyAgRlRfRXJyb3IgIEZUX1NlbGVjdF9DaGFybWFwKCBGVF9GYWNlICAgICAgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9FbmNvZGluZyAgZW5jb2RpbmcgKTsKKworCisgIEVYUE9SVF9ERUYKKyAgRlRfRXJyb3IgIEZUX1NldF9DaGFybWFwKCBGVF9GYWNlICAgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0NoYXJNYXAgIGNoYXJtYXAgKTsKKyNlbmRpZgorCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0dldF9DaGFyX0luZGV4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFJldHVybnMgdGhlIGdseXBoIGluZGV4IG9mIGEgZ2l2ZW4gY2hhcmFjdGVyIGNvZGUuICBUaGlzIGZ1bmN0aW9uICAqLworICAvKiAgICB1c2VzIGEgY2hhcm1hcCBvYmplY3QgdG8gZG8gdGhlIHRyYW5zbGF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBjaGFybWFwICA6OiBBIGhhbmRsZSB0byBhIGZpbHRlciBjaGFybWFwIG9iamVjdC4gICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgY2hhcmNvZGUgOjogVGhlIGNoYXJhY3RlciBjb2RlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhlIGdseXBoIGluZGV4LiAgMCBtZWFucyBgdW5kZWZpbmVkIGNoYXJhY3RlciBjb2RlJy4gICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBFWFBPUlRfREVGCisgIEZUX1VJbnQgIEZUX0dldF9DaGFyX0luZGV4KCBGVF9GYWNlICAgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICBjaGFyY29kZSApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfTXVsRGl2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSB2ZXJ5IHNpbXBsZSBmdW5jdGlvbiB1c2VkIHRvIHBlcmZvcm0gdGhlIGNvbXB1dGF0aW9uIGAoQSpCKS9DJyAgICovCisgIC8qICAgIHdpdGggbWF4aW11bSBhY2N1cmFjeSAoaXQgdXNlcyBhIDY0LWJpdCBpbnRlcm1lZGlhdGUgaW50ZWdlciAgICAgICAqLworICAvKiAgICB3aGVuZXZlciBuZWNlc3NhcnkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoaXMgZnVuY3Rpb24gaXNuJ3QgbmVjZXNzYXJpbHkgYXMgZmFzdCBhcyBzb21lIHByb2Nlc3NvciBzcGVjaWZpYyAqLworICAvKiAgICBvcGVyYXRpb25zLCBidXQgaXMgYXQgbGVhc3QgY29tcGxldGVseSBwb3J0YWJsZS4gICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBhIDo6IFRoZSBmaXJzdCBtdWx0aXBsaWVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgYiA6OiBUaGUgc2Vjb25kIG11bHRpcGxpZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGMgOjogVGhlIGRpdmlzb3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoZSByZXN1bHQgb2YgYChhKmIpL2MnLiAgVGhpcyBmdW5jdGlvbiBuZXZlciB0cmFwcyB3aGVuIHRyeWluZyB0byAqLworICAvKiAgICBkaXZpZGUgYnkgemVybywgaXQgc2ltcGx5IHJldHVybnMgYE1heEludCcgb3IgYE1pbkludCcgZGVwZW5kaW5nICAgKi8KKyAgLyogICAgb24gdGhlIHNpZ25zIG9mIGBhJyBhbmQgYGInLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBFWFBPUlRfREVGCisgIEZUX0xvbmcgIEZUX011bERpdiggRlRfTG9uZyAgYSwKKyAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICBiLAorICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgIGMgKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX011bEZpeCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgdmVyeSBzaW1wbGUgZnVuY3Rpb24gdXNlZCB0byBwZXJmb3JtIHRoZSBjb21wdXRhdGlvbiAgICAgICAgICAgICAqLworICAvKiAgICBgKEEqQikvMHgxMDAwMCcgd2l0aCBtYXhpbXVtIGFjY3VyYWN5LiAgTW9zdCBvZiB0aGUgdGltZSwgdGhpcyBpcyAgKi8KKyAgLyogICAgdXNlZCB0byBtdWx0aXBseSBhIGdpdmVuIHZhbHVlIGJ5IGEgMTYuMTYgZml4ZWQgZmxvYXQgZmFjdG9yLiAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgYSA6OiBUaGUgZmlyc3QgbXVsdGlwbGllci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGIgOjogVGhlIHNlY29uZCBtdWx0aXBsaWVyLiAgVXNlIGEgMTYuMTYgZmFjdG9yIGhlcmUgd2hlbmV2ZXIgICAgICAqLworICAvKiAgICAgICAgIHBvc3NpYmxlIChzZWUgbm90ZSBiZWxvdykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGUgcmVzdWx0IG9mIGAoYSpiKS8weDEwMDAwJy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGlzIGZ1bmN0aW9uIGhhcyBiZWVuIG9wdGltaXplZCBmb3IgdGhlIGNhc2Ugd2hlcmUgdGhlIGFic29sdXRlICAgKi8KKyAgLyogICAgdmFsdWUgb2YgYGEnIGlzIGxlc3MgdGhhbiAyMDQ4LCBhbmQgYGInIGlzIGEgMTYuMTYgc2NhbGluZyBmYWN0b3IuICovCisgIC8qICAgIEFzIHRoaXMgaGFwcGVucyBtYWlubHkgd2hlbiBzY2FsaW5nIGZyb20gbm90aW9uYWwgdW5pdHMgdG8gICAgICAgICAqLworICAvKiAgICBmcmFjdGlvbmFsIHBpeGVscyBpbiBGcmVlVHlwZSwgaXQgcmVzdWx0ZWQgaW4gbm90aWNlYWJsZSBzcGVlZCAgICAgKi8KKyAgLyogICAgaW1wcm92ZW1lbnRzIGJldHdlZW4gdmVyc2lvbnMgMi4wIGFuZCAxLnguICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBcyBhIGNvbmNsdXNpb24sIGFsd2F5cyB0cnkgdG8gcGxhY2UgYSAxNi4xNiBmYWN0b3IgYXMgdGhlICAgICAgICAgKi8KKyAgLyogICAgX3NlY29uZF8gYXJndW1lbnQgb2YgdGhpcyBmdW5jdGlvbjsgdGhpcyBjYW4gbWFrZSBhIGdyZWF0ICAgICAgICAgICovCisgIC8qICAgIGRpZmZlcmVuY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgRVhQT1JUX0RFRgorICBGVF9Mb25nICBGVF9NdWxGaXgoIEZUX0xvbmcgIGEsCisgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgYiApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfRGl2Rml4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSB2ZXJ5IHNpbXBsZSBmdW5jdGlvbiB1c2VkIHRvIHBlcmZvcm0gdGhlIGNvbXB1dGF0aW9uICAgICAgICAgICAgICovCisgIC8qICAgIGAoQSoweDEwMDAwKS9CJyB3aXRoIG1heGltdW0gYWNjdXJhY3kuICBNb3N0IG9mIHRoZSB0aW1lLCB0aGlzIGlzICAqLworICAvKiAgICB1c2VkIHRvIGRpdmlkZSAgYSBnaXZlbiB2YWx1ZSBieSBhIDE2LjE2IGZpeGVkIGZsb2F0IGZhY3Rvci4gICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBhIDo6IFRoZSBmaXJzdCBtdWx0aXBsaWVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgYiA6OiBUaGUgc2Vjb25kIG11bHRpcGxpZXIuICBVc2UgYSAxNi4xNiBmYWN0b3IgaGVyZSB3aGVuZXZlciAgICAgICovCisgIC8qICAgICAgICAgcG9zc2libGUgKHNlZSBub3RlIGJlbG93KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoZSByZXN1bHQgb2YgYChhKjB4MTAwMDApL2InLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoZSBvcHRpbWlzYXRpb24gZm9yIEZUX0RpdkZpeCgpIGlzIHNpbXBsZSA6IGlmIChhIDw8IDE2KSBmaXRzICAgICAqLworICAvKiAgICBpbiAzMiBiaXRzLCB0aGVuIHRoZSBkaXZpc2lvbiBpcyBjb21wdXRlZCBkaXJlY3RseS4gT3RoZXJ3aXNlLCAgICAgKi8KKyAgLyogICAgd2UgdXNlIGEgc3BlY2lhbGlzZWQgdmVyc2lvbiBvZiB0aGUgb2xkIEZUX011bERpdjY0ICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBFWFBPUlRfREVGCisgIEZUX0xvbmcgIEZUX0RpdkZpeCggRlRfTG9uZyAgYSwKKyAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICBiICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9EZWNvbXBvc2VfT3V0bGluZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBXYWxrcyBvdmVyIGFuIG91dGxpbmUncyBzdHJ1Y3R1cmUgdG8gZGVjb21wb3NlIGl0IGludG8gaW5kaXZpZHVhbCAgKi8KKyAgLyogICAgc2VnbWVudHMgYW5kIEJlemllciBhcmNzLiAgVGhpcyBmdW5jdGlvbiBpcyBhbHNvIGFibGUgdG8gZW1pdCAgICAgICovCisgIC8qICAgIGBtb3ZlIHRvJyBhbmQgYGNsb3NlIHRvJyBvcGVyYXRpb25zIHRvIGluZGljYXRlIHRoZSBzdGFydCBhbmQgZW5kICAqLworICAvKiAgICBvZiBuZXcgY29udG91cnMgaW4gdGhlIG91dGxpbmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBvdXRsaW5lICAgOjogQSBwb2ludGVyIHRvIHRoZSBzb3VyY2UgdGFyZ2V0LiAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGludGVyZmFjZSA6OiBBIHRhYmxlIG9mIGBlbWl0dGVycycsIGkuZSwuIGZ1bmN0aW9uIHBvaW50ZXJzIGNhbGxlZCAqLworICAvKiAgICAgICAgICAgICAgICAgZHVyaW5nIGRlY29tcG9zaXRpb24gdG8gaW5kaWNhdGUgcGF0aCBvcGVyYXRpb25zLiAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHVzZXIgICAgICA6OiBBIHR5cGVsZXNzIHBvaW50ZXIgd2hpY2ggaXMgcGFzc2VkIHRvIGVhY2ggZW1pdHRlciAgICAqLworICAvKiAgICAgICAgICAgICAgICAgZHVyaW5nIHRoZSBkZWNvbXBvc2l0aW9uLiAgSXQgY2FuIGJlIHVzZWQgdG8gc3RvcmUgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgIHRoZSBzdGF0ZSBkdXJpbmcgdGhlIGRlY29tcG9zaXRpb24uICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBFWFBPUlRfREVGCisgIGludCAgRlRfRGVjb21wb3NlX091dGxpbmUoIEZUX091dGxpbmUqICAgICAgICBvdXRsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9PdXRsaW5lX0Z1bmNzKiAgaW50ZXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgICAgICAgdXNlciApOworIAorCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX05ld19PdXRsaW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIENyZWF0ZXMgYSBuZXcgb3V0bGluZSBvZiBhIGdpdmVuIHNpemUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGxpYnJhcnkgICAgIDo6IEEgaGFuZGxlIHRvIHRoZSBsaWJyYXJ5IG9iamVjdCBmcm9tIHdoZXJlIHRoZSAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICBvdXRsaW5lIGlzIGFsbG9jYXRlZC4gIE5vdGUgaG93ZXZlciB0aGF0IHRoZSBuZXcgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgb3V0bGluZSB3aWxsIE5PVCBuZWNlc3NhcmlseSBiZSBGUkVFRCB3aGVuICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgIGRlc3Ryb3lpbmcgdGhlIGxpYnJhcnksIGJ5IEZUX0RvbmVfRnJlZVR5cGUoKS4gICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbnVtUG9pbnRzICAgOjogVGhlIG1heGltdW0gbnVtYmVyIG9mIHBvaW50cyB3aXRoaW4gdGhlIG91dGxpbmUuICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBudW1Db250b3VycyA6OiBUaGUgbWF4aW11bSBudW1iZXIgb2YgY29udG91cnMgd2l0aGluIHRoZSBvdXRsaW5lLiAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBvdXRsaW5lICAgICA6OiBBIGhhbmRsZSB0byB0aGUgbmV3IG91dGxpbmUuICBOVUxMIGluIGNhc2Ugb2YgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgZXJyb3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8TVQtTm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgTm8uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhlIHJlYXNvbiB3aHkgdGhpcyBmdW5jdGlvbiB0YWtlcyBhIGBsaWJyYXJ5JyBwYXJhbWV0ZXIgaXMgc2ltcGx5ICovCisgIC8qICAgIHRvIHVzZSB0aGUgbGlicmFyeSdzIG1lbW9yeSBhbGxvY2F0b3IuICBZb3UgY2FuIGNvcHkgdGhlIHNvdXJjZSAgICAqLworICAvKiAgICBjb2RlIG9mIHRoaXMgZnVuY3Rpb24sIHJlcGxhY2luZyBhbGxvY2F0aW9ucyB3aXRoIGBtYWxsb2MoKScgaWYgICAgKi8KKyAgLyogICAgeW91IHdhbnQgdG8gY29udHJvbCB3aGVyZSB0aGUgb2JqZWN0cyBnby4gICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBFWFBPUlRfREVGCisgIEZUX0Vycm9yICBGVF9OZXdfT3V0bGluZSggRlRfTGlicmFyeSAgIGxpYnJhcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgIG51bVBvaW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgbnVtQ29udG91cnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfT3V0bGluZSogIG91dGxpbmUgKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0RvbmVfT3V0bGluZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIERlc3Ryb3lzIGFuIG91dGxpbmUgY3JlYXRlZCB3aXRoIEZUX05ld19PdXRsaW5lKCkuICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGxpYnJhcnkgOjogQSBoYW5kbGUgb2YgdGhlIGxpYnJhcnkgb2JqZWN0IHVzZWQgdG8gYWxsb2NhdGUgdGhlICAgICAqLworICAvKiAgICAgICAgICAgICAgIG91dGxpbmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG91dGxpbmUgOjogQSBwb2ludGVyIHRvIHRoZSBvdXRsaW5lIG9iamVjdCB0byBiZSBkaXNjYXJkZWQuICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE1ULU5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIE5vLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIElmIHRoZSBvdXRsaW5lJ3MgYG93bmVyJyBmaWVsZCBpcyBub3Qgc2V0LCBvbmx5IHRoZSBvdXRsaW5lICAgICAgICAqLworICAvKiAgICBkZXNjcmlwdG9yIHdpbGwgYmUgcmVsZWFzZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoZSByZWFzb24gd2h5IHRoaXMgZnVuY3Rpb24gdGFrZXMgYW4gYG91dGxpbmUnIHBhcmFtZXRlciBpcyAgICAgICAqLworICAvKiAgICBzaW1wbHkgdG8gdXNlIEZUX0FsbG9jKCkvRlRfRnJlZSgpLiAgWW91IGNhbiBjb3B5IHRoZSBzb3VyY2UgY29kZSAgKi8KKyAgLyogICAgb2YgdGhpcyBmdW5jdGlvbiwgcmVwbGFjaW5nIGFsbG9jYXRpb25zIHdpdGggYG1hbGxvYygpJyBpbiB5b3VyICAgICovCisgIC8qICAgIGFwcGxpY2F0aW9uIGlmIHlvdSB3YW50IHNvbWV0aGluZyBzaW1wbGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgRVhQT1JUX0RFRgorICBGVF9FcnJvciAgRlRfRG9uZV9PdXRsaW5lKCBGVF9MaWJyYXJ5ICAgbGlicmFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfT3V0bGluZSogIG91dGxpbmUgKTsKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9HZXRfT3V0bGluZV9DQm94ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBSZXR1cm5zIGFuIG91dGxpbmUncyBgY29udHJvbCBib3gnLiAgVGhlIGNvbnRyb2wgYm94IGVuY2xvc2VzIGFsbCAgKi8KKyAgLyogICAgdGhlIG91dGxpbmUncyBwb2ludHMsIGluY2x1ZGluZyBCZXppZXIgY29udHJvbCBwb2ludHMuICBUaG91Z2ggaXQgICovCisgIC8qICAgIGNvaW5jaWRlcyB3aXRoIHRoZSBleGFjdCBib3VuZGluZyBib3ggZm9yIG1vc3QgZ2x5cGhzLCBpdCBjYW4gYmUgICAqLworICAvKiAgICBzbGlnaHRseSBsYXJnZXIgaW4gc29tZSBzaXR1YXRpb25zIChsaWtlIHdoZW4gcm90YXRpbmcgYW4gb3V0bGluZSAgKi8KKyAgLyogICAgd2hpY2ggY29udGFpbnMgQmV6aWVyIG91dHNpZGUgYXJjcykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBDb21wdXRpbmcgdGhlIGNvbnRyb2wgYm94IGlzIHZlcnkgZmFzdCwgd2hpbGUgZ2V0dGluZyB0aGUgYm91bmRpbmcgKi8KKyAgLyogICAgYm94IGNhbiB0YWtlIG11Y2ggbW9yZSB0aW1lIGFzIGl0IG5lZWRzIHRvIHdhbGsgb3ZlciBhbGwgc2VnbWVudHMgICovCisgIC8qICAgIGFuZCBhcmNzIGluIHRoZSBvdXRsaW5lLiAgVG8gZ2V0IHRoZSBsYXR0ZXIsIHlvdSBjYW4gdXNlIHRoZSAgICAgICAqLworICAvKiAgICBgZnRiYm94JyBjb21wb25lbnQgd2hpY2ggaXMgZGVkaWNhdGVkIHRvIHRoaXMgc2luZ2xlIHRhc2suICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBvdXRsaW5lIDo6IEEgcG9pbnRlciB0byB0aGUgc291cmNlIG91dGxpbmUgZGVzY3JpcHRvci4gICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBjYm94ICAgIDo6IFRoZSBvdXRsaW5lJ3MgY29udHJvbCBib3guICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxNVC1Ob3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBZZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEVYUE9SVF9ERUYKKyAgRlRfRXJyb3IgIEZUX0dldF9PdXRsaW5lX0NCb3goIEZUX091dGxpbmUqICBvdXRsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQkJveCogICAgIGNib3ggKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX1RyYW5zbGF0ZV9PdXRsaW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEFwcGxpZXMgYSBzaW1wbGUgdHJhbnNsYXRpb24gdG8gdGhlIHBvaW50cyBvZiBhbiBvdXRsaW5lLiAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG91dGxpbmUgOjogQSBwb2ludGVyIHRvIHRoZSB0YXJnZXQgb3V0bGluZSBkZXNjcmlwdG9yLiAgICAgICAgICAgICAqLworICAvKiAgICB4T2Zmc2V0IDo6IFRoZSBob3Jpem9udGFsIG9mZnNldC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgeU9mZnNldCA6OiBUaGUgdmVydGljYWwgb2Zmc2V0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8TVQtTm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgWWVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBFWFBPUlRfREVGCisgIHZvaWQgIEZUX1RyYW5zbGF0ZV9PdXRsaW5lKCBGVF9PdXRsaW5lKiAgb3V0bGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgICAgICB4T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICAgICAgIHlPZmZzZXQgKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX1NldF9SYXN0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFJlZ2lzdGVyIGEgZ2l2ZW4gcmFzdGVyIHRvIHRoZSBsaWJyYXJ5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGxpYnJhcnkgICA6OiBBIGhhbmRsZSB0byBhIHRhcmdldCBsaWJyYXJ5IG9iamVjdC4gICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgaW50ZXJmYWNlIDo6IHBvaW50ZXIgdG8gdGhlIHJhc3RlcidzIGludGVyZmFjZSAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICByYXN0ZXIgICAgOjogaWYgdGhpcyBmaWVsZCBpcyBuaWwsIHRoaXMgZnVuY3Rpb24gd2lsbCBhbGxvY2F0ZSAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgIGEgbmV3IG9iamV0LiBPdGhlcndpc2UsIGl0IHdpbGwgc2ltcGx5IHVzZSB0aGUgb25lICAgICovCisgIC8qICAgICAgICAgICAgICAgICBwcm92aWRlZCBoZXJlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBFWFBPUlRfREVGCisgIEZUX0Vycm9yICBGVF9TZXRfUmFzdGVyKCBGVF9MaWJyYXJ5ICAgICAgICAgICAgbGlicmFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1Jhc3Rlcl9JbnRlcmZhY2UqICBpbnRlcmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9SYXN0ZXIgICAgICAgICAgICAgcmFzdGVyICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9TZXRfUmFzdGVyX01vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBTZXQgYSByYXN0ZXItc3BlY2lmaWMgbW9kZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBsaWJyYXJ5IDo6IEEgaGFuZGxlIHRvIGEgdGFyZ2V0IGxpYnJhcnkgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZm9ybWF0ICA6OiB0aGUgZ2x5cGggZm9ybWF0IHVzZWQgdG8gc2VsZWN0IHRoZSByYXN0ZXIgICAgICAgICAgICAgICovCisgIC8qICAgIG1vZGUgICAgOjogdGhlIHJhc3Rlci1zcGVjaWZpYyBtb2RlIGRlc2NyaXB0b3IgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBhcmdzICAgIDo6IHRoZSBtb2RlIGFyZ3VtZW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgRVhQT1JUX0RFRgorICBGVF9FcnJvciAgRlRfU2V0X1Jhc3Rlcl9Nb2RlKCBGVF9MaWJyYXJ5ICAgIGxpYnJhcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0dseXBoX1RhZyAgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgIG1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICAgYXJncyApOworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworICB9CisjZW5kaWYKKworCisjZW5kaWYgLyogRlJFRVRZUEVfSCAqLworCisKKy8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mdGJib3guaCBiL2luY2x1ZGUvZnRiYm94LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE2ODYxNQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvZnRiYm94LmgKQEAgLTAsMCArMSw3MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgZnRiYm94LmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZyZWVUeXBlIGJib3ggY29tcHV0YXRpb24gKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAxOTk2LTE5OTkgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCAgICAgICAgKi8KKy8qICBtb2RpZmllZCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgICovCisvKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLworLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KKy8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogVGhpcyBjb21wb25lbnQgaGFzIGEgX3NpbmdsZV8gcm9sZTogdG8gY29tcHV0ZSBleGFjdCBvdXRsaW5lIGJvdW5kaW5nICovCisgIC8qIGJveGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogSXQgaXMgc2VwYXJhdGVkIGZyb20gdGhlIHJlc3Qgb2YgdGhlIGVuZ2luZSBmb3IgdmFyaW91cyB0ZWNobmljYWwgICAgICovCisgIC8qIHJlYXNvbnMuICBJdCBtYXkgd2VsbCBiZSBpbnRlZ3JhdGVkIGluIGBmdG91dGxuJyBsYXRlci4gICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2lmbmRlZiBGVEJCT1hfSAorI2RlZmluZSBGVEJCT1hfSAorCisjaW5jbHVkZSA8ZnJlZXR5cGUuaD4KKworI2lmZGVmIF9fY3BsdXNwbHVzCisgIGV4dGVybiAiQyIgeworI2VuZGlmCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9HZXRfT3V0bGluZV9CQm94ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBDb21wdXRlcyB0aGUgZXhhY3QgYm91bmRpbmcgYm94IG9mIGFuIG91dGxpbmUuICBUaGlzIGlzIHNsb3dlciAgICAgKi8KKyAgLyogICAgdGhhbiBjb21wdXRpbmcgdGhlIGNvbnRyb2wgYm94LiAgSG93ZXZlciwgaXQgdXNlcyBhbiBhZHZhbmNlZCAgICAgICovCisgIC8qICAgIGFsZ29yaXRobSB3aGljaCByZXR1cm5zIF92ZXJ5XyBxdWlja2x5IHdoZW4gdGhlIHR3byBib3hlcyAgICAgICAgICAqLworICAvKiAgICBjb2luY2lkZS4gIE90aGVyd2lzZSwgdGhlIG91dGxpbmUgQmV6aWVyIGFyY3MgYXJlIHdhbGtlZCBvdmVyIHRvICAgKi8KKyAgLyogICAgZXh0cmFjdCB0aGVpciBleHRyZW1hLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgb3V0bGluZSA6OiBBIHBvaW50ZXIgdG8gdGhlIHNvdXJjZSBvdXRsaW5lLiAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgYmJveCAgICA6OiBUaGUgb3V0bGluZSdzIGV4YWN0IGJvdW5kaW5nIGJveC4gICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBFWFBPUlRfREVGCisgIEZUX0Vycm9yICBGVF9HZXRfT3V0bGluZV9CQm94KCBGVF9PdXRsaW5lKiAgb3V0bGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0JCb3gqICAgICBiYm94ICk7CisKKworI2lmZGVmIF9fY3BsdXNwbHVzCisgIH0KKyNlbmRpZgorCisjZW5kaWYgLyogRlRCQk9YX0ggKi8KKworCisvKiBFTkQgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZnRlcnJvcnMuaCBiL2luY2x1ZGUvZnRlcnJvcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGY5YWUzCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9mdGVycm9ycy5oCkBAIC0wLDAgKzEsODIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGZ0ZXJyb3JzLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRnJlZVR5cGUgZXJyb3IgY29kZXMgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMTk5Ni0xOTk5IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQgICAgICAgICovCisvKiAgbW9kaWZpZWQgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICAqLworLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KKy8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCisvKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2RlZmluZSAgRlRfRXJyX09rICAgICAgICAgICAgICAgICAgICAgICAweDAwMAorCisjZGVmaW5lICBGVF9FcnJfQ2Fubm90X09wZW5fUmVzb3VyY2UgICAgIDB4MDAxCisjZGVmaW5lICBGVF9FcnJfVW5rbm93bl9GaWxlX0Zvcm1hdCAgICAgIDB4MDAyCisjZGVmaW5lICBGVF9FcnJfSW52YWxpZF9GaWxlX0Zvcm1hdCAgICAgIDB4MDAyCisKKyNkZWZpbmUgIEZUX0Vycl9JbnZhbGlkX0FyZ3VtZW50ICAgICAgICAgMHgwMDMKKyNkZWZpbmUgIEZUX0Vycl9JbnZhbGlkX0hhbmRsZSAgICAgICAgICAgMHgwMDQKKyNkZWZpbmUgIEZUX0Vycl9JbnZhbGlkX0dseXBoX0luZGV4ICAgICAgMHgwMEEKKyNkZWZpbmUgIEZUX0Vycl9JbnZhbGlkX0NoYXJhY3Rlcl9Db2RlICAgMHgwMEIKKworI2RlZmluZSAgRlRfRXJyX1VuaW1wbGVtZW50ZWRfRmVhdHVyZSAgICAweDAxMAorI2RlZmluZSAgRlRfRXJyX0ludmFsaWRfR2x5cGhfRm9ybWF0ICAgICAweDAwRAorCisjZGVmaW5lICBGVF9FcnJfSW52YWxpZF9MaWJyYXJ5X0hhbmRsZSAgIDB4MDA0CisjZGVmaW5lICBGVF9FcnJfSW52YWxpZF9Ecml2ZXJfSGFuZGxlICAgIDB4MDA1CisjZGVmaW5lICBGVF9FcnJfSW52YWxpZF9GYWNlX0hhbmRsZSAgICAgIDB4MDA2CisjZGVmaW5lICBGVF9FcnJfSW52YWxpZF9TaXplX0hhbmRsZSAgICAgIDB4MDA3CisjZGVmaW5lICBGVF9FcnJfSW52YWxpZF9TbG90X0hhbmRsZSAgICAgIDB4MDA4CisjZGVmaW5lICBGVF9FcnJfSW52YWxpZF9DaGFyTWFwX0hhbmRsZSAgIDB4MDA5CisjZGVmaW5lICBGVF9FcnJfSW52YWxpZF9PdXRsaW5lICAgICAgICAgIDB4MDBCCisjZGVmaW5lICBGVF9FcnJfSW52YWxpZF9EaW1lbnNpb25zICAgICAgIDB4MDBDCisKKyNkZWZpbmUgIEZUX0Vycl9VbmF2YWlsYWJsZV9PdXRsaW5lICAgICAgMHgwMTEKKyNkZWZpbmUgIEZUX0Vycl9VbmF2YWlsYWJsZV9CaXRtYXAgICAgICAgMHgwMTIKKyNkZWZpbmUgIEZUX0Vycl9VbmF2YWlsYWJsZV9QaXhtYXAgICAgICAgMHgwMTMKKyNkZWZpbmUgIEZUX0Vycl9GaWxlX0lzX05vdF9Db2xsZWN0aW9uICAgMHgwMTQKKyNkZWZpbmUgIEZUX0Vycl9Ub29fTWFueV9Ecml2ZXJzICAgICAgICAgMHgwMTUKKyNkZWZpbmUgIEZUX0Vycl9Ub29fTWFueV9HbHlwaF9Gb3JtYXRzICAgMHgwMTYKKyNkZWZpbmUgIEZUX0Vycl9Ub29fTWFueV9FeHRlbnNpb25zICAgICAgMHgwMTcKKworI2RlZmluZSAgRlRfRXJyX091dF9PZl9NZW1vcnkgICAgICAgICAgICAweDEwMAorI2RlZmluZSAgRlRfRXJyX1VubGlzdGVkX09iamVjdCAgICAgICAgICAweDEwMQorCisjZGVmaW5lICBGVF9FcnJfSW52YWxpZF9SZXNvdXJjZV9IYW5kbGUgIDB4MjAwCisjZGVmaW5lICBGVF9FcnJfSW52YWxpZF9TdHJlYW1fSGFuZGxlICAgIDB4MjAxCisjZGVmaW5lICBGVF9FcnJfQ2Fubm90X09wZW5fU3RyZWFtICAgICAgIDB4MjAyCisjZGVmaW5lICBGVF9FcnJfSW52YWxpZF9TdHJlYW1fU2VlayAgICAgIDB4MjAzCisjZGVmaW5lICBGVF9FcnJfSW52YWxpZF9TdHJlYW1fU2tpcCAgICAgIDB4MjA0CisjZGVmaW5lICBGVF9FcnJfSW52YWxpZF9TdHJlYW1fUmVhZCAgICAgIDB4MjA1CisjZGVmaW5lICBGVF9FcnJfSW52YWxpZF9TdHJlYW1fT3BlcmF0aW9uIDB4MjA2CisjZGVmaW5lICBGVF9FcnJfSW52YWxpZF9GcmFtZV9PcGVyYXRpb24gIDB4MjA3CisjZGVmaW5lICBGVF9FcnJfTmVzdGVkX0ZyYW1lX0FjY2VzcyAgICAgIDB4MjA4CisjZGVmaW5lICBGVF9FcnJfSW52YWxpZF9GcmFtZV9SZWFkICAgICAgIDB4MjA5CisKKyNkZWZpbmUgIEZUX0Vycl9Ub29fTWFueV9Qb2ludHMgICAgICAgICAgMHgzMDAKKyNkZWZpbmUgIEZUX0Vycl9Ub29fTWFueV9Db250b3VycyAgICAgICAgMHgzMDEKKyNkZWZpbmUgIEZUX0Vycl9JbnZhbGlkX0NvbXBvc2l0ZSAgICAgICAgMHgzMDIKKyNkZWZpbmUgIEZUX0Vycl9Ub29fTWFueV9IaW50cyAgICAgICAgICAgMHgzMDMKKyNkZWZpbmUgIEZUX0Vycl9Ub29fTWFueV9FZGdlcyAgICAgICAgICAgMHgzMDQKKyNkZWZpbmUgIEZUX0Vycl9Ub29fTWFueV9TdHJva2VzICAgICAgICAgMHgzMDUKKworLyogcmFuZ2UgMHg0MDAgLSAweDRGRiBpcyByZXNlcnZlZCBmb3IgVHJ1ZVR5cGUgc3BlY2lmaWMgc3R1ZmYgKi8KKworLyogcmFuZ2UgMHg1MDAgLSAweDVGRiBpcyByZXNlcnZlZCBmb3IgVHJ1ZURvYyAgc3BlY2lmaWMgc3R1ZmYgKi8KKworLyogcmFuZ2UgMHg2MDAgLSAweDZGRiBpcyByZXNlcnZlZCBmb3IgVHlwZTEgICAgc3BlY2lmaWMgc3R1ZmYgKi8KKworI2RlZmluZSAgRlRfRXJyX1Jhc3Rlcl9VbmluaXRpYWxpemVkICAgICAweEYwMAorI2RlZmluZSAgRlRfRXJyX1Jhc3Rlcl9Db3JydXB0ZWQgICAgICAgICAweEYwMQorI2RlZmluZSAgRlRfRXJyX1Jhc3Rlcl9PdmVyZmxvdyAgICAgICAgICAweEYwMgorCisKKy8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mdGltYWdlLmggYi9pbmNsdWRlL2Z0aW1hZ2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTgxNzRiCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9mdGltYWdlLmgKQEAgLTAsMCArMSw2MjcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGZ0aW1hZ2UuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmaWxlIGRlZmluZXMgdGhlIGdseXBoIGltYWdlIGZvcm1hdHMgcmVjb2duaXplZCBieSBGcmVlVHlwZSwgYXMgICAqLworLyogIHdlbGwgYXMgdGhlIGRlZmF1bHQgcmFzdGVyIGludGVyZmFjZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDE5OTYtMTk5OSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZyAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkICAgICAgICAqLworLyogIG1vZGlmaWVkIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAgKi8KKy8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCisvKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLworLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIEZUSU1BR0VfSAorI2RlZmluZSBGVElNQUdFX0gKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9Qb3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGUgdHlwZSBGVF9Qb3MgaXMgYSAzMi1iaXQgaW50ZWdlciB1c2VkIHRvIHN0b3JlIHZlY3RvcmlhbCAgICAgICAgKi8KKyAgLyogICAgY29vcmRpbmF0ZXMuICBEZXBlbmRpbmcgb24gdGhlIGNvbnRleHQsIHRoZXNlIGNhbiByZXByZXNlbnQgICAgICAgICovCisgIC8qICAgIGRpc3RhbmNlcyBpbiBpbnRlZ2VyIGZvbnQgdW5pdHMsIG9yIDI2LjYgZml4ZWQgZmxvYXQgcGl4ZWwgICAgICAgICAqLworICAvKiAgICBjb29yZGluYXRlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgc2lnbmVkIGxvbmcgIEZUX1BvczsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX1ZlY3RvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgc2ltcGxlIHN0cnVjdHVyZSB1c2VkIHRvIHN0b3JlIGEgMmQgdmVjdG9yOyBjb29yZGluYXRlcyBhcmUgb2YgICAqLworICAvKiAgICB0aGUgRlRfUG9zIHR5cGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB4IDo6IFRoZSBob3Jpem9udGFsIGNvb3JkaW5hdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgeSA6OiBUaGUgdmVydGljYWwgY29vcmRpbmF0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHN0cnVjdCAgRlRfVmVjdG9yXworICB7CisgICAgRlRfUG9zICB4OworICAgIEZUX1BvcyAgeTsKKworICB9IEZUX1ZlY3RvcjsKKworCisgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKgorICAqICA8RW51bT4KKyAgKiAgICBGVF9QaXhlbF9Nb2RlCisgICoKKyAgKiAgPERlc2NyaXB0aW9uPgorICAqICAgIEFuIGVudW1lcmF0aW9uIHR5cGUgdXNlZCB0byBkZXNjcmliZSB0aGUgZm9ybWF0IG9mIHBpeGVscworICAqICAgIGluIGEgZ2l2ZW4gYml0bWFwLiBOb3RlIHRoYXQgYWRkaXRpb25hbCBmb3JtYXRzIG1heSBiZSBhZGRlZAorICAqICAgIGluIHRoZSBmdXR1cmUuCisgICoKKyAgKiAgPEZpZWxkcz4KKyAgKiAgICBmdF9waXhlbF9tb2RlX21vbm8gICA6OiBhIG1vbm9jaHJvbWUgYml0bWFwICgxIGJpdC9waXhlbCkKKyAgKgorICAqICAgIGZ0X3BpeGVsX21vZGVfZ3JheXMgIDo6IGFuIDgtYml0IGdyYXktbGV2ZWxzIGJpdG1hcC4gTm90ZSB0aGF0CisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHRvdGFsIG51bWJlciBvZiBncmF5IGxldmVscyBpcyBnaXZlbgorICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBgbnVtX2dyYXlzJyBmaWVsZCBvZiB0aGUgRlRfQml0bWFwCisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0dXJlLgorICAqCisgICogICAgZnRfcGl4ZWxfbW9kZV9wYWwyICAgOjogYSAyLWJpdCBwYWxldHRlZCBiaXRtYXAuCisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudGx5IHVudXNlZCBieSBGcmVlVHlwZS4KKyAgKgorICAqICAgIGZ0X3BpeGVsX21vZGVfcGFsNCAgIDo6IGEgNC1iaXQgcGFsZXR0ZWQgYml0bWFwLgorICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRseSB1bnVzZWQgYnkgRnJlZVR5cGUuCisgICoKKyAgKiAgICBmdF9waXhlbF9tb2RlX3BhbDggICA6OiBhbiA4LWJpdCBwYWxldHRlZCBiaXRtYXAuCisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudGx5IHVudXNlZCBieSBGcmVlVHlwZS4KKyAgKgorICAqICAgIGZ0X3BpeGVsX21vZGVfcmdiMTUgIDo6IGEgMTUtYml0IFJHQiBiaXRtYXAuIFVzZXMgNTo1OjUgZW5jb2RpbmcKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50bHkgdW51c2VkIGJ5IEZyZWVUeXBlLgorICAqCisgICogICAgZnRfcGl4ZWxfbW9kZV9yZ2IxNiAgOjogYSAxNi1iaXQgUkdCIGJpdG1hcC4gVXNlcyA1OjY6NSBlbmNvZGluZworICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRseSB1bnVzZWQgYnkgRnJlZVR5cGUuCisgICoKKyAgKiAgICBmdF9waXhlbF9tb2RlX3JnYjI0ICA6OiBhIDI0LWJpdCBSR0IgYml0bWFwLgorICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRseSB1bnVzZWQgYnkgRnJlZVR5cGUuCisgICoKKyAgKiAgICBmdF9waXhlbF9tb2RlX3JnYjMyICA6OiBhIDMyLWJpdCBSR0IgYml0bWFwLgorICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRseSB1bnVzZWQgYnkgRnJlZVR5cGUuCisgICoKKyAgKiA8Tm90ZT4KKyAgKiAgICBTb21lIGFudGktYWxpYXNlZCBiaXRtYXBzIG1pZ2h0IGJlIGVtYmVkZGVkIGluIFRydWVUeXBlIGZvbnRzCisgICogICAgdXNpbmcgZm9ybWF0cyBwYWwyIG9yIHBhbDQsIHRob3VnaCBubyBmb250cyBwcmVzZW50aW5nIHRob3NlCisgICogICAgaGF2ZSBiZWVuIGZvdW5kIHRvIGRhdGUuLgorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIAorICB0eXBlZGVmIGVudW0gRlRfUGl4ZWxfTW9kZV8KKyAgeworICAgIGZ0X3BpeGVsX21vZGVfbm9uZSA9IDAsCisgICAgZnRfcGl4ZWxfbW9kZV9tb25vLAorICAgIGZ0X3BpeGVsX21vZGVfZ3JheXMsCisgICAgZnRfcGl4ZWxfbW9kZV9wYWwyLAorICAgIGZ0X3BpeGVsX21vZGVfcGFsNCwKKyAgICBmdF9waXhlbF9tb2RlX3BhbDgsCisgICAgZnRfcGl4ZWxfbW9kZV9yZ2IxNSwKKyAgICBmdF9waXhlbF9tb2RlX3JnYjE2LAorICAgIGZ0X3BpeGVsX21vZGVfcmdiMjQsCisgICAgZnRfcGl4ZWxfbW9kZV9yZ2IzMiwKKyAgCisgICAgZnRfcGl4ZWxfbW9kZV9tYXggICAgICAvKiBkbyBub3QgcmVtb3ZlICovCisgICAgCisgIH0gRlRfUGl4ZWxfTW9kZTsKKworCisKKyAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqCisgICogIDxFbnVtPgorICAqICAgIEZUX1BhbGV0dGVfTW9kZQorICAqCisgICogIDxEZXNjcmlwdGlvbj4KKyAgKiAgICBBbiBlbnVtZXJhdGlvbiB0eXBlIHVzZWQgdG8gZGVzY3JpYmUgdGhlIGZvcm1hdCBvZiBhIGJpdG1hcAorICAqICAgIHBhbGV0dGUsIHVzZWQgd2l0aCBmdF9waXhlbF9tb2RlX3BhbDQgYW5kIGZ0X3BpeGVsX21vZGVfcGFsOAorICAqCisgICogIDxGaWVsZHM+CisgICogICAgZnRfcGFsZXR0ZV9tb2RlX3JnYiAgOjogdGhlIHBhbGV0dGUgaXMgYW4gYXJyYXkgb2YgMy1ieXRlcyBSR0IgcmVjb3JkcworICAqCisgICogICAgZnRfcGFsZXR0ZV9tb2RlX3JnYmEgOjogdGhlIHBhbGV0dGUgaXMgYW4gYXJyYXkgb2YgNC1ieXRlcyBSR0JBIHJlY29yZHMKKyAgKgorICAqICA8Tm90ZT4KKyAgKiAgICBBcyBmdF9waXhlbF9tb2RlX3BhbDIsIHBhbDQgYW5kIHBhbDggYXJlIGN1cnJlbnRseSB1bnVzZWQgYnkKKyAgKiAgICBGcmVlVHlwZSwgdGhlc2UgdHlwZXMgYXJlIG5vdCBoYW5kbGVkIGJ5IHRoZSBsaWJyYXJ5IGl0c2VsZi4KKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAKKyAgdHlwZWRlZiBlbnVtIEZUX1BhbGV0dGVfTW9kZV8KKyAgeworICAgIGZ0X3BhbGV0dGVfbW9kZV9yZ2IgPSAwLAorICAgIGZ0X3BhbGV0dGVfbW9kZV9yZ2JhLAorICAgIAorICAgIGZ0X3BhbGV0dHRlX21vZGVfbWF4ICAgLyogZG8gbm90IHJlbW92ZSAqLworICAKKyAgfSBGVF9QYWxldHRlX01vZGU7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAqICAgIEZUX0JpdG1hcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAqICAgIEEgc3RydWN0dXJlIHVzZWQgdG8gZGVzY3JpYmUgYSBiaXRtYXAgb3IgcGl4bWFwIHRvIHRoZSByYXN0ZXIuICAgICAgIAorICAgKiAgICBOb3RlIHRoYXQgd2Ugbm93IG1hbmFnZSBwaXhtYXBzIG9mIHZhcmlvdXMgZGVwdGhzIHRocm91Z2ggdGhlICAgICAgICAKKyAgICogICAgYHBpeGVsX21vZGUnIGZpZWxkLgorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAqICAgIHJvd3MgICAgICAgICA6OiBUaGUgbnVtYmVyIG9mIGJpdG1hcCByb3dzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAqICAgIHdpZHRoICAgICAgICA6OiBUaGUgbnVtYmVyIG9mIHBpeGVscyBpbiBiaXRtYXAgcm93LiAgICAgICAgICAgICAgICAgICAgICAKKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAqICAgIHBpdGNoICAgICAgICA6OiBUaGUgcGl0Y2gncyBhYnNvbHV0ZSB2YWx1ZSBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzICAgICAgICAKKyAgICogICAgICAgICAgICAgICAgICAgIHRha2VuIGJ5IG9uZSBiaXRtYXAgcm93LCBpbmNsdWRpbmcgcGFkZGluZy4gSG93ZXZlciwgICAgIAorICAgKiAgICAgICAgICAgICAgICAgICAgdGhlIHBpdGNoIGlzIHBvc2l0aXZlIHdoZW4gdGhlIGJpdG1hcCBoYXMgYSBgZG93bicgICAgICAgCisgICAqICAgICAgICAgICAgICAgICAgICBmbG93LCBhbmQgbmVnYXRpdmUgd2hlbiBpdCBoYXMgYW4gYHVwJyBmbG93LiBJbiBhbGwgICAgICAKKyAgICogICAgICAgICAgICAgICAgICAgIGNhc2VzLCB0aGUgcGl0Y2ggaXMgYW4gb2Zmc2V0IHRvIGFkZCB0byBhIGJpdG1hcCAgICAgICAgIAorICAgKiAgICAgICAgICAgICAgICAgICAgcG9pbnRlciBpbiBvcmRlciB0byBnbyBkb3duIG9uZSByb3cuICAgICAgICAgICAgICAgICAgICAgCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgKiAgICBidWZmZXIgICAgICAgOjogQSB0eXBlbGVzcyBwb2ludGVyIHRvIHRoZSBiaXRtYXAgYnVmZmVyLiBUaGlzIHZhbHVlICAgICAgCisgICAqICAgICAgICAgICAgICAgICAgICBzaG91bGQgYmUgYWxpZ25lZCBvbiAzMi1iaXQgYm91bmRhcmllcyBpbiBtb3N0IGNhc2VzLiAgICAKKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAqICAgIG51bV9ncmF5cyAgICA6OiB0aGlzIGZpZWxkIGlzIG9ubHkgdXNlZCB3aXRoIGZ0X3BpeGVsX21vZGVfZ3JheXMsICAgICAgCisgICAqICAgICAgICAgICAgICAgICAgICBpdCBnaXZlcyB0aGUgbnVtYmVyIG9mIGdyYXkgbGV2ZWxzIHVzZWQgaW4gdGhlICAgICAgICAgCisgICAqICAgICAgICAgICAgICAgICAgICBiaXRtYXAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgKiAgICBwaXhlbF9tb2RlICAgOjogdGhlIHBpeGVsX21vZGUsIGkuZS4gaG93IHBpeGVsIGJpdHMgYXJlIHN0b3JlZCAgICAgICAgIAorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICogICAgcGFsZXR0ZV9tb2RlIDo6IHRoaXMgZmllbGQgaXMgb25seSB1c2VkIHdpdGggcGFsZXR0ZWQgcGl4ZWwgbW9kZXMsICAgCisgICAqICAgICAgICAgICAgICAgICAgICBpdCBpbmRpY2F0ZXMgaG93IHRoZSBwYWxldHRlIGlzIHN0b3JlZCAgICAgICAgICAgICAgIAorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICogICAgcGFsZXR0ZSAgICAgIDo6IGEgdHlwZWxlc3MgcG9pbnRlciB0byB0aGUgYml0bWFwIHBhbGV0dGUuIG9ubHkgdXNlZAorICAgKiAgICAgICAgICAgICAgICAgICAgZm9yIHBhbGV0dGVkIHBpeGVsIG1vZGVzLgorICAgKgorICAgKiA8Tm90ZT4KKyAgICogICBXaGVuIHVzaW5nIHBpeGVsIG1vZGVzIHBhbDIsIHBhbDQgYW5kIHBhbDggd2l0aCBhIHZvaWQgYHBhbGV0dGUnCisgICAqICAgZmllbGQsIGEgZ3JheSBwaXhtYXAgd2l0aCByZXNwZWN0aXZlbHkgNCwgMTYgYW5kIDI1NiBsZXZlbHMgb2YgZ3JheQorICAgKiAgIGlzIGFzc3VtZWQuIFRoaXMsIGluIG9yZGVyIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBzb21lIGVtYmVkZGVkIGJpdG1hcAorICAgKiAgIGZvcm1hdHMgZGVmaW5lZCBpbiB0aGUgVHJ1ZVR5cGUgc3BlYy4KKyAgICoKKyAgICogICBOb3RlIHRoYXQgbm8gZm9udCB3YXMgZm91bmQgcHJlc2VudGluZyBzdWNoIGVtYmVkZGVkIGJpdG1hcHMsIHNvIHRoaXMKKyAgICogICBpcyBjdXJyZW50bHkgY29tcGxldGVseSB1bmhhbmRsZWQgYnkgdGhlIGxpYnJhcnkuCisgICAqCisgICAqCisgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgCisgIHR5cGVkZWYgc3RydWN0IEZUX0JpdG1hcF8KKyAgeworICAgIGludCAgICByb3dzOworICAgIGludCAgICB3aWR0aDsKKyAgICBpbnQgICAgcGl0Y2g7CisgICAgdm9pZCogIGJ1ZmZlcjsKKyAgICBzaG9ydCAgbnVtX2dyYXlzOworICAgIGNoYXIgICBwaXhlbF9tb2RlOworICAgIGNoYXIgICBwYWxldHRlX21vZGU7CisgICAgdm9pZCogIHBhbGV0dGU7CisKKyAgfSBGVF9CaXRtYXA7CisKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX091dGxpbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gZGVzY3JpYmUgYW4gb3V0bGluZSB0byB0aGUgc2Nhbi1saW5lICAgICAqLworICAvKiAgICBjb252ZXJ0ZXIuICBJdCdzIGEgY29weSBvZiB0aGUgVFRfT3V0bGluZSB0eXBlIHRoYXQgd2FzIGRlZmluZWQgICAgKi8KKyAgLyogICAgaW4gRnJlZVR5cGUgMS54LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbl9jb250b3VycyAgICAgOjogVGhlIG51bWJlciBvZiBjb250b3VycyBpbiB0aGUgb3V0bGluZS4gICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBuX3BvaW50cyAgICAgICA6OiBUaGUgbnVtYmVyIG9mIHBvaW50cyBpbiB0aGUgb3V0bGluZS4gICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHBvaW50cyAgICAgICAgIDo6IEEgcG9pbnRlciB0byBhbiBhcnJheSBvZiBgbl9wb2ludHMnIEZUX1ZlY3RvciAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50cywgZ2l2aW5nIHRoZSBvdXRsaW5lJ3MgcG9pbnQgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgY29vcmRpbmF0ZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBmbGFncyAgICAgICAgICA6OiBBIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgYG5fcG9pbnRzJyBjaGFycywgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgZ2l2aW5nIGVhY2ggb3V0bGluZSBwb2ludCdzIHR5cGUuICBJZiBiaXQgMCBpcyAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgIHNldCwgdGhlIHBvaW50IGlzIGBvZmYnIHRoZSBjdXJ2ZSwgaS5lLiwgYSAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICBCZXppZXIgY29udHJvbCBwb2ludCwgd2hpbGUgaXQgaXMgYG9uJyB3aGVuICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgdW5zZXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICBCaXQgMSBpcyBtZWFuaW5nZnVsIGZvciBgb2ZmJyBwb2ludHMgb25seS4gIElmICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgc2V0LCBpdCBpbmRpY2F0ZXMgYSB0aGlyZC1vcmRlciBCZXppZXIgYXJjICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgcG9pbnQ7IGFuZCBhIHNlY29uZC1vcmRlciBjb250cm9sIHBvaW50ICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICBpZiB1bnNldC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGNvbnRvdXJzICAgICAgIDo6IEFuIGFycmF5IG9mIGBuX2NvbnRvdXJzJyBzaG9ydHMsIGdpdmluZyB0aGUgZW5kICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICBwb2ludCBvZiBlYWNoIGNvbnRvdXIgd2l0aGluIHRoZSBvdXRsaW5lLiAgRm9yICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgZXhhbXBsZSwgdGhlIGZpcnN0IGNvbnRvdXIgaXMgZGVmaW5lZCBieSB0aGUgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgIHBvaW50cyBgMCcgdG8gYGNvbnRvdXJzWzBdJywgdGhlIHNlY29uZCBvbmUgaXMgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICBkZWZpbmVkIGJ5IHRoZSBwb2ludHMgYGNvbnRvdXJzWzBdKzEnIHRvICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgYGNvbnRvdXJzWzFdJywgZXRjLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBvd25lciAgICAgICAgICA6OiBUaGlzIGZsYWcgaXMgYSBib29sZWFuIHdoaWNoIGlzIHNldCB3aGVuZXZlciB0aGUgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgb3V0bGluZSBzdHJ1Y3R1cmUvb2JqZWN0IG93bnMgdGhlIGFycmF5cyBpdCAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgIHJlZmVycyB0byBpbiB0aGUgZmllbGRzIGBwb2ludHMnLCBgZmxhZ3MnLCBhbmQgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICBgY29udG91cnMnLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGhpZ2hfcHJlY2lzaW9uIDo6IFRoaXMgZmxhZyBpcyBzZXQgYXV0b21hdGljYWxseSBieSB0aGUgRnJlZVR5cGUgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICBsaWJyYXJ5LiAgSXQgaW5kaWNhdGVzIHRoYXQgdGhlIHNjYW4tbGluZSAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgY29udmVydGVyIHNob3VsZCB1c2UgYSBoaWdoZXIgcHJlY2lzaW9uIHdoZW4gICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgIHJlbmRlcmluZyB0aGUgb3V0bGluZS4gIFRoaXMgaXMgdXNlZnVsIGF0IHNtYWxsICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICBwaXhlbCBzaXplcyB0byBnZXQgYWRlcXVhdGUgcmVzdWx0cywgdGhvdWdoIGF0ICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgdGhlIHByaWNlIG9mIHNsb3dlciByZW5kZXJpbmcuICBEb24ndCB0cnkgdG8gICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgIHJlbmRlciBsYXJnZSBvdXRsaW5lcyB3aXRoIHRoaXMgZmxhZyBzZXQuICBOb3RlICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICB0aGF0IGl0IG1heSBiZSBpZ25vcmVkIGluIGxhdGVyIGltcGxlbWVudGF0aW9ucy4gKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHNlY29uZF9wYXNzICAgIDo6IEEgYm9vbGVhbiB3aGljaCBpcyBzZXQgd2hlbiB0aGUgc2Nhbi1saW5lICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZXIgc2hvdWxkIHBlcmZvcm0gYSBzZWNvbmQgcGFzcyB0byAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgZWxpbWluYXRlIHZlcnRpY2FsIGRyb3Atb3V0cyAob25seSB2ZXJ0aWNhbCAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgIGRyb3Atb3V0cyBhcmUgY2hlY2tlZCBvbiB0aGUgZmlyc3QgcGFzcykuICBUaGlzICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICBmaWVsZCBtYXkgYmUgaWdub3JlZCBieSBsYXRlciBpbXBsZW1lbnRhdGlvbnMuICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGRyb3BvdXRfbW9kZSAgIDo6IFNwZWNpZmllcyB0aGUgZHJvcC1vdXQgY29udHJvbCBtb2RlIHRvIHVzZSB3aGlsZSAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICByZW5kZXJpbmcgYW4gb3V0bGluZS4gIFZhbGlkIHZhbHVlcyBhcmUgMCAobm8gICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgZHJvcCBvdXQgY2hlY2spLCAxLCAyLCA0LCBhbmQgNS4gIFNlZSB0aGUgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgIFRydWVUeXBlIHNwZWNpZmljYXRpb24gZm9yIG1vcmUgZGV0YWlscy4gIEEgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBvZiAyIGlzIHVzdWFsbHkgYW4gZXhjZWxsZW50IGdlbmVyaWMgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgY2hvaWNlLiBUaGlzIGZpZWxkIG1heSBiZSBpZ25vcmVkIGJ5IHNvbWUgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgIHJhc3RlciBpbXBsZW1lbnRhdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgc3RydWN0ICBGVF9PdXRsaW5lXworICB7CisgICAgc2hvcnQgICAgICAgbl9jb250b3VyczsgICAgICAvKiBudW1iZXIgb2YgY29udG91cnMgaW4gZ2x5cGggICAgICAgICovCisgICAgc2hvcnQgICAgICAgbl9wb2ludHM7ICAgICAgICAvKiBudW1iZXIgb2YgcG9pbnRzIGluIHRoZSBnbHlwaCAgICAgICovCisKKyAgICBGVF9WZWN0b3IqICBwb2ludHM7ICAgICAgICAgIC8qIHRoZSBvdXRsaW5lJ3MgcG9pbnRzICAgICAgICAgICAgICAgKi8KKyAgICBjaGFyKiAgICAgICBmbGFnczsgICAgICAgICAgIC8qIHRoZSBwb2ludHMgZmxhZ3MgICAgICAgICAgICAgICAgICAgKi8KKyAgICBzaG9ydCogICAgICBjb250b3VyczsgICAgICAgIC8qIHRoZSBjb250b3VyIGVuZCBwb2ludHMgICAgICAgICAgICAgKi8KKworICAgIGNoYXIgICAgICAgIG93bmVyOyAgICAgICAgICAgLyogdGhlIG91dGxpbmUgb3ducyB0aGUgY29vcmRpbmF0ZXMsICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZmxhZ3MsIGFuZCBjb250b3VycyBhcnJheSBpdCB1c2VzICAqLworCisgICAgY2hhciAgICAgICAgaGlnaF9wcmVjaXNpb247ICAvKiBoaWdoIHByZWNpc2lvbiByZW5kZXJpbmcgICAgICAgICAgICovCisgICAgY2hhciAgICAgICAgc2Vjb25kX3Bhc3M7ICAgICAvKiB0d28gc3dlZXBzIHJlbmRlcmluZyAgICAgICAgICAgICAgICovCisgICAgY2hhciAgICAgICAgZHJvcG91dF9tb2RlOyAgICAvKiBkcm9wb3V0IG1vZGUgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgfSBGVF9PdXRsaW5lOworCisKKyNkZWZpbmUgRlRfQ1VSVkVfVEFHKCBmbGFnICkgIChmbGFnICYgMykKKworI2RlZmluZSBGVF9DdXJ2ZV9UYWdfT24gICAgICAgMQorI2RlZmluZSBGVF9DdXJ2ZV9UYWdfQ29uaWMgICAgMAorI2RlZmluZSBGVF9DdXJ2ZV9UYWdfQ3ViaWMgICAgMgorCisjZGVmaW5lIEZUX0N1cnZlX1RhZ19Ub3VjaF9YICA4ICAgLyogcmVzZXJ2ZWQgZm9yIHRoZSBUcnVlVHlwZSBoaW50ZXIgKi8KKyNkZWZpbmUgRlRfQ3VydmVfVGFnX1RvdWNoX1kgIDE2ICAvKiByZXNlcnZlZCBmb3IgdGhlIFRydWVUeXBlIGhpbnRlciAqLworCisjZGVmaW5lIEZUX0N1cnZlX1RhZ19Ub3VjaF9Cb3RoICAoIEZUX0N1cnZlX1RhZ19Ub3VjaF9YIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9DdXJ2ZV9UYWdfVG91Y2hfWSkKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9PdXRsaW5lX01vdmVUb19GdW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBIGZ1bmN0aW9uIHBvaW50ZXIgdHlwZSB1c2VkIHRvIGRlc2NyaWJlIHRoZSBzaWduYXR1cmUgb2YgYSBgbW92ZSAgKi8KKyAgLyogICAgdG8nIGZ1bmN0aW9uIGR1cmluZyBvdXRsaW5lIHdhbGtpbmcvZGVjb21wb3NpdGlvbi4gICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBIGBtb3ZlIHRvJyBpcyBlbWl0dGVkIHRvIHN0YXJ0IGEgbmV3IGNvbnRvdXIgaW4gYW4gb3V0bGluZS4gICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB0byAgIDo6IEEgcG9pbnRlciB0byB0aGUgdGFyZ2V0IHBvaW50IG9mIHRoZSBgbW92ZSB0bycuICAgICAgICAgICAgKi8KKyAgLyogICAgdXNlciA6OiBBIHR5cGVsZXNzIHBvaW50ZXIgd2hpY2ggaXMgcGFzc2VkIGZyb20gdGhlIGNhbGxlciBvZiB0aGUgICovCisgIC8qICAgICAgICAgICAgZGVjb21wb3NpdGlvbiBmdW5jdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBpbnQgICgqRlRfT3V0bGluZV9Nb3ZlVG9fRnVuYykoIEZUX1ZlY3RvciogIHRvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICAgdXNlciApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY1R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfT3V0bGluZV9MaW5lVG9fRnVuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSBmdW5jdGlvbiBwb2ludGVyIHR5cGUgdXNlZCB0byBkZXNjcmliZSB0aGUgc2lnbmF0dXJlIG9mIGEgYGxpbmUgICovCisgIC8qICAgIHRvJyBmdW5jdGlvbiBkdXJpbmcgb3V0bGluZSB3YWxraW5nL2RlY29tcG9zaXRpb24uICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSBgbGluZSB0bycgaXMgZW1pdHRlZCB0byBpbmRpY2F0ZSBhIHNlZ21lbnQgaW4gdGhlIG91dGxpbmUuICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgdG8gICA6OiBBIHBvaW50ZXIgdG8gdGhlIHRhcmdldCBwb2ludCBvZiB0aGUgYGxpbmUgdG8nLiAgICAgICAgICAgICovCisgIC8qICAgIHVzZXIgOjogQSB0eXBlbGVzcyBwb2ludGVyIHdoaWNoIGlzIHBhc3NlZCBmcm9tIHRoZSBjYWxsZXIgb2YgdGhlICAqLworICAvKiAgICAgICAgICAgIGRlY29tcG9zaXRpb24gZnVuY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBFcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgaW50ICAoKkZUX091dGxpbmVfTGluZVRvX0Z1bmMpKCBGVF9WZWN0b3IqICB0bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgIHVzZXIgKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmNUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX091dGxpbmVfQ29uaWNUb19GdW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgZnVuY3Rpb24gcG9pbnRlciB0eXBlIHVzZSB0byBkZXNjcmliZSB0aGUgc2lnbmF0dXJlIG9mIGEgYGNvbmljICAqLworICAvKiAgICB0bycgZnVuY3Rpb24gZHVyaW5nIG91dGxpbmUgd2Fsa2luZy9kZWNvbXBvc2l0aW9uLiAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgYGNvbmljIHRvJyBpcyBlbWl0dGVkIHRvIGluZGljYXRlIGEgc2Vjb25kLW9yZGVyIEJlemllciBhcmMgaW4gICAqLworICAvKiAgICB0aGUgb3V0bGluZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBjb250cm9sIDo6IEFuIGludGVybWVkaWF0ZSBjb250cm9sIHBvaW50IGJldHdlZW4gdGhlIGxhc3QgcG9zaXRpb24gKi8KKyAgLyogICAgICAgICAgICAgICBhbmQgdGhlIG5ldyB0YXJnZXQgaW4gYHRvJy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB0byAgICAgIDo6IEEgcG9pbnRlciB0byB0aGUgdGFyZ2V0IGVuZCBwb2ludCBvZiB0aGUgY29uaWMgYXJjLiAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHVzZXIgICAgOjogQSB0eXBlbGVzcyBwb2ludGVyIHdoaWNoIGlzIHBhc3NlZCBmcm9tIHRoZSBjYWxsZXIgb2YgICAqLworICAvKiAgICAgICAgICAgICAgIHRoZSBkZWNvbXBvc2l0aW9uIGZ1bmN0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBFcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgaW50ICAoKkZUX091dGxpbmVfQ29uaWNUb19GdW5jKSggRlRfVmVjdG9yKiAgY29udHJvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9WZWN0b3IqICB0bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICB1c2VyICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9PdXRsaW5lX0N1YmljVG9fRnVuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBIGZ1bmN0aW9uIHBvaW50ZXIgdHlwZSB1c2VkIHRvIGRlc2NyaWJlIHRoZSBzaWduYXR1cmUgb2YgYSBgY3ViaWMgKi8KKyAgLyogICAgdG8nIGZ1bmN0aW9uIGR1cmluZyBvdXRsaW5lIHdhbGtpbmcvZGVjb21wb3NpdGlvbi4gICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBIGBjdWJpYyB0bycgaXMgZW1pdHRlZCB0byBpbmRpY2F0ZSBhIHRoaXJkLW9yZGVyIEJlemllciBhcmMuICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBjb250cm9sMSA6OiBBIHBvaW50ZXIgdG8gdGhlIGZpcnN0IEJlemllciBjb250cm9sIHBvaW50LiAgICAgICAgICAgKi8KKyAgLyogICAgY29udHJvbDIgOjogQSBwb2ludGVyIHRvIHRoZSBzZWNvbmQgQmV6aWVyIGNvbnRyb2wgcG9pbnQuICAgICAgICAgICovCisgIC8qICAgIHRvICAgICAgIDo6IEEgcG9pbnRlciB0byB0aGUgdGFyZ2V0IGVuZCBwb2ludC4gICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB1c2VyICAgICA6OiBBIHR5cGVsZXNzIHBvaW50ZXIgd2hpY2ggaXMgcGFzc2VkIGZyb20gdGhlIGNhbGxlciBvZiAgKi8KKyAgLyogICAgICAgICAgICAgICAgdGhlIGRlY29tcG9zaXRpb24gZnVuY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIGludCAgKCpGVF9PdXRsaW5lX0N1YmljVG9fRnVuYykoIEZUX1ZlY3RvciogIGNvbnRyb2wxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1ZlY3RvciogIGNvbnRyb2wyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1ZlY3RvciogIHRvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgIHVzZXIgKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX091dGxpbmVfRnVuY3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgc3RydWN0dXJlIHRvIGhvbGQgdmFyaW91cyBmdW5jdGlvbiBwb2ludGVycyB1c2VkIGR1cmluZyBvdXRsaW5lICAqLworICAvKiAgICBkZWNvbXBvc2l0aW9uIGluIG9yZGVyIHRvIGVtaXQgc2VnbWVudHMsIGNvbmljLCBhbmQgY3ViaWMgQmV6aWVycywgKi8KKyAgLyogICAgYXMgd2VsbCBhcyBgbW92ZSB0bycgYW5kIGBjbG9zZSB0bycgb3BlcmF0aW9ucy4gICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbW92ZV90byAgOjogVGhlIGBtb3ZlIHRvJyBlbWl0dGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGxpbmVfdG8gIDo6IFRoZSBzZWdtZW50IGVtaXR0ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBjb25pY190byA6OiBUaGUgc2Vjb25kLW9yZGVyIEJlemllciBhcmMgZW1pdHRlci4gICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgY3ViaWNfdG8gOjogVGhlIHRoaXJkLW9yZGVyIEJlemllciBhcmMgZW1pdHRlci4gICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHN0cnVjdCAgRlRfT3V0bGluZV9GdW5jc18KKyAgeworICAgIEZUX091dGxpbmVfTW92ZVRvX0Z1bmMgICBtb3ZlX3RvOworICAgIEZUX091dGxpbmVfTGluZVRvX0Z1bmMgICBsaW5lX3RvOworICAgIEZUX091dGxpbmVfQ29uaWNUb19GdW5jICBjb25pY190bzsKKyAgICBGVF9PdXRsaW5lX0N1YmljVG9fRnVuYyAgY3ViaWNfdG87CisKKyAgfSBGVF9PdXRsaW5lX0Z1bmNzOworCisKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE1hY3JvPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0lNQUdFX1RBRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoaXMgbWFjcm8gY29udmVydHMgZm91ciBsZXR0ZXIgdGFncyB3aGljaCBhcmUgdXNlZCB0byBsYWJlbCAgICAgICAqLworICAvKiAgICBUcnVlVHlwZSB0YWJsZXMgaW50byBhbiB1bnNpZ25lZCBsb25nIHRvIGJlIHVzZWQgd2l0aGluIEZyZWVUeXBlLiAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZUX0lNQUdFX1RBRyggX3gxLCBfeDIsIF94MywgX3g0ICkgXAorICAgICAgICAgICgoKHVuc2lnbmVkIGxvbmcpX3gxIDw8IDI0KSB8ICAgICAgICBcCisgICAgICAgICAgICgodW5zaWduZWQgbG9uZylfeDIgPDwgMTYpIHwgICAgICAgIFwKKyAgICAgICAgICAgKCh1bnNpZ25lZCBsb25nKV94MyA8PCA4KSAgfCAgICAgICAgXAorICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpX3g0KQorCisKKyAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKgorICAqIDxFbnVtPgorICAqICAgIEZUX0dseXBoX1RhZworICAqCisgICogPERlc2NyaXB0aW9uPgorICAqICAgIEFuIGVudW1lcmF0aW9uIHR5cGUgdXNlZCB0byBkZXNjcmliZXRoZSBmb3JtYXQgb2YgYSBnaXZlbiBnbHlwaAorICAqICAgIGltYWdlLiBOb3RlIHRoYXQgdGhpcyB2ZXJzaW9uIG9mIEZyZWVUeXBlIG9ubHkgc3VwcG9ydHMgdHdvIGltYWdlCisgICogICAgZm9ybWF0cywgZXZlbiB0aG91Z2ggZnV0dXJlIGZvbnQgZHJpdmVycyB3aWxsIGJlIGFibGUgdG8gcmVnaXN0ZXIKKyAgKiAgICB0aGVpciBvd24gZm9ybWF0LgorICAqCisgICogPEZpZWxkcz4KKyAgKiAgICBmdF9nbHlwaF9mb3JtYXRfYml0bWFwICA6OiB0aGUgZ2x5cGggaW1hZ2UgaXMgYSBiaXRtYXAsIGFuZCBjYW4KKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBkZXNjcmliZWQgYXMgYSBGVF9CaXRtYXAKKyAgKgorICAqICAgIGZ0X2dseXBoX2Zvcm1hdF9vdXRsaW5lIDo6IHRoZSBnbHlwaCBpbWFnZSBpcyBhIHZlY3RvcmlhbCBpbWFnZQorICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hZGUgb2YgYmV6aWVyIGNvbnRyb2wgcG9pbnRzLCBhbmQgY2FuCisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgZGVzY3JpYmVkIGFzIGEgRlRfT3V0bGluZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAKKyAgdHlwZWRlZiBlbnVtIEZUX0dseXBoX1RhZ18KKyAgeworICAgIGZ0X2dseXBoX2Zvcm1hdF9ub25lICAgICAgPSAwLAorICAgIGZ0X2dseXBoX2Zvcm1hdF9jb21wb3NpdGUgPSBGVF9JTUFHRV9UQUcoJ2MnLCdvJywnbScsJ3AnKSwKKyAgICBmdF9nbHlwaF9mb3JtYXRfYml0bWFwICAgID0gRlRfSU1BR0VfVEFHKCdiJywnaScsJ3QnLCdzJyksCisgICAgZnRfZ2x5cGhfZm9ybWF0X291dGxpbmUgICA9IEZUX0lNQUdFX1RBRygnbycsJ3UnLCd0JywnbCcpCisgIAorICB9IEZUX0dseXBoX1RhZzsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX1Jhc3RlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgaGFuZGxlIChwb2ludGVyKSB0byBhIHJhc3RlciBvYmplY3QuICBFYWNoIG9iamVjdCBjYW4gYmUgdXNlZCAgICAqLworICAvKiAgICBpbmRlcGVuZGVudGx5IHRvIGNvbnZlcnQgYW4gb3V0bGluZSBpbnRvIGEgYml0bWFwIG9yIHBpeG1hcC4gICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgc3RydWN0IEZUX1Jhc3RlclJlY18qICBGVF9SYXN0ZXI7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9SYXN0ZXJfSW5pdF9Qcm9jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBJbml0aWFsaXplcyBhIGZyZXNoIHJhc3RlciBvYmplY3Qgd2hpY2ggc2hvdWxkIGhhdmUgYmVlbiBhbGxvY2F0ZWQgKi8KKyAgLyogICAgYnkgY2xpZW50IGFwcGxpY2F0aW9ucy4gIFRoaXMgZnVuY3Rpb24gaXMgYWxzbyB1c2VkIHRvIHNldCB0aGUgICAgICovCisgIC8qICAgIG9iamVjdCdzIHJlbmRlciBwb29sLiAgSXQgY2FuIGJlIHVzZWQgcmVwZWF0ZWRseSBvbiBhIHNpbmdsZSAgICAgICAqLworICAvKiAgICBvYmplY3QgaWYgb25lIHdhbnRzIHRvIGNoYW5nZSB0aGUgcG9vbCdzIGFkZHJlc3Mgb3Igc2l6ZS4gICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIE5vdGUgdGhhdCB0aGUgcmVuZGVyIHBvb2wgaGFzIG5vIHN0YXRlIGFuZCBpcyBvbmx5IHVzZWQgZHVyaW5nIGEgICAqLworICAvKiAgICBjYWxsIHRvIEZUX1Jhc3Rlcl9SZW5kZXIoKS4gIEl0IGlzIHRodXMgdGhlb3JpY2FsbHkgcG9zc2libGUgdG8gICAgKi8KKyAgLyogICAgc2hhcmUgaXQgYmV0d2VlbiBzZXZlcmFsIG5vbi1jb25jdXJyZW50IGNvbXBvbmVudHMgb2YgeW91ciAgICAgICAgICovCisgIC8qICAgIGFwcGxpY2F0aW9ucyB3aGVuIG1lbW9yeSBpcyBhIHNjYXJjZSByZXNvdXJjZS4gICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHJhc3RlciAgICA6OiBhIGhhbmRsZSB0byB0aGUgdGFyZ2V0IHJhc3RlciBvYmplY3QuICAgICAgICAgICAgICAgICAqLworICAvKiAgICBwb29sX2Jhc2UgOjogdGhlIHJlbmRlciBwb29sJ3MgYmFzZSBhZGRyZXNzIGluIG1lbW9yeSAgICAgICAgICAgICAgKi8KKyAgLyogICAgcG9vbF9zaXplIDo6IHRoZSByZW5kZXIgcG9vbCdzIHNpemUgaW4gYnl0ZXMuICB0aGlzIG11c3QgYmUgYXQgICAgICovCisgIC8qICAgICAgICAgICAgICAgICBsZWFzdCA0IGtCeXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQW4gZXJyb3IgY29uZGl0aW9uLCB1c2VkIGFzIGEgRlRfRXJyb3IgaW4gdGhlIEZyZWVUeXBlIGxpYnJhcnkuICAgICovCisgIC8qICAgIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBpbnQgKCpGVF9SYXN0ZXJfSW5pdF9Qcm9jKSggRlRfUmFzdGVyICAgIHJhc3RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogIHBvb2xfYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyAgICAgICAgIHBvb2xfc2l6ZSApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY1R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfUmFzdGVyX1NldF9Nb2RlX1Byb2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgU29tZSByYXN0ZXIgaW1wbGVtZW50YXRpb25zIG1heSBoYXZlIHNldmVyYWwgbW9kZXMgb2Ygb3BlcmF0aW9uLiAgICovCisgIC8qICAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBzZWxlY3Qgb25lIG9mIHRoZW0sIGFzIHdlbGwgYXMgcGFzcyBzb21lICAqLworICAvKiAgICBhcmd1bWVudHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICByYXN0ZXIgIDo6IFRoZSB0YXJnZXQgcmFzdGVyIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG1vZGUgICAgOjogQSBwb2ludGVyIHVzZWQgdG8gZGVzY3JpYmUgdGhlIG1vZGUgdG8gc2V0LiBUaGlzIGlzICAgICAqLworICAvKiAgICAgICAgICAgICAgIGNvbXBsZXRlbHkgcmFzdGVyLXNwZWNpZmljLCBhbmQgY291bGQgYmUsIGZvciBleGFtcGxlLCAgKi8KKyAgLyogICAgICAgICAgICAgICBhIHRleHQgc3RyaW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBhcmdzICAgIDo6IEFuIGFyZ3VtZW50IHRvIHRoZSBzZXRfbW9kZSBjb21tYW5kLiBUaGlzIGlzIGNvbXBsZXRlbHkgKi8KKyAgLyogICAgICAgICAgICAgICBzcGVjaWZpYyB0byB0aGUgcmFzdGVyIGFuZCB0aGUgbW9kZSB1c2VkLiAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQW4gZXJyb3IgY29kZSwgdXNlZCBhcyBhIEZUX0Vycm9yIGJ5IHRoZSBGcmVlVHlwZSBsaWJyYXJ5LiAgICAgICAgICovCisgIC8qICAgIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBpbnQgKCpGVF9SYXN0ZXJfU2V0X01vZGVfUHJvYykoIEZUX1Jhc3RlciAgICByYXN0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICBhcmdzICk7CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAqIDxGdW5jVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICogICAgRlRfUmFzdGVyX1JlbmRlcl9Qcm9jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAqIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICogICAgUmVuZGVycyBhbiBvdXRsaW5lIGludG8gYSB0YXJnZXQgYml0bWFwL3BpeG1hcC4gICAgICAgICAgICAgICAgICAgIAorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAqIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICogICAgcmFzdGVyICAgICAgICA6OiBBIGhhbmRsZSB0byBhIHJhc3RlciBvYmplY3QgdXNlZCBkdXJpbmcgcmVuZGVyaW5nLgorICAgKgorICAgKiAgICBzb3VyY2VfaW1hZ2UgIDo6IGEgdHlwZWxlc3MgcG9pbnRlciB0byB0aGUgc291cmNlIGdseXBoIGltYWdlLgorICAgKiAgICAgICAgICAgICAgICAgICAgICh1c3VhbGx5IGEgRlRfT3V0bGluZSopLgorICAgKgorICAgKiAgICB0YXJnZXRfYml0bWFwIDo6IGRlc2NyaXB0b3IgdG8gdGhlIHRhcmdldCBiaXRtYXAuCisgICAqCisgICAqIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICogICAgRXJyb3IgY29kZSwgaW50ZXJwcmV0ZWQgYXMgYSBGVF9FcnJvciBieSBGcmVlVHlwZSBsaWJyYXJ5LiAgICAgICAgIAorICAgKiAgICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAKKyAgdHlwZWRlZiBpbnQgICgqRlRfUmFzdGVyX1JlbmRlcl9Qcm9jKSggRlRfUmFzdGVyICAgICAgIHJhc3RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICAgICAgIHNvdXJjZV9pbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQml0bWFwKiAgICAgIHRhcmdldF9iaXRtYXAgKTsKKworCisgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICoKKyAgKiA8U3RydWN0PgorICAqICAgIEZUX1Jhc3Rlcl9JbnRlcmZhY2UKKyAgKgorICAqIDxEZXNjcmlwdGlvbj4KKyAgKiAgICBBIHN0cnVjdHVyZSB1c2VkIHRvIG1vZGVsIHRoZSBkZWZhdWx0IHJhc3RlciBpbnRlcmZhY2UuIEEgcmFzdGVyCisgICogICAgaXMgYSBtb2R1bGUgaW4gY2hhcmdlIG9mIGNvbnZlcnRpbmcgYSBnbHlwaCBpbWFnZSBpbnRvIGEgYml0bWFwLgorICAqIAorICAqIDxGaWVsZHM+CisgICogICAgc2l6ZSAgICAgIDo6IHRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSBnaXZlbiByYXN0ZXIgb2JqZWN0LiBUaGlzCisgICogICAgICAgICAgICAgICAgIGlzIHVzZWQgdG8gYWxsb2NhdGUgYSBuZXcgcmFzdGVyIHdoZW4gY2FsbGluZworICAqICAgICAgICAgICAgICAgICBgRlRfU2V0X1Jhc3RlcicuCisgICoKKyAgKiAgICBmb3JtYXQgICAgOjogdGhlIHNvdXJjZSBnbHlwaCBpbWFnZSBmb3JtYXQgdGhpcyByYXN0ZXIgaXMgYWJsZSB0bworICAqICAgICAgICAgICAgICAgICBoYW5kbGUuCisgICoKKyAgKiAgICBpbml0ICAgICAgOjogdGhlIHJhc3RlcidzIGluaXRpYWxpc2F0aW9uIHJvdXRpbmUKKyAgKgorICAqICAgIHNldF9tb2RlICA6OiB0aGUgcmFzdGVyJ3MgbW9kZSBzZXQgcm91dGluZQorICAqCisgICogICAgcmVuZGVyICAgIDo6IHRoZSByYXN0ZXIncyByZW5kZXJpbmcgcm91dGluZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAKKyAgdHlwZWRlZiBzdHJ1Y3QgRlRfUmFzdGVyX0ludGVyZmFjZV8KKyAgeworICAgIGxvbmcgICAgICAgICAgICAgICAgICAgICBzaXplOworICAgIEZUX0dseXBoX1RhZyAgICAgICAgICAgICBmb3JtYXRfdGFnOworICAgIEZUX1Jhc3Rlcl9Jbml0X1Byb2MgICAgICBpbml0OworICAgIEZUX1Jhc3Rlcl9TZXRfTW9kZV9Qcm9jICBzZXRfbW9kZTsKKyAgICBGVF9SYXN0ZXJfUmVuZGVyX1Byb2MgICAgcmVuZGVyOworICAgIAorICAKKyAgfSBGVF9SYXN0ZXJfSW50ZXJmYWNlOworCisgCisjZW5kaWYgLyogRlRJTUFHRV9IICovCisKKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mdHN5c3RlbS5oIGIvaW5jbHVkZS9mdHN5c3RlbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmNDJlMTcKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2Z0c3lzdGVtLmgKQEAgLTAsMCArMSw5NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIGZ0c3lzdGVtLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMAorICoKKyAqICAgIEZyZWVUeXBlIGxvdy1sZXZlbCBzeXN0ZW0gaW50ZXJmYWNlIGRlZmluaXRpb24KKyAqCisgKiAgICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRlZmluaXRpb25zIG9mIHRoZSBzdHJlYW0gYW5kIG1lbW9yeSBpbnRlcmZhY2VzCisgKiAgICB1c2VkIGJ5IEZyZWVUeXBlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKgorICoKKyAqICBDb3B5cmlnaHQgMTk5Ni0xOTk5IGJ5CisgKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnCisgKgorICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZAorICogIG1vZGlmaWVkIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIEZUU1lTVEVNX0gKKyNkZWZpbmUgRlRTWVNURU1fSAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICAgICAgICAgICAgICAgICAgTSBFIE0gTyBSIFkgICBNIEEgTiBBIEcgRSBNIEUgTiBUCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgdHlwZWRlZiBzdHJ1Y3QgRlRfTWVtb3J5UmVjXyogIEZUX01lbW9yeTsKKyAgCisgIHR5cGVkZWYgdm9pZCogKCpGVF9BbGxvY19GdW5jKSggRlRfTWVtb3J5ICBtZW1vcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyAgICAgICBzaXplICk7CisKKyAgdHlwZWRlZiB2b2lkICAoKkZUX0ZyZWVfRnVuYykoIEZUX01lbW9yeSAgbWVtb3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICBibG9jayApOworCisgIHR5cGVkZWYgdm9pZCogKCpGVF9SZWFsbG9jX0Z1bmMpKCBGVF9NZW1vcnkgIG1lbW9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgICAgICAgY3VyX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nICAgICAgIG5ld19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICBibG9jayApOworCisgIHN0cnVjdCBGVF9NZW1vcnlSZWNfCisgIHsKKyAgICB2b2lkKiAgICAgICAgICAgIHVzZXI7CisgICAgRlRfQWxsb2NfRnVuYyAgICBhbGxvYzsKKyAgICBGVF9GcmVlX0Z1bmMgICAgIGZyZWU7CisgICAgRlRfUmVhbGxvY19GdW5jICByZWFsbG9jOworICB9OworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgSSAvIE8gICBNIEEgTiBBIEcgRSBNIEUgTiBUCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIAorICB0eXBlZGVmIHVuaW9uIEZUX1N0cmVhbURlc2NfCisgIHsKKyAgICBsb25nICB2YWx1ZTsKKyAgICB2b2lkKiBwb2ludGVyOworICAgIAorICB9IEZUX1N0cmVhbURlc2M7CisKKworICB0eXBlZGVmIHN0cnVjdCBGVF9TdHJlYW1SZWNfKiAgRlRfU3RyZWFtOworCisgIHR5cGVkZWYgIHVuc2lnbmVkIGxvbmcgKCpGVF9TdHJlYW1fSU8pKCBGVF9TdHJlYW0gICAgICBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiAgICAgICAgICBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICBjb3VudCApOworCisgIHR5cGVkZWYgIHZvaWQgKCpGVF9TdHJlYW1fQ2xvc2UpKCBGVF9TdHJlYW0gIHN0cmVhbSApOworCisgIHN0cnVjdCBGVF9TdHJlYW1SZWNfCisgIHsKKyAgICBjaGFyKiAgICAgICAgICAgYmFzZTsKKyAgICB1bnNpZ25lZCBsb25nICAgc2l6ZTsKKyAgICB1bnNpZ25lZCBsb25nICAgcG9zOworICAgIAorICAgIEZUX1N0cmVhbURlc2MgICBkZXNjcmlwdG9yOworICAgIEZUX1N0cmVhbURlc2MgICBwYXRobmFtZTsgICAgLyogaWdub3JlZCBieSBGcmVlVHlwZSAtIHVzZWZ1bCBmb3IgZGVidWdnaW5nICovCisKKyAgICBGVF9TdHJlYW1fSU8gICAgcmVhZDsKKyAgICBGVF9TdHJlYW1fQ2xvc2UgY2xvc2U7CisKKyAgICBGVF9NZW1vcnkgICAgICAgbWVtb3J5OworICAgIGNoYXIqICAgICAgICAgICBjdXJzb3I7CisgICAgY2hhciogICAgICAgICAgIGxpbWl0OworICB9OworCisKKyNlbmRpZiAvKiBGVFNZU1RFTV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3R0bmFtZWRpZC5oIGIvaW5jbHVkZS90dG5hbWVkaWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjdmY2I3Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS90dG5hbWVkaWQuaApAQCAtMCwwICsxLDYyNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgdHRuYW1laWQuaAorICoKKyAqICAgIFRydWVUeXBlIE5hbWUgSUQgZGVmaW5pdGlvbnMKKyAqCisgKiAgQ29weXJpZ2h0IDE5OTYtMTk5OSBieQorICogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkCisgKiAgbW9kaWZpZWQgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIFRUTkFNRUlEX0gKKyNkZWZpbmUgVFROQU1FSURfSAorCisvKgorICogcG9zc2libGUgdmFsdWVzIGZvciB0aGUgJ1BsYXRmb3JtJyBpZGVudGlmaWVyIGNvZGUgaW4gdGhlIG5hbWUKKyAqIHJlY29yZHMgb2YgdGhlIFRURiAibmFtZSIgdGFibGUKKyAqLworCisjZGVmaW5lIFRUX1BMQVRGT1JNX0FQUExFX1VOSUNPREUgICAgICAgMAorI2RlZmluZSBUVF9QTEFURk9STV9NQUNJTlRPU0ggICAgICAgICAgIDEKKyNkZWZpbmUgVFRfUExBVEZPUk1fSVNPICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFRUX1BMQVRGT1JNX01JQ1JPU09GVCAgICAgICAgICAgMworCisKKy8qCisgKiBwb3NzaWJsZSB2YWx1ZXMgb2YgdGhlIHBsYXRmb3JtIHNwZWNpZmljIGVuY29kaW5nIGlkZW50aWZpZXIgZmllbGQgaW4KKyAqIHRoZSBuYW1lIHJlY29yZHMgb2YgdGhlIFRURiAibmFtZSIgdGFibGUgd2hlbiB0aGUgJ1BsYXRmb3JtJyBpZGVudGlmaWVyCisgKiBjb2RlIGlzIFRUX1BMQVRGT1JNX0FQUExFX1VOSUNPREUKKyAqLworCisjZGVmaW5lIFRUX0FQUExFX0lEX0RFRkFVTFQgICAgICAgICAgICAgMAorI2RlZmluZSBUVF9BUFBMRV9JRF9VTklDT0RFXzFfMSAgICAgICAgIDEKKyNkZWZpbmUgVFRfQVBQTEVfSURfSVNPXzEwNjQ2ICAgICAgICAgICAyCisjZGVmaW5lIFRUX0FQUExFX0lEX1VOSUNPREVfMl8wICAgICAgICAgMworCisKKy8qCisgKiBwb3NzaWJsZSB2YWx1ZXMgb2YgdGhlIHBsYXRmb3JtIHNwZWNpZmljIGVuY29kaW5nIGlkZW50aWZpZXIgZmllbGQgaW4KKyAqIHRoZSBuYW1lIHJlY29yZHMgb2YgdGhlIFRURiAibmFtZSIgdGFibGUgd2hlbiB0aGUgJ1BsYXRmb3JtJyBpZGVudGlmaWVyCisgKiBjb2RlIGlzIFRUX1BMQVRGT1JNX01BQ0lOVE9TSAorICovCisKKyNkZWZpbmUgVFRfTUFDX0lEX1JPTUFOICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFRUX01BQ19JRF9KQVBBTkVTRSAgICAgICAgICAgICAgMQorI2RlZmluZSBUVF9NQUNfSURfVFJBRElUSU9OQUxfQ0hJTkVTRSAgIDIKKyNkZWZpbmUgVFRfTUFDX0lEX0tPUkVBTiAgICAgICAgICAgICAgICAzCisjZGVmaW5lIFRUX01BQ19JRF9BUkFCSUMgICAgICAgICAgICAgICAgNAorI2RlZmluZSBUVF9NQUNfSURfSEVCUkVXICAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgVFRfTUFDX0lEX0dSRUVLICAgICAgICAgICAgICAgICA2CisjZGVmaW5lIFRUX01BQ19JRF9SVVNTSUFOICAgICAgICAgICAgICAgNworI2RlZmluZSBUVF9NQUNfSURfUlNZTUJPTCAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgVFRfTUFDX0lEX0RFVkFOQUdBUkkgICAgICAgICAgICA5CisjZGVmaW5lIFRUX01BQ19JRF9HVVJNVUtISSAgICAgICAgICAgICAgMTAKKyNkZWZpbmUgVFRfTUFDX0lEX0dVSkFSQVRJICAgICAgICAgICAgICAxMQorI2RlZmluZSBUVF9NQUNfSURfT1JJWUEgICAgICAgICAgICAgICAgIDEyCisjZGVmaW5lIFRUX01BQ19JRF9CRU5HQUxJICAgICAgICAgICAgICAgMTMKKyNkZWZpbmUgVFRfTUFDX0lEX1RBTUlMICAgICAgICAgICAgICAgICAxNAorI2RlZmluZSBUVF9NQUNfSURfVEVMVUdVICAgICAgICAgICAgICAgIDE1CisjZGVmaW5lIFRUX01BQ19JRF9LQU5OQURBICAgICAgICAgICAgICAgMTYKKyNkZWZpbmUgVFRfTUFDX0lEX01BTEFZQUxBTSAgICAgICAgICAgICAxNworI2RlZmluZSBUVF9NQUNfSURfU0lOSEFMRVNFICAgICAgICAgICAgIDE4CisjZGVmaW5lIFRUX01BQ19JRF9CVVJNRVNFICAgICAgICAgICAgICAgMTkKKyNkZWZpbmUgVFRfTUFDX0lEX0tITUVSICAgICAgICAgICAgICAgICAyMAorI2RlZmluZSBUVF9NQUNfSURfVEhBSSAgICAgICAgICAgICAgICAgIDIxCisjZGVmaW5lIFRUX01BQ19JRF9MQU9USUFOICAgICAgICAgICAgICAgMjIKKyNkZWZpbmUgVFRfTUFDX0lEX0dFT1JHSUFOICAgICAgICAgICAgICAyMworI2RlZmluZSBUVF9NQUNfSURfQVJNRU5JQU4gICAgICAgICAgICAgIDI0CisjZGVmaW5lIFRUX01BQ19JRF9NQUxESVZJQU4gICAgICAgICAgICAgMjUKKyNkZWZpbmUgVFRfTUFDX0lEX1NJTVBMSUZJRURfQ0hJTkVTRSAgICAyNQorI2RlZmluZSBUVF9NQUNfSURfVElCRVRBTiAgICAgICAgICAgICAgIDI2CisjZGVmaW5lIFRUX01BQ19JRF9NT05HT0xJQU4gICAgICAgICAgICAgMjcKKyNkZWZpbmUgVFRfTUFDX0lEX0dFRVogICAgICAgICAgICAgICAgICAyOAorI2RlZmluZSBUVF9NQUNfSURfU0xBVklDICAgICAgICAgICAgICAgIDI5CisjZGVmaW5lIFRUX01BQ19JRF9WSUVUTkFNRVNFICAgICAgICAgICAgMzAKKyNkZWZpbmUgVFRfTUFDX0lEX1NJTkRISSAgICAgICAgICAgICAgICAzMQorI2RlZmluZSBUVF9NQUNfSURfVU5JTlRFUlAgICAgICAgICAgICAgIDMyCisKKworLyoKKyAqIHBvc3NpYmxlIHZhbHVlcyBvZiB0aGUgcGxhdGZvcm0gc3BlY2lmaWMgZW5jb2RpbmcgaWRlbnRpZmllciBmaWVsZCBpbgorICogdGhlIG5hbWUgcmVjb3JkcyBvZiB0aGUgVFRGICJuYW1lIiB0YWJsZSB3aGVuIHRoZSAnUGxhdGZvcm0nIGlkZW50aWZpZXIKKyAqIGNvZGUgaXMgVFRfUExBVEZPUk1fSVNPCisgKi8KKworI2RlZmluZSBUVF9JU09fSURfN0JJVF9BU0NJSSAgICAwCisjZGVmaW5lIFRUX0lTT19JRF8xMDY0NiAgICAgICAgIDEKKyNkZWZpbmUgVFRfSVNPX0lEXzg4NTlfMSAgICAgICAgMgorCisKKy8qCisgKiBwb3NzaWJsZSB2YWx1ZXMgb2YgdGhlIHBsYXRmb3JtIHNwZWNpZmljIGVuY29kaW5nIGlkZW50aWZpZXIgZmllbGQgaW4KKyAqIHRoZSBuYW1lIHJlY29yZHMgb2YgdGhlIFRURiAibmFtZSIgdGFibGUgd2hlbiB0aGUgJ1BsYXRmb3JtJyBpZGVudGlmaWVyCisgKiBjb2RlIGlzIFRUX1BMQVRGT1JNX01JQ1JPU09GVAorICovCisKKyNkZWZpbmUgVFRfTVNfSURfU1lNQk9MX0NTICAgICAgMAorI2RlZmluZSBUVF9NU19JRF9VTklDT0RFX0NTICAgICAxCisjZGVmaW5lIFRUX01TX0lEX1NKSVMgICAgICAgICAgIDIKKyNkZWZpbmUgVFRfTVNfSURfR0IyMzEyICAgICAgICAgMworI2RlZmluZSBUVF9NU19JRF9CSUdfNSAgICAgICAgICA0CisjZGVmaW5lIFRUX01TX0lEX1dBTlNVTkcgICAgICAgIDUKKyNkZWZpbmUgVFRfTVNfSURfSk9IQUIgICAgICAgICAgNgorCisKKworLyoKKyAqIHBvc3NpYmxlIHZhbHVlcyBvZiB0aGUgbGFuZ3VhZ2UgaWRlbnRpZmllciBmaWVsZCBpbiB0aGUgbmFtZSByZWNvcmRzIG9mCisgKiB0aGUgVFRGICJuYW1lIiB0YWJsZSB3aGVuIHRoZSAnUGxhdGZvcm0nIGlkZW50aWZpZXIgY29kZSBpcworICogVFRfUExBVEZPUk1fTUFDSU5UT1NICisgKgorICogdGhlIGNhbm9uaWNhbCBzb3VyY2UgZm9yIHRoZSBBcHBsZSBhc3NpZ25lZCBMYW5ndWFnZSBJRCdzIGlzIGF0CisgKiBodHRwOi8vZm9udHMuYXBwbGUuY29tL1RUUmVmTWFuL1JNMDYvQ2hhcDZuYW1lLmh0bWwKKyAqLworCisjZGVmaW5lIFRUX01BQ19MQU5HSURfRU5HTElTSCAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9GUkVOQ0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBUVF9NQUNfTEFOR0lEX0dFUk1BTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFRUX01BQ19MQU5HSURfSVRBTElBTiAgICAgICAgICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9EVVRDSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBUVF9NQUNfTEFOR0lEX1NXRURJU0ggICAgICAgICAgICAgICAgICAgICAgICAgICA1CisjZGVmaW5lIFRUX01BQ19MQU5HSURfU1BBTklTSCAgICAgICAgICAgICAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9EQU5JU0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgNworI2RlZmluZSBUVF9NQUNfTEFOR0lEX1BPUlRVR1VFU0UgICAgICAgICAgICAgICAgICAgICAgICA4CisjZGVmaW5lIFRUX01BQ19MQU5HSURfTk9SV0VHSUFOICAgICAgICAgICAgICAgICAgICAgICAgIDkKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9IRUJSRVcgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9KQVBBTkVTRSAgICAgICAgICAgICAgICAgICAgICAgICAgMTEKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9BUkFCSUMgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9GSU5OSVNIICAgICAgICAgICAgICAgICAgICAgICAgICAgMTMKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9HUkVFSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTQKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9JQ0VMQU5ESUMgICAgICAgICAgICAgICAgICAgICAgICAgMTUKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9NQUxURVNFICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9UVVJLSVNIICAgICAgICAgICAgICAgICAgICAgICAgICAgMTcKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9DUk9BVElBTiAgICAgICAgICAgICAgICAgICAgICAgICAgMTgKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9DSElORVNFX1RSQURJVElPTkFMICAgICAgICAgICAgICAgMTkKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9VUkRVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjAKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9ISU5ESSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjEKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9USEFJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjIKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9LT1JFQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgMjMKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9MSVRIVUFOSUFOICAgICAgICAgICAgICAgICAgICAgICAgMjQKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9QT0xJU0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgMjUKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9IVU5HQVJJQU4gICAgICAgICAgICAgICAgICAgICAgICAgMjYKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9FU1RPTklBTiAgICAgICAgICAgICAgICAgICAgICAgICAgMjcKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9MRVRUSVNIICAgICAgICAgICAgICAgICAgICAgICAgICAgMjgKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9TQUFNSVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgMjkKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9GQUVST0VTRSAgICAgICAgICAgICAgICAgICAgICAgICAgMzAKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9GQVJTSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzEKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9SVVNTSUFOICAgICAgICAgICAgICAgICAgICAgICAgICAgMzIKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9DSElORVNFX1NJTVBMSUZJRUQgICAgICAgICAgICAgICAgMzMKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9GTEVNSVNIICAgICAgICAgICAgICAgICAgICAgICAgICAgMzQKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9JUklTSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzUKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9BTEJBTklBTiAgICAgICAgICAgICAgICAgICAgICAgICAgMzYKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9ST01BTklBTiAgICAgICAgICAgICAgICAgICAgICAgICAgMzcKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9DWkVDSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzgKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9TTE9WQUsgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzkKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9TTE9WRU5JQU4gICAgICAgICAgICAgICAgICAgICAgICAgNDAKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9ZSURESVNIICAgICAgICAgICAgICAgICAgICAgICAgICAgNDEKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9TRVJCSUFOICAgICAgICAgICAgICAgICAgICAgICAgICAgNDIKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9NQUNFRE9OSUFOICAgICAgICAgICAgICAgICAgICAgICAgNDMKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9CVUxHQVJJQU4gICAgICAgICAgICAgICAgICAgICAgICAgNDQKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9VS1JBSU5JQU4gICAgICAgICAgICAgICAgICAgICAgICAgNDUKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9CWUVMT1JVU1NJQU4gICAgICAgICAgICAgICAgICAgICAgNDYKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9VWkJFSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDcKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9LQVpBS0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgNDgKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9BWkVSQkFJSkFOSSAgICAgICAgICAgICAgICAgICAgICAgNDkKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9BWkVSQkFJSkFOSV9BUkFCSUNfU0NSSVBUICAgICAgICAgNTAKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9BUk1FTklBTiAgICAgICAgICAgICAgICAgICAgICAgICAgNTEKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9HRU9SR0lBTiAgICAgICAgICAgICAgICAgICAgICAgICAgNTIKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9NT0xEQVZJQU4gICAgICAgICAgICAgICAgICAgICAgICAgNTMKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9LSVJHSElaICAgICAgICAgICAgICAgICAgICAgICAgICAgNTQKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9UQUpJS0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTUKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9UVVJLTUVOICAgICAgICAgICAgICAgICAgICAgICAgICAgNTYKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9NT05HT0xJQU4gICAgICAgICAgICAgICAgICAgICAgICAgNTcKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9NT05HT0xJQU5fQ1lSSUxMSUNfU0NSSVBUICAgICAgICAgNTgKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9QQVNIVE8gICAgICAgICAgICAgICAgICAgICAgICAgICAgNTkKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9LVVJESVNIICAgICAgICAgICAgICAgICAgICAgICAgICAgNjAKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9LQVNITUlSSSAgICAgICAgICAgICAgICAgICAgICAgICAgNjEKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9TSU5ESEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjIKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9USUJFVEFOICAgICAgICAgICAgICAgICAgICAgICAgICAgNjMKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9ORVBBTEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjQKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9TQU5TS1JJVCAgICAgICAgICAgICAgICAgICAgICAgICAgNjUKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9NQVJBVEhJICAgICAgICAgICAgICAgICAgICAgICAgICAgNjYKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9CRU5HQUxJICAgICAgICAgICAgICAgICAgICAgICAgICAgNjcKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9BU1NBTUVTRSAgICAgICAgICAgICAgICAgICAgICAgICAgNjgKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9HVUpBUkFUSSAgICAgICAgICAgICAgICAgICAgICAgICAgNjkKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9QVU5KQUJJICAgICAgICAgICAgICAgICAgICAgICAgICAgNzAKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9PUklZQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzEKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9NQUxBWUFMQU0gICAgICAgICAgICAgICAgICAgICAgICAgNzIKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9LQU5OQURBICAgICAgICAgICAgICAgICAgICAgICAgICAgNzMKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9UQU1JTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzQKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9URUxVR1UgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzUKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9TSU5IQUxFU0UgICAgICAgICAgICAgICAgICAgICAgICAgNzYKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9CVVJNRVNFICAgICAgICAgICAgICAgICAgICAgICAgICAgNzcKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9LSE1FUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzgKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9MQU8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzkKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9WSUVUTkFNRVNFICAgICAgICAgICAgICAgICAgICAgICAgODAKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9JTkRPTkVTSUFOICAgICAgICAgICAgICAgICAgICAgICAgODEKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9UQUdBTE9HICAgICAgICAgICAgICAgICAgICAgICAgICAgODIKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9NQUxBWV9ST01BTl9TQ1JJUFQgICAgICAgICAgICAgICAgODMKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9NQUxBWV9BUkFCSUNfU0NSSVBUICAgICAgICAgICAgICAgODQKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9BTUhBUklDICAgICAgICAgICAgICAgICAgICAgICAgICAgODUKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9USUdSSU5ZQSAgICAgICAgICAgICAgICAgICAgICAgICAgODYKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9HQUxMQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODcKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9TT01BTEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgODgKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9TV0FISUxJICAgICAgICAgICAgICAgICAgICAgICAgICAgODkKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9SVUFOREEgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTAKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9SVU5ESSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTEKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9DSEVXQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTIKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9NQUxBR0FTWSAgICAgICAgICAgICAgICAgICAgICAgICAgOTMKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9FU1BFUkFOVE8gICAgICAgICAgICAgICAgICAgICAgICAgOTQKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9XRUxTSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTI4CisjZGVmaW5lIFRUX01BQ19MQU5HSURfQkFTUVVFICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyOQorI2RlZmluZSBUVF9NQUNfTEFOR0lEX0NBVEFMQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAxMzAKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9MQVRJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTMxCisjZGVmaW5lIFRUX01BQ19MQU5HSURfUVVFQ0hVQSAgICAgICAgICAgICAgICAgICAgICAgICAgIDEzMgorI2RlZmluZSBUVF9NQUNfTEFOR0lEX0dVQVJBTkkgICAgICAgICAgICAgICAgICAgICAgICAgICAxMzMKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9BWU1BUkEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTM0CisjZGVmaW5lIFRUX01BQ19MQU5HSURfVEFUQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEzNQorI2RlZmluZSBUVF9NQUNfTEFOR0lEX1VJR0hVUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMzYKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9EWk9OR0tIQSAgICAgICAgICAgICAgICAgICAgICAgICAgMTM3CisjZGVmaW5lIFRUX01BQ19MQU5HSURfSkFWQU5FU0UgICAgICAgICAgICAgICAgICAgICAgICAgIDEzOAorI2RlZmluZSBUVF9NQUNfTEFOR0lEX1NVTkRBTkVTRSAgICAgICAgICAgICAgICAgICAgICAgICAxMzkKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9TQ09UVElTSF9HQUVMSUMgICAgICAgICAgICAgICAgICAgMTQwCisjZGVmaW5lIFRUX01BQ19MQU5HSURfSVJJU0hfR0FFTElDICAgICAgICAgICAgICAgICAgICAgIDE0MQorI2RlZmluZSBUVF9NQUNfTEFOR0lEX0JSRVRPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNDIKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9JTlVLVElUVVQgICAgICAgICAgICAgICAgICAgICAgICAgMTQzCisKKworLyoKKyAqIHBvc3NpYmxlIHZhbHVlcyBvZiB0aGUgbGFuZ3VhZ2UgaWRlbnRpZmllciBmaWVsZCBpbiB0aGUgbmFtZSByZWNvcmRzIG9mCisgKiB0aGUgVFRGICJuYW1lIiB0YWJsZSB3aGVuIHRoZSAnUGxhdGZvcm0nIGlkZW50aWZpZXIgY29kZSBpcworICogVFRfUExBVEZPUk1fTUlDUk9TT0ZUCisgKgorICogdGhlIGNhbm9uaWNhbCBzb3VyY2UgZm9yIHRoZSBNUyBhc3NpZ25lZCBMQ0lEJ3MgaXMgYXQKKyAqIGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS90eXBvZ3JhcGh5L09UU1BFQy9sY2lkLWNwLnR4dAorICovCisKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0FSQUJJQ19TQVVESV9BUkFCSUEgICAgICAgICAgICAgICAgMHgwNDAxCisjZGVmaW5lIFRUX01TX0xBTkdJRF9BUkFCSUNfSVJBUSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMQorI2RlZmluZSBUVF9NU19MQU5HSURfQVJBQklDX0VHWVBUICAgICAgICAgICAgICAgICAgICAgICAweDBjMDEKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0FSQUJJQ19MSUJZQSAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAxCisjZGVmaW5lIFRUX01TX0xBTkdJRF9BUkFCSUNfQUxHRVJJQSAgICAgICAgICAgICAgICAgICAgIDB4MTQwMQorI2RlZmluZSBUVF9NU19MQU5HSURfQVJBQklDX01PUk9DQ08gICAgICAgICAgICAgICAgICAgICAweDE4MDEKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0FSQUJJQ19UVU5JU0lBICAgICAgICAgICAgICAgICAgICAgMHgxYzAxCisjZGVmaW5lIFRUX01TX0xBTkdJRF9BUkFCSUNfT01BTiAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMQorI2RlZmluZSBUVF9NU19MQU5HSURfQVJBQklDX1lFTUVOICAgICAgICAgICAgICAgICAgICAgICAweDI0MDEKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0FSQUJJQ19TWVJJQSAgICAgICAgICAgICAgICAgICAgICAgMHgyODAxCisjZGVmaW5lIFRUX01TX0xBTkdJRF9BUkFCSUNfSk9SREFOICAgICAgICAgICAgICAgICAgICAgIDB4MmMwMQorI2RlZmluZSBUVF9NU19MQU5HSURfQVJBQklDX0xFQkFOT04gICAgICAgICAgICAgICAgICAgICAweDMwMDEKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0FSQUJJQ19LVVdBSVQgICAgICAgICAgICAgICAgICAgICAgMHgzNDAxCisjZGVmaW5lIFRUX01TX0xBTkdJRF9BUkFCSUNfVUFFICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzgwMQorI2RlZmluZSBUVF9NU19MQU5HSURfQVJBQklDX0JBSFJBSU4gICAgICAgICAgICAgICAgICAgICAweDNjMDEKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0FSQUJJQ19RQVRBUiAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAxCisjZGVmaW5lIFRUX01TX0xBTkdJRF9CVUxHQVJJQU5fQlVMR0FSSUEgICAgICAgICAgICAgICAgIDB4MDQwMgorI2RlZmluZSBUVF9NU19MQU5HSURfQ0FUQUxBTl9TUEFJTiAgICAgICAgICAgICAgICAgICAgICAweDA0MDMKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0NISU5FU0VfVEFJV0FOICAgICAgICAgICAgICAgICAgICAgMHgwNDA0CisjZGVmaW5lIFRUX01TX0xBTkdJRF9DSElORVNFX1BSQyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgwNAorI2RlZmluZSBUVF9NU19MQU5HSURfQ0hJTkVTRV9IT05HX0tPTkcgICAgICAgICAgICAgICAgICAweDBjMDQKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0NISU5FU0VfU0lOR0FQT1JFICAgICAgICAgICAgICAgICAgMHgxMDA0CisjZGVmaW5lIFRUX01TX0xBTkdJRF9DSElORVNFX01BQ0FVICAgICAgICAgICAgICAgICAgICAgIDB4MTQwNAorI2RlZmluZSBUVF9NU19MQU5HSURfQ1pFQ0hfQ1pFQ0hfUkVQVUJMSUMgICAgICAgICAgICAgICAweDA0MDUKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0RBTklTSF9ERU5NQVJLICAgICAgICAgICAgICAgICAgICAgMHgwNDA2CisjZGVmaW5lIFRUX01TX0xBTkdJRF9HRVJNQU5fR0VSTUFOWSAgICAgICAgICAgICAgICAgICAgIDB4MDQwNworI2RlZmluZSBUVF9NU19MQU5HSURfR0VSTUFOX1NXSVRaRVJMQU5EICAgICAgICAgICAgICAgICAweDA4MDcKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0dFUk1BTl9BVVNUUklBICAgICAgICAgICAgICAgICAgICAgMHgwYzA3CisjZGVmaW5lIFRUX01TX0xBTkdJRF9HRVJNQU5fTFVYRU1CT1VSRyAgICAgICAgICAgICAgICAgIDB4MTAwNworI2RlZmluZSBUVF9NU19MQU5HSURfR0VSTUFOX0xJRUNIVEVOU1RFSSAgICAgICAgICAgICAgICAweDE0MDcKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0dSRUVLX0dSRUVDRSAgICAgICAgICAgICAgICAgICAgICAgMHgwNDA4CisjZGVmaW5lIFRUX01TX0xBTkdJRF9FTkdMSVNIX1VOSVRFRF9TVEFURVMgICAgICAgICAgICAgIDB4MDQwOQorI2RlZmluZSBUVF9NU19MQU5HSURfRU5HTElTSF9VTklURURfS0lOR0RPTSAgICAgICAgICAgICAweDA4MDkKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0VOR0xJU0hfQVVTVFJBTElBICAgICAgICAgICAgICAgICAgMHgwYzA5CisjZGVmaW5lIFRUX01TX0xBTkdJRF9FTkdMSVNIX0NBTkFEQSAgICAgICAgICAgICAgICAgICAgIDB4MTAwOQorI2RlZmluZSBUVF9NU19MQU5HSURfRU5HTElTSF9ORVdfWkVBTEFORCAgICAgICAgICAgICAgICAweDE0MDkKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0VOR0xJU0hfSVJFTEFORCAgICAgICAgICAgICAgICAgICAgMHgxODA5CisjZGVmaW5lIFRUX01TX0xBTkdJRF9FTkdMSVNIX1NPVVRIX0FGUklDQSAgICAgICAgICAgICAgIDB4MWMwOQorI2RlZmluZSBUVF9NU19MQU5HSURfRU5HTElTSF9KQU1BSUNBICAgICAgICAgICAgICAgICAgICAweDIwMDkKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0VOR0xJU0hfQ0FSSUJCRUFOICAgICAgICAgICAgICAgICAgMHgyNDA5CisjZGVmaW5lIFRUX01TX0xBTkdJRF9FTkdMSVNIX0JFTElaRSAgICAgICAgICAgICAgICAgICAgIDB4MjgwOQorI2RlZmluZSBUVF9NU19MQU5HSURfRU5HTElTSF9UUklOSURBRCAgICAgICAgICAgICAgICAgICAweDJjMDkKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0VOR0xJU0hfWklNQkFCV0UgICAgICAgICAgICAgICAgICAgMHgzMDA5CisjZGVmaW5lIFRUX01TX0xBTkdJRF9FTkdMSVNIX1BISUxJUFBJTkVTICAgICAgICAgICAgICAgIDB4MzQwOQorI2RlZmluZSBUVF9NU19MQU5HSURfU1BBTklTSF9TUEFJTl9UUkFESVRJT05BTF9TT1JUICAgICAweDA0MGEKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1NQQU5JU0hfTUVYSUNPICAgICAgICAgICAgICAgICAgICAgMHgwODBhCisjZGVmaW5lIFRUX01TX0xBTkdJRF9TUEFOSVNIX1NQQUlOX0lOVEVSTkFUSU9OQUxfU09SVCAgIDB4MGMwYQorI2RlZmluZSBUVF9NU19MQU5HSURfU1BBTklTSF9HVUFURU1BTEEgICAgICAgICAgICAgICAgICAweDEwMGEKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1NQQU5JU0hfQ09TVEFfUklDQSAgICAgICAgICAgICAgICAgMHgxNDBhCisjZGVmaW5lIFRUX01TX0xBTkdJRF9TUEFOSVNIX1BBTkFNQSAgICAgICAgICAgICAgICAgICAgIDB4MTgwYQorI2RlZmluZSBUVF9NU19MQU5HSURfU1BBTklTSF9ET01JTklDQU5fUkVQVUJMSUMgICAgICAgICAweDFjMGEKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1NQQU5JU0hfVkVORVpVRUxBICAgICAgICAgICAgICAgICAgMHgyMDBhCisjZGVmaW5lIFRUX01TX0xBTkdJRF9TUEFOSVNIX0NPTE9NQklBICAgICAgICAgICAgICAgICAgIDB4MjQwYQorI2RlZmluZSBUVF9NU19MQU5HSURfU1BBTklTSF9QRVJVICAgICAgICAgICAgICAgICAgICAgICAweDI4MGEKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1NQQU5JU0hfQVJHRU5USU5BICAgICAgICAgICAgICAgICAgMHgyYzBhCisjZGVmaW5lIFRUX01TX0xBTkdJRF9TUEFOSVNIX0VDVUFET1IgICAgICAgICAgICAgICAgICAgIDB4MzAwYQorI2RlZmluZSBUVF9NU19MQU5HSURfU1BBTklTSF9DSElMRSAgICAgICAgICAgICAgICAgICAgICAweDM0MGEKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1NQQU5JU0hfVVJVR1VBWSAgICAgICAgICAgICAgICAgICAgMHgzODBhCisjZGVmaW5lIFRUX01TX0xBTkdJRF9TUEFOSVNIX1BBUkFHVUFZICAgICAgICAgICAgICAgICAgIDB4M2MwYQorI2RlZmluZSBUVF9NU19MQU5HSURfU1BBTklTSF9CT0xJVklBICAgICAgICAgICAgICAgICAgICAweDQwMGEKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1NQQU5JU0hfRUxfU0FMVkFET1IgICAgICAgICAgICAgICAgMHg0NDBhCisjZGVmaW5lIFRUX01TX0xBTkdJRF9TUEFOSVNIX0hPTkRVUkFTICAgICAgICAgICAgICAgICAgIDB4NDgwYQorI2RlZmluZSBUVF9NU19MQU5HSURfU1BBTklTSF9OSUNBUkFHVUEgICAgICAgICAgICAgICAgICAweDRjMGEKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1NQQU5JU0hfUFVFUlRPX1JJQ08gICAgICAgICAgICAgICAgMHg1MDBhCisjZGVmaW5lIFRUX01TX0xBTkdJRF9GSU5OSVNIX0ZJTkxBTkQgICAgICAgICAgICAgICAgICAgIDB4MDQwYgorI2RlZmluZSBUVF9NU19MQU5HSURfRlJFTkNIX0ZSQU5DRSAgICAgICAgICAgICAgICAgICAgICAweDA0MGMKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0ZSRU5DSF9CRUxHSVVNICAgICAgICAgICAgICAgICAgICAgMHgwODBjCisjZGVmaW5lIFRUX01TX0xBTkdJRF9GUkVOQ0hfQ0FOQURBICAgICAgICAgICAgICAgICAgICAgIDB4MGMwYworI2RlZmluZSBUVF9NU19MQU5HSURfRlJFTkNIX1NXSVRaRVJMQU5EICAgICAgICAgICAgICAgICAweDEwMGMKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0ZSRU5DSF9MVVhFTUJPVVJHICAgICAgICAgICAgICAgICAgMHgxNDBjCisjZGVmaW5lIFRUX01TX0xBTkdJRF9GUkVOQ0hfTU9OQUNPICAgICAgICAgICAgICAgICAgICAgIDB4MTgwYworI2RlZmluZSBUVF9NU19MQU5HSURfSEVCUkVXX0lTUkFFTCAgICAgICAgICAgICAgICAgICAgICAweDA0MGQKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0hVTkdBUklBTl9IVU5HQVJZICAgICAgICAgICAgICAgICAgMHgwNDBlCisjZGVmaW5lIFRUX01TX0xBTkdJRF9JQ0VMQU5ESUNfSUNFTEFORCAgICAgICAgICAgICAgICAgIDB4MDQwZgorI2RlZmluZSBUVF9NU19MQU5HSURfSVRBTElBTl9JVEFMWSAgICAgICAgICAgICAgICAgICAgICAweDA0MTAKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0lUQUxJQU5fU1dJVFpFUkxBTkQgICAgICAgICAgICAgICAgMHgwODEwCisjZGVmaW5lIFRUX01TX0xBTkdJRF9KQVBBTkVTRV9KQVBBTiAgICAgICAgICAgICAgICAgICAgIDB4MDQxMQorI2RlZmluZSBUVF9NU19MQU5HSURfS09SRUFOX0VYVEVOREVEX1dBTlNVTkdfS09SRUEgICAgICAweDA0MTIKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0tPUkVBTl9KT0hBQl9LT1JFQSAgICAgICAgICAgICAgICAgMHgwODEyCisjZGVmaW5lIFRUX01TX0xBTkdJRF9EVVRDSF9ORVRIRVJMQU5EUyAgICAgICAgICAgICAgICAgIDB4MDQxMworI2RlZmluZSBUVF9NU19MQU5HSURfRFVUQ0hfQkVMR0lVTSAgICAgICAgICAgICAgICAgICAgICAweDA4MTMKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX05PUldFR0lBTl9OT1JXQVlfQk9LTUFMICAgICAgICAgICAgMHgwNDE0CisjZGVmaW5lIFRUX01TX0xBTkdJRF9OT1JXRUdJQU5fTk9SV0FZX05ZTk9SU0sgICAgICAgICAgIDB4MDgxNAorI2RlZmluZSBUVF9NU19MQU5HSURfUE9MSVNIX1BPTEFORCAgICAgICAgICAgICAgICAgICAgICAweDA0MTUKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1BPUlRVR1VFU0VfQlJBWklMICAgICAgICAgICAgICAgICAgMHgwNDE2CisjZGVmaW5lIFRUX01TX0xBTkdJRF9QT1JUVUdVRVNFX1BPUlRVR0FMICAgICAgICAgICAgICAgIDB4MDgxNgorI2RlZmluZSBUVF9NU19MQU5HSURfUkhBRVRPX1JPTUFOSUNfU1dJVFpFUkxBTkQgICAgICAgICAweDA0MTcKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1JPTUFOSUFOX1JPTUFOSUEgICAgICAgICAgICAgICAgICAgMHgwNDE4CisjZGVmaW5lIFRUX01TX0xBTkdJRF9NT0xEQVZJQU5fTU9MREFWSUEgICAgICAgICAgICAgICAgIDB4MDgxOAorI2RlZmluZSBUVF9NU19MQU5HSURfUlVTU0lBTl9SVVNTSUEgICAgICAgICAgICAgICAgICAgICAweDA0MTkKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1JVU1NJQU5fTU9MREFWSUEgICAgICAgICAgICAgICAgICAgMHgwODE5CisjZGVmaW5lIFRUX01TX0xBTkdJRF9DUk9BVElBTl9DUk9BVElBICAgICAgICAgICAgICAgICAgIDB4MDQxYQorI2RlZmluZSBUVF9NU19MQU5HSURfU0VSQklBTl9TRVJCSUFfTEFUSU4gICAgICAgICAgICAgICAweDA4MWEKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1NFUkJJQU5fU0VSQklBX0NZUklMTElDICAgICAgICAgICAgMHgwYzFhCisjZGVmaW5lIFRUX01TX0xBTkdJRF9TTE9WQUtfU0xPVkFLSUEgICAgICAgICAgICAgICAgICAgIDB4MDQxYgorI2RlZmluZSBUVF9NU19MQU5HSURfQUxCQU5JQU5fQUxCQU5JQSAgICAgICAgICAgICAgICAgICAweDA0MWMKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1NXRURJU0hfU1dFREVOICAgICAgICAgICAgICAgICAgICAgMHgwNDFkCisjZGVmaW5lIFRUX01TX0xBTkdJRF9TV0VESVNIX0ZJTkxBTkQgICAgICAgICAgICAgICAgICAgIDB4MDgxZAorI2RlZmluZSBUVF9NU19MQU5HSURfVEhBSV9USEFJTEFORCAgICAgICAgICAgICAgICAgICAgICAweDA0MWUKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1RVUktJU0hfVFVSS0VZICAgICAgICAgICAgICAgICAgICAgMHgwNDFmCisjZGVmaW5lIFRUX01TX0xBTkdJRF9VUkRVX1BBS0lTVEFOICAgICAgICAgICAgICAgICAgICAgIDB4MDQyMAorI2RlZmluZSBUVF9NU19MQU5HSURfSU5ET05FU0lBTl9JTkRPTkVTSUEgICAgICAgICAgICAgICAweDA0MjEKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1VLUkFJTklBTl9VS1JBSU5FICAgICAgICAgICAgICAgICAgMHgwNDIyCisjZGVmaW5lIFRUX01TX0xBTkdJRF9CRUxBUlVTSUFOX0JFTEFSVVMgICAgICAgICAgICAgICAgIDB4MDQyMworI2RlZmluZSBUVF9NU19MQU5HSURfU0xPVkVORV9TTE9WRU5JQSAgICAgICAgICAgICAgICAgICAweDA0MjQKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0VTVE9OSUFOX0VTVE9OSUEgICAgICAgICAgICAgICAgICAgMHgwNDI1CisjZGVmaW5lIFRUX01TX0xBTkdJRF9MQVRWSUFOX0xBVFZJQSAgICAgICAgICAgICAgICAgICAgIDB4MDQyNgorI2RlZmluZSBUVF9NU19MQU5HSURfTElUSFVBTklBTl9MSVRIVUFOSUEgICAgICAgICAgICAgICAweDA0MjcKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0NMQVNTSUNfTElUSFVBTklBTl9MSVRIVUFOSUEgICAgICAgMHgwODI3CisjZGVmaW5lIFRUX01TX0xBTkdJRF9NQU9SSV9ORVdfWkVBTEFORCAgICAgICAgICAgICAgICAgIDB4MDQyOAorI2RlZmluZSBUVF9NU19MQU5HSURfRkFSU0lfSVJBTiAgICAgICAgICAgICAgICAgICAgICAgICAweDA0MjkKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1ZJRVROQU1FU0VfVklFVF9OQU0gICAgICAgICAgICAgICAgMHgwNDJhCisjZGVmaW5lIFRUX01TX0xBTkdJRF9BUk1FTklBTl9BUk1FTklBICAgICAgICAgICAgICAgICAgIDB4MDQyYgorI2RlZmluZSBUVF9NU19MQU5HSURfQVpFUklfQVpFUkJBSUpBTl9MQVRJTiAgICAgICAgICAgICAweDA0MmMKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0FaRVJJX0FaRVJCQUlKQU5fQ1lSSUxMSUMgICAgICAgICAgMHgwODJjCisjZGVmaW5lIFRUX01TX0xBTkdJRF9CQVNRVUVfU1BBSU4gICAgICAgICAgICAgICAgICAgICAgIDB4MDQyZAorI2RlZmluZSBUVF9NU19MQU5HSURfU09SQklBTl9HRVJNQU5ZICAgICAgICAgICAgICAgICAgICAweDA0MmUKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX01BQ0VET05JQU5fTUFDRURPTklBICAgICAgICAgICAgICAgMHgwNDJmCisjZGVmaW5lIFRUX01TX0xBTkdJRF9TVVRVX1NPVVRIX0FGUklDQSAgICAgICAgICAgICAgICAgIDB4MDQzMAorI2RlZmluZSBUVF9NU19MQU5HSURfVFNPTkdBX1NPVVRIX0FGUklDQSAgICAgICAgICAgICAgICAweDA0MzEKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1RTV0FOQV9TT1VUSF9BRlJJQ0EgICAgICAgICAgICAgICAgMHgwNDMyCisjZGVmaW5lIFRUX01TX0xBTkdJRF9WRU5EQV9TT1VUSF9BRlJJQ0EgICAgICAgICAgICAgICAgIDB4MDQzMworI2RlZmluZSBUVF9NU19MQU5HSURfWEhPU0FfU09VVEhfQUZSSUNBICAgICAgICAgICAgICAgICAweDA0MzQKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1pVTFVfU09VVEhfQUZSSUNBICAgICAgICAgICAgICAgICAgMHgwNDM1CisjZGVmaW5lIFRUX01TX0xBTkdJRF9BRlJJS0FBTlNfU09VVEhfQUZSSUNBICAgICAgICAgICAgIDB4MDQzNgorI2RlZmluZSBUVF9NU19MQU5HSURfR0VPUkdJQU5fR0VPUkdJQSAgICAgICAgICAgICAgICAgICAweDA0MzcKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0ZBRVJPRVNFX0ZBRVJPRV9JU0xBTkRTICAgICAgICAgICAgMHgwNDM4CisjZGVmaW5lIFRUX01TX0xBTkdJRF9ISU5ESV9JTkRJQSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQzOQorI2RlZmluZSBUVF9NU19MQU5HSURfTUFMVEVTRV9NQUxUQSAgICAgICAgICAgICAgICAgICAgICAweDA0M2EKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1NBQU1JX0xBUE9OSUEgICAgICAgICAgICAgICAgICAgICAgMHgwNDNiCisjZGVmaW5lIFRUX01TX0xBTkdJRF9JUklTSF9HQUVMSUNfSVJFTEFORCAgICAgICAgICAgICAgIDB4MDQzYworI2RlZmluZSBUVF9NU19MQU5HSURfU0NPVFRJU0hfR0FFTElDX1VOSVRFRF9LSU5HRE9NICAgICAweDA4M2MKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX01BTEFZX01BTEFZU0lBICAgICAgICAgICAgICAgICAgICAgMHgwNDNlCisjZGVmaW5lIFRUX01TX0xBTkdJRF9NQUxBWV9CUlVORUlfREFSVVNTQUxBTSAgICAgICAgICAgIDB4MDgzZQorI2RlZmluZSBUVF9NU19MQU5HSURfS0FaQUtfS0FaQUtTVEFOICAgICAgICAgICAgICAgICAgICAweDA0M2YKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1NXQUhJTElfS0VOWUEgICAgICAgICAgICAgICAgICAgICAgMHgwNDQxCisjZGVmaW5lIFRUX01TX0xBTkdJRF9VWkJFS19VWkJFS0lTVEFOX0xBVElOICAgICAgICAgICAgIDB4MDQ0MworI2RlZmluZSBUVF9NU19MQU5HSURfVVpCRUtfVVpCRUtJU1RBTl9DWVJJTExJQyAgICAgICAgICAweDA4NDMKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1RBVEFSX1RBVEFSU1RBTiAgICAgICAgICAgICAgICAgICAgMHgwNDQ0CisjZGVmaW5lIFRUX01TX0xBTkdJRF9CRU5HQUxJX0lORElBICAgICAgICAgICAgICAgICAgICAgIDB4MDQ0NQorI2RlZmluZSBUVF9NU19MQU5HSURfUFVOSkFCSV9JTkRJQSAgICAgICAgICAgICAgICAgICAgICAweDA0NDYKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0dVSkFSQVRJX0lORElBICAgICAgICAgICAgICAgICAgICAgMHgwNDQ3CisjZGVmaW5lIFRUX01TX0xBTkdJRF9PUklZQV9JTkRJQSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQ0OAorI2RlZmluZSBUVF9NU19MQU5HSURfVEFNSUxfSU5ESUEgICAgICAgICAgICAgICAgICAgICAgICAweDA0NDkKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1RFTFVHVV9JTkRJQSAgICAgICAgICAgICAgICAgICAgICAgMHgwNDRhCisjZGVmaW5lIFRUX01TX0xBTkdJRF9LQU5OQURBX0lORElBICAgICAgICAgICAgICAgICAgICAgIDB4MDQ0YgorI2RlZmluZSBUVF9NU19MQU5HSURfTUFMQVlBTEFNX0lORElBICAgICAgICAgICAgICAgICAgICAweDA0NGMKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0FTU0FNRVNFX0lORElBICAgICAgICAgICAgICAgICAgICAgMHgwNDRkCisjZGVmaW5lIFRUX01TX0xBTkdJRF9NQVJBVEhJX0lORElBICAgICAgICAgICAgICAgICAgICAgIDB4MDQ0ZQorI2RlZmluZSBUVF9NU19MQU5HSURfU0FOU0tSSVRfSU5ESUEgICAgICAgICAgICAgICAgICAgICAweDA0NGYKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0tPTktBTklfSU5ESUEgICAgICAgICAgICAgICAgICAgICAgMHgwNDU3CisKKworLyoKKyAqIHBvc3NpYmxlIHZhbHVlcyBvZiB0aGUgJ05hbWUnIGlkZW50aWZpZXIgZmllbGQgaW4gdGhlIG5hbWUgcmVjb3JkcyBvZgorICogdGhlIFRURiAibmFtZSIgdGFibGUuICBUaGVzZSB2YWx1ZXMgYXJlIHBsYXRmb3JtIGluZGVwZW5kZW50LgorICovCisKKyNkZWZpbmUgVFRfTkFNRV9JRF9DT1BZUklHSFQgICAgICAgICAgICAwCisjZGVmaW5lIFRUX05BTUVfSURfRk9OVF9GQU1JTFkgICAgICAgICAgMQorI2RlZmluZSBUVF9OQU1FX0lEX0ZPTlRfU1VCRkFNSUxZICAgICAgIDIKKyNkZWZpbmUgVFRfTkFNRV9JRF9VTklRVUVfSUQgICAgICAgICAgICAzCisjZGVmaW5lIFRUX05BTUVfSURfRlVMTF9OQU1FICAgICAgICAgICAgNAorI2RlZmluZSBUVF9OQU1FX0lEX1ZFUlNJT05fU1RSSU5HICAgICAgIDUKKyNkZWZpbmUgVFRfTkFNRV9JRF9QU19OQU1FICAgICAgICAgICAgICA2CisjZGVmaW5lIFRUX05BTUVfSURfVFJBREVNQVJLICAgICAgICAgICAgNworLyogdGhlIGZvbGxvd2luZyB2YWx1ZXMgYXJlIGZyb20gdGhlIE9wZW5UeXBlIHNwZWMgKi8KKyNkZWZpbmUgVFRfTkFNRV9JRF9NQU5VRkFDVFVSRVIgICAgICAgICA4CisjZGVmaW5lIFRUX05BTUVfSURfREVTSUdORVIgICAgICAgICAgICAgOQorI2RlZmluZSBUVF9OQU1FX0lEX0RFU0NSSVBUSU9OICAgICAgICAgIDEwCisjZGVmaW5lIFRUX05BTUVfSURfVkVORE9SX1VSTCAgICAgICAgICAgMTEKKyNkZWZpbmUgVFRfTkFNRV9JRF9ERVNJR05FUl9VUkwgICAgICAgICAxMgorI2RlZmluZSBUVF9OQU1FX0lEX0xJQ0VOU0UgICAgICAgICAgICAgIDEzCisjZGVmaW5lIFRUX05BTUVfSURfTElDRU5TRV9VUkwgICAgICAgICAgMTQKKy8qIG51bWJlciAxNSBpcyByZXNlcnZlZCAqLworI2RlZmluZSBUVF9OQU1FX0lEX1BSRUZFUlJFRF9GQU1JTFkgICAgIDE2CisjZGVmaW5lIFRUX05BTUVfSURfUFJFRkVSUkVEX1NVQkZBTUlMWSAgMTcKKyNkZWZpbmUgVFRfTkFNRV9JRF9NQUNfRlVMTF9OQU1FICAgICAgICAxOAorCisKKy8qCisgKiBCaXQgTWFzayB2YWx1ZXMgZm9yIHRoZSBVbmljb2RlIFJhbmdlcyBmcm9tIHRoZSBUVEYgIk9TMiAiIHRhYmxlLgorICovCisKKy8qIEdlbmVyYWwgU2NyaXB0cyBBcmVhICovCisKKy8qIEJpdCAgMCAgIEMwIENvbnRyb2xzIGFuZCBCYXNpYyBMYXRpbiAqLworI2RlZmluZSBUVF9VQ1JfQkFTSUNfTEFUSU4gICAgICAgICAgICAgICAgICAgICAoMUwgPDwgIDApIC8qIFUrMDAwMC1VKzAwN0YgKi8KKy8qIEJpdCAgMSAgIEMxIENvbnRyb2xzIGFuZCBMYXRpbi0xIFN1cHBsZW1lbnQgKi8KKyNkZWZpbmUgVFRfVUNSX0xBVElOMV9TVVBQTEVNRU5UICAgICAgICAgICAgICAgKDFMIDw8ICAxKSAvKiBVKzAwODAtVSswMEZGICovCisvKiBCaXQgIDIgICBMYXRpbiBFeHRlbmRlZC1BICovCisjZGVmaW5lIFRUX1VDUl9MQVRJTl9FWFRFTkRFRF9BICAgICAgICAgICAgICAgICgxTCA8PCAgMikgLyogVSswMTAwLVUrMDE3RiAqLworLyogQml0ICAzICAgTGF0aW4gRXh0ZW5kZWQtQiAqLworI2RlZmluZSBUVF9VQ1JfTEFUSU5fRVhURU5ERURfQiAgICAgICAgICAgICAgICAoMUwgPDwgIDMpIC8qIFUrMDE4MC1VKzAyNEYgKi8KKy8qIEJpdCAgNCAgIElQQSBFeHRlbnNpb25zICovCisjZGVmaW5lIFRUX1VDUl9JUEFfRVhURU5TSU9OUyAgICAgICAgICAgICAgICAgICgxTCA8PCAgNCkgLyogVSswMjUwLVUrMDJBRiAqLworLyogQml0ICA1ICAgU3BhY2luZyBNb2RpZmllciBMZXR0ZXJzICovCisjZGVmaW5lIFRUX1VDUl9TUEFDSU5HX01PRElGSUVSICAgICAgICAgICAgICAgICgxTCA8PCAgNSkgLyogVSswMkIwLVUrMDJGRiAqLworLyogQml0ICA2ICAgQ29tYmluaW5nIERpYWNyaXRpY2FsIE1hcmtzICovCisjZGVmaW5lIFRUX1VDUl9DT01CSU5JTkdfRElBQ1JJVElDUyAgICAgICAgICAgICgxTCA8PCAgNikgLyogVSswMzAwLVUrMDM2RiAqLworLyogQml0ICA3ICAgR3JlZWsgKi8KKyNkZWZpbmUgVFRfVUNSX0dSRUVLICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8ICA3KSAvKiBVKzAzNzAtVSswM0ZGICovCisvKiBCaXQgOCBpcyByZXNlcnZlZCAod2FzOiBHcmVlayBTeW1ib2xzIGFuZCBDb3B0aWMpICovCisvKiBCaXQgIDkgICBDeXJpbGxpYyAqLworI2RlZmluZSBUVF9VQ1JfQ1lSSUxMSUMgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgIDkpIC8qIFUrMDQwMC1VKzA0RkYgKi8KKy8qIEJpdCAxMCAgIEFybWVuaWFuICovCisjZGVmaW5lIFRUX1VDUl9BUk1FTklBTiAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAxMCkgLyogVSswNTMwLVUrMDU4RiAqLworLyogQml0IDExICAgSGVicmV3ICovCisjZGVmaW5lIFRUX1VDUl9IRUJSRVcgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAxMSkgLyogVSswNTkwLVUrMDVGRiAqLworLyogQml0IDEyIGlzIHJlc2VydmVkICh3YXM6IEhlYnJldyBFeHRlbmRlZCkgKi8KKy8qIEJpdCAxMyAgIEFyYWJpYyAqLworI2RlZmluZSBUVF9VQ1JfQVJBQklDICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMTMpIC8qIFUrMDYwMC1VKzA2RkYgKi8KKy8qIEJpdCAxNCBpcyByZXNlcnZlZCAod2FzOiBBcmFiaWMgRXh0ZW5kZWQpICovCisvKiBCaXQgMTUgICBEZXZhbmFnYXJpICovCisjZGVmaW5lIFRUX1VDUl9ERVZBTkFHQVJJICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAxNSkgLyogVSswOTAwLVUrMDk3RiAqLworLyogQml0IDE2ICAgQmVuZ2FsaSAqLworI2RlZmluZSBUVF9VQ1JfQkVOR0FMSSAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMTYpIC8qIFUrMDk4MC1VKzA5RkYgKi8KKy8qIEJpdCAxNyAgIEd1cm11a2hpICovCisjZGVmaW5lIFRUX1VDUl9HVVJNVUtISSAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAxNykgLyogVSswQTAwLVUrMEE3RiAqLworLyogQml0IDE4ICAgR3VqYXJhdGkgKi8KKyNkZWZpbmUgVFRfVUNSX0dVSkFSQVRJICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDE4KSAvKiBVKzBBODAtVSswQUZGICovCisvKiBCaXQgMTkgICBPcml5YSAqLworI2RlZmluZSBUVF9VQ1JfT1JJWUEgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMTkpIC8qIFUrMEIwMC1VKzBCN0YgKi8KKy8qIEJpdCAyMCAgIFRhbWlsICovCisjZGVmaW5lIFRUX1VDUl9UQU1JTCAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAyMCkgLyogVSswQjgwLVUrMEJGRiAqLworLyogQml0IDIxICAgVGVsdWd1ICovCisjZGVmaW5lIFRUX1VDUl9URUxVR1UgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAyMSkgLyogVSswQzAwLVUrMEM3RiAqLworLyogQml0IDIyICAgS2FubmFkYSAqLworI2RlZmluZSBUVF9VQ1JfS0FOTkFEQSAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMjIpIC8qIFUrMEM4MC1VKzBDRkYgKi8KKy8qIEJpdCAyMyAgIE1hbGF5YWxhbSAqLworI2RlZmluZSBUVF9VQ1JfTUFMQVlBTEFNICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMjMpIC8qIFUrMEQwMC1VKzBEN0YgKi8KKy8qIEJpdCAyNCAgIFRoYWkgKi8KKyNkZWZpbmUgVFRfVUNSX1RIQUkgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDI0KSAvKiBVKzBFMDAtVSswRTdGICovCisvKiBCaXQgMjUgICBMYW8gKi8KKyNkZWZpbmUgVFRfVUNSX0xBTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDI1KSAvKiBVKzBFODAtVSswRUZGICovCisvKiBCaXQgMjYgICBHZW9yZ2lhbiAqLworI2RlZmluZSBUVF9VQ1JfR0VPUkdJQU4gICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMjYpIC8qIFUrMTBBMC1VKzEwRkYgKi8KKy8qIEJpdCAyNyBpcyByZXNlcnZlZCAod2FzIEdlb3JnaWFuIEV4dGVuZGVkKSAqLworLyogQml0IDI4ICAgSGFuZ3VsIEphbW8gKi8KKyNkZWZpbmUgVFRfVUNSX0hBTkdVTF9KQU1PICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDI4KSAvKiBVKzExMDAtVSsxMUZGICovCisvKiBCaXQgMjkgICBMYXRpbiBFeHRlbmRlZCBBZGRpdGlvbmFsICovCisjZGVmaW5lIFRUX1VDUl9MQVRJTl9FWFRFTkRFRF9BRERJVElPTkFMICAgICAgICgxTCA8PCAyOSkgLyogVSsxRTAwLVUrMUVGRiAqLworLyogQml0IDMwICAgR3JlZWsgRXh0ZW5kZWQgKi8KKyNkZWZpbmUgVFRfVUNSX0dSRUVLX0VYVEVOREVEICAgICAgICAgICAgICAgICAgKDFMIDw8IDMwKSAvKiBVKzFGMDAtVSsxRkZGICovCisKKy8qIFN5bWJvbHMgQXJlYSAqLworCisvKiBCaXQgMzEgICBHZW5lcmFsIFB1bmN0dWF0aW9uICovCisjZGVmaW5lIFRUX1VDUl9HRU5FUkFMX1BVTkNUVUFUSU9OICAgICAgICAgICAgICgxTCA8PCAzMSkgLyogVSsyMDAwLVUrMjA2RiAqLworLyogQml0IDMyICAgU3VwZXJzY3JpcHRzIEFuZCBTdWJzY3JpcHRzICovCisjZGVmaW5lIFRUX1VDUl9TVVBFUlNDUklQVFNfU1VCU0NSSVBUUyAgICAgICAgICgxTCA8PCAgMCkgLyogVSsyMDcwLVUrMjA5RiAqLworLyogQml0IDMzICAgQ3VycmVuY3kgU3ltYm9scyAqLworI2RlZmluZSBUVF9VQ1JfQ1VSUkVOQ1lfU1lNQk9MUyAgICAgICAgICAgICAgICAoMUwgPDwgIDEpIC8qIFUrMjBBMC1VKzIwQ0YgKi8KKy8qIEJpdCAzNCAgIENvbWJpbmluZyBEaWFjcml0aWNhbCBNYXJrcyBGb3IgU3ltYm9scyAqLworI2RlZmluZSBUVF9VQ1JfQ09NQklOSU5HX0RJQUNSSVRJQ1NfU1lNQiAgICAgICAoMUwgPDwgIDIpIC8qIFUrMjBEMC1VKzIwRkYgKi8KKy8qIEJpdCAzNSAgIExldHRlcmxpa2UgU3ltYm9scyAqLworI2RlZmluZSBUVF9VQ1JfTEVUVEVSTElLRV9TWU1CT0xTICAgICAgICAgICAgICAoMUwgPDwgIDMpIC8qIFUrMjEwMC1VKzIxNEYgKi8KKy8qIEJpdCAzNiAgIE51bWJlciBGb3JtcyAqLworI2RlZmluZSBUVF9VQ1JfTlVNQkVSX0ZPUk1TICAgICAgICAgICAgICAgICAgICAoMUwgPDwgIDQpIC8qIFUrMjE1MC1VKzIxOEYgKi8KKy8qIEJpdCAzNyAgIEFycm93cyAqLworI2RlZmluZSBUVF9VQ1JfQVJST1dTICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgIDUpIC8qIFUrMjE5MC1VKzIxRkYgKi8KKy8qIEJpdCAzOCAgIE1hdGhlbWF0aWNhbCBPcGVyYXRvcnMgKi8KKyNkZWZpbmUgVFRfVUNSX01BVEhFTUFUSUNBTF9PUEVSQVRPUlMgICAgICAgICAgKDFMIDw8ICA2KSAvKiBVKzIyMDAtVSsyMkZGICovCisvKiBCaXQgMzkgTWlzY2VsbGFuZW91cyBUZWNobmljYWwgKi8KKyNkZWZpbmUgVFRfVUNSX01JU0NFTExBTkVPVVNfVEVDSE5JQ0FMICAgICAgICAgKDFMIDw8ICA3KSAvKiBVKzIzMDAtVSsyM0ZGICovCisvKiBCaXQgNDAgICBDb250cm9sIFBpY3R1cmVzICovCisjZGVmaW5lIFRUX1VDUl9DT05UUk9MX1BJQ1RVUkVTICAgICAgICAgICAgICAgICgxTCA8PCAgOCkgLyogVSsyNDAwLVUrMjQzRiAqLworLyogQml0IDQxICAgT3B0aWNhbCBDaGFyYWN0ZXIgUmVjb2duaXRpb24gKi8KKyNkZWZpbmUgVFRfVUNSX09DUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8ICA5KSAvKiBVKzI0NDAtVSsyNDVGICovCisvKiBCaXQgNDIgICBFbmNsb3NlZCBBbHBoYW51bWVyaWNzICovCisjZGVmaW5lIFRUX1VDUl9FTkNMT1NFRF9BTFBIQU5VTUVSSUNTICAgICAgICAgICgxTCA8PCAxMCkgLyogVSsyNDYwLVUrMjRGRiAqLworLyogQml0IDQzICAgQm94IERyYXdpbmcgKi8KKyNkZWZpbmUgVFRfVUNSX0JPWF9EUkFXSU5HICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDExKSAvKiBVKzI1MDAtVSsyNTdGICovCisvKiBCaXQgNDQgICBCbG9jayBFbGVtZW50cyAqLworI2RlZmluZSBUVF9VQ1JfQkxPQ0tfRUxFTUVOVFMgICAgICAgICAgICAgICAgICAoMUwgPDwgMTIpIC8qIFUrMjU4MC1VKzI1OUYgKi8KKy8qIEJpdCA0NSAgIEdlb21ldHJpYyBTaGFwZXMgKi8KKyNkZWZpbmUgVFRfVUNSX0dFT01FVFJJQ19TSEFQRVMgICAgICAgICAgICAgICAgKDFMIDw8IDEzKSAvKiBVKzI1QTAtVSsyNUZGICovCisvKiBCaXQgNDYgICBNaXNjZWxsYW5lb3VzIFN5bWJvbHMgKi8KKyNkZWZpbmUgVFRfVUNSX01JU0NFTExBTkVPVVNfU1lNQk9MUyAgICAgICAgICAgKDFMIDw8IDE0KSAvKiBVKzI2MDAtVSsyNkZGICovCisvKiBCaXQgNDcgICBEaW5nYmF0cyAqLworI2RlZmluZSBUVF9VQ1JfRElOR0JBVFMgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMTUpIC8qIFUrMjcwMC1VKzI3QkYgKi8KKworLyogQ0pLIFBob25ldGljcyBhbmQgU3ltYm9scyBBcmVhICovCisKKy8qIEJpdCA0OCAgIENKSyBTeW1ib2xzIEFuZCBQdW5jdHVhdGlvbiAqLworI2RlZmluZSBUVF9VQ1JfQ0pLX1NZTUJPTFMgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMTYpIC8qIFUrMzAwMC1VKzMwM0YgKi8KKy8qIEJpdCA0OSAgIEhpcmFnYW5hICovCisjZGVmaW5lIFRUX1VDUl9ISVJBR0FOQSAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAxNykgLyogVSszMDQwLVUrMzA5RiAqLworLyogQml0IDUwICAgS2F0YWthbmEgKi8KKyNkZWZpbmUgVFRfVUNSX0tBVEFLQU5BICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDE4KSAvKiBVKzMwQTAtVSszMEZGICovCisvKiBCaXQgNTEgICBCb3BvbW9mbyAqLworI2RlZmluZSBUVF9VQ1JfQk9QT01PRk8gICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMTkpIC8qIFUrMzEwMC1VKzMxMkYgKi8KKy8qIEJpdCA1MiAgIEhhbmd1bCBDb21wYXRpYmlsaXR5IEphbW8gKi8KKyNkZWZpbmUgVFRfVUNSX0hBTkdVTF9DT01QQVRJQklMSVRZX0pBTU8gICAgICAgKDFMIDw8IDIwKSAvKiBVKzMxMzAtVSszMThGICovCisvKiBCaXQgNTMgICBDSksgTWlzY2VsbGFuZW91cyAqLworI2RlZmluZSBUVF9VQ1JfQ0pLX01JU0MgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMjEpIC8qIFUrMzE5MC1VKzMxOUYgKi8KKy8qIEJpdCA1NCAgIEVuY2xvc2VkIENKSyBMZXR0ZXJzIEFuZCBNb250aHMgKi8KKyNkZWZpbmUgVFRfVUNSX0VOQ0xPU0VEX0NKS19MRVRURVJTX01PTlRIUyAgICAgKDFMIDw8IDIyKSAvKiBVKzMyMDAtVSszMkZGICovCisvKiBCaXQgNTUgICBDSksgQ29tcGF0aWJpbGl0eSAqLworI2RlZmluZSBUVF9VQ1JfQ0pLX0NPTVBBVElCSUxJVFkgICAgICAgICAgICAgICAoMUwgPDwgMjMpIC8qIFUrMzMwMC1VKzMzRkYgKi8KKworLyogSGFuZ3VsIFN5bGxhYmxlcyBBcmVhICovCisKKy8qIEJpdCA1NiAgIEhhbmd1bCAqLworI2RlZmluZSBUVF9VQ1JfSEFOR1VMICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMjQpIC8qIFUrQUMwMC1VK0Q3QTMgKi8KKworLyogU3Vycm9nYXRlcyBBcmVhICovCisKKy8qIEJpdCA1NyAgIFN1cnJvZ2F0ZXMgKi8KKyNkZWZpbmUgVFRfVUNSX1NVUlJPR0FURVMgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDI1KSAvKiBVK0Q4MDAtVStERkZGICovCisvKiBCaXQgNTggaXMgcmVzZXJ2ZWQgZm9yIFVuaWNvZGUgU3ViUmFuZ2VzICovCisKKy8qIENKSyBJZGVvZ3JhcGhzIEFyZWEgKi8KKworLyogQml0IDU5ICAgQ0pLIFVuaWZpZWQgSWRlb2dyYXBocyAqLworI2RlZmluZSBUVF9VQ1JfQ0pLX1VOSUZJRURfSURFT0dSQVBIUyAgICAgICAgICAoMUwgPDwgMjcpIC8qIFUrNEUwMC1VKzlGRkYgKi8KKworLyogUHJpdmF0ZSBVc2UgQXJlYSAqLworCisvKiBCaXQgNjAgICBQcml2YXRlIFVzZSAqLworI2RlZmluZSBUVF9VQ1JfUFJJVkFURV9VU0UgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMjgpIC8qIFUrRTAwMC1VK0Y4RkYgKi8KKworLyogQ29tcGF0aWJpbGl0eSBBcmVhIGFuZCBTcGVjaWFscyAqLworCisvKiBCaXQgNjEgICBDSksgQ29tcGF0aWJpbGl0eSBJZGVvZ3JhcGhzICovCisjZGVmaW5lIFRUX1VDUl9DSktfQ09NUEFUSUJJTElUWV9JREVPR1JBUEhTICAgICgxTCA8PCAyOSkgLyogVStGOTAwLVUrRkFGRiAqLworLyogQml0IDYyICAgQWxwaGFiZXRpYyBQcmVzZW50YXRpb24gRm9ybXMgKi8KKyNkZWZpbmUgVFRfVUNSX0FMUEhBQkVUSUNfUFJFU0VOVEFUSU9OX0ZPUk1TICAgKDFMIDw8IDMwKSAvKiBVK0ZCMDAtVStGQjRGICovCisvKiBCaXQgNjMgICBBcmFiaWMgUHJlc2VudGF0aW9uIEZvcm1zLUEgKi8KKyNkZWZpbmUgVFRfVUNSX0FSQUJJQ19QUkVTRU5UQVRJT05TX0EgICAgICAgICAgKDFMIDw8IDMxKSAvKiBVK0ZCNTAtVStGU0ZGICovCisvKiBCaXQgNjQgICBDb21iaW5pbmcgSGFsZiBNYXJrcyAqLworI2RlZmluZSBUVF9VQ1JfQ09NQklOSU5HX0hBTEZfTUFSS1MgICAgICAgICAgICAoMUwgPDwgIDApIC8qIFUrRkUyMC1VK0ZFMkYgKi8KKy8qIEJpdCA2NSAgIENKSyBDb21wYXRpYmlsaXR5IEZvcm1zICovCisjZGVmaW5lIFRUX1VDUl9DSktfQ09NUEFUSUJJTElUWV9GT1JNUyAgICAgICAgICgxTCA8PCAgMSkgLyogVStGRTMwLVUrRkU0RiAqLworLyogQml0IDY2ICAgU21hbGwgRm9ybSBWYXJpYW50cyAqLworI2RlZmluZSBUVF9VQ1JfU01BTExfRk9STV9WQVJJQU5UUyAgICAgICAgICAgICAoMUwgPDwgIDIpIC8qIFUrRkU1MC1VK0ZFNkYgKi8KKy8qIEJpdCA2NyAgIEFyYWJpYyBQcmVzZW50YXRpb24gRm9ybXMtQiAqLworI2RlZmluZSBUVF9VQ1JfQVJBQklDX1BSRVNFTlRBVElPTlNfQiAgICAgICAgICAoMUwgPDwgIDMpIC8qIFUrRkU3MC1VK0ZFRkYgKi8KKy8qIEJpdCA2OCAgIEhhbGZ3aWR0aCBBbmQgRnVsbHdpZHRoIEZvcm1zICovCisjZGVmaW5lIFRUX1VDUl9IQUxGV0lEVEhfRlVMTFdJRFRIX0ZPUk1TICAgICAgICgxTCA8PCAgNCkgLyogVStGRjAwLVUrRkZFRiAqLworLyogQml0IDY5ICAgU3BlY2lhbHMgKi8KKyNkZWZpbmUgVFRfVUNSX1NQRUNJQUxTICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8ICA1KSAvKiBVK0ZFRkYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVStGRkYwLVUrRkZGRiAqLworLyogQml0IDcwICAgVGliZXRhbiAqLworI2RlZmluZSBUVF9VQ1JfVElCRVRBTiAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgIDYpIC8qIFUrMEYwMC1VKzBGQkYgKi8KKworCisvKiBTb21lIGNvbXBpbGVycyBoYXZlIGEgdmVyeSBsaW1pdGVkIGxlbmd0aCBvZiBpZGVudGlmaWVycy4gKi8KKyNpZiBkZWZpbmVkKCBfX1RVUkJPQ19fICkgJiYgX19UVVJCT0NfXyA8IDB4MDQxMCB8fCBkZWZpbmVkKCBfX1BBQ0lGSUNfXyApCisjZGVmaW5lIEhBVkVfTElNSVRfT05fSURFTlRTCisjZW5kaWYKKworI2lmbmRlZiBIQVZFX0xJTUlUX09OX0lERU5UUworCisvKgorICogIEhlcmUgc29tZSBhbGlhcyAjZGVmaW5lcyBpbiBvcmRlciB0byBiZSBjbGVhcmVyLgorICoKKyAqICBUaGVzZSBhcmUgbm90IGFsd2F5cyAjZGVmaW5lZCB0byBzdGF5IHdpdGhpbiB0aGUgMzEgY2hhcmFjdGVyIGxpbWl0CisgKiAgd2hpY2ggc29tZSBjb21waWxlcnMgaGF2ZS4KKyAqCisgKiAgQ3JlZGl0cyBnbyB0byBEYXZlIEhvbyA8ZGhvb0BmbGFzaC5uZXQ+IGZvciBwb2ludGluZyBvdXQgdGhhdCBtb2Rlcm4KKyAqICBCb3JsYW5kIGNvbXBpbGVycyAocmVhZDogZnJvbSBCQysrIDMuMSBvbikgY2FuIGluY3JlYXNlIHRoaXMgbGltaXQuCisgKiAgSWYgeW91IGdldCBhIHdhcm5pbmcgd2l0aCBzdWNoIGEgY29tcGlsZXIsIHVzZSB0aGUgLWk0MCBzd2l0Y2guCisgKi8KKyAKKyNkZWZpbmUgVFRfVUNSX0FSQUJJQ19QUkVTRU5UQVRJT05fRk9STVNfQSAgICAgIFwKKyAgICAgICAgIFRUX1VDUl9BUkFCSUNfUFJFU0VOVEFUSU9OU19BCisjZGVmaW5lIFRUX1VDUl9BUkFCSUNfUFJFU0VOVEFUSU9OX0ZPUk1TX0IgICAgICBcCisgICAgICAgICBUVF9VQ1JfQVJBQklDX1BSRVNFTlRBVElPTlNfQiAgICAgICAgICAgCisKKyNkZWZpbmUgVFRfVUNSX0NPTUJJTklOR19ESUFDUklUSUNBTF9NQVJLUyAgICAgIFwKKyAgICAgICAgIFRUX1VDUl9DT01CSU5JTkdfRElBQ1JJVElDUworI2RlZmluZSBUVF9VQ1JfQ09NQklOSU5HX0RJQUNSSVRJQ0FMX01BUktTX1NZTUIgXAorICAgICAgICAgVFRfVUNSX0NPTUJJTklOR19ESUFDUklUSUNTX1NZTUIKKworI2VuZGlmIC8qIG5kZWYgSEFWRV9MSU1JVF9PTl9JREVOVFMgKi8KKworI2VuZGlmIC8qIFRUTkFNRUlEX0ggKi8KKworCisvKiBFTkQgKi8KZGlmZiAtLWdpdCBhL29iai9SRUFETUUgYi9vYmovUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxZmRjYmQKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovUkVBRE1FCkBAIC0wLDAgKzEgQEAKK1RoaXMgZGlyZWN0b3J5IGNvbnRhaW5zIGFsbCB0aGUgb2JqZWN0IGZpbGVzIGNyZWF0ZWQgd2hlbiBidWlsZGluZyB0aGUgbGlicmFyeQpkaWZmIC0tZ2l0IGEvc3JjL2Jhc2UvZnRiYXNlLmMgYi9zcmMvYmFzZS9mdGJhc2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTAwZTYyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2Jhc2UvZnRiYXNlLmMKQEAgLTAsMCArMSw2IEBACisjaW5jbHVkZSA8ZnRjYWxjLmM+CisjaW5jbHVkZSA8ZnRvYmpzLmM+CisjaW5jbHVkZSA8ZnRzdHJlYW0uYz4KKyNpbmNsdWRlIDxmdGxpc3QuYz4KKworI2luY2x1ZGUgPGZ0ZXh0ZW5kLmM+CmRpZmYgLS1naXQgYS9zcmMvYmFzZS9mdGJib3guYyBiL3NyYy9iYXNlL2Z0YmJveC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxZDQ0MzAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvYmFzZS9mdGJib3guYwpAQCAtMCwwICsxLDQ0NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgZnRiYm94LmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZyZWVUeXBlIGJib3ggY29tcHV0YXRpb24gKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAxOTk2LTE5OTkgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCAgICAgICAgKi8KKy8qICBtb2RpZmllZCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgICovCisvKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLworLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KKy8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogVGhpcyBjb21wb25lbnQgaGFzIGEgX3NpbmdsZV8gcm9sZTogdG8gY29tcHV0ZSBleGFjdCBvdXRsaW5lIGJvdW5kaW5nICovCisgIC8qIGJveGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogSXQgaXMgc2VwYXJhdGVkIGZyb20gdGhlIHJlc3Qgb2YgdGhlIGVuZ2luZSBmb3IgdmFyaW91cyB0ZWNobmljYWwgICAgICovCisgIC8qIHJlYXNvbnMuICBJdCBtYXkgd2VsbCBiZSBpbnRlZ3JhdGVkIGluIGBmdG91dGxuJyBsYXRlci4gICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2luY2x1ZGUgPGZ0YmJveC5oPgorI2luY2x1ZGUgPGZ0aW1hZ2UuaD4KKyNpbmNsdWRlIDxmdG9ianMuaD4KKworICB0eXBlZGVmIHN0cnVjdCAgVEJCb3hfUmVjXworICB7CisgICAgRlRfVmVjdG9yICBsYXN0OworICAgIEZUX0JCb3ggICAgYmJveDsKKworICB9IFRCQm94X1JlYzsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEJCb3hfTW92ZV9UbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBhcyBhIGBtb3ZlX3RvJyBhbmQgYGxpbmVfdG8nIGVtaXR0ZXIgZHVyaW5nICAqLworICAvKiAgICBGVF9SYXN0ZXJfRGVjb21wb3NlKCkuICBJdCBzaW1wbHkgcmVjb3JkcyB0aGUgZGVzdGluYXRpb24gcG9pbnQgaW4gKi8KKyAgLyogICAgdXNlci0+bGFzdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgdG8gICA6OiBUaGUgZGVzdGluYXRpb24gdmVjdG9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHVzZXIgOjogVGhlIGN1cnJlbnQgd2FsayBjb250ZXh0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgc3RhdGljCisgIGludCAgQkJveF9Nb3ZlX1RvKCBGVF9WZWN0b3IqICB0bywKKyAgICAgICAgICAgICAgICAgICAgIFRCQm94X1JlYyogIHVzZXIgKQorICB7CisgICAgdXNlci0+bGFzdCA9ICp0bzsKKworICAgIHJldHVybiAwOworICB9CisKKworI2RlZmluZSBDSEVDS19YKCBwLCBiYm94ICkgIFwKKyAgICAgICAgICAoIHAtPnggPCBiYm94LnhNaW4gfHwgcC0+eCA+IGJib3gueE1heCApCisKKyNkZWZpbmUgQ0hFQ0tfWSggcCwgYmJveCApICBcCisgICAgICAgICAgKCBwLT55IDwgYmJveC55TWluIHx8IHAtPnkgPiBiYm94LnlNYXggKQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQkJveF9Db25pY19DaGVjayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRmluZHMgdGhlIGV4dHJlbWEgb2YgYSAxLWRpbWVuc2lvbmFsIGNvbmljIEJlemllciBjdXJ2ZSBhbmQgdXBkYXRlICovCisgIC8qICAgIGEgYm91bmRpbmcgcmFuZ2UuICBUaGlzIHZlcnNpb24gdXNlcyBkaXJlY3QgY29tcHV0YXRpb24sIGFzIGl0ICAgICAqLworICAvKiAgICBkb2Vzbid0IG5lZWQgc3F1YXJlIHJvb3RzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB5MSAgOjogVGhlIHN0YXJ0IGNvb3JkaW5hdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgeTIgIDo6IFRoZSBjb29yZGluYXRlIG9mIHRoZSBjb250cm9sIHBvaW50LiAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHkzICA6OiBUaGUgZW5kIGNvb3JkaW5hdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG1pbiA6OiBUaGUgYWRkcmVzcyBvZiB0aGUgY3VycmVudCBtaW5pbXVtLiAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBtYXggOjogVGhlIGFkZHJlc3Mgb2YgdGhlIGN1cnJlbnQgbWF4aW11bS4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0YXRpYworICB2b2lkICBCQm94X0NvbmljX0NoZWNrKCBGVF9Qb3MgICB5MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICAgeTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgIHkzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MqICBtaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyogIG1heCApCisgIHsKKyAgICBpZiggeTEgPT0geTMgKQorICAgIHsKKyAgICAgIGlmICggeTIgPT0geTEgKSAgICAgICAgICAgICAgIC8qIEZsYXQgYXJjICovCisgICAgICB7CisgICAgICAgIHkzID0geTE7CisgICAgICAgIGdvdG8gU3VpdGU7CisgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKCB5MSA8IHkzICkKKyAgICB7CisgICAgICBpZiAoIHkyID49IHkxICYmIHkyIDw9IHkzICkgICAvKiBBc2NlbmRpbmcgYXJjICovCisgICAgICAgIGdvdG8gU3VpdGU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBpZiAoIHkyID49IHkzICYmIHkyIDw9IHkxICkgICAvKiBEZXNjZW5kaW5nIGFyYyAqLworICAgICAgeworICAgICAgICB5MiA9IHkxOworICAgICAgICB5MSA9IHkzOworICAgICAgICB5MyA9IHkyOworICAgICAgICBnb3RvIFN1aXRlOworICAgICAgfQorICAgIH0KKworICAgIHkxID0geTMgPSBGVF9NdWxEaXYoIHkyIC0geTEsIHkyIC0geTEsIHkxIC0gMip5MiArIHkzICk7CisKKyAgU3VpdGU6CisgICAgaWYgKCB5MSA8ICptaW4gKSAqbWluID0geTE7CisgICAgaWYgKCB5MyA+ICptYXggKSAqbWF4ID0geTM7CisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEJCb3hfQ29uaWNfVG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBhcyBhIGBjb25pY190bycgZW1pdHRlciBkdXJpbmcgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9SYXN0ZXJfRGVjb21wb3NlKCkuICBJdCBjaGVja3MgYSBjb25pYyBCZXppZXIgY3VydmUgd2l0aCB0aGUgICAgKi8KKyAgLyogICAgY3VycmVudCBib3VuZGluZyBib3gsIGFuZCBjb21wdXRlcyBpdHMgZXh0cmVtYSBpZiBuZWNlc3NhcnkgdG8gICAgICovCisgIC8qICAgIHVwZGF0ZSBpdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGNvbnRyb2wgOjogQSBjb250cm9sIHBvaW50LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB0byAgICAgIDo6IFRoZSBkZXN0aW5hdGlvbiB2ZWN0b3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB1c2VyICAgIDo6IFRoZSBjdXJyZW50IHdhbGsgY29udGV4dC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBFcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBJbiB0aGUgY2FzZSBvZiBhIG5vbi1tb25vdG9ub3VzIGFyYywgd2UgY29tcHV0ZSBkaXJlY3RseSB0aGUgICAgICAgKi8KKyAgLyogICAgZXh0cmVtdW0gY29vcmRpbmF0ZXMsIGFzIGl0IGlzIHN1ZmZpY2llbnRseSBmYXN0LiAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBzdGF0aWMKKyAgaW50ICBCQm94X0NvbmljX1RvKCBGVF9WZWN0b3IqICBjb250cm9sLAorICAgICAgICAgICAgICAgICAgICAgIEZUX1ZlY3RvciogIHRvLAorICAgICAgICAgICAgICAgICAgICAgIFRCQm94X1JlYyogIHVzZXIgKQorICB7CisgICAgaWYgKCBDSEVDS19YKCBjb250cm9sLCB1c2VyLT5iYm94ICkgfHwKKyAgICAgICAgIENIRUNLX1goIHRvLCAgICAgIHVzZXItPmJib3ggKSApCisKKyAgICAgIEJCb3hfQ29uaWNfQ2hlY2soIHVzZXItPmxhc3QueCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wtPngsCisgICAgICAgICAgICAgICAgICAgICAgICB0by0+eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICZ1c2VyLT5iYm94LnhNaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAmdXNlci0+YmJveC54TWF4ICk7CisKKyAgICBpZiAoIENIRUNLX1koIGNvbnRyb2wsIHVzZXItPmJib3ggKSB8fAorICAgICAgICAgQ0hFQ0tfWSggdG8sICAgICAgdXNlci0+YmJveCApICkKKworICAgICAgQkJveF9Db25pY19DaGVjayggdXNlci0+bGFzdC55LAorICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbC0+eSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRvLT55LAorICAgICAgICAgICAgICAgICAgICAgICAgJnVzZXItPmJib3gueU1pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICZ1c2VyLT5iYm94LnlNYXggKTsKKworICAgIHJldHVybiAwOworICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBCQm94X0N1YmljX0NoZWNrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGaW5kcyB0aGUgZXh0cmVtYSBvZiBhIDEtZGltZW5zaW9uYWwgY3ViaWMgQmV6aWVyIGN1cnZlIGFuZCAgICAgICAgKi8KKyAgLyogICAgdXBkYXRlcyBhIGJvdW5kaW5nIHJhbmdlLiAgVGhpcyB2ZXJzaW9uIHVzZXMgc3BsaXR0aW5nIGJlY2F1c2Ugd2UgICovCisgIC8qICAgIGRvbid0IHdhbnQgdG8gdXNlIHNxdWFyZSByb290cyBhbmQgZXh0cmEgYWNjdXJhY2llcy4gICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHAxICA6OiBUaGUgc3RhcnQgY29vcmRpbmF0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBwMiAgOjogVGhlIGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IGNvbnRyb2wgcG9pbnQuICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgcDMgIDo6IFRoZSBjb29yZGluYXRlIG9mIHRoZSBzZWNvbmQgY29udHJvbCBwb2ludC4gICAgICAgICAgICAgICAgICovCisgIC8qICAgIHA0ICA6OiBUaGUgZW5kIGNvb3JkaW5hdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG1pbiA6OiBUaGUgYWRkcmVzcyBvZiB0aGUgY3VycmVudCBtaW5pbXVtLiAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBtYXggOjogVGhlIGFkZHJlc3Mgb2YgdGhlIGN1cnJlbnQgbWF4aW11bS4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0YXRpYworICB2b2lkICBCQm94X0N1YmljX0NoZWNrKCBGVF9Qb3MgICBwMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICAgcDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgIHAzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgICBwNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9zKiAgbWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MqICBtYXggKQorICB7CisgICAgRlRfUG9zICBzdGFja1szM10sICphcmM7CisKKworICAgIGFyYyA9IHN0YWNrOworCisgICAgYXJjWzBdID0gcDE7CisgICAgYXJjWzFdID0gcDI7CisgICAgYXJjWzJdID0gcDM7CisgICAgYXJjWzNdID0gcDQ7CisKKyAgICBkbworICAgIHsKKyAgICAgIEZUX1BvcyAgeTEgPSBhcmNbMF07CisgICAgICBGVF9Qb3MgIHkyID0gYXJjWzFdOworICAgICAgRlRfUG9zICB5MyA9IGFyY1syXTsKKyAgICAgIEZUX1BvcyAgeTQgPSBhcmNbM107CisKKworICAgICAgaWYgKCB5MSA9PSB5NCApCisgICAgICB7CisgICAgICAgIGlmICggeTEgPT0geTIgJiYgeTEgPT0geTMgKSAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGbGF0ICovCisgICAgICAgIHsKKyAgICAgICAgICB5NCA9IHkxOworICAgICAgICAgIGdvdG8gVGVzdDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZSBpZiAoIHkxIDwgeTQgKQorICAgICAgeworICAgICAgICBpZiAoIHkyID49IHkxICYmIHkyIDw9IHk0ICYmIHkzID49IHkxICYmIHkzIDw9IHk0ICkgLyogQXNjZW5kaW5nICovCisgICAgICAgICAgZ290byBUZXN0OworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBpZiAoIHkyID49IHk0ICYmIHkyIDw9IHkxICYmIHkzID49IHk0ICYmIHkzIDw9IHkxICkgLyogRGVzY2VuZGluZyAqLworICAgICAgICB7CisgICAgICAgICAgeTIgPSB5MTsKKyAgICAgICAgICB5MSA9IHk0OworICAgICAgICAgIHk0ID0geTI7CisgICAgICAgICAgZ290byBUZXN0OworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8qIFVua25vd24gZGlyZWN0aW9uLCBzcGxpdCB0aGUgYXJjIGluIHR3byAqLworICAgICAgYXJjWzZdID0geTQ7CisgICAgICBhcmNbMV0gPSB5MSA9ICggeTEgKyB5MiApIC8gMjsKKyAgICAgIGFyY1s1XSA9IHk0ID0gKCB5NCArIHkzICkgLyAyOworICAgICAgeTIgPSAoIHkyICsgeTMgKSAvIDI7CisgICAgICBhcmNbMl0gPSB5MSA9ICggeTEgKyB5MiApIC8gMjsKKyAgICAgIGFyY1s0XSA9IHk0ID0gKCB5NCArIHkyICkgLyAyOworICAgICAgYXJjWzNdID0gKCB5MSArIHk0ICkgLyAyOworCisgICAgICBhcmMgKz0gMzsKKyAgICAgIGdvdG8gU3VpdGU7CisKKyAgIFRlc3Q6CisgICAgICBpZiAoIHkxIDwgKm1pbiApICptaW4gPSB5MTsKKyAgICAgIGlmICggeTQgPiAqbWF4ICkgKm1heCA9IHk0OworICAgICAgYXJjIC09IDM7CisKKyAgICBTdWl0ZToKKyAgICAgIDsKKyAgICB9IHdoaWxlIChhcmMgPj0gc3RhY2spOworICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBCQm94X0N1YmljX1RvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYXMgYSBgY3ViaWNfdG8nIGVtaXR0ZXIgZHVyaW5nICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfUmFzdGVyX0RlY29tcG9zZSgpLiAgSXQgY2hlY2tzIGEgY3ViaWMgQmV6aWVyIGN1cnZlIHdpdGggdGhlICAgICovCisgIC8qICAgIGN1cnJlbnQgYm91bmRpbmcgYm94LCBhbmQgY29tcHV0ZXMgaXRzIGV4dHJlbWEgaWYgbmVjZXNzYXJ5IHRvICAgICAqLworICAvKiAgICB1cGRhdGUgaXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBjb250cm9sMSA6OiBUaGUgZmlyc3QgY29udHJvbCBwb2ludC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgY29udHJvbDIgOjogVGhlIHNlY29uZCBjb250cm9sIHBvaW50LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHRvICAgICAgIDo6IFRoZSBkZXN0aW5hdGlvbiB2ZWN0b3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHVzZXIgICAgIDo6IFRoZSBjdXJyZW50IHdhbGsgY29udGV4dC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEluIHRoZSBjYXNlIG9mIGEgbm9uLW1vbm90b25vdXMgYXJjLCB3ZSBkb24ndCBjb21wdXRlIGRpcmVjdGx5ICAgICAqLworICAvKiAgICBleHRyZW11bSBjb29yZGluYXRlcywgd2Ugc3ViZGl2aXNlIGluc3RlYWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0YXRpYworICBpbnQgIEJCb3hfQ3ViaWNfVG8oIEZUX1ZlY3RvciogIGNvbnRyb2wxLAorICAgICAgICAgICAgICAgICAgICAgIEZUX1ZlY3RvciogIGNvbnRyb2wyLAorICAgICAgICAgICAgICAgICAgICAgIEZUX1ZlY3RvciogIHRvLAorICAgICAgICAgICAgICAgICAgICAgIFRCQm94X1JlYyogIHVzZXIgKQorICB7CisgICAgaWYgKCBDSEVDS19YKCBjb250cm9sMSwgdXNlci0+YmJveCApIHx8CisgICAgICAgICBDSEVDS19YKCBjb250cm9sMiwgdXNlci0+YmJveCApIHx8CisgICAgICAgICBDSEVDS19YKCB0bywgICAgICAgdXNlci0+YmJveCApICkKKworICAgICAgICBCQm94X0N1YmljX0NoZWNrKCB1c2VyLT5sYXN0LngsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wxLT54LAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sMi0+eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdG8tPngsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ1c2VyLT5iYm94LnhNaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ1c2VyLT5iYm94LnhNYXggKTsKKworICAgIGlmICggQ0hFQ0tfWSggY29udHJvbDEsIHVzZXItPmJib3ggKSB8fAorICAgICAgICAgQ0hFQ0tfWSggY29udHJvbDIsIHVzZXItPmJib3ggKSB8fAorICAgICAgICAgQ0hFQ0tfWSggdG8sICAgICAgIHVzZXItPmJib3ggKSApCisKKyAgICAgICAgQkJveF9DdWJpY19DaGVjayggdXNlci0+bGFzdC55LAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sMS0+eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbDItPnksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRvLT55LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdXNlci0+YmJveC55TWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdXNlci0+YmJveC55TWF4ICk7CisKKyAgICByZXR1cm4gMDsKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfUmFzdGVyX0dldEJCb3ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQ29tcHV0ZXMgdGhlIGV4YWN0IGJvdW5kaW5nIGJveCBvZiBhbiBvdXRsaW5lLiAgVGhpcyBpcyBzbG93ZXIgICAgICovCisgIC8qICAgIHRoYW4gY29tcHV0aW5nIHRoZSBjb250cm9sIGJveC4gIEhvd2V2ZXIsIGl0IHVzZXMgYW4gYWR2YW5jZWQgICAgICAqLworICAvKiAgICBhbGdvcml0aG0gd2hpY2ggcmV0dXJucyBfdmVyeV8gcXVpY2tseSB3aGVuIHRoZSB0d28gYm94ZXMgICAgICAgICAgKi8KKyAgLyogICAgY29pbmNpZGUuIE90aGVyd2lzZSwgdGhlIG91dGxpbmUgQmV6aWVyIGFyY3MgYXJlIHdhbGtlZCBvdmVyIHRvICAgICovCisgIC8qICAgIGV4dHJhY3QgdGhlaXIgZXh0cmVtYS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG91dGxpbmUgOjogQSBwb2ludGVyIHRvIHRoZSBzb3VyY2Ugb3V0bGluZS4gICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGJib3ggICAgOjogVGhlIG91dGxpbmUncyBleGFjdCBib3VuZGluZyBib3guICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgRVhQT1JUX0ZVTkMKKyAgRlRfRXJyb3IgIEZUX1Jhc3Rlcl9HZXRCQm94KCBGVF9PdXRsaW5lKiAgb3V0bGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CQm94KiAgICAgYWJib3ggKQorICB7CisgICAgRlRfQkJveCAgICBjYm94OworICAgIEZUX0JCb3ggICAgYmJveDsKKyAgICBGVF9WZWN0b3IqIHZlYzsKKyAgICBGVF9VU2hvcnQgIG47CisKKworICAgIC8qIGlmIG91dGxpbmUgaXMgZW1wdHksIHJldHVybiAoMCwwLDAsMCkgKi8KKyAgICBpZiAoICFvdXRsaW5lICkKKyAgICAgIHJldHVybiBGVF9FcnJfSW52YWxpZF9PdXRsaW5lOworCisgICAgaWYgKCBvdXRsaW5lLT5uX3BvaW50cyA9PSAwIHx8IG91dGxpbmUtPm5fY29udG91cnMgPD0gMCApCisgICAgeworICAgICAgYWJib3gtPnhNaW4gPSBhYmJveC0+eE1heCA9IDA7CisgICAgICBhYmJveC0+eU1pbiA9IGFiYm94LT55TWF4ID0gMDsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8qIFdlIGNvbXB1dGUgdGhlIGNvbnRyb2wgYm94LCBhcyB3ZWxsIGFzIHRoZSBib3VuZGluZyBib3ggICAgKi8KKyAgICAvKiBvZiBhbGwgYG9uJyBwb2ludHMgaW4gdGhlIG91dGxpbmUuICBUaGVuLCBpZiB0aGUgdHdvIGJveGVzICovCisgICAgLyogY29pbmNpZGUsIHdlIGV4aXQgaW1tZWRpYXRlbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgICAgdmVjID0gb3V0bGluZS0+cG9pbnRzOworICAgIGJib3gueE1pbiA9IGJib3gueE1heCA9IGNib3gueE1pbiA9IGNib3gueE1heCA9IHZlYy0+eDsKKyAgICBiYm94LnlNaW4gPSBiYm94LnlNaW4gPSBjYm94LnlNaW4gPSBjYm94LnlNYXggPSB2ZWMtPnk7CisKKyAgICBmb3IgKCBuID0gMTsgbiA8IG91dGxpbmUtPm5fcG9pbnRzOyBuKysgKQorICAgIHsKKyAgICAgIEZUX1BvcyAgeCA9IHZlYy0+eDsKKyAgICAgIEZUX1BvcyAgeSA9IHZlYy0+eTsKKworCisgICAgICAvKiB1cGRhdGUgY29udHJvbCBib3ggKi8KKyAgICAgIGlmICggeCA8IGNib3gueE1pbiApIGNib3gueE1pbiA9IHg7CisgICAgICBpZiAoIHggPiBjYm94LnhNYXggKSBjYm94LnhNYXggPSB4OworCisgICAgICBpZiAoIHkgPCBjYm94LnlNaW4gKSBjYm94LnlNaW4gPSB5OworICAgICAgaWYgKCB5ID4gY2JveC55TWF4ICkgY2JveC55TWF4ID0geTsKKworICAgICAgaWYgKCBGVF9DVVJWRV9UQUcoIG91dGxpbmUtPmZsYWdzW25dICkgPT0gRlRfQ3VydmVfVGFnX09uICkKKyAgICAgIHsKKyAgICAgICAgLyogdXBkYXRlIGJib3ggZm9yIGBvbicgcG9pbnRzIG9ubHkgKi8KKyAgICAgICAgaWYgKCB4IDwgYmJveC54TWluICkgYmJveC54TWluID0geDsKKyAgICAgICAgaWYgKCB4ID4gYmJveC54TWF4ICkgYmJveC54TWF4ID0geDsKKworICAgICAgICBpZiAoIHkgPCBiYm94LnlNaW4gKSBiYm94LnlNaW4gPSB5OworICAgICAgICBpZiAoIHkgPiBiYm94LnlNYXggKSBiYm94LnlNYXggPSB5OworICAgICAgfQorCisgICAgICB2ZWMrKzsKKyAgICB9CisKKyAgICAvKiB0ZXN0IHR3byBib3hlcyBmb3IgZXF1YWxpdHkgKi8KKyAgICBpZiAoIGNib3gueE1pbiA8IGJib3gueE1pbiB8fCBjYm94LnhNYXggPiBiYm94LnhNYXggfHwKKyAgICAgICAgIGNib3gueU1pbiA8IGJib3gueU1pbiB8fCBjYm94LnlNYXggPiBiYm94LnlNYXggKQorICAgIHsKKyAgICAgIC8qIHRoZSB0d28gYm94ZXMgYXJlIGRpZmZlcmVudCwgbm93IHdhbGsgb3ZlciB0aGUgb3V0bGluZSB0byAqLworICAgICAgLyogZ2V0IHRoZSBCZXppZXIgYXJjIGV4dHJlbWEuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICAgIHN0YXRpYyBGVF9PdXRsaW5lX0Z1bmNzICBpbnRlcmZhY2UgPQorICAgICAgeworICAgICAgICAoRlRfT3V0bGluZV9Nb3ZlVG9fRnVuYykgIEJCb3hfTW92ZV9UbywKKyAgICAgICAgKEZUX091dGxpbmVfTGluZVRvX0Z1bmMpICBCQm94X01vdmVfVG8sCisgICAgICAgIChGVF9PdXRsaW5lX0NvbmljVG9fRnVuYykgQkJveF9Db25pY19UbywKKyAgICAgICAgKEZUX091dGxpbmVfQ3ViaWNUb19GdW5jKSBCQm94X0N1YmljX1RvCisgICAgICB9OworCisgICAgICBGVF9FcnJvciAgIGVycm9yOworICAgICAgVEJCb3hfUmVjICB1c2VyOworCisKKyAgICAgIHVzZXIuYmJveCA9IGJib3g7CisKKyAgICAgIGVycm9yID0gRlRfRGVjb21wb3NlX091dGxpbmUoIG91dGxpbmUsICZpbnRlcmZhY2UsICZ1c2VyICk7CisgICAgICBpZiAoIGVycm9yICkKKyAgICAgICAgcmV0dXJuIGVycm9yOworCisgICAgICAqYWJib3ggPSB1c2VyLmJib3g7CisgICAgfQorICAgIGVsc2UKKyAgICAgICphYmJveCA9IGJib3g7CisKKyAgICByZXR1cm4gRlRfRXJyX09rOworICB9CisKKworLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvYmFzZS9mdGNhbGMuYyBiL3NyYy9iYXNlL2Z0Y2FsYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhY2M1OGUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvYmFzZS9mdGNhbGMuYwpAQCAtMCwwICsxLDUwNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgZnRjYWxjLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFyaXRobWV0aWMgY29tcHV0YXRpb25zIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAxOTk2LTE5OTkgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCAgICAgICAgKi8KKy8qICBtb2RpZmllZCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgICovCisvKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLworLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KKy8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFN1cHBvcnQgZm9yIDEtY29tcGxlbWVudCBhcml0aG1ldGljIGhhcyBiZWVuIHRvdGFsbHkgZHJvcHBlZCBpbiB0aGlzICAqLworICAvKiByZWxlYXNlLiAgWW91IGNhbiBzdGlsbCB3cml0ZSB5b3VyIG93biBjb2RlIGlmIHlvdSBuZWVkIGl0LiAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogIEltcGxlbWVudGluZyBiYXNpYyBjb21wdXRhdGlvbiByb3V0aW5lcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBGVF9NdWxEaXYoKSBhbmQgRlRfTXVsRml4KCkgYXJlIGRlY2xhcmVkIGluIGZyZWV0eXBlLmguICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8ZnRjYWxjLmg+CisjaW5jbHVkZSA8ZnRkZWJ1Zy5oPgorI2luY2x1ZGUgPGZ0b2Jqcy5oPiAgLyogZm9yIEFCUygpICovCisKKworICBCQVNFX0ZVTkMKKyAgRlRfSW50MzIgIEZUX1NxcnQzMiggRlRfSW50MzIgeCApCisgIHsKKyAgICBGVF9VTG9uZyAgdmFsLCByb290LCBuZXdyb290LCBtYXNrOworICAgIAorICAgIHJvb3QgPSAwOworICAgIG1hc2sgPSAweDQwMDAwMDAwOworICAgIHZhbCAgPSAoRlRfVUxvbmcpeDsKKyAgICBkbworICAgIHsKKyAgICAgIG5ld3Jvb3QgPSByb290K21hc2s7CisgICAgICBpZiAobmV3cm9vdCA8PSB2YWwpCisgICAgICB7CisgICAgICAgIHZhbCAtPSBuZXdyb290OworICAgICAgICByb290ID0gbmV3cm9vdCttYXNrOworICAgICAgfQorICAgICAgcm9vdCA+Pj0gMTsKKyAgICAgIG1hc2sgPj49IDI7CisgICAgfQorICAgIHdoaWxlIChtYXNrICE9IDApOworICAgIAorICAgIHJldHVybiByb290OworICB9CisKKyAgCisjaWZkZWYgTE9ORzY0CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9NdWxEaXYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBIHZlcnkgc2ltcGxlIGZ1bmN0aW9uIHVzZWQgdG8gcGVyZm9ybSB0aGUgY29tcHV0YXRpb24gYChBKkIpL0MnICAgKi8KKyAgLyogICAgd2l0aCBtYXhpbXVtIGFjY3VyYWN5IChpdCB1c2VzIGEgNjQtYml0IGludGVybWVkaWF0ZSBpbnRlZ2VyICAgICAgICovCisgIC8qICAgIHdoZW5ldmVyIG5lY2Vzc2FyeSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhpcyBmdW5jdGlvbiBpc24ndCBuZWNlc3NhcmlseSBhcyBmYXN0IGFzIHNvbWUgcHJvY2Vzc29yIHNwZWNpZmljICovCisgIC8qICAgIG9wZXJhdGlvbnMsIGJ1dCBpcyBhdCBsZWFzdCBjb21wbGV0ZWx5IHBvcnRhYmxlLiAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGEgOjogVGhlIGZpcnN0IG11bHRpcGxpZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBiIDo6IFRoZSBzZWNvbmQgbXVsdGlwbGllci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgYyA6OiBUaGUgZGl2aXNvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhlIHJlc3VsdCBvZiBgKGEqYikvYycuICBUaGlzIGZ1bmN0aW9uIG5ldmVyIHRyYXBzIHdoZW4gdHJ5aW5nIHRvICovCisgIC8qICAgIGRpdmlkZSBieSB6ZXJvLCBpdCBzaW1wbHkgcmV0dXJucyBgTWF4SW50JyBvciBgTWluSW50JyBkZXBlbmRpbmcgICAqLworICAvKiAgICBvbiB0aGUgc2lnbnMgb2YgYGEnIGFuZCBgYicuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEVYUE9SVF9GVU5DCisgIEZUX0xvbmcgIEZUX011bERpdiggRlRfTG9uZyAgYSwKKyAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICBiLAorICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgIGMgKQorICB7CisgICAgRlRfSW50IHM7CisKKyAgICBzID0gMTsKKyAgICBpZiAoIGEgPCAwICkgeyBhID0gLWE7IHMgPSAtczsgfQorICAgIGlmICggYiA8IDAgKSB7IGIgPSAtYjsgcyA9IC1zOyB9CisgICAgaWYgKCBjIDwgMCApIHsgYyA9IC1jOyBzID0gLXM7IH0KKworICAgIHJldHVybiBzKiggKChGVF9JbnQ2NClhICogYiArIChjID4+IDEpICkvYyk7CisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX011bEZpeCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgdmVyeSBzaW1wbGUgZnVuY3Rpb24gdXNlZCB0byBwZXJmb3JtIHRoZSBjb21wdXRhdGlvbiAgICAgICAgICAgICAqLworICAvKiAgICBgKEEqQikvMHgxMDAwMCcgd2l0aCBtYXhpbXVtIGFjY3VyYWN5LiAgTW9zdCBvZiB0aGUgdGltZSwgdGhpcyBpcyAgKi8KKyAgLyogICAgdXNlZCB0byBtdWx0aXBseSBhIGdpdmVuIHZhbHVlIGJ5IGEgMTYuMTYgZml4ZWQgZmxvYXQgZmFjdG9yLiAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgYSA6OiBUaGUgZmlyc3QgbXVsdGlwbGllci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGIgOjogVGhlIHNlY29uZCBtdWx0aXBsaWVyLiAgVXNlIGEgMTYuMTYgZmFjdG9yIGhlcmUgd2hlbmV2ZXIgICAgICAqLworICAvKiAgICAgICAgIHBvc3NpYmxlIChzZWUgbm90ZSBiZWxvdykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGUgcmVzdWx0IG9mIGAoYSpiKS8weDEwMDAwJy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGlzIGZ1bmN0aW9uIGhhcyBiZWVuIG9wdGltaXplZCBmb3IgdGhlIGNhc2Ugd2hlcmUgdGhlIGFic29sdXRlICAgKi8KKyAgLyogICAgdmFsdWUgb2YgYGEnIGlzIGxlc3MgdGhhbiAyMDQ4LCBhbmQgYGInIGlzIGEgMTYuMTYgc2NhbGluZyBmYWN0b3IuICovCisgIC8qICAgIEFzIHRoaXMgaGFwcGVucyBtYWlubHkgd2hlbiBzY2FsaW5nIGZyb20gbm90aW9uYWwgdW5pdHMgdG8gICAgICAgICAqLworICAvKiAgICBmcmFjdGlvbmFsIHBpeGVscyBpbiBGcmVlVHlwZSwgaXQgcmVzdWx0ZWQgaW4gbm90aWNlYWJsZSBzcGVlZCAgICAgKi8KKyAgLyogICAgaW1wcm92ZW1lbnRzIGJldHdlZW4gdmVyc2lvbnMgMi4wIGFuZCAxLnguICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBcyBhIGNvbmNsdXNpb24sIGFsd2F5cyB0cnkgdG8gcGxhY2UgYSAxNi4xNiBmYWN0b3IgYXMgdGhlICAgICAgICAgKi8KKyAgLyogICAgX3NlY29uZF8gYXJndW1lbnQgb2YgdGhpcyBmdW5jdGlvbjsgdGhpcyBjYW4gbWFrZSBhIGdyZWF0ICAgICAgICAgICovCisgIC8qICAgIGRpZmZlcmVuY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgRVhQT1JUX0ZVTkMKKyAgRlRfTG9uZyAgRlRfTXVsRml4KCBGVF9Mb25nICBhLAorICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgIGIgKQorICB7CisgICAgRlRfSW50IHM7CisKKyAgICBzID0gMTsKKyAgICBpZiAoIGEgPCAwICkgeyBhID0gLWE7IHMgPSAtczsgfQorICAgIGlmICggYiA8IDAgKSB7IGIgPSAtYjsgcyA9IC1zOyB9CisKKyAgICByZXR1cm4gcyooRlRfTG9uZykoKEZUX0ludDY0KWEgKiBiICsgMHg4MDAwKSA+PiAxNik7CisgIH0KKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9EaXZGaXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBIHZlcnkgc2ltcGxlIGZ1bmN0aW9uIHVzZWQgdG8gcGVyZm9ybSB0aGUgY29tcHV0YXRpb24gICAgICAgICAgICAgKi8KKyAgLyogICAgYChBKjB4MTAwMDApL0InIHdpdGggbWF4aW11bSBhY2N1cmFjeS4gIE1vc3Qgb2YgdGhlIHRpbWUsIHRoaXMgaXMgICovCisgIC8qICAgIHVzZWQgdG8gZGl2aWRlICBhIGdpdmVuIHZhbHVlIGJ5IGEgMTYuMTYgZml4ZWQgZmxvYXQgZmFjdG9yLiAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGEgOjogVGhlIGZpcnN0IG11bHRpcGxpZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBiIDo6IFRoZSBzZWNvbmQgbXVsdGlwbGllci4gIFVzZSBhIDE2LjE2IGZhY3RvciBoZXJlIHdoZW5ldmVyICAgICAgKi8KKyAgLyogICAgICAgICBwb3NzaWJsZSAoc2VlIG5vdGUgYmVsb3cpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhlIHJlc3VsdCBvZiBgKGEqMHgxMDAwMCkvYicuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhlIG9wdGltaXNhdGlvbiBmb3IgRlRfRGl2Rml4KCkgaXMgc2ltcGxlIDogaWYgKGEgPDwgMTYpIGZpdHMgICAgICovCisgIC8qICAgIGluIDMyIGJpdHMsIHRoZW4gdGhlIGRpdmlzaW9uIGlzIGNvbXB1dGVkIGRpcmVjdGx5LiBPdGhlcndpc2UsICAgICAqLworICAvKiAgICB3ZSB1c2UgYSBzcGVjaWFsaXNlZCB2ZXJzaW9uIG9mIHRoZSBvbGQgRlRfTXVsRGl2NjQgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEVYUE9SVF9GVU5DCisgIEZUX0ludDMyICBGVF9EaXZGaXgoIEZUX0xvbmcgIGEsCisgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgIGIgKQorICB7CisgICAgRlRfSW50MzIgICBzOworICAgIEZUX1dvcmQzMiAgcTsKKworICAgIHMgID0gYTsgYSA9IEFCUyhhKTsKKyAgICBzIF49IGI7IGIgPSBBQlMoYik7CisKKyAgICBpZiAoIGIgPT0gMCApCisgICAgICAvKiBjaGVjayBmb3IgZGl2aWRlIGJ5IDAgKi8KKyAgICAgIHEgPSAweDdGRkZGRkZGOworCisgICAgZWxzZSAKKyAgICAgIC8qIGNvbXB1dGUgcmVzdWx0IGRpcmVjdGx5ICovCisgICAgICBxID0gKChGVF9JbnQ2NClhIDw8IDE2KSAvIGI7CisKKyAgICByZXR1cm4gKEZUX0ludDMyKSggcyA8IDAgPyAtcSA6IHEgKTsKKyAgfQorCisKKyNlbHNlIC8qIExPTkc2NCAqLworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfTXVsRGl2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSB2ZXJ5IHNpbXBsZSBmdW5jdGlvbiB1c2VkIHRvIHBlcmZvcm0gdGhlIGNvbXB1dGF0aW9uIGAoQSpCKS9DJyAgICovCisgIC8qICAgIHdpdGggbWF4aW11bSBhY2N1cmFjeSAoaXQgdXNlcyBhIDY0LWJpdCBpbnRlcm1lZGlhdGUgaW50ZWdlciAgICAgICAqLworICAvKiAgICB3aGVuZXZlciBuZWNlc3NhcnkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoaXMgZnVuY3Rpb24gaXNuJ3QgbmVjZXNzYXJpbHkgYXMgZmFzdCBhcyBzb21lIHByb2Nlc3NvciBzcGVjaWZpYyAqLworICAvKiAgICBvcGVyYXRpb25zLCBidXQgaXMgYXQgbGVhc3QgY29tcGxldGVseSBwb3J0YWJsZS4gICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBhIDo6IFRoZSBmaXJzdCBtdWx0aXBsaWVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgYiA6OiBUaGUgc2Vjb25kIG11bHRpcGxpZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGMgOjogVGhlIGRpdmlzb3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoZSByZXN1bHQgb2YgYChhKmIpL2MnLiAgVGhpcyBmdW5jdGlvbiBuZXZlciB0cmFwcyB3aGVuIHRyeWluZyB0byAqLworICAvKiAgICBkaXZpZGUgYnkgemVybywgaXQgc2ltcGx5IHJldHVybnMgYE1heEludCcgb3IgYE1pbkludCcgZGVwZW5kaW5nICAgKi8KKyAgLyogICAgb24gdGhlIHNpZ25zIG9mIGBhJyBhbmQgYGInLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhlIEZUX011bERpdigpIGZ1bmN0aW9uIGhhcyBiZWVuIG9wdGltaXplZCB0aGFua3MgdG8gaWRlYXMgZnJvbSAgICovCisgIC8qICAgIEdyYWhhbSBBc2hlci4gIFRoZSB0cmljayBpcyB0byBvcHRpbWl6ZSBjb21wdXRhdGlvbiBpZiBldmVyeXRoaW5nICAqLworICAvKiAgICBmaXRzIHdpdGhpbiAzMiBiaXRzIChhIHJhdGhlciBjb21tb24gY2FzZSkuICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFdlIGNvbXB1dGUgYGEqYitjLzInLCB0aGVuIGRpdmlkZSBpdCBieSBgYycuIChwb3NpdGl2ZSB2YWx1ZXMpICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICA0NjM0MCBpcyBGTE9PUihTUVJUKDJeMzEtMSkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgIGlmICggYSA8PSA0NjM0MCAmJiBiIDw9IDQ2MzQwICkgdGhlbiAoIGEqYiA8PSAweDdGRkVBODEwICkgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgMHg3RkZGRkZGRiAtIDB4N0ZGRUE4MTAgPSAweDE1N0YwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICBpZiAoIGMgPCAweDE1N0YwKjIgKSB0aGVuICggYSpiK2MvMiA8PSAweDdGRkZGRkZGICkgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgIGFuZCAyKjB4MTU3RjAgPSAxNzYwOTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEVYUE9SVF9GVU5DCisgIEZUX0xvbmcgIEZUX011bERpdiggRlRfTG9uZyAgYSwKKyAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICBiLAorICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgIGMgKQorICB7CisgICAgbG9uZyAgIHM7CisKKworICAgIGlmICggYSA9PSAwIHx8IGIgPT0gYyApCisgICAgICByZXR1cm4gYTsKKworICAgIHMgID0gYTsgYSA9IEFCUyggYSApOworICAgIHMgXj0gYjsgYiA9IEFCUyggYiApOworICAgIHMgXj0gYzsgYyA9IEFCUyggYyApOworCisgICAgaWYgKCBhIDw9IDQ2MzQwICYmIGIgPD0gNDYzNDAgJiYgYyA8PSAxNzYwOTVMICkKKyAgICB7CisgICAgICBhID0gKCBhKmIgKyAoYyA+PiAxKSApIC8gYzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIEZUX0ludDY0ICB0ZW1wLCB0ZW1wMjsKKworICAgICAgRlRfTXVsVG82NCggYSwgYiwgJnRlbXAgKTsKKyAgICAgIHRlbXAyLmhpID0gKEZUX0ludDMyKShjID4+IDMxKTsKKyAgICAgIHRlbXAyLmxvID0gKEZUX1dvcmQzMikoYyAvIDIpOworICAgICAgRlRfQWRkNjQoICZ0ZW1wLCAmdGVtcDIsICZ0ZW1wICk7CisgICAgICBhID0gRlRfRGl2NjRieTMyKCAmdGVtcCwgYyApOworICAgIH0KKworICAgIHJldHVybiAoIHMgPCAwICkgPyAtYSA6IGE7CisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX011bEZpeCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgdmVyeSBzaW1wbGUgZnVuY3Rpb24gdXNlZCB0byBwZXJmb3JtIHRoZSBjb21wdXRhdGlvbiAgICAgICAgICAgICAqLworICAvKiAgICBgKEEqQikvMHgxMDAwMCcgd2l0aCBtYXhpbXVtIGFjY3VyYWN5LiAgTW9zdCBvZiB0aGUgdGltZSwgdGhpcyBpcyAgKi8KKyAgLyogICAgdXNlZCB0byBtdWx0aXBseSBhIGdpdmVuIHZhbHVlIGJ5IGEgMTYuMTYgZml4ZWQgZmxvYXQgZmFjdG9yLiAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgYSA6OiBUaGUgZmlyc3QgbXVsdGlwbGllci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGIgOjogVGhlIHNlY29uZCBtdWx0aXBsaWVyLiAgVXNlIGEgMTYuMTYgZmFjdG9yIGhlcmUgd2hlbmV2ZXIgICAgICAqLworICAvKiAgICAgICAgIHBvc3NpYmxlIChzZWUgbm90ZSBiZWxvdykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGUgcmVzdWx0IG9mIGAoYSpiKS8weDEwMDAwJy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGUgb3B0aW1pc2F0aW9uIGZvciBGVF9NdWxGaXgoKSBpcyBkaWZmZXJlbnQuICBXZSBjb3VsZCBzaW1wbHkgYmUgKi8KKyAgLyogICAgaGFwcHkgYnkgYXBwbHlpbmcgdGhlIHNhbWUgcHJpbmNpcGxlcyBhcyB3aXRoIEZUX011bERpdigpLCBiZWNhdXNlICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBjID0gMHgxMDAwMCA8IDE3NjA5NiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEhvd2V2ZXIsIGluIG1vc3QgY2FzZXMsIHdlIGhhdmUgYSBgYicgd2l0aCBhIHZhbHVlIGFyb3VuZCAweDEwMDAwICAqLworICAvKiAgICB3aGljaCBpcyBncmVhdGVyIHRoYW4gNDYzNDAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEFjY29yZGluZyB0byBzb21lIHRlc3RpbmcsIG1vc3QgY2FzZXMgaGF2ZSBgYScgPCAyMDQ4LCBzbyBhIGdvb2QgICAqLworICAvKiAgICBpZGVhIGlzIHRvIHVzZSBib3VuZHMgbGlrZSAyMDQ4IGFuZCAxMDQ4NTc2ICg9Zmxvb3IoKDJeMzEtMSkvMjA0OCkgKi8KKyAgLyogICAgZm9yIGBhJyBhbmQgYGInIHJlc3BlY3RpdmVseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBFWFBPUlRfRlVOQworICBGVF9Mb25nICBGVF9NdWxGaXgoIEZUX0xvbmcgIGEsCisgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgYiApCisgIHsKKyAgICBGVF9Mb25nICAgczsKKworICAgIGlmICggYSA9PSAwIHx8IGIgPT0gMHgxMDAwMEwgKQorICAgICAgcmV0dXJuIGE7CisKKyAgICBzICA9IGE7IGEgPSBBQlMoYSk7CisgICAgcyBePSBiOyBiID0gQUJTKGIpOworCisgICAgaWYgKCBhIDw9IDIwNDggJiYgYiA8PSAxMDQ4NTc2TCApCisgICAgeworICAgICAgYSA9ICggYSpiICsgMHg4MDAwICkgPj4gMTY7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBGVF9Mb25nICBhbCA9IGEgJiAweEZGRkY7CisKKyAgICAgIGEgPSAoYSA+PiAxNikqYiArIGFsKihiID4+IDE2KSArICggYWwqKGIgJiAweEZGRkYpID4+IDE2ICk7CisgICAgfQorCisgICAgcmV0dXJuICggcyA8IDAgPyAtYSA6IGEgKTsKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfRGl2Rml4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSB2ZXJ5IHNpbXBsZSBmdW5jdGlvbiB1c2VkIHRvIHBlcmZvcm0gdGhlIGNvbXB1dGF0aW9uICAgICAgICAgICAgICovCisgIC8qICAgIGAoQSoweDEwMDAwKS9CJyB3aXRoIG1heGltdW0gYWNjdXJhY3kuICBNb3N0IG9mIHRoZSB0aW1lLCB0aGlzIGlzICAqLworICAvKiAgICB1c2VkIHRvIGRpdmlkZSAgYSBnaXZlbiB2YWx1ZSBieSBhIDE2LjE2IGZpeGVkIGZsb2F0IGZhY3Rvci4gICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBhIDo6IFRoZSBmaXJzdCBtdWx0aXBsaWVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgYiA6OiBUaGUgc2Vjb25kIG11bHRpcGxpZXIuICBVc2UgYSAxNi4xNiBmYWN0b3IgaGVyZSB3aGVuZXZlciAgICAgICovCisgIC8qICAgICAgICAgcG9zc2libGUgKHNlZSBub3RlIGJlbG93KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoZSByZXN1bHQgb2YgYChhKjB4MTAwMDApL2InLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoZSBvcHRpbWlzYXRpb24gZm9yIEZUX0RpdkZpeCgpIGlzIHNpbXBsZSA6IGlmIChhIDw8IDE2KSBmaXRzICAgICAqLworICAvKiAgICBpbiAzMiBiaXRzLCB0aGVuIHRoZSBkaXZpc2lvbiBpcyBjb21wdXRlZCBkaXJlY3RseS4gT3RoZXJ3aXNlLCAgICAgKi8KKyAgLyogICAgd2UgdXNlIGEgc3BlY2lhbGlzZWQgdmVyc2lvbiBvZiB0aGUgb2xkIEZUX011bERpdjY0ICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBFWFBPUlRfRlVOQworICBGVF9Mb25nICBGVF9EaXZGaXgoIEZUX0xvbmcgIGEsCisgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgYiApCisgIHsKKyAgICBGVF9JbnQzMiAgIHM7CisgICAgRlRfV29yZDMyICBxOworCisgICAgcyAgPSBhOyBhID0gQUJTKGEpOworICAgIHMgXj0gYjsgYiA9IEFCUyhiKTsKKworICAgIGlmICggYiA9PSAwICkKKyAgICAgIC8qIGNoZWNrIGZvciBkaXZpZGUgYnkgMCAqLworICAgICAgcSA9IDB4N0ZGRkZGRkY7CisKKyAgICBlbHNlIGlmICggKGEgPj4gMTYpID09IDAgKQorICAgIHsKKyAgICAgIC8qIGNvbXB1dGUgcmVzdWx0IGRpcmVjdGx5ICovCisgICAgICBxID0gKEZUX1dvcmQzMikoYSA8PCAxNikgLyAoRlRfV29yZDMyKWI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiB3ZSBuZWVkIG1vcmUgYml0cywgd2UnbGwgaGF2ZSB0byBkbyBpdCBieSBoYW5kICovCisgICAgICBGVF9Xb3JkMzIgIGM7CisKKyAgICAgIHEgID0gKGEvYikgPDwgMTY7CisgICAgICBjICA9IGElYjsKKworICAgICAgLyogd2UgbXVzdCBjb21wdXRlIEMqMHgxMDAwMC9CLCB3ZSBzaW1wbHkgc2hpZnQgQyBhbmQgQiBzbyAqLworICAgICAgLyogQyBiZWNvbWVzIHNtYWxsZXIgdGhhbiAxNiBiaXRzICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgd2hpbGUgKGMgPj4gMTYpCisgICAgICB7CisgICAgICAgIGMgPj49IDE7CisgICAgICAgIGIgPDw9IDE7CisgICAgICB9CisKKyAgICAgIHEgKz0gKGMgPDwgMTYpL2I7CisgICAgfQorCisgICAgcmV0dXJuICggcyA8IDAgPyAtKEZUX0ludDMyKXEgOiAoRlRfSW50MzIpcSApOworICB9CisKKworICBCQVNFX0ZVTkMKKyAgdm9pZCAgRlRfQWRkNjQoIEZUX0ludDY0KiAgeCwKKyAgICAgICAgICAgICAgICAgIEZUX0ludDY0KiAgeSwKKyAgICAgICAgICAgICAgICAgIEZUX0ludDY0KiAgeiApCisgIHsKKyAgICByZWdpc3RlciBGVF9Xb3JkMzIgIGxvLCBoaTsKKworICAgIGxvID0geC0+bG8gKyB5LT5sbzsKKyAgICBoaSA9IHgtPmhpICsgeS0+aGkgKyAoIGxvIDwgeC0+bG8gKTsKKworICAgIHotPmxvID0gbG87CisgICAgei0+aGkgPSBoaTsKKyAgfQorCisKKyAgQkFTRV9GVU5DCisgIHZvaWQgIEZUX011bFRvNjQoIEZUX0ludDMyICAgeCwKKyAgICAgICAgICAgICAgICAgICAgRlRfSW50MzIgICB5LAorICAgICAgICAgICAgICAgICAgICBGVF9JbnQ2NCogIHogKQorICB7CisgICAgRlRfSW50MzIgICBzOworCisKKyAgICBzICA9IHg7IHggPSBBQlMoIHggKTsKKyAgICBzIF49IHk7IHkgPSBBQlMoIHkgKTsKKworICAgIHsKKyAgICAgIEZUX1dvcmQzMiAgbG8xLCBoaTEsIGxvMiwgaGkyLCBsbywgaGksIGkxLCBpMjsKKyAgICAKKyAgICAgIGxvMSA9IHggJiAweDAwMDBGRkZGOyAgaGkxID0geCA+PiAxNjsKKyAgICAgIGxvMiA9IHkgJiAweDAwMDBGRkZGOyAgaGkyID0geSA+PiAxNjsKKworICAgICAgbG8gPSBsbzEgKiBsbzI7CisgICAgICBpMSA9IGxvMSAqIGhpMjsKKyAgICAgIGkyID0gbG8yICogaGkxOworICAgICAgaGkgPSBoaTEgKiBoaTI7CisKKyAgICAgIC8qIENoZWNrIGNhcnJ5IG92ZXJmbG93IG9mIGkxICsgaTIgKi8KKyAgICAgIGkxICs9IGkyOworICAgICAgaWYgKCBpMSA8IGkyICkKKyAgICAgICAgaGkgKz0gMUwgPDwgMTY7CisKKyAgICAgIGhpICs9IChpMSA+PiAxNik7CisgICAgICBpMSAgPSBpMSA8PCAxNjsKKworICAgICAgLyogQ2hlY2sgY2Fycnkgb3ZlcmZsb3cgb2YgaTEgKyBsbyAqLworICAgICAgbG8gKz0gaTE7CisgICAgICBoaSArPSAobG8gPCBpMSk7CisKKyAgICAgIHotPmxvID0gbG87CisgICAgICB6LT5oaSA9IGhpOworICAgIH0KKworICAgIGlmICggcyA8IDAgKQorICAgIHsKKyAgICAgIHotPmxvID0gKEZUX1dvcmQzMiktKEZUX0ludDMyKXotPmxvOworICAgICAgei0+aGkgPSB+ei0+aGkgKyAhKHotPmxvKTsKKyAgICB9CisgIH0KKworCisgIEJBU0VfRlVOQworICBGVF9JbnQzMiAgRlRfRGl2NjRieTMyKCBGVF9JbnQ2NCogIHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludDMyICAgeSApCisgIHsKKyAgICBGVF9JbnQzMiAgIHM7CisgICAgRlRfV29yZDMyICBxLCByLCBpLCBsbzsKKworCisgICAgcyAgPSB4LT5oaTsKKyAgICBpZiAoIHMgPCAwICkKKyAgICB7CisgICAgICB4LT5sbyA9IChGVF9Xb3JkMzIpLShGVF9JbnQzMil4LT5sbzsKKyAgICAgIHgtPmhpID0gfngtPmhpICsgISh4LT5sbyk7CisgICAgfQorICAgIHMgXj0geTsgIHkgPSBBQlMoIHkgKTsKKworICAgIC8qIFNob3J0Y3V0ICovCisgICAgaWYgKCB4LT5oaSA9PSAwICkKKyAgICB7CisgICAgICBxID0geC0+bG8gLyB5OworICAgICAgcmV0dXJuICggcyA8IDAgKSA/IC0oRlRfSW50MzIpcSA6IChGVF9JbnQzMilxOworICAgIH0KKworICAgIHIgID0geC0+aGk7CisgICAgbG8gPSB4LT5sbzsKKworICAgIGlmICggciA+PSAoRlRfV29yZDMyKXkgKSAvKiB3ZSBrbm93IHkgaXMgdG8gYmUgdHJlYXRlZCBhcyB1bnNpZ25lZCBoZXJlICovCisgICAgICByZXR1cm4gKCBzIDwgMCApID8gMHg4MDAwMDAwMUwgOiAweDdGRkZGRkZGTDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSZXR1cm4gTWF4L01pbiBJbnQzMiBpZiBkaXZpZGUgb3ZlcmZsb3cuICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVGhpcyBpbmNsdWRlcyBkaXZpc2lvbiBieSB6ZXJvISAgICAgICAgICAqLworICAgIHEgPSAwOworICAgIGZvciAoIGkgPSAwOyBpIDwgMzI7IGkrKyApCisgICAgeworICAgICAgciA8PD0gMTsKKyAgICAgIHEgPDw9IDE7CisgICAgICByICB8PSBsbyA+PiAzMTsKKworICAgICAgaWYgKCByID49IChGVF9Xb3JkMzIpeSApCisgICAgICB7CisgICAgICAgIHIgLT0geTsKKyAgICAgICAgcSB8PSAxOworICAgICAgfQorICAgICAgbG8gPDw9IDE7CisgICAgfQorCisgICAgcmV0dXJuICggcyA8IDAgKSA/IC0oRlRfSW50MzIpcSA6IChGVF9JbnQzMilxOworICB9CisKKworI2VuZGlmIC8qIExPTkc2NCAqLworCisKKy8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2Jhc2UvZnRjYWxjLmggYi9zcmMvYmFzZS9mdGNhbGMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmJlMTc4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2Jhc2UvZnRjYWxjLmgKQEAgLTAsMCArMSw4NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgZnRjYWxjLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFyaXRobWV0aWMgY29tcHV0YXRpb25zIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAxOTk2LTE5OTkgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCAgICAgICAgKi8KKy8qICBtb2RpZmllZCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgICovCisvKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLworLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KKy8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjaWZuZGVmIEZUQ0FMQ19ICisjZGVmaW5lIEZUQ0FMQ19ICisKKyNpbmNsdWRlIDxmcmVldHlwZS5oPgorI2luY2x1ZGUgPGZ0Y29uZmlnLmg+ICAgLyogZm9yIExPTkc2NCAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKKyAgZXh0ZXJuICJDIiB7CisjZW5kaWYKKworCisjaWZkZWYgTE9ORzY0CisKKyAgdHlwZWRlZiBJTlQ2NCAgRlRfSW50NjQ7CisKKyNkZWZpbmUgQUREXzY0KCB4LCB5LCB6ICkgIHogPSAoeCkgKyAoeSkKKyNkZWZpbmUgTVVMXzY0KCB4LCB5LCB6ICkgIHogPSAoRlRfSW50NjQpKHgpICogKHkpCisKKyNkZWZpbmUgRElWXzY0KCB4LCB5ICkgICAgICggKHgpIC8gKHkpICkKKworI2Vsc2UgLyogTE9ORzY0ICovCisKKyAgdHlwZWRlZiBzdHJ1Y3QgIEZUX0ludDY0XworICB7CisgICAgRlRfV29yZDMyICBsbzsKKyAgICBGVF9Xb3JkMzIgIGhpOworCisgIH0gRlRfSW50NjQ7CisKKyNkZWZpbmUgQUREXzY0KCB4LCB5LCB6ICkgIEZUX0FkZDY0KCAmeCwgJnksICZ6ICkKKyNkZWZpbmUgTVVMXzY0KCB4LCB5LCB6ICkgIEZUX011bFRvNjQoIHgsIHksICZ6ICkKKyNkZWZpbmUgRElWXzY0KCB4LCB5ICkgICAgIEZUX0RpdjY0YnkzMiggJngsIHkgKQorCisgIEJBU0VfREVGIHZvaWQgICAgICBGVF9BZGQ2NCAgICAoIEZUX0ludDY0KiB4LCBGVF9JbnQ2NCogeSwgRlRfSW50NjQqICB6ICk7CisgIEJBU0VfREVGIHZvaWQgICAgICBGVF9NdWxUbzY0ICAoIEZUX0ludDMyICB4LCBGVF9JbnQzMiAgeSwgRlRfSW50NjQqICB6ICk7CisgIEJBU0VfREVGIEZUX0ludDMyICBGVF9EaXY2NGJ5MzIoIEZUX0ludDY0KiB4LCBGVF9JbnQzMiAgeSApOworCisjZW5kaWYgLyogTE9ORzY0ICovCisKKyNkZWZpbmUgU1FSVF8zMiggeCApICAgICAgIEZUX1NxcnQzMiggeCApCisKKyAgQkFTRV9ERUYgRlRfSW50MzIgIEZUX1NxcnQzMiggRlRfSW50MzIgIGwgKTsKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIEZUX011bERpdigpIGFuZCBGVF9NdWxGaXgoKSBhcmUgZGVjbGFyZWQgaW4gZnJlZXR5cGUuaC4gICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2RlZmluZSBJTlRfVE9fRjI2RE9UNiggeCApICAgICggKEZUX0xvbmcpKHgpIDw8IDYgICkKKyNkZWZpbmUgSU5UX1RPX0YyRE9UMTQoIHggKSAgICAoIChGVF9Mb25nKSh4KSA8PCAxNCApCisjZGVmaW5lIElOVF9UT19GSVhFRCggeCApICAgICAgKCAoRlRfTG9uZykoeCkgPDwgMTYgKQorI2RlZmluZSBGMkRPVDE0X1RPX0ZJWEVEKCB4ICkgICggKEZUX0xvbmcpKHgpIDw8IDIgICkKKyNkZWZpbmUgRkxPQVRfVE9fRklYRUQoIHggKSAgICAoIChGVF9Mb25nKSh4ICogNjU1MzYuMCkgKQorCisjZGVmaW5lIFJPVU5EX0YyNkRPVDYoIHggKSAgICAgKCB4ID49IDAgPyAoICAgKCh4KSArIDMyKSAmIC02NCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKCAtKCgzMiAtICh4KSkgJiAtNjQpICkgKQorCisjaWZkZWYgX19jcGx1c3BsdXMKKyAgfQorI2VuZGlmCisKKyNlbmRpZiAvKiBGVENBTENfSCAqLworCisKKy8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2Jhc2UvZnRkZWJ1Zy5jIGIvc3JjL2Jhc2UvZnRkZWJ1Zy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2OGY5YjcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvYmFzZS9mdGRlYnVnLmMKQEAgLTAsMCArMSw5MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgZnRkZWJ1Zy5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIERlYnVnZ2luZyBhbmQgbG9nZ2luZyBjb21wb25lbnQgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAxOTk2LTE5OTkgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCAgICAgICAgKi8KKy8qICBtb2RpZmllZCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgICovCisvKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLworLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KKy8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjaW5jbHVkZSA8ZnRkZWJ1Zy5oPgorCisjaWZkZWYgRlRfREVCVUdfTEVWRUxfVFJBQ0UKKyAgY2hhciAgZnRfdHJhY2VfbGV2ZWxzW3RyYWNlX21heF07CisjZW5kaWYKKworCisjaWYgZGVmaW5lZCggRlRfREVCVUdfTEVWRUxfRVJST1IgKSB8fCBkZWZpbmVkKCBGVF9ERUJVR19MRVZFTF9UUkFDRSApCisKKworI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBUaGUgUHJpbnQoKSBmdW5jdGlvbiBpcyBkZWZpbmVkIGluIGZ0Y29uZmlnLmguICBJdCBkZWZhdWx0cyB0byAgICAgICAgKi8KKyAgLyogdnByaW50ZigpIG9uIHN5c3RlbXMgd2hpY2ggaGF2ZSBpdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisgIHZvaWQgIEZUX01lc3NhZ2UoIGNvbnN0IGNoYXIqICBmbXQsIC4uLiApCisgIHsKKyAgICB2YV9saXN0ICBhcDsKKworCisgICAgdmFfc3RhcnQoIGFwLCBmbXQgKTsKKyAgICB2cHJpbnRmKCBmbXQsIGFwICk7CisgICAgdmFfZW5kKCBhcCApOworICB9CisKKworICB2b2lkICBGVF9QYW5pYyggY29uc3QgY2hhciogIGZtdCwgLi4uICkKKyAgeworICAgIHZhX2xpc3QgIGFwOworCisKKyAgICB2YV9zdGFydCggYXAsIGZtdCApOworICAgIHZwcmludGYoIGZtdCwgYXAgKTsKKyAgICB2YV9lbmQoIGFwICk7CisKKyAgICBleGl0KCBFWElUX0ZBSUxVUkUgKTsKKyAgfQorCisKKyNpZmRlZiBGVF9ERUJVR19MRVZFTF9UUkFDRQorCisgIEVYUE9SVF9GVU5DCisgIHZvaWQgIEZUX1NldFRyYWNlTGV2ZWwoIEZUX1RyYWNlICBjb21wb25lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICBsZXZlbCApCisgIHsKKyAgICBpZiAoIGNvbXBvbmVudCA+PSB0cmFjZV9tYXggKQorICAgICAgcmV0dXJuOworCisgICAgLyogaWYgY29tcG9uZW50IGlzIGB0cmFjZV9hbnknLCB0aGVuIGNoYW5nZSBfYWxsXyBsZXZlbHMgYXQgb25jZSAqLworICAgIGlmICggY29tcG9uZW50ID09IHRyYWNlX2FueSApCisgICAgeworICAgICAgaW50ICBuOworCisKKyAgICAgIGZvciAoIG4gPSB0cmFjZV9hbnk7IG4gPCB0cmFjZV9tYXg7IG4rKyApCisgICAgICAgIGZ0X3RyYWNlX2xldmVsc1tuXSA9IGxldmVsOworICAgIH0KKyAgICBlbHNlICAgICAgICAvKiBvdGhlcndpc2UsIG9ubHkgY2hhbmdlIGluZGl2aWR1YWwgY29tcG9uZW50ICovCisgICAgICBmdF90cmFjZV9sZXZlbHNbY29tcG9uZW50XSA9IGxldmVsOworICB9CisKKyNlbmRpZiAvKiBGVF9ERUJVR19MRVZFTF9UUkFDRSAqLworCisjZW5kaWYgLyogRlRfREVCVUdfTEVWRUxfVFJBQ0UgfHwgRlRfREVCVUdfTEVWRUxfRVJST1IgKi8KKworCisvKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9iYXNlL2Z0ZGVidWcuaCBiL3NyYy9iYXNlL2Z0ZGVidWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjE5ZjM1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2Jhc2UvZnRkZWJ1Zy5oCkBAIC0wLDAgKzEsMTkxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBmdGRlYnVnLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRGVidWdnaW5nIGFuZCBsb2dnaW5nIGNvbXBvbmVudCAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDE5OTYtMTk5OSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkICAgICAgICAqLworLyogIG1vZGlmaWVkIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAgKi8KKy8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCisvKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLworLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBUaGlzIGNvbXBvbmVudCBjb250YWlucyB2YXJpb3VzIG1hY3JvcyBhbmQgZnVuY3Rpb25zIHVzZWQgdG8gZWFzZSB0aGUgKi8KKyAgLyogZGVidWdnaW5nIG9mIHRoZSBGcmVlVHlwZSBlbmdpbmUuICBJdHMgbWFpbiBwdXJwb3NlIGlzIGluIGFzc2VydGlvbiAgICovCisgIC8qIGNoZWNraW5nLCB0cmFjaW5nLCBhbmQgZXJyb3IgZGV0ZWN0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogVGhlcmUgYXJlIG5vdyB0aHJlZSBkZWJ1Z2dpbmcgbW9kZXM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAtIHRyYWNlIG1vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgRXJyb3IgYW5kIHRyYWNlIG1lc3NhZ2VzIGFyZSBzZW50IHRvIHRoZSBsb2cgZmlsZSAod2hpY2ggY2FuIGJlIHRoZSAqLworICAvKiAgIHN0YW5kYXJkIGVycm9yIG91dHB1dCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIC0gZXJyb3IgbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICBPbmx5IGVycm9yIG1lc3NhZ2VzIGFyZSBnZW5lcmF0ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAtIHJlbGVhc2UgbW9kZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgTm8gZXJyb3IgbWVzc2FnZSBpcyBzZW50IG5vciBnZW5lcmF0ZWQuICBUaGUgY29kZSBpcyBmcmVlIGZyb20gYW55ICAqLworICAvKiAgIGRlYnVnZ2luZyBwYXJ0cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNpZm5kZWYgRlRERUJVR19ICisjZGVmaW5lIEZUREVCVUdfSAorCisjaW5jbHVkZSA8ZnRjb25maWcuaD4gICAvKiBmb3IgRlRfREVCVUdfTEVWRUxfVFJBQ0UsIEZUX0RFQlVHX0xFVkVMX0VSUk9SICovCisKKworI2lmZGVmIF9fY3BsdXNwbHVzCisgIGV4dGVybiAiQyIgeworI2VuZGlmCisKKworI2lmZGVmIEZUX0RFQlVHX0xFVkVMX1RSQUNFCisKKworICB0eXBlZGVmIGVudW0gIEZUX1RyYWNlXworICB7CisgICAgdHJhY2VfYW55ID0gMCwKKworICAgIC8qIGZpcnN0LCBkZWZpbmUgYW4gZW51bSBmb3IgZWFjaCBjb21tb24gY29tcG9uZW50ICovCisgICAgdHJhY2VfaW8sICAgICAgICAvKiBpbiBmdHN5cyAqLworICAgIHRyYWNlX21lbW9yeSwgICAgLyogaW4gZnRzeXMgKi8KKyAgICB0cmFjZV9zeW5jLCAgICAgIC8qIGluIGZ0c3lzICovCisgICAgdHJhY2Vfc3RyZWFtLCAgICAvKiBzdHJlYW0gbWFuYWdlciAtIHNlZSBmdHN0cmVhbS5jICovCisgICAgdHJhY2VfY2FsYywgICAgICAvKiBjb21wdXRhdGlvbnMgICAtIHNlZSBmdGNhbGMuYyAgICovCisgICAgdHJhY2VfcmFzdGVyLCAgICAvKiByYXN0ZXIgICAgICAgICAtIHNlZSBmdHJhc3Rlci5jICovCisgICAgdHJhY2VfbGlzdCwgICAgICAvKiBsaXN0IG1hbmFnZXIgICAtIHNlZSBmdGxpc3QuYyAgICovCisgICAgdHJhY2Vfb2JqcywgICAgICAvKiBiYXNlIG9iamVjdHMgICAtIHNlZSBmdG9ianMuYyAgICovCisKKyAgICAvKiB0aGVuIGRlZmluZSBhbiBlbnVtIGZvciBlYWNoIFRydWVUeXBlIGRyaXZlciBjb21wb25lbnQgKi8KKyAgICB0cmFjZV90dG9ianMsCisgICAgdHJhY2VfdHRsb2FkLAorICAgIHRyYWNlX3R0Z2xvYWQsCisgICAgdHJhY2VfdHRpbnRlcnAsCisgICAgdHJhY2VfdHRjbWFwLAorICAgIHRyYWNlX3R0ZXh0ZW5kLAorICAgIHRyYWNlX3R0ZHJpdmVyLAorCisgICAgLyogZGVmaW5lIGFuIGVudW0gZm9yIGVhY2ggVHJ1ZURvYyBkcml2ZXIgY29tcG9uZW50ICovCisgICAgdHJhY2VfdGRvYmpzLAorICAgIHRyYWNlX3RkbG9hZCwKKyAgICB0cmFjZV90ZGdsb2FkLAorICAgIHRyYWNlX3RkaGludCwKKyAgICB0cmFjZV90ZGRyaXZlciwKKworICAgIC8qIGRlZmluZSBhbiBlbnVtIGZvciBlYWNoIFR5cGUxIGRyaXZlciBjb21wb25lbnQgKi8KKyAgICB0cmFjZV90MW9ianMsCisgICAgdHJhY2VfdDFsb2FkLAorICAgIHRyYWNlX3QxZ2xvYWQsCisgICAgdHJhY2VfdDFoaW50LAorICAgIHRyYWNlX3QxZHJpdmVyLAorCisgICAgLyogb3RoZXIgdHJhY2UgbGV2ZWxzICovCisJdHJhY2VfaW5pdCwKKworICAgIC8qIHRoZSBsYXN0IGxldmVsIG11c3QgYWx3YXlzIGJlIGB0cmFjZV9tYXgnICovCisgICAgdHJhY2VfbWF4CisKKyAgfSBGVF9UcmFjZTsKKworICBleHRlcm4gY2hhciAgZnRfdHJhY2VfbGV2ZWxzW3RyYWNlX21heF07CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIElNUE9SVEFOVCEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogRWFjaCBjb21wb25lbnQgbXVzdCBkZWZpbmUgdGhlIG1hY3JvIEZUX0NPTVBPTkVOVCB0byBhIHZhbGlkICAgICAgICAgICovCisgIC8qIFRyYWNlX0NvbXBvbmVudCB2YWx1ZSBiZWZvcmUgdXNpbmcgYW55IFRSQUNFIG1hY3JvLiAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2RlZmluZSBGVF9UUkFDRSggbGV2ZWwsIHZhcmZvcm1hdCApICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgaWYgKCBmdF90cmFjZV9sZXZlbHNbRlRfQ09NUE9ORU5UXSA+PSBsZXZlbCApICBcCisgICAgICAgICAgICBGVF9NZXNzYWdlIyN2YXJmb3JtYXQKKworCisgIEVYUE9SVF9ERUYKKyAgdm9pZCAgRlRfU2V0VHJhY2VMZXZlbCggRlRfVHJhY2UgIGNvbXBvbmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgIGxldmVsICk7CisKKworI2VsaWYgZGVmaW5lZCggRlRfREVCVUdfTEVWRUxfRVJST1IgKQorCisKKyNkZWZpbmUgRlRfVFJBQ0UoIGxldmVsLCB2YXJmb3JtYXQgKSAgLyogbm90aGluZyAqLworCisKKyNlbHNlICAvKiByZWxlYXNlIG1vZGUgKi8KKworCisjZGVmaW5lIEZUX0Fzc2VydCggY29uZGl0aW9uICkgIC8qIG5vdGhpbmcgKi8KKworI2RlZmluZSBGVF9UUkFDRSggbGV2ZWwsIHZhcmZvcm1hdCApICAgICAgLyogbm90aGluZyAqLworI2RlZmluZSBGVF9FUlJPUiggdmFyZm9ybWF0ICkgICAgICAgICAgICAgLyogbm90aGluZyAqLworCisKKyNlbmRpZiAvKiBGVF9ERUJVR19MRVZFTF9UUkFDRSwgRlRfREVCVUdfTEVWRUxfRVJST1IgKi8KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogRGVmaW5lIG1hY3JvcyBhbmQgZnVuY3Rpb25zIHRoYXQgYXJlIGNvbW1vbiB0byB0aGUgZGVidWcgYW5kIHRyYWNlICAgICovCisgIC8qIG1vZGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogWW91IG5lZWQgdnByaW50ZigpIHRvIGJlIGFibGUgdG8gY29tcGlsZSB0dGRlYnVnLmMuICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmIGRlZmluZWQoIEZUX0RFQlVHX0xFVkVMX1RSQUNFICkgfHwgZGVmaW5lZCggRlRfREVCVUdfTEVWRUxfRVJST1IgKQorCisKKyNpbmNsdWRlICJzdGRpby5oIiAgLyogZm9yIHZwcmludGYoKSAqLworCisjZGVmaW5lIEZUX0Fzc2VydCggY29uZGl0aW9uICkgIFwKKyAgICAgICBpZiAoICEoY29uZGl0aW9uKSApICAgICAgXAorICAgICAgICAgRlRfUGFuaWMoICJhc3NlcnRpb24gZmFpbGVkIG9uIGxpbmUgJWQgb2YgZmlsZSAlc1xuIiwgX19MSU5FX18sIF9fRklMRV9fICk7CisKKyAgZXh0ZXJuIHZvaWQgIEZUX01lc3NhZ2UoIGNvbnN0IGNoYXIqICBmbXQsIC4uLiApOworCisgIC8qIHByaW50IGEgbWVzc2FnZSBhbmQgZXhpdCAqLworICBleHRlcm4gdm9pZCAgRlRfUGFuaWMgICggY29uc3QgY2hhciogIGZtdCwgLi4uICk7CisKKyNkZWZpbmUgRlRfRVJST1IoIHZhcmZvcm1hdCApICBGVF9NZXNzYWdlIyN2YXJmb3JtYXQKKworCisjZW5kaWYgLyogRlRfREVCVUdfTEVWRUxfVFJBQ0UgfHwgRlRfREVCVUdfTEVWRUxfRVJST1IgKi8KKworCisjZGVmaW5lIEZUX1RSQUNFMCggdmFyZm9ybWF0ICkgIEZUX1RSQUNFKCAwLCB2YXJmb3JtYXQgKQorI2RlZmluZSBGVF9UUkFDRTEoIHZhcmZvcm1hdCApICBGVF9UUkFDRSggMSwgdmFyZm9ybWF0ICkKKyNkZWZpbmUgRlRfVFJBQ0UyKCB2YXJmb3JtYXQgKSAgRlRfVFJBQ0UoIDIsIHZhcmZvcm1hdCApCisjZGVmaW5lIEZUX1RSQUNFMyggdmFyZm9ybWF0ICkgIEZUX1RSQUNFKCAzLCB2YXJmb3JtYXQgKQorI2RlZmluZSBGVF9UUkFDRTQoIHZhcmZvcm1hdCApICBGVF9UUkFDRSggNCwgdmFyZm9ybWF0ICkKKyNkZWZpbmUgRlRfVFJBQ0U1KCB2YXJmb3JtYXQgKSAgRlRfVFJBQ0UoIDUsIHZhcmZvcm1hdCApCisjZGVmaW5lIEZUX1RSQUNFNiggdmFyZm9ybWF0ICkgIEZUX1RSQUNFKCA2LCB2YXJmb3JtYXQgKQorI2RlZmluZSBGVF9UUkFDRTcoIHZhcmZvcm1hdCApICBGVF9UUkFDRSggNywgdmFyZm9ybWF0ICkKKworCisjaWZkZWYgX19jcGx1c3BsdXMKKyAgfQorI2VuZGlmCisKKworI2VuZGlmIC8qIEZUREVCVUdfSCAqLworCisKKy8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2Jhc2UvZnRkcml2ZXIuaCBiL3NyYy9iYXNlL2Z0ZHJpdmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDRjZjc0OAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9iYXNlL2Z0ZHJpdmVyLmgKQEAgLTAsMCArMSw2NDEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGZ0ZHJpdmVyLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRnJlZVR5cGUgZHJpdmVyIGludGVyZmFjZSAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMTk5Ni0xOTk5IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQgICAgICAgICovCisvKiAgbW9kaWZpZWQgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICAqLworLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KKy8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCisvKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgRlREUklWRVJfSAorI2RlZmluZSBGVERSSVZFUl9ICisKKyNpbmNsdWRlIDxmcmVldHlwZS5oPgorCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLworICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KKyAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgRCBSIEkgViBFIFIgUyAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCisgIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLworICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmNUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZURHJpdmVyX2luaXREcml2ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgZHJpdmVyIG1ldGhvZCB1c2VkIHRvIGNyZWF0ZSBhIG5ldyBkcml2ZXIgb2JqZWN0IGZvciBhIGdpdmVuICAgICAqLworICAvKiAgICBmb3JtYXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBkcml2ZXIgOjogQSBoYW5kbGUgdG8gdGhlIGBuZXcnIGRyaXZlciBvYmplY3QuICBUaGUgZmllbGRzICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgIGBsaWJyYXJ5JywgYHN5c3RlbScsIGFuZCBgbG9jaycgYXJlIGFscmVhZHkgc2V0IHdoZW4gdGhlICovCisgIC8qICAgICAgICAgICAgICBiYXNlIGxheWVyIGNhbGxzIHRoaXMgbWV0aG9kLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBGVF9FcnJvciAgKCpGVERyaXZlcl9pbml0RHJpdmVyKSggRlRfRHJpdmVyICBkcml2ZXIgKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmNUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZURHJpdmVyX2RvbmVFbmdpbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgZHJpdmVyIG1ldGhvZCB1c2VkIHRvIGZpbmFsaXplIGEgZ2l2ZW4gZHJpdmVyIG9iamVjdC4gIE5vdGUgdGhhdCAqLworICAvKiAgICBhbGwgZmFjZXMgYW5kIHJlc291cmNlcyBmb3IgdGhpcyBkcml2ZXIgaGF2ZSBiZWVuIHJlbGVhc2VkIGJlZm9yZSAgKi8KKyAgLyogICAgdGhpcyBjYWxsLCBhbmQgdGhhdCB0aGlzIGZ1bmN0aW9uIHNob3VsZCBOT1QgZGVzdHJveSB0aGUgZHJpdmVyICAgICovCisgIC8qICAgIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGRyaXZlciA6OiBBIGhhbmRsZSB0byB0YXJnZXQgZHJpdmVyIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBGVF9FcnJvciAgKCpGVERyaXZlcl9kb25lRHJpdmVyKSggRlRfRHJpdmVyICBkcml2ZXIgKTsKKworCisgIAorICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVERyaXZlcl9nZXRJbnRlcmZhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBFYWNoIGRyaXZlciBjYW4gcHJvdmlkZSBvbmUgb3IgbW9yZSBleHRlbnNpb25zIHRvIHRoZSBiYXNlICAgICAgICAgKi8KKyAgLyogICAgRnJlZVR5cGUgQVBJLiAgVGhlc2UgY2FuIGJlIHVzZWQgdG8gYWNjZXNzIGZvcm1hdCBzcGVjaWZpYyAgICAgICAgICovCisgIC8qICAgIGZlYXR1cmVzIChlLmcuLCBhbGwgVHJ1ZVR5cGUvT3BlblR5cGUgcmVzb3VyY2VzIHNoYXJlIGEgY29tbW9uICAgICAqLworICAvKiAgICBmaWxlIHN0cnVjdHVyZSBhbmQgY29tbW9uIHRhYmxlcyB3aGljaCBjYW4gYmUgYWNjZXNzZWQgdGhyb3VnaCB0aGUgKi8KKyAgLyogICAgYHNmbnQnIGludGVyZmFjZSksIG9yIG1vcmUgc2ltcGx5IGdlbmVyaWMgb25lcyAoZS5nLiwgdGhlICAgICAgICAgICovCisgIC8qICAgIGBwb3N0c2NyaXB0IG5hbWVzJyBpbnRlcmZhY2Ugd2hpY2ggY2FuIGJlIHVzZWQgdG8gcmV0cmlldmUgdGhlICAgICAqLworICAvKiAgICAgUG9zdFNjcmlwdCBuYW1lIG9mIGEgZ2l2ZW4gZ2x5cGggaW5kZXgpLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBkcml2ZXIgICAgOjogQSBoYW5kbGUgdG8gYSBkcml2ZXIgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgaW50ZXJmYWNlIDo6IEEgc3RyaW5nIGRlc2lnbmluZyB0aGUgaW50ZXJmYWNlLiAgRXhhbXBsZXMgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICBhcmUgYHNmbnQnLCBgcG9zdF9uYW1lcycsIGBjaGFybWFwcycsIGV0Yy4gICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgdHlwZWxlc3MgcG9pbnRlciB0byB0aGUgZXh0ZW5zaW9uJ3MgaW50ZXJmYWNlIChub3JtYWxseSBhIHRhYmxlICAqLworICAvKiAgICBvZiBmdW5jdGlvbiBwb2ludGVycykuICBSZXR1cm5zIE5VTEwgd2hlbiB0aGUgcmVxdWVzdGVkIGV4dGVuc2lvbiAgKi8KKyAgLyogICAgaXNuJ3QgYXZhaWxhYmxlIChpLmUuLCB3YXNuJ3QgY29tcGlsZWQgaW4gdGhlIGRyaXZlciBhdCBidWlsZCAgICAgICovCisgIC8qICAgIHRpbWUpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiB2b2lkKiAgKCpGVERyaXZlcl9nZXRJbnRlcmZhY2UpKCBGVF9Ecml2ZXIgICAgICAgICBkcml2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfU3RyaW5nKiAgaW50ZXJmYWNlICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVERyaXZlcl9mb3JtYXRJbnRlcmZhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBIGRyaXZlciBpbnRlcmZhY2UgZmllbGQgd2hvc2UgdmFsdWUgaXMgYSBkcml2ZXItc3BlY2lmaWMgICAgICAgICAgKi8KKyAgLyogICAgaW50ZXJmYWNlIG1ldGhvZCB0YWJsZXMuICBUaGlzIHRhYmxlIGNvbnRhaW5zIGVudHJ5IHBvaW50cyB0byAgICAgICovCisgIC8qICAgIHZhcmlvdXMgZnVuY3Rpb25zIHRoYXQgYXJlIHN0cmljdGx5IHJlbGF0ZWQgdG8gdGhlIGRyaXZlcidzICAgICAgICAqLworICAvKiAgICBmb3JtYXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgdm9pZCogIEZUX0Zvcm1hdEludGVyZmFjZTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLworICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KKyAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICBGIEEgQyBFIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCisgIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLworICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmNUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZURHJpdmVyX2luaXRGYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgZHJpdmVyIG1ldGhvZCB1c2VkIHRvIGluaXRpYWxpemUgYSBuZXcgZmFjZSBvYmplY3QuICBUaGUgb2JqZWN0ICAqLworICAvKiAgICBtdXN0IGJlIGNyZWF0ZWQgYnkgdGhlIGNhbGxlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBkcml2ZXIgICAgICAgICA6OiBBIGhhbmRsZSB0byB0aGUgc291cmNlIGRyaXZlciBvYmplY3QuICAgICAgICAgICAgKi8KKyAgLyogICAgcmVzb3VyY2UgICAgICAgOjogQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSByZXNvdXJjZS4gICAgICAgICAgICAgICAgICovCisgIC8qICAgIHR5cGVmYWNlX2luZGV4IDo6IFRoZSBpbmRleCBvZiBmYWNlIGluIHRoZSBmb250IHJlc291cmNlLiAgVXNlZCB0byAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICBhY2Nlc3MgaW5kaXZpZHVhbCBmYWNlcyBpbiBjb2xsZWN0aW9ucy4gICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZhY2UgICAgICAgICAgIDo6IEEgaGFuZGxlIHRvIHRoZSBuZXcgdGFyZ2V0IGZhY2UuICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoZSBgdHlwZWZhY2VfaW5kZXgnIHBhcmFtZXRlciBmaWVsZCB3aWxsIGJlIHNldCB0byAtMSB3aGVuIHRoZSAgICAqLworICAvKiAgICBlbmdpbmUgb25seSB3YW50cyB0byB0ZXN0IHRoZSBmb3JtYXQgb2YgdGhlIHJlc291cmNlLiAgVGhpcyBtZWFucyAgKi8KKyAgLyogICAgdGhhdCBmb250IGRyaXZlcnMgc2hvdWxkIHNpbXBseSBjaGVjayB0aGUgZm9udCBmb3JtYXQsIHRoZW4gcmV0dXJuICovCisgIC8qICAgIGltbWVkaWF0ZWx5IHdpdGggYW4gZXJyb3IgY29kZSBvZiAwIChtZWFuaW5nIHN1Y2Nlc3MpLiAgVGhlIGZpZWxkICAqLworICAvKiAgICBgbnVtX2ZhY2VzJyBzaG91bGQgYmUgc2V0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGRvbmVfZmFjZSgpIHdpbGwgYmUgY2FsbGVkIHN1YnNlcXVlbnRseSwgd2hhdGV2ZXIgdGhlIHJlc3VsdCB3YXMuICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBGVF9FcnJvciAgKCpGVERyaXZlcl9pbml0RmFjZSkoIEZUX1N0cmVhbSAgICBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgICAgdHlwZWZhY2VfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GYWNlICAgICAgZmFjZSApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY1R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlREcml2ZXJfZG9uZUZhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSBkcml2ZXIgbWV0aG9kIHVzZWQgdG8gZmluYWxpemUgYSBnaXZlbiBmYWNlIG9iamVjdC4gIFRoaXMgICAgICAgICovCisgIC8qICAgIGZ1bmN0aW9uIGRvZXMgTk9UIGRlc3Ryb3kgdGhlIG9iamVjdCwgdGhhdCBpcyB0aGUgcmVzcG9uc2liaWxpdHkgICAqLworICAvKiAgICBvZiB0aGUgY2FsbGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBmYWNlIDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgdm9pZCAgKCpGVERyaXZlcl9kb25lRmFjZSkoIEZUX0ZhY2UgIGZhY2UgKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmNUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZURHJpdmVyX2dldEtlcm5pbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgZHJpdmVyIG1ldGhvZCB1c2VkIHRvIHJldHVybiB0aGUga2VybmluZyB2ZWN0b3IgYmV0d2VlbiB0d28gICAgICAqLworICAvKiAgICBnbHlwaHMgb2YgdGhlIHNhbWUgZmFjZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBmYWNlICAgICAgICA6OiBBIGhhbmRsZSB0byB0aGUgc291cmNlIGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGxlZnRfZ2x5cGggIDo6IFRoZSBpbmRleCBvZiB0aGUgbGVmdCBnbHlwaCBpbiB0aGUga2VybiBwYWlyLiAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgcmlnaHRfZ2x5cGggOjogVGhlIGluZGV4IG9mIHRoZSByaWdodCBnbHlwaCBpbiB0aGUga2VybiBwYWlyLiAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAga2VybmluZyAgICAgOjogVGhlIGtlcm5pbmcgdmVjdG9yLiAgVGhpcyBpcyBpbiBmb250IHVuaXRzIGZvciAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgIHNjYWxhYmxlIGZvcm1hdHMsIGFuZCBpbiBwaXhlbHMgZm9yIGZpeGVkLXNpemVzICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICBmb3JtYXRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBPbmx5IGhvcml6b250YWwgbGF5b3V0cyAobGVmdC10by1yaWdodCAmIHJpZ2h0LXRvLWxlZnQpIGFyZSAgICAgICAgKi8KKyAgLyogICAgc3VwcG9ydGVkIGJ5IHRoaXMgbWV0aG9kLiAgT3RoZXIgbGF5b3V0cywgb3IgbW9yZSBzb3BoaXN0aWNhdGVkICAgICovCisgIC8qICAgIGtlcm5pbmdzIGFyZSBvdXQgb2YgdGhlIHNjb3BlIG9mIHRoaXMgbWV0aG9kICh0aGUgYmFzaWMgZHJpdmVyICAgICAqLworICAvKiAgICBpbnRlcmZhY2UgaXMgbWVhbnQgdG8gYmUgc2ltcGxlKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoZXkgY2FuIGJlIGltcGxlbWVudGVkIHRocm91Z2ggZm9ybWF0LXNwZWNpZmljIGludGVyZmFjZXMuICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBGVF9FcnJvciAgKCpGVERyaXZlcl9nZXRLZXJuaW5nKSggRlRfRmFjZSAgICAgIGZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICBsZWZ0X2dseXBoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgcmlnaHRfZ2x5cGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1ZlY3RvciogICBrZXJuaW5nICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KKyAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCisgIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgIFMgSSBaIEUgUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLworICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KKyAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVERyaXZlcl9pbml0U2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBIGRyaXZlciBtZXRob2QgdXNlZCB0byBpbml0aWFsaXplIGEgbmV3IHNpemUgb2JqZWN0LiAgVGhlIG9iamVjdCAgKi8KKyAgLyogICAgbXVzdCBiZSBjcmVhdGVkIGJ5IHRoZSBjYWxsZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZmFjZSA6OiBBIGhhbmRsZSB0byB0aGUgcGFyZW50IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHNpemUgOjogQSBoYW5kbGUgdG8gdGhlIG5ldyBzaXplIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoaXMgZnVuY3Rpb24gc2hvdWxkIHJldHVybiBhbiBlcnJvciBpZiB0aGUgZmFjZSdzIGZvcm1hdCBpc24ndCAgICAqLworICAvKiAgICBzY2FsYWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgRlRfRXJyb3IgICgqRlREcml2ZXJfaW5pdFNpemUpKCBGVF9TaXplICBzaXplICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVERyaXZlcl9zZXRDaGFyU2l6ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBIGRyaXZlciBtZXRob2QgdXNlZCB0byByZXNldCBhIHNpemUncyBjaGFyYWN0ZXIgc2l6ZXMgKGhvcml6b250YWwgKi8KKyAgLyogICAgYW5kIHZlcnRpY2FsKSBleHByZXNzZWQgaW4gZnJhY3Rpb25hbCBwb2ludHMuICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgc2l6ZSAgICAgICAgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBzaXplIG9iamVjdC4gICAgICAgICAgICAgICAgICovCisgIC8qICAgIGNoYXJfd2lkdGggIDo6IFRoZSBjaGFyYWN0ZXIgd2lkdGggZXhwcmVzc2VkIGluIDI2LjYgZnJhY3Rpb25hbCAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICBwb2ludHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgY2hhcl9oZWlnaHQgOjogVGhlIGNoYXJhY3RlciBoZWlnaHQgZXhwcmVzc2VkIGluIDI2LjYgZnJhY3Rpb25hbCAgICovCisgIC8qICAgICAgICAgICAgICAgICAgIHBvaW50cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGFsd2F5cyBGQUlMIGlmIHRoZSBmYWNlIGZvcm1hdCBpc24ndCAgICAgICAgICAqLworICAvKiAgICBzY2FsYWJsZSEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgRlRfRXJyb3IgICgqRlREcml2ZXJfc2V0Q2hhclNpemVzKSggRlRfU2l6ZSAgICAgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GMjZEb3Q2ICBjaGFyX3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0YyNkRvdDYgIGNoYXJfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgIGhvcnpfcmVzb2x1dGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICB2ZXJ0X3Jlc29sdXRpb24gKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmNUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZURHJpdmVyX3NldFBpeGVsU2l6ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgZHJpdmVyIG1ldGhvZCB1c2VkIHRvIHJlc2V0IGEgc2l6ZSdzIGNoYXJhY3RlciBzaXplcyAoaG9yaXpvbnRhbCAqLworICAvKiAgICBhbmQgdmVydGljYWwpIGV4cHJlc3NlZCBpbiBpbnRlZ2VyIHBpeGVscy4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzaXplICAgICAgICAgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBzaXplIG9iamVjdC4gICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHBpeGVsX3dpZHRoICA6OiBUaGUgY2hhcmFjdGVyIHdpZHRoIGV4cHJlc3NlZCBpbiAyNi42IGZyYWN0aW9uYWwgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgcGl4ZWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHBpeGVsX2hlaWdodCA6OiBUaGUgY2hhcmFjdGVyIGhlaWdodCBleHByZXNzZWQgaW4gMjYuNiBmcmFjdGlvbmFsICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgcGl4ZWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHBvaW50X3NpemUgICA6OiBUaGUgY29ycmVzcG9uZGluZyBjaGFyYWN0ZXIgc2l6ZSBpbiBwb2ludHMuICBUaGlzICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgdmFsdWUgaXMgb25seSBzZW50IHRvIHRoZSBUcnVlVHlwZSBieXRlY29kZSAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgIGludGVycHJldGVyLCBldmVuIHRob3VnaCA5OSUgb2YgZ2x5cGggcHJvZ3JhbXMgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICB3aWxsIHNpbXBseSBpZ25vcmUgaXQuICBBIHNhZmUgdmFsdWUgdGhlcmUgaXMgdGhlICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgbWF4aW11bSBvZiB0aGUgcGl4ZWwgd2lkdGggYW5kIGhlaWdodCAobXVsdGlwbGllZCAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgIGJ5IDY0IHRvIG1ha2UgaXQgYSAyNi42IGZpeGVkIGZsb2F0KS4gICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGlzIGZ1bmN0aW9uIHNob3VsZCB3b3JrIHdpdGggYWxsIGtpbmRzIG9mIGBTaXplJyBvYmplY3RzLCBlaXRoZXIgKi8KKyAgLyogICAgZml4ZWQgb3Igc2NhbGFibGUgb25lcy4gIFRoZSBgcG9pbnRfc2l6ZScgcGFyYW1ldGVyIHdpbGwgc2ltcGx5IGJlICovCisgIC8qICAgIGlnbm9yZWQgaW4gY2FzZSBvZiBmaXhlZCBmb3JtYXRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBGVF9FcnJvciAgKCpGVERyaXZlcl9zZXRQaXhlbFNpemVzKSggRlRfU2l6ZSAgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgcGl4ZWxfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgIHBpeGVsX2hlaWdodCApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY1R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlREcml2ZXJfZG9uZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSBkcml2ZXIgbWV0aG9kIHVzZWQgdG8gZmluYWxpemUgYSBnaXZlbiBzaXplIG9iamVjdC4gIFRoaXMgbWV0aG9kICovCisgIC8qICAgIGRvZXMgTk9UIGRlc3Ryb3kgdGhlIG9iamVjdDsgdGhpcyBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlICAgICAqLworICAvKiAgICBjYWxsZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzaXplIDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgc2l6ZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgdm9pZCAgKCpGVERyaXZlcl9kb25lU2l6ZSkoIEZUX1NpemUgIHNpemUgKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLworICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KKyAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgIEcgTCBZIFAgSCAgIFMgTCBPIFQgUyAgICAgICAgICAgICAgICAgICAgICoqKiovCisgIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLworICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmNUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZURHJpdmVyX2luaXRHbHlwaFNsb3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgZHJpdmVyIG1ldGhvZCB1c2VkIHRvIGluaXRpYWxpemUgYSBuZXcgZ2x5cGggc2xvdCBvYmplY3QuICBUaGUgICAqLworICAvKiAgICBvYmplY3QgbXVzdCBiZSBjcmVhdGVkIGJ5IHRoZSBjYWxsZXIuICBUaGUgZ2x5cGggc2xvdCBpcyBhICAgICAgICAgKi8KKyAgLyogICAgY29udGFpbmVyIHdoZXJlIGEgc2luZ2xlIGdseXBoIGNhbiBiZSBsb2FkZWQsIGVpdGhlciBpbiBvdXRsaW5lIG9yICovCisgIC8qICAgIGJpdG1hcCBmb3JtYXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZhY2UgOjogQSBoYW5kbGUgdG8gdGhlIHBhcmVudCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzbG90IDo6IEEgaGFuZGxlIHRvIHRoZSBuZXcgZ2x5cGggc2xvdCBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgRlRfRXJyb3IgICgqRlREcml2ZXJfaW5pdEdseXBoU2xvdCkoIEZUX0dseXBoU2xvdCAgc2xvdCApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY1R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlREcml2ZXJfZG9uZUdseXBoU2xvdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSBkcml2ZXIgbWV0aG9kIHVzZWQgdG8gZmluYWxpemUgYSBnaXZlbiBnbHlwaCBzbG90LiAgVGhlIG9iamVjdCAgICovCisgIC8qICAgIGlzIG5vdCBkZXN0cm95ZWQgYnkgdGhpcyBmdW5jdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZhY2UgOjogQSBoYW5kbGUgdG8gdGhlIHBhcmVudCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzbG90IDo6IEEgaGFuZGxlIHRvIHRoZSBuZXcgZ2x5cGggc2xvdCBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgdm9pZCAgKCpGVERyaXZlcl9kb25lR2x5cGhTbG90KSggRlRfR2x5cGhTbG90ICBzbG90ICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVERyaXZlcl9sb2FkR2x5cGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBIGRyaXZlciBtZXRob2QgdXNlZCB0byBsb2FkIGEgZ2x5cGggd2l0aGluIGEgZ2l2ZW4gZ2x5cGggc2xvdC4gICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzbG90ICAgICAgICA6OiBBIGhhbmRsZSB0byB0YXJnZXQgc2xvdCBvYmplY3Qgd2hlcmUgdGhlIGdseXBoIHdpbGwgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgYmUgbG9hZGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzaXplICAgICAgICA6OiBBIGhhbmRsZSB0byB0aGUgc291cmNlIGZhY2Ugc2l6ZSBhdCB3aGljaCB0aGUgZ2x5cGggKi8KKyAgLyogICAgICAgICAgICAgICAgICAgbXVzdCBiZSBzY2FsZWQvbG9hZGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBnbHlwaF9pbmRleCA6OiBUaGUgaW5kZXggb2YgdGhlIGdseXBoIGluIHRoZSBmb250IGZpbGUuICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGxvYWRfZmxhZ3MgIDo6IEEgZmxhZyBpbmRpY2F0aW5nIHdoYXQgdG8gbG9hZCBmb3IgdGhpcyBnbHlwaC4gIFRoZSAqLworICAvKiAgICAgICAgICAgICAgICAgICBGVExPQURfPz8/IGNvbnN0YW50cyBjYW4gYmUgdXNlZCB0byBjb250cm9sIHRoZSAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgZ2x5cGggbG9hZGluZyBwcm9jZXNzIChlLmcuLCB3aGV0aGVyIHRoZSBvdXRsaW5lICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgIHNob3VsZCBiZSBzY2FsZWQsIHdoZXRoZXIgdG8gbG9hZCBiaXRtYXBzIG9yIG5vdCwgICAqLworICAvKiAgICAgICAgICAgICAgICAgICB3aGV0aGVyIHRvIGhpbnQgdGhlIG91dGxpbmUsIGV0YykuICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHJlc3VsdCAgICAgIDo6IEEgc2V0IG9mIGJpdCBmbGFncyBpbmRpY2F0aW5nIHRoZSB0eXBlIG9mIGRhdGEgdGhhdCAqLworICAvKiAgICAgICAgICAgICAgICAgICB3YXMgbG9hZGVkIGluIHRoZSBnbHlwaCBzbG90IChvdXRsaW5lLCBiaXRtYXAsICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgcGl4bWFwLCBldGMpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIEZUX0Vycm9yICAoKkZURHJpdmVyX2xvYWRHbHlwaCkoIEZUX0dseXBoU2xvdCAgc2xvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TaXplICAgICAgIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICBnbHlwaF9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgIGxvYWRfZmxhZ3MgKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLworICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KKyAgLyoqKiogICAgICAgICAgICAgICAgICBDIEggQSBSIEEgQyBUIEUgUiAgIE0gQSBQIFMgICAgICAgICAgICAgICAgICAgICoqKiovCisgIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLworICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVERyaXZlcl9nZXRDaGFySW5kZXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBVc2VzIGEgY2hhcm1hcCB0byByZXR1cm4gYSBnaXZlbiBjaGFyYWN0ZXIgY29kZSdzIGdseXBoIGluZGV4LiAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBjaGFybWFwICA6OiBBIGhhbmRsZSB0byB0aGUgc291cmNlIGNoYXJtYXAgb2JqZWN0LiAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgY2hhcmNvZGUgOjogVGhlIGNoYXJhY3RlciBjb2RlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhlIGdseXBoIGluZGV4LiAgMCBtZWFucyBgdW5kZWZpbmVkIGNoYXJhY3RlciBjb2RlJy4gICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIEZUX1VJbnQgICgqRlREcml2ZXJfZ2V0Q2hhckluZGV4KSggRlRfQ2hhck1hcCAgY2hhcm1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgIGNoYXJjb2RlICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9Ecml2ZXJJbnRlcmZhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBIHN0cnVjdHVyZSB3aGljaCBob2xkcyBhIGZvbnQgZHJpdmVyJ3MgYmFzaWMgaW50ZXJmYWNlIHVzZWQgYnkgICAgKi8KKyAgLyogICAgdGhlIGhpZ2gtbGV2ZWwgcGFydHMgb2YgRnJlZVR5cGUgKG9yIG90aGVyIGFwcGxpY2F0aW9ucykuICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBNb3N0IHNjYWxhYmxlIGRyaXZlcnMgcHJvdmlkZSBhIHNwZWNpYWxpemVkIGludGVyZmFjZSB0byBhY2Nlc3MgICAgKi8KKyAgLyogICAgZm9ybWF0IHNwZWNpZmljIGZlYXR1cmVzLiAgSXQgY2FuIGJlIHJldHJpZXZlZCB3aXRoIGEgY2FsbCB0byAgICAgICovCisgIC8qICAgIGBnZXRfZm9ybWF0X2ludGVyZmFjZSgpJywgYW5kIHNob3VsZCBiZSBkZWZpbmVkIGluIGVhY2ggZm9udCAgICAgICAqLworICAvKiAgICBkcml2ZXIgaGVhZGVyIChlLmcuLCB0dGRyaXZlci5oLCB0MWRyaXZlci5oLCBldGMpLiAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEFsbCBmaWVsZHMgYXJlIGZ1bmN0aW9uIHBvaW50ZXJzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGRyaXZlcl9vYmplY3Rfc2l6ZSAgIDo6IFRoZSBzaXplIGluIGJ5dGVzIG9mIGEgc2luZ2xlIGRyaXZlciAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZhY2Vfb2JqZWN0X3NpemUgICAgIDo6IFRoZSBzaXplIGluIGJ5dGVzIG9mIGEgc2luZ2xlIGZhY2Ugb2JqZWN0LiAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgc2l6ZV9vYmplY3Rfc2l6ZSAgICAgOjogVGhlIHNpemUgaW4gYnl0ZXMgb2YgYSBzaW5nbGUgc2l6ZSBvYmplY3QuICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzbG90X29iamVjdF9zaXplICAgICA6OiBUaGUgc2l6ZSBpbiBieXRlcyBvZiBhIHNpbmdsZSBnbHlwaCBzbG90ICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBkcml2ZXJfbmFtZSAgICAgICAgICA6OiBhIHN0cmluZyB0byBkZXNjcmliZSB0aGUgZHJpdmVyIHRvIHRoZSAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzdGVtLiBJdCBkb2Vzbid0IG5lY2Vzc2FyaWx5IGRlc2NyaWJlICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIGRldGFpbCBhbGwgdGhlIGZvbnQgZm9ybWF0cyB0aGUgZHJpdmVyICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXkgc3VwcG9ydC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGRyaXZlcl92ZXJzaW9uICAgICAgIDo6IGRyaXZlciB2ZXJzaW9uIG51bWJlci4gc3RhcnRzIGF0IDEgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZHJpdmVyX3JlcXVpcmVzICAgICAgOjogdGhlIEZyZWVUeXBlIG1ham9yIHZlcnNpb24gdGhpcyBkcml2ZXIgaXMgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXR0ZW4gZm9yLiBUaGlzIG51bWJlciBzaG91bGQgYmUgZXF1YWwgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBvciBncmVhdGVyIHRoYW4gMiAhICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZvcm1hdF9pbnRlcmZhY2UgICAgIDo6IEEgcG9pbnRlciB0byB0aGUgZHJpdmVyJ3MgZm9ybWF0LXNwZWNpZmljICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGluaXRfZHJpdmVyICAgICAgICAgIDo6IFVzZWQgdG8gaW5pdGlhbGl6ZSBhIGdpdmVuIGRyaXZlciBvYmplY3QuICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZG9uZV9kcml2ZXIgICAgICAgICAgOjogVXNlZCB0byBmaW5hbGl6ZSBhbmQgZGVzdHJveSBhIGdpdmVuICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyaXZlciBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZ2V0X2V4dGVuc2lvbiAgICAgICAgOjogUmV0dXJucyBhbiBpbnRlcmZhY2UgZm9yIGEgZ2l2ZW4gZHJpdmVyICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgaW5pdF9mYWNlICAgICAgICAgICAgOjogSW5pdGlhbGl6ZXMgYSBnaXZlbiBmYWNlIG9iamVjdC4gICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBkb25lX2ZhY2UgICAgICAgICAgICA6OiBEaXNjYXJkcyBhIGZhY2Ugb2JqZWN0LCBhcyB3ZWxsIGFzIGFsbCAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQgb2JqZWN0cyAoc2l6ZXMsIGNoYXJtYXBzLCBnbHlwaCAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsb3RzKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZ2V0X2tlcm5pbmcgICAgICAgICAgOjogUmV0dXJucyB0aGUga2VybmluZyB2ZWN0b3IgY29ycmVzcG9uZGluZyAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGEgcGFpciBvZiBnbHlwaHMsIGV4cHJlc3NlZCBpbiB1bnNjYWxlZCAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250IHVuaXRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGluaXRfc2l6ZSAgICAgICAgICAgIDo6IEluaXRpYWxpemVzIGEgZ2l2ZW4gc2l6ZSBvYmplY3QuICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZG9uZV9zaXplICAgICAgICAgICAgOjogRmluYWxpemVzIGEgZ2l2ZW4gc2l6ZSBvYmplY3QuICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzZXRfc2l6ZV9jaGFyX3NpemVzICA6OiBSZXNldHMgYSBzY2FsYWJsZSBzaXplIG9iamVjdCdzIGNoYXJhY3RlciAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzZXRfcGl4ZWxfc2l6ZXMgICAgICA6OiBSZXNldHMgYSBmYWNlIHNpemUgb2JqZWN0J3MgcGl4ZWwgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGltZW5zaW9ucy4gIEFwcGxpZXMgdG8gYm90aCBzY2FsYWJsZSBhbmQgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpeGVkIGZhY2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgaW5pdF9nbHlwaF9zbG90ICAgICAgOjogSW5pdGlhbGl6ZXMgYSBnaXZlbiBnbHlwaCBzbG90IG9iamVjdC4gICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBkb25lX2dseXBoX3Nsb3QgICAgICA6OiBGaW5hbGl6ZXMgYSBnaXZlbiBnbHlwaCBzbG90LiAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGxvYWRfZ2x5cGggICAgICAgICAgIDo6IExvYWRzIGEgZ2l2ZW4gZ2x5cGggaW50byBhIGdpdmVuIHNsb3QuICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBzdHJ1Y3QgIEZUX0RyaXZlckludGVyZmFjZV8KKyAgeworICAgIEZUX0ludCAgICAgICAgICAgICAgICAgICAgICAgZHJpdmVyX29iamVjdF9zaXplOworICAgIEZUX0ludCAgICAgICAgICAgICAgICAgICAgICAgZmFjZV9vYmplY3Rfc2l6ZTsKKyAgICBGVF9JbnQgICAgICAgICAgICAgICAgICAgICAgIHNpemVfb2JqZWN0X3NpemU7CisgICAgRlRfSW50ICAgICAgICAgICAgICAgICAgICAgICBzbG90X29iamVjdF9zaXplOworCisgICAgRlRfU3RyaW5nKiAgICAgICAgICAgICAgICAgICBkcml2ZXJfbmFtZTsKKyAgICBGVF9JbnQgICAgICAgICAgICAgICAgICAgICAgIGRyaXZlcl92ZXJzaW9uOworICAgIEZUX0ludCAgICAgICAgICAgICAgICAgICAgICAgZHJpdmVyX3JlcXVpcmVzOworCisgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXRfaW50ZXJmYWNlOworCisgICAgRlREcml2ZXJfaW5pdERyaXZlciAgICAgICAgICBpbml0X2RyaXZlcjsKKyAgICBGVERyaXZlcl9kb25lRHJpdmVyICAgICAgICAgIGRvbmVfZHJpdmVyOworICAgIEZURHJpdmVyX2dldEludGVyZmFjZSAgICAgICAgZ2V0X2ludGVyZmFjZTsKKworICAgIEZURHJpdmVyX2luaXRGYWNlICAgICAgICAgICAgaW5pdF9mYWNlOworICAgIEZURHJpdmVyX2RvbmVGYWNlICAgICAgICAgICAgZG9uZV9mYWNlOworICAgIEZURHJpdmVyX2dldEtlcm5pbmcgICAgICAgICAgZ2V0X2tlcm5pbmc7CisKKyAgICBGVERyaXZlcl9pbml0U2l6ZSAgICAgICAgICAgIGluaXRfc2l6ZTsKKyAgICBGVERyaXZlcl9kb25lU2l6ZSAgICAgICAgICAgIGRvbmVfc2l6ZTsKKyAgICBGVERyaXZlcl9zZXRDaGFyU2l6ZXMgICAgICAgIHNldF9jaGFyX3NpemVzOworICAgIEZURHJpdmVyX3NldFBpeGVsU2l6ZXMgICAgICAgc2V0X3BpeGVsX3NpemVzOworCisgICAgRlREcml2ZXJfaW5pdEdseXBoU2xvdCAgICAgICBpbml0X2dseXBoX3Nsb3Q7CisgICAgRlREcml2ZXJfZG9uZUdseXBoU2xvdCAgICAgICBkb25lX2dseXBoX3Nsb3Q7CisgICAgRlREcml2ZXJfbG9hZEdseXBoICAgICAgICAgICBsb2FkX2dseXBoOworCisgICAgRlREcml2ZXJfZ2V0Q2hhckluZGV4ICAgICAgICBnZXRfY2hhcl9pbmRleDsKKworICB9IEZUX0RyaXZlckludGVyZmFjZTsKKworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfRHJpdmVyQ2hhaW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSB2ZXJ5IHN0cnVjdHVyZSB1c2VkIGV4Y2x1c2l2ZWx5IGJ5ICJmdGluaXQuYyIgaW4gdGhlIGZ1bmN0aW9uICAgICovCisgIC8qICAgIEZUX0FkZF9EZWZhdWx0X0RyaXZlcnMuIFRoaXMgZnVuY3Rpb24gaXMgaW4gY2hhcmdlIG9mIGxvYWRpbmcgdGhlICAqLworICAvKiAgICBzZXQgb2YgImRlZmF1bHQiIGZvbnQgZHJpdmVycyBpbnRvIGVhY2ggbmV3IGxpYnJhcnkgb2JqZWN0LiAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoZSBzZXQgaXRzZWxmIGlzIGRldGVybWluZWQgYXQgX2NvbXBpbGVfIHRpbWUgdGhyb3VnaCB2YXJpb3VzICAgICAqLworICAvKiAgICBtYWNybyBkZWZpbml0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBuZXh0ICAgICAgOjogcG9pbnRlciB0byBuZXh0IGVsZW1lbnQgaW4gZHJpdmVyIGxpc3QgY2hhaW4gICAgICAgICAgKi8KKyAgLyogICAgaW50ZXJmYWNlIDo6IHBvaW50ZXIgdG8gdGhlIGRyaXZlcidzIGludGVyZmFjZSAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHN0cnVjdCBGVF9Ecml2ZXJDaGFpbl8gIEZUX0RyaXZlckNoYWluOworCisgIHN0cnVjdCBGVF9Ecml2ZXJDaGFpbl8KKyAgeworICAgIGNvbnN0IEZUX0RyaXZlckNoYWluKiAgICAgIG5leHQ7CisgICAgY29uc3QgRlRfRHJpdmVySW50ZXJmYWNlKiAgaW50ZXJmYWNlOworICB9OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIEhlcmUgaXMgYSB0ZW1wbGF0ZSBvZiB0aGUgY29kZSB0aGF0IHNob3VsZCBhcHBlYXIgaW4gZWFjaAorICogIGZvbnQgZHJpdmVyJ3MgX2ludGVyZmFjZV8gZmlsZSAodGhlIG9uZSBpbmNsdWRlZCBieSAiZnRpbml0LmMiKS4KKyAqCisgKiAgSXQgaXMgdXNlZCB0byBidWlsZCwgYXQgY29tcGlsZSB0aW1lLCBhIHNpbXBsZSBsaW5rZWQgbGlzdCBvZgorICogIHRoZSBpbnRlcmZhY2VzIG9mIHRoZSBkcml2ZXJzIHdoaWNoIGhhdmUgYmVlbiAjaW5jbHVkZWQgaW4gCisgKiAgImZ0aW5pdC5jIi4gU2VlIHRoZSBzb3VyY2UgY29kZSBvZiB0aGUgbGF0dGVyIGZpbGUgZm9yIGRldGFpbHMKKyAqCisgKiAgKE5vdGUgdGhhdCB0aGlzIGlzIG9ubHkgcmVxdWlyZWQgd2hlbiB5b3Ugd2FudCB5b3VyIGRyaXZlciBpbmNsdWRlZAorICogICBpbiB0aGUgc2V0IG9mIGRlZmF1bHQgZHJpdmVycyBsb2FkZWQgYnkgRlRfSW5pdF9GcmVlVHlwZS4gT3RoZXIKKyAqICAgZHJpdmVycyBjYW4gc3RpbGwgYmUgYWRkZWQgbWFudWFsbHkgYXQgcnVudGltZSB3aXRoIEZUX0FkZF9Ecml2ZXIuCisgKgorICogeworICogICAjaWZkZWYgRlRJTklUX0RSSVZFUl9DSEFJTgorICoKKyAqICAgc3RhdGljCisgKiAgIGNvbnN0IEZUX0RyaXZlckNoYWluICBmdGluaXRfPEZPUk1BVD5fZHJpdmVyX2NoYWluID0KKyAqICAgeworICogICAgIEZUX0lOSVRfTEFTVF9EUklWRVJfQ0hBSU4sCisgKiAgICAgJjxGT1JNQVQ+X2RyaXZlcl9pbnRlcmZhY2UKKyAqICAgfTsKKyAqIAorICogICAjdW5kZWYgIEZUX0lOSVRfTEFTVF9EUklWRVJfQ0hBSU4KKyAqICAgI2RlZmluZSBGVF9JTklUX0xBU1RfRFJJVkVSX0NIQUlOICAgJmZ0aW5pdF88Rk9STUFUPl9kcml2ZXJfY2hhaW4KKyAqCisgKiAgICNlbmRpZiAKKyAqIH0KKyAqCisgKiAgcmVwbGFjZSA8Rk9STUFUPiB3aXRoIHlvdXIgZHJpdmVyJ3MgcHJlZml4CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2VuZGlmIC8qIEZURFJJVkVSX0ggKi8KKworCisvKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9iYXNlL2Z0ZXh0ZW5kLmMgYi9zcmMvYmFzZS9mdGV4dGVuZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxNWQzOGIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvYmFzZS9mdGV4dGVuZC5jCkBAIC0wLDAgKzEsMTk5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBmdGV4dGVuZC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi4wCisgKgorICogICAgRXh0ZW5zaW9ucyBJbXBsZW1lbnRhdGlvbgorICoKKyAqICBDb3B5cmlnaHQgMTk5Ni0xOTk5IGJ5CisgKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQKKyAqICBtb2RpZmllZCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqICBUaGlzIGlzIGFuIHVwZGF0ZWQgdmVyc2lvbiBvZiB0aGUgZXh0ZW5zaW9uIGNvbXBvbmVudCwgbm93CisgKiAgbG9jYXRlZCBpbiB0aGUgbWFpbiBsaWJyYXJ5J3Mgc291cmNlIGRpcmVjdG9yeS4gIEl0IGFsbG93cworICogIHRoZSBkeW5hbWljIHJlZ2lzdHJhdGlvbi91c2Ugb2YgdmFyaW91cyBmYWNlIG9iamVjdCBleHRlbnNpb25zCisgKiAgdGhyb3VnaCBhIHNpbXBsZSBBUEkuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgImZ0ZXh0ZW5kLmgiCisjaW5jbHVkZSAiZnRvYmpzLmgiCisKKy8qIHJlcXVpcmVkIGJ5IHRoZSB0cmFjaW5nIG1vZGUgKi8KKyN1bmRlZiAgRlRfQ09NUE9ORU5UCisjZGVmaW5lIEZUX0NPTVBPTkVOVCAgICAgIHRyYWNlX2V4dGVuZAorCisKKyAgdHlwZWRlZiBzdHJ1Y3QgRlRfRXh0ZW5zaW9uX1JlZ2lzdHJ5XworICB7CisgICAgRlRfSW50ICAgICAgICAgICAgICBudW1fZXh0ZW5zaW9uczsKKyAgICBGVF9Mb25nICAgICAgICAgICAgIGN1cl9vZmZzZXQ7CisgICAgRlRfRXh0ZW5zaW9uX0NsYXNzICBjbGFzc2VzW0ZUX01BWF9FWFRFTlNJT05TXTsKKyAgICAKKyAgfSBGVF9FeHRlbnNpb25fUmVnaXN0cnk7CisKKworICAvKiBJbml0aWFsaXplIHRoZSBleHRlbnNpb24gY29tcG9uZW50ICovCisKKyAgTE9DQUxfRlVOQworICBGVF9FcnJvciAgRlRfSW5pdF9FeHRlbnNpb25zKCBGVF9Ecml2ZXIgIGRyaXZlciApCisgIHsKKyAgRlRfRXJyb3IgICAgICAgICAgICAgICAgZXJyb3I7CisgICAgRlRfTWVtb3J5ICAgICAgICAgICAgICAgbWVtb3J5OworICAgIEZUX0V4dGVuc2lvbl9SZWdpc3RyeSogIHJlZ2lzdHJ5OworCisgICAgbWVtb3J5ID0gZHJpdmVyLT5saWJyYXJ5LT5tZW1vcnk7CisgICAgaWYgKCBBTExPQyggcmVnaXN0cnksIHNpemVvZiAoKnJlZ2lzdHJ5KSApICkKKyAgICAgIHJldHVybiBlcnJvcjsKKworICAgIHJlZ2lzdHJ5LT5udW1fZXh0ZW5zaW9ucyA9IDA7CisgICAgcmVnaXN0cnktPmN1cl9vZmZzZXQgICAgID0gMDsKKyAgICBkcml2ZXItPmV4dGVuc2lvbnMgICAgICAgPSByZWdpc3RyeTsKKworICAgIHJldHVybiBGVF9FcnJfT2s7CisgIH0KKworCisgIC8qIEZpbmFsaXplIHRoZSBleHRlbnNpb24gY29tcG9uZW50ICovCisKKyAgTE9DQUxfRlVOQworICBGVF9FcnJvciAgRlRfRG9uZV9FeHRlbnNpb25zKCBGVF9Ecml2ZXIgIGRyaXZlciApCisgIHsKKyAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IGRyaXZlci0+bWVtb3J5OworICAgIAorICAgIEZSRUUoIGRyaXZlci0+ZXh0ZW5zaW9ucyApOworICAgIHJldHVybiBGVF9FcnJfT2s7CisgIH0KKworCisgIC8qIFJlZ2lzdGVyIGEgbmV3IGV4dGVuc2lvbiAqLworCisgIEVYUE9SVF9GVU5DCisgIEZUX0Vycm9yICBGVF9SZWdpc3Rlcl9FeHRlbnNpb24oIEZUX0RyaXZlciAgICAgICAgICAgIGRyaXZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRXh0ZW5zaW9uX0NsYXNzKiAgY2xhenogKQorICB7CisgICAgRlRfRXh0ZW5zaW9uX1JlZ2lzdHJ5KiAgcmVnaXN0cnk7CisKKyAgICByZWdpc3RyeSA9IChGVF9FeHRlbnNpb25fUmVnaXN0cnkqKWRyaXZlci0+ZXh0ZW5zaW9uczsKKyAgICBpZiAocmVnaXN0cnkpCisgICAgeworICAgICAgRlRfSW50ICAgICAgICAgICAgICAgbiAgID0gcmVnaXN0cnktPm51bV9leHRlbnNpb25zOworICAgICAgRlRfRXh0ZW5zaW9uX0NsYXNzKiAgY3VyID0gcmVnaXN0cnktPmNsYXNzZXMgKyBuOworICAgICAgCisgICAgICBpZiAoIG4gPj0gRlRfTUFYX0VYVEVOU0lPTlMgKQorICAgICAgICByZXR1cm4gRlRfRXJyX1Rvb19NYW55X0V4dGVuc2lvbnM7CisKKyAgICAgICpjdXIgPSAqY2xheno7ICAgIAorCisgICAgICBjdXItPm9mZnNldCAgPSByZWdpc3RyeS0+Y3VyX29mZnNldDsKKworICAgICAgcmVnaXN0cnktPm51bV9leHRlbnNpb25zKys7CisgICAgICByZWdpc3RyeS0+Y3VyX29mZnNldCArPSAoIGN1ci0+c2l6ZSArIEZUX0FMSUdOTUVOVC0xICkgJiAtRlRfQUxJR05NRU5UOworICAgIH0KKworICAgIHJldHVybiBGVF9FcnJfT2s7CisgIH0KKworCisgIC8qIFF1ZXJ5IGFuIGV4dGVuc2lvbiBibG9jayBieSBleHRlbnNpb25fSUQgKi8KKworICBFWFBPUlRfRlVOQworICB2b2lkKiAgRlRfR2V0X0V4dGVuc2lvbiggRlRfRmFjZSAgICAgIGZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgZXh0ZW5zaW9uX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICAgKmV4dGVuc2lvbl9pbnRlcmZhY2UgKSAKKyAgeworICAgIEZUX0V4dGVuc2lvbl9SZWdpc3RyeSogIHJlZ2lzdHJ5OworICAgIAorICAgIHJlZ2lzdHJ5ID0gKEZUX0V4dGVuc2lvbl9SZWdpc3RyeSopZmFjZS0+ZHJpdmVyLT5leHRlbnNpb25zOworICAgIGlmIChyZWdpc3RyeSAmJiBmYWNlLT5leHRlbnNpb25zKQorICAgIHsKKyAgICAgIEZUX0V4dGVuc2lvbl9DbGFzcyogIGN1ciAgID0gcmVnaXN0cnktPmNsYXNzZXM7CisgICAgICBGVF9FeHRlbnNpb25fQ2xhc3MqICBsaW1pdCA9IGN1ciArIHJlZ2lzdHJ5LT5udW1fZXh0ZW5zaW9uczsKKyAgICAgIAorICAgICAgZm9yICggOyBjdXIgPCBsaW1pdDsgY3VyKysgKQorICAgICAgICBpZiAoIHN0cmNtcCggY3VyLT5pZCwgZXh0ZW5zaW9uX2lkICkgPT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAqZXh0ZW5zaW9uX2ludGVyZmFjZSA9IGN1ci0+aW50ZXJmYWNlOworICAgICAgICAgIHJldHVybiAodm9pZCopKChjaGFyKilmYWNlLT5leHRlbnNpb25zICsgY3VyLT5vZmZzZXQpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8qIGNvdWxkIG5vdCBmaW5kIHRoZSBleHRlbnNpb24gaWQgKi8KKyAgICAqZXh0ZW5zaW9uX2ludGVyZmFjZSA9IDA7CisgICAgcmV0dXJuIDA7CisgIH0KKworICAvKiBEZXN0cm95IGFsbCBleHRlbnNpb25zIHdpdGhpbiBhIGZhY2Ugb2JqZWN0LiAgQ2FsbGVkIGJ5IHRoZSAqLworICAvKiBmYWNlIG9iamVjdCBkZXN0cnVjdG9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgIExPQ0FMX0ZVTkMKKyAgRlRfRXJyb3IgIEZUX0Rlc3Ryb3lfRXh0ZW5zaW9ucyggRlRfRmFjZSAgZmFjZSApCisgIHsKKyAgICBGVF9FeHRlbnNpb25fUmVnaXN0cnkqICByZWdpc3RyeTsKKyAgICBGVF9NZW1vcnkgICAgICAgICAgICAgICBtZW1vcnk7CisgICAgCisgICAgcmVnaXN0cnkgPSAoRlRfRXh0ZW5zaW9uX1JlZ2lzdHJ5KilmYWNlLT5kcml2ZXItPmV4dGVuc2lvbnM7CisgICAgaWYgKHJlZ2lzdHJ5ICYmIGZhY2UtPmV4dGVuc2lvbnMpCisgICAgeworICAgICAgRlRfRXh0ZW5zaW9uX0NsYXNzKiAgY3VyICAgPSByZWdpc3RyeS0+Y2xhc3NlczsKKyAgICAgIEZUX0V4dGVuc2lvbl9DbGFzcyogIGxpbWl0ID0gY3VyICsgcmVnaXN0cnktPm51bV9leHRlbnNpb25zOworICAgICAgCisgICAgICBmb3IgKCA7IGN1ciA8IGxpbWl0OyBjdXIrKyApCisgICAgICB7CisgICAgICAgIGNoYXIqICBleHQgPSAoY2hhciopZmFjZS0+ZXh0ZW5zaW9ucyArIGN1ci0+b2Zmc2V0OworICAgICAgICAKKyAgICAgICAgaWYgKGN1ci0+ZmluYWxpemUpCisgICAgICAgICAgY3VyLT5maW5hbGl6ZSggZXh0LCBmYWNlICk7CisgICAgICB9CisgICAgICAKKyAgICAgIG1lbW9yeSA9IGZhY2UtPmRyaXZlci0+bWVtb3J5OworICAgICAgRlJFRSggZmFjZS0+ZXh0ZW5zaW9ucyApOworICAgIH0KKyAgICByZXR1cm4gRlRfRXJyX09rOworICB9CisKKworICAvKiBDcmVhdGUgYW4gZXh0ZW5zaW9uIHdpdGhpbiBhIGZhY2Ugb2JqZWN0LiAgQ2FsbGVkIGJ5IHRoZSAqLworICAvKiBmYWNlIG9iamVjdCBjb25zdHJ1Y3Rvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgIExPQ0FMX0ZVTkMKKyAgRlRfRXJyb3IgIEZUX0NyZWF0ZV9FeHRlbnNpb25zKCBGVF9GYWNlICBmYWNlICkKKyAgeworICAgIEZUX0V4dGVuc2lvbl9SZWdpc3RyeSogIHJlZ2lzdHJ5OworICAgIEZUX01lbW9yeSAgICAgICAgICAgICAgIG1lbW9yeTsKKyAgICBGVF9FcnJvciAgICAgICAgICAgICAgICBlcnJvcjsKKyAgICAKKyAgICBmYWNlLT5leHRlbnNpb25zID0gMDsKKyAgICAKKyAgICAvKiBsb2FkIGV4dGVuc2lvbnMgcmVnaXN0cnksIGV4aXQgc3VjY2VzZnVsbHkgaWYgbm9uZSBpcyB0aGVyZSAqLworICAgIHJlZ2lzdHJ5ID0gKEZUX0V4dGVuc2lvbl9SZWdpc3RyeSopZmFjZS0+ZHJpdmVyLT5leHRlbnNpb25zOworICAgIGlmICghcmVnaXN0cnkpIHJldHVybiBGVF9FcnJfT2s7CisgICAgCisgICAgbWVtb3J5ID0gZmFjZS0+ZHJpdmVyLT5tZW1vcnk7CisgICAgaWYgKCBBTExPQyggZmFjZS0+ZXh0ZW5zaW9ucywgcmVnaXN0cnktPmN1cl9vZmZzZXQgKSApCisgICAgICByZXR1cm4gZXJyb3I7CisgICAgICAKKyAgICB7CisgICAgICBGVF9FeHRlbnNpb25fQ2xhc3MqICBjdXIgICA9IHJlZ2lzdHJ5LT5jbGFzc2VzOworICAgICAgRlRfRXh0ZW5zaW9uX0NsYXNzKiAgbGltaXQgPSBjdXIgKyByZWdpc3RyeS0+bnVtX2V4dGVuc2lvbnM7CisgICAgICAKKyAgICAgIGZvciAoIDsgY3VyIDwgbGltaXQ7IGN1cisrICkKKyAgICAgIHsKKyAgICAgICAgY2hhciogIGV4dCA9IChjaGFyKilmYWNlLT5leHRlbnNpb25zICsgY3VyLT5vZmZzZXQ7CisgICAgICAgIAorICAgICAgICBpZiAoY3VyLT5pbml0KQorICAgICAgICB7CisgICAgICAgICAgZXJyb3IgPSBjdXItPmluaXQoIGV4dCwgZmFjZSApOworICAgICAgICAgIGlmIChlcnJvcikgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGVycm9yOworICB9CisKKworLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvYmFzZS9mdGV4dGVuZC5oIGIvc3JjL2Jhc2UvZnRleHRlbmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDMzYTNiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2Jhc2UvZnRleHRlbmQuaApAQCAtMCwwICsxLDE2NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgZnRleHRlbmQuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuMAorICoKKyAqICAgIEV4dGVuc2lvbnMgSW50ZXJmYWNlLgorICoKKyAqICBDb3B5cmlnaHQgMTk5Ni0xOTk5IGJ5CisgKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQKKyAqICBtb2RpZmllZCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgRlRFWFRFTkRfSAorI2RlZmluZSBGVEVYVEVORF9ICisKKyNpbmNsdWRlICJmdGNvbmZpZy5oIgorI2luY2x1ZGUgImZ0b2Jqcy5oIgorCisKKyNpZmRlZiBfX2NwbHVzcGx1cworICBleHRlcm4gIkMiIHsKKyNlbmRpZgorCisgIC8qIFRoZSBleHRlbnNpb25zIGRvbid0IG5lZWQgdG8gYmUgaW50ZWdyYXRlZCBhdCBjb21waWxlIHRpbWUgaW50byAqLworICAvKiB0aGUgZW5naW5lLCBvbmx5IGF0IGxpbmsgdGltZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworCisgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICoKKyAgKiA8RnVuY1R5cGU+CisgICogICBGVF9FeHRlbnNpb25fSW5pdGlhbGl6ZXIKKyAgKgorICAqIDxEZXNjcmlwdGlvbj4KKyAgKiAgIEVhY2ggbmV3IGZhY2Ugb2JqZWN0IGNhbiBoYXZlIHNldmVyYWwgZXh0ZW5zaW9ucyBhc3NvY2lhdGVkCisgICogICB0byBpdCBhdCBjcmVhdGlvbiB0aW1lLiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gaW5pdGlhbGl6ZQorICAqICAgYSBnaXZlbiBleHRlbnNpb24gZGF0YSBmb3IgYSBnaXZlbiBmYWNlLgorICAqCisgICogPElucHV0PgorICAqICAgZXh0ICAgOjogYSB0eXBlbGVzcyBwb2ludGVyIHRvIHRoZSBleHRlbnNpb24gZGF0YS4KKyAgKiAgIGZhY2UgIDo6IGhhbmRsZSB0byB0aGUgc291cmNlIGZhY2Ugb2JqZWN0IHRoZSBleHRlbnNpb24gaXMKKyAgKiAgICAgICAgICAgIGFzc29jaWF0ZWQgd2l0aAorICAqCisgICogPFJldHVybj4KKyAgKiAgIEVycm9yIGNvbmRpdGlvbi4gMCBtZWFucyBzdWNjZXNzCisgICoKKyAgKiA8Tm90ZT4KKyAgKiAgIEluIGNhc2Ugb2YgZXJyb3IsIHRoZSBpbml0aWFsaXplciBzaG91bGQgbm90IGRlc3Ryb3kgdGhlCisgICogICBleHRlbnNpb24gZGF0YSwgYXMgdGhlIGZpbmFsaXplciB3aWxsIGdldCBjYWxsZWQgbGF0ZXIKKyAgKiAgIGJ5IHRoZSBmdW5jdGlvbidzIGNhbGxlci4uCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgdHlwZWRlZiBGVF9FcnJvciAoKkZUX0V4dGVuc2lvbl9Jbml0aWFsaXplcikoIHZvaWQqICAgIGV4dCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GYWNlICBmYWNlICk7CisKKyAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKgorICAqIDxGdW5jVHlwZT4KKyAgKiAgIEZUX0V4dGVuc2lvbl9GaW5hbGl6ZXIKKyAgKgorICAqIDxEZXNjcmlwdGlvbj4KKyAgKiAgIEVhY2ggbmV3IGZhY2Ugb2JqZWN0IGNhbiBoYXZlIHNldmVyYWwgZXh0ZW5zaW9ucyBhc3NvY2lhdGVkCisgICogICB0byBpdCBhdCBjcmVhdGlvbiB0aW1lLiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gZmluYWxpemUKKyAgKiAgIGEgZ2l2ZW4gZXh0ZW5zaW9uIGRhdGEgZm9yIGEgZ2l2ZW4gZmFjZS4gVGhpcyBvY2N1cnMgYmVmb3JlCisgICogICB0aGUgZmFjZSBvYmplY3QgaXRzZWxmIGlzIGZpbmFsaXplZC4KKyAgKgorICAqIDxJbnB1dD4KKyAgKiAgIGV4dCAgIDo6IGEgdHlwZWxlc3MgcG9pbnRlciB0byB0aGUgZXh0ZW5zaW9uIGRhdGEuCisgICogICBmYWNlICA6OiBoYW5kbGUgdG8gdGhlIHNvdXJjZSBmYWNlIG9iamVjdCB0aGUgZXh0ZW5zaW9uIGlzCisgICogICAgICAgICAgICBhc3NvY2lhdGVkIHdpdGgKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICB0eXBlZGVmIHZvaWQgICgqRlRfRXh0ZW5zaW9uX0ZpbmFsaXplcikoIHZvaWQqICBleHQsIEZUX0ZhY2UgIGZhY2UgKTsKKworCisgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICoKKyAgKiA8U3RydWN0PgorICAqICAgRlRfRXh0ZW5zaW9uX0NsYXNzCisgICoKKyAgKiA8RGVzY3JpcHRpb24+CisgICogICBBIHNpbXBsZSBzdHJ1Y3R1cmUgdXNlZCB0byBkZXNjcmliZSBhIGdpdmVuIGV4dGVuc2lvbiB0bworICAqICAgdGhlIEZyZWVUeXBlIGJhc2UgbGF5ZXIuIEFuIEZUX0V4dGVuc2lvbl9DbGFzcyBpcyB1c2VkIGFzCisgICogICBhIHBhcmFtZXRlciBmb3IgRlRfUmVnaXN0ZXJfRXh0ZW5zaW9uLgorICAqCisgICogPEZpZWxkcz4KKyAgKiAgIGlkICAgICAgICA6OiB0aGUgZXh0ZW5zaW9uJ3MgaWQuIFRoaXMgaXMgYSBub3JtYWwgQyBzdHJpbmcKKyAgKiAgICAgICAgICAgICAgICB0aGF0IGlzIHVzZWQgdG8gdW5pcXVlbHkgcmVmZXJlbmNlIHRoZSBleHRlbnNpb24ncworICAqICAgICAgICAgICAgICAgIGludGVyZmFjZS4KKyAgKgorICAqICAgc2l6ZSAgICAgIDo6IHRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSBleHRlbnNpb24gZGF0YSB0aGF0IG11c3QKKyAgKiAgICAgICAgICAgICAgICBiZSBhc3NvY2lhdGVkIHdpdGggZWFjaCBmYWNlIG9iamVjdC4KKyAgKgorICAqICAgaW5pdCAgICAgIDo6IGEgcG9pbnRlciB0byB0aGUgZXh0ZW5zaW9uIGRhdGEncyBpbml0aWFsaXplcgorICAqICAgZmluYWxpemUgIDo6IGEgcG9pbnRlciB0byB0aGUgZXh0ZW5zaW9uIGRhdGEncyBmaW5hbGl6ZXIKKyAgKgorICAqICAgaW50ZWZhY2UgIDo6IHRoaXMgcG9pbnRlciBjYW4gYmUgYW55dGhpbmcsIGJ1dCBzaG91bGQgdXN1YWxseQorICAqICAgICAgICAgICAgICAgIHBvaW50IHRvIGEgdGFibGUgb2YgZnVuY3Rpb24gcG9pbnRlcnMgd2hpY2ggaW1wbGVtZW50CisgICogICAgICAgICAgICAgICAgdGhlIGV4dGVuc2lvbidzIGludGVyZmFjZS4KKyAgKgorICAqICAgb2Zmc2V0ICAgIDo6IHRoaXMgZmllbGQgaXMgc2V0IGFuZCB1c2VkIHdpdGhpbiB0aGUgYmFzZSBsYXllcgorICAqICAgICAgICAgICAgICAgIGFuZCBzaG91bGQgYmUgc2V0IHRvIDAgd2hlbiByZWdpc3RlcmluZyBhbgorICAqICAgICAgICAgICAgICAgIGV4dGVuc2lvbiB0aHJvdWdoIEZUX1JlZ2lzdGVyX0V4dGVuc2lvbi4gSXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICBhbiBvZmZzZXQgd2l0aGluIHRoZSBmYWNlJ3MgZXh0ZW5zaW9uIGJsb2NrIGZvciB0aGUKKyAgKiAgICAgICAgICAgICAgICBjdXJyZW50IGV4dGVuc2lvbidzIGRhdGEuCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgdHlwZWRlZiBzdHJ1Y3QgRlRfRXh0ZW5zaW9uX0NsYXNzXworICB7CisgICAgY29uc3QgY2hhciogICAgICAgICAgICAgICBpZDsKKyAgICBGVF9VTG9uZyAgICAgICAgICAgICAgICAgIHNpemU7CisgICAgRlRfRXh0ZW5zaW9uX0luaXRpYWxpemVyICBpbml0OworICAgIEZUX0V4dGVuc2lvbl9GaW5hbGl6ZXIgICAgZmluYWxpemU7CisgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2U7CisgICAgCisgICAgRlRfVUxvbmcgICAgICAgICAgICAgICAgICBvZmZzZXQ7CisgICAgCisgIH0gRlRfRXh0ZW5zaW9uX0NsYXNzOworICAKKworICBFWFBPUlRfREVGCisgIEZUX0Vycm9yICBGVF9SZWdpc3Rlcl9FeHRlbnNpb24oIEZUX0RyaXZlciAgICAgICAgICAgIGRyaXZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRXh0ZW5zaW9uX0NsYXNzKiAgY2xhenogKTsKKworCisjaWZkZWYgRlRfQ09ORklHX09QVElPTl9FWFRFTkRfRU5HSU5FCisgIC8qIEluaXRpYWxpemUgdGhlIGV4dGVuc2lvbiBjb21wb25lbnQgKi8KKyAgTE9DQUxfREVGCisgIEZUX0Vycm9yICBGVF9Jbml0X0V4dGVuc2lvbnMoIEZUX0xpYnJhcnkgIGxpYnJhcnkgKTsKKworICAvKiBGaW5hbGl6ZSB0aGUgZXh0ZW5zaW9uIGNvbXBvbmVudCAqLworICBMT0NBTF9ERUYKKyAgRlRfRXJyb3IgIEZUX0RvbmVfRXh0ZW5zaW9ucyggRlRfTGlicmFyeSAgbGlicmFyeSApOworCisgIC8qIENyZWF0ZSBhbiBleHRlbnNpb24gd2l0aGluIGEgZmFjZSBvYmplY3QuICBDYWxsZWQgYnkgdGhlICovCisgIC8qIGZhY2Ugb2JqZWN0IGNvbnN0cnVjdG9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIExPQ0FMX0RFRgorICBGVF9FcnJvciAgRlRfQ3JlYXRlX0V4dGVuc2lvbnMoIEZUX0ZhY2UgIGZhY2UgKTsKKworICAvKiBEZXN0cm95IGFsbCBleHRlbnNpb25zIHdpdGhpbiBhIGZhY2Ugb2JqZWN0LiAgQ2FsbGVkIGJ5IHRoZSAqLworICAvKiBmYWNlIG9iamVjdCBkZXN0cnVjdG9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBMT0NBTF9ERUYKKyAgRlRfRXJyb3IgIEZUX0Rlc3Ryb3lfRXh0ZW5zaW9ucyggRlRfRmFjZSAgZmFjZSApOworI2VuZGlmCisKKyAgLyogUmV0dXJucyBhbiBleHRlbnNpb24ncyBkYXRhICYgaW50ZWZhY2UgYWNjb3JkaW5nIHRvIGl0cyBJRCAqLworICBFWFBPUlRfREVGCisgIHZvaWQqICAgICBGVF9HZXRfRXh0ZW5zaW9uKCBGVF9GYWNlICAgICAgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICBleHRlbnNpb25faWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAqZXh0ZW5zaW9uX2ludGVyZmFjZSApOworI2lmZGVmIF9fY3BsdXNwbHVzCisgIH0KKyNlbmRpZgorCisKKyNlbmRpZiAvKiBGVEVYVEVORF9IICovCisKKworLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvYmFzZS9mdGluaXQuYyBiL3NyYy9iYXNlL2Z0aW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhNzU0YWUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvYmFzZS9mdGluaXQuYwpAQCAtMCwwICsxLDE2OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgZnRpbml0LmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZyZWVUeXBlIGluaXRpYWxpc2F0aW9uIGxheWVyIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAxOTk2LTE5OTkgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCAgICAgICAgKi8KKy8qICBtb2RpZmllZCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgICovCisvKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLworLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KKy8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqCisgICogIFRoZSBwdXJwb3NlIG9mIHRoaXMgZmlsZSBpcyB0byBpbXBsZW1lbnQgdGhlIHRocmVlIGZvbGxvd2luZworICAqICBmdW5jdGlvbnM6CisgICoKKyAgKgkgRlRfRGVmYXVsdF9Ecml2ZXJzOgorICAqCQlUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gYWRkIHRoZSBzZXQgb2YgZGVmYXVsdCBkcml2ZXJzCisgICoJCXRvIGEgZnJlc2ggbmV3IGxpYnJhcnkgb2JqZWN0LiBUaGUgc2V0IGlzIGNvbXB1dGVkIGF0IGNvbXBpbGUKKyAgKgkJdGltZSBmcm9tIHRoZSBNYWtlZmlsZXMgaW5jbHVzaW9ucyBpbiBNYWtlZmlsZS5saWIuIFNlZSB0aGUKKyAgKgkJZG9jdW1lbnQgIkZyZWVUeXBlIEludGVybmFscyIgZm9yIG1vcmUgaW5mby4KKyAgKgorICAqCisgICoJIEZUX0luaXRfRnJlZVR5cGU6CisgICoJCVRoaXMgZnVuY3Rpb24gY3JlYXRlcyBhIHN5c3RlbSBvYmplY3QgZm9yIHRoZSBjdXJyZW50IHBsYXRmb3JtLAorICAqCQlidWlsZHMgYSBsaWJyYXJ5IG91dCBvZiBpdCwgdGhlbiBjYWxscyBGVF9EZWZhdWx0X0RyaXZlcnMKKyAgKgorICAqCisgICoJIEZUX0RvbmVfRnJlZVR5cGU6CisgICoJCVRoaXMgZnVuY3Rpb24gc2ltcGx5IGZpbmFsaXNlIHRoZSBsaWJyYXJ5IGFuZCB0aGUgY29ycmVzcG9uZGluZworICAqCQlzeXN0ZW0gb2JqZWN0LgorICAqCisgICoKKyAgKgkgTm90ZSB0aGF0IGV2ZW4gaWYgRlRfSW5pdF9GcmVlVHlwZSB1c2VzIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUKKyAgKgkgc3lzdGVtIG9iamVjdCBkZWZpbmVkIGF0IGJ1aWxkIHRpbWUsIGNsaWVudCBhcHBsaWNhdGlvbnMgYXJlIHN0aWxsCisgICoJIGFibGUgdG8gcHJvdmlkZSB0aGVpciBvd24gImZ0c3lzdGVtLmMiCisgICoKKyAgKgorICAqCisgICoKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxmdG9ianMuaD4KKyNpbmNsdWRlIDxmdGRyaXZlci5oPgorI2luY2x1ZGUgPGZ0Y29uZmlnLmg+CisjaW5jbHVkZSA8ZnRkZWJ1Zy5oPgorCisjdW5kZWYgIEZUX0NPTVBPTkVOVAorI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX2luaXQKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFRoZSBtYWNyb3MgRlRfU1VQUE9SVF94eHh4IGFyZSBkZWZpbmVkIGJ5IE1ha2VmaWxlLmxpYiB3aGVuIHRoaXMgZmlsZSAqLworICAvKiBpcyBjb21waWxlZC4gIFRoZXkgY29tZSBmcm9tIGEgbWFrZSB2YXJpYWJsZSBjYWxsZWQgRlRJTklUX01BQ1JPUyAgICAgKi8KKyAgLyogd2hpY2ggaXMgdXBkYXRlZCBieSBlYWNoIGRyaXZlciBNYWtlZmlsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBUaGlzIG1lYW5zIHRoYXQgd2hlbiBhIGRyaXZlciBpc24ndCBwYXJ0IG9mIHRoZSBidWlsZCwgZnRpbml0Lm8gICAgICAgKi8KKyAgLyogd29uJ3QgdHJ5IHRvIHJlZmVyZW5jZSBpdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSAgRlRJTklUX0RSSVZFUl9DSEFJTgorI2RlZmluZSAgRlRfSU5JVF9MQVNUX0RSSVZFUl9DSEFJTiAgICAoKEZUX0RyaXZlckNoYWluKikgMCkKKworICAvKiBJbmNsdWRlIHRoZSBTRk5UIGRyaXZlciBpbnRlcmZhY2UgaWYgbmVlZGVkICovCisKKyNpZmRlZiBGVF9TVVBQT1JUX1NGTlQKKyNpbmNsdWRlICJzZmRyaXZlci5oIgorI2VuZGlmCisKKyAgLyogSW5jbHVkZSB0aGUgVHJ1ZVR5cGUgZHJpdmVyIGludGVyZmFjZSBpZiBuZWVkZWQgKi8KKworI2lmZGVmIEZUX1NVUFBPUlRfVFJVRVRZUEUKKyNpbmNsdWRlICJ0dGRyaXZlci5oIgorI2VuZGlmCisKKworICAvKiBJbmNsdWRlIHRoZSBUeXBlMSBkcml2ZXIgaW50ZXJmYWNlIGlmIG5lZWRlZCAqLworCisjaWZkZWYgRlRfU1VQUE9SVF9UWVBFMQorI2luY2x1ZGUgInQxZHJpdmVyLmgiCisjZW5kaWYKKworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfRGVmYXVsdF9Ecml2ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQWRkcyB0aGUgc2V0IG9mIGRlZmF1bHQgZHJpdmVycyB0byBhIGdpdmVuIGxpYnJhcnkgb2JqZWN0LiAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbGlicmFyeSA6OiBBIGhhbmRsZSB0byBhIG5ldyBsaWJyYXJ5IG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBFWFBPUlRfRlVOQworICB2b2lkICBGVF9EZWZhdWx0X0RyaXZlcnMoIEZUX0xpYnJhcnkgIGxpYnJhcnkgKQorICB7CisgICAgRlRfRXJyb3IgICAgICAgICAgICAgICBlcnJvcjsKKyAgICBjb25zdCBGVF9Ecml2ZXJDaGFpbiogIGNoYWluID0gRlRfSU5JVF9MQVNUX0RSSVZFUl9DSEFJTjsKKworICAgIHdoaWxlIChjaGFpbikKKyAgICB7CisgICAgICBlcnJvciA9IEZUX0FkZF9Ecml2ZXIoIGxpYnJhcnksIGNoYWluLT5pbnRlcmZhY2UgKTsKKworICAgICAgLyogbm90aWZ5IGVycm9ycywgYnV0IGRvbid0IHN0b3AgKi8KKyAgICAgIGlmIChlcnJvcikKKyAgICAgIHsKKyAgICAgICAgRlRfRVJST1IoKCAiRlQuRGVmYXVsdF9Ecml2ZXJzOiBjYW5ub3QgaW5zdGFsbCBgJXMnLCBlcnJvciA9ICV4XG4iLAorICAgICAgICAgICAgICAgICAgIGNoYWluLT5pbnRlcmZhY2UtPmRyaXZlcl9uYW1lLAorICAgICAgICAgICAgICAgICAgIGVycm9yICkpOworICAgICAgfQorCisgICAgICBjaGFpbiA9IGNoYWluLT5uZXh0OworICAgICAgZXJyb3IgPSAwOyAgLyogY2xlYXIgZXJyb3IgKi8KKyAgICB9CisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0luaXRfRnJlZVR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEluaXRpYWxpemVzIGEgbmV3IEZyZWVUeXBlIGxpYnJhcnkgb2JqZWN0LiAgVGhlIHNldCBvZiBkcml2ZXJzICAgICAqLworICAvKiAgICB0aGF0IGFyZSByZWdpc3RlcmVkIGJ5IHRoaXMgZnVuY3Rpb24gaXMgZGV0ZXJtaW5lZCBhdCBidWlsZCB0aW1lLiAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBsaWJyYXJ5IDo6IEEgaGFuZGxlIHRvIGEgbmV3IGxpYnJhcnkgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBFcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEVYUE9SVF9GVU5DCisgIEZUX0Vycm9yICBGVF9Jbml0X0ZyZWVUeXBlKCBGVF9MaWJyYXJ5KiAgbGlicmFyeSApCisgIHsKKyAgICBGVF9FcnJvciAgIGVycm9yOworICAgIEZUX01lbW9yeSAgbWVtb3J5OworCisgICAgLyogRmlyc3Qgb2YgYWxsLCBhbGxvY2F0ZSBhIG5ldyBzeXN0ZW0gb2JqZWN0IC10aGlzIGZ1bmN0aW9uIGlzIHBhcnQgKi8KKyAgICAvKiBvZiB0aGUgc3lzdGVtLXNwZWNpZmljIGNvbXBvbmVudCwgaS5lLiBmdHN5c3RlbS5jICAgICAgICAgICAgICAgICAqLworICAgIG1lbW9yeSA9IEZUX05ld19NZW1vcnkoKTsKKyAgICBpZiAoIW1lbW9yeSkKKyAgICB7CisgICAgICBGVF9FUlJPUigoICJGVF9Jbml0X0ZyZWVUeXBlOiIgKSk7CisgICAgICBGVF9FUlJPUigoICIgY2Fubm90IGZpbmQgbWVtb3J5IG1hbmFnZXIiICkpOworICAgICAgcmV0dXJuIEZUX0Vycl9VbmltcGxlbWVudGVkX0ZlYXR1cmU7CisgICAgfQorICAgIAorICAgIC8qIGJ1aWxkcyBhIGxpYnJhcnkgb3V0IG9mIGl0LCB0aGVuIGZpbGwgaXQgd2l0aCB0aGUgc2V0IG9mICovCisgICAgLyogZGVmYXVsdCBkcml2ZXJzLi4JCQkJCQkJCQkJKi8KKyAgICBlcnJvciA9IEZUX05ld19MaWJyYXJ5KCBtZW1vcnksIGxpYnJhcnkgKTsKKyAgICBpZiAoICFlcnJvciApCisgICAgICBGVF9EZWZhdWx0X0RyaXZlcnMoKmxpYnJhcnkpOworICAgIAorICAgIHJldHVybiBlcnJvcjsKKyAgfQorCisKKy8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2Jhc2UvZnRsaXN0LmMgYi9zcmMvYmFzZS9mdGxpc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDIyNDFmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2Jhc2UvZnRsaXN0LmMKQEAgLTAsMCArMSwzMDAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGZ0bGlzdC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBHZW5lcmljIGxpc3Qgc3VwcG9ydCBmb3IgRnJlZVR5cGUgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMTk5Ni0xOTk5IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQgICAgICAgICovCisvKiAgbW9kaWZpZWQgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICAqLworLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KKy8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCisvKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICBUaGlzIGZpbGUgaW1wbGVtZW50cyBmdW5jdGlvbnMgcmVsYXRpdmUgdG8gbGlzdCBwcm9jZXNzaW5nLiAgSXRzICAgICAqLworICAvKiAgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBkZWZpbmVkIGluIGZyZWV0eXBlLmguICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNpbmNsdWRlIDxmdGxpc3QuaD4KKyNpbmNsdWRlIDxmdGRlYnVnLmg+CisjaW5jbHVkZSA8ZnRvYmpzLmg+CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9MaXN0X0ZpbmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGaW5kcyB0aGUgbGlzdCBub2RlIGZvciBhIGdpdmVuIGxpc3RlZCBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBsaXN0IDo6IEEgcG9pbnRlciB0byB0aGUgcGFyZW50IGxpc3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZGF0YSA6OiBUaGUgYWRkcmVzcyBvZiB0aGUgbGlzdGVkIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgTGlzdCBub2RlLiAgTlVMTCBpZiBpdCB3YXNuJ3QgZm91bmQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBCQVNFX0ZVTkMKKyAgRlRfTGlzdE5vZGUgIEZUX0xpc3RfRmluZCggRlRfTGlzdCAgbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgZGF0YSApCisgIHsKKyAgICBGVF9MaXN0Tm9kZSAgY3VyOworCisKKyAgICBjdXIgPSBsaXN0LT5oZWFkOworICAgIHdoaWxlICggY3VyICkKKyAgICB7CisgICAgICBpZiAoY3VyLT5kYXRhID09IGRhdGEpCisgICAgICAgIHJldHVybiBjdXI7CisKKyAgICAgIGN1ciA9IGN1ci0+bmV4dDsKKyAgICB9CisKKyAgICByZXR1cm4gKEZUX0xpc3ROb2RlKTA7CisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0xpc3RfQWRkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEFwcGVuZHMgYW4gZWxlbWVudCBhdCB0aGUgZW5kIG9mIGEgbGlzdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGxpc3QgOjogQSBwb2ludGVyIHRvIHRoZSBwYXJlbnQgbGlzdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBub2RlIDo6IFRoZSBub2RlIHRvIGFwcGVuZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEJBU0VfRlVOQworICB2b2lkICBGVF9MaXN0X0FkZCggRlRfTGlzdCAgICAgIGxpc3QsCisgICAgICAgICAgICAgICAgICAgICBGVF9MaXN0Tm9kZSAgbm9kZSApCisgIHsKKyAgICBGVF9MaXN0Tm9kZSAgYmVmb3JlID0gbGlzdC0+dGFpbDsKKworCisgICAgbm9kZS0+bmV4dCA9IDA7CisgICAgbm9kZS0+cHJldiA9IGJlZm9yZTsKKworICAgIGlmICggYmVmb3JlICkKKyAgICAgIGJlZm9yZS0+bmV4dCA9IG5vZGU7CisgICAgZWxzZQorICAgICAgbGlzdC0+aGVhZCA9IG5vZGU7CisKKyAgICBsaXN0LT50YWlsID0gbm9kZTsKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfTGlzdF9JbnNlcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgSW5zZXJ0cyBhbiBlbGVtZW50IGF0IHRoZSBoZWFkIG9mIGEgbGlzdC4gICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbGlzdCA6OiBBIHBvaW50ZXIgdG8gcGFyZW50IGxpc3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG5vZGUgOjogVGhlIG5vZGUgdG8gaW5zZXJ0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgQkFTRV9GVU5DCisgIHZvaWQgIEZUX0xpc3RfSW5zZXJ0KCBGVF9MaXN0ICAgICAgbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xpc3ROb2RlICBub2RlICkKKyAgeworICAgIEZUX0xpc3ROb2RlICBhZnRlciA9IGxpc3QtPmhlYWQ7CisKKworICAgIG5vZGUtPm5leHQgPSBhZnRlcjsKKyAgICBub2RlLT5wcmV2ID0gMDsKKworICAgIGlmICggIWFmdGVyICkKKyAgICAgIGxpc3QtPnRhaWwgPSBub2RlOworICAgIGVsc2UKKyAgICAgIGFmdGVyLT5wcmV2ID0gbm9kZTsKKworICAgIGxpc3QtPmhlYWQgPSBub2RlOworICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9MaXN0X1JlbW92ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBSZW1vdmVzIGEgbm9kZSBmcm9tIGEgbGlzdC4gIFRoaXMgZnVuY3Rpb24gZG9lc24ndCBjaGVjayB3aGV0aGVyICAgKi8KKyAgLyogICAgdGhlIG5vZGUgaXMgaW4gdGhlIGxpc3QhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbm9kZSA6OiBUaGUgbm9kZSB0byByZW1vdmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbGlzdCA6OiBBIHBvaW50ZXIgdG8gdGhlIHBhcmVudCBsaXN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBCQVNFX0ZVTkMKKyAgdm9pZCAgRlRfTGlzdF9SZW1vdmUoIEZUX0xpc3QgICAgICBsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgRlRfTGlzdE5vZGUgIG5vZGUgKQorICB7CisgICAgRlRfTGlzdE5vZGUgIGJlZm9yZSwgYWZ0ZXI7CisKKworICAgIGJlZm9yZSA9IG5vZGUtPnByZXY7CisgICAgYWZ0ZXIgID0gbm9kZS0+bmV4dDsKKworICAgIGlmICggYmVmb3JlICkKKyAgICAgIGJlZm9yZS0+bmV4dCA9IGFmdGVyOworICAgIGVsc2UKKyAgICAgIGxpc3QtPmhlYWQgPSBhZnRlcjsKKworICAgIGlmICggYWZ0ZXIgKQorICAgICAgYWZ0ZXItPnByZXYgPSBiZWZvcmU7CisgICAgZWxzZQorICAgICAgbGlzdC0+dGFpbCA9IGJlZm9yZTsKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfTGlzdF9VcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgTW92ZXMgYSBub2RlIHRvIHRoZSBoZWFkL3RvcCBvZiBhIGxpc3QuICBVc2VkIHRvIG1haW50YWluIExSVSAgICAgICovCisgIC8qICAgIGxpc3RzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGxpc3QgOjogQSBwb2ludGVyIHRvIHRoZSBwYXJlbnQgbGlzdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBub2RlIDo6IFRoZSBub2RlIHRvIG1vdmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEJBU0VfRlVOQworICB2b2lkICBGVF9MaXN0X1VwKCBGVF9MaXN0ICAgICAgbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgRlRfTGlzdE5vZGUgIG5vZGUgKQorICB7CisgICAgRlRfTGlzdE5vZGUgIGJlZm9yZSwgYWZ0ZXI7CisKKworICAgIGJlZm9yZSA9IG5vZGUtPnByZXY7CisgICAgYWZ0ZXIgID0gbm9kZS0+bmV4dDsKKworICAgIC8qIGNoZWNrIHdldGhlciB3ZSdyZSBhbHJlYWR5IG9uIHRvcCBvZiB0aGUgbGlzdCAqLworICAgIGlmICggIWJlZm9yZSApCisgICAgICByZXR1cm47CisKKyAgICBiZWZvcmUtPm5leHQgPSBhZnRlcjsKKworICAgIGlmICggYWZ0ZXIgKQorICAgICAgYWZ0ZXItPnByZXYgPSBiZWZvcmU7CisgICAgZWxzZQorICAgICAgbGlzdC0+dGFpbCA9IGJlZm9yZTsKKworICAgIG5vZGUtPnByZXYgICAgICAgPSAwOworICAgIG5vZGUtPm5leHQgICAgICAgPSBsaXN0LT5oZWFkOworICAgIGxpc3QtPmhlYWQtPnByZXYgPSBub2RlOworICAgIGxpc3QtPmhlYWQgICAgICAgPSBub2RlOworICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9MaXN0X0l0ZXJhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBQYXJzZXMgYSBsaXN0IGFuZCBjYWxscyBhIGdpdmVuIGl0ZXJhdG9yIGZ1bmN0aW9uIG9uIGVhY2ggZWxlbWVudC4gKi8KKyAgLyogICAgTm90ZSB0aGF0IHBhcnNpbmcgaXMgc3RvcHBlZCBhcyBzb29uIGFzIG9uZSBvZiB0aGUgaXRlcmF0b3IgY2FsbHMgICovCisgIC8qICAgIHJldHVybnMgYSBub24temVybyB2YWx1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGxpc3QgICAgIDo6IEEgaGFuZGxlIHRvIHRoZSBsaXN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBpdGVyYXRvciA6OiBBbiBpbnRlcmF0b3IgZnVuY3Rpb24sIGNhbGxlZCBvbiBlYWNoIG5vZGUgb2YgdGhlICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgbGlzdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHVzZXIgICAgIDo6IEEgdXNlci1zdXBwbGllZCBmaWVsZCB3aGljaCBpcyBwYXNzZWQgYXMgdGhlIHNlY29uZCAgICAqLworICAvKiAgICAgICAgICAgICAgICBhcmd1bWVudCB0byB0aGUgaXRlcmF0b3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGUgcmVzdWx0IG9mIHRoZSBsYXN0IGl0ZXJhdG9yIGNhbGwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEJBU0VfRlVOQworICBGVF9FcnJvciAgRlRfTGlzdF9JdGVyYXRlKCBGVF9MaXN0ICAgICAgICAgICAgbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTGlzdF9JdGVyYXRvciAgIGl0ZXJhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgICAgICAgdXNlciApCisgIHsKKyAgICBGVF9MaXN0Tm9kZSAgY3VyICAgPSBsaXN0LT5oZWFkOworICAgIEZUX0Vycm9yICAgICBlcnJvciA9IEZUX0Vycl9PazsKKworCisgICAgd2hpbGUgKCBjdXIgKQorICAgIHsKKyAgICAgIEZUX0xpc3ROb2RlICBuZXh0ID0gY3VyLT5uZXh0OworCisKKyAgICAgIGVycm9yID0gaXRlcmF0b3IoIGN1ciwgdXNlciApOworICAgICAgaWYgKCBlcnJvciApCisgICAgICAgIGJyZWFrOworCisgICAgICBjdXIgPSBuZXh0OworICAgIH0KKworICAgIHJldHVybiBlcnJvcjsKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfTGlzdF9GaW5hbGl6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRGVzdHJveXMgYWxsIGVsZW1lbnRzIGluIHRoZSBsaXN0IGFzIHdlbGwgYXMgdGhlIGxpc3QgaXRzZWxmLiAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbGlzdCAgICA6OiBBIGhhbmRsZSB0byB0aGUgbGlzdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBkZXN0cm95IDo6IEEgbGlzdCBkZXN0cnVjdG9yIHRoYXQgd2lsbCBiZSBhcHBsaWVkIHRvIGVhY2ggZWxlbWVudCAgKi8KKyAgLyogICAgICAgICAgICAgICBvZiB0aGUgbGlzdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBtZW1vcnkgIDo6IFRoZSBjdXJyZW50IG1lbW9yeSBvYmplY3Qgd2hlcmUgZGVzdHJ1Y3Rpb25zIHRha2UgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICBwbGFjZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB1c2VyICAgIDo6IEEgdXNlci1zdXBwbGllZCBmaWVsZCB3aGljaCBpcyBwYXNzZWQgYXMgdGhlIGxhc3QgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICBhcmd1bWVudCB0byB0aGUgZGVzdHJ1Y3Rvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBCQVNFX0ZVTkMKKyAgdm9pZCAgRlRfTGlzdF9GaW5hbGl6ZSggRlRfTGlzdCAgICAgICAgICAgIGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xpc3RfRGVzdHJ1Y3RvciBkZXN0cm95LAorICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9NZW1vcnkgICAgICAgICAgbWVtb3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgICAgICAgdXNlciApCisgIHsKKyAgICBGVF9MaXN0Tm9kZSAgY3VyOworCisKKyAgICBjdXIgPSBsaXN0LT5oZWFkOworICAgIHdoaWxlICggY3VyICkKKyAgICB7CisgICAgICBGVF9MaXN0Tm9kZSAgbmV4dCA9IGN1ci0+bmV4dDsKKyAgICAgIHZvaWQqICAgICAgICBkYXRhID0gY3VyLT5kYXRhOworCisKKyAgICAgIGlmICggZGVzdHJveSApCisgICAgICAgIGRlc3Ryb3koIG1lbW9yeSwgZGF0YSwgdXNlciApOworCisgICAgICBGUkVFKCBjdXIgKTsKKyAgICAgIGN1ciA9IG5leHQ7CisgICAgfQorCisgICAgbGlzdC0+aGVhZCA9IDA7CisgICAgbGlzdC0+dGFpbCA9IDA7CisgIH0KKworCisvKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9iYXNlL2Z0bGlzdC5oIGIvc3JjL2Jhc2UvZnRsaXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjMxOTMyNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9iYXNlL2Z0bGlzdC5oCkBAIC0wLDAgKzEsMjI4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBmdGxpc3QuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgR2VuZXJpYyBsaXN0IHN1cHBvcnQgZm9yIEZyZWVUeXBlIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDE5OTYtMTk5OSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkICAgICAgICAqLworLyogIG1vZGlmaWVkIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAgKi8KKy8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCisvKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLworLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgVGhpcyBmaWxlIGltcGxlbWVudHMgZnVuY3Rpb25zIHJlbGF0aXZlIHRvIGxpc3QgcHJvY2Vzc2luZy4gIEl0cyAgICAgKi8KKyAgLyogIGRhdGEgc3RydWN0dXJlcyBhcmUgZGVmaW5lZCBpbiBmcmVldHlwZS5oLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjaWZuZGVmIEZUTElTVF9ICisjZGVmaW5lIEZUTElTVF9ICisKKyNpbmNsdWRlIDxmcmVldHlwZS5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKKyAgZXh0ZXJuICJDIiB7CisjZW5kaWYKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0xpc3RfRmluZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZpbmRzIHRoZSBsaXN0IG5vZGUgZm9yIGEgZ2l2ZW4gbGlzdGVkIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGxpc3QgOjogQSBwb2ludGVyIHRvIHRoZSBwYXJlbnQgbGlzdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBkYXRhIDo6IFRoZSBhZGRyZXNzIG9mIHRoZSBsaXN0ZWQgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBMaXN0IG5vZGUuICBOVUxMIGlmIGl0IHdhc24ndCBmb3VuZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEVYUE9SVF9ERUYKKyAgRlRfTGlzdE5vZGUgIEZUX0xpc3RfRmluZCggRlRfTGlzdCAgbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgZGF0YSApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfTGlzdF9BZGQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQXBwZW5kcyBhbiBlbGVtZW50IGF0IHRoZSBlbmQgb2YgYSBsaXN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbGlzdCA6OiBBIHBvaW50ZXIgdG8gdGhlIHBhcmVudCBsaXN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG5vZGUgOjogVGhlIG5vZGUgdG8gYXBwZW5kLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgRVhQT1JUX0RFRgorICB2b2lkICBGVF9MaXN0X0FkZCggRlRfTGlzdCAgICAgIGxpc3QsCisgICAgICAgICAgICAgICAgICAgICBGVF9MaXN0Tm9kZSAgbm9kZSApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfTGlzdF9JbnNlcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgSW5zZXJ0cyBhbiBlbGVtZW50IGF0IHRoZSBoZWFkIG9mIGEgbGlzdC4gICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbGlzdCA6OiBBIHBvaW50ZXIgdG8gcGFyZW50IGxpc3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG5vZGUgOjogVGhlIG5vZGUgdG8gaW5zZXJ0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgRVhQT1JUX0RFRgorICB2b2lkICBGVF9MaXN0X0luc2VydCggRlRfTGlzdCAgICAgIGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBGVF9MaXN0Tm9kZSAgbm9kZSApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfTGlzdF9SZW1vdmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgUmVtb3ZlcyBhIG5vZGUgZnJvbSBhIGxpc3QuICBUaGlzIGZ1bmN0aW9uIGRvZXNuJ3QgY2hlY2sgd2hldGhlciAgICovCisgIC8qICAgIHRoZSBub2RlIGlzIGluIHRoZSBsaXN0ISAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG5vZGUgOjogVGhlIG5vZGUgdG8gcmVtb3ZlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGxpc3QgOjogQSBwb2ludGVyIHRvIHRoZSBwYXJlbnQgbGlzdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgRVhQT1JUX0RFRgorICB2b2lkICBGVF9MaXN0X1JlbW92ZSggRlRfTGlzdCAgICAgIGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBGVF9MaXN0Tm9kZSAgbm9kZSApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfTGlzdF9VcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgTW92ZXMgYSBub2RlIHRvIHRoZSBoZWFkL3RvcCBvZiBhIGxpc3QuICBVc2VkIHRvIG1haW50YWluIExSVSAgICAgICovCisgIC8qICAgIGxpc3RzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGxpc3QgOjogQSBwb2ludGVyIHRvIHRoZSBwYXJlbnQgbGlzdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBub2RlIDo6IFRoZSBub2RlIHRvIG1vdmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEVYUE9SVF9ERUYKKyAgdm9pZCAgRlRfTGlzdF9VcCggRlRfTGlzdCAgICAgIGxpc3QsCisgICAgICAgICAgICAgICAgICAgIEZUX0xpc3ROb2RlICBub2RlICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9MaXN0X0l0ZXJhdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBbiBGVF9MaXN0IGl0ZXJhdG9yIGZ1bmN0aW9uIHdoaWNoIGlzIGNhbGxlZCBkdXJpbmcgYSBsaXN0IHBhcnNlICAgKi8KKyAgLyogICAgYnkgRlRfTGlzdF9JdGVyYXRlKCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbm9kZSA6OiBUaGUgY3VycmVudCBpdGVyYXRpb24gbGlzdCBub2RlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHVzZXIgOjogQSB0eXBlbGVzcyBwb2ludGVyIHBhc3NlZCB0byBGVF9MaXN0X0l0ZXJhdGUoKS4gICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgIENhbiBiZSB1c2VkIHRvIHBvaW50IHRvIHRoZSBpdGVyYXRpb24ncyBzdGF0ZS4gICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgRlRfRXJyb3IgICgqRlRfTGlzdF9JdGVyYXRvcikoIEZUX0xpc3ROb2RlICBub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgdXNlciApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfTGlzdF9JdGVyYXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgUGFyc2VzIGEgbGlzdCBhbmQgY2FsbHMgYSBnaXZlbiBpdGVyYXRvciBmdW5jdGlvbiBvbiBlYWNoIGVsZW1lbnQuICovCisgIC8qICAgIE5vdGUgdGhhdCBwYXJzaW5nIGlzIHN0b3BwZWQgYXMgc29vbiBhcyBvbmUgb2YgdGhlIGl0ZXJhdG9yIGNhbGxzICAqLworICAvKiAgICByZXR1cm5zIGEgbm9uLXplcm8gdmFsdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBsaXN0ICAgICA6OiBBIGhhbmRsZSB0byB0aGUgbGlzdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgaXRlcmF0b3IgOjogQW4gaW50ZXJhdG9yIGZ1bmN0aW9uLCBjYWxsZWQgb24gZWFjaCBub2RlIG9mIHRoZSAgICAgICovCisgIC8qICAgICAgICAgICAgICAgIGxpc3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB1c2VyICAgICA6OiBBIHVzZXItc3VwcGxpZWQgZmllbGQgd2hpY2ggaXMgcGFzc2VkIGFzIHRoZSBzZWNvbmQgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgYXJndW1lbnQgdG8gdGhlIGl0ZXJhdG9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhlIHJlc3VsdCBvZiB0aGUgbGFzdCBpdGVyYXRvciBjYWxsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBFWFBPUlRfREVGCisgIEZUX0Vycm9yICBGVF9MaXN0X0l0ZXJhdGUoIEZUX0xpc3QgICAgICAgICAgIGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xpc3RfSXRlcmF0b3IgIGl0ZXJhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgICAgICB1c2VyICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9MaXN0X0Rlc3RydWN0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBbiBGVF9MaXN0IGl0ZXJhdG9yIGZ1bmN0aW9uIHdoaWNoIGlzIGNhbGxlZCBkdXJpbmcgYSBsaXN0ICAgICAgICAgKi8KKyAgLyogICAgZmluYWxpc2F0aW9uIGJ5IEZUX0xpc3RfRmluYWxpemUoKSB0byBkZXN0cm95IGFsbCBlbGVtZW50cyBpbiBhICAgICovCisgIC8qICAgIGdpdmVuIGxpc3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHN5c3RlbSA6OiBUaGUgY3VycmVudCBzeXN0ZW0gb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBkYXRhICAgOjogVGhlIGN1cnJlbnQgb2JqZWN0IHRvIGRlc3Ryb3kuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgdXNlciAgIDo6IEEgdHlwZWxlc3MgcG9pbnRlciBwYXNzZWQgdG8gRlRfTGlzdF9JdGVyYXRlKCkuICBJdCBjYW4gICovCisgIC8qICAgICAgICAgICAgICB1c2VkIHRvIHBvaW50IHRvIHRoZSBpdGVyYXRpb24ncyBzdGF0ZS4gICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiB2b2lkICAoKkZUX0xpc3RfRGVzdHJ1Y3RvcikoIEZUX01lbW9yeSAgbWVtb3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICB1c2VyICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9MaXN0X0ZpbmFsaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBEZXN0cm95cyBhbGwgZWxlbWVudHMgaW4gdGhlIGxpc3QgYXMgd2VsbCBhcyB0aGUgbGlzdCBpdHNlbGYuICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBsaXN0ICAgIDo6IEEgaGFuZGxlIHRvIHRoZSBsaXN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGRlc3Ryb3kgOjogQSBsaXN0IGRlc3RydWN0b3IgdGhhdCB3aWxsIGJlIGFwcGxpZWQgdG8gZWFjaCBlbGVtZW50ICAqLworICAvKiAgICAgICAgICAgICAgIG9mIHRoZSBsaXN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHN5c3RlbSAgOjogVGhlIGN1cnJlbnQgc3lzdGVtIG9iamVjdCB3aGVyZSBkZXN0cnVjdGlvbnMgdGFrZSAgICAgICAqLworICAvKiAgICAgICAgICAgICAgIHBsYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHVzZXIgICAgOjogQSB1c2VyLXN1cHBsaWVkIGZpZWxkIHdoaWNoIGlzIHBhc3NlZCBhcyB0aGUgbGFzdCAgICAgICAqLworICAvKiAgICAgICAgICAgICAgIGFyZ3VtZW50IHRvIHRoZSBkZXN0cnVjdG9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEVYUE9SVF9ERUYKKyAgdm9pZCAgRlRfTGlzdF9GaW5hbGl6ZSggRlRfTGlzdCAgICAgICAgICAgICBsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9MaXN0X0Rlc3RydWN0b3IgIGRlc3Ryb3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX01lbW9yeSAgICAgICAgICAgbWVtb3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgICAgICAgIHVzZXIgKTsKKworCisjaWZkZWYgX19jcGx1c3BsdXMKKyAgfQorI2VuZGlmCisKKyNlbmRpZiAvKiBGVExJU1RfSCAqLworCisKKy8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2Jhc2UvZnRvYmpzLmMgYi9zcmMvYmFzZS9mdG9ianMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZThlOTMzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2Jhc2UvZnRvYmpzLmMKQEAgLTAsMCArMSwyMTIzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBmdG9ianMuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoZSBGcmVlVHlwZSBwcml2YXRlIGJhc2UgY2xhc3NlcyAoYmFzZSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDE5OTYtMTk5OSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZyAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkICAgICAgICAqLworLyogIG1vZGlmaWVkIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAgKi8KKy8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCisvKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLworLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8ZnRvYmpzLmg+CisjaW5jbHVkZSA8ZnRsaXN0Lmg+CisjaW5jbHVkZSA8ZnRkZWJ1Zy5oPgorI2luY2x1ZGUgPGZ0c3RyZWFtLmg+CisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCisgIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLworICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgIE0gRSBNIE8gUiBZICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KKyAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCisgIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdCAgICAgICovCisgIC8qIHBhcmFtZXRlciBvZiB0aGUgUFRSQUNFKCkgYW5kIFBFUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cgICAgICAqLworICAvKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjdW5kZWYgIEZUX0NPTVBPTkVOVAorI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX21lbW9yeQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfQWxsb2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQWxsb2NhdGVzIGEgbmV3IGJsb2NrIG9mIG1lbW9yeS4gIFRoZSByZXR1cm5lZCBhcmVhIGlzIGFsd2F5cyAgICAgICovCisgIC8qICAgIHplcm8tZmlsbGVkLCB0aGlzIGlzIGEgc3Ryb25nIGNvbnZlbnRpb24gaW4gbWFueSBGcmVlVHlwZSBwYXJ0cy4gICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG1lbW9yeSA6OiBBIGhhbmRsZSB0byBhIGdpdmVuIGBtZW1vcnkgb2JqZWN0JyB3aGVyZSBhbGxvY2F0aW9uICAgICAqLworICAvKiAgICAgICAgICAgICAgb2NjdXJzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHNpemUgICA6OiBUaGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgYmxvY2sgdG8gYWxsb2NhdGUuICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFAgICAgICA6OiBBIHBvaW50ZXIgdG8gdGhlIGZyZXNoIG5ldyBibG9jay4gIEl0IHNob3VsZCBiZSBzZXQgdG8gICAqLworICAvKiAgICAgICAgICAgICAgTlVMTCBpZiBgc2l6ZScgaXMgMCwgb3IgaW4gY2FzZSBvZiBlcnJvci4gICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEJBU0VfRlVOQworICBGVF9FcnJvciAgRlRfQWxsb2MoIEZUX01lbW9yeSAgbWVtb3J5LAorICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICB2b2lkKiogICAgIFAgKQorICB7CisgICAgRlRfQXNzZXJ0KCBQICE9IDAgKTsKKworICAgIGlmIChzaXplID4gMCkKKyAgICB7CisgICAgICAqUCA9IG1lbW9yeS0+YWxsb2MoIG1lbW9yeSwgc2l6ZSApOworICAgICAgaWYgKCEqUCkKKyAgICAgIHsKKyAgICAgICAgRlRfRVJST1IoKCAiRlQuQWxsb2M6IiApKTsKKyAgICAgICAgRlRfRVJST1IoKCAiIG91dCBvZiBtZW1vcnkgPyAoJWxkIHJlcXVlc3RlZClcbiIsCisgICAgICAgICAgICAgICAgICAgc2l6ZSApKTsKKworICAgICAgICByZXR1cm4gRlRfRXJyX091dF9PZl9NZW1vcnk7CisgICAgICB9CisgICAgICBNRU1fU2V0KCAqUCwgMCwgc2l6ZSApOworICAgIH0KKyAgICBlbHNlCisgICAgICAqUCA9IE5VTEw7CisKKyAgICBGVF9UUkFDRTIoKCAiRlRfQWxsb2M6IiApKTsKKyAgICBGVF9UUkFDRTIoKCAiIHNpemUgPSAlbGQsIGJsb2NrID0gMHglMDhseCwgcmVmID0gMHglMDhseFxuIiwKKyAgICAgICAgICAgICAgICBzaXplLCAobG9uZykqUCwgKGxvbmcpUCApKTsKKworICAgIHJldHVybiBGVF9FcnJfT2s7CisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX1JlYWxsb2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFJlYWxsb2NhdGVzIGEgYmxvY2sgb2YgbWVtb3J5IHBvaW50ZWQgdG8gYnkgYCpQJyB0byBgU2l6ZScgYnl0ZXMgICAqLworICAvKiAgICBmcm9tIHRoZSBoZWFwLCBwb3NzaWJseSBjaGFuZ2luZyBgKlAnLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBtZW1vcnkgOjogQSBoYW5kbGUgdG8gYSBnaXZlbiBgbWVtb3J5IG9iamVjdCcgd2hlcmUgYWxsb2NhdGlvbiAgICAgKi8KKyAgLyogICAgICAgICAgICAgIG9jY3Vycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBjdXJyZW50IDo6IGN1cnJlbnQgYmxvY2sgc2l6ZSBpbiBieXRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgc2l6ZSAgICA6OiB0aGUgbmV3IGJsb2NrIHNpemUgaW4gYnl0ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFAgICAgICA6OiBBIHBvaW50ZXIgdG8gdGhlIGZyZXNoIG5ldyBibG9jay4gIEl0IHNob3VsZCBiZSBzZXQgdG8gICAqLworICAvKiAgICAgICAgICAgICAgTlVMTCBpZiBgc2l6ZScgaXMgMCwgb3IgaW4gY2FzZSBvZiBlcnJvci4gICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBbGwgY2FsbGVycyBvZiBGVF9SZWFsbG9jIF9tdXN0XyBwcm92aWRlIHRoZSBjdXJyZW50IGJsb2NrIHNpemUgICAgKi8KKyAgLyogICAgYXMgd2VsbCBhcyB0aGUgbmV3IG9uZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBXaGVuIHRoZSBtZW1vcnkgb2JqZWN0J3MgZmxhZyBGVF9TWVNURU1fRkxBR19OT19SRUFMTE9DIGlzICAgICAgICAgKi8KKyAgLyogICAgc2V0LCB0aGlzIGZ1bmN0aW9uIHdpbGwgdHJ5IHRvIGVtdWxhdGUgYSByZWFsbG9jIHRocm91Z2ggdXNlcyAgICAgICovCisgIC8qICAgIG9mIEZUX0FsbG9jIGFuZCBGVF9GcmVlLiBPdGhlcndpc2UsIGl0IHdpbGwgY2FsbCB0aGUgc3lzdGVtLSAgICAgICAqLworICAvKiAgICBzcGVjaWZpYyAicmVhbGxvYyIgaW1wbGVtZW50YXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIChTb21lIGVtYmVkZGVkIHN5c3RlbXMgZG8gbm90IGhhdmUgYSB3b3JraW5nIHJlYWxsb2MpLiAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgQkFTRV9GVU5DCisgIEZUX0Vycm9yICBGVF9SZWFsbG9jKCBGVF9NZW1vcnkgIG1lbW9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgY3VycmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAqUCApCisgIHsKKyAgICB2b2lkKiAgUTsKKworICAgIEZUX0Fzc2VydCggUCAhPSAwICk7CisKKyAgICAvKiBpZiB0aGUgb3JpZ2luYWwgcG9pbnRlciBpcyBOVUxMLCBjYWxsIEZUX0FsbG9jKCkgKi8KKyAgICBpZiAoICEqUCApCisgICAgICByZXR1cm4gRlRfQWxsb2MoIG1lbW9yeSwgc2l6ZSwgUCApOworCisgICAgLyogaWYgdGhlIG5ldyBibG9jayBpZiB6ZXJvLXNpemVkLCBjbGVhciB0aGUgY3VycmVudCBvbmUgKi8KKyAgICBpZiAoIHNpemUgPD0gMCApCisgICAgeworICAgICAgRlRfRnJlZSggbWVtb3J5LCBQICk7CisgICAgICByZXR1cm4gRlRfRXJyX09rOworICAgIH0KKworICAgIFEgPSBtZW1vcnktPnJlYWxsb2MoIG1lbW9yeSwgY3VycmVudCwgc2l6ZSwgKlAgKTsKKyAgICBpZiAoICFRICkgZ290byBGYWlsOworCisgICAgKlAgPSBROworICAgIHJldHVybiBGVF9FcnJfT2s7CisKKyAgRmFpbDoKKyAgICBGVF9FUlJPUigoICJGVC5SZWFsbG9jOiIgKSk7CisgICAgRlRfRVJST1IoKCAiIGZhaWxlZCAoY3VycmVudCAlbGQsIHJlcXVlc3RlZCAlbGQpXG4iLAorICAgICAgICAgICAgICAgY3VycmVudCwgc2l6ZSApKTsKKyAgICByZXR1cm4gRlRfRXJyX091dF9PZl9NZW1vcnk7CisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0ZyZWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFJlbGVhc2VzIGEgZ2l2ZW4gYmxvY2sgb2YgbWVtb3J5IGFsbG9jYXRlZCB0aHJvdWdoIEZUX0FsbG9jKCkuICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG1lbW9yeSA6OiBBIGhhbmRsZSB0byBhIGdpdmVuIGBtZW1vcnkgb2JqZWN0JyB3aGVyZSBhbGxvY2F0aW9uICAgICAqLworICAvKiAgICAgICAgICAgICAgb2NjdXJlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFAgICAgICA6OiBUaGlzIGlzIHRoZSBfYWRkcmVzc18gb2YgYSBfcG9pbnRlcl8gd2hpY2ggcG9pbnRzIHRvIHRoZSAqLworICAvKiAgICAgICAgICAgICAgYWxsb2NhdGVkIGJsb2NrLiAgSXQgaXMgYWx3YXlzIHNldCB0byBOVUxMIG9uIGV4aXQuICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBJZiBQIG9yICpQIGFyZSBOVUxMLCB0aGlzIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gc3VjY2Vzc2Z1bGx5LiAgICAgKi8KKyAgLyogICAgVGhpcyBpcyBhIHN0cm9uZyBjb252ZW50aW9uIHdpdGhpbiBhbGwgb2YgRnJlZVR5cGUgYW5kIGl0cyAgICAgICAgICovCisgIC8qICAgIGRyaXZlcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgQkFTRV9GVU5DCisgIHZvaWQgIEZUX0ZyZWUoIEZUX01lbW9yeSAgbWVtb3J5LAorICAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICpQICkKKyAgeworICAgIEZUX1RSQUNFMigoICJGVF9GcmVlOiIgKSk7CisgICAgRlRfVFJBQ0UyKCggIiBGcmVlaW5nIGJsb2NrIDB4JTA4bHgsIHJlZiAweCUwOGx4XG4iLAorICAgICAgICAgICAgICAgIChsb25nKVAsIChQID8gKGxvbmcpKlAgOiAtMSkgKSk7CisKKyAgICBGVF9Bc3NlcnQoIFAgIT0gMCApOworICAgIAorICAgIGlmICggKlAgKQorICAgIHsKKyAgICAgIG1lbW9yeS0+ZnJlZSggbWVtb3J5LCAqUCApOworICAgICAgKlAgPSAwOworICAgIH0KKyAgfQorCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLworICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KKyAgLyoqKiogICAgICAgICAgICAgICAgICAgTyBCIEogRSBDIFQgICBNIEEgTiBBIEcgRSBNIEUgTiBUICAgICAgICAgICAgICoqKiovCisgIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLworICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgICAgLyogZGVzdHJ1Y3RvciBmb3Igc2l6ZXMgbGlzdCAqLworICAgICAgc3RhdGljCisgICAgICB2b2lkICBkZXN0cm95X3NpemUoIEZUX01lbW9yeSAgbWVtb3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TaXplICAgIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0RyaXZlciAgZHJpdmVyICkKKyAgICAgIHsKKyAgICAgICAgLyogZmluYWxpemUgZm9ybWF0LXNwZWNpZmljIHN0dWZmICovCisgICAgICAgIGRyaXZlci0+aW50ZXJmYWNlLmRvbmVfc2l6ZSggc2l6ZSApOworICAgICAgICBGUkVFKCBzaXplICk7CisgICAgICB9CisKKworICAgICAgLyogZGVzdHJ1Y3RvciBmb3IgZmFjZXMgbGlzdCAqLworICAgICAgc3RhdGljCisgICAgICB2b2lkICBkZXN0cm95X2ZhY2UoIEZUX01lbW9yeSAgbWVtb3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GYWNlICAgIGZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0RyaXZlciAgZHJpdmVyICkKKyAgICAgIHsKKyAgICAgICAgLyogRGlzY2FyZCBnbHlwaCBzbG90cyBmb3IgdGhpcyBmYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAvKiBYWFg6IEJld2FyZSEgIEZUX0RvbmVfR2x5cGhTbG90KCkgY2hhbmdlcyB0aGUgZmllbGQgYGZhY2UtPnNsb3QnICovCisgICAgICAgIHdoaWxlICggZmFjZS0+Z2x5cGggKQorICAgICAgICAgIEZUX0RvbmVfR2x5cGhTbG90KCBmYWNlLT5nbHlwaCApOworICAgIAorICAgICAgICAvKiBEaXNjYXJkIGFsbCBzaXplcyBmb3IgdGhpcyBmYWNlICovCisgICAgICAgIEZUX0xpc3RfRmluYWxpemUoICZmYWNlLT5zaXplc19saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9MaXN0X0Rlc3RydWN0b3IpZGVzdHJveV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkcml2ZXIgKTsKKyAgICAgICAgZmFjZS0+c2l6ZSA9IDA7CisgICAgCisgICAgICAgIC8qIGZpbmFsaXplIGZvcm1hdC1zcGVjaWZpYyBzdHVmZiAqLworICAgICAgICBkcml2ZXItPmludGVyZmFjZS5kb25lX2ZhY2UoIGZhY2UgKTsKKyAgICAKKyAgICAgICAgLyogTm93IGRpc2NhcmQgY2xpZW50IGRhdGEgKi8KKyAgICAgICAgaWYgKCBmYWNlLT5nZW5lcmljLmZpbmFsaXplciApCisgICAgICAgICAgZmFjZS0+Z2VuZXJpYy5maW5hbGl6ZXIoIGZhY2UgKTsKKyAgICAKKyAgICAgICAgLyogZ2V0IHJpZCBvZiBpdCAqLworICAgICAgICBGUkVFKCBmYWNlICk7CisgICAgICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIERlc3Ryb3lfRHJpdmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBEZXN0cm95cyBhIGdpdmVuIGRyaXZlciBvYmplY3QuICBUaGlzIGFsc28gZGVzdHJveXMgYWxsIGNoaWxkICAgICAgKi8KKyAgLyogICAgZmFjZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZHJpdmVyIDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZHJpdmVyIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhlIGRyaXZlciBfbXVzdF8gYmUgTE9DS0VEISAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0YXRpYworICB2b2lkICAgRGVzdHJveV9Ecml2ZXIoIEZUX0RyaXZlciAgZHJpdmVyICkKKyAgeworICAgIEZUX01lbW9yeSAgbWVtb3J5ICA9IGRyaXZlci0+bWVtb3J5OworCisgICAgLyogbm93LCBmaW5hbGl6ZSBhbGwgZmFjZXMgaW4gdGhlIGRyaXZlciBsaXN0ICovCisgICAgRlRfTGlzdF9GaW5hbGl6ZSggJmRyaXZlci0+ZmFjZXNfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAoRlRfTGlzdF9EZXN0cnVjdG9yKWRlc3Ryb3lfZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICBtZW1vcnksCisgICAgICAgICAgICAgICAgICAgICAgZHJpdmVyICk7CisKKyAgICAvKiBmaW5hbGl6ZSB0aGUgZHJpdmVyIG9iamVjdCAqLworICAgIGlmIChkcml2ZXItPmludGVyZmFjZS5kb25lX2RyaXZlcikKKyAgICAgIGRyaXZlci0+aW50ZXJmYWNlLmRvbmVfZHJpdmVyKGRyaXZlcik7CisKKyAgICAvKiBmaW5hbGl6ZSBjbGllbnQtZGF0YSAqLworICAgIGlmIChkcml2ZXItPmdlbmVyaWMuZmluYWxpemVyKQorICAgICAgZHJpdmVyLT5nZW5lcmljLmZpbmFsaXplcihkcml2ZXIpOworCisgICAgLyogZGlzY2FyZCBpdCAqLworICAgIEZSRUUoIGRyaXZlciApOworICB9CisKKworCisKKworICBCQVNFX0ZVTkMKKyAgRlRfR2x5cGhfRm9ybWF0KiAgRlRfR2V0X0dseXBoX0Zvcm1hdCggRlRfTGlicmFyeSAgICBsaWJyYXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9HbHlwaF9UYWcgIGZvcm1hdF90YWcgKQorICB7CisgICAgRlRfR2x5cGhfRm9ybWF0KiAgY3VyICAgPSBsaWJyYXJ5LT5nbHlwaF9mb3JtYXRzOworICAgIEZUX0dseXBoX0Zvcm1hdCogIGxpbWl0ID0gY3VyICsgRlRfTUFYX0dMWVBIX0ZPUk1BVFM7CisgICAgCisgICAgZm9yICggOyBjdXIgPCBsaW1pdDsgY3VyICsrICkKKyAgICB7CisgICAgICBpZiAoIGN1ci0+Zm9ybWF0X3RhZyA9PSBmb3JtYXRfdGFnICkKKyAgICAgICAgcmV0dXJuIGN1cjsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIDA7CisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX1NldF9SYXN0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBjaGFuZ2UgdGhlIHJhc3RlciBtb2R1bGUgdXNlZCB0byBjb252ZXJ0ICAqLworICAvKiAgICBmcm9tIGEgZ2l2ZW4gbWVtb3J5IG9iamVjdC4gIEl0IGlzIHRodXMgcG9zc2libGUgdG8gdXNlIGxpYnJhcmllcyAgKi8KKyAgLyogICAgd2l0aCBkaXN0aW5jdCBtZW1vcnkgYWxsb2NhdG9ycyB3aXRoaW4gdGhlIHNhbWUgcHJvZ3JhbS4gICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbWVtb3J5ICA6OiBBIGhhbmRsZSB0byB0aGUgb3JpZ2luYWwgbWVtb3J5IG9iamVjdC4gICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbGlicmFyeSA6OiBBIGhhbmRsZSB0byBhIG5ldyBsaWJyYXJ5IG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBFWFBPUlRfRlVOQworICBGVF9FcnJvciAgRlRfU2V0X1Jhc3RlciggRlRfTGlicmFyeSAgICAgICAgICAgIGxpYnJhcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9SYXN0ZXJfSW50ZXJmYWNlKiAgaW50ZXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfUmFzdGVyICAgICAgICAgICAgIHJhc3RlciApCisgIHsKKyAgICBGVF9NZW1vcnkgICAgICAgICBtZW1vcnkgPSBsaWJyYXJ5LT5tZW1vcnk7CisgICAgRlRfRXJyb3IgICAgICAgICAgZXJyb3IgID0gRlRfRXJyX09rOworICAgIEZUX0dseXBoX0Zvcm1hdCogIGZvcm1hdDsKKworICAgIC8qIGFsbG9jYXRlIHRoZSByZW5kZXIgcG9vbCBpZiBuZWNlc3NhcnkgKi8KKyAgICBpZiAoICFsaWJyYXJ5LT5yYXN0ZXJfcG9vbCAmJgorICAgICAgICAgQUxMT0MoIGxpYnJhcnktPnJhc3Rlcl9wb29sLCBGVF9SRU5ERVJfUE9PTF9TSVpFICkgKQorICAgICAgZ290byBFeGl0OworCisgICAgLyogZmluZCB0aGUgZ2x5cGggZm9ybWF0dGVyIGZvciB0aGUgcmFzdGVyJ3MgZm9ybWF0ICovCisgICAgZm9ybWF0ID0gRlRfR2V0X0dseXBoX0Zvcm1hdCggbGlicmFyeSwgaW50ZXJmYWNlLT5mb3JtYXRfdGFnICk7CisgICAgaWYgKCFmb3JtYXQpCisgICAgeworICAgICAgZXJyb3IgPSBGVF9FcnJfSW52YWxpZF9Bcmd1bWVudDsKKyAgICAgIGdvdG8gRXhpdDsKKyAgICB9CisgICAgCisgICAgLyogZnJlZSBwcmV2aW91cyByYXN0ZXIgb2JqZWN0IGlmIG5lY2Vzc2FyeSAqLworICAgIGlmIChmb3JtYXQtPnJhc3Rlcl9hbGxvY2F0ZWQpCisgICAgeworICAgICAgRlJFRSggZm9ybWF0LT5yYXN0ZXIgKTsKKyAgICAgIGZvcm1hdC0+cmFzdGVyX2FsbG9jYXRlZCA9IDA7CisgICAgfQorICAgIAorICAgIC8qIGFsbG9jYXRlIG5ldyByYXN0ZXIgb2JqZWN0IGlzIG5lY2Vzc2FyeSAqLworICAgIGlmICghcmFzdGVyKQorICAgIHsKKyAgICAgIGlmICggQUxMT0MoIHJhc3RlciwgaW50ZXJmYWNlLT5zaXplICkgKQorICAgICAgICBnb3RvIEV4aXQ7CisgICAgICAgIAorICAgICAgZm9ybWF0LT5yYXN0ZXJfYWxsb2NhdGVkID0gMTsKKyAgICB9CisgICAgZm9ybWF0LT5yYXN0ZXIgICAgICAgICAgID0gcmFzdGVyOworICAgIGZvcm1hdC0+cmFzdGVyX2ludGVyZmFjZSA9IGludGVyZmFjZTsKKyAgICAKKyAgICAvKiBpbml0aWFsaXplIHRoZSByYXN0ZXIgb2JqZWN0ICovCisgICAgZXJyb3IgPSBpbnRlcmZhY2UtPmluaXQoIHJhc3RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIqKWxpYnJhcnktPnJhc3Rlcl9wb29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9SRU5ERVJfUE9PTF9TSVpFICk7CisgICAgaWYgKGVycm9yKQorICAgIHsKKyAgICAgIGlmIChmb3JtYXQtPnJhc3Rlcl9hbGxvY2F0ZWQpCisgICAgICB7CisgICAgICAgIEZSRUUoIGZvcm1hdC0+cmFzdGVyICk7CisgICAgICAgIGZvcm1hdC0+cmFzdGVyX2FsbG9jYXRlZCA9IDA7CisgICAgICB9CisgICAgfQorCisgIEV4aXQ6CisgICAgcmV0dXJuIGVycm9yOworICB9CisKKyAgRVhQT1JUX0ZVTkMKKyAgdm9pZCAgRlRfU2V0X0RlYnVnX0hvb2soIEZUX0xpYnJhcnkgICAgICAgICBsaWJyYXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICAgICAgIGhvb2tfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9EZWJ1Z0hvb2tfRnVuYyAgZGVidWdfaG9vayApCisgIHsKKyAgICBpZiAoaG9va19pbmRleCA8IChzaXplb2YobGlicmFyeS0+ZGVidWdfaG9va3MpL3NpemVvZih2b2lkKikpKQorICAgIHsKKyAgICAgIGxpYnJhcnktPmRlYnVnX2hvb2tzW2hvb2tfaW5kZXhdID0gZGVidWdfaG9vazsKKyAgICB9CisgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAKKyAgCisgIEJBU0VfRlVOQworICBGVF9FcnJvciAgRlRfQWRkX0dseXBoX0Zvcm1hdCggRlRfTGlicmFyeSAgICAgICAgbGlicmFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0dseXBoX0Zvcm1hdCogIGZvcm1hdCApCisgIHsKKyAgICBGVF9HbHlwaF9Gb3JtYXQqICBuZXcgPSAwOworICAgIAorICAgIHsKKyAgICAgIEZUX0dseXBoX0Zvcm1hdCogIGN1ciA9IGxpYnJhcnktPmdseXBoX2Zvcm1hdHM7CisgICAgICBGVF9HbHlwaF9Gb3JtYXQqICBsaW1pdCA9IGN1ciArIEZUX01BWF9HTFlQSF9GT1JNQVRTOworICAgICAgCisgICAgICBmb3IgKCA7IGN1ciA8IGxpbWl0OyBjdXIrKyApCisgICAgICB7CisgICAgICAgIC8qIHJldHVybiBhbiBlcnJvciBpZiB0aGUgZm9ybWF0IGlzIGFscmVhZHkgcmVnaXN0ZXJlZCAqLworICAgICAgICBpZiAoIGN1ci0+Zm9ybWF0X3RhZyA9PSBmb3JtYXQtPmZvcm1hdF90YWcgKQorICAgICAgICAgIHJldHVybiBGVF9FcnJfSW52YWxpZF9HbHlwaF9Gb3JtYXQ7CisgICAgICAgICAgCisgICAgICAgIGlmICggY3VyLT5mb3JtYXRfdGFnID09IDAgJiYgbmV3ID09IDAgKQorICAgICAgICAgIG5ldyA9IGN1cjsKKyAgICAgIH0KKyAgICB9CisgICAgICAKKyAgICAvKiBpZiB0aGVyZSBpcyBubyBwbGFjZSB0byBob2xkIHRoZSBuZXcgZm9ybWF0LCByZXR1cm4gYW4gZXJyb3IgKi8KKyAgICBpZiAoIW5ldykKKyAgICAgIHJldHVybiBGVF9FcnJfVG9vX01hbnlfR2x5cGhfRm9ybWF0czsKKyAgICAgICAgCisgICAgKm5ldyA9ICpmb3JtYXQ7CisgICAgCisgICAgLyogbm93LCBjcmVhdGUgYSByYXN0ZXIgb2JqZWN0IGlmIHdlIG5lZWQgdG8gKi8KKyAgICByZXR1cm4gRlRfU2V0X1Jhc3RlciggbGlicmFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LT5yYXN0ZXJfaW50ZXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQtPnJhc3RlciApOworICB9CisgIAorCisKKyAgQkFTRV9GVU5DCisgIEZUX0Vycm9yICBGVF9SZW1vdmVfR2x5cGhfRm9ybWF0KCBGVF9MaWJyYXJ5ICAgIGxpYnJhcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9HbHlwaF9UYWcgIGZvcm1hdF90YWcgKQorICB7CisgICAgRlRfTWVtb3J5ICAgICAgICAgbWVtb3J5OworICAgIEZUX0dseXBoX0Zvcm1hdCogIGN1ciAgID0gbGlicmFyeS0+Z2x5cGhfZm9ybWF0czsKKyAgICBGVF9HbHlwaF9Gb3JtYXQqICBsaW1pdCA9IGN1ciArIEZUX01BWF9HTFlQSF9GT1JNQVRTOworICAgIAorICAgIG1lbW9yeSA9IGxpYnJhcnktPm1lbW9yeTsKKyAgICAKKyAgICBmb3IgKCA7IGN1ciA8IGxpbWl0OyBjdXIrKyApCisgICAgeworICAgICAgaWYgKGN1ci0+Zm9ybWF0X3RhZyA9PSBmb3JtYXRfdGFnKQorICAgICAgeworICAgICAgICBpZiAoY3VyLT5yYXN0ZXJfYWxsb2NhdGVkKQorICAgICAgICB7CisgICAgICAgICAgRlJFRSggY3VyLT5yYXN0ZXIgKTsKKyAgICAgICAgICBjdXItPnJhc3Rlcl9hbGxvY2F0ZWQgPSAwOworICAgICAgICB9CisgICAgICAgIGN1ci0+Zm9ybWF0X3RhZyA9IDA7CisgICAgICAgIHJldHVybiBGVF9FcnJfT2s7CisgICAgICB9CisgICAgfQorICAgIAorICAgIHJldHVybiBGVF9FcnJfSW52YWxpZF9Bcmd1bWVudDsKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfTmV3X0xpYnJhcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGNyZWF0ZSBhIG5ldyBGcmVlVHlwZSBsaWJyYXJ5IGluc3RhbmNlICAgICovCisgIC8qICAgIGZyb20gYSBnaXZlbiBtZW1vcnkgb2JqZWN0LiAgSXQgaXMgdGh1cyBwb3NzaWJsZSB0byB1c2UgbGlicmFyaWVzICAqLworICAvKiAgICB3aXRoIGRpc3RpbmN0IG1lbW9yeSBhbGxvY2F0b3JzIHdpdGhpbiB0aGUgc2FtZSBwcm9ncmFtLiAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBtZW1vcnkgIDo6IEEgaGFuZGxlIHRvIHRoZSBvcmlnaW5hbCBtZW1vcnkgb2JqZWN0LiAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBsaWJyYXJ5IDo6IEEgaGFuZGxlIHRvIGEgbmV3IGxpYnJhcnkgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBFcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEVYUE9SVF9GVU5DCisgIEZUX0Vycm9yICBGVF9OZXdfTGlicmFyeSggRlRfTWVtb3J5ICAgIG1lbW9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9MaWJyYXJ5KiAgYWxpYnJhcnkgKQorICB7CisgICAgRlRfTGlicmFyeSBsaWJyYXJ5ICAgICAgPSAwOworICAgIEZUX0Vycm9yICAgZXJyb3I7CisKKyAgICAvKiBGaXJzdCBvZiBhbGwsIGFsbG9jYXRlIHRoZSBsaWJyYXJ5IG9iamVjdCAqLworICAgIGlmICggQUxMT0MoIGxpYnJhcnksIHNpemVvZiAoICpsaWJyYXJ5ICkgKSApCisgICAgICByZXR1cm4gZXJyb3I7CisKKyAgICBsaWJyYXJ5LT5tZW1vcnkgPSBtZW1vcnk7CisKKyAgICAvKiBub3cgcmVnaXN0ZXIgdGhlIGRlZmF1bHQgcmFzdGVyIGZvciB0aGUgYG91dGxpbmUnIGdseXBoIGltYWdlIGZvcm1hdCAqLworICAgIHsKKyAgICAgIEZUX0dseXBoX0Zvcm1hdCAgb3V0bGluZV9mb3JtYXQgPQorICAgICAgeworICAgICAgICBmdF9nbHlwaF9mb3JtYXRfb3V0bGluZSwKKyAgICAgICAgJmZ0X2RlZmF1bHRfcmFzdGVyLAorICAgICAgICAwLAorICAgICAgICAwCisgICAgICB9OworICAgICAgCisgICAgICBlcnJvciA9IEZUX0FkZF9HbHlwaF9Gb3JtYXQoIGxpYnJhcnksICZvdXRsaW5lX2Zvcm1hdCApOworICAgIH0KKworICAgIC8qIFRoYXQncyBvayBub3cgKi8KKyAgICAqYWxpYnJhcnkgPSBsaWJyYXJ5OworCisgICAgcmV0dXJuIEZUX0Vycl9PazsKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfRG9uZV9MaWJyYXJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRGlzY2FyZHMgYSBnaXZlbiBsaWJyYXJ5IG9iamVjdC4gIFRoaXMgY2xvc2VzIGFsbCBkcml2ZXJzIGFuZCAgICAgICovCisgIC8qICAgIGRpc2NhcmRzIGFsbCByZXNvdXJjZSBvYmplY3RzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGxpYnJhcnkgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBsaWJyYXJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgRVhQT1JUX0ZVTkMKKyAgRlRfRXJyb3IgIEZUX0RvbmVfTGlicmFyeSggRlRfTGlicmFyeSAgbGlicmFyeSApCisgIHsKKyAgICBGVF9NZW1vcnkgIG1lbW9yeTsKKyAgICBGVF9JbnQgICAgIG47CisKKworICAgIGlmICggIWxpYnJhcnkgKQorICAgICAgcmV0dXJuIEZUX0Vycl9JbnZhbGlkX0xpYnJhcnlfSGFuZGxlOworCisgICAgbWVtb3J5ID0gbGlicmFyeS0+bWVtb3J5OworCisgICAgLyogRGlzY2FyZCBjbGllbnQtZGF0YSAqLworICAgIGlmKCBsaWJyYXJ5LT5nZW5lcmljLmZpbmFsaXplciApCisgICAgICBsaWJyYXJ5LT5nZW5lcmljLmZpbmFsaXplciggbGlicmFyeSApOworCisgICAgLyogQ2xvc2UgYWxsIGRyaXZlcnMgaW4gdGhlIGxpYnJhcnkgKi8KKyAgICBmb3IgKCBuID0gMDsgbiA8IGxpYnJhcnktPm51bV9kcml2ZXJzOyBuKysgKQorICAgIHsKKyAgICAgIEZUX0RyaXZlciAgZHJpdmVyID0gbGlicmFyeS0+ZHJpdmVyc1tuXTsKKworICAgICAgaWYgKCBkcml2ZXIgKQorICAgICAgeworICAgICAgICBEZXN0cm95X0RyaXZlciggZHJpdmVyICk7CisgICAgICAgIGxpYnJhcnktPmRyaXZlcnNbbl0gPSAwOworICAgICAgfQorICAgIH0KKworICAgIC8qIERlc3Ryb3kgcmFzdGVyIG9iamVjdCAqLworICAgIEZSRUUoIGxpYnJhcnktPnJhc3Rlcl9wb29sICAgKTsKKyAgICAKKyAgICB7CisgICAgICBGVF9HbHlwaF9Gb3JtYXQqICBjdXIgPSBsaWJyYXJ5LT5nbHlwaF9mb3JtYXRzOworICAgICAgRlRfR2x5cGhfRm9ybWF0KiAgbGltaXQgPSBjdXIgKyBGVF9NQVhfR0xZUEhfRk9STUFUUzsKKyAgICAgIAorICAgICAgZm9yICggOyBjdXIgPCBsaW1pdDsgY3VyKysgKQorICAgICAgeworICAgICAgICBpZiAoIGN1ci0+cmFzdGVyX2FsbG9jYXRlZCApCisgICAgICAgIHsKKyAgICAgICAgICBGUkVFKCBjdXItPnJhc3RlciApOworICAgICAgICAgIGN1ci0+cmFzdGVyX2FsbG9jYXRlZCA9IDA7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBGUkVFKCBsaWJyYXJ5ICk7CisKKyAgICByZXR1cm4gRlRfRXJyX09rOworICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9TZXRfUmFzdGVyX01vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBTZXQgYSByYXN0ZXItc3BlY2lmaWMgbW9kZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBsaWJyYXJ5IDo6IEEgaGFuZGxlIHRvIGEgdGFyZ2V0IGxpYnJhcnkgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZm9ybWF0ICA6OiB0aGUgZ2x5cGggZm9ybWF0IHVzZWQgdG8gc2VsZWN0IHRoZSByYXN0ZXIgICAgICAgICAgICAgICovCisgIC8qICAgIG1vZGUgICAgOjogdGhlIHJhc3Rlci1zcGVjaWZpYyBtb2RlIGRlc2NyaXB0b3IgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBhcmdzICAgIDo6IHRoZSBtb2RlIGFyZ3VtZW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgRVhQT1JUX0ZVTkMKKyAgRlRfRXJyb3IgIEZUX1NldF9SYXN0ZXJfTW9kZSggRlRfTGlicmFyeSAgICBsaWJyYXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9HbHlwaF9UYWcgIGZvcm1hdF90YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICAgbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogICBhcmdzICkKKyAgeworICAgIEZUX01lbW9yeSAgICAgICAgIG1lbW9yeTsKKyAgICBGVF9FcnJvciAgICAgICAgICBlcnJvcjsKKyAgICBGVF9HbHlwaF9Gb3JtYXQqICBmb3JtYXQgPSAwOworCisgICAgeworICAgICAgRlRfR2x5cGhfRm9ybWF0KiAgY3VyICAgPSBsaWJyYXJ5LT5nbHlwaF9mb3JtYXRzOworICAgICAgRlRfR2x5cGhfRm9ybWF0KiAgbGltaXQgPSBjdXIgKyBGVF9NQVhfR0xZUEhfRk9STUFUUzsKKyAgICAgIAorICAgICAgZm9yICg7IGN1ciA8IGxpbWl0OyBjdXIrKykKKyAgICAgIHsKKyAgICAgICAgaWYgKGN1ci0+Zm9ybWF0X3RhZyA9PSBmb3JtYXRfdGFnKQorICAgICAgICB7CisgICAgICAgICAgZm9ybWF0ID0gY3VyOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgaWYgKCFmb3JtYXQpCisgICAgICByZXR1cm4gRlRfRXJyX0ludmFsaWRfQXJndW1lbnQ7CisKKyAgICBtZW1vcnkgPSBsaWJyYXJ5LT5tZW1vcnk7CisKKyAgICBlcnJvciA9IEZUX0Vycl9PazsKKyAgICBpZiAoZm9ybWF0LT5yYXN0ZXIpCisgICAgICBlcnJvciA9IGZvcm1hdC0+cmFzdGVyX2ludGVyZmFjZS0+c2V0X21vZGUoIGZvcm1hdC0+cmFzdGVyLCBtb2RlLCBhcmdzICk7CisKKyAgICByZXR1cm4gZXJyb3I7CisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0FkZF9Ecml2ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFJlZ2lzdGVycyBhIG5ldyBkcml2ZXIgaW4gYSBnaXZlbiBsaWJyYXJ5IG9iamVjdC4gIFRoaXMgZnVuY3Rpb24gICAqLworICAvKiAgICB0YWtlcyBvbmx5IGEgcG9pbnRlciB0byBhIGRyaXZlciBpbnRlcmZhY2UuICBJdCB1c2VzIGl0IHRvIGNyZWF0ZSAgKi8KKyAgLyogICAgdGhlIG5ldyBkcml2ZXIsIHRoZW4gc2V0cyB1cCBzb21lIGltcG9ydGFudCBmaWVsZHMuICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbGlicmFyeSAgICAgICAgICA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGxpYnJhcnkgb2JqZWN0LiAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBkcml2ZXJfaW50ZXJmYWNlIDo6IEEgcG9pbnRlciB0byBhIGRyaXZlciBpbnRlcmZhY2UgdGFibGUuICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBFcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGlzIGZ1bmN0aW9uIGRvZXNuJ3QgY2hlY2sgd2hldGhlciB0aGUgZHJpdmVyIGlzIGFscmVhZHkgICAgICAgICAgKi8KKyAgLyogICAgaW5zdGFsbGVkISAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBFWFBPUlRfRlVOQworICBGVF9FcnJvciAgRlRfQWRkX0RyaXZlciggRlRfTGlicmFyeSAgICAgICAgICAgICAgICAgbGlicmFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX0RyaXZlckludGVyZmFjZSogIGRyaXZlcl9pbnRlcmZhY2UgKQorICB7CisgICAgRlRfRXJyb3IgICBlcnJvcjsKKyAgICBGVF9Ecml2ZXIgIGRyaXZlcjsKKyAgICBGVF9NZW1vcnkgIG1lbW9yeTsKKworICAgIGlmICggIWxpYnJhcnkgfHwgIWRyaXZlcl9pbnRlcmZhY2UgKQorICAgICAgcmV0dXJuIEZUX0Vycl9JbnZhbGlkX0xpYnJhcnlfSGFuZGxlOworCisgICAgbWVtb3J5ID0gbGlicmFyeS0+bWVtb3J5OworICAgIGVycm9yICA9IEZUX0Vycl9PazsKKworICAgIGlmICggbGlicmFyeS0+bnVtX2RyaXZlcnMgPj0gRlRfTUFYX0RSSVZFUlMgKQorICAgICAgZXJyb3IgPSBGVF9FcnJfVG9vX01hbnlfRHJpdmVyczsKKyAgICBlbHNlCisgICAgeworICAgICAgaWYgKCBBTExPQyggZHJpdmVyLCBkcml2ZXJfaW50ZXJmYWNlLT5kcml2ZXJfb2JqZWN0X3NpemUgKSApCisgICAgICAgIGdvdG8gRXhpdDsKKworICAgICAgZHJpdmVyLT5saWJyYXJ5ICAgPSBsaWJyYXJ5OworICAgICAgZHJpdmVyLT5tZW1vcnkgICAgPSBtZW1vcnk7CisgICAgICBkcml2ZXItPmludGVyZmFjZSA9ICpkcml2ZXJfaW50ZXJmYWNlOworCisgICAgICBpZiAoZHJpdmVyX2ludGVyZmFjZS0+aW5pdF9kcml2ZXIpCisgICAgICB7CisgICAgICAgIGVycm9yID0gZHJpdmVyX2ludGVyZmFjZS0+aW5pdF9kcml2ZXIoIGRyaXZlciApOworICAgICAgICBpZiAoIGVycm9yICkgZ290byBGYWlsOworICAgICAgfQorCisgICAgICBsaWJyYXJ5LT5kcml2ZXJzW2xpYnJhcnktPm51bV9kcml2ZXJzKytdID0gZHJpdmVyOworICAgICAgZ290byBFeGl0OworCisgICAgRmFpbDoKKyAgICAgIEZSRUUoIGRyaXZlciApOworICAgIH0KKworICBFeGl0OgorICAgIHJldHVybiBlcnJvcjsKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfUmVtb3ZlX0RyaXZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVW5yZWdpc3RlciBhIGdpdmVuIGRyaXZlci4gIFRoaXMgY2xvc2VzIHRoZSBkcml2ZXIsIHdoaWNoIGluIHR1cm4gICovCisgIC8qICAgIGRlc3Ryb3lzIGFsbCBmYWNlcywgc2l6ZXMsIHNsb3RzLCBldGMuIGFzc29jaWF0ZWQgd2l0aCBpdC4gICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhpcyBmdW5jdGlvbiBhbHNvIERFU1RST1lTIHRoZSBkcml2ZXIgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZHJpdmVyIDo6IEEgaGFuZGxlIHRvIHRhcmdldCBkcml2ZXIgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBFWFBPUlRfRlVOQworICBGVF9FcnJvciAgRlRfUmVtb3ZlX0RyaXZlciggRlRfRHJpdmVyICBkcml2ZXIgKQorICB7CisgICAgRlRfTGlicmFyeSAgbGlicmFyeTsKKyAgICBGVF9NZW1vcnkgICBtZW1vcnk7CisgICAgRlRfRHJpdmVyICAgKmN1ciwgKmxhc3Q7CisgICAgRlRfRXJyb3IgICAgZXJyb3I7CisKKworICAgIGlmICggIWRyaXZlciApCisgICAgICByZXR1cm4gRlRfRXJyX0ludmFsaWRfRHJpdmVyX0hhbmRsZTsKKworICAgIGxpYnJhcnkgPSBkcml2ZXItPmxpYnJhcnk7CisgICAgbWVtb3J5ICA9IGRyaXZlci0+bWVtb3J5OworCisgICAgaWYgKCAhbGlicmFyeSB8fCAhbWVtb3J5ICkKKyAgICAgIHJldHVybiBGVF9FcnJfSW52YWxpZF9Ecml2ZXJfSGFuZGxlOworCisgICAgLyogbG9vay11cCBkcml2ZXIgZW50cnkgaW4gbGlicmFyeSB0YWJsZSAqLworICAgIGVycm9yID0gRlRfRXJyX0ludmFsaWRfRHJpdmVyX0hhbmRsZTsKKyAgICBjdXIgICA9IGxpYnJhcnktPmRyaXZlcnM7CisgICAgbGFzdCAgPSBjdXIgKyBsaWJyYXJ5LT5udW1fZHJpdmVycyAtIDE7CisKKyAgICBmb3IgKCA7IGN1ciA8PSBsYXN0OyBjdXIrKyApCisgICAgeworICAgICAgaWYgKCAqY3VyID09IGRyaXZlciApCisgICAgICB7CisgICAgICAgIC8qIERlc3Ryb3kgdGhlIGRyaXZlciBvYmplY3QgKi8KKyAgICAgICAgRGVzdHJveV9Ecml2ZXIoIGRyaXZlciApOworCisgICAgICAgIC8qIG5vdyBtb3ZlIHRoZSBsYXN0IGRyaXZlciBpbiB0aGUgdGFibGUgdG8gdGhlIHZhY2FudCBzbG90ICovCisgICAgICAgIGlmIChjdXIgPCBsYXN0KQorICAgICAgICB7CisgICAgICAgICAgKmN1ciAgPSAqbGFzdDsKKyAgICAgICAgICAqbGFzdCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgbGlicmFyeS0+bnVtX2RyaXZlcnMtLTsKKworICAgICAgICAvKiBleGl0IGxvb3AgKi8KKyAgICAgICAgZXJyb3IgPSBGVF9FcnJfT2s7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBlcnJvcjsKKyAgfQorCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0dldF9Ecml2ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHJldHVybnMgdGhlIGhhbmRsZSBvZiB0aGUgZHJpdmVyIHJlc3BvbnNpYmxlIGZvciBhIGdpdmVuIGZvcm1hdCAgICAqLworICAvKiAgICAob3Igc2VydmljZSkgYWNjb3JkaW5nIHRvIGl0cyBgbmFtZScuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBsaWJyYXJ5ICAgICA6OiBoYW5kbGUgdG8gbGlicmFyeSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZHJpdmVyX25hbWUgOjogbmFtZSBvZiBkcml2ZXIgdG8gbG9vay11cC4gICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgaGFuZGxlIHRvIGRyaXZlciBvYmplY3QuIDAgb3RoZXJ3aXNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBFWFBPUlRfRlVOQworICBGVF9Ecml2ZXIgIEZUX0dldF9Ecml2ZXIoIEZUX0xpYnJhcnkgIGxpYnJhcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogICAgICAgZHJpdmVyX25hbWUgKQorICB7CisgICAgRlRfRHJpdmVyICAqY3VyLCAqbGltaXQ7CisgICAgCisgICAgaWYgKCFsaWJyYXJ5IHx8ICFkcml2ZXJfbmFtZSkKKyAgICAgIHJldHVybiAwOworICAgICAgCisgICAgY3VyICAgPSBsaWJyYXJ5LT5kcml2ZXJzOworICAgIGxpbWl0ID0gY3VyICsgbGlicmFyeS0+bnVtX2RyaXZlcnM7CisgICAgZm9yICggOyBjdXIgPCBsaW1pdDsgY3VyKysgKQorICAgIHsKKyAgICAgIGlmICggc3RyY21wKCAoKmN1ciktPmludGVyZmFjZS5kcml2ZXJfbmFtZSwgZHJpdmVyX25hbWUgKSA9PSAwICkKKyAgICAgICAgcmV0dXJuICpjdXI7CisgICAgfQorICAgIHJldHVybiAwOworICB9CisKKworCisgIHN0YXRpYworICBGVF9FcnJvciAgb3Blbl9mYWNlKCBGVF9Ecml2ZXIgIGRyaXZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgZmFjZV9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgRlRfRmFjZSogICBhZmFjZSApCisgIHsKKyAgICBGVF9NZW1vcnkgICAgICAgICAgICBtZW1vcnk7CisgICAgRlRfRHJpdmVySW50ZXJmYWNlKiAgaW50ZXJmYWNlOworICAgIEZUX0ZhY2UgICAgICAgICAgICAgIGZhY2UgPSAwOworICAgIEZUX0Vycm9yICAgICAgICAgICAgIGVycm9yOworCisKKyAgICBpbnRlcmZhY2UgPSAmZHJpdmVyLT5pbnRlcmZhY2U7CisgICAgbWVtb3J5ICAgID0gZHJpdmVyLT5tZW1vcnk7CisKKyAgICAvKiBhbGxvY2F0ZSB0aGUgZmFjZSBvYmplY3QsIGFuZCBwZXJmb3JtcyBiYXNpYyBpbml0aWFsaXNhdGlvbiAqLworICAgIGlmICggQUxMT0MoIGZhY2UsIGludGVyZmFjZS0+ZmFjZV9vYmplY3Rfc2l6ZSApICkKKyAgICAgIGdvdG8gRmFpbDsKKworICAgIGZhY2UtPmRyaXZlciA9IGRyaXZlcjsKKyAgICBmYWNlLT5tZW1vcnkgPSBtZW1vcnk7CisgICAgZmFjZS0+c3RyZWFtID0gc3RyZWFtOworCisgICAgZXJyb3IgPSBpbnRlcmZhY2UtPmluaXRfZmFjZSggc3RyZWFtLCBmYWNlX2luZGV4LCBmYWNlICk7CisgICAgaWYgKCBlcnJvciApCisgICAgICBnb3RvIEZhaWw7CisKKyAgICAqYWZhY2UgPSBmYWNlOworCisgIEZhaWw6CisgICAgaWYgKCBlcnJvciApCisgICAgeworICAgICAgaW50ZXJmYWNlLT5kb25lX2ZhY2UoIGZhY2UgKTsKKyAgICAgIEZSRUUoIGZhY2UgKTsKKyAgICAgICphZmFjZSA9IDA7CisgICAgfQorCisgICAgcmV0dXJuIGVycm9yOworICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9OZXdfRmFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBDcmVhdGVzIGEgbmV3IGZhY2Ugb2JqZWN0IGZyb20gYSBnaXZlbiByZXNvdXJjZSBhbmQgdHlwZWZhY2UgICAgICAgKi8KKyAgLyogICAgaW5kZXguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgcmVzb3VyY2UgICA6OiBBIGhhbmRsZSB0byBhIHNvdXJjZSByZXNvdXJjZS4gICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBmYWNlX2luZGV4IDo6IFRoZSBpbmRleCBvZiB0aGUgZmFjZSB3aXRoaW4gdGhlIHJlc291cmNlLiAgVGhlICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICBmaXJzdCBmYWNlIGhhcyBpbmRleCAwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBmYWNlICAgICAgIDo6IEEgaGFuZGxlIHRvIGEgbmV3IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBFcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBVbmxpa2UgRnJlZVR5cGUgMS4xLCB0aGlzIGZ1bmN0aW9uIGF1dG9tYXRpY2FsbHkgY3JlYXRlcyBhIGdseXBoICAgKi8KKyAgLyogICAgc2xvdCBmb3IgdGhlIGZhY2Ugb2JqZWN0IHdoaWNoIGNhbiBiZSBhY2Nlc3NlZCBkaXJlY3RseSB0aHJvdWdoICAgICovCisgIC8qICAgIGBmYWNlLT5nbHlwaCcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgTm90ZSB0aGF0IGFkZGl0aW9uYWwgc2xvdHMgY2FuIGJlIGFkZGVkIHRvIGVhY2ggZmFjZSB0aHJvdWdoIHRoZSAgICovCisgIC8qICAgIEZUX05ld19HbHlwaFNsb3QoKSBBUEkgZnVuY3Rpb24uICBTbG90cyBhcmUgbGlua2VkIGluIGEgc2luZ2xlICAgICAqLworICAvKiAgICBsaXN0IHRocm91Z2ggdGhlaXIgYG5leHQnIGZpZWxkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX05ld19GYWNlKCkgY2FuIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIGFuZC9vciBjaGVjayB0aGUgZm9udCAgICAgICAqLworICAvKiAgICBmb3JtYXQgb2YgYSBnaXZlbiBmb250IHJlc291cmNlLiAgSWYgdGhlIGBmYWNlX2luZGV4JyBmaWVsZCBpcyAgICAgKi8KKyAgLyogICAgbmVnYXRpdmUsIHRoZSBmdW5jdGlvbiB3aWxsIF9ub3RfIHJldHVybiBhbnkgZmFjZSBoYW5kbGUgaW4gICAgICAgICovCisgIC8qICAgIGAqZmFjZScuICBJdHMgcmV0dXJuIHZhbHVlIHNob3VsZCBiZSAwIGlmIHRoZSByZXNvdXJjZSBpcyAgICAgICAgICAqLworICAvKiAgICByZWNvZ25pemVkLCBvciBub24temVybyBpZiBub3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEVYUE9SVF9GVU5DCisgIEZUX0Vycm9yICBGVF9OZXdfRmFjZSggRlRfTGlicmFyeSAgIGxpYnJhcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogIHBhdGhuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgICBmYWNlX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZhY2UgICAgICphZmFjZSApCisgIHsKKyAgICBGVF9TdHJlYW0gIHN0cmVhbTsKKyAgICBGVF9NZW1vcnkgIG1lbW9yeTsKKyAgICBGVF9FcnJvciAgIGVycm9yOworICAgIAorICAgIG1lbW9yeSA9IGxpYnJhcnktPm1lbW9yeTsKKyAgICBpZiAoIEFMTE9DKCBzdHJlYW0sIHNpemVvZigqc3RyZWFtKSApICkKKyAgICAgIGdvdG8gRmFpbDsKKyAgICAgIAorICAgIHN0cmVhbS0+bWVtb3J5ID0gbWVtb3J5OworICAgIAorICAgIGVycm9yID0gRlRfTmV3X1N0cmVhbSggcGF0aG5hbWUsIHN0cmVhbSApOworICAgIGlmIChlcnJvcikgZ290byBGYWlsX1N0cmVhbTsKKyAgICAKKyAgICBlcnJvciA9IEZUX09wZW5fRmFjZSggbGlicmFyeSwgc3RyZWFtLCBmYWNlX2luZGV4LCBhZmFjZSApOworICAgIGlmICghZXJyb3IpCisgICAgICByZXR1cm4gZXJyb3I7CisKKyAgICAvKiBjbG9zZSBzdHJlYW0gaW4gY2FzZSBvZiBlcnJvciAqLworICAgIHN0cmVhbS0+Y2xvc2UoIHN0cmVhbSApOworICAgIAorICBGYWlsX1N0cmVhbToKKyAgICBGUkVFKHN0cmVhbSk7CisgIEZhaWw6CisgICAgcmV0dXJuIGVycm9yOworICB9CisKKyAgRVhQT1JUX0ZVTkMKKyAgRlRfRXJyb3IgIEZUX05ld19NZW1vcnlfRmFjZSggRlRfTGlicmFyeSAgIGxpYnJhcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgICBmaWxlX2Jhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgICBmaWxlX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgICBmYWNlX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GYWNlKiAgICAgZmFjZSApCisgIHsKKyAgICBGVF9TdHJlYW0gIHN0cmVhbTsKKyAgICBGVF9NZW1vcnkgIG1lbW9yeTsKKyAgICBGVF9FcnJvciAgIGVycm9yOworICAgIAorICAgIG1lbW9yeSA9IGxpYnJhcnktPm1lbW9yeTsKKyAgICBpZiAoIEFMTE9DKCBzdHJlYW0sIHNpemVvZigqc3RyZWFtKSApICkKKyAgICAgIGdvdG8gRmFpbDsKKyAgICAgIAorICAgIHN0cmVhbS0+bWVtb3J5ID0gbWVtb3J5OworICAgIAorICAgIEZUX05ld19NZW1vcnlfU3RyZWFtKCBsaWJyYXJ5LCAodm9pZCopZmlsZV9iYXNlLCBmaWxlX3NpemUsIHN0cmVhbSApOworICAgIAorICAgIGVycm9yID0gRlRfT3Blbl9GYWNlKCBsaWJyYXJ5LCBzdHJlYW0sIGZhY2VfaW5kZXgsIGZhY2UgKTsKKyAgICBpZiAoIWVycm9yKQorICAgICAgcmV0dXJuIGVycm9yOworCisgICAgRlJFRShzdHJlYW0pOworICBGYWlsOgorICAgIHJldHVybiBlcnJvcjsKKyAgfQorCisgIAorICBFWFBPUlRfRlVOQworICBGVF9FcnJvciAgRlRfT3Blbl9GYWNlKCBGVF9MaWJyYXJ5IGxpYnJhcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgIGZhY2VfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZhY2UqICAgYWZhY2UgKQorICB7CisgICAgRlRfRXJyb3IgICAgIGVycm9yOworICAgIEZUX0RyaXZlciAgICBkcml2ZXI7CisgICAgRlRfTWVtb3J5ICAgIG1lbW9yeTsKKyAgICBGVF9GYWNlICAgICAgZmFjZSA9IDA7CisgICAgRlRfTGlzdE5vZGUgIG5vZGUgPSAwOworCisgICAgKmFmYWNlID0gMDsKKworICAgIGlmICggIWxpYnJhcnkgfHwgIXN0cmVhbSApCisgICAgICByZXR1cm4gRlRfRXJyX0ludmFsaWRfSGFuZGxlOworCisgICAgbWVtb3J5ID0gbGlicmFyeS0+bWVtb3J5OworCisgICAgeworICAgICAgLyogY2hlY2sgZWFjaCBmb250IGRyaXZlciBmb3IgYW4gYXBwcm9wcmlhdGUgZm9ybWF0ICovCisJICBGVF9Ecml2ZXIqICBjdXIgICA9IGxpYnJhcnktPmRyaXZlcnM7CisJICBGVF9Ecml2ZXIqICBsaW1pdCA9IGN1ciArIGxpYnJhcnktPm51bV9kcml2ZXJzOworCisgICAgICBmb3IgKCA7IGN1ciA8IGxpbWl0OyBjdXIrKyApCisgICAgICB7CisgICAgICAgIGRyaXZlciA9ICpjdXI7CisgICAgICAgIGlmIChkcml2ZXItPmludGVyZmFjZS5mYWNlX29iamVjdF9zaXplKQorICAgICAgICB7CisgICAgICAgICAgZXJyb3IgPSBvcGVuX2ZhY2UoIGRyaXZlciwgc3RyZWFtLCBmYWNlX2luZGV4LCAmZmFjZSApOworICAgICAgICAgIGlmICggIWVycm9yICkKKyAgICAgICAgICAgIGdvdG8gU3VjY2VzczsKKworICAgICAgICAgIGlmICggZXJyb3IgIT0gRlRfRXJyX1Vua25vd25fRmlsZV9Gb3JtYXQgKQorICAgICAgICAgICAgZ290byBCYWRfUmVzb3VyY2U7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLyogbm8gZHJpdmVyIGlzIGFibGUgdG8gaGFuZGxlIHRoaXMgZm9ybWF0ICovCisgICAgICBlcnJvciA9IEZUX0Vycl9Vbmtub3duX0ZpbGVfRm9ybWF0OworICAgICAgZ290byBCYWRfUmVzb3VyY2U7CisgICAgfQorCisgIFN1Y2Nlc3M6CisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogaWYgd2Ugd2VyZSBzaW1wbHkgY2hlY2tpbmcgdGhlIGZvbnQgZm9ybWF0LCBkaXNjYXJkIHRoZSBmYWNlICovCisgICAgLyogb2JqZWN0LCB0aGVuIHJldHVybiBzdWNjZXNzZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgaWYgKCBmYWNlX2luZGV4IDwgMCApCisgICAgeworICAgICAgZHJpdmVyLT5pbnRlcmZhY2UuZG9uZV9mYWNlKCBmYWNlICk7CisgICAgICBGUkVFKCBmYWNlICk7CisgICAgICBnb3RvIEV4aXQ7CisgICAgfQorCisgICAgRlRfVFJBQ0U0KCggIkZUX05ld19GYWNlOiBOZXcgZmFjZSBvYmplY3QsIGFkZGluZyB0byBsaXN0XG4iICkpOworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogT3RoZXJ3aXNlIGFkZCB0aGUgZmFjZSBvYmplY3QgdG8gaXRzIGRyaXZlcidzIGxpc3QgICAgICAgICAgICovCisgICAgaWYgKCBBTExPQyggbm9kZSwgc2l6ZW9mICggKm5vZGUgKSApICkKKyAgICAgIGdvdG8gRmFpbDsKKworICAgIG5vZGUtPmRhdGEgPSBmYWNlOworICAgIEZUX0xpc3RfQWRkKCAmZHJpdmVyLT5mYWNlc19saXN0LCBub2RlICk7CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiBub3cgYWxsb2NhdGUgYSBnbHlwaCBzbG90IG9iamVjdCBmb3IgdGhlIGZhY2UgICAgICAgICAgICAgICAgKi8KKyAgICB7CisgICAgICBGVF9HbHlwaFNsb3QgIHNsb3Q7CisKKyAgICAgIEZUX1RSQUNFNCgoICJGVF9PcGVuX0ZhY2U6IENyZWF0aW5nIGdseXBoIHNsb3RcbiIgKSk7CisgICAgICBlcnJvciA9IEZUX05ld19HbHlwaFNsb3QoIGZhY2UsICZzbG90ICk7CisgICAgICBpZiAoIGVycm9yICkgZ290byBGYWlsOworICAgIH0KKyAgICAKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiBmaW5hbGx5IGFsbG9jYXRlIGEgc2l6ZSBvYmplY3QgZm9yIHRoZSBmYWNlICAgICAgICAgICAgICAgICAgKi8KKyAgICB7CisgICAgICBGVF9TaXplICBzaXplOworCisgICAgICBGVF9UUkFDRTQoKCAiRlRfT3Blbl9GYWNlOiBDcmVhdGluZyBzaXplIG9iamVjdFxuIiApKTsKKyAgICAgIGVycm9yID0gRlRfTmV3X1NpemUoIGZhY2UsICZzaXplICk7CisgICAgICBpZiAoIGVycm9yICkgZ290byBGYWlsOworICAgIH0KKyAgICAKKyAgICAqYWZhY2UgPSBmYWNlOworICAgIGdvdG8gRXhpdDsKKworICBGYWlsOgorICAgIEZUX0RvbmVfRmFjZSggZmFjZSApOworCisgIEJhZF9SZXNvdXJjZToKKyAgICAKKyAgRXhpdDoKKyAgICBGVF9UUkFDRTQoKCAiRlRfT3Blbl9GYWNlOiBSZXR1cm4gJWRcbiIsIGVycm9yICkpOworICAgIHJldHVybiBlcnJvcjsKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfRG9uZV9GYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRGlzY2FyZHMgYSBnaXZlbiBmYWNlIG9iamVjdCwgYXMgd2VsbCBhcyBhbGwgb2YgaXRzIGNoaWxkIHNsb3RzICAgICovCisgIC8qICAgIGFuZCBzaXplcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZhY2UgOjogQSBoYW5kbGUgdG8gYSB0YXJnZXQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgRVhQT1JUX0ZVTkMKKyAgRlRfRXJyb3IgIEZUX0RvbmVfRmFjZSggRlRfRmFjZSAgZmFjZSApCisgIHsKKyAgICBGVF9FcnJvciAgICAgICAgICAgICBlcnJvcjsKKyAgICBGVF9Ecml2ZXIgICAgICAgICAgICBkcml2ZXI7CisgICAgRlRfTWVtb3J5ICAgICAgICAgICAgbWVtb3J5OworICAgIEZUX0RyaXZlckludGVyZmFjZSogIGludGVyZmFjZTsKKyAgICBGVF9MaXN0Tm9kZSAgICAgICAgICBub2RlOworCisKKyAgICBpZiAoIWZhY2UgfHwgIWZhY2UtPmRyaXZlciApCisgICAgICByZXR1cm4gRlRfRXJyX0ludmFsaWRfRmFjZV9IYW5kbGU7CisKKyAgICBkcml2ZXIgICAgPSBmYWNlLT5kcml2ZXI7CisgICAgaW50ZXJmYWNlID0gJmRyaXZlci0+aW50ZXJmYWNlOworICAgIG1lbW9yeSAgICA9IGRyaXZlci0+bWVtb3J5OworCisgICAgLyogZmluZCBmYWNlIGluIGRyaXZlcidzIGxpc3QgKi8KKyAgICBub2RlID0gRlRfTGlzdF9GaW5kKCAmZHJpdmVyLT5mYWNlc19saXN0LCBmYWNlICk7CisgICAgaWYgKCBub2RlICkKKyAgICB7CisgICAgICAvKiByZW1vdmUgZmFjZSBvYmplY3QgZnJvbSB0aGUgZHJpdmVyJ3MgbGlzdCAqLworICAgICAgRlRfTGlzdF9SZW1vdmUoICZkcml2ZXItPmZhY2VzX2xpc3QsIG5vZGUgKTsKKyAgICAgIEZSRUUoIG5vZGUgKTsKKworICAgICAgLyogbm93IGRlc3Ryb3kgdGhlIG9iamVjdCBwcm9wZXIgKi8KKyAgICAgIGRlc3Ryb3lfZmFjZSggbWVtb3J5LCBmYWNlLCBkcml2ZXIgKTsKKyAgICAgIGVycm9yID0gRlRfRXJyX09rOworICAgIH0KKyAgICBlbHNlCisgICAgICBlcnJvciA9IEZUX0Vycl9JbnZhbGlkX0ZhY2VfSGFuZGxlOworCisgICAgcmV0dXJuIGVycm9yOworICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9OZXdfU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBDcmVhdGVzIGEgbmV3IHNpemUgb2JqZWN0IGZyb20gYSBnaXZlbiBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBmYWNlIDo6IEEgaGFuZGxlIHRvIGEgcGFyZW50IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzaXplIDo6IEEgaGFuZGxlIHRvIGEgbmV3IHNpemUgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBFcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEVYUE9SVF9GVU5DCisgIEZUX0Vycm9yICBGVF9OZXdfU2l6ZSggRlRfRmFjZSAgIGZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU2l6ZSogIGFzaXplICkKKyAgeworICAgIEZUX0Vycm9yICAgICAgICAgICAgIGVycm9yOworICAgIEZUX01lbW9yeSAgICAgICAgICAgIG1lbW9yeTsKKyAgICBGVF9Ecml2ZXIgICAgICAgICAgICBkcml2ZXI7CisgICAgRlRfRHJpdmVySW50ZXJmYWNlKiAgaW50ZXJmYWNlOworCisgICAgRlRfU2l6ZSAgICAgICAgICAgICAgc2l6ZSA9IDA7CisgICAgRlRfTGlzdE5vZGUgICAgICAgICAgbm9kZSA9IDA7CisKKworICAgIGlmICggIWZhY2UgfHwgIWZhY2UtPmRyaXZlciApCisgICAgICByZXR1cm4gRlRfRXJyX0ludmFsaWRfRmFjZV9IYW5kbGU7CisKKyAgICAqYXNpemUgICAgPSAwOworICAgIGRyaXZlciAgICA9IGZhY2UtPmRyaXZlcjsKKyAgICBpbnRlcmZhY2UgPSAmZHJpdmVyLT5pbnRlcmZhY2U7CisgICAgbWVtb3J5ICAgID0gZmFjZS0+bWVtb3J5OworCisgICAgLyogQWxsb2NhdGUgbmV3IHNpemUgb2JqZWN0IGFuZCBwZXJmb3JtIGJhc2ljIGluaXRpYWxpc2F0aW9uICovCisgICAgaWYgKCBBTExPQyggc2l6ZSwgaW50ZXJmYWNlLT5zaXplX29iamVjdF9zaXplICkgfHwKKyAgICAgICAgIEFMTE9DKCBub2RlLCBzaXplb2YgKCBGVF9MaXN0Tm9kZVJlYyApICAgKSApCisgICAgICBnb3RvIEV4aXQ7CisKKyAgICBzaXplLT5mYWNlID0gZmFjZTsKKworICAgIGVycm9yID0gaW50ZXJmYWNlLT5pbml0X3NpemUoIHNpemUgKTsKKworICAgIC8qIGluIGNhc2Ugb2Ygc3VjY2VzcywgYWRkIHRvIHRoZSBmYWNlJ3MgbGlzdCAqLworICAgIGlmICggIWVycm9yICkKKyAgICB7CisgICAgICAqYXNpemUgICAgID0gc2l6ZTsKKyAgICAgIG5vZGUtPmRhdGEgPSBzaXplOworICAgICAgRlRfTGlzdF9BZGQoICZmYWNlLT5zaXplc19saXN0LCBub2RlICk7CisgICAgICAKKyAgICAgIC8qIHJlY29yZCBhcyBjdXJyZW50IHNpemUgZm9yIHRoZSBmYWNlICovCisgICAgICBmYWNlLT5zaXplID0gc2l6ZTsKKyAgICB9CisKKyAgRXhpdDoKKyAgICBpZiAoIGVycm9yICkKKyAgICB7CisgICAgICBGUkVFKCBub2RlICk7CisgICAgICBGUkVFKCBzaXplICk7CisgICAgfQorCisgICAgcmV0dXJuIGVycm9yOworICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9Eb25lX1NpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBEaXNjYXJkcyBhIGdpdmVuIHNpemUgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzaXplIDo6IEEgaGFuZGxlIHRvIGEgdGFyZ2V0IHNpemUgb2JqZWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBFcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEVYUE9SVF9GVU5DCisgIEZUX0Vycm9yICBGVF9Eb25lX1NpemUoIEZUX1NpemUgIHNpemUgKQorICB7CisgICAgRlRfRXJyb3IgICAgIGVycm9yOworICAgIEZUX0RyaXZlciAgICBkcml2ZXI7CisgICAgRlRfTWVtb3J5ICAgIG1lbW9yeTsKKyAgICBGVF9GYWNlICAgICAgZmFjZTsKKyAgICBGVF9MaXN0Tm9kZSAgbm9kZTsKKworCisgICAgaWYgKCAhc2l6ZSB8fCAhc2l6ZS0+ZmFjZSApCisgICAgICByZXR1cm4gRlRfRXJyX0ludmFsaWRfU2l6ZV9IYW5kbGU7CisKKyAgICBkcml2ZXIgPSBzaXplLT5mYWNlLT5kcml2ZXI7CisgICAgaWYgKCAhZHJpdmVyICkKKyAgICAgIHJldHVybiBGVF9FcnJfSW52YWxpZF9Ecml2ZXJfSGFuZGxlOworCisgICAgbWVtb3J5ID0gZHJpdmVyLT5tZW1vcnk7CisKKyAgICBlcnJvciA9IEZUX0Vycl9PazsKKyAgICBmYWNlICA9IHNpemUtPmZhY2U7CisgICAgbm9kZSAgPSBGVF9MaXN0X0ZpbmQoICZmYWNlLT5zaXplc19saXN0LCBzaXplICk7CisgICAgaWYgKCBub2RlICkKKyAgICB7CisgICAgICBGVF9MaXN0X1JlbW92ZSggJmZhY2UtPnNpemVzX2xpc3QsIG5vZGUgKTsKKyAgICAgIEZSRUUoIG5vZGUgKTsKKworICAgICAgaWYgKGZhY2UtPnNpemUgPT0gc2l6ZSkKKyAgICAgIHsKKyAgICAgICAgZmFjZS0+c2l6ZSA9IDA7CisgICAgICAgIGlmIChmYWNlLT5zaXplc19saXN0LmhlYWQpCisgICAgICAgICAgZmFjZS0+c2l6ZSA9IChGVF9TaXplKShmYWNlLT5zaXplc19saXN0LmhlYWQtPmRhdGEpOworICAgICAgfQorCisgICAgICBkZXN0cm95X3NpemUoIG1lbW9yeSwgc2l6ZSwgZHJpdmVyICk7CisgICAgfQorICAgIGVsc2UKKyAgICAgIGVycm9yID0gRlRfRXJyX0ludmFsaWRfU2l6ZV9IYW5kbGU7CisKKyAgICByZXR1cm4gRlRfRXJyX09rOworICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9TZXRfQ2hhcl9TaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBTZXRzIHRoZSBjaGFyYWN0ZXIgZGltZW5zaW9ucyBvZiBhIGdpdmVuIHNpemUgb2JqZWN0LiAgVGhlICAgICAgICAgKi8KKyAgLyogICAgYGNoYXJfc2l6ZScgdmFsdWUgaXMgdXNlZCBmb3IgdGhlIHdpZHRoIGFuZCBoZWlnaHQsIGV4cHJlc3NlZCBpbiAgICovCisgIC8qICAgIDI2LjYgZnJhY3Rpb25hbCBwb2ludHMuICAxIHBvaW50ID0gMS83MiBpbmNoLiAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHNpemUgICAgICA6OiBBIGhhbmRsZSB0byBhIHRhcmdldCBzaXplIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBjaGFyX3NpemUgOjogVGhlIGNoYXJhY3RlciBzaXplLCBpbiAyNi42IGZyYWN0aW9uYWwgcG9pbnRzLiAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBFcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBXaGVuIGRlYWxpbmcgd2l0aCBmaXhlZC1zaXplIGZhY2VzIChpLmUuLCBub24tc2NhbGFibGUgZm9ybWF0cyksICAgKi8KKyAgLyogICAgdXNlIHRoZSBmdW5jdGlvbiBGVF9TZXRfUGl4ZWxfU2l6ZXMoKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBFWFBPUlRfRlVOQworICBGVF9FcnJvciAgRlRfU2V0X0NoYXJfU2l6ZSggRlRfRmFjZSAgICAgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0YyNkRvdDYgIGNoYXJfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GMjZEb3Q2ICBjaGFyX2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgIGhvcnpfcmVzb2x1dGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgIHZlcnRfcmVzb2x1dGlvbiApCisgIHsKKyAgICBGVF9FcnJvciAgICAgICAgICAgICBlcnJvcjsKKyAgICBGVF9Ecml2ZXIgICAgICAgICAgICBkcml2ZXI7CisgICAgRlRfTWVtb3J5ICAgICAgICAgICAgbWVtb3J5OworICAgIEZUX0RyaXZlckludGVyZmFjZSogIGludGVyZmFjZTsKKworICAgIGlmICggIWZhY2UgfHwgIWZhY2UtPnNpemUgfHwgIWZhY2UtPmRyaXZlcikKKyAgICAgIHJldHVybiBGVF9FcnJfSW52YWxpZF9GYWNlX0hhbmRsZTsKKworICAgIGlmICghY2hhcl93aWR0aCkKKyAgICAgIGNoYXJfd2lkdGggPSBjaGFyX2hlaWdodDsKKyAgICAgIAorICAgIGVsc2UgaWYgKCFjaGFyX2hlaWdodCkKKyAgICAgIGNoYXJfaGVpZ2h0ID0gY2hhcl93aWR0aDsKKyAgICAgIAorICAgIGlmICghaG9yel9yZXNvbHV0aW9uKQorICAgICAgaG9yel9yZXNvbHV0aW9uID0gNzI7CisgICAgICAKKyAgICBpZiAoIXZlcnRfcmVzb2x1dGlvbikKKyAgICAgIHZlcnRfcmVzb2x1dGlvbiA9IDcyOworCisgICAgZHJpdmVyICAgID0gZmFjZS0+ZHJpdmVyOworICAgIGludGVyZmFjZSA9ICZkcml2ZXItPmludGVyZmFjZTsKKyAgICBtZW1vcnkgICAgPSBkcml2ZXItPm1lbW9yeTsKKworICAgIGVycm9yID0gaW50ZXJmYWNlLT5zZXRfY2hhcl9zaXplcyggZmFjZS0+c2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyX2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvcnpfcmVzb2x1dGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnRfcmVzb2x1dGlvbiApOworICAgIHJldHVybiBlcnJvcjsKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfU2V0X1BpeGVsX1NpemVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgU2V0cyB0aGUgY2hhcmFjdGVyIGRpbWVuc2lvbnMgb2YgYSBnaXZlbiBzaXplIG9iamVjdC4gIFRoZSB3aWR0aCAgICovCisgIC8qICAgIGFuZCBoZWlnaHQgYXJlIGV4cHJlc3NlZCBpbiBpbnRlZ2VyIHBpeGVscy4gICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHNpemUgICAgICAgICA6OiBBIGhhbmRsZSB0byBhIHRhcmdldCBzaXplIG9iamVjdC4gICAgICAgICAgICAgICAgICAqLworICAvKiAgICBwaXhlbF93aWR0aCAgOjogVGhlIGNoYXJhY3RlciB3aWR0aCwgaW4gaW50ZWdlciBwaXhlbHMuICAgICAgICAgICAgKi8KKyAgLyogICAgcGl4ZWxfaGVpZ2h0IDo6IFRoZSBjaGFyYWN0ZXIgaGVpZ2h0LCBpbiBpbnRlZ2VyIHBpeGVscy4gICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBFWFBPUlRfRlVOQworICBGVF9FcnJvciAgRlRfU2V0X1BpeGVsX1NpemVzKCBGVF9GYWNlICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICBwaXhlbF93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgcGl4ZWxfaGVpZ2h0ICkKKyAgeworICAgIEZUX0Vycm9yICAgICAgICAgICAgIGVycm9yOworICAgIEZUX0RyaXZlciAgICAgICAgICAgIGRyaXZlcjsKKyAgICBGVF9NZW1vcnkgICAgICAgICAgICBtZW1vcnk7CisgICAgRlRfRHJpdmVySW50ZXJmYWNlKiAgaW50ZXJmYWNlOworCisgICAgaWYgKCAhZmFjZSB8fCAhZmFjZS0+c2l6ZSB8fCAhZmFjZS0+ZHJpdmVyICkKKyAgICAgIHJldHVybiBGVF9FcnJfSW52YWxpZF9GYWNlX0hhbmRsZTsKKworICAgIGRyaXZlciAgICA9IGZhY2UtPmRyaXZlcjsKKyAgICBpbnRlcmZhY2UgPSAmZHJpdmVyLT5pbnRlcmZhY2U7CisgICAgbWVtb3J5ICAgID0gZHJpdmVyLT5tZW1vcnk7CisKKyAgICBlcnJvciA9IGludGVyZmFjZS0+c2V0X3BpeGVsX3NpemVzKCBmYWNlLT5zaXplLCBwaXhlbF93aWR0aCwgcGl4ZWxfaGVpZ2h0ICk7CisKKyAgICByZXR1cm4gZXJyb3I7CisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX05ld19HbHlwaFNsb3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEl0IGlzIHNvbWV0aW1lcyB1c2VmdWwgdG8gaGF2ZSBtb3JlIHRoYW4gb25lIGdseXBoIHNsb3QgZm9yIGEgICAgICAqLworICAvKiAgICBnaXZlbiBmYWNlIG9iamVjdC4gIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBjcmVhdGUgYWRkaXRpb25hbCAgICAgKi8KKyAgLyogICAgc2xvdHMuICBBbGwgb2YgdGhlbSBhcmUgYXV0b21hdGljYWxseSBkaXNjYXJkZWQgd2hlbiB0aGUgZmFjZSBpcyAgICovCisgIC8qICAgIGRlc3Ryb3llZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZhY2UgIDo6IEEgaGFuZGxlIHRvIGEgcGFyZW50IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGFzbG90IDo6IEEgaGFuZGxlIHRvIGEgbmV3IGdseXBoIHNsb3Qgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgRVhQT1JUX0ZVTkMKKyAgRlRfRXJyb3IgIEZUX05ld19HbHlwaFNsb3QoIEZUX0ZhY2UgICAgICAgIGZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9HbHlwaFNsb3QqICBhc2xvdCApCisgIHsKKyAgICBGVF9FcnJvciAgICAgICAgICAgICBlcnJvcjsKKyAgICBGVF9Ecml2ZXIgICAgICAgICAgICBkcml2ZXI7CisgICAgRlRfRHJpdmVySW50ZXJmYWNlKiAgaW50ZXJmYWNlOworICAgIEZUX01lbW9yeSAgICAgICAgICAgIG1lbW9yeTsKKyAgICBGVF9HbHlwaFNsb3QgICAgICAgICBzbG90OworCisKKyAgICAqYXNsb3QgPSAwOworCisgICAgaWYgKCAhZmFjZSB8fCAhZmFjZS0+ZHJpdmVyICkKKyAgICAgIHJldHVybiBGVF9FcnJfSW52YWxpZF9GYWNlX0hhbmRsZTsKKworICAgIGRyaXZlciAgICA9IGZhY2UtPmRyaXZlcjsKKyAgICBpbnRlcmZhY2UgPSAmZHJpdmVyLT5pbnRlcmZhY2U7CisgICAgbWVtb3J5ICAgID0gZHJpdmVyLT5tZW1vcnk7CisKKyAgICBGVF9UUkFDRTQoKCAiRlRfTmV3X0dseXBoU2xvdDogQ3JlYXRpbmcgbmV3IHNsb3Qgb2JqZWN0XG4iICkpOworICAgIGlmICggQUxMT0MoIHNsb3QsIGludGVyZmFjZS0+c2xvdF9vYmplY3Rfc2l6ZSApICkKKyAgICAgIGdvdG8gRXhpdDsKKworICAgIHNsb3QtPmZhY2UgPSBmYWNlOworICAgIAorICAgIHNsb3QtPm1heF9zdWJnbHlwaHMgPSAwOworICAgIHNsb3QtPm51bV9zdWJnbHlwaHMgPSAwOworICAgIHNsb3QtPnN1YmdseXBocyAgICAgPSAwOworCisgICAgZXJyb3IgPSBpbnRlcmZhY2UtPmluaXRfZ2x5cGhfc2xvdCggc2xvdCApOworICAgIGlmICggIWVycm9yICkKKyAgICB7CisgICAgICAvKiBpbiBjYXNlIG9mIHN1Y2Nlc3MsIGFkZCBzbG90IHRvIHRoZSBmYWNlJ3MgbGlzdCAqLworICAgICAgc2xvdC0+bmV4dCAgPSBmYWNlLT5nbHlwaDsKKyAgICAgIGZhY2UtPmdseXBoID0gc2xvdDsKKyAgICAgICphc2xvdCAgICAgID0gc2xvdDsKKyAgICB9CisKKyAgICBpZiAoIGVycm9yICkKKyAgICAgIEZSRUUoIHNsb3QgKTsKKworICBFeGl0OgorICAgIEZUX1RSQUNFNCgoICJGVF9OZXdfR2x5cGhTbG90OiBSZXR1cm4gJWRcbiIsIGVycm9yICkpOworICAgIHJldHVybiBlcnJvcjsKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfRG9uZV9HbHlwaFNsb3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRGVzdHJveXMgYSBnaXZlbiBnbHlwaCBzbG90LiAgUmVtZW1iZXIgaG93ZXZlciB0aGF0IGFsbCBzbG90cyBhcmUgICovCisgIC8qICAgIGF1dG9tYXRpY2FsbHkgZGVzdHJveWVkIHdpdGggaXRzIHBhcmVudC4gIFVzaW5nIHRoaXMgZnVuY3Rpb24gaXMgICAqLworICAvKiAgICBub3QgYWx3YXlzIG1hbmRhdG9yeS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzbG90IDo6IEEgaGFuZGxlIHRvIGEgdGFyZ2V0IGdseXBoIHNsb3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEVYUE9SVF9GVU5DCisgIHZvaWQgIEZUX0RvbmVfR2x5cGhTbG90KCBGVF9HbHlwaFNsb3QgIHNsb3QgKQorICB7CisgICAgaWYgKHNsb3QpCisgICAgeworICAgICAgRlRfRHJpdmVyICAgICAgZHJpdmVyID0gc2xvdC0+ZmFjZS0+ZHJpdmVyOworICAgICAgRlRfTWVtb3J5ICAgICAgbWVtb3J5ID0gZHJpdmVyLT5tZW1vcnk7CisgICAgICBGVF9HbHlwaFNsb3QqICBwYXJlbnQ7CisgICAgICBGVF9HbHlwaFNsb3QgICBjdXI7CisKKworICAgICAgLyogUmVtb3ZlIHNsb3QgZnJvbSBpdHMgcGFyZW50IGZhY2UncyBsaXN0ICovCisgICAgICBwYXJlbnQgPSAmc2xvdC0+ZmFjZS0+Z2x5cGg7CisgICAgICBjdXIgICAgPSAqcGFyZW50OworICAgICAgd2hpbGUgKCBjdXIgKQorICAgICAgeworICAgICAgICBpZiAoIGN1ciA9PSBzbG90ICkKKyAgICAgICAgeworICAgICAgICAgICpwYXJlbnQgPSBjdXItPm5leHQ7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY3VyID0gY3VyLT5uZXh0OworICAgICAgfQorCisgICAgICBkcml2ZXItPmludGVyZmFjZS5kb25lX2dseXBoX3Nsb3QoIHNsb3QgKTsKKyAgICAgIEZSRUUoIHNsb3QgKTsKKyAgICB9CisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0xvYWRfR2x5cGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgZnVuY3Rpb24gdXNlZCB0byBsb2FkIGEgc2luZ2xlIGdseXBoIHdpdGhpbiBhIGdpdmVuIGdseXBoIHNsb3QsICAqLworICAvKiAgICBmb3IgYSBnaXZlbiBzaXplLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzbG90ICAgICAgICA6OiBBIGhhbmRsZSB0byBhIHRhcmdldCBzbG90IG9iamVjdCB3aGVyZSB0aGUgZ2x5cGggICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgd2lsbCBiZSBsb2FkZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzaXplICAgICAgICA6OiBBIGhhbmRsZSB0byB0aGUgc291cmNlIGZhY2Ugc2l6ZSBhdCB3aGljaCB0aGUgZ2x5cGggKi8KKyAgLyogICAgICAgICAgICAgICAgICAgbXVzdCBiZSBzY2FsZWQvbG9hZGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBnbHlwaF9pbmRleCA6OiBUaGUgaW5kZXggb2YgdGhlIGdseXBoIGluIHRoZSBmb250IGZpbGUuICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGxvYWRfZmxhZ3MgIDo6IEEgZmxhZyBpbmRpY2F0aW5nIHdoYXQgdG8gbG9hZCBmb3IgdGhpcyBnbHlwaC4gIFRoZSAqLworICAvKiAgICAgICAgICAgICAgICAgICBGVF9MT0FEX1hYWCBjb25zdGFudHMgY2FuIGJlIHVzZWQgdG8gY29udHJvbCB0aGUgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgZ2x5cGggbG9hZGluZyBwcm9jZXNzIChlLmcuLCB3aGV0aGVyIHRoZSBvdXRsaW5lICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgIHNob3VsZCBiZSBzY2FsZWQsIHdoZXRoZXIgdG8gbG9hZCBiaXRtYXBzIG9yIG5vdCwgICAqLworICAvKiAgICAgICAgICAgICAgICAgICB3aGV0aGVyIHRvIGhpbnQgdGhlIG91dGxpbmUsIGV0YykuICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHJlc3VsdCAgICAgIDo6IEEgc2V0IG9mIGJpdCBmbGFncyBpbmRpY2F0aW5nIHRoZSB0eXBlIG9mIGRhdGEgdGhhdCAqLworICAvKiAgICAgICAgICAgICAgICAgICB3YXMgbG9hZGVkIGluIHRoZSBnbHlwaCBzbG90IChvdXRsaW5lIG9yIGJpdG1hcCwgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgZXRjKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICBZb3UgY2FuIHNldCB0aGlzIGZpZWxkIHRvIDAgaWYgeW91IGRvbid0IHdhbnQgdGhpcyAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgaW5mb3JtYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBFWFBPUlRfRlVOQworICBGVF9FcnJvciAgRlRfTG9hZF9HbHlwaCggRlRfRmFjZSAgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgIGdseXBoX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgbG9hZF9mbGFncyApCisgIHsKKyAgICBGVF9FcnJvciAgIGVycm9yOworICAgIEZUX0RyaXZlciAgZHJpdmVyOworCisgICAgaWYgKCAhZmFjZSB8fCAhZmFjZS0+c2l6ZSB8fCAhZmFjZS0+Z2x5cGggKQorICAgICAgcmV0dXJuIEZUX0Vycl9JbnZhbGlkX0ZhY2VfSGFuZGxlOworCisgICAgZHJpdmVyID0gZmFjZS0+ZHJpdmVyOworCisgICAgZXJyb3IgPSBkcml2ZXItPmludGVyZmFjZS5sb2FkX2dseXBoKCBmYWNlLT5nbHlwaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2UtPnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaF9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRfZmxhZ3MgKTsKKworICAgIHJldHVybiBlcnJvcjsKKyAgfQorCisKKyAgRVhQT1JUX0ZVTkMKKyAgRlRfRXJyb3IgIEZUX0xvYWRfQ2hhciggRlRfRmFjZSAgIGZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICBjaGFyX2NvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICBsb2FkX2ZsYWdzICkKKyAgeworICAgIEZUX0Vycm9yICAgZXJyb3I7CisgICAgRlRfRHJpdmVyICBkcml2ZXI7CisgICAgRlRfVUludCAgICBnbHlwaF9pbmRleDsKKyAgICAKKyAgICBpZiAoIWZhY2UgfHwgIWZhY2UtPnNpemUgfHwgIWZhY2UtPmdseXBoIHx8ICFmYWNlLT5jaGFybWFwICkKKyAgICAgIHJldHVybiBGVF9FcnJfSW52YWxpZF9GYWNlX0hhbmRsZTsKKyAgICAgIAorICAgIGRyaXZlciAgICAgID0gZmFjZS0+ZHJpdmVyOworICAgIGdseXBoX2luZGV4ID0gRlRfR2V0X0NoYXJfSW5kZXgoIGZhY2UsIGNoYXJfY29kZSApOworICAgIAorICAgIGlmIChnbHlwaF9pbmRleCA9PSAwKQorICAgICAgZXJyb3IgPSBGVF9FcnJfSW52YWxpZF9DaGFyYWN0ZXJfQ29kZTsKKyAgICBlbHNlCisgICAgICBlcnJvciA9IGRyaXZlci0+aW50ZXJmYWNlLmxvYWRfZ2x5cGgoIGZhY2UtPmdseXBoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlLT5zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaF9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZF9mbGFncyApOworICAgIHJldHVybiBlcnJvcjsKKyAgfQorCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0dldF9LZXJuaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFJldHVybnMgdGhlIGtlcm5pbmcgdmVjdG9yIGJldHdlZW4gdHdvIGdseXBocyBvZiBhIHNhbWUgZmFjZS4gICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZhY2UgICAgICAgIDo6IEEgaGFuZGxlIHRvIGEgc291cmNlIGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbGVmdF9nbHlwaCAgOjogVGhlIGluZGV4IG9mIHRoZSBsZWZ0IGdseXBoIGluIHRoZSBrZXJuIHBhaXIuICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICByaWdodF9nbHlwaCA6OiBUaGUgaW5kZXggb2YgdGhlIHJpZ2h0IGdseXBoIGluIHRoZSBrZXJuIHBhaXIuICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBrZXJuaW5nICAgICA6OiBUaGUga2VybmluZyB2ZWN0b3IuICBUaGlzIGlzIGluIGZvbnQgdW5pdHMgZm9yICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgc2NhbGFibGUgZm9ybWF0cywgYW5kIGluIHBpeGVscyBmb3IgZml4ZWQtc2l6ZXMgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgIGZvcm1hdHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIE9ubHkgaG9yaXpvbnRhbCBsYXlvdXRzIChsZWZ0LXRvLXJpZ2h0ICYgcmlnaHQtdG8tbGVmdCkgYXJlICAgICAgICAqLworICAvKiAgICBzdXBwb3J0ZWQgYnkgdGhpcyBtZXRob2QuICBPdGhlciBsYXlvdXRzLCBvciBtb3JlIHNvcGhpc3RpY2F0ZWQgICAgKi8KKyAgLyogICAga2VybmluZ3MsIGFyZSBvdXQgb2YgdGhlIHNjb3BlIG9mIHRoaXMgQVBJIGZ1bmN0aW9uIC0tIHRoZXkgY2FuIGJlICovCisgIC8qICAgIGltcGxlbWVudGVkIHRocm91Z2ggZm9ybWF0LXNwZWNpZmljIGludGVyZmFjZXMuICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgRVhQT1JUX0ZVTkMKKyAgRlRfRXJyb3IgIEZUX0dldF9LZXJuaW5nKCBGVF9GYWNlICAgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgIGxlZnRfZ2x5cGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgcmlnaHRfZ2x5cGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVmVjdG9yKiAga2VybmluZyApCisgIHsKKyAgICBGVF9FcnJvciAgIGVycm9yOworICAgIEZUX0RyaXZlciAgZHJpdmVyOworICAgIEZUX01lbW9yeSAgbWVtb3J5OworCisKKyAgICBpZiAoICFmYWNlICkKKyAgICB7CisgICAgICBlcnJvciA9IEZUX0Vycl9JbnZhbGlkX0ZhY2VfSGFuZGxlOworICAgICAgZ290byBFeGl0OworICAgIH0KKworICAgIGRyaXZlciA9IGZhY2UtPmRyaXZlcjsKKyAgICBtZW1vcnkgPSBkcml2ZXItPm1lbW9yeTsKKworICAgIGlmICggZHJpdmVyLT5pbnRlcmZhY2UuZ2V0X2tlcm5pbmcgKQorICAgIHsKKyAgICAgIGVycm9yID0gZHJpdmVyLT5pbnRlcmZhY2UuZ2V0X2tlcm5pbmcoIGZhY2UsIGxlZnRfZ2x5cGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaWdodF9nbHlwaCwga2VybmluZyApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAga2VybmluZy0+eCA9IDA7CisgICAgICBrZXJuaW5nLT55ID0gMDsKKyAgICAgIGVycm9yICAgICAgPSBGVF9FcnJfT2s7CisgICAgfQorCisgIEV4aXQ6CisgICAgcmV0dXJuIGVycm9yOworICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9HZXRfQ2hhcl9JbmRleCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBSZXR1cm5zIHRoZSBnbHlwaCBpbmRleCBvZiBhIGdpdmVuIGNoYXJhY3RlciBjb2RlLiAgVGhpcyBmdW5jdGlvbiAgKi8KKyAgLyogICAgdXNlcyBhIGNoYXJtYXAgb2JqZWN0IHRvIGRvIHRoZSB0cmFuc2xhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgY2hhcm1hcCAgOjogQSBoYW5kbGUgdG8gYSBmaWx0ZXIgY2hhcm1hcCBvYmplY3QuICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGNoYXJjb2RlIDo6IFRoZSBjaGFyYWN0ZXIgY29kZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoZSBnbHlwaCBpbmRleC4gIDAgbWVhbnMgYHVuZGVmaW5lZCBjaGFyYWN0ZXIgY29kZScuICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgRVhQT1JUX0RFRgorICBGVF9VSW50ICBGVF9HZXRfQ2hhcl9JbmRleCggRlRfRmFjZSAgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nIGNoYXJjb2RlICkKKyAgeworICAgIEZUX1VJbnQgICAgcmVzdWx0OworICAgIEZUX0RyaXZlciAgZHJpdmVyOworCisgICAgcmVzdWx0ID0gMDsKKyAgICBpZiAoIGZhY2UgJiYgZmFjZS0+Y2hhcm1hcCApCisgICAgeworICAgICAgZHJpdmVyID0gZmFjZS0+ZHJpdmVyOworICAgICAgcmVzdWx0ID0gZHJpdmVyLT5pbnRlcmZhY2UuZ2V0X2NoYXJfaW5kZXgoIGZhY2UtPmNoYXJtYXAsIGNoYXJjb2RlICk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9EZWNvbXBvc2VfT3V0bGluZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBXYWxrcyBvdmVyIGFuIG91dGxpbmUncyBzdHJ1Y3R1cmUgdG8gZGVjb21wb3NlIGl0IGludG8gaW5kaXZpZHVhbCAgKi8KKyAgLyogICAgc2VnbWVudHMgYW5kIEJlemllciBhcmNzLiAgVGhpcyBmdW5jdGlvbiBpcyBhbHNvIGFibGUgdG8gZW1pdCAgICAgICovCisgIC8qICAgIGBtb3ZlIHRvJyBhbmQgYGNsb3NlIHRvJyBvcGVyYXRpb25zIHRvIGluZGljYXRlIHRoZSBzdGFydCBhbmQgZW5kICAqLworICAvKiAgICBvZiBuZXcgY29udG91cnMgaW4gdGhlIG91dGxpbmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBvdXRsaW5lICAgOjogQSBwb2ludGVyIHRvIHRoZSBzb3VyY2UgdGFyZ2V0LiAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGludGVyZmFjZSA6OiBBIHRhYmxlIG9mIGBlbWl0dGVycycsIGkuZSwuIGZ1bmN0aW9uIHBvaW50ZXJzIGNhbGxlZCAqLworICAvKiAgICAgICAgICAgICAgICAgZHVyaW5nIGRlY29tcG9zaXRpb24gdG8gaW5kaWNhdGUgcGF0aCBvcGVyYXRpb25zLiAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHVzZXIgICAgICA6OiBBIHR5cGVsZXNzIHBvaW50ZXIgd2hpY2ggaXMgcGFzc2VkIHRvIGVhY2ggZW1pdHRlciAgICAqLworICAvKiAgICAgICAgICAgICAgICAgZHVyaW5nIHRoZSBkZWNvbXBvc2l0aW9uLiAgSXQgY2FuIGJlIHVzZWQgdG8gc3RvcmUgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgIHRoZSBzdGF0ZSBkdXJpbmcgdGhlIGRlY29tcG9zaXRpb24uICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBFWFBPUlRfRlVOQworICBpbnQgIEZUX0RlY29tcG9zZV9PdXRsaW5lKCBGVF9PdXRsaW5lKiAgICAgICAgb3V0bGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfT3V0bGluZV9GdW5jcyogIGludGVyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICAgICAgICAgIHVzZXIgKQorICB7CisgICAgdHlwZWRlZiBlbnVtIF9waGFzZXMKKyAgICB7CisgICAgICBwaGFzZV9wb2ludCwKKyAgICAgIHBoYXNlX2NvbmljLAorICAgICAgcGhhc2VfY3ViaWMsCisgICAgICBwaGFzZV9jdWJpYzIKKworICAgIH0gVFBoYXNlOworCisgICAgRlRfVmVjdG9yICB2X2ZpcnN0OworICAgIEZUX1ZlY3RvciAgdl9sYXN0OworICAgIEZUX1ZlY3RvciAgdl9jb250cm9sOworICAgIEZUX1ZlY3RvciAgdl9jb250cm9sMjsKKyAgICBGVF9WZWN0b3IgIHZfc3RhcnQ7CisKKyAgICBGVF9WZWN0b3IqIHBvaW50OworICAgIGNoYXIqICAgICAgZmxhZ3M7CisKKyAgICBpbnQgICAgbjsgICAgICAgICAvKiBpbmRleCBvZiBjb250b3VyIGluIG91dGxpbmUgICAgICovCisgICAgaW50ICAgIGZpcnN0OyAgICAgLyogaW5kZXggb2YgZmlyc3QgcG9pbnQgaW4gY29udG91ciAqLworICAgIGludCAgICBpbmRleDsgICAgIC8qIGN1cnJlbnQgcG9pbnQncyBpbmRleCAgICAgICAgICAgKi8KKworICAgIGludCAgICBlcnJvcjsKKworICAgIGNoYXIgICB0YWc7ICAgICAgIC8qIGN1cnJlbnQgcG9pbnQncyBzdGF0ZSAgICAgICAgICAgKi8KKyAgICBUUGhhc2UgcGhhc2U7CisKKworICAgIGZpcnN0ID0gMDsKKworICAgIGZvciAoIG4gPSAwOyBuIDwgb3V0bGluZS0+bl9jb250b3VyczsgbisrICkKKyAgICB7CisgICAgICBpbnQgIGxhc3Q7ICAvKiBpbmRleCBvZiBsYXN0IHBvaW50IGluIGNvbnRvdXIgKi8KKworCisgICAgICBsYXN0ID0gb3V0bGluZS0+Y29udG91cnNbbl07CisKKyAgICAgIHZfZmlyc3QgPSBvdXRsaW5lLT5wb2ludHNbZmlyc3RdOworICAgICAgdl9sYXN0ICA9IG91dGxpbmUtPnBvaW50c1tsYXN0XTsKKworICAgICAgdl9zdGFydCA9IHZfY29udHJvbCA9IHZfZmlyc3Q7CisKKyAgICAgIHRhZyAgID0gRlRfQ1VSVkVfVEFHKCBvdXRsaW5lLT5mbGFnc1tmaXJzdF0gKTsKKyAgICAgIGluZGV4ID0gZmlyc3Q7CisKKyAgICAgIC8qIEEgY29udG91ciBjYW5ub3Qgc3RhcnQgd2l0aCBhIGN1YmljIGNvbnRyb2wgcG9pbnQhICovCisKKyAgICAgIGlmICggdGFnID09IEZUX0N1cnZlX1RhZ19DdWJpYyApCisgICAgICAgIHJldHVybiBGVF9FcnJfSW52YWxpZF9PdXRsaW5lOworCisKKyAgICAgIC8qIGNoZWNrIGZpcnN0IHBvaW50IHRvIGRldGVybWluZSBvcmlnaW4gKi8KKworICAgICAgaWYgKCB0YWcgPT0gRlRfQ3VydmVfVGFnX0NvbmljICkKKyAgICAgIHsKKyAgICAgICAgLyogZmlyc3QgcG9pbnQgaXMgY29uaWMgY29udHJvbC4gIFllcywgdGhpcyBoYXBwZW5zLiAqLworICAgICAgICBpZiAoIEZUX0NVUlZFX1RBRyggb3V0bGluZS0+ZmxhZ3NbbGFzdF0gKSA9PSBGVF9DdXJ2ZV9UYWdfT24gKQorICAgICAgICB7CisgICAgICAgICAgLyogc3RhcnQgYXQgbGFzdCBwb2ludCBpZiBpdCBpcyBvbiB0aGUgY3VydmUgKi8KKyAgICAgICAgICB2X3N0YXJ0ID0gdl9sYXN0OworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIC8qIGlmIGJvdGggZmlyc3QgYW5kIGxhc3QgcG9pbnRzIGFyZSBjb25pYywgICAgICAgICAqLworICAgICAgICAgIC8qIHN0YXJ0IGF0IHRoZWlyIG1pZGRsZSBhbmQgcmVjb3JkIGl0cyBwb3NpdGlvbiAgICAqLworICAgICAgICAgIC8qIGZvciBjbG9zdXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgIHZfc3RhcnQueCA9ICggdl9zdGFydC54ICsgdl9sYXN0LnggKSAvIDI7CisgICAgICAgICAgdl9zdGFydC55ID0gKCB2X3N0YXJ0LnkgKyB2X2xhc3QueSApIC8gMjsKKworICAgICAgICAgIHZfbGFzdCA9IHZfc3RhcnQ7CisgICAgICAgIH0KKyAgICAgICAgcGhhc2UgPSBwaGFzZV9jb25pYzsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgcGhhc2UgPSBwaGFzZV9wb2ludDsKKworCisgICAgICAvKiBCZWdpbiBhIG5ldyBjb250b3VyIHdpdGggTU9WRV9UTyAqLworCisgICAgICBlcnJvciA9IGludGVyZmFjZS0+bW92ZV90byggJnZfc3RhcnQsIHVzZXIgKTsKKyAgICAgIGlmICggZXJyb3IgKQorICAgICAgICByZXR1cm4gZXJyb3I7CisKKyAgICAgIHBvaW50ID0gb3V0bGluZS0+cG9pbnRzICsgZmlyc3Q7CisgICAgICBmbGFncyA9IG91dGxpbmUtPmZsYWdzICArIGZpcnN0OworCisgICAgICAvKiBub3cgcHJvY2VzcyBlYWNoIGNvbnRvdXIgcG9pbnQgaW5kaXZpZHVhbGx5ICovCisKKyAgICAgIHdoaWxlICggaW5kZXggPCBsYXN0ICkKKyAgICAgIHsKKyAgICAgICAgaW5kZXgrKzsKKyAgICAgICAgcG9pbnQrKzsKKyAgICAgICAgZmxhZ3MrKzsKKworICAgICAgICB0YWcgPSBGVF9DVVJWRV9UQUcoIGZsYWdzWzBdICk7CisKKyAgICAgICAgc3dpdGNoICggcGhhc2UgKQorICAgICAgICB7CisgICAgICAgIGNhc2UgcGhhc2VfcG9pbnQ6ICAgICAvKiB0aGUgcHJldmlvdXMgcG9pbnQgd2FzIG9uIHRoZSBjdXJ2ZSAqLworCisgICAgICAgICAgc3dpdGNoICggdGFnICkKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKiB0d28gc3VjY2VzaXZlIG9uIHBvaW50cyAtPiBlbWl0IHNlZ21lbnQgKi8KKyAgICAgICAgICBjYXNlIEZUX0N1cnZlX1RhZ19PbjoKKyAgICAgICAgICAgIGVycm9yID0gaW50ZXJmYWNlLT5saW5lX3RvKCBwb2ludCwgdXNlciApOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIC8qIG9uIHBvaW50ICsgY29uaWMgY29udHJvbCAtPiByZW1lbWJlciBjb250cm9sIHBvaW50ICovCisgICAgICAgICAgY2FzZSBGVF9DdXJ2ZV9UYWdfQ29uaWM6CisgICAgICAgICAgICB2X2NvbnRyb2wgPSBwb2ludFswXTsKKyAgICAgICAgICAgIHBoYXNlICAgICA9IHBoYXNlX2NvbmljOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIC8qIG9uIHBvaW50ICsgY3ViaWMgY29udHJvbCAtPiByZW1lbWJlciBmaXJzdCBjb250cm9sICovCisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHZfY29udHJvbCA9IHBvaW50WzBdOworICAgICAgICAgICAgcGhhc2UgICAgID0gcGhhc2VfY3ViaWM7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBwaGFzZV9jb25pYzogICAvKiB0aGUgcHJldmlvdXMgcG9pbnQgd2FzIGEgY29uaWMgY29udHJvbCAqLworCisgICAgICAgICAgc3dpdGNoICggdGFnICkKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKiBjb25pYyBjb250cm9sICsgb24gcG9pbnQgLT4gZW1pdCBjb25pYyBhcmMgKi8KKyAgICAgICAgICBjYXNlICBGVF9DdXJ2ZV9UYWdfT246CisgICAgICAgICAgICBlcnJvciA9IGludGVyZmFjZS0+Y29uaWNfdG8oICZ2X2NvbnRyb2wsIHBvaW50LCB1c2VyICk7CisgICAgICAgICAgICBwaGFzZSA9IHBoYXNlX3BvaW50OworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIC8qIHR3byBzdWNjZXNzaXZlIGNvbmljcyAtPiBlbWl0IGNvbmljIGFyYyBgaW4gYmV0d2VlbicgKi8KKyAgICAgICAgICBjYXNlIEZUX0N1cnZlX1RhZ19Db25pYzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgRlRfVmVjdG9yICB2X21pZGRsZTsKKworCisgICAgICAgICAgICAgIHZfbWlkZGxlLnggPSAodl9jb250cm9sLnggKyBwb2ludC0+eCkvMjsKKyAgICAgICAgICAgICAgdl9taWRkbGUueSA9ICh2X2NvbnRyb2wueSArIHBvaW50LT55KS8yOworCisgICAgICAgICAgICAgIGVycm9yID0gaW50ZXJmYWNlLT5jb25pY190byggJnZfY29udHJvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdl9taWRkbGUsIHVzZXIgKTsKKyAgICAgICAgICAgICAgdl9jb250cm9sID0gcG9pbnRbMF07CisgICAgICAgICAgICB9CisgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZXJyb3IgPSBGVF9FcnJfSW52YWxpZF9PdXRsaW5lOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIHBoYXNlX2N1YmljOiAgLyogdGhlIHByZXZpb3VzIHBvaW50IHdhcyBhIGN1YmljIGNvbnRyb2wgKi8KKworICAgICAgICAgIC8qIHRoaXMgcG9pbnQgX211c3RfIGJlIGEgY3ViaWMgY29udHJvbCB0b28gKi8KKyAgICAgICAgICBpZiAoIHRhZyAhPSBGVF9DdXJ2ZV9UYWdfQ3ViaWMgKQorICAgICAgICAgICAgcmV0dXJuIEZUX0Vycl9JbnZhbGlkX091dGxpbmU7CisKKyAgICAgICAgICB2X2NvbnRyb2wyID0gcG9pbnRbMF07CisgICAgICAgICAgcGhhc2UgICAgICA9IHBoYXNlX2N1YmljMjsKKyAgICAgICAgICBicmVhazsKKworCisgICAgICAgIGNhc2UgcGhhc2VfY3ViaWMyOiAgLyogdGhlIHR3byBwcmV2aW91cyBwb2ludHMgd2VyZSBjdWJpY3MgKi8KKworICAgICAgICAgIC8qIHRoaXMgcG9pbnQgX211c3RfIGJlIGFuIG9uIHBvaW50ICovCisgICAgICAgICAgaWYgKCB0YWcgIT0gRlRfQ3VydmVfVGFnX09uICkKKyAgICAgICAgICAgIGVycm9yID0gRlRfRXJyX0ludmFsaWRfT3V0bGluZTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBlcnJvciA9IGludGVyZmFjZS0+Y3ViaWNfdG8oICZ2X2NvbnRyb2wsICZ2X2NvbnRyb2wyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludCwgdXNlciApOworICAgICAgICAgIHBoYXNlID0gcGhhc2VfcG9pbnQ7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvKiBsYXp5IGVycm9yIHRlc3RpbmcgKi8KKyAgICAgICAgaWYgKCBlcnJvciApCisgICAgICAgICAgcmV0dXJuIGVycm9yOworICAgICAgfQorCisgICAgICAvKiBlbmQgb2YgY29udG91ciwgY2xvc2UgY3VydmUgY2xlYW5seSAqLworICAgICAgZXJyb3IgPSAwOworCisgICAgICB0YWcgPSBGVF9DVVJWRV9UQUcoIG91dGxpbmUtPmZsYWdzW2ZpcnN0XSApOworCisgICAgICBzd2l0Y2ggKCBwaGFzZSApCisgICAgICB7CisgICAgICBjYXNlIHBoYXNlX3BvaW50OgorICAgICAgICBpZiAoIHRhZyA9PSBGVF9DdXJ2ZV9UYWdfT24gKQorICAgICAgICAgIGVycm9yID0gaW50ZXJmYWNlLT5saW5lX3RvKCAmdl9maXJzdCwgdXNlciApOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBwaGFzZV9jb25pYzoKKyAgICAgICAgZXJyb3IgPSBpbnRlcmZhY2UtPmNvbmljX3RvKCAmdl9jb250cm9sLCAmdl9zdGFydCwgdXNlciApOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBwaGFzZV9jdWJpYzI6CisgICAgICAgIGlmICggdGFnID09IEZUX0N1cnZlX1RhZ19PbiApCisgICAgICAgICAgZXJyb3IgPSBpbnRlcmZhY2UtPmN1YmljX3RvKCAmdl9jb250cm9sLCAmdl9jb250cm9sMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2X2ZpcnN0LCAgIHVzZXIgKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIGVycm9yID0gRlRfRXJyX0ludmFsaWRfT3V0bGluZTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGVycm9yID0gRlRfRXJyX0ludmFsaWRfT3V0bGluZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGlmICggZXJyb3IgKQorICAgICAgICByZXR1cm4gZXJyb3I7CisKKyAgICAgIGZpcnN0ID0gbGFzdCArIDE7CisgICAgfQorCisgICAgcmV0dXJuIDA7CisgIH0KKworCisgIHN0YXRpYworICBjb25zdCBGVF9PdXRsaW5lICBudWxsX291dGxpbmUgPSB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX05ld19PdXRsaW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIENyZWF0ZXMgYSBuZXcgb3V0bGluZSBvZiBhIGdpdmVuIHNpemUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGxpYnJhcnkgICAgIDo6IEEgaGFuZGxlIHRvIHRoZSBsaWJyYXJ5IG9iamVjdCBmcm9tIHdoZXJlIHRoZSAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICBvdXRsaW5lIGlzIGFsbG9jYXRlZC4gIE5vdGUgaG93ZXZlciB0aGF0IHRoZSBuZXcgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgb3V0bGluZSB3aWxsIE5PVCBuZWNlc3NhcmlseSBiZSBGUkVFRCB3aGVuICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgIGRlc3Ryb3lpbmcgdGhlIGxpYnJhcnksIGJ5IEZUX0RvbmVfRnJlZVR5cGUoKS4gICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbnVtUG9pbnRzICAgOjogVGhlIG1heGltdW0gbnVtYmVyIG9mIHBvaW50cyB3aXRoaW4gdGhlIG91dGxpbmUuICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBudW1Db250b3VycyA6OiBUaGUgbWF4aW11bSBudW1iZXIgb2YgY29udG91cnMgd2l0aGluIHRoZSBvdXRsaW5lLiAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBvdXRsaW5lICAgICA6OiBBIGhhbmRsZSB0byB0aGUgbmV3IG91dGxpbmUuICBOVUxMIGluIGNhc2Ugb2YgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgZXJyb3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8TVQtTm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgTm8uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhlIHJlYXNvbiB3aHkgdGhpcyBmdW5jdGlvbiB0YWtlcyBhIGBsaWJyYXJ5JyBwYXJhbWV0ZXIgaXMgc2ltcGx5ICovCisgIC8qICAgIHRvIHVzZSB0aGUgbGlicmFyeSdzIG1lbW9yeSBhbGxvY2F0b3IuICBZb3UgY2FuIGNvcHkgdGhlIHNvdXJjZSAgICAqLworICAvKiAgICBjb2RlIG9mIHRoaXMgZnVuY3Rpb24sIHJlcGxhY2luZyBhbGxvY2F0aW9ucyB3aXRoIGBtYWxsb2MoKScgaWYgICAgKi8KKyAgLyogICAgeW91IHdhbnQgdG8gY29udHJvbCB3aGVyZSB0aGUgb2JqZWN0cyBnby4gICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBCQVNFX0ZVTkMKKyAgRlRfRXJyb3IgIEZUX05ld19PdXRsaW5lKCBGVF9MaWJyYXJ5ICAgbGlicmFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgbnVtUG9pbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICBudW1Db250b3VycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9PdXRsaW5lKiAgb3V0bGluZSApCisgIHsKKyAgICBGVF9FcnJvciAgIGVycm9yOworICAgIEZUX01lbW9yeSAgbWVtb3J5OworCisKKyAgICBpZiAoICFvdXRsaW5lICkKKyAgICAgIHJldHVybiBGVF9FcnJfSW52YWxpZF9Bcmd1bWVudDsKKworICAgICpvdXRsaW5lID0gbnVsbF9vdXRsaW5lOworICAgIG1lbW9yeSAgID0gbGlicmFyeS0+bWVtb3J5OworCisgICAgaWYgKCBBTExPQ19BUlJBWSggb3V0bGluZS0+cG9pbnRzLCAgIG51bVBvaW50cyAqIDJMLCBGVF9Qb3MgICAgKSB8fAorICAgICAgICAgQUxMT0NfQVJSQVkoIG91dGxpbmUtPmZsYWdzLCAgICBudW1Qb2ludHMsICAgICAgRlRfQnl0ZSAgICkgfHwKKyAgICAgICAgIEFMTE9DX0FSUkFZKCBvdXRsaW5lLT5jb250b3VycywgbnVtQ29udG91cnMsICAgIEZUX1VTaG9ydCApICkKKyAgICAgIGdvdG8gRmFpbDsKKworICAgIG91dGxpbmUtPm5fcG9pbnRzICAgPSAoRlRfVVNob3J0KW51bVBvaW50czsKKyAgICBvdXRsaW5lLT5uX2NvbnRvdXJzID0gKEZUX1Nob3J0KW51bUNvbnRvdXJzOworICAgIG91dGxpbmUtPm93bmVyICAgICAgPSBUUlVFOworCisgICAgcmV0dXJuIEZUX0Vycl9PazsKKworICBGYWlsOgorICAgIG91dGxpbmUtPm93bmVyID0gVFJVRTsKKyAgICBGVF9Eb25lX091dGxpbmUoIGxpYnJhcnksIG91dGxpbmUgKTsKKworICAgIHJldHVybiBlcnJvcjsKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfRG9uZV9PdXRsaW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRGVzdHJveXMgYW4gb3V0bGluZSBjcmVhdGVkIHdpdGggRlRfTmV3X091dGxpbmUoKS4gICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbGlicmFyeSA6OiBBIGhhbmRsZSBvZiB0aGUgbGlicmFyeSBvYmplY3QgdXNlZCB0byBhbGxvY2F0ZSB0aGUgICAgICovCisgIC8qICAgICAgICAgICAgICAgb3V0bGluZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgb3V0bGluZSA6OiBBIHBvaW50ZXIgdG8gdGhlIG91dGxpbmUgb2JqZWN0IHRvIGJlIGRpc2NhcmRlZC4gICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8TVQtTm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgTm8uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgSWYgdGhlIG91dGxpbmUncyBgb3duZXInIGZpZWxkIGlzIG5vdCBzZXQsIG9ubHkgdGhlIG91dGxpbmUgICAgICAgICovCisgIC8qICAgIGRlc2NyaXB0b3Igd2lsbCBiZSByZWxlYXNlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhlIHJlYXNvbiB3aHkgdGhpcyBmdW5jdGlvbiB0YWtlcyBhbiBgb3V0bGluZScgcGFyYW1ldGVyIGlzICAgICAgICovCisgIC8qICAgIHNpbXBseSB0byB1c2UgRlRfQWxsb2MoKS9GVF9GcmVlKCkuICBZb3UgY2FuIGNvcHkgdGhlIHNvdXJjZSBjb2RlICAqLworICAvKiAgICBvZiB0aGlzIGZ1bmN0aW9uLCByZXBsYWNpbmcgYWxsb2NhdGlvbnMgd2l0aCBgbWFsbG9jKCknIGluIHlvdXIgICAgKi8KKyAgLyogICAgYXBwbGljYXRpb24gaWYgeW91IHdhbnQgc29tZXRoaW5nIHNpbXBsZXIuICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBCQVNFX0ZVTkMKKyAgRlRfRXJyb3IgIEZUX0RvbmVfT3V0bGluZSggRlRfTGlicmFyeSAgIGxpYnJhcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX091dGxpbmUqICBvdXRsaW5lICkKKyAgeworICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gbGlicmFyeS0+bWVtb3J5OworCisKKyAgICBpZiAoIG91dGxpbmUgKQorICAgIHsKKyAgICAgIGlmICggb3V0bGluZS0+b3duZXIgKQorICAgICAgeworICAgICAgICBGUkVFKCBvdXRsaW5lLT5wb2ludHMgICApOworICAgICAgICBGUkVFKCBvdXRsaW5lLT5mbGFncyAgICApOworICAgICAgICBGUkVFKCBvdXRsaW5lLT5jb250b3VycyApOworICAgICAgfQorICAgICAgKm91dGxpbmUgPSBudWxsX291dGxpbmU7CisKKyAgICAgIHJldHVybiBGVF9FcnJfT2s7CisgICAgfQorICAgIGVsc2UKKyAgICAgIHJldHVybiBGVF9FcnJfSW52YWxpZF9Bcmd1bWVudDsKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfR2V0X091dGxpbmVfQ0JveCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgUmV0dXJucyBhbiBvdXRsaW5lJ3MgYGNvbnRyb2wgYm94Jy4gIFRoZSBjb250cm9sIGJveCBlbmNsb3NlcyBhbGwgICovCisgIC8qICAgIHRoZSBvdXRsaW5lJ3MgcG9pbnRzLCBpbmNsdWRpbmcgQmV6aWVyIGNvbnRyb2wgcG9pbnRzLiAgVGhvdWdoIGl0ICAqLworICAvKiAgICBjb2luY2lkZXMgd2l0aCB0aGUgZXhhY3QgYm91bmRpbmcgYm94IGZvciBtb3N0IGdseXBocywgaXQgY2FuIGJlICAgKi8KKyAgLyogICAgc2xpZ2h0bHkgbGFyZ2VyIGluIHNvbWUgc2l0dWF0aW9ucyAobGlrZSB3aGVuIHJvdGF0aW5nIGFuIG91dGxpbmUgICovCisgIC8qICAgIHdoaWNoIGNvbnRhaW5zIEJlemllciBvdXRzaWRlIGFyY3MpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQ29tcHV0aW5nIHRoZSBjb250cm9sIGJveCBpcyB2ZXJ5IGZhc3QsIHdoaWxlIGdldHRpbmcgdGhlIGJvdW5kaW5nICovCisgIC8qICAgIGJveCBjYW4gdGFrZSBtdWNoIG1vcmUgdGltZSBhcyBpdCBuZWVkcyB0byB3YWxrIG92ZXIgYWxsIHNlZ21lbnRzICAqLworICAvKiAgICBhbmQgYXJjcyBpbiB0aGUgb3V0bGluZS4gIFRvIGdldCB0aGUgbGF0dGVyLCB5b3UgY2FuIHVzZSB0aGUgICAgICAgKi8KKyAgLyogICAgYGZ0YmJveCcgY29tcG9uZW50IHdoaWNoIGlzIGRlZGljYXRlZCB0byB0aGlzIHNpbmdsZSB0YXNrLiAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgb3V0bGluZSA6OiBBIHBvaW50ZXIgdG8gdGhlIHNvdXJjZSBvdXRsaW5lIGRlc2NyaXB0b3IuICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgY2JveCAgICA6OiBUaGUgb3V0bGluZSdzIGNvbnRyb2wgYm94LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8TVQtTm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgWWVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBCQVNFX0ZVTkMKKyAgRlRfRXJyb3IgIEZUX0dldF9PdXRsaW5lX0NCb3goIEZUX091dGxpbmUqICBvdXRsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQkJveCogICAgIGNib3ggKQorICB7CisgICAgaWYgKCBvdXRsaW5lICYmIGNib3ggKQorICAgIHsKKyAgICAgIGlmICggb3V0bGluZS0+bl9wb2ludHMgPT0gMCApCisgICAgICB7CisgICAgICAgIGNib3gtPnhNaW4gPSAwOworICAgICAgICBjYm94LT55TWluID0gMDsKKyAgICAgICAgY2JveC0+eE1heCA9IDA7CisgICAgICAgIGNib3gtPnlNYXggPSAwOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBGVF9VU2hvcnQgICBrOworICAgICAgICBGVF9WZWN0b3IqICB2ZWMgPSBvdXRsaW5lLT5wb2ludHM7CisKKworICAgICAgICBjYm94LT54TWluID0gY2JveC0+eE1heCA9IHZlYy0+eDsKKyAgICAgICAgY2JveC0+eU1pbiA9IGNib3gtPnlNYXggPSB2ZWMtPnk7CisgICAgICAgIHZlYysrOworCisgICAgICAgIGZvciAoIGsgPSAxOyBrIDwgb3V0bGluZS0+bl9wb2ludHM7IGsrKyApCisgICAgICAgIHsKKyAgICAgICAgICBGVF9Qb3MgIHgsIHk7CisKKworICAgICAgICAgIHggPSB2ZWMtPng7CisgICAgICAgICAgaWYgKCB4IDwgY2JveC0+eE1pbiApIGNib3gtPnhNaW4gPSB4OworICAgICAgICAgIGlmICggeCA+IGNib3gtPnhNYXggKSBjYm94LT54TWF4ID0geDsKKworICAgICAgICAgIHkgPSB2ZWMtPnk7CisgICAgICAgICAgaWYgKCB5IDwgY2JveC0+eU1pbiApIGNib3gtPnlNaW4gPSB5OworICAgICAgICAgIGlmICggeSA+IGNib3gtPnlNYXggKSBjYm94LT55TWF4ID0geTsKKyAgICAgICAgICB2ZWMrKzsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIEZUX0Vycl9PazsKKyAgICB9CisgICAgZWxzZQorICAgICAgcmV0dXJuIEZUX0Vycl9JbnZhbGlkX0FyZ3VtZW50OworICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9UcmFuc2xhdGVfT3V0bGluZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBcHBsaWVzIGEgc2ltcGxlIHRyYW5zbGF0aW9uIHRvIHRoZSBwb2ludHMgb2YgYW4gb3V0bGluZS4gICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBvdXRsaW5lIDo6IEEgcG9pbnRlciB0byB0aGUgdGFyZ2V0IG91dGxpbmUgZGVzY3JpcHRvci4gICAgICAgICAgICAgKi8KKyAgLyogICAgeE9mZnNldCA6OiBUaGUgaG9yaXpvbnRhbCBvZmZzZXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHlPZmZzZXQgOjogVGhlIHZlcnRpY2FsIG9mZnNldC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE1ULU5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFllcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgQkFTRV9GVU5DCisgIHZvaWQgIEZUX1RyYW5zbGF0ZV9PdXRsaW5lKCBGVF9PdXRsaW5lKiAgb3V0bGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgICAgICB4T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICAgICAgIHlPZmZzZXQgKQorICB7CisgICAgRlRfVVNob3J0ICAgbjsKKyAgICBGVF9WZWN0b3IqICB2ZWMgPSBvdXRsaW5lLT5wb2ludHM7CisKKworICAgIGZvciAoIG4gPSAwOyBuIDwgb3V0bGluZS0+bl9wb2ludHM7IG4rKyApCisgICAgeworICAgICAgdmVjLT54ICs9IHhPZmZzZXQ7CisgICAgICB2ZWMtPnkgKz0geU9mZnNldDsKKyAgICAgIHZlYysrOworICAgIH0KKyAgfQorCisKKworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfRG9uZV9GcmVlVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRGVzdHJveXMgYSBnaXZlbiBGcmVlVHlwZSBsaWJyYXJ5IG9iamVjdCBhbmQgYWxsIG9mIGl0cyBjaGlsZHMsICAgICovCisgIC8qICAgIGluY2x1ZGluZyByZXNvdXJjZXMsIGRyaXZlcnMsIGZhY2VzLCBzaXplcywgZXRjLiAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGxpYnJhcnkgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBsaWJyYXJ5IG9iamVjdC4gICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgRVhQT1JUX0ZVTkMKKyAgRlRfRXJyb3IgIEZUX0RvbmVfRnJlZVR5cGUoIEZUX0xpYnJhcnkgIGxpYnJhcnkgKQorICB7CisgICAgLyogRGlzY2FyZCB0aGUgbGlicmFyeSBvYmplY3QgKi8KKyAgICBGVF9Eb25lX0xpYnJhcnkoIGxpYnJhcnkgKTsKKworICAgIHJldHVybiBGVF9FcnJfT2s7CisgIH0KKworLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvYmFzZS9mdG9ianMuaCBiL3NyYy9iYXNlL2Z0b2Jqcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkYzkwZWMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvYmFzZS9mdG9ianMuaApAQCAtMCwwICsxLDcxMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgZnRvYmpzLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGUgRnJlZVR5cGUgcHJpdmF0ZSBiYXNlIGNsYXNzZXMgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAxOTk2LTE5OTkgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCAgICAgICAgKi8KKy8qICBtb2RpZmllZCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgICovCisvKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLworLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KKy8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZGVmaW5pdGlvbiBvZiBhbGwgaW50ZXJuYWwgRnJlZVR5cGUgY2xhc3Nlcy4gICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBGVE9CSlNfSAorI2RlZmluZSBGVE9CSlNfSAorCisjaW5jbHVkZSA8ZnRjb25maWcuaD4KKyNpbmNsdWRlIDxmdHN5c3RlbS5oPgorI2luY2x1ZGUgPGZ0ZHJpdmVyLmg+CisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBTb21lIGdlbmVyaWMgZGVmaW5pdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjaWZuZGVmIFRSVUUKKyNkZWZpbmUgVFJVRSAgMQorI2VuZGlmCisKKyNpZm5kZWYgRkFMU0UKKyNkZWZpbmUgRkFMU0UgIDAKKyNlbmRpZgorCisjaWZuZGVmIE5VTEwKKyNkZWZpbmUgTlVMTCAgKHZvaWQqKTAKKyNlbmRpZgorCisjaWZuZGVmIFVOVVNFRAorI2RlZmluZSBVTlVTRUQoIGFyZyApICAoICh2b2lkKShhcmcpICkKKyNlbmRpZgorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBUaGUgbWluIGFuZCBtYXggZnVuY3Rpb25zIG1pc3NpbmcgaW4gQy4gIEFzIHVzdWFsLCBiZSBjYXJlZnVsIG5vdCB0byAgKi8KKyAgLyogd3JpdGUgdGhpbmdzIGxpa2UgTUlOKCBhKyssIGIrKyApIHRvIGF2b2lkIHNpZGUgZWZmZWN0cy4gICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2lmbmRlZiBNSU4KKyNkZWZpbmUgTUlOKCBhLCBiICkgICggKGEpIDwgKGIpID8gKGEpIDogKGIpICkKKyNlbmRpZgorCisjaWZuZGVmIE1BWAorI2RlZmluZSBNQVgoIGEsIGIgKSAgKCAoYSkgPiAoYikgPyAoYSkgOiAoYikgKQorI2VuZGlmCisKKyNpZm5kZWYgQUJTCisjZGVmaW5lIEFCUyggYSApICAgICAoIChhKSA8IDAgPyAtKGEpIDogKGEpICkKKyNlbmRpZgorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8TWFjcm8+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfU0VUX0VSUk9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhpcyBtYWNybyBpcyB1c2VkIHRvIHNldCBhbiBpbXBsaWNpdCBgZXJyb3InIHZhcmlhYmxlIHRvIGEgZ2l2ZW4gICovCisgIC8qICAgIGV4cHJlc3Npb24ncyB2YWx1ZSAodXN1YWxseSBhIGZ1bmN0aW9uIGNhbGwpLCBhbmQgY29udmVydCBpdCB0byBhICAqLworICAvKiAgICBib29sZWFuIHdoaWNoIGlzIHNldCB3aGVuZXZlciB0aGUgdmFsdWUgaXMgIT0gMC4gICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjdW5kZWYgIEZUX1NFVF9FUlJPUgorI2RlZmluZSBGVF9TRVRfRVJST1IoIGV4cHJlc3Npb24gKSBcCisgICAgICAgICAgKCAoZXJyb3IgPSAoZXhwcmVzc2lvbikpICE9IDAgKQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCisgIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLworICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgIE0gRSBNIE8gUiBZICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KKyAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCisgIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0FsbG9jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEFsbG9jYXRlcyBhIG5ldyBibG9jayBvZiBtZW1vcnkuICBUaGUgcmV0dXJuZWQgYXJlYSBpcyBhbHdheXMgICAgICAqLworICAvKiAgICB6ZXJvLWZpbGxlZCwgdGhpcyBpcyBhIHN0cm9uZyBjb252ZW50aW9uIGluIG1hbnkgRnJlZVR5cGUgcGFydHMuICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBtZW1vcnkgOjogQSBoYW5kbGUgdG8gYSBnaXZlbiBgbWVtb3J5IG9iamVjdCcgd2hlcmUgYWxsb2NhdGlvbiAgICAgKi8KKyAgLyogICAgICAgICAgICAgIG9jY3Vycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzaXplICAgOjogVGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIGJsb2NrIHRvIGFsbG9jYXRlLiAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBQICAgICAgOjogQSBwb2ludGVyIHRvIHRoZSBmcmVzaCBuZXcgYmxvY2suICBJdCBzaG91bGQgYmUgc2V0IHRvICAgKi8KKyAgLyogICAgICAgICAgICAgIE5VTEwgaWYgYHNpemUnIGlzIDAsIG9yIGluIGNhc2Ugb2YgZXJyb3IuICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBCQVNFX0RFRgorICBGVF9FcnJvciAgRlRfQWxsb2MoIEZUX01lbW9yeSAgbWVtb3J5LAorICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICB2b2lkKiogICAgIFAgKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX1JlYWxsb2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFJlYWxsb2NhdGVzIGEgYmxvY2sgb2YgbWVtb3J5IHBvaW50ZWQgdG8gYnkgYCpQJyB0byBgU2l6ZScgYnl0ZXMgICAqLworICAvKiAgICBmcm9tIHRoZSBoZWFwLCBwb3NzaWJseSBjaGFuZ2luZyBgKlAnLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBtZW1vcnkgOjogQSBoYW5kbGUgdG8gYSBnaXZlbiBgbWVtb3J5IG9iamVjdCcgd2hlcmUgYWxsb2NhdGlvbiAgICAgKi8KKyAgLyogICAgICAgICAgICAgIG9jY3Vycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBjdXJyZW50IDo6IGN1cnJlbnQgYmxvY2sgc2l6ZSBpbiBieXRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgc2l6ZSAgICA6OiB0aGUgbmV3IGJsb2NrIHNpemUgaW4gYnl0ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFAgICAgICA6OiBBIHBvaW50ZXIgdG8gdGhlIGZyZXNoIG5ldyBibG9jay4gIEl0IHNob3VsZCBiZSBzZXQgdG8gICAqLworICAvKiAgICAgICAgICAgICAgTlVMTCBpZiBgc2l6ZScgaXMgMCwgb3IgaW4gY2FzZSBvZiBlcnJvci4gICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBbGwgY2FsbGVycyBvZiBGVF9SZWFsbG9jIF9tdXN0XyBwcm92aWRlIHRoZSBjdXJyZW50IGJsb2NrIHNpemUgICAgKi8KKyAgLyogICAgYXMgd2VsbCBhcyB0aGUgbmV3IG9uZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBXaGVuIHRoZSBtZW1vcnkgb2JqZWN0J3MgZmxhZyBGVF9tZW1vcnlfRkxBR19OT19SRUFMTE9DIGlzICAgICAgICAgKi8KKyAgLyogICAgc2V0LCB0aGlzIGZ1bmN0aW9uIHdpbGwgdHJ5IHRvIGVtdWxhdGUgYSByZWFsbG9jIHRocm91Z2ggdXNlcyAgICAgICovCisgIC8qICAgIG9mIEZUX0FsbG9jIGFuZCBGVF9GcmVlLiBPdGhlcndpc2UsIGl0IHdpbGwgY2FsbCB0aGUgbWVtb3J5LSAgICAgICAqLworICAvKiAgICBzcGVjaWZpYyAicmVhbGxvYyIgaW1wbGVtZW50YXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIChTb21lIGVtYmVkZGVkIG1lbW9yeXMgZG8gbm90IGhhdmUgYSB3b3JraW5nIHJlYWxsb2MpLiAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgQkFTRV9ERUYKKyAgRlRfRXJyb3IgIEZUX1JlYWxsb2MoIEZUX01lbW9yeSAgbWVtb3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICBjdXJyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCoqICAgICBQICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9GcmVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBSZWxlYXNlcyBhIGdpdmVuIGJsb2NrIG9mIG1lbW9yeSBhbGxvY2F0ZWQgdGhyb3VnaCBGVF9BbGxvYygpLiAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBtZW1vcnkgOjogQSBoYW5kbGUgdG8gYSBnaXZlbiBgbWVtb3J5IG9iamVjdCcgd2hlcmUgYWxsb2NhdGlvbiAgICAgKi8KKyAgLyogICAgICAgICAgICAgIG9jY3VyZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBQICAgICAgOjogVGhpcyBpcyB0aGUgX2FkZHJlc3NfIG9mIGEgX3BvaW50ZXJfIHdoaWNoIHBvaW50cyB0byB0aGUgKi8KKyAgLyogICAgICAgICAgICAgIGFsbG9jYXRlZCBibG9jay4gIEl0IGlzIGFsd2F5cyBzZXQgdG8gTlVMTCBvbiBleGl0LiAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgSWYgUCBvciAqUCBhcmUgTlVMTCwgdGhpcyBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIHN1Y2Nlc3NmdWxseS4gICAgICovCisgIC8qICAgIFRoaXMgaXMgYSBzdHJvbmcgY29udmVudGlvbiB3aXRoaW4gYWxsIG9mIEZyZWVUeXBlIGFuZCBpdHMgICAgICAgICAqLworICAvKiAgICBkcml2ZXJzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEJBU0VfREVGCisgIHZvaWQgIEZUX0ZyZWUoIEZUX01lbW9yeSAgbWVtb3J5LAorICAgICAgICAgICAgICAgICB2b2lkKiogICAgIFAgKTsKKworCisKKyAgLyogVGhpcyBpbmNsdWRlIGlzIG5lZWRlZCBieSB0aGUgTUVNX3h4eCgpIG1hY3JvcywgaXQgc2hvdWxkIGJlICovCisgIC8qIGF2YWlsYWJsZSBvbiBldmVyeSBwbGF0Zm9ybSB3ZSBrbm93ICEhICAgICAgICAgICAgICAgICAgICAgICAqLworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjZGVmaW5lIE1FTV9TZXQoIGRlc3QsIGJ5dGUsIGNvdW50ICkgIG1lbXNldCggZGVzdCwgYnl0ZSwgY291bnQgKQorCisjaWZkZWYgSEFWRV9NRU1DUFkKKyNkZWZpbmUgTUVNX0NvcHkoIGRlc3QsIHNvdXJjZSwgY291bnQgKSAgbWVtY3B5KCBkZXN0LCBzb3VyY2UsIGNvdW50ICkKKyNlbHNlCisjZGVmaW5lIE1FTV9Db3B5KCBkZXN0LCBzb3VyY2UsIGNvdW50ICkgIGJjb3B5KCBzb3VyY2UsIGRlc3QsIGNvdW50ICkKKyNlbmRpZgorCisjZGVmaW5lIE1FTV9Nb3ZlKCBkZXN0LCBzb3VyY2UsIGNvdW50ICkgIG1lbW1vdmUoIGRlc3QsIHNvdXJjZSwgY291bnQgKQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBXZSBub3cgc3VwcG9ydCBjbG9zdXJlcyB0byBwcm9kdWNlIGNvbXBsZXRlbHkgcmVlbnRyYW50IGNvZGUuICBUaGlzICAgKi8KKyAgLyogbWVhbnMgdGhlIGFsbG9jYXRpb24gZnVuY3Rpb25zIG5vdyB0YWtlcyBhbiBhZGRpdGlvbmFsIGFyZ3VtZW50ICAgICAgICovCisgIC8qIChgbWVtb3J5JykuICBJdCBpcyBhIGhhbmRsZSB0byBhIGdpdmVuIG1lbW9yeSBvYmplY3QsIHJlc3BvbnNpYmxlIGZvciAqLworICAvKiBhbGwgbG93LWxldmVsIG9wZXJhdGlvbnMsIGluY2x1ZGluZyBtZW1vcnkgbWFuYWdlbWVudCBhbmQgICAgICAgICAgICAgKi8KKyAgLyogc3luY2hyb25pc2F0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBJbiBvcmRlciB0byBrZWVwIG91ciBjb2RlIHJlYWRhYmxlIGFuZCB1c2UgdGhlIHNhbWUgbWFjcm9zIGluIHRoZSAgICAgKi8KKyAgLyogZm9udCBkcml2ZXJzIGFuZCB0aGUgcmVzdCBvZiB0aGUgbGlicmFyeSwgTUVNX0FsbG9jKCksIEFMTE9DKCksIGFuZCAgICovCisgIC8qIEFMTE9DX0FSUkFZKCkgbm93IHVzZSBhbiBpbXBsaWNpdCB2YXJpYWJsZSwgYG1lbW9yeScuICBJdCBtdXN0IGJlICAgICAqLworICAvKiBkZWZpbmVkIGF0IGFsbCBsb2NhdGlvbnMgd2hlcmUgYSBtZW1vcnkgb3BlcmF0aW9uIGlzIHF1ZXJpZWQuICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIE5vdGUgdGhhdCBBTEwgbWVtb3J5IGFsbG9jYXRpb24gZnVuY3Rpb25zIG5lZWQgYW4gSU1QTElDSVQgYXJndW1lbnQgICAqLworICAvKiBjYWxsZWQgYG1lbW9yeScgdG8gcG9pbnQgdG8gdGhlIGN1cnJlbnQgbWVtb3J5IG9iamVjdC4gICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1FTV9BbGxvYyggX3BvaW50ZXJfLCBfc2l6ZV8gKSBcCisgICAgICAgICAgRlRfQWxsb2MoIG1lbW9yeSwgX3NpemVfLCAodm9pZCoqKSYoX3BvaW50ZXJfKSApCisKKyNkZWZpbmUgTUVNX1JlYWxsb2MoIF9wb2ludGVyXywgX2N1cnJlbnRfLCBfc2l6ZV8gKSBcCisgICAgICAgICAgRlRfUmVhbGxvYyggbWVtb3J5LCBfY3VycmVudF8sIF9zaXplXywgKHZvaWQqKikmKF9wb2ludGVyXykgKQorCisjZGVmaW5lIEFMTE9DKCBfcG9pbnRlcl8sIF9zaXplXyApIFwKKyAgICAgICAgICBGVF9TRVRfRVJST1IoIE1FTV9BbGxvYyggX3BvaW50ZXJfLCBfc2l6ZV8gKSApCisKKyNkZWZpbmUgUkVBTExPQyggX3BvaW50ZXJfLCBfY3VycmVudF8sIF9zaXplXyApIFwKKyAgICAgICAgICBGVF9TRVRfRVJST1IoIE1FTV9SZWFsbG9jKCBfcG9pbnRlcl8sIF9jdXJyZW50XywgX3NpemVfICkgKQorCisjZGVmaW5lIEFMTE9DX0FSUkFZKCBfcG9pbnRlcl8sIF9jb3VudF8sIF90eXBlXyApIFwKKyAgICAgICAgICBGVF9TRVRfRVJST1IoIE1FTV9BbGxvYyggX3BvaW50ZXJfLCAoX2NvdW50Xykqc2l6ZW9mIChfdHlwZV8pICkgKQorCisjZGVmaW5lIFJFQUxMT0NfQVJSQVkoIF9wb2ludGVyXywgX2N1cnJlbnRfLCBfY291bnRfLCBfdHlwZV8gKSBcCisgICAgICAgICAgRlRfU0VUX0VSUk9SKCBNRU1fUmVhbGxvYyggX3BvaW50ZXJfLCAoX2N1cnJlbnRfKSpzaXplb2YoX3R5cGVfKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgIChfY291bnRfKSpzaXplb2YoX3R5cGVfKSApICkKKworI2RlZmluZSBGUkVFKCBfcG9pbnRlcl8gKSAgRlRfRnJlZSggbWVtb3J5LCAodm9pZCoqKSYoX3BvaW50ZXJfKSApCisKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLworICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KKyAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgRCBSIEkgViBFIFIgUyAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCisgIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLworICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9Ecml2ZXJSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGUgcm9vdCBmb250IGRyaXZlciBjbGFzcy4gIEEgZm9udCBkcml2ZXIgaXMgcmVzcG9uc2libGUgZm9yICAgICAgKi8KKyAgLyogICAgbWFuYWdpbmcgYW5kIGxvYWRpbmcgZm9udCBmaWxlcyBvZiBhIGdpdmVuIGZvcm1hdC4gICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgIGxpYnJhcnkgICAgIDo6IEEgaGFuZGxlIHRvIHRoZSBkcml2ZXIncyBwYXJlbnQgbGlicmFyeS4gICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgbWVtb3J5ICAgICAgOjogQSBoYW5kbGUgdG8gdGhlIGRyaXZlcidzIG1lbW9yeSBvYmplY3QuICBUaGlzIGlzIGEgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgIGR1cGxpY2F0ZSBvZiBgbGlicmFyeS0+bWVtb3J5Jy4gICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgaW50ZXJmYWNlICAgOjogQSBzZXQgb2YgZHJpdmVyIG1ldGhvZHMgdGhhdCBpbXBsZW1lbnQgaXRzICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgIGJlaGF2aW91ci4gIFRoZXNlIG1ldGhvZHMgYXJlIGNhbGxlZCBieSB0aGUgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICB2YXJpb3VzIEZyZWVUeXBlIGZ1bmN0aW9ucyBsaWtlIEZUX05ld19GYWNlKCksICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgRlRfTG9hZF9HbHlwaCgpLCBldGMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICBmb3JtYXQgICAgICA6OiBBIHR5cGVsZXNzIHBvaW50ZXIsIHVzZWQgdG8gc3RvcmUgdGhlIGFkZHJlc3Mgb2YgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgdGhlIGRyaXZlcidzIGZvcm1hdCBzcGVjaWZpYyBpbnRlcmZhY2UuICBUaGlzIGlzIGEgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgIHRhYmxlIG9mIG90aGVyIGRyaXZlciBtZXRob2RzIHRoYXQgYXJlIHNwZWNpZmljIHRvICovCisgIC8qICAgICAgICAgICAgICAgICAgICBpdHMgZm9ybWF0LiAgRm9ybWF0IHNwZWNpZmljIGludGVyZmFjZXMgYXJlICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgZGVmaW5lZCBpbiB0aGUgZHJpdmVyJ3MgaGVhZGVyIGZpbGVzIChlLmcuLCAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgIGBmcmVldHlwZS9kcml2ZXJzL3R0bGliL3R0ZHJpdmVyLmgnKS4gICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgdmVyc2lvbiAgICAgOjogVGhlIGRyaXZlcidzIHZlcnNpb24uICBJdCBjYW4gYmUgdXNlZCBmb3IgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgIHZlcnNpb25pbmcgYW5kIGR5bmFtaWMgZHJpdmVyIHVwZGF0ZSBpZiBuZWVkZWQuICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgZGVzY3JpcHRpb24gOjogQW4gQVNDSUkgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIGRyaXZlcidzIHN1cHBvcnRlZCAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgIGZvcm1hdCwgbGlrZSBgdHJ1ZXR5cGUnLCBgdHlwZTEnLCBldGMuICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgZmFjZXNfbGlzdCAgOjogVGhlIGxpc3Qgb2YgZmFjZXMgY3VycmVudGx5IG9wZW5lZCBieSB0aGlzIGRyaXZlci4gKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICBleHRlbnNpb25zICA6OiBhIHR5cGVsZXNzIHBvaW50ZXIgdG8gdGhlIGRyaXZlcidzIGV4dGVuc2lvbnMgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgcmVnaXN0cnksIHdoZW4gdGhleSBhcmUgc3VwcG9ydGVkIHRocm91Z2ggdGhlICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgIGNvbmZpZyBtYWNybyBGVF9DT05GSUdfT1BUSU9OX0VYVEVOU0lPTlMgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHN0cnVjdCAgRlRfRHJpdmVyUmVjXworICB7CisgICAgRlRfTGlicmFyeSAgICAgICAgICBsaWJyYXJ5OworICAgIEZUX01lbW9yeSAgICAgICAgICAgbWVtb3J5OworCisgICAgRlRfR2VuZXJpYyAgICAgICAgICBnZW5lcmljOworCisgICAgRlRfRHJpdmVySW50ZXJmYWNlICBpbnRlcmZhY2U7CisgICAgRlRfRm9ybWF0SW50ZXJmYWNlICBmb3JtYXQ7CisKKyAgICBGVF9JbnQgICAgICAgICAgICAgIHZlcnNpb247ICAgICAgLyogZHJpdmVyIHZlcnNpb24gICAgICovCisgICAgRlRfU3RyaW5nKiAgICAgICAgICBkZXNjcmlwdGlvbjsgIC8qIGZvcm1hdCBkZXNjcmlwdGlvbiAqLworCisgICAgRlRfTGlzdFJlYyAgICAgICAgICBmYWNlc19saXN0OyAgIC8qIGRyaXZlcidzIGZhY2VzIGxpc3QgICAgKi8KKworICAgIHZvaWQqICAgICAgICAgICAgICAgZXh0ZW5zaW9uczsKKworICB9IEZUX0RyaXZlclJlYzsKKworCisjaWZkZWYgRlRfQ09ORklHX09QVElPTl9BTFRFUk5BVEVfR0xZUEhfRk9STUFUUworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLworICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KKyAgLyoqKiogICAgICAgICAgICAgICAgICAgICBHIEwgWSBQIEggICBGIE8gUiBNIEEgVCBTICAgICAgICAgICAgICAgICAgICoqKiovCisgIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLworICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICoKKyAgKiA8U3RydWN0PgorICAqICAgRlRfR2x5cGhfRm9ybWF0CisgICoKKyAgKiA8RGVzY3JpcHRpb24+CisgICogICBBIHN0cnVjdHVyZSB1c2VkIHRvIG1vZGVsIHZhcmlvdXMgcHJvcGVydGllcyBvZiBhIG5vbi1zdGFuZGFyZCAgIAorICAqICAgZ2x5cGggaW1hZ2UgZm9ybWF0LgorICAqCisgICogPEZpZWxkcz4KKyAgKiAgIGZvcm1hdF90YWcgICAgICAgIDo6IHRoZSBnbHlwaCBmb3JtYXQgdGFnCisgICoKKyAgKiAgIHJhc3Rlcl9pbnRlcmZhY2UgIDo6IHRoZSBkZWZhdWx0IHJhc3RlcnMgaW50ZXJmYWNlIGZvciB0aGlzIGdseXBoCisgICogICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQuCisgICoKKyAgKiAgIHJhc3RlciAgICAgICAgICAgIDo6IHRoZSBkZWZhdWx0IHJhc3RlciBvYmplY3QgZm9yIHRoaXMgZ2x5cGggZm9ybWF0CisgICogICAgICAgICAgICAgICAgICAgICAgICBpZiBzZXQgdG8gbmlsLCBhIG5ldyBvYmplY3Qgd2lsbCBiZSBhbGxvY2F0ZWQKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9tYXRpY2FsbHkgdGhyb3VnaCB0aGUgcmFzdGVyIGludGVyZmFjZS4KKyAgKgorICAqICAgcmFzdGVyX293bmVkICAgICAgOjogYSBib29sZWFuIHVzZWQgaW50ZXJuYWxseSBieSB0aGUgbGlicmFyeS4gSWYKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgIHNldCwgaWYgaW5kaWNhdGVzIHRoYXQgdGhlIGN1cnJlbnQgcmFzdGVyIG9iamVjdAorICAqICAgICAgICAgICAgICAgICAgICAgICAgd2FzIGFsbG9jYXRlZCBieSB0aGUgbGlicmFyeS4KKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAKKyAgdHlwZWRlZiBzdHJ1Y3QgRlRfR2x5cGhfRm9ybWF0XworICB7CisgICAgRlRfR2x5cGhfVGFnICAgICAgICAgICBmb3JtYXRfdGFnOworICAgIEZUX1Jhc3Rlcl9JbnRlcmZhY2UqICAgcmFzdGVyX2ludGVyZmFjZTsKKyAgICBGVF9SYXN0ZXIgICAgICAgICAgICAgIHJhc3RlcjsKKyAgICBGVF9Cb29sICAgICAgICAgICAgICAgIHJhc3Rlcl9hbGxvY2F0ZWQ7CisgIAorICB9IEZUX0dseXBoX0Zvcm1hdDsKKworCisgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKgorICAqIDxGdW5jdGlvbj4KKyAgKiAgIEZUX0FkZF9HbHlwaF9Gb3JtYXQKKyAgKgorICAqIDxEZXNjcmlwdGlvbj4KKyAgKiAgIFJlZ2lzdGVyIGEgbmV3IGdseXBoIGZvcm1hdCBpbnRvIHRoZSBsaWJyYXJ5CisgICoKKyAgKiA8SW5wdXQ+CisgICogICBsaWJyYXJ5ICAgOjogaGFuZGxlIHRvIHRhcmdldCBsaWJyYXJ5IG9iamVjdAorICAqICAgaW50ZXJmYWNlIDo6IHBvaW50ZXIgdG8gZ2x5cGggZm9ybWF0IGludGVyZmFjZQorICAqCisgICogPFJldHVybj4KKyAgKiAgIEVycm9yIGNvZGUuIDAgbWVhbnMgc3VjY2VzcworICAqCisgICogPE5vdGU+CisgICogICBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3JtYWxseSBiZSBjYWxsZWQgYnkgdGhvc2UgZm9udCBkcml2ZXJzIHdoaWNoCisgICogICBuZWVkIHRvIHVzZSB0aGVpciBvd24gZ2x5cGggaW1hZ2UgZm9ybWF0LgorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIAorICBFWFBPUlRfREVGCisgIEZUX0Vycm9yICBGVF9BZGRfR2x5cGhfRm9ybWF0KCBGVF9MaWJyYXJ5ICAgICAgICBsaWJyYXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfR2x5cGhfRm9ybWF0KiAgZm9ybWF0ICk7CisKKworIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICoKKyAgKiA8RnVuY3Rpb24+CisgICogICBGVF9SZW1vdmVfR2x5cGhfRm9ybWF0CisgICoKKyAgKiA8RGVzY3JpcHRpb24+CisgICogICBVbi1SZWdpc3RlciBhIGdpdmVuIGdseXBoIGZvcm1hdCBmcm9tIHRoZSBsaWJyYXJ5CisgICoKKyAgKiA8SW5wdXQ+CisgICogICBsaWJyYXJ5ICAgICAgOjogaGFuZGxlIHRvIHRhcmdldCBsaWJyYXJ5IG9iamVjdAorICAqICAgZ2x5cGhfZm9ybWF0IDo6IGdseXBoIGZvcm1hdCB0YWcKKyAgKgorICAqIDxSZXR1cm4+CisgICogICBFcnJvciBjb2RlLiAwIG1lYW5zIHN1Y2Nlc3MKKyAgKgorICAqIDxOb3RlPgorICAqICAgVGhpcyBmdW5jdGlvbiBzaG91bGQgbm9ybWFsbHkgYmUgY2FsbGVkIGJ5IHRob3NlIGZvbnQgZHJpdmVycyB3aGljaAorICAqICAgbmVlZCB0byB1c2UgdGhlaXIgb3duIGdseXBoIGltYWdlIGZvcm1hdC4KKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAKKyAgRVhQT1JUX0RFRgorICBGVF9FcnJvciAgRlRfUmVtb3ZlX0dseXBoX0Zvcm1hdCggRlRfTGlicmFyeSAgICAgbGlicmFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0dseXBoX1RhZyAgIGdseXBoX2Zvcm1hdCApOworCisgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKgorICAqIDxGdW5jdGlvbj4KKyAgKiAgIEZUX0dldF9HbHlwaF9Gb3JtYXQKKyAgKgorICAqIDxEZXNjcmlwdGlvbj4KKyAgKiAgIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGdseXBoIGZvcm1hdCBkZXNjcmlwdG9yIGNvcnJlc3BvbmRpbmcgdG8KKyAgKiAgIGEgZ2l2ZW4gZm9ybWF0IHRhZy4KKyAgKgorICAqIDxJbnB1dD4KKyAgKiAgIGxpYnJhcnkgICAgOjogaGFuZGxlIHRvIHNvdXJjZSBsaWJyYXJ5IG9iamVjdAorICAqCisgICogICBmb3JtYXRfdGFnIDo6IGdseXBoIGZvcm1hdCB0YWcKKyAgKgorICAqIDxSZXR1cm4+CisgICogICBhIHBvaW50ZXIgdG8gdGhlIGNvcnJlc3BvbmRpbmcgZ2x5cGggZm9ybWF0IGRlc2NyaXB0b3IsIGlmIGl0IHdhcworICAqICAgcmVnaXN0ZXJlZCBpbiB0aGUgbGlicmFyeS4gMCBvdGhlcndpc2UuCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgCisgIEJBU0VfREVGCisgIEZUX0dseXBoX0Zvcm1hdCogIEZUX0dldF9HbHlwaF9Gb3JtYXQoIEZUX0xpYnJhcnkgICAgbGlicmFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfR2x5cGhfVGFnICBmb3JtYXRfdGFnICk7CisKKworCisjZW5kaWYgLyogRlRfQ09ORklHX09QVElPTl9BTFRFUk5BVEVfR0xZUEhfRk9STUFUUyAqLworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLworICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KKyAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgIEwgSSBCIFIgQSBSIEkgRSBTICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCisgIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLworICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBGVF9ERUJVR19IT09LX1RSVUVUWVBFICAgMAorI2RlZmluZSBGVF9ERUJVR19IT09LX1RZUEUxICAgICAgMQorCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0xpYnJhcnlSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoZSBGcmVlVHlwZSBsaWJyYXJ5IGNsYXNzLiAgVGhpcyBpcyB0aGUgcm9vdCBvZiBhbGwgRnJlZVR5cGUgICAgICAqLworICAvKiAgICBkYXRhLiAgVXNlIEZUX05ld19MaWJyYXJ5KCkgdG8gY3JlYXRlIGEgbGlicmFyeSBvYmplY3QsIGFuZCAgICAgICAgKi8KKyAgLyogICAgRlRfRG9uZV9MaWJyYXJ5KCkgdG8gZGlzY2FyZCBpdCBhbmQgYWxsIGNoaWxkIG9iamVjdHMuICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbWVtb3J5ICAgICAgICAgOjogVGhlIGxpYnJhcnkncyBtZW1vcnkgb2JqZWN0LiAgTWFuYWdlcyBtZW1vcnkgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZ2VuZXJpYyAgICAgICAgOjogQ2xpZW50IGRhdGEgdmFyaWFibGUuICBVc2VkIHRvIGV4dGVuZCB0aGUgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgIExpYnJhcnkgY2xhc3MgYnkgaGlnaGVyIGxldmVscyBhbmQgY2xpZW50cy4gICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbnVtX2RyaXZlcnMgICAgOjogVGhlIG51bWJlciBvZiBkcml2ZXJzIGN1cnJlbnRseSByZWdpc3RlcmVkICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgIHdpdGhpbiB0aGlzIGxpYnJhcnkuICBUaGlzIGlzIHNldCB0byAwIGZvciBuZXcgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICBsaWJyYXJpZXMuICBOZXcgZHJpdmVycyBhcmUgYWRkZWQgdGhyb3VnaCB0aGUgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgRlRfQWRkX0RyaXZlcigpIEFQSSBmdW5jdGlvbi4gICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBkcml2ZXJzICAgICAgICA6OiBBIHRhYmxlIHVzZWQgdG8gc3RvcmUgaGFuZGxlcyB0byB0aGUgY3VycmVudGx5ICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJlZCBmb250IGRyaXZlcnMuICBOb3RlIHRoYXQgZWFjaCBkcml2ZXIgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5zIGEgbGlzdCBvZiBpdHMgb3BlbmVkIGZhY2VzLiAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZ2x5cGhfZm9ybWF0cyAgOjogQSB0YWJsZSB1c2VkIHRvIHN0b3JlIGdseXBoIGZvcm1hdCBkZXNjcmlwdG9ycyAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgIGZvciBuZXcgaW1hZ2UgZm9ybWF0cyB0aGF0IG1heSBoYXZlIGJlZW4gICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlcmVkIHdpdGhpbiB0aGUgbGlicmFyeSAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHJhc3Rlcl9wb29sICAgIDo6IFRoZSByYXN0ZXIgb2JqZWN0J3MgcmVuZGVyIHBvb2wuICBUaGlzIGNhbiAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICBpZGVhbGx5IGJlIGNoYW5nZWQgZHluYW1pY2FsbHkgYXQgcnVuLXRpbWUuICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgIHZvaWQgICgqRlRfRGVidWdIb29rX0Z1bmMpKCB2b2lkKiBhcmcgKTsKKyAgCisgIHR5cGVkZWYgc3RydWN0ICBGVF9MaWJyYXJ5UmVjXworICB7CisgICAgRlRfTWVtb3J5ICAgICAgICAgICBtZW1vcnk7ICAgICAgICAgLyogbGlicmFyeSdzIG1lbW9yeSBvYmplY3QgICAgICAgICAgKi8KKworICAgIEZUX0dlbmVyaWMgICAgICAgICAgZ2VuZXJpYzsKKworICAgIEZUX0ludCAgICAgICAgICAgICAgbnVtX2RyaXZlcnM7CisgICAgRlRfRHJpdmVyICAgICAgICAgICBkcml2ZXJzWyBGVF9NQVhfRFJJVkVSUyBdOyAgLyogZHJpdmVyIG9iamVjdHMgICovCisKKyAgICBGVF9HbHlwaF9Gb3JtYXQgICAgIGdseXBoX2Zvcm1hdHNbRlRfTUFYX0dMWVBIX0ZPUk1BVFNdOworCisgICAgdm9pZCogICAgICAgICAgICAgICByYXN0ZXJfcG9vbDsgICAgLyogc2Nhbi1saW5lIGNvbnZlcnNpb24gcmVuZGVyIHBvb2wgKi8KKworICAgIEZUX0RlYnVnSG9va19GdW5jICAgZGVidWdfaG9va3NbNF07CisKKyAgfSBGVF9MaWJyYXJ5UmVjOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfTmV3X0xpYnJhcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGNyZWF0ZSBhIG5ldyBGcmVlVHlwZSBsaWJyYXJ5IGluc3RhbmNlICAgICovCisgIC8qICAgIGZyb20gYSBnaXZlbiBtZW1vcnkgb2JqZWN0LiAgSXQgaXMgdGh1cyBwb3NzaWJsZSB0byB1c2UgbGlicmFyaWVzICAqLworICAvKiAgICB3aXRoIGRpc3RpbmN0IG1lbW9yeSBhbGxvY2F0b3JzIHdpdGhpbiB0aGUgc2FtZSBwcm9ncmFtLiAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBtZW1vcnkgIDo6IEEgaGFuZGxlIHRvIHRoZSBvcmlnaW5hbCBtZW1vcnkgb2JqZWN0LiAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBsaWJyYXJ5IDo6IEEgaGFuZGxlIHRvIGEgbmV3IGxpYnJhcnkgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBFcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGlzIGZ1bmN0aW9uIGlzIG5vcm1hbGx5IG5vdCBjYWxsZWQgYnkgY2xpZW50IGFwcGxpY2F0aW9ucywgICAgICAgKi8KKyAgLyogICAgdW5sZXNzIHRoZXkgd2FudCB0byBjcmVhdGUgYSBzcGVjaWZpYyBpbnN0YW5jZSBvZiBGcmVlVHlwZSB3aGljaCAgICovCisgIC8qICAgIHVzZXMgYSBzcGVjaWZpYyBtZW1vcnkgYWxsb2NhdG9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgRVhQT1JUX0RFRgorICBGVF9FcnJvciAgRlRfTmV3X0xpYnJhcnkoIEZUX01lbW9yeSAgICBtZW1vcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTGlicmFyeSogIGxpYnJhcnkgKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0RvbmVfTGlicmFyeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIERpc2NhcmRzIGEgZ2l2ZW4gbGlicmFyeSBvYmplY3QuICBUaGlzIGNsb3NlcyBhbGwgZHJpdmVycyBhbmQgICAgICAqLworICAvKiAgICBkaXNjYXJkcyBhbGwgZmFjZSBvYmplY3RzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBsaWJyYXJ5IDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgbGlicmFyeS4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBFcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEVYUE9SVF9ERUYKKyAgRlRfRXJyb3IgIEZUX0RvbmVfTGlicmFyeSggRlRfTGlicmFyeSAgbGlicmFyeSApOworCisKKworICBFWFBPUlRfREVGCisgIHZvaWQgIEZUX1NldF9EZWJ1Z19Ib29rKCBGVF9MaWJyYXJ5ICAgICAgICAgbGlicmFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICAgICBob29rX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRGVidWdIb29rX0Z1bmMgIGRlYnVnX2hvb2sgKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0FkZF9Ecml2ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFJlZ2lzdGVycyBhIG5ldyBkcml2ZXIgaW4gYSBnaXZlbiBsaWJyYXJ5IG9iamVjdC4gIFRoaXMgZnVuY3Rpb24gICAqLworICAvKiAgICB0YWtlcyBvbmx5IGEgcG9pbnRlciB0byBhIGRyaXZlciBpbnRlcmZhY2UuICBJdCB1c2VzIGl0IHRvIGNyZWF0ZSAgKi8KKyAgLyogICAgdGhlIG5ldyBkcml2ZXIsIHRoZW4gc2V0cyB1cCBzb21lIGltcG9ydGFudCBmaWVsZHMuICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbGlicmFyeSAgICAgICAgICA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGxpYnJhcnkgb2JqZWN0LiAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBkcml2ZXJfaW50ZXJmYWNlIDo6IEEgcG9pbnRlciB0byBhIGRyaXZlciBpbnRlcmZhY2UgdGFibGUuICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBFcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGlzIGZ1bmN0aW9uIGRvZXNuJ3QgY2hlY2sgd2hldGhlciB0aGUgZHJpdmVyIGlzIGFscmVhZHkgICAgICAgICAgKi8KKyAgLyogICAgaW5zdGFsbGVkISAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBFWFBPUlRfREVGCisgIEZUX0Vycm9yICBGVF9BZGRfRHJpdmVyKCBGVF9MaWJyYXJ5ICAgICAgICAgICAgICAgICBsaWJyYXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfRHJpdmVySW50ZXJmYWNlKiAgZHJpdmVyX2ludGVyZmFjZSApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfUmVtb3ZlX0RyaXZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVW5yZWdpc3RlciBhIGdpdmVuIGRyaXZlci4gIFRoaXMgY2xvc2VzIHRoZSBkcml2ZXIsIHdoaWNoIGluIHR1cm4gICovCisgIC8qICAgIGRlc3Ryb3lzIGFsbCBmYWNlcywgc2l6ZXMsIHNsb3RzLCBldGMuIGFzc29jaWF0ZWQgd2l0aCBpdC4gICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhpcyBmdW5jdGlvbiBhbHNvIERFU1RST1lTIHRoZSBkcml2ZXIgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZHJpdmVyIDo6IEEgaGFuZGxlIHRvIHRhcmdldCBkcml2ZXIgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBFWFBPUlRfREVGCisgIEZUX0Vycm9yICBGVF9SZW1vdmVfRHJpdmVyKCBGVF9Ecml2ZXIgIGRyaXZlciApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfR2V0X0RyaXZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgcmV0dXJucyB0aGUgaGFuZGxlIG9mIHRoZSBkcml2ZXIgcmVzcG9uc2libGUgZm9yIGEgZ2l2ZW4gZm9ybWF0ICAgICovCisgIC8qICAgIChvciBzZXJ2aWNlKSBhY2NvcmRpbmcgdG8gaXRzIGBuYW1lJy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGxpYnJhcnkgICAgIDo6IGhhbmRsZSB0byBsaWJyYXJ5IG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBkcml2ZXJfbmFtZSA6OiBuYW1lIG9mIGRyaXZlciB0byBsb29rLXVwLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBoYW5kbGUgdG8gZHJpdmVyIG9iamVjdC4gMCBvdGhlcndpc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEVYUE9SVF9ERUYKKyAgRlRfRHJpdmVyICBGVF9HZXRfRHJpdmVyKCBGVF9MaWJyYXJ5ICBsaWJyYXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqICAgICAgIGRyaXZlcl9uYW1lICk7CisKKyNpZm5kZWYgRlRfQ09ORklHX09QVElPTl9OT19ERUZBVUxUX1NZU1RFTQorCisgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICoKKyAgKiA8RnVuY3Rpb24+CisgICogICBGVF9OZXdfU3RyZWFtCisgICoKKyAgKiA8RGVzY3JpcHRpb24+CisgICogICBPcGVuIGEgbmV3IHN0cmVhbSBmcm9tIGEgZ2l2ZW4gc3RhbmRhcmQgQVNDSUkgZmlsZSBwYXRoIG5hbWUKKyAgKgorICAqIDxJbnB1dD4KKyAgKiAgIGZpbGVwYXRobmFtZSAgOjogYW4gQVNDSUkgc3RyaW5nIG5hbWluZyB0aGUgZmlsZSB0byBiZSBvcGVuZWQKKyAgKiAKKyAgKiA8T3V0cHV0PgorICAqICAgYXN0cmVhbSA6OiB0aGUgb3BlbmVkIHN0cmVhbSBkZXNjcmlwdG9yIHRvIGJlIHVzZWQgYnkgdGhlIGxpYnJhcnkKKyAgKgorICAqIDxSZXR1cm4+CisgICogICBFcnJvciBjb2RlLiAwIG1lYW5zIHN1Y2Nlc3MKKyAgKgorICAqIDxOb3RlPgorICAqICAgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IHRoZSBzeXN0ZW0tc3BlY2lmaWMgcGFydAorICAqICAgb2YgdGhlIGVuZ2luZSwgaS5lLiBgZnRzeXN0ZW0uYycuCisgICoKKyAgKiAgIFRoaXMgZnVuY3Rpb24gc2hvdWxkIG9ubHkgZmlsbCB0aGUgc3RyZWFtIGRlc2NyaXB0b3IuIE5vdGUgdGhhdAorICAqICAgdGhlIHN0cmVhbSdzIGBtZW1vcnknIGZpZWxkIHNob3VsZCBiZSBsZWZ0IHRvIHRoZSBjYWxsZXIuCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIAorICBleHRlcm4KKyAgRlRfRXJyb3IgIEZUX05ld19TdHJlYW0oIGNvbnN0IGNoYXIqICBmaWxlcGF0aG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gICAgYXN0cmVhbSApOworCisKKyAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKgorICAqIDxGdW5jdGlvbj4KKyAgKiAgIEZUX05ld19NZW1vcnkKKyAgKgorICAqIDxEZXNjcmlwdGlvbj4KKyAgKiAgIFJldHVybnMgYSBoYW5kbGUgdG8gYSBuZXcgbWVtb3J5IG9iamVjdAorICAqCisgICogPFJldHVybj4KKyAgKiAgIEhhbmRsZSB0byB0aGUgbWVtb3J5IG9iamVjdC4gMCBtZWFucyBmYWlsdXJlCisgICoKKyAgKiA8Tm90ZT4KKyAgKiAgIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBpbXBsZW1lbnRlZCBieSB0aGUgc3lzdGVtLXNwZWNpZmljIHBhcnQKKyAgKiAgIG9mIHRoZSBlbmdpbmUsIGkuZS4gYGZ0c3lzdGVtLmMnLgorICAqCisgICogICBJdCBpcyBvbmx5IHVzZWQgYnkgYGZ0aW5pdCcgaW4gb3JkZXIgdG8gaW1wbGVtZW50IHRoZSBmdW5jdGlvbgorICAqICAgRlRfSW5pdF9GcmVlVHlwZS4KKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgCisgIGV4dGVybgorICBGVF9NZW1vcnkgIEZUX05ld19NZW1vcnkoIHZvaWQgKTsKKworI2VuZGlmCisKKy8qIERlZmluZSBkZWZhdWx0IHJhc3RlcidzIGludGVyZmFjZS4gVGhlIGRlZmF1bHQgcmFzdGVyIGlzIGxvY2F0ZWQgaW4gYHNyYy9iYXNlL2Z0cmFzdGVyLmMnICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogQ2xpZW50IGFwcGxpY2F0aW9ucyBjYW4gcmVnaXN0ZXIgbmV3IHJhc3RlcnMgdGhyb3VnaCB0aGUgRlRfU2V0X1Jhc3RlciBBUEkuLiAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjaWZuZGVmIEZUX05PX0RFRkFVTFRfUkFTVEVSCisgIGV4dGVybgorICBGVF9SYXN0ZXJfSW50ZXJmYWNlICBmdF9kZWZhdWx0X3Jhc3RlcjsKKyNlbmRpZgorCisKKyNlbmRpZiAvKiBGVE9CSlNfSCAqLworCisKKy8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2Jhc2UvZnRvdXRsbi5jIGIvc3JjL2Jhc2UvZnRvdXRsbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2ZjkxNjAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvYmFzZS9mdG91dGxuLmMKQEAgLTAsMCArMSwyODYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGZ0b3V0bG4uYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGcmVlVHlwZSBvdXRsaW5lIG1hbmFnZW1lbnQgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMTk5Ni0xOTk5IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQgICAgICAgICovCisvKiAgbW9kaWZpZWQgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICAqLworLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KKy8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCisvKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIEFsbCBmdW5jdGlvbnMgYXJlIGRlY2xhcmVkIGluIGZyZWV0eXBlLmguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2luY2x1ZGUgPGZyZWV0eXBlLmg+CisjaW5jbHVkZSA8ZnRjb25maWcuaD4KKyNpbmNsdWRlIDxmdG9ianMuaD4KKyNpbmNsdWRlIDxmdGltYWdlLmg+CisjaW5jbHVkZSA8ZnRvdXRsbi5oPgorCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0NvcHlfT3V0bGluZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIENvcGllcyBhbiBvdXRsaW5lIGludG8gYW5vdGhlciBvbmUuICBCb3RoIG9iamVjdHMgbXVzdCBoYXZlIHRoZSAgICAqLworICAvKiAgICBzYW1lIHNpemVzIChudW1iZXIgb2YgcG9pbnRzICYgbnVtYmVyIG9mIGNvbnRvdXJzKSB3aGVuIHRoaXMgICAgICAgKi8KKyAgLyogICAgZnVuY3Rpb24gaXMgY2FsbGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgc291cmNlIDo6IEEgaGFuZGxlIHRvIHRoZSBzb3VyY2Ugb3V0bGluZS4gICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHRhcmdldCA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IG91dGxpbmUuICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgQkFTRV9GVU5DCisgIEZUX0Vycm9yICBGVF9Db3B5X091dGxpbmUoIEZUX091dGxpbmUqICBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX091dGxpbmUqICB0YXJnZXQgKQorICB7CisgICAgaWYgKCAhc291cmNlICAgICAgICAgICAgfHwgIXRhcmdldCAgICAgICAgICAgIHx8CisgICAgICAgICBzb3VyY2UtPm5fcG9pbnRzICAgIT0gdGFyZ2V0LT5uX3BvaW50cyAgIHx8CisgICAgICAgICBzb3VyY2UtPm5fY29udG91cnMgIT0gdGFyZ2V0LT5uX2NvbnRvdXJzICkKKyAgICAgIHJldHVybiBGVF9FcnJfSW52YWxpZF9Bcmd1bWVudDsKKworICAgIE1FTV9Db3B5KCB0YXJnZXQtPnBvaW50cywgc291cmNlLT5wb2ludHMsCisgICAgICAgICAgICAgIHNvdXJjZS0+bl9wb2ludHMgKiAyICogc2l6ZW9mICggRlRfUG9zICkgKTsKKworICAgIE1FTV9Db3B5KCB0YXJnZXQtPmZsYWdzLCBzb3VyY2UtPmZsYWdzLAorICAgICAgICAgICAgICBzb3VyY2UtPm5fcG9pbnRzICogc2l6ZW9mICggRlRfQnl0ZSApICk7CisKKyAgICBNRU1fQ29weSggdGFyZ2V0LT5jb250b3Vycywgc291cmNlLT5jb250b3VycywKKyAgICAgICAgICAgICAgc291cmNlLT5uX2NvbnRvdXJzICogc2l6ZW9mICggRlRfU2hvcnQgKSApOworCisgICAgdGFyZ2V0LT5oaWdoX3ByZWNpc2lvbiA9IHNvdXJjZS0+aGlnaF9wcmVjaXNpb247CisgICAgdGFyZ2V0LT5zZWNvbmRfcGFzcyAgICA9IHRhcmdldC0+c2Vjb25kX3Bhc3M7CisgICAgdGFyZ2V0LT5kcm9wb3V0X21vZGUgICA9IHNvdXJjZS0+ZHJvcG91dF9tb2RlOworCisgICAgcmV0dXJuIEZUX0Vycl9PazsKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfR2V0X091dGxpbmVfQml0bWFwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgUmVuZGVycyBhbiBvdXRsaW5lIHdpdGhpbiBhIGJpdG1hcC4gIFRoZSBvdXRsaW5lJ3MgaW1hZ2UgaXMgc2ltcGx5ICovCisgIC8qICAgIG9yLWVkIHRvIHRoZSB0YXJnZXQgYml0bWFwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBsaWJyYXJ5IDo6IEEgaGFuZGxlIHRvIGEgRnJlZVR5cGUgbGlicmFyeSBvYmplY3QuICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgb3V0bGluZSA6OiBBIHBvaW50ZXIgdG8gdGhlIHNvdXJjZSBvdXRsaW5lIGRlc2NyaXB0b3IuICAgICAgICAgICAgICovCisgIC8qICAgIG1hcCAgICAgOjogQSBwb2ludGVyIHRvIHRoZSB0YXJnZXQgYml0bWFwIGRlc2NyaXB0b3IuICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE1ULU5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFlFUy4gIFJlbmRlcmluZyBpcyBzeW5jaHJvbml6ZWQsIHNvIHRoYXQgY29uY3VycmVudCBjYWxscyB0byB0aGUgICAqLworICAvKiAgICBzY2FuLWxpbmUgY29udmVydGVyIHdpbGwgYmUgc2VyaWFsaXplZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGlzIGZ1bmN0aW9uIGRvZXMgTk9UIENSRUFURSB0aGUgYml0bWFwLCBpdCBvbmx5IHJlbmRlcnMgYW4gICAgICAgKi8KKyAgLyogICAgb3V0bGluZSBpbWFnZSB3aXRoaW4gdGhlIG9uZSB5b3UgcGFzcyB0byBpdCEgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBJdCB3aWxsIHVzZSB0aGUgcmFzdGVyIGNvcnJlcG9uZGluZyB0byB0aGUgZGVmYXVsdCBnbHlwaCBmb3JtYXQuICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEJBU0VfRlVOQworICBGVF9FcnJvciAgRlRfR2V0X091dGxpbmVfQml0bWFwKCBGVF9MaWJyYXJ5ICAgbGlicmFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfT3V0bGluZSogIG91dGxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0JpdG1hcCogICBtYXAgKQorICB7CisgICAgRlRfRXJyb3IgICAgICAgICAgZXJyb3I7CisgICAgRlRfR2x5cGhfRm9ybWF0KiAgZm9ybWF0OworICAgIAorICAgIGVycm9yICA9IEZUX0Vycl9JbnZhbGlkX0dseXBoX0Zvcm1hdDsKKyAgICBmb3JtYXQgPSBGVF9HZXRfR2x5cGhfRm9ybWF0KCBsaWJyYXJ5LCBmdF9nbHlwaF9mb3JtYXRfb3V0bGluZSApOworICAgIGlmICghZm9ybWF0KSBnb3RvIEV4aXQ7CisgICAgCisgICAgZXJyb3IgPSBGVF9FcnJfSW52YWxpZF9HbHlwaF9Gb3JtYXQ7CisgICAgaWYgKCFmb3JtYXQtPnJhc3RlcikgZ290byBFeGl0OworCisgICAgZXJyb3IgPSBmb3JtYXQtPnJhc3Rlcl9pbnRlcmZhY2UtPnJlbmRlciggZm9ybWF0LT5yYXN0ZXIsIG91dGxpbmUsIG1hcCApOworICBFeGl0OgorICAgIHJldHVybiBlcnJvcjsgCisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX1RyYW5zZm9ybV9PdXRsaW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEFwcGxpZXMgYSBzaW1wbGUgMngyIG1hdHJpeCB0byBhbGwgb2YgYW4gb3V0bGluZSdzIHBvaW50cy4gIFVzZWZ1bCAqLworICAvKiAgICBmb3IgYXBwbHlpbmcgcm90YXRpb25zLCBzbGFudGluZywgZmxpcHBpbmcsIGV0Yy4gICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBvdXRsaW5lIDo6IEEgcG9pbnRlciB0byB0aGUgdGFyZ2V0IG91dGxpbmUgZGVzY3JpcHRvci4gICAgICAgICAgICAgKi8KKyAgLyogICAgbWF0cml4ICA6OiBBIHBvaW50ZXIgdG8gdGhlIHRyYW5zZm9ybWF0aW9uIG1hdHJpeC4gICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8TVQtTm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgWWVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgWW91IGNhbiB1c2UgRlRfVHJhbnNsYXRlX091dGxpbmUoKSBpZiB5b3UgbmVlZCB0byB0cmFuc2xhdGUgdGhlICAgICovCisgIC8qICAgIG91dGxpbmUncyBwb2ludHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgQkFTRV9GVU5DCisgIHZvaWQgIEZUX1RyYW5zZm9ybV9PdXRsaW5lKCBGVF9PdXRsaW5lKiAgb3V0bGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX01hdHJpeCogICBtYXRyaXggKQorICB7CisgICAgRlRfVVNob3J0ICAgbjsKKyAgICBGVF9WZWN0b3IqICB2ZWM7CisKKworICAgIHZlYyA9IG91dGxpbmUtPnBvaW50czsKKyAgICBmb3IgKCBuID0gMDsgbiA8IG91dGxpbmUtPm5fcG9pbnRzOyBuKysgKQorICAgIHsKKyAgICAgIEZUX1BvcyAgeCwgeTsKKworCisgICAgICB4ID0gRlRfTXVsRml4KCB2ZWMtPngsIG1hdHJpeC0+eHggKSArCisgICAgICAgICAgRlRfTXVsRml4KCB2ZWMtPnksIG1hdHJpeC0+eHkgKTsKKworICAgICAgeSA9IEZUX011bEZpeCggdmVjLT54LCBtYXRyaXgtPnl4ICkgKworICAgICAgICAgIEZUX011bEZpeCggdmVjLT55LCBtYXRyaXgtPnl5ICk7CisKKyAgICAgIHZlYy0+eCA9IHg7CisgICAgICB2ZWMtPnkgPSB5OworICAgICAgdmVjKys7CisgICAgfQorICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9UcmFuc2Zvcm1fVmVjdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUcmFuc2Zvcm1zIGEgc2luZ2xlIHZlY3RvciB0aHJvdWdoIGEgMngyIG1hdHJpeC4gICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB4ICAgICAgOjogVGhlIGhvcml6b250YWwgdmVjdG9yIGNvb3JkaW5hdGUuICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgeSAgICAgIDo6IFRoZSB2ZXJ0aWNhbCB2ZWN0b3IgY29vcmRpbmF0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbWF0cml4IDo6IEEgcG9pbnRlciB0byB0aGUgc291cmNlIDJ4MiBtYXRyaXguICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8TVQtTm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgWWVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBCQVNFX0ZVTkMKKyAgdm9pZCAgRlRfVHJhbnNmb3JtX1ZlY3RvciggRlRfUG9zKiAgICAgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9zKiAgICAgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTWF0cml4KiAgbWF0cml4ICkKKyAgeworICAgIEZUX1BvcyB4eiwgeXo7CisKKworICAgIHh6ID0gRlRfTXVsRml4KCAqeCwgbWF0cml4LT54eCApICsKKyAgICAgICAgIEZUX011bEZpeCggKnksIG1hdHJpeC0+eHkgKTsKKworICAgIHl6ID0gRlRfTXVsRml4KCAqeCwgbWF0cml4LT55eCApICsKKyAgICAgICAgIEZUX011bEZpeCggKnksIG1hdHJpeC0+eXkgKTsKKworICAgICp4ID0geHo7CisgICAgKnkgPSB5ejsKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfTWF0cml4X011bHRpcGx5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgUGVyZm9ybXMgdGhlIG1hdHJpeCBvcGVyYXRpb24gYGIgPSBhKmInLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgYSA6OiBBIHBvaW50ZXIgdG8gbWF0cml4IGBhJy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgYiA6OiBBIHBvaW50ZXIgdG8gbWF0cml4IGBiJy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8TVQtTm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgWWVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBCQVNFX0ZVTkMKKyAgdm9pZCAgRlRfTWF0cml4X011bHRpcGx5KCBGVF9NYXRyaXgqICBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX01hdHJpeCogIGIgKQorICB7CisgICAgRlRfRml4ZWQgIHh4LCB4eSwgeXgsIHl5OworCisKKyAgICB4eCA9IEZUX011bEZpeCggYS0+eHgsIGItPnh4ICkgKyBGVF9NdWxGaXgoIGEtPnh5LCBiLT55eCApOworICAgIHh5ID0gRlRfTXVsRml4KCBhLT54eCwgYi0+eHkgKSArIEZUX011bEZpeCggYS0+eHksIGItPnl5ICk7CisgICAgeXggPSBGVF9NdWxGaXgoIGEtPnl4LCBiLT54eCApICsgRlRfTXVsRml4KCBhLT55eSwgYi0+eXggKTsKKyAgICB5eSA9IEZUX011bEZpeCggYS0+eXgsIGItPnh5ICkgKyBGVF9NdWxGaXgoIGEtPnl5LCBiLT55eSApOworCisgICAgYi0+eHggPSB4eDsgIGItPnh5ID0geHk7CisgICAgYi0+eXggPSB5eDsgIGItPnl5ID0geXk7CisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX01hdHJpeF9JbnZlcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEludmVydHMgYSAyeDIgbWF0cml4LiAgUmV0dXJucyBhbiBlcnJvciBpZiBpdCBjYW4ndCBiZSBpbnZlcnRlZC4gICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG1hdHJpeCA6OiBBIHBvaW50ZXIgdG8gdGhlIHRhcmdldCBtYXRyaXguICBSZW1haW5zIHVudG91Y2hlZCBpbiAgICAqLworICAvKiAgICAgICAgICAgICAgY2FzZSBvZiBlcnJvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxNVC1Ob3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBZZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEJBU0VfRlVOQworICBGVF9FcnJvciAgRlRfTWF0cml4X0ludmVydCggRlRfTWF0cml4KiAgbWF0cml4ICkKKyAgeworICAgIEZUX1BvcyAgZGVsdGEsIHh4LCB5eTsKKworCisgICAgLyogY29tcHV0ZSBkaXNjcmltaW5hbnQgKi8KKyAgICBkZWx0YSA9IEZUX011bEZpeCggbWF0cml4LT54eCwgbWF0cml4LT55eSApIC0KKyAgICAgICAgICAgIEZUX011bEZpeCggbWF0cml4LT54eSwgbWF0cml4LT55eCApOworCisgICAgaWYgKCAhZGVsdGEgKQorICAgICAgcmV0dXJuIEZUX0Vycl9JbnZhbGlkX0FyZ3VtZW50OyAgLyogbWF0cml4IGNhbid0IGJlIGludmVydGVkICovCisKKyAgICBtYXRyaXgtPnh5ID0gLSBGVF9EaXZGaXgoIG1hdHJpeC0+eHksIGRlbHRhICk7CisgICAgbWF0cml4LT55eCA9IC0gRlRfRGl2Rml4KCBtYXRyaXgtPnl4LCBkZWx0YSApOworCisgICAgeHggPSBtYXRyaXgtPnh4OworICAgIHl5ID0gbWF0cml4LT55eTsKKworICAgIG1hdHJpeC0+eHggPSBGVF9EaXZGaXgoIHl5LCBkZWx0YSApOworICAgIG1hdHJpeC0+eXkgPSBGVF9EaXZGaXgoIHh4LCBkZWx0YSApOworCisgICAgcmV0dXJuIEZUX0Vycl9PazsKKyAgfQorCisKKy8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2Jhc2UvZnRvdXRsbi5oIGIvc3JjL2Jhc2UvZnRvdXRsbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4Y2U3Y2MKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvYmFzZS9mdG91dGxuLmgKQEAgLTAsMCArMSwxNTMgQEAKKyNpZm5kZWYgRlRPVVRMTl9ICisjZGVmaW5lIEZUT1VUTE5fSAorCisjaW5jbHVkZSA8ZnRvYmpzLmg+CisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfQ29weV9PdXRsaW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQ29waWVzIGFuIG91dGxpbmUgaW50byBhbm90aGVyIG9uZS4gIEJvdGggb2JqZWN0cyBtdXN0IGhhdmUgdGhlICAgICovCisgIC8qICAgIHNhbWUgc2l6ZXMgKG51bWJlciBvZiBwb2ludHMgJiBudW1iZXIgb2YgY29udG91cnMpIHdoZW4gdGhpcyAgICAgICAqLworICAvKiAgICBmdW5jdGlvbiBpcyBjYWxsZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzb3VyY2UgOjogQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBvdXRsaW5lLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgdGFyZ2V0IDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgb3V0bGluZS4gICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBFWFBPUlRfREVGCisgIEZUX0Vycm9yICBGVF9Db3B5X091dGxpbmUoIEZUX091dGxpbmUqICBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX091dGxpbmUqICB0YXJnZXQgKTsKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9HZXRfT3V0bGluZV9CaXRtYXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBSZW5kZXJzIGFuIG91dGxpbmUgd2l0aGluIGEgYml0bWFwLiAgVGhlIG91dGxpbmUncyBpbWFnZSBpcyBzaW1wbHkgKi8KKyAgLyogICAgb3ItZWQgdG8gdGhlIHRhcmdldCBiaXRtYXAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGxpYnJhcnkgOjogQSBoYW5kbGUgdG8gYSBGcmVlVHlwZSBsaWJyYXJ5IG9iamVjdC4gICAgICAgICAgICAgICAgICAqLworICAvKiAgICBvdXRsaW5lIDo6IEEgcG9pbnRlciB0byB0aGUgc291cmNlIG91dGxpbmUgZGVzY3JpcHRvci4gICAgICAgICAgICAgKi8KKyAgLyogICAgbWFwICAgICA6OiBBIHBvaW50ZXIgdG8gdGhlIHRhcmdldCBiaXRtYXAgZGVzY3JpcHRvci4gICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8TVQtTm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgWUVTLiAgUmVuZGVyaW5nIGlzIHN5bmNocm9uaXplZCwgc28gdGhhdCBjb25jdXJyZW50IGNhbGxzIHRvIHRoZSAgICovCisgIC8qICAgIHNjYW4tbGluZSBjb252ZXJ0ZXIgd2lsbCBiZSBzZXJpYWxpemVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoaXMgZnVuY3Rpb24gZG9lcyBOT1QgQ1JFQVRFIHRoZSBiaXRtYXAsIGl0IG9ubHkgcmVuZGVycyBhbiAgICAgICAqLworICAvKiAgICBvdXRsaW5lIGltYWdlIHdpdGhpbiB0aGUgb25lIHlvdSBwYXNzIHRvIGl0ISAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEl0IHdpbGwgdXNlIHRoZSByYXN0ZXIgY29ycmVwb25kaW5nIHRvIHRoZSBkZWZhdWx0IGdseXBoIGZvcm1hdC4gICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgRVhQT1JUX0RFRgorICBGVF9FcnJvciAgRlRfR2V0X091dGxpbmVfQml0bWFwKCBGVF9MaWJyYXJ5ICAgbGlicmFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfT3V0bGluZSogIG91dGxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0JpdG1hcCogICBtYXAgKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX1RyYW5zZm9ybV9PdXRsaW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEFwcGxpZXMgYSBzaW1wbGUgMngyIG1hdHJpeCB0byBhbGwgb2YgYW4gb3V0bGluZSdzIHBvaW50cy4gIFVzZWZ1bCAqLworICAvKiAgICBmb3IgYXBwbHlpbmcgcm90YXRpb25zLCBzbGFudGluZywgZmxpcHBpbmcsIGV0Yy4gICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBvdXRsaW5lIDo6IEEgcG9pbnRlciB0byB0aGUgdGFyZ2V0IG91dGxpbmUgZGVzY3JpcHRvci4gICAgICAgICAgICAgKi8KKyAgLyogICAgbWF0cml4ICA6OiBBIHBvaW50ZXIgdG8gdGhlIHRyYW5zZm9ybWF0aW9uIG1hdHJpeC4gICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8TVQtTm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgWWVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgWW91IGNhbiB1c2UgRlRfVHJhbnNsYXRlX091dGxpbmUoKSBpZiB5b3UgbmVlZCB0byB0cmFuc2xhdGUgdGhlICAgICovCisgIC8qICAgIG91dGxpbmUncyBwb2ludHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgRVhQT1JUX0RFRgorICB2b2lkICBGVF9UcmFuc2Zvcm1fT3V0bGluZSggRlRfT3V0bGluZSogIG91dGxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9NYXRyaXgqICAgbWF0cml4ICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9UcmFuc2Zvcm1fVmVjdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUcmFuc2Zvcm1zIGEgc2luZ2xlIHZlY3RvciB0aHJvdWdoIGEgMngyIG1hdHJpeC4gICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB4ICAgICAgOjogVGhlIGhvcml6b250YWwgdmVjdG9yIGNvb3JkaW5hdGUuICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgeSAgICAgIDo6IFRoZSB2ZXJ0aWNhbCB2ZWN0b3IgY29vcmRpbmF0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbWF0cml4IDo6IEEgcG9pbnRlciB0byB0aGUgc291cmNlIDJ4MiBtYXRyaXguICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8TVQtTm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgWWVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBFWFBPUlRfREVGCisgIHZvaWQgIEZUX1RyYW5zZm9ybV9WZWN0b3IoIEZUX1BvcyogICAgIHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyogICAgIHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX01hdHJpeCogIG1hdHJpeCApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfTWF0cml4X011bHRpcGx5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgUGVyZm9ybXMgdGhlIG1hdHJpeCBvcGVyYXRpb24gYGIgPSBhKmInLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgYSA6OiBBIHBvaW50ZXIgdG8gbWF0cml4IGBhJy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgYiA6OiBBIHBvaW50ZXIgdG8gbWF0cml4IGBiJy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8TVQtTm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgWWVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBFWFBPUlRfREVGCisgIHZvaWQgIEZUX01hdHJpeF9NdWx0aXBseSggRlRfTWF0cml4KiAgYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9NYXRyaXgqICBiICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9NYXRyaXhfSW52ZXJ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBJbnZlcnRzIGEgMngyIG1hdHJpeC4gIFJldHVybnMgYW4gZXJyb3IgaWYgaXQgY2FuJ3QgYmUgaW52ZXJ0ZWQuICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBtYXRyaXggOjogQSBwb2ludGVyIHRvIHRoZSB0YXJnZXQgbWF0cml4LiAgUmVtYWlucyB1bnRvdWNoZWQgaW4gICAgKi8KKyAgLyogICAgICAgICAgICAgIGNhc2Ugb2YgZXJyb3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8TVQtTm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgWWVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBFWFBPUlRfREVGCisgIEZUX0Vycm9yICBGVF9NYXRyaXhfSW52ZXJ0KCBGVF9NYXRyaXgqICBtYXRyaXggKTsKKworI2VuZGlmIC8qIEZUT1VUTE5fSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2Jhc2UvZnRyYXN0ZXIuYyBiL3NyYy9iYXNlL2Z0cmFzdGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJmNzhmMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9iYXNlL2Z0cmFzdGVyLmMKQEAgLTAsMCArMSw0MzcyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBmdHJhc3RlcjIuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgVGhlIEZyZWVUeXBlIGdseXBoIHJhc3Rlcml6ZXIgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDE5OTYtMTk5OSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkICAgICAgICAqLworLyogIG1vZGlmaWVkIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAgKi8KKy8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCisvKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLworLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBUaGUgYHJhc3RlcicgY29tcG9uZW50IGltcGxlbWVudHMgRnJlZVR5cGUncyBzY2FuLWxpbmUgY29udmVydGVyLCB0aGUgKi8KKyAgLyogb25lIHVzZWQgdG8gZ2VuZXJhdGUgYml0bWFwcyBhbmQgcGl4bWFwcyBmcm9tIHZlY3RvcmlhbCBvdXRsaW5lICAgICAgICovCisgIC8qIGRlc2NyaXB0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogSXQgaGFzIGJlZW4gcmV3cml0dGVuIGVudGlyZWx5IGZvciBGcmVlVHlwZSAyLjAsIGluIG9yZGVyIHRvIGJlY29tZSAgICovCisgIC8qIGNvbXBsZXRlbHkgaW5kZXBlbmRlbnQgb2YgdGhlIHJlc3Qgb2YgdGhlIGxpYnJhcnkuICBJdCBzaG91bGQgbm93IGJlICAqLworICAvKiBwb3NzaWJsZSB0byBpbmNsdWRlIGl0IG1vcmUgZWFzaWx5IGluIGFsbCBraW5kcyBvZiBsaWJyYXJpZXMgYW5kICAgICAgKi8KKyAgLyogYXBwbGljYXRpb25zLCB3aGljaCBkbyBub3QgbmVjZXNzYXJpbHkgbmVlZCB0aGUgZm9udCBlbmdpbmVzIGFuZCBBUEkuICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBUaGlzIHZlcnNpb24gY29udGFpbnMgdGhlIGZvbGxvd2luZyBmZWF0dXJlczogICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIC0gU3VwcG9ydCBmb3IgdGhpcmQtb3JkZXIgQmV6aWVyIGFyY3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogLSBJbXByb3ZlZCBwZXJmb3JtYW5jZSBvZiB0aGUgNS1sZXZlbHMgYW50aS1hbGlhc2luZyBhbGdvcml0aG0uICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAtIDE3LWxldmVscyBhbnRpLWFsaWFzaW5nIGZvciBzbW9vdGhlciBjdXJ2ZXMsIHRob3VnaCB0aGUgZGlmZmVyZW5jZSAgKi8KKyAgLyogICBpc24ndCBhbHdheXMgbm90aWNlYWJsZSwgZGVwZW5kaW5nIG9uIHlvdXIgcGFsZXR0ZS4gICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAtIEFuIEFQSSB0byBkZWNvbXBvc2UgYSByYXN0ZXIgb3V0bGluZSBpbnRvIGEgcGF0aCAoaS5lLiwgaW50byBhICAgICAgKi8KKyAgLyogICBhIHNlcmllcyBvZiBzZWdtZW50cyBhbmQgYXJjcykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBQbGFubmVkIGFkZGl0aW9uczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIC0gR2V0dGluZyByaWQgb2YgdGhlIHNlY29uZCBwYXNzIGZvciBob3Jpem9udGFsIGRyb3Atb3V0IGRldGVjdGlvbi4gICAqLworICAvKiAgIEkndmUgZ290IGEgZmV3IGlkZWFzLCBidXQgSSdsbCBoYXZlIHRvIGV4cGVyaW1lbnQgaW4gUGFzY2FsIHdpdGggICAgKi8KKyAgLyogICB0aGVtLiAgdG8gYXZvaWQgZGFtYWdpbmcgb2YgdGhlIHJlbmRlcmluZyBvZiBnbHlwaHMgYXQgc21hbGwgc2l6ZXMuICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAtIEFkZGluZyBhIGBjb21wb3NpdGlvbicgY2FsbGJhY2ssIHdoaWNoIHNob3VsZCBiZSBpbnZva2VkIGR1cmluZyAgICAgKi8KKyAgLyogICBhbnRpLWFsaWFzZWQgcmVuZGVyaW5nLiAgSW4gc2hvcnQsIGl0IHdpbGwgYWxsb3cgbGluZS1ieS1saW5lICAgICAgICovCisgIC8qICAgY29tcG9zaXRpb24gKGkuZS4sIHRyYW5zcGFyZW5jaWVzLCBldGMuKSBvZiB0aGUgb3V0cHV0IGluIGEgZmFpcmx5ICAqLworICAvKiAgIHBvcnRhYmxlIHdheS4gIE9mIGNvdXJzZSwgYSBzaW5nbGUgc3dlZXAgaXMgcmVxdWlyZWQgdGhlcmUuICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNpbmNsdWRlIDxmdGltYWdlLmg+CisjaWZuZGVmIF9TVEFOREFMT05FXworI2luY2x1ZGUgPGZ0Y29uZmlnLmg+CisjZW5kaWYKKworI2lmbmRlZiBFWFBPUlRfRlVOQworI2RlZmluZSBFWFBPUlRfRlVOQyAgLyogbm90aGluZyAqLworI2VuZGlmCisKKyN1bmRlZiAgRlRfQ09NUE9ORU5UCisjZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfcmFzdGVyCisKKyNpZmRlZiBfU1RBTkRBTE9ORV8KKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgdXNlZCB3aGVuIHRoZSByYXN0ZXIgaXMgY29tcGlsZWQgYXMgYSAgICAgICAqLworICAvKiBzdGFuZC1hbG9uZSBvYmplY3QuICBFYWNoIG9mIHRoZW0gaXMgY29tbWVudGVkLCBhbmQgeW91J3JlIGZyZWUgdG8gICAgKi8KKyAgLyogdG9nZ2xlIHRoZW0gdG8gc3VpdCB5b3VyIG5lZWRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIEZUX1JBU1RFUl9JTlRfSVNfMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICBTZXQgdGhpcyBjb25maWd1cmF0aW9uIG1hY3JvIHRvIHRoZSB1bnNpZ25lZCB0eXBlIHdoaWNoIGhhcyAzMiAgICAgICovCisgIC8qICAgYml0cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRlRfUkFTVEVSX0lOVF9JU18zMgorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBGVF9SQVNURVJfT1BUSU9OX0FOVElfQUxJQVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgRGVmaW5lIHRoaXMgY29uZmlndXJhdGlvbiBtYWNybyBpZiB5b3Ugd2FudCB0byBzdXBwb3J0ICAgICAgICAgICAgICAqLworICAvKiAgIGFudGktYWxpYXNpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZUX1JBU1RFUl9PUFRJT05fQU5USV9BTElBUworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBGVF9SQVNURVJfT1BUSU9OX0NPTklDX0JFWklFUlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgRGVmaW5lIHRoaXMgY29uZmlndXJhdGlvbiBtYWNybyBpZiB5b3VyIHNvdXJjZSBvdXRsaW5lcyBjb250YWluICAgICAqLworICAvKiAgIHNlY29uZC1vcmRlciBCZXppZXIgYXJjcy4gIFR5cGljYWxseSwgdGhlc2UgYXJlIFRydWVUeXBlIG91dGxpbmVzLiAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZUX1JBU1RFUl9DT05JQ19CRVpJRVJTCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIEZUX1JBU1RFUl9PUFRJT05fQ1VCSUNfQkVaSUVSUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICBEZWZpbmUgdGhpcyBjb25maWd1cmF0aW9uIG1hY3JvIGlmIHlvdXIgc291cmNlIG91dGxpbmVzIGNvbnRhaW4gICAgICovCisgIC8qICAgdGhpcmQtb3JkZXIgQmV6aWVyIGFyY3MuICBUeXBpY2FsbHksIHRoZXNlIGFyZSBUeXBlMSBvdXRsaW5lcy4gICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRlRfUkFTVEVSX0NVQklDX0JFWklFUlMKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogRlRfUkFTVEVSX0FOVElfQUxJQVNfNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIERlZmluZSB0aGlzIGNvbmZpZ3VyYXRpb24gbWFjcm8gaWYgeW91IHdhbnQgdG8gZW5hYmxlIHRoZSA1LWdyYXlzICAgKi8KKyAgLyogICBhbnRpLWFsaWFzaW5nIG1vZGUuICBJZ25vcmVkIGlmIEZUX1JBU1RFUl9PUFRJT05fQU5USV9BTElBUyBpc24ndCAgICovCisgIC8qICAgZGVmaW5lZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRlRfUkFTVEVSX0FOVElfQUxJQVNfNQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBGVF9SQVNURVJfQU5USV9BTElBU18xNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgRGVmaW5lIHRoaXMgY29uZmlndXJhdGlvbiBtYWNybyBpZiB5b3Ugd2FudCB0byBlbmFibGUgdGhlIDE3LWdyYXlzICAqLworICAvKiAgIGFudGktYWxpYXNpbmcgbW9kZS4gIElnbm9yZWQgaWYgRlRfUkFTVEVSX09QVElPTl9BTlRJX0FMSUFTIGlzbid0ICAgKi8KKyAgLyogICBkZWZpbmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogI2RlZmluZSBGVF9SQVNURVJfQU5USV9BTElBU18xNyAqLworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBGVF9SQVNURVJfTElUVExFX0VORElBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogRlRfUkFTVEVSX0JJR19FTkRJQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIFRoZSBkZWZhdWx0IGFudGktYWxpYXMgcm91dGluZXMgYXJlIHByb2Nlc3Nvci1pbmRlcGVuZGVudCwgYnV0ICAgICAgKi8KKyAgLyogICBzbG93LiAgRGVmaW5lIG9uZSBvZiB0aGVzZSBtYWNyb3MgdG8gc3VpdCB5b3VyIG93biBzeXN0ZW0sIGFuZCAgICAgICovCisgIC8qICAgZW5qb3kgZ3JlYXRseSBpbXByb3ZlZCByZW5kZXJpbmcgc3BlZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworLyogI2RlZmluZSBGVF9SQVNURVJfTElUVExFX0VORElBTiAqLworLyogI2RlZmluZSBGVF9SQVNURVJfQklHX0VORElBTiAgICAqLworCisKKyNlbHNlIC8qIF9TVEFOREFMT05FXyAqLworCisjaW5jbHVkZSA8ZnJlZXR5cGUuaD4KKyNpbmNsdWRlIDxmdGNvbmZpZy5oPgorCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSB1c2VkIHdoZW4gdGhlIHJhc3RlciBpcyBjb21waWxlZCB3aXRoaW4gdGhlICovCisgIC8qIEZyZWVUeXBlIGJhc2UgbGF5ZXIuICBEb24ndCBjaGFuZ2UgdGhlc2UgdW5sZXNzIHlvdSByZWFsbHkga25vdyB3aGF0ICAqLworICAvKiB5b3UncmUgZG9pbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX0FOVElfQUxJQVMKKyNkZWZpbmUgRlRfUkFTVEVSX09QVElPTl9BTlRJX0FMSUFTCisjZW5kaWYKKworI2RlZmluZSBGVF9SQVNURVJfQ09OSUNfQkVaSUVSUworI2RlZmluZSBGVF9SQVNURVJfQ1VCSUNfQkVaSUVSUworCisjZGVmaW5lIEZUX1JBU1RFUl9BTlRJX0FMSUFTXzUKKy8qICNkZWZpbmUgIEZUX1JBU1RFUl9BTlRJX0FMSUFTXzE3ICovCisKKyNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX0xJVFRMRV9FTkRJQU4KKyNkZWZpbmUgRlRfUkFTVEVSX0xJVFRMRV9FTkRJQU4KKyNlbmRpZgorCisjaWZkZWYgRlRfQ09ORklHX09QVElPTl9CSUdfRU5ESUFOCisjZGVmaW5lIEZUX1JBU1RFUl9CSUdfRU5ESUFOCisjZW5kaWYKKworCisjZW5kaWYgLyogX1NUQU5EQUxPTkVfICovCisKKworLyogdG8ga2VlcCB0aGUgY29tcGlsZXIgaGFwcHkgKi8KKyNpZm5kZWYgUFRSQUNFMgorI2RlZmluZSBQVFJBQ0UyKHgpICAvKnZvaWQqLworI2VuZGlmCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBGVF9SQVNURVJfQU5ZX0VORElBTiBpbmRpY2F0ZXMgdGhhdCBubyBlbmRpYW5lc3Mgd2FzIGRlZmluZWQgYnkgb25lICAgKi8KKyAgLyogb2YgdGhlIGNvbmZpZ3VyYXRpb24gbWFjcm9zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2lmICFkZWZpbmVkKCBGVF9SQVNURVJfTElUVExFX0VORElBTiApICYmICFkZWZpbmVkKCBGVF9SQVNURVJfQklHX0VORElBTiApCisjZGVmaW5lIEZUX1JBU1RFUl9BTllfRU5ESUFOCisjZW5kaWYKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogVGhlIHJhc3Rlcml6ZXIgaXMgYSB2ZXJ5IGdlbmVyYWwgcHVycG9zZSBjb21wb25lbnQuICBQbGVhc2UgbGVhdmUgdGhlICovCisgIC8qIGZvbGxvd2luZyByZWRlZmluaXRpb25zIGhlcmUgKHlvdSBuZXZlciBrbm93IHlvdXIgdGFyZ2V0ICAgICAgICAgICAgICAqLworICAvKiBlbnZpcm9ubWVudCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIFRSVUUKKyNkZWZpbmUgVFJVRSAgIDEKKyNlbmRpZgorCisjaWZuZGVmIEZBTFNFCisjZGVmaW5lIEZBTFNFICAwCisjZW5kaWYKKworI2lmbmRlZiBOVUxMCisjZGVmaW5lIE5VTEwgICh2b2lkKikwCisjZW5kaWYKKworCisjaWZuZGVmIFVOVVNFRAorI2RlZmluZSBVTlVTRUQoIGFyZyApICAoICh2b2lkKShhcmcpICkKKyNlbmRpZgorCisKKyN1bmRlZiAgRkFJTFVSRQorI2RlZmluZSBGQUlMVVJFICBUUlVFCisKKyN1bmRlZiAgU1VDQ0VTUworI2RlZmluZSBTVUNDRVNTICBGQUxTRQorCisjaWZuZGVmIEFCUworI2RlZmluZSBBQlMoeCkgICggKHgpIDwgMCA/IC0oeCkgOiAoeCkgKQorI2VuZGlmCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBQbGVhc2UgZG9uJ3QgdG91Y2ggdGhlIGZvbGxvd2luZyBtYWNyb3MuIFRoZWlyIGltcG9ydGFuY2UgaXMgICAgICAgICAgKi8KKyAgLyogaGlzdG9yaWNhbCB0byBGcmVlVHlwZSwgYnV0IHRoZXkgaGF2ZSBzb21lIG5pY2UgZWZmZWN0cywgbGlrZSBnZXR0aW5nICovCisgIC8qIHJpZCBvZiBhbGwgYC0+JyBzeW1ib2xzIHdoZW4gYWNjZXNzaW5nIHRoZSByYXN0ZXIgb2JqZWN0IChyZXBsYWNpbmcgICAqLworICAvKiB0aGVtIHdpdGggYSBzaW1wbGUgYC4nKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIC8qIHVzZWQgaW4gZnVuY3Rpb24gc2lnbmF0dXJlcyB0byBkZWZpbmUgdGhlIF9maXJzdF8gYXJndW1lbnQgKi8KKyNkZWZpbmUgUkFTX0FSR18gIEZUX1Jhc3RlciAgcmFzdGVyLAorI2RlZmluZSBSQVNfQVJHICAgRlRfUmFzdGVyICByYXN0ZXIKKworICAvKiB1c2VkIHRvIGNhbGwgYSBmdW5jdGlvbiB3aXRoaW4gdGhpcyBjb21wb25lbnQsIGZpcnN0IHBhcmFtZXRlciAqLworI2RlZmluZSBSQVNfVkFSXyAgcmFzdGVyLAorI2RlZmluZSBSQVNfVkFSICAgcmFzdGVyCisKKyAgLyogdXNlZCB0byBhY2Nlc3MgdGhlIGN1cnJlbnQgcmFzdGVyIG9iamVjdCwgd2l0aCBhIGAuJyBpbnN0ZWFkIG9mIGEgKi8KKyAgLyogYC0+JyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgcmFzICAgICAgICgqcmFzdGVyKQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBGb3IgYW50aS1hbGlhc2luZyBtb2Rlcywgd2UgdXNlIGEgMiBvciA0IGxpbmVzIGludGVybWVkaWF0ZSBiaXRtYXAgICAgKi8KKyAgLyogd2hpY2ggaXMgZmlsdGVyZWQgcmVwZWF0ZWRseSB0byByZW5kZXIgZWFjaCBwaXhtYXAgcm93LiAgVGhlICAgICAgICAgICovCisgIC8qIGZvbGxvd2luZyBtYWNybyBkZWZpbmVzIHRoaXMgYnVmZmVyJ3Mgc2l6ZSBpbiBieXRlcyAod2hpY2ggaXMgcGFydCBvZiAqLworICAvKiByYXN0ZXIgb2JqZWN0cykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEFOVElfQUxJQVNfQlVGRkVSX1NJWkUgIDIwNDgKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogRXJyb3IgY29kZXMgcmV0dXJuZWQgYnkgdGhlIHNjYW4tbGluZSBjb252ZXJ0ZXIvcmFzdGVyLiAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBFcnJSYXN0ZXJfT2sgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEVyclJhc3Rlcl9VbmluaXRpYWxpemVkX09iamVjdCAgIDEKKyNkZWZpbmUgRXJyUmFzdGVyX092ZXJmbG93ICAgICAgICAgICAgICAgMgorI2RlZmluZSBFcnJSYXN0ZXJfTmVnYXRpdmVfSGVpZ2h0ICAgICAgICAzCisjZGVmaW5lIEVyclJhc3Rlcl9JbnZhbGlkX091dGxpbmUgICAgICAgIDQKKyNkZWZpbmUgRXJyUmFzdGVyX0ludmFsaWRfTWFwICAgICAgICAgICAgNQorI2RlZmluZSBFcnJSYXN0ZXJfQW50aUFsaWFzX1Vuc3VwcG9ydGVkICA2CisjZGVmaW5lIEVyclJhc3Rlcl9JbnZhbGlkX1Bvb2wgICAgICAgICAgIDcKKyNkZWZpbmUgRXJyUmFzdGVyX1VuaW1wbGVtZW50ZWQgICAgICAgICAgOAorI2RlZmluZSBFcnJSYXN0ZXJfQmFkX1BhbGV0dGVfQ291bnQgICAgICA5CisKKworI2RlZmluZSBGbG93X1VwICAgICAxCisjZGVmaW5lIEZsb3dfRG93biAgLTEKKworI2RlZmluZSBTRVRfSGlnaF9QcmVjaXNpb24oIHAgKSAgU2V0X0hpZ2hfUHJlY2lzaW9uKCBSQVNfVkFSXyAgcCApCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIEZhc3QgTXVsRGl2LCBhcyBgYicgaXMgYWx3YXlzIDwgNjQuICBEb24ndCB1c2UgaW50ZXJtZWRpYXRlICAgICAgICAgICAqLworICAvKiBwcmVjaXNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZNdWxEaXYoIGEsIGIsIGMgKSAgKCAoYSkgKiAoYikgLyAoYykgKQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBEZWZpbmUgREVCVUdfUkFTVEVSIGlmIHlvdSB3YW50IHRvIGdlbmVyYXRlIGEgZGVidWcgdmVyc2lvbiBvZiB0aGUgICAgKi8KKyAgLyogcmFzdGVyaXplci4gIFRoaXMgd2lsbCBwcm9ncmVzc2l2ZWx5IGRyYXcgdGhlIGdseXBocyB3aGlsZSBhbGwgdGhlICAgICovCisgIC8qIGNvbXB1dGF0aW9uIGFyZSBkb25lIGRpcmVjdGx5IG9uIHRoZSBncmFwaGljcyBzY3JlZW4gKHRoZSBnbHlwaHMgd2lsbCAqLworICAvKiB3aWxsIGJlIHNob3duIGludmVydGVkKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIE5vdGUgdGhhdCBERUJVR19SQVNURVIgc2hvdWxkIG9ubHkgYmUgdXNlZCBmb3IgZGVidWdnaW5nIHdpdGggYi93ICAgICAqLworICAvKiByZW5kZXJpbmcsIG5vdCB3aXRoIGdyYXkgbGV2ZWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFRoZSBkZWZpbml0aW9uIG9mIERFQlVHX1JBU1RFUiBzaG91bGQgYXBwZWFyIGluIHRoZSBmaWxlICAgICAgICAgICAgICAqLworICAvKiBgZnRjb25maWcuaCcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjaWZkZWYgREVCVUdfUkFTVEVSCisgIGV4dGVybiBjaGFyKiAgdmlvOyAgLyogQSBwb2ludGVyIHRvIFZSQU0gb3IgZGlzcGxheSBidWZmZXIgKi8KKyNlbmRpZgorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBUaGUgbWF4aW11bSBudW1iZXIgb2Ygc3RhY2tlZCBCZXppZXIgY3VydmVzLiAgU2V0dGluZyB0aGlzIGNvbnN0YW50ICAgKi8KKyAgLyogdG8gbW9yZSB0aGFuIDMyIGlzIGEgcHVyZSB3YXN0ZSBvZiBzcGFjZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBNYXhCZXppZXIgIDMyCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFRoZSBudW1iZXIgZnJhY3Rpb25hbCBiaXRzIG9mICppbnB1dCogY29vcmRpbmF0ZXMuICBXZSBhbHdheXMgdXNlIHRoZSAqLworICAvKiAyNi42IGZvcm1hdCAoaS5lLCA2IGJpdHMgZm9yIHRoZSBmcmFjdGlvbmFsIHBhcnQpLCBidXQgaGFja2VycyBhcmUgICAgKi8KKyAgLyogZnJlZSB0byBleHBlcmltZW50IHdpdGggZGlmZmVyZW50IHZhbHVlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBQaXhlbF9CaXRzICA2CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIEFuIHVuc2lnbmVkIHR5cGUgdGhhdCBpcyBleGFjdGx5IDMyIGJpdHMgb24geW91ciBwbGF0Zm9ybS4gIFRoaXMgICAgICAqLworICAvKiBtZWFucyBgdW5zaWduZWQgbG9uZycgb24gMTYtYml0IG1hY2hpbmVzLCBhbmQgYHVuc2lnbmVkIGludCcgb24gICAgICAgKi8KKyAgLyogb3RoZXJzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2lmZGVmIF9TVEFOREFMT05FXworI2lmIGRlZmluZWQoIEZUX1JBU1RFUl9JTlRfSVNfMzIgKQorICB0eXBlZGVmIHVuc2lnbmVkIGludCAgIEZUX1dvcmQzMjsKKyNlbGlmIGRlZmluZWQoIEZUX1JBU1RFUl9MT05HX0lTXzMyICkKKyAgdHlwZWRlZiB1bnNpZ25lZCBsb25nICBGVF9Xb3JkMzI7CisjZWxzZQorI2Vycm9yICJubyAzMmJpdCB0eXBlIGZvdW5kIC0gcGxlYXNlIGNoZWNrIHlvdXIgY29uZmlndXJhdGlvbiIKKyNlbmRpZgorI2VuZGlmCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIEEgcG9pbnRlciB0byBhbiB1bnNpZ25lZCBjaGFyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiB1bnNpZ25lZCBjaGFyKiAgUEJ5dGU7CisKKyAgdHlwZWRlZiBjaGFyICBUUmVzdWx0OworCisgIHR5cGVkZWYgdW5zaWduZWQgY2hhciAgIEJ5dGU7CisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBUaGUgdHlwZSBvZiB0aGUgcGl4ZWwgY29vcmRpbmF0ZXMgdXNlZCB3aXRoaW4gdGhlIHJlbmRlciBwb29sIGR1cmluZyAgKi8KKyAgLyogc2Nhbi1saW5lIGNvbnZlcnNpb24uICBXZSB1c2UgbG9uZ3MgdG8gc3RvcmUgZWl0aGVyIDI2LjYgb3IgMjIuMTAgICAgICovCisgIC8qIGZpeGVkIGZsb2F0IHZhbHVlcywgZGVwZW5kaW5nIG9uIHRoZSBgcHJlY2lzaW9uJyB3ZSB3YW50IHRvIHVzZSAgICAgICAqLworICAvKiAoaS5lLiwgbG93IHJlc3AuIGhpZ2ggcHJlY2lzaW9uKS4gIFRoZXNlIGFyZSBpZGVhbHMgaW4gb3JkZXIgdG8gICAgICAgKi8KKyAgLyogc3ViZGl2aXNlIEJlemllciBhcmNzIGluIGhhbHZlcyBieSBzaW1wbGUgYWRkaXRpb25zIGFuZCBzaGlmdHMuICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBOb3RlIHRoYXQgdGhpcyBpcyBhbiA4LWJ5dGVzIGludGVnZXIgb24gNjQgYml0cyBzeXN0ZW1zLiAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgbG9uZyAgVFBvcywgKlBQb3M7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFRoZSB0eXBlIG9mIGEgc2NhbmxpbmUgcG9zaXRpb24vY29vcmRpbmF0ZSB3aXRoaW4gYSBtYXAuICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBpbnQgIFRTY2FuLCAqUFNjYW47CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFN0YXRlcyBhbmQgZGlyZWN0aW9ucyBvZiBlYWNoIGxpbmUsIGFyYywgYW5kIHByb2ZpbGUuICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBlbnVtICBfVERpcmVjdGlvbgorICB7CisgICAgVW5rbm93biwKKyAgICBBc2NlbmRpbmcsCisgICAgRGVzY2VuZGluZywKKyAgICBGbGF0CisKKyAgfSBURGlyZWN0aW9uOworCisKKyAgc3RydWN0ICBfVFByb2ZpbGU7CisgIHR5cGVkZWYgc3RydWN0IF9UUHJvZmlsZSAgVFByb2ZpbGU7CisgIHR5cGVkZWYgVFByb2ZpbGUqICAgICAgICAgUFByb2ZpbGU7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFRoZSBgbWFzdGVyJyBzdHJ1Y3R1cmUgdXNlZCBmb3IgZGVjb21wb3Npbmcgb3V0bGluZXMuICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgc3RydWN0ICBfVFByb2ZpbGUKKyAgeworICAgIFRQb3MgICAgICBYOyAgICAgICAgICAgLyogY3VycmVudCBjb29yZGluYXRlIGR1cmluZyBzd2VlcCAgICAgICAgICAqLworICAgIFBQcm9maWxlICBsaW5rOyAgICAgICAgLyogbGluayB0byBuZXh0IHByb2ZpbGUgLSB2YXJpb3VzIHB1cnBvc2UgICAqLworICAgIFBQb3MgICAgICBvZmZzZXQ7ICAgICAgLyogc3RhcnQgb2YgcHJvZmlsZSdzIGRhdGEgaW4gcmVuZGVyIHBvb2wgICAqLworICAgIGludCAgICAgICBmbG93OyAgICAgICAgLyogUHJvZmlsZSBvcmllbnRhdGlvbjogQXNjL0Rlc2NlbmRpbmcgICAgICAqLworICAgIFRTY2FuICAgICBoZWlnaHQ7ICAgICAgLyogcHJvZmlsZSdzIGhlaWdodCBpbiBzY2FubGluZXMgICAgICAgICAgICAqLworICAgIFRTY2FuICAgICBzdGFydDsgICAgICAgLyogcHJvZmlsZSdzIHN0YXJ0aW5nIHNjYW5saW5lICAgICAgICAgICAgICAqLworCisgICAgVFNjYW4gICAgIGNvdW50TDsgICAgICAvKiBudW1iZXIgb2YgbGluZXMgdG8gc3RlcCBiZWZvcmUgdGhpcyAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwcm9maWxlIGJlY29tZXMgZHJhd2FibGUgICAgICAgICAgICAgICAgICovCisKKyAgICBQUHJvZmlsZSAgbmV4dDsgICAgICAgIC8qIG5leHQgcHJvZmlsZSBpbiBzYW1lIGNvbnRvdXIsIHVzZWQgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGR1cmluZyBkcm9wLW91dCBjb250cm9sICAgICAgICAgICAgICAgICAgKi8KKyAgfTsKKworICB0eXBlZGVmIFBQcm9maWxlICAgVFByb2ZpbGVMaXN0OworICB0eXBlZGVmIFBQcm9maWxlKiAgUFByb2ZpbGVMaXN0OworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBBIHNpbXBsZSByZWNvcmQgdXNlZCB0byBpbXBsZW1lbnQgYSBzdGFjayBvZiBiYW5kcywgcmVxdWlyZWQgYnkgdGhlICAgKi8KKyAgLyogc3ViLWJhbmRpbmcgbWVjaGFuaXNtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHN0cnVjdCAgX1RCYW5kCisgIHsKKyAgICBUU2NhbiAgeV9taW47ICAgLyogYmFuZCdzIG1pbmltdW0gKi8KKyAgICBUU2NhbiAgeV9tYXg7ICAgLyogYmFuZCdzIG1heGltdW0gKi8KKworICB9IFRCYW5kOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBUaGUgc2l6ZSBpbiBfVFBvc18gb2YgYSBwcm9maWxlIHJlY29yZCBpbiB0aGUgcmVuZGVyIHBvb2wuICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEFsaWduUHJvZmlsZVNpemUgIFwKKyAgICAgICAgICAoIChzaXplb2YgKCBUUHJvZmlsZSApICsgc2l6ZW9mICggVFBvcyApIC0gMSkgLyBzaXplb2YgKCBUUG9zICkgKQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBQcm90b3R5cGVzIHVzZWQgZm9yIHN3ZWVwIGZ1bmN0aW9uIGRpc3BhdGNoLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgdm9pZCAgKCpGdW5jdGlvbl9Td2VlcF9Jbml0KSggUkFTX0FSR18gaW50KiAgbWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogIG1heCApOworCisgIHR5cGVkZWYgdm9pZCAgKCpGdW5jdGlvbl9Td2VlcF9TcGFuKSggUkFTX0FSR18gVFNjYW4gIHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFBvcyAgIHgxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRQb3MgICB4MiApOworCisgIHR5cGVkZWYgaW50ICAgKCpGdW5jdGlvbl9UZXN0X1BpeGVsKSggUkFTX0FSR18gVFNjYW4gIHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgIHggKTsKKworICB0eXBlZGVmIHZvaWQgICgqRnVuY3Rpb25fU2V0X1BpeGVsKSggUkFTX0FSR18gIFRTY2FuICB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICBjb2xvciApOworCisgIHR5cGVkZWYgdm9pZCAgKCpGdW5jdGlvbl9Td2VlcF9TdGVwKSggUkFTX0FSRyApOworCisgIHR5cGVkZWYgc3RydWN0IFJhc3Rlcl9SZW5kZXJfCisgIHsKKyAgICBGdW5jdGlvbl9Td2VlcF9Jbml0ICBpbml0OworICAgIEZ1bmN0aW9uX1N3ZWVwX1NwYW4gIHNwYW47CisgICAgRnVuY3Rpb25fU3dlZXBfU3RlcCAgc3RlcDsKKyAgICBGdW5jdGlvbl9UZXN0X1BpeGVsICB0ZXN0X3BpeGVsOworICAgIEZ1bmN0aW9uX1NldF9QaXhlbCAgIHNldF9waXhlbDsKKworICB9IFJhc3Rlcl9SZW5kZXI7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIENvbXB1dGUgbG93ZXN0IGludGVnZXIgY29vcmRpbmF0ZSBiZWxvdyBhIGdpdmVuIHZhbHVlLiAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRkxPT1IoIHggKSAgKCAoeCkgJiByYXMucHJlY2lzaW9uX21hc2sgKQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBDb21wdXRlIGhpZ2hlc3QgaW50ZWdlciBjb29yZGluYXRlIGFib3ZlIGEgZ2l2ZW4gdmFsdWUuICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENFSUxJTkcoIHggKSAgKCAoKHgpICsgcmFzLnByZWNpc2lvbiAtIDEpICYgcmFzLnByZWNpc2lvbl9tYXNrICkKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogR2V0IGludGVnZXIgY29vcmRpbmF0ZSBvZiBhIGdpdmVuIDI2LjYgb3IgMjIuMTAgYHgnIGNvb3JkaW5hdGUgLS0gbm8gICovCisgIC8qIHJvdW5kaW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVFJVTkMoIHggKSAgKCAoc2lnbmVkIGxvbmcpKHgpID4+IHJhcy5wcmVjaXNpb25fYml0cyApCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIEdldCB0aGUgZnJhY3Rpb25hbCBwYXJ0IG9mIGEgZ2l2ZW4gY29vcmRpbmF0ZS4gICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRlJBQyggeCApICAoICh4KSAmIChyYXMucHJlY2lzaW9uIC0gMSkgKQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBTY2FsZSBhbiBgaW5wdXQgY29vcmRpbmF0ZScgKGFzIGZvdW5kIGluIEZUX091dGxpbmUgc3RydWN0dXJlcykgaW50byAgKi8KKyAgLyogYSBgd29yayBjb29yZGluYXRlJyB3aGljaCBkZXBlbmRzIG9uIGN1cnJlbnQgcmVzb2x1dGlvbiBhbmQgcmVuZGVyICAgICovCisgIC8qIG1vZGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU0NBTEVEKCB4ICkgICggKCh4KSA8PCByYXMuc2NhbGVfc2hpZnQpIC0gcmFzLnNjYWxlX2RlbHRhICkKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogREVCVUdfUFNFVCBpcyB1c2VkIHRvIHBsb3QgYSBzaW5nbGUgcGl4ZWwgaW4gVlJhbSBkdXJpbmcgZGVidWcgbW9kZS4gICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2lmZGVmIERFQlVHX1JBU1RFUgorI2RlZmluZSBERUJVR19QU0VUICBQc2V0KCkKKyNlbHNlCisjZGVmaW5lIERFQlVHX1BTRVQKKyNlbmRpZgorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIGEgcG9pbnQgaW4gYSBwbGFuZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgc3RydWN0ICBfVFBvaW50CisgIHsKKyAgICBUUG9zICB4LCB5OworCisgIH0gVFBvaW50OworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBUaGUgbW9zdCB1c2VkIHZhcmlhYmxlcyBhcmUgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgc3RydWN0dXJlLiAgVGh1cywgKi8KKyAgLyogdGhlaXIgb2Zmc2V0IGNhbiBiZSBjb2RlZCB3aXRoIGxlc3Mgb3Bjb2RlcyB3aGljaCByZXN1bHRzIGluIGEgICAgICAgICovCisgIC8qIHNtYWxsZXIgZXhlY3V0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgc3RydWN0ICBGVF9SYXN0ZXJSZWNfCisgIHsKKyAgICBQUG9zICAgICAgY3Vyc29yOyAgICAgICAgICAgICAgLyogQ3VycmVudCBjdXJzb3IgaW4gcmVuZGVyIHBvb2wgICovCisKKyAgICBQUG9zICAgICAgcG9vbDsgICAgICAgICAgICAgICAgLyogVGhlIHJlbmRlciBwb29sIGJhc2UgYWRkcmVzcyAgICovCisgICAgUFBvcyAgICAgIHBvb2xfc2l6ZTsgICAgICAgICAgIC8qIFRoZSByZW5kZXIgcG9vbCdzIHNpemUgICAgICAgICAqLworICAgIFBQb3MgICAgICBwb29sX2xpbWl0OyAgICAgICAgICAvKiBMaW1pdCBvZiBwcm9maWxlcyB6b25lIGluIHBvb2wgKi8KKworICAgIGludCAgICAgICBiaXRfd2lkdGg7ICAgICAgICAgICAvKiB0YXJnZXQgYml0bWFwIHdpZHRoICAqLworICAgIFBCeXRlICAgICBiaXRfYnVmZmVyOyAgICAgICAgICAvKiB0YXJnZXQgYml0bWFwIGJ1ZmZlciAqLworICAgIFBCeXRlICAgICBwaXhfYnVmZmVyOyAgICAgICAgICAvKiB0YXJnZXQgcGl4bWFwIGJ1ZmZlciAqLworCisgICAgVFBvaW50ICAgIGxhc3Q7CisgICAgbG9uZyAgICAgIG1pblksIG1heFk7CisKKyAgICBpbnQgICAgICAgZXJyb3I7CisKKyAgICBpbnQgICAgICAgcHJlY2lzaW9uX2JpdHM7ICAgICAgIC8qIHByZWNpc2lvbiByZWxhdGVkIHZhcmlhYmxlcyAqLworICAgIGludCAgICAgICBwcmVjaXNpb247CisgICAgaW50ICAgICAgIHByZWNpc2lvbl9oYWxmOworICAgIGxvbmcgICAgICBwcmVjaXNpb25fbWFzazsKKyAgICBpbnQgICAgICAgcHJlY2lzaW9uX3NoaWZ0OworICAgIGludCAgICAgICBwcmVjaXNpb25fc3RlcDsKKyAgICBpbnQgICAgICAgcHJlY2lzaW9uX2ppdHRlcjsKKworICAgIEZUX091dGxpbmUqICBvdXRsaW5lOworCisgICAgaW50ICAgICAgIG5fcG9pbnRzOyAgICAgICAgICAgICAvKiBudW1iZXIgb2YgcG9pbnRzIGluIGN1cnJlbnQgZ2x5cGggICAqLworICAgIGludCAgICAgICBuX2NvbnRvdXJzOyAgICAgICAgICAgLyogbnVtYmVyIG9mIGNvbnRvdXJzIGluIGN1cnJlbnQgZ2x5cGggKi8KKyAgICBpbnQgICAgICAgbl9leHRyZW1hOyAgICAgICAgICAgIC8qIG51bWJlciBvZiBgZXh0cmVtYScgc2NhbmxpbmVzICAgICAgICovCisKKyAgICBUUG9pbnQqICAgYXJjOyAgICAgICAgICAgICAgICAgIC8qIGN1cnJlbnQgQmV6aWVyIGFyYyBwb2ludGVyICovCisKKyAgICBpbnQgICAgICAgbnVtX3Byb2ZzOyAgICAgICAgICAgIC8qIGN1cnJlbnQgbnVtYmVyIG9mIHByb2ZpbGVzICovCisKKyAgICBjaGFyICAgICAgZnJlc2g7ICAgICAgICAgICAgICAgIC8qIHNpZ25hbHMgYSBmcmVzaCBuZXcgcHJvZmlsZSB3aGljaCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYHN0YXJ0JyBmaWVsZCBtdXN0IGJlIGNvbXBsZXRlZCAgICovCisgICAgY2hhciAgICAgIGpvaW50OyAgICAgICAgICAgICAgICAvKiBzaWduYWxzIHRoYXQgdGhlIGxhc3QgYXJjIGVuZGVkICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGV4YWN0bHkgb24gYSBzY2FubGluZS4gIEFsbG93cyAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmVtb3ZhbCBvZiBkb3VibGV0cyAgICAgICAgICAgICAgICovCisgICAgUFByb2ZpbGUgIGN1cl9wcm9mOyAgICAgICAgICAgICAvKiBjdXJyZW50IHByb2ZpbGUgICAgICAgICAgICAgICAgICAgKi8KKyAgICBQUHJvZmlsZSAgc3RhcnRfcHJvZjsgICAgICAgICAgIC8qIGhlYWQgb2YgbGlua2VkIGxpc3Qgb2YgcHJvZmlsZXMgICAqLworICAgIFBQcm9maWxlICBmaXJzdF9wcm9mOyAgICAgICAgICAgLyogY29udG91cidzIGZpcnN0IHByb2ZpbGUgaW4gY2FzZSAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvZiBpbXBhY3QgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBURGlyZWN0aW9uICBzdGF0ZTsgICAgICAgICAgICAgIC8qIHJlbmRlcmluZyBzdGF0ZSAqLworCisgICAgRlRfQml0bWFwIHRhcmdldDsgICAgICAgICAgLyogZGVzY3JpcHRpb24gb2YgdGFyZ2V0IGJpdC9waXhtYXAgKi8KKworICAgIGludCAgICAgICB0cmFjZV9iaXQ7ICAgICAgICAgICAgLyogY3VycmVudCBvZmZzZXQgaW4gdGFyZ2V0IGJpdG1hcCAgICAqLworICAgIGludCAgICAgICB0cmFjZV9waXg7ICAgICAgICAgICAgLyogY3VycmVudCBvZmZzZXQgaW4gdGFyZ2V0IHBpeG1hcCAgICAqLworICAgIGludCAgICAgICB0cmFjZV9pbmNyOyAgICAgICAgICAgLyogc3dlZXAncyBpbmNyZW1lbnQgaW4gdGFyZ2V0IGJpdG1hcCAqLworCisgICAgaW50ICAgICAgIGdyYXlfbWluX3g7ICAgICAgICAgICAvKiBjdXJyZW50IG1pbiB4IGR1cmluZyBncmF5IHJlbmRlcmluZyAqLworICAgIGludCAgICAgICBncmF5X21heF94OyAgICAgICAgICAgLyogY3VycmVudCBtYXggeCBkdXJpbmcgZ3JheSByZW5kZXJpbmcgKi8KKworICAgIC8qIGRpc3BhdGNoIHZhcmlhYmxlcyAqLworCisgICAgUmFzdGVyX1JlbmRlciAgICAgcmVuZGVyOworCisgICAgaW50ICAgICAgIHNjYWxlX3NoaWZ0OyAgICAgIC8qID09IDAgIGZvciBiaXRtYXBzICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA9PSAxICBmb3IgNS1sZXZlbHMgcGl4bWFwcyAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogPT0gMiAgZm9yIDE3LWxldmVscyBwaXhtYXBzICovCisKKyAgICBpbnQgICAgICAgc2NhbGVfZGVsdGE7ICAgICAgLyogcmFzLnByZWNpc2lvbl9oYWxmIGZvciBiaXRtYXBzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDAgZm9yIHBpeG1hcHMgICAgICAgICAgICAgICAgICAqLworCisgICAgY2hhciAgICAgIGRyb3BvdXRfbW9kZTsgICAgIC8qIGN1cnJlbnQgZHJvcF9vdXQgY29udHJvbCBtZXRob2QgKi8KKworICAgIGNoYXIgICAgICBzZWNvbmRfcGFzczsgICAgICAvKiBpbmRpY2F0ZXMgd2hldGhlciBhIGhvcml6b250YWwgcGFzcyAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2hvdWxkIGJlIHBlcmZvcm1lZCB0byBjb250cm9sIGRyb3Atb3V0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFjY3VyYXRlbHkgd2hlbiBjYWxsaW5nIFJlbmRlcl9HbHlwaC4gICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOb3RlIHRoYXQgdGhlcmUgaXMgbm8gaG9yaXpvbnRhbCBwYXNzICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZHVyaW5nIGdyYXkgcmVuZGVyaW5nLiAgICAgICAgICAgICAgICAgICovCisKKyAgICBjaGFyICAgICAgZmxpcHBlZDsgICAgICAgICAgLyogdGhpcyBmbGFnIGlzIHNldCBkdXJpbmcgdGhlIHJlbmRlcmluZyB0byAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbmRpY2F0ZSB0aGUgc2Vjb25kIHBhc3MuICAgICAgICAgICAgICAgICovCisKKyAgICBUQmFuZCAgICAgYmFuZF9zdGFja1sxNl07ICAgLyogYmFuZCBzdGFjayB1c2VkIGZvciBzdWItYmFuZGluZyAqLworICAgIGludCAgICAgICBiYW5kX3RvcDsgICAgICAgICAvKiBiYW5kIHN0YWNrIHRvcCAgICAgICAgICAgICAgICAgICovCisKKyAgICBUUG9pbnQgICAgYXJjc1syICogTWF4QmV6aWVyICsgMV07ICAvKiBUaGUgQmV6aWVyIHN0YWNrICovCisKKyNpZiBkZWZpbmVkKCBGVF9SQVNURVJfT1BUSU9OX0FOVElfQUxJQVMgKQorCisgICAgbG9uZyAgICAgIGdyYXlzWzIwXTsgICAgICAgIC8qIFBhbGV0dGUgb2YgZ3JheSBsZXZlbHMgdXNlZCBmb3IgcmVuZGVyICovCisKKyAgICBpbnQgICAgICAgZ3JheV93aWR0aDsgICAgICAgLyogbGVuZ3RoIGluIGJ5dGVzIG9mIHRoZSBtb25vY2hyb21lICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGludGVybWVkaWF0ZSBzY2FubGluZSBvZiBncmF5X2xpbmVzLiAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBFYWNoIGdyYXkgcGl4ZWwgdGFrZXMgMiBvciA0IGJpdHMgbG9uZyAgKi8KKworICAgICAgICAgICAgICAgICAgICAgICAgLyogVGhlIGdyYXlfbGluZXMgbXVzdCBob2xkIDIgbGluZXMsIHRodXMgd2l0aCBzaXplICovCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbiBieXRlcyBvZiBhdCBsZWFzdCBgZ3JheV93aWR0aCoyJyAgICAgICAgICAgICAgKi8KKworICAgIGludCAgICAgICBncmF5c19jb3VudDsgICAgICAvKiBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgcGFsZXR0ZSAqLworCisgICAgY2hhciAgICAgIGdyYXlfbGluZXNbQU5USV9BTElBU19CVUZGRVJfU0laRV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEludGVybWVkaWF0ZSB0YWJsZSB1c2VkIHRvIHJlbmRlciB0aGUgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBncmF5bGV2ZWxzIHBpeG1hcHMuICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZ3JheV9saW5lcyBpcyBhIGJ1ZmZlciBob2xkaW5nIDIgb3IgNCAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1vbm9jaHJvbWUgc2NhbmxpbmVzICAgICAgICAgICAgICAgICAgICAqLworCisgICAgaW50ICAgICAgIGNvdW50X3RhYmxlWzI1Nl07ICAgIC8qIExvb2stdXAgdGFibGUgdXNlZCB0byBxdWlja2x5IGNvdW50ICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzZXQgYml0cyBpbiBzZXZlcmFsIGdyYXkgMngyIGNlbGxzICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYXQgb25jZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyNlbmRpZiAvKiBGVF9SQVNURVJfT1BUSU9OX0FOVElfQUxJQVMgKi8KKyAgfTsKKworCisKKyNpZmRlZiBERUJVR19SQVNURVIKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBQc2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBVc2VkIGZvciBkZWJ1Z2dpbmcgb25seS4gIFBsb3RzIGEgcG9pbnQgaW4gVlJBTSBkdXJpbmcgcmVuZGVyaW5nICAgKi8KKyAgLyogICAgKG5vdCBhZnRlcndhcmRzKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhpcyBwcm9jZWR1cmUgcmVsaWVzIG9uIHRoZSB2YWx1ZSBvZiBjUHJvZmlsZS0+c3RhcnQsIHdoaWNoIG1heSAgICovCisgIC8qICAgIG5vdCBiZSBzZXQgd2hlbiBQc2V0KCkgaXMgY2FsbGVkIHNvbWV0aW1lcy4gIFRoaXMgd2lsbCB1c3VhbGx5ICAgICAqLworICAvKiAgICByZXN1bHQgaW4gYSBkb3QgcGxvdHRlZCBvbiB0aGUgZmlyc3Qgc2NyZWVuIHNjYW5saW5lIChmYXIgYXdheSAgICAgKi8KKyAgLyogICAgZnJvbSBpdHMgb3JpZ2luYWwgcG9zaXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGlzIGBmZWF0dXJlJyByZWZsZWN0cyBub3RoaW5nIHdyb25nIGluIHRoZSBjdXJyZW50ICAgICAgICAgICAgICAgKi8KKyAgLyogICAgaW1wbGVtZW50YXRpb24sIGFuZCB0aGUgYml0bWFwIGlzIHJlbmRlcmVkIGNvcnJlY3RseSwgc28gZG9uJ3QgICAgICovCisgIC8qICAgIHBhbmljIGlmIHlvdSBzZWUgYGZseWluZycgZG90cyBpbiBkZWJ1Z2dpbmcgbW9kZS4gICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgc3RhdGljCisgIHZvaWQgIFBzZXQoIFJBU19BUkcgKQorICB7CisgICAgbG9uZyAgbzsKKyAgICBsb25nICB4OworCisKKyAgICB4ID0gcmFzLmN1cnNvclstMV07CisKKyAgICBzd2l0Y2ggKCByYXMuY3VyX3Byb2YtPmZsb3cgKSAgCisgICAgeworICAgIGNhc2UgRlRfRmxvd19VcDoKKyAgICAgIG8gPSBWaW9fU2NhbkxpbmVXaWR0aCAqCisgICAgICAgICAoIHJhcy5jdXJzb3IgLSByYXMuY3VyX3Byb2YtPm9mZnNldCArIHJhcy5jdXJfcHJvZi0+c3RhcnQgKSArCisgICAgICAgICAoIHggLyAocmFzLnByZWNpc2lvbiAqIDgpICk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgRlRfRmxvd19Eb3duOgorICAgICAgbyA9IFZpb19TY2FuTGluZVdpZHRoICoKKyAgICAgICAgICggcmFzLmN1cl9wcm9mLT5zdGFydCAtIHJhcy5jdXJzb3IgKyByYXMuY3VyX3Byb2YtPm9mZnNldCApICsKKyAgICAgICAgICggeCAvIChyYXMucHJlY2lzaW9uICogOCkgKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICggbyA+IDAgKQorICAgICAgVmlvW29dIHw9ICh1bnNpZ25lZCkweDgwID4+ICggKHgvcmFzLnByZWNpc2lvbikgJiA3ICk7CisgIH0KKworCisgIHN0YXRpYworICB2b2lkICBDbGVhcl9CYW5kKCBSQVNfQVJHXyBUU2NhbiAgeTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRTY2FuICB5MiApCisgIHsKKyAgICBNRU1fU2V0KCBWaW8gKyB5MSpWaW9fU2NhbkxpbmVXaWR0aCwgKHkyLXkxKzEpKlZpb19TY2FuTGluZVdpZHRoLCAwICk7CisgIH0KKworI2VuZGlmIC8qIERFQlVHX1JBU1RFUiAqLworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgU2V0X0hpZ2hfUHJlY2lzaW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgU2V0cyBwcmVjaXNpb24gdmFyaWFibGVzIGFjY29yZGluZyB0byB0aGUgcGFyYW1ldGVyIGZsYWcuICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgSGlnaCA6OiBTZXQgdG8gVHJ1ZSBmb3IgaGlnaCBwcmVjaXNpb24gKHR5cGljYWxseSBmb3IgcHBlbSA8IDE4KSwgICovCisgIC8qICAgIGZhbHNlIG90aGVyd2lzZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgc3RhdGljCisgIHZvaWQgIFNldF9IaWdoX1ByZWNpc2lvbiggUkFTX0FSR18gIGNoYXIgIEhpZ2ggKQorICB7CisgICAgaWYgKCBIaWdoICkKKyAgICB7CisgICAgICByYXMucHJlY2lzaW9uX2JpdHMgICA9IDEwOworICAgICAgcmFzLnByZWNpc2lvbl9zdGVwICAgPSAxMjg7CisgICAgICByYXMucHJlY2lzaW9uX2ppdHRlciA9IDI0OworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgcmFzLnByZWNpc2lvbl9iaXRzICAgPSA2OworICAgICAgcmFzLnByZWNpc2lvbl9zdGVwICAgPSAzMjsKKyAgICAgIHJhcy5wcmVjaXNpb25faml0dGVyID0gMjsKKyAgICB9CisKKyAgICByYXMucHJlY2lzaW9uICAgICAgID0gMSA8PCByYXMucHJlY2lzaW9uX2JpdHM7CisgICAgcmFzLnByZWNpc2lvbl9oYWxmICA9IHJhcy5wcmVjaXNpb24gLyAyOworICAgIHJhcy5wcmVjaXNpb25fc2hpZnQgPSByYXMucHJlY2lzaW9uX2JpdHMgLSBQaXhlbF9CaXRzOworICAgIHJhcy5wcmVjaXNpb25fbWFzayAgPSAtcmFzLnByZWNpc2lvbjsKKyAgfQorCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogQSBzaW1wbGUgdGVjaG5pY2FsIG5vdGUgb24gaG93IHRoZSByYXN0ZXIgd29ya3M6ICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIENvbnZlcnRpbmcgYW4gb3V0bGluZSBpbnRvIGEgYml0bWFwIGlzIGFjaGlldmVkIGluIHNldmVyYWwgc3RlcHMgICAgKi8KKyAgLyogICB3aGljaCBhcmU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIDEgLSBEZWNvbXBvc2luZyB0aGUgb3V0bGluZSBpbnRvIHN1Y2Nlc3NpdmUgYHByb2ZpbGVzJy4gIEVhY2ggICAgICAgKi8KKyAgLyogICAgICAgcHJvZmlsZSBpcyBzaW1wbHkgYW4gYXJyYXkgb2Ygc2NhbmxpbmUgaW50ZXJzZWN0aW9ucyBvbiBhIGdpdmVuICovCisgIC8qICAgICAgIGRpbWVuc2lvbi4gIEEgcHJvZmlsZSdzIG1haW4gYXR0cmlidXRlcyBhcmUgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgbyBpdHMgc2NhbmxpbmUgcG9zaXRpb24gYm91bmRhcmllcywgaS5lLiBgWW1pbicgYW5kIGBZbWF4Jy4gICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICBvIGFuIGFycmF5IG9mIGludGVyc2VjdGlvbiBjb29yZGluYXRlcyBmb3IgZWFjaCBzY2FubGluZSAgICAgICAgKi8KKyAgLyogICAgICAgICBiZXR3ZWVuIGBZbWluJyBhbmQgYFltYXgnLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICBvIGEgZGlyZWN0aW9uLCBpbmRpY2F0aW5nIHdldGhlciBpcyB3YXMgYnVpbHQgZ29pbmcgYHVwJyBvciAgICAgKi8KKyAgLyogICAgICAgICBgZG93bicsIGFzIHRoaXMgaXMgdmVyeSBpbXBvcnRhbnQgZm9yIGZpbGxpbmcgcnVsZXMuICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIDIgLSBTd2VlcGluZyB0aGUgdGFyZ2V0IG1hcCdzIHNjYW5saW5lcyBpbiBvcmRlciB0byBjb21wdXRlIHNlZ21lbnQgKi8KKyAgLyogICAgICAgYHNwYW5zJyB3aGljaCBhcmUgdGhlbiBmaWxsZWQuICBBZGRpdGlvbmFseSwgdGhpcyBwYXNzIHBlcmZvcm1zICovCisgIC8qICAgICAgIGRyb3Atb3V0IGNvbnRyb2wuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICBUaGUgb3V0bGluZSBkYXRhIGlzIHBhcnNlZCBkdXJpbmcgc3RlcCAxIG9ubHkuICBUaGUgcHJvZmlsZXMgYXJlICAgICovCisgIC8qICAgYnVpbHQgZnJvbSB0aGUgYm90dG9tIG9mIHRoZSByZW5kZXIgcG9vbCwgdXNlZCBhcyBhIHN0YWNrLiAgVGhlICAgICAqLworICAvKiAgIGZvbGxvd2luZyBncmFwaGljcyBzaG93cyB0aGUgcHJvZmlsZSBsaXN0IHVuZGVyIGNvbnN0cnVjdGlvbjogICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gXyBfICAqLworICAvKiAgICB8ICAgICAgICAgfCAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgfCAgICAgICAgICAgICAgICAgfCAgICAgICAgKi8KKyAgLyogICAgfCBwcm9maWxlIHwgY29vcmRpbmF0ZXMgZm9yICAgfCBwcm9maWxlIHwgY29vcmRpbmF0ZXMgZm9yIHwtLT4gICAgICovCisgIC8qICAgIHwgICAgMSAgICB8ICBwcm9maWxlIDEgICAgICAgIHwgICAgMiAgICB8ICBwcm9maWxlIDIgICAgICB8LS0+ICAgICAqLworICAvKiAgICB8X19fX19fX19ffF9fX19fX19fX19fX19fX19fX198X19fX19fX19ffF9fX19fX19fX19fX19fX19ffF9fIF8gXyAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIF4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeICAgICAgICAqLworICAvKiAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgKi8KKyAgLyogICAgc3RhcnQgb2YgcmVuZGVyIHBvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnNvciAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIFRoZSB0b3Agb2YgdGhlIHByb2ZpbGUgc3RhY2sgaXMga2VwdCBpbiB0aGUgYGN1cnNvcicgdmFyaWFibGUuICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgQXMgeW91IGNhbiBzZWUsIGEgcHJvZmlsZSByZWNvcmQgaXMgcHVzaGVkIG9uIHRvcCBvZiB0aGUgcmVuZGVyICAgICAqLworICAvKiAgIHBvb2wsIHdoaWNoIGlzIHRoZW4gZm9sbG93ZWQgYnkgaXRzIGNvb3JkaW5hdGVzL2ludGVyc2VjdGlvbnMuICBJZiAgKi8KKyAgLyogICBhIGNoYW5nZSBvZiBkaXJlY3Rpb24gaXMgZGV0ZWN0ZWQgaW4gdGhlIG91dGxpbmUsIGEgbmV3IHByb2ZpbGUgaXMgICovCisgIC8qICAgZ2VuZXJhdGVkIHVudGlsIHRoZSBlbmQgb2YgdGhlIG91dGxpbmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICBOb3RlIHRoYXQgd2hlbiBhbGwgcHJvZmlsZXMgaGF2ZSBiZWVuIGdlbmVyYXRlZCwgdGhlIGZ1bmN0aW9uICAgICAgICovCisgIC8qICAgRmluYWxpemVfUHJvZmlsZV9UYWJsZSgpIGlzIHVzZWQgdG8gcmVjb3JkLCBmb3IgZWFjaCBwcm9maWxlLCBpdHMgICAqLworICAvKiAgIGJvdHRvbS1tb3N0IHNjYW5saW5lIGFzIHdlbGwgYXMgdGhlIHNjYW5saW5lIGFib3ZlIGl0cyB1cG1vc3QgICAgICAgKi8KKyAgLyogICBib3VuZGFyeS4gIFRoZXNlIHBvc2l0aW9ucyBhcmUgY2FsbGVkIGBleHRyZW1hJyBiZWNhdXNlIHRoZXkgKHNvcnQgICovCisgIC8qICAgb2YpIGNvcnJlc3BvbmQgdG8gbG9jYWwgZXh0cmVtYS4gIFRoZXkgYXJlIHN0b3JlZCBpbiBhIHNvcnRlZCBsaXN0ICAqLworICAvKiAgIGJ1aWx0IGZyb20gdGhlIHRvcCBvZiB0aGUgcmVuZGVyIHBvb2wgYXMgYSBkb3dud2FyZHMgc3RhY2s6ICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgXyBfIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgPC0tfCBzb3J0ZWQgbGlzdCBvZiAgICAgfCAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgIDwtLXwgIGV4dHJlbWEgc2NhbmxpbmVzIHwgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgIF8gXyBfX19fX19fX19fX19fX19fX198X19fX19fX19fX19fX19fX19fX198ICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4gICAgICAgICAgICAgICAgICAgIF4gICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgIHBvb2xfbGltaXQgICAgICAgIGVuZCBvZiByZW5kZXIgcG9vbCAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIFRoaXMgbGlzdCBpcyBsYXRlciB1c2VkIGR1cmluZyB0aGUgc3dlZXAgcGhhc2UgaW4gb3JkZXIgdG8gICAgICAgICAgKi8KKyAgLyogICBvcHRpbWl6ZSBwZXJmb3JtYW5jZSAoc2VlIHRlY2huaWNhbCBub3RlIG9uIHRoZSBzd2VlcCBiZWxvdykuICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIE9mIGNvdXJzZSwgdGhlIHJhc3RlciBkZXRlY3RzIHdoZXRoZXIgdGhlIHR3byBzdGFja3MgY29sbGlkZSBhbmQgICAgKi8KKyAgLyogICBoYW5kbGVzIHRoZSBzaXR1YXRpb24gcHJvcGVydGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIE5ld19Qcm9maWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIENyZWF0ZXMgYSBuZXcgUHJvZmlsZSBpbiB0aGUgcmVuZGVyIHBvb2wuICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGFTdGF0ZSA6OiBUaGUgc3RhdGUvb3JpZW50YXRpb24gb2YgdGhlIG5ldyBwcm9maWxlLiAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFNVQ0NFU1Mgb3IgRkFJTFVSRS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgc3RhdGljCisgIFRSZXN1bHQgIE5ld19Qcm9maWxlKCBSQVNfQVJHXyBURGlyZWN0aW9uICBkaXJlY3Rpb24gKQorICB7CisgICAgaWYgKCByYXMuc3RhcnRfcHJvZiA9PSBOVUxMICkKKyAgICB7CisgICAgICByYXMuY3VyX3Byb2YgICA9IChQUHJvZmlsZSlyYXMuY3Vyc29yOyAvKiBjdXJyZW50IHByb2ZpbGUgICAgICAgICAgKi8KKyAgICAgIHJhcy5zdGFydF9wcm9mID0gcmFzLmN1cl9wcm9mOyAgICAgICAgIC8qIGZpcnN0IHByb2ZpbGUgaW4gcG9vbCAgICAqLworICAgICAgcmFzLmN1cnNvciAgICArPSBBbGlnblByb2ZpbGVTaXplOyAgICAgLyogcmVjb3JkIHByb2ZpbGUgaW4gYnVmZmVyICovCisgICAgfQorCisgICAgLyogY2hlY2sgZm9yIG92ZXJmbG93ICovCisgICAgaWYgKCByYXMuY3Vyc29yID49IHJhcy5wb29sX2xpbWl0ICkKKyAgICB7CisgICAgICByYXMuZXJyb3IgPSBFcnJSYXN0ZXJfT3ZlcmZsb3c7CisgICAgICByZXR1cm4gRkFJTFVSRTsKKyAgICB9CisKKyAgICAvKiByZWNvcmQgcHJvZmlsZSBkaXJlY3Rpb24gKi8KKyAgICBzd2l0Y2ggKCBkaXJlY3Rpb24gKQorICAgIHsKKyAgICBjYXNlIEFzY2VuZGluZzoKKyAgICAgIHJhcy5jdXJfcHJvZi0+ZmxvdyA9IEZsb3dfVXA7CisgICAgICBicmVhazsKKworICAgIGNhc2UgRGVzY2VuZGluZzoKKyAgICAgIHJhcy5jdXJfcHJvZi0+ZmxvdyA9IEZsb3dfRG93bjsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIHJhcy5lcnJvciA9IEVyclJhc3Rlcl9JbnZhbGlkX01hcDsKKyAgICAgIHJldHVybiBGQUlMVVJFOworICAgIH0KKworICAgIC8qIGluaXRpYWxpemUgYSBmZXcgZmllbGRzICovCisgICAgeworICAgICAgUFByb2ZpbGUgIGN1ciA9IHJhcy5jdXJfcHJvZjsKKworCisgICAgICBjdXItPnN0YXJ0ICA9IDA7ICAgICAgICAgICAgLyogY3VycmVudCBzdGFydCBzY2FubGluZSAgICAgICAgICAqLworICAgICAgY3VyLT5oZWlnaHQgPSAwOyAgICAgICAgICAgIC8qIGN1cnJlbnQgaGVpZ2h0ICAgICAgICAgICAgICAgICAgKi8KKyAgICAgIGN1ci0+b2Zmc2V0ID0gcmFzLmN1cnNvcjsgICAvKiBhZGRyZXNzIG9mIGZpcnN0IGNvb3JkaW5hdGUgICAgICovCisgICAgICBjdXItPmxpbmsgICA9IChQUHJvZmlsZSkwOyAgLyogbGluayB0byBuZXh0IHByb2ZpbGUgaW4gcG9vbCAgICAqLworICAgICAgY3VyLT5uZXh0ICAgPSAoUFByb2ZpbGUpMDsgIC8qIGxpbmsgdG8gbmV4dCBwcm9maWxlIGluIGNvbnRvdXIgKi8KKyAgICB9CisKKyAgICAvKiByZWNvcmQgdGhlIGZpcnN0IHByb2ZpbGUgaW4gYSBjb250b3VyICovCisgICAgaWYgKCByYXMuZmlyc3RfcHJvZiA9PSBOVUxMICkKKyAgICAgIHJhcy5maXJzdF9wcm9mID0gcmFzLmN1cl9wcm9mOworCisgICAgcmFzLnN0YXRlICA9IGRpcmVjdGlvbjsKKyAgICByYXMuZnJlc2ggID0gVFJVRTsgICAgICAgLyogdGhpcyBwcm9maWxlIGhhcyBubyBjb29yZGluYXRlcyB5ZXQgKi8KKyAgICByYXMuam9pbnQgID0gRkFMU0U7CisKKyAgICByZXR1cm4gU1VDQ0VTUzsKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRW5kX1Byb2ZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRmluYWxpemVzIHRoZSBjdXJyZW50IFByb2ZpbGUgYW5kIGNvbXB1dGVzIGl0cyBoZWlnaHQuICBJZiBpdCBpcyAgICovCisgIC8qICAgIG5vdCAwLCB0aGUgcHJvZmlsZSdzIGZpZWxkcyBhcmUgdXBkYXRlZCBhbmQgYSBuZXcgcHJvZmlsZSBpcyAgICAgICAqLworICAvKiAgICBwdXNoZWQgb24gdG9wIG9mIGl0cyBjb29yZGluYXRlcy4gIE90aGVyd2lzZSB0aGUgY3VycmVudCBwcm9maWxlICAgKi8KKyAgLyogICAgaXMga2VwdCBhbmQgdGhlIHJlY29yZGluZyBvZiBpbnRlcnNlY3Rpb25zIGlzIHJlc3RhcnRlZC4gICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgU1VDQ0VTUyBvciBGQUlMVVJFLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBzdGF0aWMKKyAgVFJlc3VsdCAgRW5kX1Byb2ZpbGUoIFJBU19BUkcgKQorICB7CisgICAgaW50ICBoOworCisKKyAgICBoID0gcmFzLmN1cnNvciAtIHJhcy5jdXJfcHJvZi0+b2Zmc2V0OworCisgICAgaWYgKCBoIDwgMCApCisgICAgeworICAgICAgLyogVGhpcyBlcnJvciBzaG91bGQgX25ldmVyXyBvY2N1ciB1bmxlc3MgdGhlIHJhc3RlciBpcyBidWdneSAqLworICAgICAgcmFzLmVycm9yID0gRXJyUmFzdGVyX05lZ2F0aXZlX0hlaWdodDsKKyAgICAgIHJldHVybiBGQUlMVVJFOworICAgIH0KKworICAgIGlmICggaCA+IDAgKQorICAgIHsKKyAgICAgIFBQcm9maWxlICBvbGQsIG5ldzsKKworICAgICAgLyogcmVjb3JkIHNjYW5saW5lIGhlaWdodCBpbiBjdXJyZW50IHByb2ZpbGUsIGNyZWF0ZSBhIG5ldyBvbmUgKi8KKyAgICAgIC8qIGFuZCBzZXQgYSBsaW5rIGZyb20gdGhlIG9sZCBvbmUgdG8gaXQgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICBvbGQgICAgICAgICAgPSByYXMuY3VyX3Byb2Y7CisgICAgICBvbGQtPmhlaWdodCAgPSBoOworICAgICAgcmFzLmN1cl9wcm9mID0gbmV3ID0gKFBQcm9maWxlKXJhcy5jdXJzb3I7CisKKyAgICAgIHJhcy5jdXJzb3IgICs9IEFsaWduUHJvZmlsZVNpemU7CisKKyAgICAgIG5ldy0+aGVpZ2h0ICA9IDA7CisgICAgICBuZXctPm9mZnNldCAgPSByYXMuY3Vyc29yOworICAgICAgb2xkLT5uZXh0ICAgID0gbmV3OworCisgICAgICByYXMubnVtX3Byb2ZzKys7CisgICAgfQorCisgICAgLyogY2hlY2sgZm9yIG92ZXJmbG93ICovCisgICAgaWYgKCByYXMuY3Vyc29yID49IHJhcy5wb29sX2xpbWl0ICkKKyAgICB7CisgICAgICByYXMuZXJyb3IgPSBFcnJSYXN0ZXJfT3ZlcmZsb3c7CisgICAgICByZXR1cm4gRkFJTFVSRTsKKyAgICB9CisKKyAgICByYXMuam9pbnQgPSBGQUxTRTsKKworICAgIHJldHVybiBTVUNDRVNTOworICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBJbnNlcnRfRXh0cmVtYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBSZWNvcmRzIHRoYXQgYSBnaXZlbiBzY2FubGluZSBjb250YWlucyBhdCBsZWFzdCBvbmUgbG9jYWwgICAgICAgICAgKi8KKyAgLyogICAgZXh0cmVtdW0uICBUaGUgdGFibGUgb2YgZXh0cmVtYSBpcyBwbGFjZWQgYXQgdGhlIGVuZCBvZiB0aGUgcmVuZGVyICovCisgIC8qICAgIHBvb2wgYW5kIGdyb3dzIGRvd253YXJkcy4gIEl0IGlzIHVzZWQgZHVyaW5nIHRoZSBzd2VlcCBwaGFzZS4gICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICB5IDo6IFRoZSBjb29yZGluYXRlIG9mIHRoZSBzY2FubGluZSBjb250YWluaW5nIGFuIGV4dHJlbXVtLiAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgc3RhdGljCisgIFRSZXN1bHQgIEluc2VydF9FeHRyZW1hKCBSQVNfQVJHXyBUU2NhbiAgeSApCisgIHsKKyAgICBQUG9zICAgZXh0cmVtYTsKKyAgICBUU2NhbiAgeTI7CisgICAgaW50ICAgIG47CisKKworICAgIFBUUkFDRTIoKCAiRVhUUkVNQSArPSAlZCIsIHkgKSk7CisgICAgbiAgICAgICA9IHJhcy5uX2V4dHJlbWEgLSAxOworICAgIGV4dHJlbWEgPSByYXMucG9vbF9zaXplIC0gcmFzLm5fZXh0cmVtYTsKKworICAgIC8qIGxvb2sgZm9yIGZpcnN0IHkgZXh0cmVtdW0gdGhhdCBpcyA8PSAqLworICAgIHdoaWxlICggbiA+PSAwICYmIHkgPCBleHRyZW1hW25dICkKKyAgICAgIG4tLTsKKworICAgIC8qIGlmIGl0IGlzIDwsIHNpbXBseSBpbnNlcnQgaXQsIGlnbm9yZSBpZiA9PSAqLworICAgIGlmICggbiA+PSAwICYmIHkgPiBleHRyZW1hW25dICkKKyAgICAgIHdoaWxlICggbiA+PSAwICkKKyAgICAgIHsKKyAgICAgICAgeTIgPSBleHRyZW1hW25dOworICAgICAgICBleHRyZW1hW25dID0geTsKKyAgICAgICAgeSA9IHkyOworICAgICAgICBuLS07CisgICAgICB9CisKKyAgICBpZiAoIG4gPCAwICkKKyAgICB7CisgICAgICByYXMucG9vbF9saW1pdC0tOworICAgICAgcmFzLm5fZXh0cmVtYSsrOworICAgICAgcmFzLnBvb2xfc2l6ZVstcmFzLm5fZXh0cmVtYV0gPSB5OworCisgICAgICBpZiAoIHJhcy5wb29sX2xpbWl0IDw9IHJhcy5jdXJzb3IgKQorICAgICAgeworICAgICAgICByYXMuZXJyb3IgPSBFcnJSYXN0ZXJfT3ZlcmZsb3c7CisgICAgICAgIHJldHVybiBGQUlMVVJFOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gU1VDQ0VTUzsKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRmluYWxpemVfUHJvZmlsZV9UYWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQWRqdXN0cyBhbGwgbGlua3MgaW4gdGhlIHByb2ZpbGVzIGxpc3QuICBDYWxsZWQgd2hlbiB0aGUgb3V0bGluZSAgICovCisgIC8qICAgIHBhcnNpbmcgaXMgZG9uZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFNVQ0NFU1Mgb3IgRkFJTFVSRS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgc3RhdGljCisgIFRSZXN1bHQgIEZpbmFsaXplX1Byb2ZpbGVfVGFibGUoIFJBU19BUkcgKQorICB7CisgICAgaW50ICAgICAgIG4sIGJvdHRvbSwgdG9wOworICAgIFBQcm9maWxlICBwOworCisKKyAgICBuID0gcmFzLm51bV9wcm9mczsKKworICAgIGlmICggbiA+IDEgKQorICAgIHsKKyAgICAgIHAgPSByYXMuc3RhcnRfcHJvZjsKKyAgICAgIHdoaWxlICggbiA+IDAgKQorICAgICAgeworICAgICAgICBpZiAoIG4gPiAxICkKKyAgICAgICAgICBwLT5saW5rID0gKFBQcm9maWxlKSggcC0+b2Zmc2V0ICsgcC0+aGVpZ2h0ICk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBwLT5saW5rID0gTlVMTDsKKworICAgICAgICBzd2l0Y2ggKCBwLT5mbG93ICkKKyAgICAgICAgeworICAgICAgICAgIGNhc2UgRmxvd19Eb3duOgorICAgICAgICAgICAgUFRSQUNFMigoICJGTE9XIERPV04gKHN0YXJ0ID0gJWQsIGhlaWdodCA9ICVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgcC0+c3RhcnQsIHAtPmhlaWdodCApKTsKKyAgICAgICAgICAgIGJvdHRvbSAgICAgPSBwLT5zdGFydCAtIHAtPmhlaWdodCsxOworICAgICAgICAgICAgdG9wICAgICAgICA9IHAtPnN0YXJ0OworICAgICAgICAgICAgcC0+c3RhcnQgICA9IGJvdHRvbTsKKyAgICAgICAgICAgIHAtPm9mZnNldCArPSBwLT5oZWlnaHQtMTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBGbG93X1VwOgorICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBQVFJBQ0UyKCggIkZMT1cgVVAgKHN0YXJ0ID0gJWQsIGhlaWdodCA9ICVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgcC0+c3RhcnQsIHAtPmhlaWdodCApKTsKKyAgICAgICAgICAgIGJvdHRvbSA9IHAtPnN0YXJ0OworICAgICAgICAgICAgdG9wICAgID0gcC0+c3RhcnQgKyBwLT5oZWlnaHQtMTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICggSW5zZXJ0X0V4dHJlbWEoIFJBU19WQVJfICBib3R0b20gKSB8fAorICAgICAgICAgICAgIEluc2VydF9FeHRyZW1hKCBSQVNfVkFSXyAgdG9wKzEgKSAgKQorICAgICAgICAgIHJldHVybiBGQUlMVVJFOworCisgICAgICAgIHAgPSBwLT5saW5rOworICAgICAgICBuLS07CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICAgIHJhcy5zdGFydF9wcm9mID0gTlVMTDsKKworICAgIHJldHVybiBTVUNDRVNTOworICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBMaW5lX1VwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBDb21wdXRlcyB0aGUgc2Nhbi1saW5lIGludGVyc2VjdGlvbnMgb2YgYW4gYXNjZW5kaW5nIGxpbmUgc2VnbWVudCAgKi8KKyAgLyogICAgYW5kIHN0b3JlcyB0aGVtIGluIHRoZSByZW5kZXIgcG9vbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgeDEgICA6OiBUaGUgc3RhcnQgeCBjb29yZGluYXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHkxICAgOjogVGhlIHN0YXJ0IHkgY29vcmRpbmF0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB4MiAgIDo6IFRoZSBlbmQgeCBjb29yZGluYXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgeTIgICA6OiBUaGUgZW5kIHkgY29vcmRpbmF0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG1pbnkgOjogVGhlIG1pbmltdW0gdmVydGljYWwgZ3JpZCBjb29yZGluYXRlLiAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBtYXh5IDo6IFRoZSBtYXhpbXVtIHZlcnRpY2FsIGdyaWQgY29vcmRpbmF0ZS4gICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBTVUNDRVNTIG9yIEZBSUxVUkUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0YXRpYworICBUUmVzdWx0ICBMaW5lX1VwKCBSQVNfQVJHXyBUUG9zICB4MSwgICBUUG9zICB5MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFBvcyAgeDIsICAgVFBvcyAgeTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRQb3MgIG1pbnksIFRQb3MgIG1heHkgKQorICB7CisgICAgVFBvcyAgIER4LCBEeTsKKyAgICBpbnQgICAgZTEsIGUyLCBmMSwgZjIsIHNpemU7CisgICAgVFBvcyAgIEl4LCBSeCwgQXg7CisKKyAgICBQUG9zICB0b3A7CisKKworICAgIER4ID0geDIgLSB4MTsKKyAgICBEeSA9IHkyIC0geTE7CisKKyAgICBpZiAoIER5IDw9IDAgfHwgeTIgPCBtaW55IHx8IHkxID4gbWF4eSApCisgICAgICByZXR1cm4gU1VDQ0VTUzsKKworICAgIC8qIGNsaXAgdG8gaGlnaGVyIHNjYW5saW5lIHdoZW4gbmVjZXNzYXJ5ICovCisgICAgaWYgKCB5MiA+IG1heHkgKQorICAgIHsKKyAgICAgIC8qIHgyICs9IEZNdWxEaXYoIER4LCBtYXh5LXkyLCBEeSApOyAgVU5ORUNFU1NBUlkgKi8KKyAgICAgIGUyICA9IFRSVU5DKCBtYXh5ICk7CisgICAgICBmMiAgPSAwOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgZTIgPSBUUlVOQyggeTIgKTsKKyAgICAgIGYyID0gRlJBQyggeTIgKTsKKyAgICB9CisKKyAgICAvKiBjbGlwIHRvIGxvd2VyIHNjYW5saW5lIHdoZW4gbmVjZXNzYXJ5ICovCisgICAgaWYgKCB5MSA8IG1pbnkgKQorICAgIHsKKyAgICAgIFRQb3MgIHgsIHk7CisKKyAgICAgIC8qIHdlIHVzZSBhIGJpbmFyeSBzZWFyY2ggdG8gY29tcHV0ZSB0aGUgbG93ZXIKKyAgICAgIC8vIGNsaXBwaW5nIGludGVyc2VjdGlvbi4gVGhhdCdzIGJlY2F1c2Ugd2UgZG9uJ3QKKyAgICAgIC8vIHdhbnQgdG8gdXNlIGFuIGV4dGVybmFsIGZ1bmN0aW9uIGxpa2UgRlRfTXVsRGl2CisgICAgICAvLyB0byBjb21wdXRlIGl0IGRpcmVjdGx5LgorICAgICAgKi8KKyAgICAgIGlmICggeTIgPT0gbWlueSApIGdvdG8gRXhpdDsKKyAgICAgIGRvCisgICAgICB7CisgICAgICAgIHggPSAoeDEgKyB4MikgPj4gMTsKKyAgICAgICAgeSA9ICh5MSArIHkyKSA+PiAxOworCisgICAgICAgIGlmICh5IDw9IG1pbnkpCisgICAgICAgIHsKKyAgICAgICAgICB4MSA9IHg7CisgICAgICAgICAgeTEgPSB5OworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIHgyID0geDsKKyAgICAgICAgICB5MiA9IHk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHdoaWxlICggeTEgPCBtaW55ICk7CisKKyAgICAgIGUxICA9IFRSVU5DKCBtaW55ICk7CisgICAgICBmMSAgPSAwOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgZTEgPSBUUlVOQyggeTEgKTsKKyAgICAgIGYxID0gRlJBQyggeTEgKTsKKyAgICB9CisKKyAgICAvKiBhZGp1c3Qgc3RhcnQgcG9pbnQgc28gdGhhdCB3ZSBiZWdpbiBvbiBhbiBpbnRlZ2VyIHNjYW5saW5lIHBvc2l0aW9uICovCisgICAgaWYgKCBmMSA+IDAgKQorICAgIHsKKyAgICAgIGlmICggZTEgPT0gZTIgKSBnb3RvIEV4aXQ7CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIHgxICs9IEZNdWxEaXYoIER4LCByYXMucHJlY2lzaW9uIC0gZjEsIER5ICk7CisgICAgICAgIGUxICs9IDE7CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICAgIGlmICggcmFzLmpvaW50ICkKKyAgICAgIHsKKyAgICAgICAgcmFzLmN1cnNvci0tOworICAgICAgICByYXMuam9pbnQgPSBGQUxTRTsKKyAgICAgIH0KKworICAgIHJhcy5qb2ludCA9ICggZjIgPT0gMCApOworCisgICAgLyogaWYgdGhpcyBpcyBhIGBmcmVzaCcgcHJvZmlsZSwgcmVjb3JkIGl0cyBzdGFydGluZyBzY2FubGluZSAqLworICAgIGlmICggcmFzLmZyZXNoICkKKyAgICB7CisgICAgICByYXMuY3VyX3Byb2YtPnN0YXJ0ID0gZTE7CisgICAgICByYXMuZnJlc2ggICAgICAgICAgID0gRkFMU0U7CisgICAgfQorCisgICAgLyogY2hlY2sgZm9yIG92ZXJmbG93ICovCisgICAgc2l6ZSA9IGUyIC0gZTEgKyAxOworICAgIGlmICggcmFzLmN1cnNvciArIHNpemUgPj0gcmFzLnBvb2xfbGltaXQgKQorICAgIHsKKyAgICAgIHJhcy5lcnJvciA9IEVyclJhc3Rlcl9PdmVyZmxvdzsKKyAgICAgIHJldHVybiBGQUlMVVJFOworICAgIH0KKworICAgIC8qIGNvbXB1dGUgZGVjaXNpb24gdmFyaWFibGVzIGFuZCBwdXNoIHRoZSBpbnRlcnNlY3Rpb25zIG9uIHRvcCAqLworICAgIC8qIG9mIHRoZSByZW5kZXIgcG9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIER4IDw8PSByYXMucHJlY2lzaW9uX2JpdHM7CisgICAgSXggICA9IER4IC8gRHk7CisgICAgUnggICA9IER4ICUgRHk7CisgICAgaWYgKFJ4IDwgMCkKKyAgICB7CisgICAgICBJeCAtLTsKKyAgICAgIFJ4ICs9IER5OworICAgIH0KKyAgICAKKyAgICBBeCAgID0gLUR5OworICAgIFJ4IDw8PSAxOworICAgIER5IDw8PSAxOworCisgICAgdG9wID0gcmFzLmN1cnNvcjsKKworICAgIHdoaWxlICggc2l6ZSA+IDAgKQorICAgIHsKKyAgICAgICp0b3ArKyA9IHgxOworCisgICAgICBERUJVR19QU0VUOworCisgICAgICB4MSArPSBJeDsKKyAgICAgIEF4ICs9IFJ4OworICAgICAgaWYgKCBBeCA+PSAwICkKKyAgICAgIHsKKyAgICAgICAgQXggLT0gRHk7CisgICAgICAgIHgxICsrOworICAgICAgfQorICAgICAgc2l6ZS0tOworICAgIH0KKworICAgIHJhcy5jdXJzb3IgPSB0b3A7CisgIEV4aXQ6CisgICAgcmV0dXJuIFNVQ0NFU1M7CisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIExpbmVfRG93biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIENvbXB1dGVzIHRoZSBzY2FuLWxpbmUgaW50ZXJzZWN0aW9ucyBvZiBhIGRlc2NlbmRpbmcgbGluZSBzZWdtZW50ICAqLworICAvKiAgICBhbmQgc3RvcmVzIHRoZW0gaW4gdGhlIHJlbmRlciBwb29sLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB4MSAgIDo6IFRoZSBzdGFydCB4IGNvb3JkaW5hdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgeTEgICA6OiBUaGUgc3RhcnQgeSBjb29yZGluYXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHgyICAgOjogVGhlIGVuZCB4IGNvb3JkaW5hdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB5MiAgIDo6IFRoZSBlbmQgeSBjb29yZGluYXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbWlueSA6OiBUaGUgbWluaW11bSB2ZXJ0aWNhbCBncmlkIGNvb3JkaW5hdGUuICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG1heHkgOjogVGhlIG1heGltdW0gdmVydGljYWwgZ3JpZCBjb29yZGluYXRlLiAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFNVQ0NFU1Mgb3IgRkFJTFVSRS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgc3RhdGljCisgIFRSZXN1bHQgIExpbmVfRG93biggUkFTX0FSR18gVFBvcyAgeDEsICAgVFBvcyAgeTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFBvcyAgeDIsICAgVFBvcyAgeTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFBvcyAgbWlueSwgVFBvcyAgbWF4eSApCisgIHsKKyAgICBUUmVzdWx0ICByZXN1bHQsIGZyZXNoOworCisKKyAgICAvKiBzaW1wbHkgaW52ZXJ0IHRoZSBjb29yZGluYXRlcyBhbmQgY2FsbCBMaW5lX1VwICovCisgICAgZnJlc2ggID0gcmFzLmZyZXNoOworICAgIHJlc3VsdCA9IExpbmVfVXAoIFJBU19WQVJfIHgxLCAteTEsIHgyLCAteTIsIC1tYXh5LCAtbWlueSApOworCisgICAgLyogaWYgdGhpcyB3YXMgYSBmcmVzaCBwcm9maWxlLCBpbnZlcnQgdGhlIHJlY29yZGVkIHN0YXJ0IHBvc2l0aW9uICovCisgICAgaWYgKCBmcmVzaCAmJiAhcmFzLmZyZXNoICkKKyAgICAgIHJhcy5jdXJfcHJvZi0+c3RhcnQgPSAtcmFzLmN1cl9wcm9mLT5zdGFydDsKKworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworCisKKworIC8qIEEgZnVuY3Rpb24gdHlwZSBkZXNjcmliaW5nIHRoZSBmdW5jdGlvbnMgdXNlZCB0byBzcGxpdCBiZXppZXIgYXJjcyAqLworICB0eXBlZGVmICB2b2lkICAoKlRTcGxpdHRlcikoIFRQb2ludCogIGJhc2UgKTsKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBCZXppZXJfVXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBDb21wdXRlcyB0aGUgc2Nhbi1saW5lIGludGVyc2VjdGlvbnMgb2YgYW4gYXNjZW5kaW5nIHNlY29uZC1vcmRlciAgKi8KKyAgLyogICAgQmV6aWVyIGFyYyBhbmQgc3RvcmVzIHRoZW0gaW4gdGhlIHJlbmRlciBwb29sLiAgVGhlIGFyYyBpcyB0YWtlbiAgICovCisgIC8qICAgIGZyb20gdGhlIHRvcCBvZiB0aGUgc3RhY2suICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG1pbnkgOjogVGhlIG1pbmltdW0gdmVydGljYWwgZ3JpZCBjb29yZGluYXRlLiAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBtYXh5IDo6IFRoZSBtYXhpbXVtIHZlcnRpY2FsIGdyaWQgY29vcmRpbmF0ZS4gICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBTVUNDRVNTIG9yIEZBSUxVUkUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0YXRpYworICBUUmVzdWx0ICBCZXppZXJfVXAoIFJBU19BUkdfIGludCAgICAgICAgZGVncmVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRTcGxpdHRlciAgc3BsaXR0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFBvcyAgICAgICBtaW55LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRQb3MgICAgICAgbWF4eSApCisgIHsKKyAgICBUUG9zICB5MSwgeTIsIGUsIGUyLCBlMDsKKyAgICBpbnQgICBmMTsKKworICAgIFRQb2ludCogIGFyYzsKKyAgICBUUG9pbnQqICBzdGFydF9hcmM7CisKKyAgICBQUG9zIHRvcDsKKworCisgICAgYXJjID0gcmFzLmFyYzsKKyAgICB5MSAgPSBhcmNbZGVncmVlXS55OworICAgIHkyICA9IGFyY1swXS55OworICAgIHRvcCA9IHJhcy5jdXJzb3I7CisKKyAgICBpZiAoIHkyIDwgbWlueSB8fCB5MSA+IG1heHkgKQorICAgICAgZ290byBGaW47CisKKyAgICBlMiA9IEZMT09SKCB5MiApOyAgLyogaW50ZWdlciBlbmQgeSAqLworCisgICAgaWYgKCBlMiA+IG1heHkgKQorICAgICAgZTIgPSBGTE9PUihtYXh5KTsKKworICAgIGUwID0gQ0VJTElORyhtaW55KTsKKworICAgIGlmICggeTEgPCBtaW55ICkKKyAgICB7CisgICAgICBlID0gZTA7ICAgICAgICAvKiBpbnRlZ2VyIHN0YXJ0IHkgPT0gY3VycmVudCBzY2FubGluZSAqLworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgZSAgPSBDRUlMSU5HKCB5MSApOyAgIC8qIGludGVnZXIgc3RhcnQgeSA9PSBjdXJyZW50IHNjYW5saW5lICovCisgICAgICBmMSA9IEZSQUMoIHkxICk7ICAgICAgLyogZnJhY3Rpb25hbCBzaGlmdCBvZiBzdGFydCB5ICAgICAgICAgKi8KKyAgICAgIGUwID0gZTsgICAgICAgICAgICAgICAvKiBmaXJzdCBpbnRlZ2VyIHNjYW5saW5lIHRvIGJlIHB1c2hlZCAqLworICAgICAgCisgICAgICBpZiAoIGYxID09IDAgKSAgICAgICAgLyogZG8gd2Ugc3RhcnQgb24gYW4gaW50ZWdlciBzY2FubGluZT8gKi8KKyAgICAgIHsKKyAgICAgICAgaWYgKCByYXMuam9pbnQgKQorICAgICAgICB7CisgICAgICAgICAgdG9wLS07CisgICAgICAgICAgcmFzLmpvaW50ID0gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICAqdG9wKysgPSBhcmNbZGVncmVlXS54OyAgLyogd3JpdGUgZGlyZWN0bHkgc3RhcnQgcG9zaXRpb24gKi8KKworICAgICAgICBERUJVR19QU0VUOworCisgICAgICAgIGUgKz0gcmFzLnByZWNpc2lvbjsgLyogZ28gdG8gbmV4dCBzY2FubGluZSAqLworICAgICAgfQorICAgIH0KKworICAgIC8qIHJlY29yZCBzdGFydCBwb3NpdGlvbiBpZiBuZWNlc3NhcnkgKi8KKyAgICBpZiAoIHJhcy5mcmVzaCApCisgICAgeworICAgICAgcmFzLmN1cl9wcm9mLT5zdGFydCA9IFRSVU5DKCBlMCApOworICAgICAgcmFzLmZyZXNoID0gRkFMU0U7CisgICAgfQorCisgICAgLyogZXhpdCBpZiB0aGUgY3VycmVudCBzY2FubGluZSBpcyBhbHJlYWR5IGFib3ZlIHRoZSBtYXggc2NhbmxpbmUgKi8KKyAgICBpZiAoIGUyIDwgZSApCisgICAgICBnb3RvIEZpbjsKKworICAgIC8qIGNoZWNrIGZvciBvdmVyZmxvdyAqLworICAgIGlmICggKCB0b3AgKyBUUlVOQyggZTIgLSBlICkgKyAxICkgPj0gcmFzLnBvb2xfbGltaXQgKQorICAgIHsKKyAgICAgIHJhcy5jdXJzb3IgPSB0b3A7CisgICAgICByYXMuZXJyb3IgID0gRXJyUmFzdGVyX092ZXJmbG93OworICAgICAgcmV0dXJuIEZBSUxVUkU7CisgICAgfQorCisgICAgc3RhcnRfYXJjID0gYXJjOworCisgICAgLyogbG9vcCB3aGlsZSB0aGVyZSBpcyBzdGlsbCBhbiBhcmMgb24gdGhlIGJlemllciBzdGFjayAqLworICAgIC8qIGFuZCB0aGUgY3VycmVudCBzY2FuIGxpbmUgaXMgYmVsb3cgeSBtYXggPT0gZTIgICAgICAgKi8KKyAgICB3aGlsZSAoIGFyYyA+PSBzdGFydF9hcmMgJiYgZSA8PSBlMiApCisgICAgeworICAgICAgcmFzLmpvaW50ID0gRkFMU0U7CisKKyAgICAgIHkyID0gYXJjWzBdLnk7ICAvKiBmaW5hbCB5IG9mIHRoZSB0b3AtbW9zdCBhcmMgKi8KKworICAgICAgaWYgKCB5MiA+IGUgKSAgIC8qIHRoZSBhcmMgaW50ZXJjZXB0cyB0aGUgY3VycmVudCBzY2FubGluZSAqLworICAgICAgeworICAgICAgICB5MSA9IGFyY1tkZWdyZWVdLnk7ICAvKiBzdGFydCB5IG9mIHRvcC1tb3N0IGFyYyAqLworICAgICAgICAKKyAgICAgICAgaWYgKCB5MiAtIHkxID49IHJhcy5wcmVjaXNpb25fc3RlcCApCisgICAgICAgIHsKKyAgICAgICAgICAvKiBpZiB0aGUgYXJjJ3MgaGVpZ2h0IGlzIHRvbyBncmVhdCwgc3BsaXQgaXQgKi8KKyAgICAgICAgICBzcGxpdHRlciggYXJjICk7CisgICAgICAgICAgYXJjICs9IGRlZ3JlZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAvKiBvdGhlcndpc2UsIGFwcHJveGltYXRlIGl0IGFzIGEgc2VnbWVudCBhbmQgY29tcHV0ZSAqLworICAgICAgICAgIC8qIGl0cyBpbnRlcnNlY3Rpb24gd2l0aCB0aGUgY3VycmVudCBzY2FubGluZSAgICAgICAgICovCisgICAgICAgICAgKnRvcCsrID0gYXJjW2RlZ3JlZV0ueCArCisgICAgICAgICAgICAgICAgICAgRk11bERpdiggYXJjWzBdLngtYXJjW2RlZ3JlZV0ueCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlICAtIHkxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkyIC0geTEgKTsKKworICAgICAgICAgIERFQlVHX1BTRVQ7CisKKyAgICAgICAgICBhcmMgLT0gZGVncmVlOyAgICAgICAgIC8qIHBvcCB0aGUgYXJjICAgICAgICAgKi8KKyAgICAgICAgICBlICAgKz0gcmFzLnByZWNpc2lvbjsgIC8qIGdvIHRvIG5leHQgc2NhbmxpbmUgKi8KKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBpZiAoIHkyID09IGUgKSAgICAgICAgLyogaWYgdGhlIGFyYyBmYWxscyBvbiB0aGUgc2NhbmxpbmUgKi8KKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgIC8qIHJlY29yZCBpdHMgX2pvaW50XyBpbnRlcnNlY3Rpb24gICovCisgICAgICAgICAgcmFzLmpvaW50ICA9IFRSVUU7CisgICAgICAgICAgKnRvcCsrICAgICA9IGFyY1swXS54OworCisgICAgICAgICAgREVCVUdfUFNFVDsKKworICAgICAgICAgIGUgKz0gcmFzLnByZWNpc2lvbjsgLyogZ28gdG8gbmV4dCBzY2FubGluZSAqLworICAgICAgICB9CisgICAgICAgIGFyYyAtPSBkZWdyZWU7ICAgICAgICAvKiBwb3AgdGhlIGFyYyAqLworICAgICAgfQorICAgIH0KKworICBGaW46CisgICAgcmFzLmN1cnNvciA9IHRvcDsKKyAgICByYXMuYXJjICAgLT0gZGVncmVlOworICAgIHJldHVybiBTVUNDRVNTOworICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBCZXppZXJfRG93biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBDb21wdXRlcyB0aGUgc2Nhbi1saW5lIGludGVyc2VjdGlvbnMgb2YgYSBkZXNjZW5kaW5nIHNlY29uZC1vcmRlciAgKi8KKyAgLyogICAgQmV6aWVyIGFyYyBhbmQgc3RvcmVzIHRoZW0gaW4gdGhlIHJlbmRlciBwb29sLiAgVGhlIGFyYyBpcyB0YWtlbiAgICovCisgIC8qICAgIGZyb20gdGhlIHRvcCBvZiB0aGUgc3RhY2suICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG1pbnkgOjogVGhlIG1pbmltdW0gdmVydGljYWwgZ3JpZCBjb29yZGluYXRlLiAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBtYXh5IDo6IFRoZSBtYXhpbXVtIHZlcnRpY2FsIGdyaWQgY29vcmRpbmF0ZS4gICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBTVUNDRVNTIG9yIEZBSUxVUkUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0YXRpYworICBUUmVzdWx0ICBCZXppZXJfRG93biggUkFTX0FSR18gaW50ICAgICAgICBkZWdyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUU3BsaXR0ZXIgIHNwbGl0dGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFBvcyAgICAgICBtaW55LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFBvcyAgICAgICBtYXh5ICkKKyAgeworICAgIFRQb2ludCogIGFyYyA9IHJhcy5hcmM7CisgICAgVFJlc3VsdCAgcmVzdWx0LCBmcmVzaDsKKworICAgIGFyY1swXS55ID0gLWFyY1swXS55OworICAgIGFyY1sxXS55ID0gLWFyY1sxXS55OworICAgIGFyY1syXS55ID0gLWFyY1syXS55OworICAgIGlmIChkZWdyZWUgPiAyKQorICAgICAgYXJjWzNdLnkgPSAtYXJjWzNdLnk7CisKKyAgICBmcmVzaCA9IHJhcy5mcmVzaDsKKworICAgIHJlc3VsdCA9IEJlemllcl9VcCggUkFTX1ZBUl8gZGVncmVlLCBzcGxpdHRlciwgLW1heHksIC1taW55ICk7CisKKyAgICBpZiAoIGZyZXNoICYmICFyYXMuZnJlc2ggKQorICAgICAgcmFzLmN1cl9wcm9mLT5zdGFydCA9IC1yYXMuY3VyX3Byb2YtPnN0YXJ0OworCisgICAgYXJjWzBdLnkgPSAtYXJjWzBdLnk7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisKKyNpZmRlZiBGVF9SQVNURVJfQ09OSUNfQkVaSUVSUworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFNwbGl0X0NvbmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFN1YmRpdmlkZXMgb25lIHNlY29uZC1vcmRlciBCZXppZXIgYXJjIGludG8gdHdvIGpvaW50IHN1Yi1hcmNzIGluICAqLworICAvKiAgICB0aGUgQmV6aWVyIHN0YWNrLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGlzIHJvdXRpbmUgaXMgdGhlIGBiZWVmJyBvZiB0aGUgY29tcG9uZW50LiAgSXQgaXMgb25lIG9mIF90aGVfICAgKi8KKyAgLyogICAgaW5uZXIgbG9vcHMgdGhhdCBzaG91bGQgYmUgb3B0aW1pemVkIGxpa2UgaGVsbCB0byBnZXQgdGhlIGJlc3QgICAgICovCisgIC8qICAgIHBlcmZvcm1hbmNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgc3RhdGljCisgIHZvaWQgIFNwbGl0X0NvbmljKCBUUG9pbnQqICBiYXNlICkKKyAgeworICAgIFRQb3MgIGEsIGI7CisKKworICAgIGJhc2VbNF0ueCA9IGJhc2VbMl0ueDsKKyAgICBiID0gYmFzZVsxXS54OworICAgIGEgPSBiYXNlWzNdLnggPSAoIGJhc2VbMl0ueCArIGIgKS8yOworICAgIGIgPSBiYXNlWzFdLnggPSAoIGJhc2VbMF0ueCArIGIgKS8yOworICAgIGJhc2VbMl0ueCA9ICggYSArIGIgKSAvIDI7CisKKyAgICBiYXNlWzRdLnkgPSBiYXNlWzJdLnk7CisgICAgYiA9IGJhc2VbMV0ueTsKKyAgICBhID0gYmFzZVszXS55ID0gKCBiYXNlWzJdLnkgKyBiICkvMjsKKyAgICBiID0gYmFzZVsxXS55ID0gKCBiYXNlWzBdLnkgKyBiICkvMjsKKyAgICBiYXNlWzJdLnkgPSAoIGEgKyBiICkgLyAyOworICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBQdXNoX0NvbmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBDbGVhcnMgdGhlIEJlemllciBzdGFjayBhbmQgcHVzaGVzIGEgbmV3IGFyYyBvbiB0b3Agb2YgaXQuICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBwMiA6OiBBIHBvaW50ZXIgdG8gdGhlIHNlY29uZCAoY29udHJvbCkgcG9pbnQuICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgcDMgOjogQSBwb2ludGVyIHRvIHRoZSB0aGlyZCAoZW5kKSBwb2ludC4gICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhlIGZpcnN0IHBvaW50IGlzIHRha2VuIGFzIGByYXN0ZXItPmxhc3QnLCBzbyBpdCBkb2Vzbid0IGFwcGVhciAgICovCisgIC8qICAgIGluIHRoZSBzaWduYXR1cmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgc3RhdGljCisgIHZvaWQgIFB1c2hfQ29uaWMoIFJBU19BUkdfIEZUX1ZlY3RvciogIHAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9WZWN0b3IqICBwMyApCisgIHsKKyN1bmRlZiAgU1RPUkUKKyNkZWZpbmUgU1RPUkUoIF9hcmMsIHBvaW50ICkgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIFRQb3MgIHggPSBTQ0FMRUQoIHBvaW50LT54ICk7ICAgICAgIFwKKyAgICAgICAgICAgIFRQb3MgIHkgPSBTQ0FMRUQoIHBvaW50LT55ICk7ICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmICggcmFzLmZsaXBwZWQgKSAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgX2FyYy54ID0geTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgX2FyYy55ID0geDsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgX2FyYy54ID0geDsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgX2FyYy55ID0geTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICB9CisKKyAgICBUUG9pbnQqICBhcmM7CisKKworICAgIHJhcy5hcmMgPSBhcmMgPSByYXMuYXJjczsKKworICAgIGFyY1syXSA9IHJhcy5sYXN0OworICAgIFNUT1JFKCBhcmNbMV0sIHAyICk7CisgICAgU1RPUkUoIGFyY1swXSwgcDMgKTsKKyN1bmRlZiAgU1RPUkUKKyAgfQorCisjZW5kaWYgLyogRlRfUkFTVEVSX0NPTklDX0JFWklFUlMgKi8KKworCisKKyNpZmRlZiBGVF9SQVNURVJfQ1VCSUNfQkVaSUVSUworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgIFNwbGl0X0N1YmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgIFN1YmRpdmlkZXMgYSB0aGlyZC1vcmRlciBCZXppZXIgYXJjIGludG8gdHdvIGpvaW50IHN1Yi1hcmNzIGluICAgICovCisgIC8qICAgICB0aGUgQmV6aWVyIHN0YWNrLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoaXMgcm91dGluZSBpcyB0aGUgYGJlZWYnIG9mIHRoZSBjb21wb25lbnQuICBJdCBpcyBvbmUgb2YgX3RoZV8gICAqLworICAvKiAgICBpbm5lciBsb29wcyB0aGF0IHNob3VsZCBiZSBvcHRpbWl6ZWQgbGlrZSBoZWxsIHRvIGdldCB0aGUgYmVzdCAgICAgKi8KKyAgLyogICAgcGVyZm9ybWFuY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBzdGF0aWMKKyAgdm9pZCAgU3BsaXRfQ3ViaWMoIFRQb2ludCogIGJhc2UgKQorICB7CisgICAgVFBvcyAgIGEsIGIsIGMsIGQ7CisKKworICAgIGJhc2VbNl0ueCA9IGJhc2VbM10ueDsKKyAgICBjID0gYmFzZVsxXS54OworICAgIGQgPSBiYXNlWzJdLng7CisgICAgYmFzZVsxXS54ID0gYSA9ICggYmFzZVswXS54ICsgYyApIC8gMjsKKyAgICBiYXNlWzVdLnggPSBiID0gKCBiYXNlWzNdLnggKyBkICkgLyAyOworICAgIGMgPSAoIGMgKyBkICkgLyAyOworICAgIGJhc2VbMl0ueCA9IGEgPSAoIGEgKyBjICkgLyAyOworICAgIGJhc2VbNF0ueCA9IGIgPSAoIGIgKyBjICkgLyAyOworICAgIGJhc2VbM10ueCA9ICggYSArIGIgKSAvIDI7CisKKyAgICBiYXNlWzZdLnkgPSBiYXNlWzNdLnk7CisgICAgYyA9IGJhc2VbMV0ueTsKKyAgICBkID0gYmFzZVsyXS55OworICAgIGJhc2VbMV0ueSA9IGEgPSAoIGJhc2VbMF0ueSArIGMgKSAvIDI7CisgICAgYmFzZVs1XS55ID0gYiA9ICggYmFzZVszXS55ICsgZCApIC8gMjsKKyAgICBjID0gKCBjICsgZCApIC8gMjsKKyAgICBiYXNlWzJdLnkgPSBhID0gKCBhICsgYyApIC8gMjsKKyAgICBiYXNlWzRdLnkgPSBiID0gKCBiICsgYyApIC8gMjsKKyAgICBiYXNlWzNdLnkgPSAoIGEgKyBiICkgLyAyOworICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBQdXNoX0N1YmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBDbGVhcnMgdGhlIEJlemllciBzdGFjayBhbmQgcHVzaGVzIGEgbmV3IHRoaXJkLW9yZGVyIEJlemllciBhcmMgb24gKi8KKyAgLyogICAgdG9wIG9mIGl0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgcDIgOjogQSBwb2ludGVyIHRvIHRoZSBzZWNvbmQgKGNvbnRyb2wpIHBvaW50LiAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHAzIDo6IEEgcG9pbnRlciB0byB0aGUgdGhpcmQgKGNvbnRyb2wpIHBvaW50LiAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBwNCA6OiBBIHBvaW50ZXIgdG8gdGhlIGZvdXJ0aCAoZW5kKSBwb2ludC4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGUgZmlyc3QgcG9pbnQgaXMgdGFrZW4gYXMgYHJhc3Rlci0+bGFzdCcsIHNvIGl0IGRvZXNuJ3QgYXBwZWFyICAgKi8KKyAgLyogICAgaW4gdGhlIHNpZ25hdHVyZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGlzIGlzIHRoZSBzYW1lIGFzIFB1c2hfQ29uaWMoKSwgZXhjZXB0IHRoYXQgaXQgZGVhbHMgd2l0aCAgICAgICAgKi8KKyAgLyogICAgdGhpcmQtb3JkZXIgQmV6aWVycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBzdGF0aWMKKyAgdm9pZCAgUHVzaF9DdWJpYyggUkFTX0FSR18gRlRfVmVjdG9yKiAgcDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1ZlY3RvciogIHAzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9WZWN0b3IqICBwNCApCisgIHsKKyN1bmRlZiAgU1RPUkUKKyNkZWZpbmUgU1RPUkUoIF9hcmMsIHBvaW50ICkgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIFRQb3MgIHggPSBTQ0FMRUQoIHBvaW50LT54ICk7ICAgICAgIFwKKyAgICAgICAgICAgIFRQb3MgIHkgPSBTQ0FMRUQoIHBvaW50LT55ICk7ICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmICggcmFzLmZsaXBwZWQgKSAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgX2FyYy54ID0geTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgX2FyYy55ID0geDsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgX2FyYy54ID0geDsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgX2FyYy55ID0geTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICB9CisKKyAgICBUUG9pbnQqICBhcmM7CisgICAgcmFzLmFyYyA9IGFyYyA9IHJhcy5hcmNzOworCisKKyAgICBhcmNbM10gPSByYXMubGFzdDsKKyAgICBTVE9SRSggYXJjWzJdLCBwMiApOworICAgIFNUT1JFKCBhcmNbMV0sIHAzICk7CisgICAgU1RPUkUoIGFyY1swXSwgcDQgKTsKKworI3VuZGVmIFNUT1JFCisgIH0KKworI2VuZGlmIC8qIEZUX1JBU1RFUl9DVUJJQ19CRVpJRVJTICovCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBDaGVja19Db250b3VyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBQZXJmb3JtcyBzb21lIGNoZWNrcyBhdCBjb250b3VyIGNsb3N1cmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBTVUNDRVNTIG9yIEZBSUxVUkUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0YXRpYworICBUUmVzdWx0ICBDaGVja19Db250b3VyKCBSQVNfQVJHICkKKyAgeworICAgIFBQcm9maWxlICBsYXN0UHJvZmlsZTsKKworCisgICAgLyogU29tZXRpbWVzLCB0aGUgZmlyc3QgYW5kIGxhc3QgcHJvZmlsZSBpbiBhIGNvbnRvdXIgam9pbiBvbiAgICAgICovCisgICAgLyogYW4gaW50ZWdlciBzY2FuLWxpbmU7IHdlIG11c3QgdGhlbiByZW1vdmUgdGhlIGxhc3QgaW50ZXJzZWN0aW9uICovCisgICAgLyogZnJvbSB0aGUgbGFzdCBwcm9maWxlIHRvIGdldCByaWQgb2YgZG91YmxldHMgICAgICAgICAgICAgICAgICAgICovCisgICAgaWYgKCAoIEZSQUMoIHJhcy5sYXN0LnkgKSA9PSAwICAgICAmJgorICAgICAgICAgICByYXMubGFzdC55ID49IHJhcy5taW5ZICAgICAgJiYKKyAgICAgICAgICAgcmFzLmxhc3QueSA8PSByYXMubWF4WSApICAgICkKKyAgICB7CisgICAgICBpZiAoIHJhcy5maXJzdF9wcm9mICYmIHJhcy5maXJzdF9wcm9mLT5mbG93ID09IHJhcy5jdXJfcHJvZi0+ZmxvdyApCisgICAgICAgIHJhcy5jdXJzb3ItLTsKKyAgICB9CisKKyAgICBsYXN0UHJvZmlsZSA9IHJhcy5jdXJfcHJvZjsKKyAgICBpZiAoIEVuZF9Qcm9maWxlKCBSQVNfVkFSICkgKQorICAgICAgcmV0dXJuIEZBSUxVUkU7CisKKyAgICAvKiBjbG9zZSB0aGUgYG5leHQgcHJvZmlsZSBpbiBjb250b3VyJyBsaW5rZWQgbGlzdCAqLworICAgIGxhc3RQcm9maWxlLT5uZXh0ID0gcmFzLmZpcnN0X3Byb2Y7CisKKyAgICByZXR1cm4gU1VDQ0VTUzsKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgTW92ZV9UbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhpcyBmdW5jdGlvbiBpbmplY3RzIGEgbmV3IGNvbnRvdXIgaW4gdGhlIHJlbmRlciBwb29sLiAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgdG8gICAgIDo6IEEgcG9pbnRlciB0byB0aGUgY29udG91cidzIGZpcnN0IHBvaW50LiAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHJhc3RlciA6OiBBIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgcmFzdGVyIG9iamVjdC4gICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBhcyBhIGBGVFJhc3Rlck1vdmVUb19GdW5jJyBieSB0aGUgb3V0bGluZSAgICAqLworICAvKiAgICBkZWNvbXBvc2VyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0YXRpYworICBpbnQgIE1vdmVfVG8oIEZUX1ZlY3RvciogIHRvLAorICAgICAgICAgICAgICAgIEZUX1Jhc3RlciAgIHJhc3RlciApCisgIHsKKyAgICBUUG9zICBzY2FsZWRfeCwgc2NhbGVkX3k7CisKKyAgICAKKyAgICAvKiBpZiB0aGVyZSB3YXMgYWxyZWFkeSBhIGNvbnRvdXIgYmVpbmcgYnVpbHQsIHBlcmZvcm0gc29tZSBjaGVja3MgKi8KKyAgICBpZiAoIHJhcy5zdGFydF9wcm9mICkKKyAgICAgIGlmICggQ2hlY2tfQ29udG91ciggUkFTX1ZBUiApICkKKyAgICAgICAgcmV0dXJuIEZBSUxVUkU7CisKKyAgICAvKiBzZXQgdGhlIGBjdXJyZW50IGxhc3QgcG9pbnQnICovCisgICAgc2NhbGVkX3ggPSBTQ0FMRUQoIHRvLT54ICk7CisgICAgc2NhbGVkX3kgPSBTQ0FMRUQoIHRvLT55ICk7CisgICAgCisgICAgaWYgKCByYXMuZmxpcHBlZCApCisgICAgeworICAgICAgcmFzLmxhc3QueCA9IHNjYWxlZF95OworICAgICAgcmFzLmxhc3QueSA9IHNjYWxlZF94OworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgcmFzLmxhc3QueCA9IHNjYWxlZF94OworICAgICAgcmFzLmxhc3QueSA9IHNjYWxlZF95OworICAgIH0KKworICAgIHJhcy5zdGF0ZSAgICAgID0gVW5rbm93bjsKKyAgICByYXMuZmlyc3RfcHJvZiA9IE5VTEw7CisKKyAgICByZXR1cm4gU1VDQ0VTUzsKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgTGluZV9UbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhpcyBmdW5jdGlvbiBpbmplY3RzIGEgbmV3IGxpbmUgc2VnbWVudCBpbiB0aGUgcmVuZGVyIHBvb2wgYW5kICAgICovCisgIC8qICAgIGFkanVzdHMgdGhlIHByb2ZpbGVzIGxpc3QgYWNjb3JkaW5nbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHRvICAgICA6OiBBIHBvaW50ZXIgdG8gdGhlIHRhcmdldCBwb3NpdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICByYXN0ZXIgOjogQSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IHJhc3RlciBvYmplY3QuICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBFcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYXMgYSBgRlRSYXN0ZXJMaW5lVG9fRnVuYycgYnkgdGhlIG91dGxpbmUgICAgKi8KKyAgLyogICAgZGVjb21wb3Nlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBzdGF0aWMKKyAgaW50ICBMaW5lX1RvKCBGVF9WZWN0b3IqICB0bywKKyAgICAgICAgICAgICAgICBGVF9SYXN0ZXIgICByYXN0ZXIgKQorICB7CisgICAgVFBvcyAgeCwgc2NhbGVkX3g7CisgICAgVFBvcyAgeSwgc2NhbGVkX3k7CisKKworICAgIHNjYWxlZF94ID0gU0NBTEVEKCB0by0+eCApOworICAgIHNjYWxlZF95ID0gU0NBTEVEKCB0by0+eSApOworCisgICAgaWYgKCByYXMuZmxpcHBlZCApCisgICAgeworICAgICAgeCA9IHNjYWxlZF95OworICAgICAgeSA9IHNjYWxlZF94OworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgeCA9IHNjYWxlZF94OworICAgICAgeSA9IHNjYWxlZF95OworICAgIH0KKworICAgIC8qIEZpcnN0LCBkZXRlY3QgYSBjaGFuZ2Ugb2YgZGlyZWN0aW9uICovCisgICAgaWYgKCB5ICE9IHJhcy5sYXN0LnkgKQorICAgIHsKKyAgICAgIFREaXJlY3Rpb24gIG5ld19zdGF0ZSA9ICggKHkgPiByYXMubGFzdC55KSA/IEFzY2VuZGluZyA6IERlc2NlbmRpbmcgKTsKKworCisgICAgICBpZiAoIHJhcy5zdGF0ZSAhPSBuZXdfc3RhdGUgKQorICAgICAgeyAgICAgIAorICAgICAgICBpZiAoIHJhcy5zdGF0ZSAhPSBVbmtub3duICAgJiYKKyAgICAgICAgICAgICBFbmRfUHJvZmlsZSggUkFTX1ZBUiApICkKKyAgICAgICAgICBnb3RvIEZhaWw7CisKKyAgICAgICAgaWYgKCBOZXdfUHJvZmlsZSggUkFTX1ZBUl8gIG5ld19zdGF0ZSApICkKKyAgICAgICAgICBnb3RvIEZhaWw7CisgICAgICB9CisgICAgfSAgICAgICAgCisKKyAgICAvKiBUaGVuIGNvbXB1dGUgdGhlIGxpbmVzICovCisgICAgc3dpdGNoICggcmFzLnN0YXRlICkKKyAgICB7CisgICAgY2FzZSBBc2NlbmRpbmc6CisgICAgICBpZiAoIExpbmVfVXAgKCBSQVNfVkFSXyAgcmFzLmxhc3QueCwgcmFzLmxhc3QueSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4LCB5LCByYXMubWluWSwgcmFzLm1heFkgKSApCisgICAgICAgIGdvdG8gRmFpbDsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBEZXNjZW5kaW5nOgorICAgICAgaWYgKCBMaW5lX0Rvd24oIFJBU19WQVJfIHJhcy5sYXN0LngsIHJhcy5sYXN0LnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCwgeSwgcmFzLm1pblksIHJhcy5tYXhZICkgKQorICAgICAgICBnb3RvIEZhaWw7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICA7CisgICAgfQorCisgICAgcmFzLmxhc3QueCA9IHg7CisgICAgcmFzLmxhc3QueSA9IHk7CisKKyAgICByZXR1cm4gU1VDQ0VTUzsKKworICBGYWlsOgorICAgIHJldHVybiBGQUlMVVJFOworICB9CisKKworI2lmZGVmIEZUX1JBU1RFUl9DT05JQ19CRVpJRVJTCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBDb25pY19UbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBJbmplY3RzIGEgbmV3IGNvbmljIEJlemllciBhcmMgYW5kIGFkanVzdHMgdGhlIHByb2ZpbGUgbGlzdCAgICAgICAgKi8KKyAgLyogICAgYWNjb3JkaW5nbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgY29udHJvbCA6OiBBIHBvaW50ZXIgdG8gYW4gaW50ZXJtZWRpYXRlIGNvbnRyb2wgcG9pbnQuICAgICAgICAgICAgICovCisgIC8qICAgIHRvICAgICAgOjogQSBwb2ludGVyIHRvIHRoZSBlbmQgcG9pbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICByYXN0ZXIgIDo6IEEgaGFuZGxlIHRvIHRoZSBjdXJyZW50IHJhc3RlciBvYmplY3QuICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBFcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYXMgYSBgRlRSYXN0ZXJDb25pY1RvX0Z1bmMnIGJ5IHRoZSBvdXRsaW5lICAgKi8KKyAgLyogICAgZGVjb21wb3Nlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBzdGF0aWMKKyAgaW50ICBDb25pY19UbyggRlRfVmVjdG9yKiAgY29udHJvbCwKKyAgICAgICAgICAgICAgICAgRlRfVmVjdG9yKiAgdG8sCisgICAgICAgICAgICAgICAgIEZUX1Jhc3RlciAgIHJhc3RlciApCisgIHsKKyAgICBUUG9zICAgICAgICB5MSwgeTIsIHkzLCB4MywgeW1pbiwgeW1heDsKKyAgICBURGlyZWN0aW9uICBzdGF0ZV9iZXo7CisKKworICAgIFB1c2hfQ29uaWMoIFJBU19WQVJfICBjb250cm9sLCB0byApOworCisgICAgZG8KKyAgICB7CisgICAgICB5MSA9IHJhcy5hcmNbMl0ueTsKKyAgICAgIHkyID0gcmFzLmFyY1sxXS55OworICAgICAgeTMgPSByYXMuYXJjWzBdLnk7CisgICAgICB4MyA9IHJhcy5hcmNbMF0ueDsKKworICAgICAgLyogZmlyc3QsIGNhdGVnb3JpemUgdGhlIEJlemllciBhcmMgKi8KKworICAgICAgaWYgKCB5MSA8PSB5MyApCisgICAgICB7CisgICAgICAgIHltaW4gPSB5MTsKKyAgICAgICAgeW1heCA9IHkzOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICB5bWluID0geTM7CisgICAgICAgIHltYXggPSB5MTsKKyAgICAgIH0KKyAgICAgIAorICAgICAgaWYgKCB5MiA8IHltaW4gfHwgeTIgPiB5bWF4ICkKKyAgICAgIHsKKyAgICAgICAgLyogdGhpcyBhcmMgaGFzIG5vIGdpdmVuIGRpcmVjdGlvbiwgc3BsaXQgaXQgISEgKi8KKyAgICAgICAgU3BsaXRfQ29uaWMoIHJhcy5hcmMgKTsKKyAgICAgICAgcmFzLmFyYyArPSAyOworICAgICAgfQorICAgICAgZWxzZSBpZiAoIHkxID09IHkzICkKKyAgICAgIHsKKyAgICAgICAgLyogdGhpcyBhcmMgaXMgZmxhdCwgaWdub3JlIGl0IGFuZCBwb3AgaXQgZnJvbSB0aGUgYmV6aWVyIHN0YWNrICovCisgICAgICAgIHJhcy5hcmMgLT0gMjsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgLyogdGhlIGFyYyBpcyB5LW1vbm90b25vdXMsIGVpdGhlciBhc2NlbmRpbmcgb3IgZGVzY2VuZGluZyAqLworICAgICAgICAvKiBkZXRlY3QgYSBjaGFuZ2Ugb2YgZGlyZWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgIHN0YXRlX2JleiA9ICB5MSA8IHkzID8gQXNjZW5kaW5nIDogRGVzY2VuZGluZzsKKyAgICAgICAgaWYgKCByYXMuc3RhdGUgIT0gc3RhdGVfYmV6ICkKKyAgICAgICAgeworICAgICAgICAgIC8qIGZpbmFsaXplIGN1cnJlbnQgcHJvZmlsZSBpZiBhbnkgKi8KKyAgICAgICAgICBpZiAoIHJhcy5zdGF0ZSAhPSBVbmtub3duICAgJiYKKyAgICAgICAgICAgICAgIEVuZF9Qcm9maWxlKCBSQVNfVkFSICkgKQorICAgICAgICAgICAgZ290byBGYWlsOworICAgICAgICAgICAgCisgICAgICAgICAgLyogY3JlYXRlIGEgbmV3IHByb2ZpbGUgKi8KKyAgICAgICAgICBpZiAoIE5ld19Qcm9maWxlKCBSQVNfVkFSXyBzdGF0ZV9iZXogKSApCisgICAgICAgICAgICBnb3RvIEZhaWw7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8qIG5vdyBjYWxsIHRoZSBhcHByb3ByaWF0ZSByb3V0aW5lICovCisgICAgICAgIGlmICggc3RhdGVfYmV6ID09IEFzY2VuZGluZyApCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoIEJlemllcl9VcCggUkFTX1ZBUl8gIDIsIFNwbGl0X0NvbmljLCByYXMubWluWSwgcmFzLm1heFkgKSApCisgICAgICAgICAgICBnb3RvIEZhaWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgIGlmICggQmV6aWVyX0Rvd24oIFJBU19WQVJfICAyLCBTcGxpdF9Db25pYywgcmFzLm1pblksIHJhcy5tYXhZICkgKQorICAgICAgICAgICAgZ290byBGYWlsOworICAgICAgfSAgICAKKworICAgIH0gd2hpbGUgKCByYXMuYXJjID49IHJhcy5hcmNzICk7CisKKyAgICByYXMubGFzdC54ID0geDM7CisgICAgcmFzLmxhc3QueSA9IHkzOworCisgICAgcmV0dXJuIFNVQ0NFU1M7CisKKyAgRmFpbDoKKyAgICByZXR1cm4gRkFJTFVSRTsKKyAgfQorCisjZWxzZSAvKiBGVF9SQVNURVJfQ09OSUNfQkVaSUVSUyAqLworCisKKyAgc3RhdGljCisgIGludCAgQ29uaWNfVG8oIEZUX1ZlY3RvciogIGNvbnRyb2wsCisgICAgICAgICAgICAgICAgIEZUX1ZlY3RvciogIHRvLAorICAgICAgICAgICAgICAgICBGVF9SYXN0ZXIgICByYXN0ZXIgKQorICB7CisgICAgVU5VU0VEKCBjb250cm9sICk7CisgICAgVU5VU0VEKCB0byApOworICAgIFVOVVNFRCggcmFzdGVyICk7CisKKyAgICByZXR1cm4gRXJyUmFzdGVyX0ludmFsaWRfT3V0bGluZTsKKyAgfQorCisKKyNlbmRpZiAvKiBGVF9SQVNURVJfQ09OSUNfQkVaSUVSUyAqLworCisKKyNpZmRlZiBGVF9SQVNURVJfQ1VCSUNfQkVaSUVSUworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQ3ViaWNfVG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgSW5qZWN0cyBhIG5ldyBjdWJpYyBCZXppZXIgYXJjIGFuZCBhZGp1c3RzIHRoZSBwcm9maWxlIGxpc3QgICAgICAgICovCisgIC8qICAgIGFjY29yZGluZ2x5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGNvbnRyb2wxIDo6IEEgcG9pbnRlciB0byB0aGUgZmlyc3QgY29udHJvbCBwb2ludC4gICAgICAgICAgICAgICAgICAqLworICAvKiAgICBjb250cm9sMiA6OiBBIHBvaW50ZXIgdG8gdGhlIHNlY29uZCBjb250cm9sIHBvaW50LiAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgdG8gICAgICAgOjogQSBwb2ludGVyIHRvIHRoZSBlbmQgcG9pbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHJhc3RlciAgIDo6IEEgaGFuZGxlIHRvIHRoZSBjdXJyZW50IHJhc3RlciBvYmplY3QuICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBhcyBhIGBGVFJhc3RlckN1YmljVG9fRnVuYycgYnkgdGhlIG91dGxpbmUgICAqLworICAvKiAgICBkZWNvbXBvc2VyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0YXRpYworICBpbnQgIEN1YmljX1RvKCBGVF9WZWN0b3IqICBjb250cm9sMSwKKyAgICAgICAgICAgICAgICAgRlRfVmVjdG9yKiAgY29udHJvbDIsCisgICAgICAgICAgICAgICAgIEZUX1ZlY3RvciogIHRvLAorICAgICAgICAgICAgICAgICBGVF9SYXN0ZXIgICByYXN0ZXIgKQorICB7CisgICAgVFBvcyAgICAgICAgeTEsIHkyLCB5MywgeTQsIHg0LCB5bWluMSwgeW1heDEsIHltaW4yLCB5bWF4MjsKKyAgICBURGlyZWN0aW9uICBzdGF0ZV9iZXo7CisKKworICAgIFB1c2hfQ3ViaWMoIFJBU19WQVJfICBjb250cm9sMSwgY29udHJvbDIsIHRvICk7CisKKyAgICBkbworICAgIHsKKyAgICAgIHkxID0gcmFzLmFyY1szXS55OworICAgICAgeTIgPSByYXMuYXJjWzJdLnk7CisgICAgICB5MyA9IHJhcy5hcmNbMV0ueTsKKyAgICAgIHk0ID0gcmFzLmFyY1swXS55OworICAgICAgeDQgPSByYXMuYXJjWzBdLng7CisKKyAgICAgIC8qIGZpcnN0LCBjYXRlZ29yaXplIHRoZSBCZXppZXIgYXJjICovCisKKyAgICAgIGlmICggeTEgPD0geTQgKQorICAgICAgeworICAgICAgICB5bWluMSA9IHkxOworICAgICAgICB5bWF4MSA9IHk0OworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICB5bWluMSA9IHk0OworICAgICAgICB5bWF4MSA9IHkxOworICAgICAgfQorICAgICAgCisgICAgICBpZiAoIHkyIDw9IHkzICkKKyAgICAgIHsKKyAgICAgICAgeW1pbjIgPSB5MjsKKyAgICAgICAgeW1heDIgPSB5MzsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgeW1pbjIgPSB5MzsKKyAgICAgICAgeW1heDIgPSB5MjsKKyAgICAgIH0KKyAgICAgIAorICAgICAgaWYgKCB5bWluMiA8IHltaW4xIHx8IHltYXgyID4geW1heDEgKQorICAgICAgeworICAgICAgICAvKiB0aGlzIGFyYyBoYXMgbm8gZ2l2ZW4gZGlyZWN0aW9uLCBzcGxpdCBpdCEgKi8KKyAgICAgICAgU3BsaXRfQ3ViaWMoIHJhcy5hcmMgKTsKKyAgICAgICAgcmFzLmFyYyArPSAzOworICAgICAgfQorICAgICAgZWxzZSBpZiAoIHkxID09IHk0ICkKKyAgICAgIHsKKyAgICAgICAgLyogdGhpcyBhcmMgaXMgZmxhdCwgaWdub3JlIGl0IGFuZCBwb3AgaXQgZnJvbSB0aGUgYmV6aWVyIHN0YWNrICovCisgICAgICAgIHJhcy5hcmMgLT0gMzsKKyAgICAgIH0gICAgICAgIAorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBzdGF0ZV9iZXogPSAoIHkxIDw9IHk0ICkgPyBBc2NlbmRpbmcgOiBEZXNjZW5kaW5nOworICAgICAKKyAgICAgICAgLyogZGV0ZWN0IGEgY2hhbmdlIG9mIGRpcmVjdGlvbiAqLworICAgICAgICBpZiAoIHJhcy5zdGF0ZSAhPSBzdGF0ZV9iZXogKQorICAgICAgICB7CisgICAgICAgICAgaWYgKCByYXMuc3RhdGUgIT0gVW5rbm93biAgICYmCisgICAgICAgICAgICAgICBFbmRfUHJvZmlsZSggUkFTX1ZBUiApICkKKyAgICAgICAgICAgIGdvdG8gRmFpbDsKKworICAgICAgICAgIGlmICggTmV3X1Byb2ZpbGUoIFJBU19WQVJfIHN0YXRlX2JleiApICkKKyAgICAgICAgICAgIGdvdG8gRmFpbDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGNvbXB1dGUgaW50ZXJzZWN0aW9ucyAqLworICAgICAgICBpZiAoIHN0YXRlX2JleiA9PSBBc2NlbmRpbmcgKQorICAgICAgICB7CisgICAgICAgICAgaWYgKCBCZXppZXJfVXAgKCBSQVNfVkFSXyAzLCBTcGxpdF9DdWJpYywgcmFzLm1pblksIHJhcy5tYXhZICkgKQorICAgICAgICAgICAgZ290byBGYWlsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICBpZiAoIEJlemllcl9Eb3duICggUkFTX1ZBUl8gMywgU3BsaXRfQ3ViaWMsIHJhcy5taW5ZLCByYXMubWF4WSApICkKKyAgICAgICAgICAgIGdvdG8gRmFpbDsKKyAgICAgIH0KKworICAgIH0gd2hpbGUgKCByYXMuYXJjID49IHJhcy5hcmNzICk7CisKKyAgICByYXMubGFzdC54ID0geDQ7CisgICAgcmFzLmxhc3QueSA9IHk0OworCisgICAgcmV0dXJuIFNVQ0NFU1M7CisKKyAgRmFpbDoKKyAgICByZXR1cm4gRkFJTFVSRTsKKyAgfQorCisKKyNlbHNlIC8qIEZUX1JBU1RFUl9DVUJJQ19CRVpJRVJTICovCisKKworICBpbnQgIEN1YmljX1RvKCBGVF9WZWN0b3IqICBjb250cm9sMSwKKyAgICAgICAgICAgICAgICAgRlRfVmVjdG9yKiAgY29udHJvbDIsCisgICAgICAgICAgICAgICAgIEZUX1ZlY3RvciogIHRvLAorICAgICAgICAgICAgICAgICBGVF9SYXN0ZXIgICByYXN0ZXIgKQorICB7CisgICAgVU5VU0VEKCBjb250cm9sMSApOworICAgIFVOVVNFRCggY29udHJvbDIgKTsKKyAgICBVTlVTRUQoIHRvICk7CisgICAgVU5VU0VEKCByYXN0ZXIgKTsKKworICAgIHJldHVybiBFcnJSYXN0ZXJfSW52YWxpZF9PdXRsaW5lOworICB9CisKKworI2VuZGlmIC8qIEZUX1JBU1RFUl9DVUJJQ19CRVpJRVJTICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogVGhlIGZvbGxvd2luZyBmdW5jdGlvbiBpcyBjb21waWxlZCBpbiB0aGUgcmFzdGVyIG9ubHkgd2hlbiBpdCBpcyAqLworLyogY29tcGlsZSBhcyBhIHN0YW5kLWFsb25lIG1vZHVsZS4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisvKiBJdCBjYW4sIG90aGVyd2lzZSwgYmUgZm91bmQgaW4gdGhlIEZyZWVUeXBlIGJhc2UgbGF5ZXIgICAgICAgICAgICovCisKKyNpZmRlZiBfU1RBTkRBTE9ORV8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfRGVjb21wb3NlX091dGxpbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgV2Fsa3Mgb3ZlciBhbiBvdXRsaW5lJ3Mgc3RydWN0dXJlIHRvIGRlY29tcG9zZSBpdCBpbnRvIGluZGl2aWR1YWwgICovCisgIC8qICAgIHNlZ21lbnRzIGFuZCBCZXppZXIgYXJjcy4gIFRoaXMgZnVuY3Rpb24gaXMgYWxzbyBhYmxlIHRvIGVtaXQgICAgICAqLworICAvKiAgICBgbW92ZSB0bycgYW5kIGBjbG9zZSB0bycgb3BlcmF0aW9ucyB0byBpbmRpY2F0ZSB0aGUgc3RhcnQgYW5kIGVuZCAgKi8KKyAgLyogICAgb2YgbmV3IGNvbnRvdXJzIGluIHRoZSBvdXRsaW5lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgb3V0bGluZSAgIDo6IEEgcG9pbnRlciB0byB0aGUgc291cmNlIHRhcmdldC4gICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBpbnRlcmZhY2UgOjogQSB0YWJsZSBvZiBgZW1pdHRlcnMnLCBpLmUsLiBmdW5jdGlvbiBwb2ludGVycyBjYWxsZWQgKi8KKyAgLyogICAgICAgICAgICAgICAgIGR1cmluZyBkZWNvbXBvc2l0aW9uIHRvIGluZGljYXRlIHBhdGggb3BlcmF0aW9ucy4gICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB1c2VyICAgICAgOjogQSB0eXBlbGVzcyBwb2ludGVyIHdoaWNoIGlzIHBhc3NlZCB0byBlYWNoIGVtaXR0ZXIgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgIGR1cmluZyB0aGUgZGVjb21wb3NpdGlvbi4gIEl0IGNhbiBiZSB1c2VkIHRvIHN0b3JlICAgICovCisgIC8qICAgICAgICAgICAgICAgICB0aGUgc3RhdGUgZHVyaW5nIHRoZSBkZWNvbXBvc2l0aW9uLiAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworI2lmIDAKKyAgdHlwZWRlZiBpbnQgICgqRlRSYXN0ZXJNb3ZlVG9fRnVuYykoIEZUX1ZlY3RvciogIHRvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICAgdXNlciApOworCisgIHR5cGVkZWYgaW50ICAoKkZUUmFzdGVyTGluZVRvX0Z1bmMpKCBGVF9WZWN0b3IqICB0bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgIHVzZXIgKTsKKworICB0eXBlZGVmIGludCAgKCpGVFJhc3RlckNvbmljVG9fRnVuYykoIEZUX1ZlY3RvciogIGNvbnRyb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVmVjdG9yKiAgdG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICAgdXNlciApOworCisgIHR5cGVkZWYgaW50ICAoKkZUUmFzdGVyQ3ViaWNUb19GdW5jKSggRlRfVmVjdG9yKiAgY29udHJvbDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVmVjdG9yKiAgY29udHJvbDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVmVjdG9yKiAgdG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICAgdXNlciApOworCisgIHR5cGVkZWYgc3RydWN0ICBGVF9SYXN0ZXJfRnVuY3NfCisgIHsKKyAgICBGVFJhc3Rlck1vdmVUb19GdW5jICAgbW92ZV90bzsKKyAgICBGVFJhc3RlckxpbmVUb19GdW5jICAgbGluZV90bzsKKyAgICBGVFJhc3RlckNvbmljVG9fRnVuYyAgY29uaWNfdG87CisgICAgRlRSYXN0ZXJDdWJpY1RvX0Z1bmMgIGN1YmljX3RvOworCisgIH0gRlRfUmFzdGVyX0Z1bmNzOworI2VuZGlmCisKKyAgaW50ICBGVF9EZWNvbXBvc2VfT3V0bGluZSggRlRfT3V0bGluZSogICAgICAgb3V0bGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfUmFzdGVyX0Z1bmNzKiAgaW50ZXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgICAgICB1c2VyICkKKyAgeworICAgIHR5cGVkZWYgZW51bSBfcGhhc2VzCisgICAgeworICAgICAgcGhhc2VfcG9pbnQsCisgICAgICBwaGFzZV9jb25pYywKKyAgICAgIHBoYXNlX2N1YmljLAorICAgICAgcGhhc2VfY3ViaWMyCisKKyAgICB9IFRQaGFzZTsKKworICAgIEZUX1ZlY3RvciAgdl9maXJzdDsKKyAgICBGVF9WZWN0b3IgIHZfbGFzdDsKKyAgICBGVF9WZWN0b3IgIHZfY29udHJvbDsKKyAgICBGVF9WZWN0b3IgIHZfY29udHJvbDI7CisgICAgRlRfVmVjdG9yICB2X3N0YXJ0OworCisgICAgRlRfVmVjdG9yKiBwb2ludDsKKyAgICBQQnl0ZSAgIGZsYWdzOworCisgICAgaW50ICAgIG47ICAgICAgICAgLyogaW5kZXggb2YgY29udG91ciBpbiBvdXRsaW5lICAgICAqLworICAgIGludCAgICBmaXJzdDsgICAgIC8qIGluZGV4IG9mIGZpcnN0IHBvaW50IGluIGNvbnRvdXIgKi8KKyAgICBpbnQgICAgaW5kZXg7ICAgICAvKiBjdXJyZW50IHBvaW50J3MgaW5kZXggICAgICAgICAgICovCisKKyAgICBpbnQgICAgZXJyb3I7CisKKyAgICBjaGFyICAgdGFnOyAgICAgICAvKiBjdXJyZW50IHBvaW50J3Mgc3RhdGUgICAgICAgICAgICovCisgICAgVFBoYXNlIHBoYXNlOworCisKKyAgICBmaXJzdCA9IDA7CisKKyAgICBmb3IgKCBuID0gMDsgbiA8IG91dGxpbmUtPm5fY29udG91cnM7IG4rKyApCisgICAgeworICAgICAgaW50ICBsYXN0OyAgLyogaW5kZXggb2YgbGFzdCBwb2ludCBpbiBjb250b3VyICovCisKKworICAgICAgbGFzdCA9IG91dGxpbmUtPmNvbnRvdXJzW25dOworCisgICAgICB2X2ZpcnN0ID0gb3V0bGluZS0+cG9pbnRzW2ZpcnN0XTsKKyAgICAgIHZfbGFzdCAgPSBvdXRsaW5lLT5wb2ludHNbbGFzdF07CisKKyAgICAgIHZfc3RhcnQgPSB2X2NvbnRyb2wgPSB2X2ZpcnN0OworCisgICAgICB0YWcgICA9IEZUX0NVUlZFX1RBRyggb3V0bGluZS0+ZmxhZ3NbZmlyc3RdICk7CisgICAgICBpbmRleCA9IGZpcnN0OworCisgICAgICAvKiBBIGNvbnRvdXIgY2Fubm90IHN0YXJ0IHdpdGggYSBjdWJpYyBjb250cm9sIHBvaW50ISAqLworCisgICAgICBpZiAoIHRhZyA9PSBGVF9DdXJ2ZV9UYWdfQ3ViaWMgKQorICAgICAgICByZXR1cm4gRXJyUmFzdGVyX0ludmFsaWRfT3V0bGluZTsKKworCisgICAgICAvKiBjaGVjayBmaXJzdCBwb2ludCB0byBkZXRlcm1pbmUgb3JpZ2luICovCisKKyAgICAgIGlmICggdGFnID09IEZUX0N1cnZlX1RhZ19Db25pYyApCisgICAgICB7CisgICAgICAgIC8qIGZpcnN0IHBvaW50IGlzIGNvbmljIGNvbnRyb2wuICBZZXMsIHRoaXMgaGFwcGVucy4gKi8KKyAgICAgICAgaWYgKCBGVF9DVVJWRV9UQUcoIG91dGxpbmUtPmZsYWdzW2xhc3RdICkgPT0gRlRfQ3VydmVfVGFnX09uICkKKyAgICAgICAgeworICAgICAgICAgIC8qIHN0YXJ0IGF0IGxhc3QgcG9pbnQgaWYgaXQgaXMgb24gdGhlIGN1cnZlICovCisgICAgICAgICAgdl9zdGFydCA9IHZfbGFzdDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAvKiBpZiBib3RoIGZpcnN0IGFuZCBsYXN0IHBvaW50cyBhcmUgY29uaWMsICAgICAgICAgKi8KKyAgICAgICAgICAvKiBzdGFydCBhdCB0aGVpciBtaWRkbGUgYW5kIHJlY29yZCBpdHMgcG9zaXRpb24gICAgKi8KKyAgICAgICAgICAvKiBmb3IgY2xvc3VyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICB2X3N0YXJ0LnggPSAoIHZfc3RhcnQueCArIHZfbGFzdC54ICkgLyAyOworICAgICAgICAgIHZfc3RhcnQueSA9ICggdl9zdGFydC55ICsgdl9sYXN0LnkgKSAvIDI7CisKKyAgICAgICAgICB2X2xhc3QgPSB2X3N0YXJ0OworICAgICAgICB9CisgICAgICAgIHBoYXNlID0gcGhhc2VfY29uaWM7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHBoYXNlID0gcGhhc2VfcG9pbnQ7CisKKworICAgICAgLyogQmVnaW4gYSBuZXcgY29udG91ciB3aXRoIE1PVkVfVE8gKi8KKworICAgICAgZXJyb3IgPSBpbnRlcmZhY2UtPm1vdmVfdG8oICZ2X3N0YXJ0LCB1c2VyICk7CisgICAgICBpZiAoIGVycm9yICkKKyAgICAgICAgcmV0dXJuIGVycm9yOworCisgICAgICBwb2ludCA9IG91dGxpbmUtPnBvaW50cyArIGZpcnN0OworICAgICAgZmxhZ3MgPSBvdXRsaW5lLT5mbGFncyAgKyBmaXJzdDsKKworICAgICAgLyogbm93IHByb2Nlc3MgZWFjaCBjb250b3VyIHBvaW50IGluZGl2aWR1YWxseSAqLworCisgICAgICB3aGlsZSAoIGluZGV4IDwgbGFzdCApCisgICAgICB7CisgICAgICAgIGluZGV4Kys7CisgICAgICAgIHBvaW50Kys7CisgICAgICAgIGZsYWdzKys7CisKKyAgICAgICAgdGFnID0gRlRfQ1VSVkVfVEFHKCBmbGFnc1swXSApOworCisgICAgICAgIHN3aXRjaCAoIHBoYXNlICkKKyAgICAgICAgeworICAgICAgICBjYXNlIHBoYXNlX3BvaW50OiAgICAgLyogdGhlIHByZXZpb3VzIHBvaW50IHdhcyBvbiB0aGUgY3VydmUgKi8KKworICAgICAgICAgIHN3aXRjaCAoIHRhZyApCisgICAgICAgICAgeworICAgICAgICAgICAgLyogdHdvIHN1Y2Nlc2l2ZSBvbiBwb2ludHMgLT4gZW1pdCBzZWdtZW50ICovCisgICAgICAgICAgY2FzZSBGVF9DdXJ2ZV9UYWdfT246CisgICAgICAgICAgICBlcnJvciA9IGludGVyZmFjZS0+bGluZV90byggcG9pbnQsIHVzZXIgKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAvKiBvbiBwb2ludCArIGNvbmljIGNvbnRyb2wgLT4gcmVtZW1iZXIgY29udHJvbCBwb2ludCAqLworICAgICAgICAgIGNhc2UgRlRfQ3VydmVfVGFnX0NvbmljOgorICAgICAgICAgICAgdl9jb250cm9sID0gcG9pbnRbMF07CisgICAgICAgICAgICBwaGFzZSAgICAgPSBwaGFzZV9jb25pYzsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAvKiBvbiBwb2ludCArIGN1YmljIGNvbnRyb2wgLT4gcmVtZW1iZXIgZmlyc3QgY29udHJvbCAqLworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB2X2NvbnRyb2wgPSBwb2ludFswXTsKKyAgICAgICAgICAgIHBoYXNlICAgICA9IHBoYXNlX2N1YmljOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgcGhhc2VfY29uaWM6ICAgLyogdGhlIHByZXZpb3VzIHBvaW50IHdhcyBhIGNvbmljIGNvbnRyb2wgKi8KKworICAgICAgICAgIHN3aXRjaCAoIHRhZyApCisgICAgICAgICAgeworICAgICAgICAgICAgLyogY29uaWMgY29udHJvbCArIG9uIHBvaW50IC0+IGVtaXQgY29uaWMgYXJjICovCisgICAgICAgICAgY2FzZSAgRlRfQ3VydmVfVGFnX09uOgorICAgICAgICAgICAgZXJyb3IgPSBpbnRlcmZhY2UtPmNvbmljX3RvKCAmdl9jb250cm9sLCBwb2ludCwgdXNlciApOworICAgICAgICAgICAgcGhhc2UgPSBwaGFzZV9wb2ludDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAvKiB0d28gc3VjY2Vzc2l2ZSBjb25pY3MgLT4gZW1pdCBjb25pYyBhcmMgYGluIGJldHdlZW4nICovCisgICAgICAgICAgY2FzZSBGVF9DdXJ2ZV9UYWdfQ29uaWM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIEZUX1ZlY3RvciAgdl9taWRkbGU7CisKKworICAgICAgICAgICAgICB2X21pZGRsZS54ID0gKHZfY29udHJvbC54ICsgcG9pbnQtPngpLzI7CisgICAgICAgICAgICAgIHZfbWlkZGxlLnkgPSAodl9jb250cm9sLnkgKyBwb2ludC0+eSkvMjsKKworICAgICAgICAgICAgICBlcnJvciA9IGludGVyZmFjZS0+Y29uaWNfdG8oICZ2X2NvbnRyb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZfbWlkZGxlLCB1c2VyICk7CisgICAgICAgICAgICAgIHZfY29udHJvbCA9IHBvaW50WzBdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGVycm9yID0gRXJyUmFzdGVyX0ludmFsaWRfT3V0bGluZTsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBwaGFzZV9jdWJpYzogIC8qIHRoZSBwcmV2aW91cyBwb2ludCB3YXMgYSBjdWJpYyBjb250cm9sICovCisKKyAgICAgICAgICAvKiB0aGlzIHBvaW50IF9tdXN0XyBiZSBhIGN1YmljIGNvbnRyb2wgdG9vICovCisgICAgICAgICAgaWYgKCB0YWcgIT0gRlRfQ3VydmVfVGFnX0N1YmljICkKKyAgICAgICAgICAgIHJldHVybiBFcnJSYXN0ZXJfSW52YWxpZF9PdXRsaW5lOworCisgICAgICAgICAgdl9jb250cm9sMiA9IHBvaW50WzBdOworICAgICAgICAgIHBoYXNlICAgICAgPSBwaGFzZV9jdWJpYzI7CisgICAgICAgICAgYnJlYWs7CisKKworICAgICAgICBjYXNlIHBoYXNlX2N1YmljMjogIC8qIHRoZSB0d28gcHJldmlvdXMgcG9pbnRzIHdlcmUgY3ViaWNzICovCisKKyAgICAgICAgICAvKiB0aGlzIHBvaW50IF9tdXN0XyBiZSBhbiBvbiBwb2ludCAqLworICAgICAgICAgIGlmICggdGFnICE9IEZUX0N1cnZlX1RhZ19PbiApCisgICAgICAgICAgICBlcnJvciA9IEVyclJhc3Rlcl9JbnZhbGlkX091dGxpbmU7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgZXJyb3IgPSBpbnRlcmZhY2UtPmN1YmljX3RvKCAmdl9jb250cm9sLCAmdl9jb250cm9sMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnQsIHVzZXIgKTsKKyAgICAgICAgICBwaGFzZSA9IHBoYXNlX3BvaW50OworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLyogbGF6eSBlcnJvciB0ZXN0aW5nICovCisgICAgICAgIGlmICggZXJyb3IgKQorICAgICAgICAgIHJldHVybiBlcnJvcjsKKyAgICAgIH0KKworICAgICAgLyogZW5kIG9mIGNvbnRvdXIsIGNsb3NlIGN1cnZlIGNsZWFubHkgKi8KKyAgICAgIGVycm9yID0gMDsKKworICAgICAgdGFnID0gRlRfQ1VSVkVfVEFHKCBvdXRsaW5lLT5mbGFnc1tmaXJzdF0gKTsKKworICAgICAgc3dpdGNoICggcGhhc2UgKQorICAgICAgeworICAgICAgY2FzZSBwaGFzZV9wb2ludDoKKyAgICAgICAgaWYgKCB0YWcgPT0gRlRfQ3VydmVfVGFnX09uICkKKyAgICAgICAgICBlcnJvciA9IGludGVyZmFjZS0+bGluZV90byggJnZfZmlyc3QsIHVzZXIgKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgcGhhc2VfY29uaWM6CisgICAgICAgIGVycm9yID0gaW50ZXJmYWNlLT5jb25pY190byggJnZfY29udHJvbCwgJnZfc3RhcnQsIHVzZXIgKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgcGhhc2VfY3ViaWMyOgorICAgICAgICBpZiAoIHRhZyA9PSBGVF9DdXJ2ZV9UYWdfT24gKQorICAgICAgICAgIGVycm9yID0gaW50ZXJmYWNlLT5jdWJpY190byggJnZfY29udHJvbCwgJnZfY29udHJvbDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdl9maXJzdCwgICB1c2VyICk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBlcnJvciA9IEVyclJhc3Rlcl9JbnZhbGlkX091dGxpbmU7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICBlcnJvciA9IEVyclJhc3Rlcl9JbnZhbGlkX091dGxpbmU7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBpZiAoIGVycm9yICkKKyAgICAgICAgcmV0dXJuIGVycm9yOworCisgICAgICBmaXJzdCA9IGxhc3QgKyAxOworICAgIH0KKworICAgIHJldHVybiBTVUNDRVNTOworICB9CisjZW5kaWYKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBDb252ZXJ0X0dseXBoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBDb252ZXJ0cyBhIGdseXBoIGludG8gYSBzZXJpZXMgb2Ygc2VnbWVudHMgYW5kIGFyY3MgYW5kIG1ha2VzIGEgICAgKi8KKyAgLyogICAgcHJvZmlsZXMgbGlzdCB3aXRoIHRoZW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgb3V0bGluZSA6OiBUaGUgZ2x5cGggb3V0bGluZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgU1VDQ0VTUyBvciBGQUlMVVJFLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBzdGF0aWMKKyAgVFJlc3VsdCAgQ29udmVydF9HbHlwaCggUkFTX0FSR18gRlRfT3V0bGluZSogIG91dGxpbmUgKQorICB7CisgICAgc3RhdGljIEZUX091dGxpbmVfRnVuY3MgIGludGVyZmFjZSA9CisgICAgeworICAgICAgKEZUX091dGxpbmVfTW92ZVRvX0Z1bmMpTW92ZV9UbywKKyAgICAgIChGVF9PdXRsaW5lX0xpbmVUb19GdW5jKUxpbmVfVG8sCisgICAgICAoRlRfT3V0bGluZV9Db25pY1RvX0Z1bmMpQ29uaWNfVG8sCisgICAgICAoRlRfT3V0bGluZV9DdWJpY1RvX0Z1bmMpQ3ViaWNfVG8KKyAgICB9OworCisgICAgLyogU2V0IHVwIHN0YXRlIGluIHRoZSByYXN0ZXIgb2JqZWN0ICovCisgICAgcmFzLnN0YXJ0X3Byb2YgPSBOVUxMOworICAgIHJhcy5qb2ludCAgICAgID0gRkFMU0U7CisgICAgcmFzLmZyZXNoICAgICAgPSBGQUxTRTsKKworICAgIHJhcy5wb29sX2xpbWl0ID0gcmFzLnBvb2xfc2l6ZSAtIEFsaWduUHJvZmlsZVNpemU7CisKKyAgICByYXMubl9leHRyZW1hID0gMDsKKworICAgIHJhcy5jdXJfcHJvZiAgICAgICAgID0gKFBQcm9maWxlKXJhcy5jdXJzb3I7CisgICAgcmFzLmN1cl9wcm9mLT5vZmZzZXQgPSByYXMuY3Vyc29yOworICAgIHJhcy5udW1fcHJvZnMgICAgICAgID0gMDsKKworICAgIC8qIE5vdyBkZWNvbXBvc2UgY3VydmUgKi8KKyAgICBpZiAoIEZUX0RlY29tcG9zZV9PdXRsaW5lKCBvdXRsaW5lLCAmaW50ZXJmYWNlLCAmcmFzICkgKQorICAgICAgcmV0dXJuIEZBSUxVUkU7CisgICAgLyogWFhYOiB0aGUgZXJyb3IgY29uZGl0aW9uIGlzIGluIHJhcy5lcnJvciAqLworCisgICAgLyogQ2hlY2sgdGhlIGxhc3QgY29udG91ciBpZiBuZWVkZWQgKi8KKyAgICBpZiAoIENoZWNrX0NvbnRvdXIoIFJBU19WQVIgKSApCisgICAgICByZXR1cm4gRkFJTFVSRTsKKworICAgIC8qIEZpbmFsaXplIHByb2ZpbGVzIGxpc3QgKi8KKyAgICByZXR1cm4gRmluYWxpemVfUHJvZmlsZV9UYWJsZSggUkFTX1ZBUiApOworICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIEluaXRfTGlua2VkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgSW5pdHMgYW4gZW1wdHkgbGlua2VkIGxpc3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBzdGF0aWMgdm9pZAorICBJbml0X0xpbmtlZCggVFByb2ZpbGVMaXN0KiAgbCApCisgIHsKKyAgICAqbCA9IE5VTEw7CisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogSW5zTmV3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBJbnNlcnRzIGEgbmV3IFByb2ZpbGUgaW4gYSBsaW5rZWQgbGlzdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0YXRpYworICB2b2lkICBJbnNOZXcoIFBQcm9maWxlTGlzdCAgbGlzdCwKKyAgICAgICAgICAgICAgICBQUHJvZmlsZSAgICAgIHByb2ZpbGUgKQorICB7CisgICAgUFByb2ZpbGUgICpvbGQsIGN1cnJlbnQ7CisgICAgVFBvcyAgICAgICB4OworCisKKyAgICBvbGQgICAgID0gbGlzdDsKKyAgICBjdXJyZW50ID0gKm9sZDsKKyAgICB4ICAgICAgID0gcHJvZmlsZS0+WDsKKworICAgIHdoaWxlICggY3VycmVudCApCisgICAgeworICAgICAgaWYgKCB4IDwgY3VycmVudC0+WCApCisgICAgICAgIGJyZWFrOworICAgICAgb2xkICAgICA9ICZjdXJyZW50LT5saW5rOworICAgICAgY3VycmVudCA9ICpvbGQ7CisgICAgfQorCisgICAgcHJvZmlsZS0+bGluayA9IGN1cnJlbnQ7CisgICAgKm9sZCAgICAgICAgICA9IHByb2ZpbGU7CisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogRGVsT2xkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBSZW1vdmVzIGFuIG9sZCBQcm9maWxlIGZyb20gYSBsaW5rZWQgbGlzdC4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0YXRpYworICB2b2lkICBEZWxPbGQoIFBQcm9maWxlTGlzdCAgbGlzdCwKKyAgICAgICAgICAgICAgICBQUHJvZmlsZSAgICAgIHByb2ZpbGUgKQorICB7CisgICAgUFByb2ZpbGUgICpvbGQsIGN1cnJlbnQ7CisKKworICAgIG9sZCAgICAgPSBsaXN0OworICAgIGN1cnJlbnQgPSAqb2xkOworCisgICAgd2hpbGUgKCBjdXJyZW50ICkKKyAgICB7CisgICAgICBpZiAoIGN1cnJlbnQgPT0gcHJvZmlsZSApCisgICAgICB7CisgICAgICAgICpvbGQgPSBjdXJyZW50LT5saW5rOworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIG9sZCAgICAgPSAmY3VycmVudC0+bGluazsKKyAgICAgIGN1cnJlbnQgPSAqb2xkOworICAgIH0KKworICAgIC8qIFdlIHNob3VsZCBuZXZlciByZWFjaCB0aGlzIHBsYWNlLCB1bmxlc3MgdGhlIFByb2ZpbGUgd2FzIG5vdCAgKi8KKyAgICAvKiBwYXJ0IG9mIHRoZSBsaXN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogVXBkYXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBVcGRhdGVzIGFsbCBYIG9mZnNldHMgb2YgYSBkcmF3aW5nIGxpc3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0YXRpYworICB2b2lkICBVcGRhdGUoIFBQcm9maWxlICBmaXJzdCApCisgIHsKKyAgICBQUHJvZmlsZSAgY3VycmVudCA9IGZpcnN0OworCisKKyAgICB3aGlsZSAoIGN1cnJlbnQgKQorICAgIHsKKyAgICAgIGN1cnJlbnQtPlggICAgICAgPSAqY3VycmVudC0+b2Zmc2V0OworICAgICAgY3VycmVudC0+b2Zmc2V0ICs9IGN1cnJlbnQtPmZsb3c7CisgICAgICBjdXJyZW50LT5oZWlnaHQtLTsKKyAgICAgIGN1cnJlbnQgPSBjdXJyZW50LT5saW5rOworICAgIH0KKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBTb3J0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFNvcnRzIGEgdHJhY2UgbGlzdC4gIEluIDk1JSwgdGhlIGxpc3QgaXMgYWxyZWFkeSBzb3J0ZWQuICBXZSBuZWVkICAqLworICAvKiAgICBhbiBhbGdvcml0aG0gd2hpY2ggaXMgZmFzdCBpbiB0aGlzIGNhc2UuICBCdWJibGUgc29ydCBpcyBlbm91Z2ggICAgKi8KKyAgLyogICAgYW5kIHNpbXBsZSB0byBpbXBsZW1lbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBzdGF0aWMKKyAgdm9pZCAgU29ydCggUFByb2ZpbGVMaXN0ICBsaXN0ICkKKyAgeworICAgIFBQcm9maWxlICAqb2xkLCBjdXJyZW50LCBuZXh0OworCisKKyAgICAvKiBGaXJzdCwgc2V0IHRoZSBuZXcgWCBjb29yZGluYXRlIG9mIGVhY2ggcHJvZmlsZSAqLworICAgIFVwZGF0ZSggKmxpc3QgKTsKKworICAgIC8qIFRoZW4gc29ydCB0aGVtICovCisgICAgb2xkICAgICA9IGxpc3Q7CisgICAgY3VycmVudCA9ICpvbGQ7CisKKyAgICBpZiAoICFjdXJyZW50ICkKKyAgICAgIHJldHVybjsKKworICAgIG5leHQgPSBjdXJyZW50LT5saW5rOworCisgICAgd2hpbGUgKCBuZXh0ICkKKyAgICB7CisgICAgICBpZiAoIGN1cnJlbnQtPlggPD0gbmV4dC0+WCApCisgICAgICB7CisgICAgICAgIG9sZCAgICAgPSAmY3VycmVudC0+bGluazsKKyAgICAgICAgY3VycmVudCA9ICpvbGQ7CisKKyAgICAgICAgaWYgKCAhY3VycmVudCApCisgICAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAqb2xkICAgICAgICAgID0gbmV4dDsKKyAgICAgICAgY3VycmVudC0+bGluayA9IG5leHQtPmxpbms7CisgICAgICAgIG5leHQtPmxpbmsgICAgPSBjdXJyZW50OworCisgICAgICAgIG9sZCAgICAgPSBsaXN0OworICAgICAgICBjdXJyZW50ID0gKm9sZDsKKyAgICAgIH0KKworICAgICAgbmV4dCA9IGN1cnJlbnQtPmxpbms7CisgICAgfQorICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKi8KKyAgLyoqKioqKioqICAgICAgICAgICAgVmVydGljYWwgQml0bWFwIFN3ZWVwIFJvdXRpbmVzICAgICAgICAgICAgICAgKioqKioqKiovCisgIC8qKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVmVydGljYWxfU3dlZXBfSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgSW5pdGlhbGl6ZXMgdGhlIHZlcnRpY2FsIGJpdG1hcCBzd2VlcC4gIENhbGxlZCBieSB0aGUgZ2VuZXJpYyAgICAgICovCisgIC8qICAgIHN3ZWVwL2RyYXcgcm91dGluZSBiZWZvcmUgaXRzIGxvb3AuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG1pbiA6OiBUaGUgYWRkcmVzcyBvZiB0aGUgY3VycmVudCBtaW5pbXVtIHNjYW5saW5lLiAgICAgICAgICAgICAgICAqLworICAvKiAgICBtYXggOjogVGhlIGFkZHJlc3Mgb2YgdGhlIGN1cnJlbnQgbWF4aW11bSBzY2FubGluZS4gICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0YXRpYworICB2b2lkICBWZXJ0aWNhbF9Td2VlcF9Jbml0KCBSQVNfQVJHXyBpbnQqICBtaW4sIGludCogIG1heCApCisgIHsKKyAgICBsb25nICBwaXRjaDsKKyAgICAKKyAgICBVTlVTRUQoIG1heCApOworCisgICAgcGl0Y2ggICAgICAgICAgPSByYXMudGFyZ2V0LnBpdGNoOworICAgIAorICAgIC8qIHN0YXJ0IGZyb20gdGhlIGJvdHRvbSBsaW5lLCBnb2luZyB1cCAhISAqLworICAgIHJhcy50cmFjZV9iaXQgID0gLSAqbWluICogcGl0Y2g7CisgICAgcmFzLnRyYWNlX2luY3IgPSAtcGl0Y2g7CisKKyAgICBpZiAocGl0Y2ggPiAwKQorICAgICAgcmFzLnRyYWNlX2JpdCArPSBwaXRjaCoocmFzLnRhcmdldC5yb3dzLTEpOworCisgICAgcmFzLmdyYXlfbWluX3ggPSAwOworICAgIHJhcy5ncmF5X21heF94ID0gMDsKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVmVydGljYWxfU3dlZXBfU3BhbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRHJhd3MgYSBzaW5nbGUgaG9yaXpvbnRhbCBiaXRtYXAgc3BhbiBkdXJpbmcgdGhlIHZlcnRpY2FsIGJpdG1hcCAgICovCisgIC8qICAgIHN3ZWVwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHkgIDo6IFRoZSBjdXJyZW50IHNjYW5saW5lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB4MSA6OiBUaGUgbGVmdCBzcGFuIGVkZ2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgeDIgOjogVGhlIHJpZ2h0IHNwYW4gZWRnZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBzdGF0aWMKKyAgdm9pZCAgVmVydGljYWxfU3dlZXBfU3BhbiggUkFTX0FSR18gVFNjYW4gIHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRQb3MgICB4MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFBvcyAgIHgyICkKKyAgeworICAgIFRQb3MgICBlMSwgZTI7CisgICAgaW50ICAgIGMxLCBjMjsKKyAgICBCeXRlICAgZjEsIGYyOworICAgIFBCeXRlICB0YXJnZXQ7CisKKworICAgIFVOVVNFRCggeSApOworCisgICAgLyogRHJvcC1vdXQgY29udHJvbCAqLworCisgICAgZTEgPSBUUlVOQyggQ0VJTElORyggeDEgKSApOworICAgIGlmICggeDIgLSB4MSAtIHJhcy5wcmVjaXNpb24gPD0gcmFzLnByZWNpc2lvbl9qaXR0ZXIgKQorICAgICAgZTIgPSBlMTsKKyAgICBlbHNlCisgICAgICBlMiA9IFRSVU5DKCBGTE9PUiggeDIgKSApOworCisgICAgaWYgKCBlMSA8PSBlMiAmJiBlMiA+PSAwICYmIGUxIDwgcmFzLmJpdF93aWR0aCApCisgICAgeworICAgICAgaWYgKCBlMSA8IDAgKSAgICAgICAgICAgICAgZTEgPSAwOworICAgICAgaWYgKCBlMiA+PSByYXMuYml0X3dpZHRoICkgZTIgPSByYXMuYml0X3dpZHRoIC0gMTsKKworICAgICAgYzEgPSBlMSA+PiAzOworICAgICAgYzIgPSBlMiA+PiAzOworCisgICAgICBmMSA9ICAoKHVuc2lnbmVkIGNoYXIpMHhGRiA+PiAoZTEgJiA3KSk7CisgICAgICBmMiA9IH4oKHVuc2lnbmVkIGNoYXIpMHg3RiA+PiAoZTIgJiA3KSk7CisKKyNpZmRlZiBGVF9SQVNURVJfQU5ZX0VORElBTgorICAgICAgaWYgKCByYXMuZ3JheV9taW5feCA+IGMxICkgcmFzLmdyYXlfbWluX3ggPSBjMTsKKyAgICAgIGlmICggcmFzLmdyYXlfbWF4X3ggPCBjMiApIHJhcy5ncmF5X21heF94ID0gYzI7CisjZW5kaWYKKworICAgICAgdGFyZ2V0ID0gcmFzLmJpdF9idWZmZXIgKyByYXMudHJhY2VfYml0ICsgYzE7CisgICAgICBjMiAtPSBjMTsKKworICAgICAgaWYgKCBjMiA+IDAgKQorICAgICAgeworICAgICAgICB0YXJnZXRbMF0gfD0gZjE7CisKKyAgICAgICAgLyogbWVtc2V0KCkgaXMgc2xvd2VyIHRoYW4gdGhlIGZvbGxvd2luZyBjb2RlIG9uIG1hbnkgcGxhdGZvcm1zLiAqLworICAgICAgICAvKiBUaGlzIGlzIGR1ZSB0byB0aGUgZmFjdCB0aGF0LCBpbiB0aGUgdmFzdCBtYWpvcml0eSBvZiBjYXNlcywgICovCisgICAgICAgIC8qIHRoZSBzcGFuIGxlbmd0aCBpbiBieXRlcyBpcyByZWxhdGl2ZWx5IHNtYWxsLiAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgYzItLTsKKyAgICAgICAgd2hpbGUgKCBjMiA+IDAgKQorICAgICAgICB7CisgICAgICAgICAgKigrK3RhcmdldCkgPSAweEZGOworICAgICAgICAgIGMyLS07CisgICAgICAgIH0KKyAgICAgICAgdGFyZ2V0WzFdIHw9IGYyOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICAqdGFyZ2V0IHw9ICggZjEgJiBmMiApOworICAgIH0KKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVmVydGljYWxfVGVzdF9QaXhlbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGVzdHMgYSBwaXhlbCBgbGlnaHQnIGR1cmluZyB0aGUgdmVydGljYWwgYml0bWFwIHN3ZWVwLiAgVXNlZCAgICAgICovCisgIC8qICAgIGR1cmluZyBkcm9wLW91dCBjb250cm9sIG9ubHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHkgOjogVGhlIGN1cnJlbnQgc2NhbmxpbmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB4IDo6IFRoZSBjdXJyZW50IHggY29vcmRpbmF0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0YXRpYworICBpbnQgIFZlcnRpY2FsX1Rlc3RfUGl4ZWwoIFJBU19BUkdfIFRTY2FuICB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICB4ICkKKyAgeworICAgIGludCBjMSA9IHggPj4gMzsKKworCisgICAgVU5VU0VEKCB5ICk7CisKKyAgICByZXR1cm4gKCB4ID49IDAgJiYgeCA8IHJhcy5iaXRfd2lkdGggJiYKKyAgICAgICAgICAgICByYXMuYml0X2J1ZmZlcltyYXMudHJhY2VfYml0ICsgYzFdICYgKDB4ODAgPj4gKHggJiA3KSkgKTsKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVmVydGljYWxfU2V0X1BpeGVsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgU2V0cyBhIHNpbmdsZSBwaXhlbCBpbiBhIGJpdG1hcCBkdXJpbmcgdGhlIHZlcnRpY2FsIHN3ZWVwLiAgVXNlZCAgICovCisgIC8qICAgIGR1cmluZyBkcm9wLW91dCBjb250cm9sLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHkgICAgIDo6IFRoZSBjdXJyZW50IHNjYW5saW5lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB4ICAgICA6OiBUaGUgY3VycmVudCB4IGNvb3JkaW5hdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgY29sb3IgOjogSWdub3JlZCBieSB0aGlzIGZ1bmN0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBzdGF0aWMKKyAgdm9pZCAgVmVydGljYWxfU2V0X1BpeGVsKCBSQVNfQVJHXyBpbnQgIHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgY29sb3IgKQorICB7CisgICAgVU5VU0VEKCBjb2xvciApOworICAgIFVOVVNFRCggeSApOworCisgICAgaWYgKCB4ID49IDAgJiYgeCA8IHJhcy5iaXRfd2lkdGggKQorICAgIHsKKyAgICAgIGludCBjMSA9IHggPj4gMzsKKworICAgICAgaWYgKCByYXMuZ3JheV9taW5feCA+IGMxICkgcmFzLmdyYXlfbWluX3ggPSBjMTsKKyAgICAgIGlmICggcmFzLmdyYXlfbWF4X3ggPCBjMSApIHJhcy5ncmF5X21heF94ID0gYzE7CisKKyAgICAgIHJhcy5iaXRfYnVmZmVyW3Jhcy50cmFjZV9iaXQrYzFdIHw9IChjaGFyKSgweDgwID4+ICh4ICYgNykpOworICAgIH0KKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVmVydGljYWxfU3dlZXBfU3RlcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQ2FsbGVkIHdoZW5ldmVyIHRoZSBzd2VlcCBqdW1wcyB0byBhbm90aGVyIHNjYW5saW5lLiAgT25seSB1cGRhdGVzICovCisgIC8qICAgIHRoZSBwb2ludGVycyBpbiB0aGUgdmVydGljYWwgYml0bWFwIHN3ZWVwLiAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgc3RhdGljCisgIHZvaWQgVmVydGljYWxfU3dlZXBfU3RlcCggUkFTX0FSRyApCisgIHsKKyAgICByYXMudHJhY2VfYml0ICs9IHJhcy50cmFjZV9pbmNyOworICB9CisKKworICBzdGF0aWMKKyAgY29uc3QgIFJhc3Rlcl9SZW5kZXIgICB2ZXJ0aWNhbF9yZW5kZXJfbW9ubyA9CisgIHsKKyAgICAmVmVydGljYWxfU3dlZXBfSW5pdCwKKyAgICAmVmVydGljYWxfU3dlZXBfU3BhbiwKKyAgICAmVmVydGljYWxfU3dlZXBfU3RlcCwKKyAgICAmVmVydGljYWxfVGVzdF9QaXhlbCwKKyAgICAmVmVydGljYWxfU2V0X1BpeGVsCisgIH07CisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKiovCisgIC8qKioqKioqKiAgICAgICAgICAgSG9yaXpvbnRhbCBCaXRtYXAgU3dlZXAgUm91dGluZXMgICAgICAgICAgICAgICoqKioqKioqLworICAvKioqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEhvcml6b250YWxfU3dlZXBfSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEluaXRpYWxpemVzIHRoZSBob3Jpem9udGFsIGJpdG1hcCBzd2VlcC4gIENhbGxlZCBieSB0aGUgZ2VuZXJpYyAgICAqLworICAvKiAgICBzd2VlcC9kcmF3IHJvdXRpbmUgYmVmb3JlIGl0cyBsb29wLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBtaW4gOjogVGhlIGFkZHJlc3Mgb2YgdGhlIGN1cnJlbnQgbWluaW11bSBwaXhlbCBjb2x1bW4uICAgICAgICAgICAgKi8KKyAgLyogICAgbWF4IDo6IFRoZSBhZGRyZXNzIG9mIHRoZSBjdXJyZW50IG1heGltdW0gcGl4ZWwgY29sdW1uLiAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBzdGF0aWMKKyAgdm9pZCAgSG9yaXpvbnRhbF9Td2VlcF9Jbml0KCBSQVNfQVJHXyBpbnQqICBtaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiAgbWF4ICkKKyAgeworICAgIFVOVVNFRCggcmFzICk7CisgICAgVU5VU0VEKCBtaW4gKTsKKyAgICBVTlVTRUQoIG1heCApOworCisgICAgLyogbm90aGluZywgcmVhbGx5ICovCisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEhvcml6b250YWxfU3dlZXBfU3BhbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIERyYXdzIGEgc2luZ2xlIHZlcnRpY2FsIGJpdG1hcCBzcGFuIGR1cmluZyB0aGUgaG9yaXpvbnRhbCBiaXRtYXAgICAqLworICAvKiAgICBzd2VlcC4gIEFjdHVhbGx5LCB0aGlzIGZ1bmN0aW9uIGlzIG9ubHkgdXNlZCB0byBjaGVjayBmb3Igd2VpcmQgICAgKi8KKyAgLyogICAgZHJvcC1vdXQgY2FzZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgeSAgOjogVGhlIGN1cnJlbnQgcGl4ZWwgY29sdW1uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHgxIDo6IFRoZSB0b3Agc3BhbiBlZGdlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB4MiA6OiBUaGUgYm90dG9tIHNwYW4gZWRnZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0YXRpYworICB2b2lkICBIb3Jpem9udGFsX1N3ZWVwX1NwYW4oIFJBU19BUkdfIFRTY2FuICB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRQb3MgICB4MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUG9zICAgeDIgKQorICB7CisgICAgVFBvcyAgICAgIGUxLCBlMjsKKyAgICBQQnl0ZSAgYml0czsKKyAgICBCeXRlICAgZjE7CisKKyAgICBVTlVTRUQoIHkgKTsKKworICAgIC8qIER1cmluZyB0aGUgaG9yaXpvbnRhbCBzd2VlcCwgd2Ugb25seSB0YWtlIGNhcmUgb2YgZHJvcC1vdXRzICovCisgICAgaWYgKCB4MiAtIHgxIDwgcmFzLnByZWNpc2lvbiApCisgICAgeworICAgICAgZTEgPSBDRUlMSU5HKCB4MSApOworICAgICAgZTIgPSBGTE9PUiggeDIgKTsKKworICAgICAgaWYgKCBlMSA9PSBlMiApCisgICAgICB7CisgICAgICAgIGJpdHMgPSByYXMuYml0X2J1ZmZlciArICh5ID4+IDMpOworICAgICAgICBmMSAgID0gKEJ5dGUpKDB4ODAgPj4gKHkgJiA3KSk7CisKKyAgICAgICAgZTEgPSBUUlVOQyggZTEgKTsKKworICAgICAgICBpZiAoIGUxID49IDAgJiYgZTEgPCByYXMudGFyZ2V0LnJvd3MgKQorICAgICAgICB7CisgICAgICAgICAgbG9uZyBwaXRjaCAgPSByYXMudGFyZ2V0LnBpdGNoOworICAgICAgICAgIGxvbmcgb2Zmc2V0ID0gLSBwaXRjaCAqIGUxOworICAgICAgICAgIAorICAgICAgICAgIGlmIChwaXRjaCA+IDApCisgICAgICAgICAgICBvZmZzZXQgKz0gKHJhcy50YXJnZXQucm93cy0xKSpwaXRjaDsKKyAgICAgICAgICAgIAorICAgICAgICAgIGJpdHNbb2Zmc2V0XSB8PSBmMTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgSG9yaXpvbnRhbF9UZXN0X1BpeGVsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGVzdHMgYSBwaXhlbCBgbGlnaHQnIGR1cmluZyB0aGUgaG9yaXpvbnRhbCBiaXRtYXAgc3dlZXAuICBVc2VkICAgICovCisgIC8qICAgIGR1cmluZyBkcm9wLW91dCBjb250cm9sIG9ubHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHkgOjogVGhlIGN1cnJlbnQgcGl4ZWwgY29sdW1uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB4IDo6IFRoZSBjdXJyZW50IHJvdy9zY2FubGluZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0YXRpYworICBpbnQgICBIb3Jpem9udGFsX1Rlc3RfUGl4ZWwoIFJBU19BUkdfIGludCAgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgIHggKQorICB7CisgICAgY2hhciogIGJpdHMgICA9IChjaGFyKilyYXMuYml0X2J1ZmZlciArICh5ID4+IDMpOworICAgIGludCAgICBmMSAgICAgPSAoQnl0ZSkoMHg4MCA+PiAoeSAmIDcpKTsKKyAgICBsb25nICAgcGl0Y2ggID0gcmFzLnRhcmdldC5waXRjaDsKKyAgICBsb25nICAgb2Zmc2V0ID0gLSBwaXRjaCAqIHg7CisgICAgCisgICAgaWYgKHBpdGNoID4gMCkKKyAgICAgIG9mZnNldCArPSAocmFzLnRhcmdldC5yb3dzLTEpKnBpdGNoOworICAgICAgCisgICAgcmV0dXJuICggeCA+PSAwICYmIHggPCByYXMudGFyZ2V0LnJvd3MgJiYgKGJpdHNbMF0gJiBmMSkgKTsKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgSG9yaXpvbnRhbF9TZXRfUGl4ZWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgU2V0cyBhIHNpbmdsZSBwaXhlbCBpbiBhIGJpdG1hcCBkdXJpbmcgdGhlIGhvcml6b250YWwgc3dlZXAuICBVc2VkICovCisgIC8qICAgIGR1cmluZyBkcm9wLW91dCBjb250cm9sLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHkgICAgIDo6IFRoZSBjdXJyZW50IHBpeGVsIGNvbHVtbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB4ICAgICA6OiBUaGUgY3VycmVudCByb3cvc2NhbmxpbmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgY29sb3IgOjogSWdub3JlZCBieSB0aGlzIGZ1bmN0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBzdGF0aWMKKyAgdm9pZCAgSG9yaXpvbnRhbF9TZXRfUGl4ZWwoIFJBU19BUkdfIGludCAgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgY29sb3IgKQorICB7CisgICAgY2hhciogIGJpdHMgPSAoY2hhciopcmFzLmJpdF9idWZmZXIgKyAoeSA+PiAzKTsKKyAgICBpbnQgICAgZjEgICA9IChCeXRlKSgweDgwID4+ICh5ICAmIDcpKTsKKworCisgICAgVU5VU0VEKCBjb2xvciApOworCisgICAgaWYgKCB4ID49IDAgJiYgeCA8IHJhcy50YXJnZXQucm93cyApCisgICAgeworICAgICAgbG9uZyBwaXRjaCAgPSByYXMudGFyZ2V0LnBpdGNoOworICAgICAgbG9uZyBvZmZzZXQgPSAtIHgqcGl0Y2g7CisgICAgICAKKyAgICAgIGlmIChwaXRjaCA+IDApCisgICAgICAgIG9mZnNldCArPSAocmFzLnRhcmdldC5yb3dzLTEpKnBpdGNoOyAKKworICAgICAgYml0c1tvZmZzZXRdIHw9IGYxOworICAgIH0KKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgSG9yaXpvbnRhbF9Td2VlcF9TdGVwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQ2FsbGVkIHdoZW5ldmVyIHRoZSBzd2VlcCBqdW1wcyB0byBhbm90aGVyIHBpeGVsIGNvbHVtbi4gICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBzdGF0aWMKKyAgdm9pZCAgSG9yaXpvbnRhbF9Td2VlcF9TdGVwKCBSQVNfQVJHICkKKyAgeworICAgIFVOVVNFRCggcmFzLnRhcmdldCApOworCisgICAgLyogTm90aGluZywgcmVhbGx5ICovCisgIH0KKworCisgIHN0YXRpYworICBjb25zdCAgUmFzdGVyX1JlbmRlciAgIGhvcml6b250YWxfcmVuZGVyX21vbm8gPQorICB7CisgICAgJkhvcml6b250YWxfU3dlZXBfSW5pdCwKKyAgICAmSG9yaXpvbnRhbF9Td2VlcF9TcGFuLAorICAgICZIb3Jpem9udGFsX1N3ZWVwX1N0ZXAsCisgICAgJkhvcml6b250YWxfVGVzdF9QaXhlbCwKKyAgICAmSG9yaXpvbnRhbF9TZXRfUGl4ZWwKKyAgfTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqLworICAvKioqKioqKiogICAgICBBbnRpLUFsaWFzZWQgVmVydGljYWwgQml0bWFwIFN3ZWVwIFJvdXRpbmVzICAgICAgICAqKioqKioqKi8KKyAgLyoqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2lmZGVmIEZUX1JBU1RFUl9PUFRJT05fQU5USV9BTElBUworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFZlcnRpY2FsX0dyYXlfU3dlZXBfSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEluaXRpYWxpemVzIHRoZSB2ZXJ0aWNhbCBiaXRtYXAgc3dlZXAuICBDYWxsZWQgYnkgdGhlIGdlbmVyaWMgICAgICAqLworICAvKiAgICBzd2VlcC9kcmF3IHJvdXRpbmUgYmVmb3JlIGl0cyBsb29wLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBtaW4gOjogVGhlIGFkZHJlc3Mgb2YgdGhlIGN1cnJlbnQgbWluaW11bSBzY2FubGluZS4gICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbWF4IDo6IFRoZSBhZGRyZXNzIG9mIHRoZSBjdXJyZW50IG1heGltdW0gc2NhbmxpbmUuICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBzdGF0aWMKKyAgdm9pZCAgVmVydGljYWxfR3JheV9Td2VlcF9Jbml0KCBSQVNfQVJHXyBpbnQqICBtaW4sIGludCogIG1heCApCisgIHsKKyAgICBsb25nICBwaXRjaDsKKyAgICAKKyAgICBVTlVTRUQoIG1heCApOworCisgICAgcGl0Y2ggICAgICAgICAgPSByYXMudGFyZ2V0LnBpdGNoOworICAgIAorICAgIC8qIHN0YXJ0IGZyb20gdGhlIGJvdHRvbSBsaW5lLCBnb2luZyB1cCAqLworICAgIHJhcy50cmFjZV9pbmNyID0gLXBpdGNoOworICAgIHJhcy50cmFjZV9iaXQgID0gLSAqbWluICogcGl0Y2g7CisgICAgCisgICAgaWYgKHBpdGNoID4gMCkKKyAgICAgIHJhcy50cmFjZV9iaXQgKz0gKHJhcy50YXJnZXQucm93cy0xKSpwaXRjaDsKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVmVydGljYWxfR3JheV9Td2VlcF9TcGFuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRHJhd3MgYSBzaW5nbGUgaG9yaXpvbnRhbCBiaXRtYXAgc3BhbiBkdXJpbmcgdGhlIHZlcnRpY2FsIGJpdG1hcCAgICovCisgIC8qICAgIHN3ZWVwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHkgIDo6IFRoZSBjdXJyZW50IHNjYW5saW5lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB4MSA6OiBUaGUgbGVmdCBzcGFuIGVkZ2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgeDIgOjogVGhlIHJpZ2h0IHNwYW4gZWRnZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBzdGF0aWMKKyAgdm9pZCAgVmVydGljYWxfR3JheV9Td2VlcF9TcGFuKCBSQVNfQVJHXyBUU2NhbiAgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUG9zICAgeDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFBvcyAgIHgyICkKKyAgeworICAgIFRQb3MgICAgICBlMSwgZTI7CisgICAgaW50ICAgICAgIHNoaWZ0ID0gcmFzLnByZWNpc2lvbl9iaXRzIC0gNjsKKyAgICBQQnl0ZSAgdGFyZ2V0OworCisKKyAgICBVTlVTRUQoIHkgKTsKKworICAgIHgxICs9IHJhcy5wcmVjaXNpb25faGFsZjsKKyAgICB4MiArPSByYXMucHJlY2lzaW9uX2hhbGY7CisgICAKKyNpZmRlZiBGVF9SQVNURVJfT1BUSU9OX0NPTlRSQVNUICAgCisgICAgaWYgKCB4Mi14MSA8IHJhcy5wcmVjaXNpb24gKQorICAgIHsKKwkgIHgxID0gKCh4MSt4MikgPj4gMSkgLSByYXMucHJlY2lzaW9uX2hhbGY7CisJICB4MiA9IHgxICsgcmFzLnByZWNpc2lvbjsKKwl9CisjZW5kaWYKKyAgICAgICAgCisgICAgZTEgPSBUUlVOQyggeDEgKTsKKyAgICBlMiA9IFRSVU5DKCB4MiApOworCisgICAgaWYgKCBlMSA8PSBlMiAmJiBlMiA+PSAwICYmIGUxIDwgcmFzLmJpdF93aWR0aCApCisgICAgeworICAgICAgeDEgPSBGUkFDKHgxKSA+PiBzaGlmdDsKKyAgICAgIHgyID0gRlJBQyh4MikgPj4gc2hpZnQ7CisKKyAgICAgIGlmICggZTEgPCAwICkKKyAgICAgIHsKKyAgICAgICAgZTEgPSAwOworICAgICAgICB4MSA9IDA7CisgICAgICB9CisKKyAgICAgIGlmICggZTIgPiByYXMuYml0X3dpZHRoICkKKyAgICAgIHsKKyAgICAgICAgZTIgPSByYXMuYml0X3dpZHRoLTE7CisgICAgICAgIHgyID0gMDsKKyAgICAgIH0KKworICAgICAgdGFyZ2V0ID0gcmFzLmJpdF9idWZmZXIgKyByYXMudHJhY2VfYml0ICsgZTE7CisgICAgICBlMiAgICAtPSBlMTsKKyAgICAgIAorICAgICAgaWYgKCBlMiA+IDAgKQorICAgICAgeworICAgICAgICB0YXJnZXRbMF0gKz0gKEJ5dGUpKDY0LXgxKTsKKyAgICAgICAgZTItLTsKKyAgICAgICAgd2hpbGUgKGUyID4gMCkKKyAgICAgICAgeworICAgICAgICAgICooKyt0YXJnZXQpICs9IDY0OworICAgICAgICAgIGUyLS07CisgICAgICAgIH0KKyAgICAgICAgaWYgKHgyKQorICAgICAgICAgIHRhcmdldFsxXSArPSAoQnl0ZSl4MjsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgdGFyZ2V0WzBdICs9IChCeXRlKSh4Mi14MSk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVmVydGljYWxfR3JheV9UZXN0X1BpeGVsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGVzdHMgYSBwaXhlbCBgbGlnaHQnIGR1cmluZyB0aGUgdmVydGljYWwgYml0bWFwIHN3ZWVwLiAgVXNlZCAgICAgICovCisgIC8qICAgIGR1cmluZyBkcm9wLW91dCBjb250cm9sIG9ubHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHkgOjogVGhlIGN1cnJlbnQgc2NhbmxpbmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB4IDo6IFRoZSBjdXJyZW50IHggY29vcmRpbmF0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0YXRpYworICBpbnQgIFZlcnRpY2FsX0dyYXlfVGVzdF9QaXhlbCggUkFTX0FSR18gVFNjYW4gIHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgeCApCisgIHsKKyAgICBVTlVTRUQoIHkgKTsKKworI2lmIDAKKyAgICAvKiBhcyBhIHJ1bGUgb2YgdGh1bWIsIGRvIG5vdCBhZGQgYSBkcm9wLW91dCBpZiB0aGUgY3VycmVudCAqLworICAgIC8qIGdyYXkgbGV2ZWwgaXMgb3ZlciAwLjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgCisgICAgcmV0dXJuICggeCA+PSAwICYmIHggPCByYXMuYml0X3dpZHRoICYmCisgICAgICAgICAgICAgcmFzLmJpdF9idWZmZXJbcmFzLnRyYWNlX2JpdCArIHhdID49IDY0ICk7CisjZWxzZQorICAgIFVOVVNFRCh4KTsKKyAgICByZXR1cm4gMDsKKyNlbmRpZgorICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBWZXJ0aWNhbF9HcmF5X1NldF9QaXhlbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBTZXRzIGEgc2luZ2xlIHBpeGVsIGluIGEgYml0bWFwIGR1cmluZyB0aGUgdmVydGljYWwgc3dlZXAuICBVc2VkICAgKi8KKyAgLyogICAgZHVyaW5nIGRyb3Atb3V0IGNvbnRyb2wuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgeSAgICAgOjogVGhlIGN1cnJlbnQgc2NhbmxpbmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHggICAgIDo6IFRoZSBjdXJyZW50IHggY29vcmRpbmF0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBjb2xvciA6OiBJZ25vcmVkIGJ5IHRoaXMgZnVuY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0YXRpYworICB2b2lkICBWZXJ0aWNhbF9HcmF5X1NldF9QaXhlbCggUkFTX0FSR18gaW50ICB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICBjb2xvciApCisgIHsKKyAgICBVTlVTRUQoIHkgKTsKKworICAgIGlmICggeCA+PSAwICYmIHggPCByYXMuYml0X3dpZHRoICkKKyAgICB7CisgICAgICB1bnNpZ25lZCBjaGFyKiAgcGl4ZWw7CisgICAgICAKKyAgICAgIHBpeGVsID0gcmFzLmJpdF9idWZmZXIgKyByYXMudHJhY2VfYml0ICsgeDsKKyAgICAgIAorICAgICAgLyogZG8gbm90IGFkZCB0b28gbXVjaCB0byB0aGUgcGl4ZWwgZ3JheSBsZXZlbCAqLworICAgICAgY29sb3IgKz0gKnBpeGVsOworICAgICAgaWYgKGNvbG9yIDwgNjQpCisgICAgICAgIGNvbG9yID0gNjQ7CisKKyAgICAgICpwaXhlbCA9ICggY29sb3IgPj0gMTI4ID8gMTI4IDogKHVuc2lnbmVkIGNoYXIpY29sb3IgKTsKKyAgICB9CisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFZlcnRpY2FsX1N3ZWVwX1N0ZXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIENhbGxlZCB3aGVuZXZlciB0aGUgc3dlZXAganVtcHMgdG8gYW5vdGhlciBzY2FubGluZS4gIE9ubHkgdXBkYXRlcyAqLworICAvKiAgICB0aGUgcG9pbnRlcnMgaW4gdGhlIHZlcnRpY2FsIGJpdG1hcCBzd2VlcC4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0YXRpYworICB2b2lkIFZlcnRpY2FsX0dyYXlfU3dlZXBfU3RlcCggUkFTX0FSRyApCisgIHsKKyAgICByYXMudHJhY2VfYml0ICs9IHJhcy50cmFjZV9pbmNyOworICB9CisKKworCisgIHN0YXRpYworICBjb25zdCAgUmFzdGVyX1JlbmRlciAgIHZlcnRpY2FsX3JlbmRlcl9ncmF5ID0KKyAgeworICAgICZWZXJ0aWNhbF9HcmF5X1N3ZWVwX0luaXQsCisgICAgJlZlcnRpY2FsX0dyYXlfU3dlZXBfU3BhbiwKKyAgICAmVmVydGljYWxfR3JheV9Td2VlcF9TdGVwLAorICAgICZWZXJ0aWNhbF9HcmF5X1Rlc3RfUGl4ZWwsCisgICAgJlZlcnRpY2FsX0dyYXlfU2V0X1BpeGVsCisgIH07CisKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqLworICAvKioqKioqKiogICAgICAgICAgIEhvcml6b250YWwgQml0bWFwIFN3ZWVwIFJvdXRpbmVzICAgICAgICAgICAgICAqKioqKioqKi8KKyAgLyoqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBIb3Jpem9udGFsX1N3ZWVwX0luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBJbml0aWFsaXplcyB0aGUgaG9yaXpvbnRhbCBiaXRtYXAgc3dlZXAuICBDYWxsZWQgYnkgdGhlIGdlbmVyaWMgICAgKi8KKyAgLyogICAgc3dlZXAvZHJhdyByb3V0aW5lIGJlZm9yZSBpdHMgbG9vcC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbWluIDo6IFRoZSBhZGRyZXNzIG9mIHRoZSBjdXJyZW50IG1pbmltdW0gcGl4ZWwgY29sdW1uLiAgICAgICAgICAgICovCisgIC8qICAgIG1heCA6OiBUaGUgYWRkcmVzcyBvZiB0aGUgY3VycmVudCBtYXhpbXVtIHBpeGVsIGNvbHVtbi4gICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgc3RhdGljCisgIHZvaWQgIEhvcml6b250YWxfR3JheV9Td2VlcF9Jbml0KCBSQVNfQVJHXyBpbnQqICBtaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqICBtYXggKQorICB7CisgICAgVU5VU0VEKCByYXMgKTsKKyAgICBVTlVTRUQoIG1pbiApOworICAgIFVOVVNFRCggbWF4ICk7CisKKyAgICAvKiBub3RoaW5nLCByZWFsbHkgKi8KKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgSG9yaXpvbnRhbF9HcmF5X1N3ZWVwX1NwYW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRHJhd3MgYSBzaW5nbGUgdmVydGljYWwgYml0bWFwIHNwYW4gZHVyaW5nIHRoZSBob3Jpem9udGFsIGJpdG1hcCAgICovCisgIC8qICAgIHN3ZWVwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHkgIDo6IFRoZSBjdXJyZW50IHNjYW5saW5lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB4MSA6OiBUaGUgbGVmdCBzcGFuIGVkZ2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgeDIgOjogVGhlIHJpZ2h0IHNwYW4gZWRnZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBzdGF0aWMKKyAgdm9pZCAgSG9yaXpvbnRhbF9HcmF5X1N3ZWVwX1NwYW4oIFJBU19BUkdfIFRTY2FuICB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFBvcyAgIHgxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFBvcyAgIHgyICkKKyAgeworICAgIFRQb3MgICAgICBlMSwgZTI7CisgICAgaW50ICAgICAgIHNoaWZ0ID0gcmFzLnByZWNpc2lvbl9iaXRzIC0gNjsKKyAgICBpbnQgICAgICAgaW5jcjsKKyAgICBQQnl0ZSAgYml0czsKKworCisgICAgVU5VU0VEKCB5ICk7CisKKyAgICB4MSArPSByYXMucHJlY2lzaW9uX2hhbGY7CisgICAgeDIgKz0gcmFzLnByZWNpc2lvbl9oYWxmOworCisjaWZkZWYgRlRfUkFTVEVSX09QVElPTl9DT05UUkFTVCAgIAorICAgIGlmICh4Mi14MSA8IHJhcy5wcmVjaXNpb24pCisJeworCSAgeDEgPSAoKHgxK3gyKSA+PiAxKSAtIHJhcy5wcmVjaXNpb25faGFsZjsKKwkgIHgyID0geDEgKyByYXMucHJlY2lzaW9uOworCX0KKyNlbmRpZgorICAgICAgICAKKyAgICBlMSA9IFRSVU5DKCB4MSApOworICAgIGUyID0gVFJVTkMoIHgyICk7CisKKyAgICBpZiAoIGUxIDw9IGUyICYmIGUyID49IDAgJiYgZTEgPCByYXMuYml0X3dpZHRoICkKKyAgICB7CisgICAgICB4MSA9IEZSQUMoeDEpID4+IHNoaWZ0OworICAgICAgeDIgPSBGUkFDKHgyKSA+PiBzaGlmdDsKKworICAgICAgaWYgKCBlMSA8IDAgKQorICAgICAgeworICAgICAgICBlMSA9IDA7CisgICAgICAgIHgxID0gMDsKKyAgICAgIH0KKworICAgICAgaWYgKCBlMiA+PSByYXMuYml0X3dpZHRoICkKKyAgICAgIHsKKyAgICAgICAgZTIgPSByYXMuYml0X3dpZHRoOworICAgICAgICB4MiA9IDA7CisgICAgICB9CisKKyAgICAgIGluY3IgID0gLXJhcy50YXJnZXQucGl0Y2g7CisgICAgICBiaXRzICA9IHJhcy5iaXRfYnVmZmVyICsgeTsKKyAgICAgIGJpdHMgKz0gaW5jciAqIGUxOworICAgICAgaWYgKGluY3IgPCAwKQorICAgICAgICBiaXRzIC09IGluY3IqKHJhcy50YXJnZXQucm93cy0xKTsgCisKKyAgICAgIGUyIC09IGUxOworICAgICAgCisgICAgICBpZiAoIGUyID4gMCApCisgICAgICB7CisgICAgICAgIGJpdHNbMF0gKz0gKEJ5dGUpKDY0LXgxKTsKKyAgICAgICAgZTItLTsKKyAgICAgICAgd2hpbGUgKGUyID4gMCkKKyAgICAgICAgeworICAgICAgICAgIGJpdHMgICAgKz0gaW5jcjsKKyAgICAgICAgICBiaXRzWzBdICs9IDY0OworICAgICAgICAgIGUyLS07CisgICAgICAgIH0KKyAgICAgICAgaWYgKHgyKQorICAgICAgICAgIGJpdHNbaW5jcl0gKz0gKEJ5dGUpeDI7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGJpdHNbMF0gKz0gKEJ5dGUpKHgyLXgxKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEhvcml6b250YWxfR3JheV9UZXN0X1BpeGVsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRlc3RzIGEgcGl4ZWwgYGxpZ2h0JyBkdXJpbmcgdGhlIGhvcml6b250YWwgYml0bWFwIHN3ZWVwLiAgVXNlZCAgICAqLworICAvKiAgICBkdXJpbmcgZHJvcC1vdXQgY29udHJvbCBvbmx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB5IDo6IFRoZSBjdXJyZW50IHBpeGVsIGNvbHVtbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgeCA6OiBUaGUgY3VycmVudCByb3cvc2NhbmxpbmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBzdGF0aWMKKyAgaW50ICAgSG9yaXpvbnRhbF9HcmF5X1Rlc3RfUGl4ZWwoIFJBU19BUkdfIGludCAgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgeCApCisgIHsKKyNpZiAwCisgICAgdW5zaWduZWQgY2hhciogIHBpeGVsID0gKHVuc2lnbmVkIGNoYXIqKXJhcy5iaXRfYnVmZmVyICsgeTsKKworICAgIGlmICggcmFzLnRhcmdldC5mbG93ID09IEZsb3dfRG93biApCisgICAgICBwaXhlbCArPSAocmFzLnRhcmdldC5yb3dzLTEgLSB4KSAqIHJhcy50YXJnZXQuY29sczsKKyAgICBlbHNlCisgICAgICBwaXhlbCArPSB4ICogcmFzLnRhcmdldC5jb2xzOworCisgICAgcmV0dXJuICggeCA+PSAwICYmIHggPCByYXMudGFyZ2V0LnJvd3MgJiYKKyAgICAgICAgICAgICpwaXhlbCA+PSA2NCApOworI2Vsc2UKKyAgICBVTlVTRUQoeSk7CisgICAgVU5VU0VEKHgpOworICAgIHJldHVybiAwOworI2VuZGlmCisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEhvcml6b250YWxfU2V0X1BpeGVsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFNldHMgYSBzaW5nbGUgcGl4ZWwgaW4gYSBiaXRtYXAgZHVyaW5nIHRoZSBob3Jpem9udGFsIHN3ZWVwLiAgVXNlZCAqLworICAvKiAgICBkdXJpbmcgZHJvcC1vdXQgY29udHJvbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB5ICAgICA6OiBUaGUgY3VycmVudCBwaXhlbCBjb2x1bW4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgeCAgICAgOjogVGhlIGN1cnJlbnQgcm93L3NjYW5saW5lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGNvbG9yIDo6IElnbm9yZWQgYnkgdGhpcyBmdW5jdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgc3RhdGljCisgIHZvaWQgIEhvcml6b250YWxfR3JheV9TZXRfUGl4ZWwoIFJBU19BUkdfIGludCAgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgIGNvbG9yICkKKyAgeworICAgIHVuc2lnbmVkIGNoYXIqICBwaXhlbCA9ICh1bnNpZ25lZCBjaGFyKilyYXMuYml0X2J1ZmZlciArIHk7CisKKyAgICBpZiAoIHggPj0gMCAmJiB4IDwgcmFzLnRhcmdldC5yb3dzICkKKyAgICB7CisgICAgICBsb25nICBwaXRjaCAgPSByYXMudGFyZ2V0LnBpdGNoOworICAgICAgCisgICAgICBwaXhlbCAtPSBwaXRjaCp4OworICAgICAgaWYgKHBpdGNoID4gMCkKKyAgICAgICAgcGl4ZWwgKz0gcGl0Y2gqKHJhcy50YXJnZXQucm93cy0xKTsgCisKKyAgICAgIGNvbG9yICs9ICpwaXhlbDsKKyAgICAgIGlmIChjb2xvciA8IDY0KQorICAgICAgICBjb2xvciA9IDY0OworCisgICAgICAqcGl4ZWwgPSAoY29sb3IgPj0gMTI4ID8gMTI4IDogKHVuc2lnbmVkIGNoYXIpY29sb3IgKTsKKyAgICB9CisgIH0KKworCisgIHN0YXRpYworICB2b2lkIEdyYXlfSWdub3JlKCB2b2lkICkKKyAgeworICAgIDsKKyAgfQorCisKKyAgc3RhdGljCisgIGNvbnN0ICBSYXN0ZXJfUmVuZGVyICAgaG9yaXpvbnRhbF9yZW5kZXJfZ3JheSA9CisgIHsKKyAgICAmSG9yaXpvbnRhbF9HcmF5X1N3ZWVwX0luaXQsCisgICAgJkhvcml6b250YWxfR3JheV9Td2VlcF9TcGFuLAorCisgICAgKEZ1bmN0aW9uX1N3ZWVwX1N0ZXApICAmR3JheV9JZ25vcmUsCisgICAgJkhvcml6b250YWxfR3JheV9UZXN0X1BpeGVsLAorICAgICZIb3Jpem9udGFsX0dyYXlfU2V0X1BpeGVsLAorICB9OworCisjZW5kaWYgLyogRlRfUkFTVEVSX09QVElPTl9BTlRJX0FMSUFTICovCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIEEgdGVjaG5pY2FsIG5vdGUgdG8gZXhwbGFpbiBob3cgdGhlIHNjYW5saW5lIHN3ZWVwIGlzIHBlcmZvcm1lZDogICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICBUaGUgZnVuY3Rpb24gRHJhd19Td2VlcCgpIGlzIHVzZWQgdG8gc3dlZXAgdGhlIHNjYW5saW5lcyBvZiB0aGUgICAgICovCisgIC8qICAgdGFyZ2V0IGJpdG1hcCBvciBwaXhtYXAuICBGb3IgZWFjaCBzY2FubGluZSwgaXQgbXVzdCBkbyB0aGUgICAgICAgICAqLworICAvKiAgIGZvbGxvd2luZzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgLSBHZXQgdGhlIHNldCBvZiBhbGwgb3V0bGluZSBpbnRlcnNlY3Rpb25zIGZvciB0aGUgY3VycmVudCAgICAgICAgICAqLworICAvKiAgICAgc2NhbmxpbmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgLSBTb3J0IHRoZXNlIGludGVyc2VjdGlvbnMgKGluIGluY3JlYXNpbmcgb3JkZXIpLiAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAtIFBhaXIgaW50ZXJzZWN0aW9ucyB0byBjcmVhdGUgc3BhbnMgKGhvcml6b250YWwgcGl4ZWwgc2VnbWVudHMpICAgICovCisgIC8qICAgICB0aGF0IGFyZSB0aGVuIGBkcmF3bicgYnkgY2FsbGluZyBhIGBzd2VlcF9zcGFuJyBmdW5jdGlvbi4gICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAtIENoZWNrIGZvciBkcm9wb3V0czogSWYgYSBzcGFuIGlzIHRvbyBzbWFsbCB0byBiZSBkcmF3biwgaXQgbXVzdCAgICovCisgIC8qICAgICBiZSByZS1hZGp1c3RlZCBpbiBvcmRlciB0byBtYWtlIGl0IHZpc2libGUgYWdhaW4uICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICBUaGUgc3dlZXAgc3RhcnRzIGZyb20gdGhlIGJvdHRvbSBvZiB0aGUgb3V0bGluZSAoeW1pbikgYW5kIGdvZXMgICAgICovCisgIC8qICAgdXB3YXJkcyAodG8geW1heCkuICBUaHVzLCB0aGUgZnVuY3Rpb24gbWFuYWdlcyB0aGUgZm9sbG93aW5nOiAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAtIEEgbGlua2VkIGxpc3Qgb2YgdGhlIHByb2ZpbGVzIHdoaWNoIGFyZSBhYm92ZSB0aGUgY3VycmVudCAgICAgICAgICovCisgIC8qICAgICBzY2FubGluZS4gIEl0IGlzIGNhbGxlZCB0aGUgYHdhaXQnIGxpc3QgYXMgaXQgY29udGFpbnMgYWxsIHRoZSAgICAqLworICAvKiAgICAgcHJvZmlsZXMgd2FpdGluZyB0byBiZSBgYWN0aXZhdGVkJyBkdXJpbmcgdGhlIHN3ZWVwLiAgSXQgY29udGFpbnMgKi8KKyAgLyogICAgIGFsbCBwcm9maWxlcyBpbml0aWFsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIC0gQSBsaW5rZWQgbGlzdCBvZiB0aGUgcHJvZmlsZXMgY292ZXJpbmcgdGhlIGN1cnJlbnQgc2NhbmxpbmUsICAgICAgKi8KKyAgLyogICAgIGkuZS4sIGFsbCB0aGUgcHJvZmlsZXMgdGhhdCBjb250YWluIGFuIGludGVyc2VjdGlvbiBmb3IgdGhlICAgICAgICovCisgIC8qICAgICBjdXJyZW50IHNjYW5saW5lLiAgSXQgaXMgY2FsbGVkIHRoZSBgZHJhdycgbGlzdC4gICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICBBIHByb2ZpbGUgdHJhdmVscyBmcm9tIHRoZSB3YWl0IGxpc3QgdG8gdGhlIGRyYXcgbGlzdCBpZiB0aGUgICAgICAgICovCisgIC8qICAgY3VycmVudCBzY2FubGluZSByZWFjaGVzIGl0cyBib3R0b20gYm9yZGVyIChpdHMgeW1pbikuICBJdCBpcyBhbHNvICAqLworICAvKiAgIHJlbW92ZWQgZnJvbSB0aGUgZHJhdyBsaXN0IChhbmQgYmVjb21lcyB1bmxpc3RlZCkgd2hlbiB0aGUgY3VycmVudCAgKi8KKyAgLyogICBzY2FubGluZSByZWFjaGVzIHRoZSBzY2FubGluZSBhYm92ZSBpdHMgdXBwZXIgYm9yZGVyIChpdHMgeW1heCkuICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIFRoZXNlIHBvc2l0aW9ucyBjb3JyZXNwb25kIHRvIHRoZSBgZXh0cmVtYScgdGFibGUgYnVpbHQgYnkgICAgICAgICAgKi8KKyAgLyogICBGaW5hbGl6ZV9Qcm9maWxlX1RhYmxlKCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIFRoZSBkcmF3IGxpc3QgaXMgYWx3YXlzIHNvcnRlZCBpbiBpbmNyZWFzaW5nIG9yZGVyIG9mIHRoZSBYICAgICAgICAgKi8KKyAgLyogICBjb29yZGluYXRlcy4gIFdlIHVzZSBhIGJ1YmJsZSBzb3J0IGJlY2F1c2UgaXQgaXMgZWFzeSB0byBpbXBsZW1lbnQgICovCisgIC8qICAgb24gYSBsaW5rZWQgbGlzdCwgYW5kIGJlY2F1c2UgaW4gOTUlIGNhc2VzLCB0aGUgbGlzdCBpcyBhbHJlYWR5ICAgICAqLworICAvKiAgIGNvcnJlY3RseSBzb3J0ZWQgd2hlbiBnb2luZyBmcm9tIG9uZSBzY2FubGluZSB0byB0aGUgb3RoZXIuICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgVGhlIGV4dHJlbWEgdGFibGUgZ2l2ZXMgdGhlIHNjYW5saW5lIGNvb3JkaW5hdGVzIGF0IHdoaWNoIGF0IGxlYXN0ICAqLworICAvKiAgIG9uZSBwcm9maWxlIG11c3QgYmUgcmVtb3ZlZCBmcm9tIHRoZSBgZHJhdycgbGlzdCwgb3IgYW5vdGhlciBvbmUgICAgKi8KKyAgLyogICBtdXN0IGJlIG1vdmVkIGZyb20gdGhlIGB3YWl0JyB0byBgZHJhdycgbGlzdHMuICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIE5vdGUgdGhhdCB3aGVuIGEgZHJvcG91dCBpcyBkZXRlY3RlZCwgdGhlIGNvcnJlc3BvbmRpbmcgc3BhbiBpcyBub3QgKi8KKyAgLyogICBkcmF3biBpbW1lZGlhdGVseSBidXQga2VwdCBvbiBhIHRlbXBvcmFyeSBsaXN0LiAgQWxsIGRyb3BvdXQgc3BhbnMgICovCisgIC8qICAgYXJlIGRyYXduIGFmdGVyIHRoZSByZWd1bGFyIHNwYW5zIG9uIGEgZ2l2ZW4gc2NhbmxpbmUuICBUaGlzIGlzIGEgICAqLworICAvKiAgIHJlcXVpcmVtZW50IG9mIHRoZSBUcnVlVHlwZSBzcGVjaWZpY2F0aW9uIHRvIHByb3Blcmx5IGltcGxlbWVudCAgICAgKi8KKyAgLyogICBzb21lIGRyb3Atb3V0IGNvbnRyb2wgbW9kZXMgLS0geWVzLCBpdCdzIHdlaXJkISAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIEZpbmFsbHksIHRoZSBwYXJzZXIgY29udGFpbnMgZm91ciBmdW5jdGlvbiBwb2ludGVycyB0aGF0IGFyZSBjYWxsZWQgKi8KKyAgLyogICBieSBEcmF3X1N3ZWVwKCkuICBFYWNoIHJlbmRlcmluZyBtb2RlIChtb25vY2hyb21lLCBhbnRpLWFsaWFzZWQtNSwgICovCisgIC8qICAgYW5kIGFudGktYWxpYXNlZC0xNykgcHJvdmlkZSBpdHMgb3duIHNldCBvZiBzdWNoIGZ1bmN0aW9ucy4gIFRoZXNlICAqLworICAvKiAgIGFyZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICBzd2VlcF9pbml0OiAgICAgICBDYWxsZWQgb25seSB3aGVuIHRoZSBzd2VlcCBzdGFydHMuICBVc2VkIHRvIHNldCAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgdXAgc29tZSB2YXJpYWJsZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICBzd2VlcF9zcGFuOiAgICAgICBVc2VkIHRvIGRyYXcgYSBob3Jpem9udGFsIHNwYW4gb24gdGhlIGN1cnJlbnQgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgc2NhbmxpbmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICBzd2VlcF90ZXN0X3BpeGVsOiBVc2VkIHRvIHRlc3QgYSBwaXhlbCdzIGludGVuc2l0eSwgYXMgaXQgaXMgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQgZm9yIGRyb3Atb3V0IGNvbnRyb2wuICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICBzd2VlcF9wdXRfcGl4ZWw6ICBVc2VkIHRvIHdyaXRlIGEgc2luZ2xlIHBpeGVsIHdoZW4gYSBkcm9wLW91dCAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgbmVlZHMgdG8gYmUgbGlnaHRlZC9kcmF3bi4gICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgR2VuZXJpYyBTd2VlcCBEcmF3aW5nIHJvdXRpbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0YXRpYworICBUUmVzdWx0ICBEcmF3X1N3ZWVwKCBSQVNfQVJHICkKKyAgeworICAgIFRTY2FuICB5LCB5X2NoYW5nZSwgeV9oZWlnaHQ7CisKKyAgICBQUHJvZmlsZSAgUCwgUSwgUF9MZWZ0LCBQX1JpZ2h0OworCisgICAgVFNjYW4gICBtaW5fWSwgbWF4X1ksIHRvcCwgYm90dG9tLCBkcm9wb3V0czsKKworICAgIFRQb3MgeDEsIHgyLCBlMSwgZTI7CisKKyAgICBUUHJvZmlsZUxpc3QgIHdhaXQ7CisgICAgVFByb2ZpbGVMaXN0ICBkcmF3OworCisKKyAgICAvKiBJbml0IGVtcHR5IGxpbmtlZCBsaXN0cyAqLworICAgIEluaXRfTGlua2VkKCAmd2FpdCApOworICAgIEluaXRfTGlua2VkKCAmZHJhdyApOworCisgICAgLyogZmlyc3QsIGNvbXB1dGUgbWluIGFuZCBtYXggWSAtLSBhbmQgYWRkIHByb2ZpbGVzIHRvIHRoZSB3YWl0IGxpc3QgKi8KKyAgICBQICAgICA9IHJhcy5zdGFydF9wcm9mOworICAgIG1heF9ZID0gVFJVTkMoIHJhcy5taW5ZICk7CisgICAgbWluX1kgPSBUUlVOQyggcmFzLm1heFkgKTsKKworICAgIHdoaWxlICggUCApCisgICAgeworICAgICAgUSA9IFAtPmxpbms7CisKKyAgICAgIGJvdHRvbSA9IFAtPnN0YXJ0OworICAgICAgdG9wICAgID0gUC0+c3RhcnQgKyBQLT5oZWlnaHQtMTsKKworICAgICAgaWYgKCBtaW5fWSA+IGJvdHRvbSApIG1pbl9ZID0gYm90dG9tOworICAgICAgaWYgKCBtYXhfWSA8IHRvcCAgICApIG1heF9ZID0gdG9wOworCisgICAgICBQLT5YID0gMDsKKyAgICAgIEluc05ldyggJndhaXQsIFAgKTsKKworICAgICAgUCA9IFE7CisgICAgfQorCisgICAgLyogQ2hlY2sgdGhlIGV4dHJlbWEgdGFibGUgKi8KKyAgICBpZiAoIHJhcy5uX2V4dHJlbWEgPT0gMCApCisgICAgeworICAgICAgcmFzLmVycm9yID0gRXJyUmFzdGVyX0ludmFsaWRfT3V0bGluZTsKKyAgICAgIHJldHVybiBGQUlMVVJFOworICAgIH0KKworICAgIC8qIE5vdyBpbml0cyB0aGUgc3dlZXAgKi8KKyAgICBQVFJBQ0UyKCggImRyYXdfc3dlZXA6IGluaXRpYWxpemUgc3dlZXBcbiIgKSk7CisgICAgcmFzLnJlbmRlci5pbml0KCBSQVNfVkFSXyAgJm1pbl9ZLCAmbWF4X1kgKTsKKyAgICBQVFJBQ0UyKCggIiAgaW5pdCBtaW5feSA9ICVkLCBtYXhfeSA9ICVkXG4iLCBtaW5fWSwgbWF4X1kgKSk7CisKKyAgICAvKiBUaGVuIGNvbXB1dGUgdGhlIGRpc3RhbmNlIG9mIGVhY2ggcHJvZmlsZSBmcm9tIG1pbl9ZICovCisgICAgUCA9IHdhaXQ7CisgICAgd2hpbGUgKCBQICkKKyAgICB7CisgICAgICBQLT5jb3VudEwgPSBQLT5zdGFydCAtIG1pbl9ZOworICAgICAgUCA9IFAtPmxpbms7CisgICAgfQorCisgICAgLyogTGV0J3MgZ28gKi8KKyAgICB5ICAgICAgICA9IG1pbl9ZOworICAgIHlfaGVpZ2h0ID0gMDsKKworICAgIGlmICggcmFzLm5fZXh0cmVtYSA+IDAgJiYKKyAgICAgICAgIHJhcy5wb29sX3NpemVbLXJhcy5uX2V4dHJlbWFdID09IG1pbl9ZICkKKyAgICAgIHJhcy5uX2V4dHJlbWEtLTsKKworICAgIFBUUkFDRTIoKCAic3RhcnRpbmcgbG9vcCB3aXRoIG5fZXh0cmVtYSA9ICVkIiwgcmFzLm5fZXh0cmVtYSApKTsKKyAgICB3aGlsZSAoIHJhcy5uX2V4dHJlbWEgPiAwICkKKyAgICB7CisgICAgICBQUHJvZmlsZSAgcHJvZiA9IHdhaXQ7CisKKworICAgICAgLyogbG9vayBpbiB0aGUgd2FpdCBsaXN0IGZvciBuZXcgYWN0aXZhdGlvbnMgKi8KKyAgICAgIHdoaWxlICggcHJvZiApCisgICAgICB7CisgICAgICAgIFBQcm9maWxlICBuZXh0ID0gcHJvZi0+bGluazsKKworCisgICAgICAgIHByb2YtPmNvdW50TCAtPSB5X2hlaWdodDsKKyAgICAgICAgaWYgKCBwcm9mLT5jb3VudEwgPT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAvKiBtb3ZlIHRoZSBwcm9maWxlIGZyb20gdGhlIHdhaXQgbGlzdCB0byB0aGUgZHJhdyBsaXN0ICovCisgICAgICAgICAgRGVsT2xkKCAmd2FpdCwgcHJvZiApOworICAgICAgICAgIEluc05ldyggJmRyYXcsIHByb2YgKTsKKyAgICAgICAgfQorICAgICAgICBwcm9mID0gbmV4dDsKKyAgICAgIH0KKworICAgICAgLyogU29ydCB0aGUgZHJhdyBsaXN0ICovCisgICAgICBTb3J0KCAmZHJhdyApOworCisgICAgICAvKiBjb21wdXRlIG5leHQgeSBleHRyZW11bSBzY2FubGluZTsgd2Ugd29uJ3QgY2hhbmdlIHRoZSAqLworICAgICAgLyogZWxlbWVudHMgb2YgdGhlIHdhaXQgYW5kIGRyYXcgbGlzdHMgdW50aWwgdGhlcmUgICAgICAgKi8KKyAgICAgIHlfY2hhbmdlID0gcmFzLnBvb2xfc2l6ZVstcmFzLm5fZXh0cmVtYS0tXTsKKyAgICAgIHlfaGVpZ2h0ID0geV9jaGFuZ2UgLSB5OworCisgICAgICBQVFJBQ0UyKCggIj4+PiB5ID0gJWQsIHlfY2hhbmdlID0gJWQsIHlfaGVpZ2h0ID0gJWQiLAorICAgICAgICAgICAgICAgIHksIHlfY2hhbmdlLCB5X2hlaWdodCApKTsKKworICAgICAgd2hpbGUgKCB5IDwgeV9jaGFuZ2UgKQorICAgICAgeworICAgICAgICBpbnQgICAgICAgd2luZG93OworICAgICAgICBQUHJvZmlsZSAgbGVmdDsKKworCisgICAgICAgIC8qIExldCdzIHRyYWNlICovCisgICAgICAgIGRyb3BvdXRzID0gMDsKKworICAgICAgICAvKiBza2lwIHRvIG5leHQgbGluZSBpZiB0aGVyZSBpcyBubyBhY3RpdmUgcHJvZmlsZSB0aGVyZSAqLworICAgICAgICBpZiAoICFkcmF3ICkgZ290byBOZXh0X0xpbmU7CisKKyAgICAgICAgbGVmdCAgID0gZHJhdzsKKyAgICAgICAgd2luZG93ID0gbGVmdC0+ZmxvdzsKKyAgICAgICAgcHJvZiAgID0gbGVmdC0+bGluazsKKworICAgICAgICBQVFJBQ0UyKCggIj4+PiAgbGluZSB5ID0gJWQiLCB5ICkpOworCisgICAgICAgIHdoaWxlICggcHJvZiApCisgICAgICAgIHsKKyAgICAgICAgICBQUHJvZmlsZSAgbmV4dCA9IHByb2YtPmxpbms7CisKKworICAgICAgICAgIHdpbmRvdyArPSBwcm9mLT5mbG93OworCisgICAgICAgICAgaWYgKCB3aW5kb3cgPT0gMCApCisgICAgICAgICAgeworICAgICAgICAgICAgeDEgPSBsZWZ0LT5YOworICAgICAgICAgICAgeDIgPSBwcm9mLT5YOworCisgICAgICAgICAgICBpZiAoIHgxID4geDIgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBUUG9zICB4cyA9IHgxOworCisKKyAgICAgICAgICAgICAgeDEgPSB4MjsKKyAgICAgICAgICAgICAgeDIgPSB4czsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCB4MiAtIHgxIDw9IHJhcy5wcmVjaXNpb24gJiYgcmFzLmRyb3BvdXRfbW9kZSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGUxID0gQ0VJTElORyggeDEgKTsKKyAgICAgICAgICAgICAgZTIgPSBGTE9PUiggeDIgKTsKKworICAgICAgICAgICAgICBpZiAoIGUxID4gZTIgfHwgZTIgPT0gZTEgKyByYXMucHJlY2lzaW9uICkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIGEgZHJvcCBvdXQgd2FzIGRldGVjdGVkICovCisKKyAgICAgICAgICAgICAgICBsZWZ0LT5YID0geDE7CisgICAgICAgICAgICAgICAgcHJvZi0+WCA9IHgyOworCisgICAgICAgICAgICAgICAgLyogbWFyayBwcm9maWxlcyBmb3IgZHJvcC1vdXQgcHJvY2Vzc2luZyAqLworICAgICAgICAgICAgICAgIGxlZnQtPmNvdW50TCA9IDE7CisgICAgICAgICAgICAgICAgcHJvZi0+Y291bnRMID0gMjsKKyAgICAgICAgICAgICAgICBkcm9wb3V0cysrOworICAgICAgICAgICAgICAgIGdvdG8gU2tpcF9Ub19OZXh0OworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFBUUkFDRTIoKCAiZHJhd2luZyBzcGFuICggeT0lZCwgeDE9JWQsIHgyPSVkICkiLAorICAgICAgICAgICAgICAgICAgICAgIHksIHgxLCB4MiApKTsKKyAgICAgICAgICAgIHJhcy5yZW5kZXIuc3BhbiggUkFTX1ZBUl8gIHksIHgxLCB4MiApOworCisgICBTa2lwX1RvX05leHQ6CisgICAgICAgICAgICBsZWZ0ID0gbmV4dDsKKyAgICAgICAgICB9CisgICAgICAgICAgcHJvZiA9IG5leHQ7CisgICAgICAgIH0KKworICAgICAgICAvKiBub3cgcGVyZm9ybSB0aGUgZHJvcG91dHMgX2FmdGVyXyB0aGUgc3BhbiBkcmF3aW5nICAgKi8KKyAgICAgICAgLyogZHJvcC1vdXRzIHByb2Nlc3NpbmcgaGFzIGJlZW4gbW92ZWQgb3V0IG9mIHRoZSBsb29wICovCisgICAgICAgIC8qIGZvciBwZXJmb3JtYW5jZSB0dW5pbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICBpZiAoIGRyb3BvdXRzID4gMCApCisgICAgICAgICAgZ290byBTY2FuX0Ryb3BPdXRzOworCisgICBOZXh0X0xpbmU6CisgICAgICAgIHJhcy5yZW5kZXIuc3RlcCggUkFTX1ZBUiApOworCisgICAgICAgIHkrKzsKKworICAgICAgICBpZiAoIHkgPCB5X2NoYW5nZSApCisgICAgICAgICAgU29ydCggJmRyYXcgKTsKKworICAgICAgICBQVFJBQ0UyKCggImxpbmUgc29ydGVkIGZvciBuZXh0IG9wZXJhdGlvbiIgKSk7CisgICAgICB9CisKKyAgICAgIC8qIE5vdyBmaW5hbGl6ZSB0aGUgcHJvZmlsZXMgdGhhdCBuZWVkcyBpdCAqLworCisgICAgICBQVFJBQ0UyKCggImZpbmFsaXppbmcgcHJvZmlsZXMuLi4iICkpOworICAgICAgeworICAgICAgICBQUHJvZmlsZSAgcHJvZiwgbmV4dDsKKworCisgICAgICAgIHByb2YgPSBkcmF3OworICAgICAgICB3aGlsZSAoIHByb2YgKQorICAgICAgICB7CisgICAgICAgICAgbmV4dCA9IHByb2YtPmxpbms7CisgICAgICAgICAgaWYgKHByb2YtPmhlaWdodCA9PSAwKQorICAgICAgICAgICAgRGVsT2xkKCAmZHJhdywgcHJvZiApOworICAgICAgICAgIHByb2YgPSBuZXh0OworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIFBUUkFDRTIoKCAicHJvZmlsZXMgZmluYWxpemVkIGZvciB0aGlzIHJ1biIgKSk7CisgICAgfQorCisgICAgLyogZm9yIGdyYXktc2NhbGluZywgZmx1c2hlcyB0aGUgYml0bWFwIHNjYW5saW5lIGNhY2hlICovCisgICAgd2hpbGUgKCB5IDw9IG1heF9ZICkKKyAgICB7CisgICAgICAgIHJhcy5yZW5kZXIuc3RlcCggUkFTX1ZBUiApOworICAgICAgICB5Kys7CisgICAgfQorCisgICAgcmV0dXJuIFNVQ0NFU1M7CisKKworU2Nhbl9Ecm9wT3V0cyA6CisgICAgUF9MZWZ0ID0gZHJhdzsKKworCisgICAgd2hpbGUgKCBkcm9wb3V0cyA+IDAgKQorICAgIHsKKyAgICAgIFRQb3MgICAgICBlMSwgICBlMjsKKyAgICAgIFBQcm9maWxlICBsZWZ0LCByaWdodDsKKworCisgICAgICB3aGlsZSAoIFBfTGVmdC0+Y291bnRMICE9IDEgKQorICAgICAgICBQX0xlZnQgPSBQX0xlZnQtPmxpbms7CisgICAgICBQX1JpZ2h0ID0gUF9MZWZ0LT5saW5rOworICAgICAgd2hpbGUgKCBQX1JpZ2h0LT5jb3VudEwgIT0gMiApCisgICAgICAgIFBfUmlnaHQgPSBQX1JpZ2h0LT5saW5rOworCisgICAgICBQX0xlZnQtPmNvdW50TCAgPSAwOworICAgICAgUF9SaWdodC0+Y291bnRMID0gMDsKKworICAgICAgLyogTm93IHBlcmZvcm0gdGhlIGRyb3BvdXQgY29udHJvbCAqLworICAgICAgeDEgPSBQX0xlZnQtPlg7CisgICAgICB4MiA9IFBfUmlnaHQtPlg7CisKKyAgICAgIGxlZnQgID0gKCByYXMuZmxpcHBlZCA/IFBfUmlnaHQgOiBQX0xlZnQgICk7CisgICAgICByaWdodCA9ICggcmFzLmZsaXBwZWQgPyBQX0xlZnQgIDogUF9SaWdodCApOworCisgICAgICBQVFJBQ0UyKCggInBlcmZvcm1pbmcgZHJvcC1vdXQgY29udHJvbCAoIHgxPSAlZCwgeDIgPSAlZCApIiwKKyAgICAgICAgICAgICAgICB4MSwgeDIgKSk7CisKKyAgICAgIGUxID0gQ0VJTElORyggeDEgKTsKKyAgICAgIGUyID0gRkxPT1IgICggeDIgKTsKKworICAgICAgaWYgKCBlMSA+IGUyICkKKyAgICAgIHsKKyAgICAgICAgaWYgKCBlMSA9PSBlMiArIHJhcy5wcmVjaXNpb24gKQorICAgICAgICB7CisgICAgICAgICAgc3dpdGNoICggcmFzLmRyb3BvdXRfbW9kZSApCisgICAgICAgICAgeworICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIGUxID0gZTI7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgIGUxID0gQ0VJTElORyggKHgxICsgeDIgKyAxKSAvIDIgKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgIC8qIERyb3Atb3V0IENvbnRyb2wgUnVsZSAjNCAqLworCisgICAgICAgICAgICAvKiBUaGUgc3BlYyBpcyBub3QgdmVyeSBjbGVhciByZWdhcmRpbmcgcnVsZSAjNC4gIEl0ICAgICAgKi8KKyAgICAgICAgICAgIC8qIHByZXNlbnRzIGEgbWV0aG9kIHRoYXQgaXMgd2F5IHRvbyBjb3N0bHkgdG8gaW1wbGVtZW50ICAqLworICAgICAgICAgICAgLyogd2hpbGUgdGhlIGdlbmVyYWwgaWRlYSBzZWVtcyB0byBnZXQgcmlkIG9mIGBzdHVicycuICAgICovCisgICAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIC8qIEhlcmUsIHdlIG9ubHkgZ2V0IHJpZCBvZiBzdHVicyByZWNvZ25pemVkIHdoZW46ICAgICAgICAqLworICAgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAvKiAgdXBwZXIgc3R1YjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgLyogICAtIFBfTGVmdCBhbmQgUF9SaWdodCBhcmUgaW4gdGhlIHNhbWUgY29udG91ciAgICAgICAgICovCisgICAgICAgICAgICAvKiAgIC0gUF9SaWdodCBpcyB0aGUgc3VjY2Vzc29yIG9mIFBfTGVmdCBpbiB0aGF0IGNvbnRvdXIgKi8KKyAgICAgICAgICAgIC8qICAgLSB5IGlzIHRoZSB0b3Agb2YgUF9MZWZ0IGFuZCBQX1JpZ2h0ICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAvKiAgbG93ZXIgc3R1YjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgLyogICAtIFBfTGVmdCBhbmQgUF9SaWdodCBhcmUgaW4gdGhlIHNhbWUgY29udG91ciAgICAgICAgICovCisgICAgICAgICAgICAvKiAgIC0gUF9MZWZ0IGlzIHRoZSBzdWNjZXNzb3Igb2YgUF9SaWdodCBpbiB0aGF0IGNvbnRvdXIgKi8KKyAgICAgICAgICAgIC8qICAgLSB5IGlzIHRoZSBib3R0b20gb2YgUF9MZWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgIC8qIHVwcGVyIHN0dWIgdGVzdCAqLworICAgICAgICAgICAgaWYgKCAoIGxlZnQtPm5leHQgPT0gcmlnaHQgJiYgbGVmdC0+aGVpZ2h0IDw9IDAgKSB8fAorCisgICAgICAgICAgICAvKiBsb3dlciBzdHViIHRlc3QgKi8KKyAgICAgICAgICAgICAgICAgKCByaWdodC0+bmV4dCA9PSBsZWZ0ICYmIGxlZnQtPnN0YXJ0ID09IHkgKSAgfHwKKworICAgICAgICAgICAgLyogY2hlY2sgdGhhdCB0aGUgcmlnaHRtb3N0IHBpeGVsIGlzbid0IHNldCAqLworICAgICAgICAgICAgICAgICByYXMucmVuZGVyLnRlc3RfcGl4ZWwoIFJBU19WQVJfICB5LCBUUlVOQyhlMSkpICAgICAgICkKKyAgICAgICAgICAgICAgZ290byBOZXh0X0Ryb3BvdXQ7CisKKyAgICAgICAgICAgIGlmICggcmFzLmRyb3BvdXRfbW9kZSA9PSAyICkKKyAgICAgICAgICAgICAgZTEgPSBlMjsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgZTEgPSBDRUlMSU5HKCAoeDEgKyB4MiArIDEpLzIgKTsKKworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZ290byBOZXh0X0Ryb3BvdXQ7ICAvKiBVbnN1cHBvcnRlZCBtb2RlICovCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICBnb3RvIE5leHRfRHJvcG91dDsKKyAgICAgIH0KKworICAgICAgUFRSQUNFMigoICIgIC0+IHNldHRpbmcgcGl4ZWwiICkpOworICAgICAgcmFzLnJlbmRlci5zZXRfcGl4ZWwoIFJBU19WQVJfIHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVTkMoIGUxICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHgyIC0geDEpID4+IHJhcy5zY2FsZV9zaGlmdCApOworICAgIE5leHRfRHJvcG91dDoKKworICAgICAgZHJvcG91dHMtLTsKKyAgICB9CisgICAgZ290byBOZXh0X0xpbmU7CisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFJlbmRlcl9TaW5nbGVfUGFzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFBlcmZvcm1zIG9uZSBzd2VlcCB3aXRoIHN1Yi1iYW5kaW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZsaXBwZWQgOjogd2hldGhlciBvciBub3Qgd2UgaGF2ZSB0byBmbGlwLiAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybnM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgc3RhdGljCisgIGludCAgUmVuZGVyX1NpbmdsZV9QYXNzKCBSQVNfQVJHXyBpbnQgIGZsaXBwZWQgKQorICB7CisgICAgVEJhbmQqICBiYW5kOworCisKKyAgICByYXMuZmxpcHBlZCA9IGZsaXBwZWQ7CisKKyAgICBiYW5kID0gcmFzLmJhbmRfc3RhY2s7CisKKyAgICBQVFJBQ0UyKCggInJhc3RlcjogZW50ZXJpbmcgcmVuZGVyX3NpbmdsZV9wYXNzIChmbGlwcGVkID0gJWQpXG4iLAorICAgICAgICAgICAgICBmbGlwcGVkICkpOworCisgICAgd2hpbGUgKCBiYW5kID49IHJhcy5iYW5kX3N0YWNrICkKKyAgICB7CisgICAgICByYXMubWF4WSA9ICgobG9uZyliYW5kWzBdLnlfbWF4IDw8IChyYXMuc2NhbGVfc2hpZnQrNikpIC0gMTsKKworICAgICAgcmFzLm1pblkgPSAobG9uZyliYW5kWzBdLnlfbWluIDw8IChyYXMuc2NhbGVfc2hpZnQrNik7CisKKyAgICAgIHJhcy5jdXJzb3IgPSByYXMucG9vbDsKKyAgICAgIHJhcy5lcnJvciAgPSAwOworCisgICAgICBQVFJBQ0UyKCggInJhc3RlcjogYmFuZCA9IFsgJWQsICVkIF1cbiIsCisgICAgICAgICAgICAgICAgYmFuZFswXS55X21pbiwKKyAgICAgICAgICAgICAgICBiYW5kWzBdLnlfbWF4ICkpOworCisgICAgICBpZiAoIENvbnZlcnRfR2x5cGgoIFJBU19WQVJfICByYXMub3V0bGluZSApICkKKyAgICAgIHsKKyAgICAgICAgaW50ICBib3R0b20sIHRvcCwgaGFsZjsKKworCisgICAgICAgIGlmICggcmFzLmVycm9yICE9IEVyclJhc3Rlcl9PdmVyZmxvdyApCisgICAgICAgICAgcmV0dXJuIEZBSUxVUkU7CisgICAgICAgIHJhcy5lcnJvciA9IEVyclJhc3Rlcl9PazsKKworICAgICAgICBQVFJBQ0UyKCggImNvbnZlcnNpb24gZmFpbHVyZSwgcGVyZm9ybWluZyBzdWItYmFuZGluZ1xuIiApKTsKKworICAgICAgICAvKiBzdWItYmFuZGluZyAqLworCisjaWZkZWYgREVCVUdfUkFTVEVSCisgICAgICAgIENsZWFyQmFuZCggUkFTX1ZBUl8gIFRSVU5DKCByYXMubWluWSApLCBUUlVOQyggcmFzLm1heFkgKSApOworI2VuZGlmCisKKyAgICAgICAgYm90dG9tID0gYmFuZFswXS55X21pbjsKKyAgICAgICAgdG9wICAgID0gYmFuZFswXS55X21heDsKKyAgICAgICAgaGFsZiAgID0gKCB0b3AgLSBib3R0b20gKSA+PiAxOworCisgICAgICAgIGlmICggYmFuZCA+PSByYXMuYmFuZF9zdGFjayArIDcgfHwgaGFsZiA9PSAwICkKKyAgICAgICAgeworICAgICAgICAgIHJhcy5iYW5kX3RvcCA9IDA7CisgICAgICAgICAgcmFzLmVycm9yICAgID0gRXJyUmFzdGVyX0ludmFsaWRfT3V0bGluZTsKKyAgICAgICAgICByZXR1cm4gcmFzLmVycm9yOworICAgICAgICB9CisKKyAgICAgICAgYmFuZFsxXS55X21pbiA9IGJvdHRvbSArIGhhbGY7CisgICAgICAgIGJhbmRbMV0ueV9tYXggPSB0b3A7CisgICAgICAgIGJhbmRbMF0ueV9tYXggPSBib3R0b20gKyBoYWxmOworCisgICAgICAgIGJhbmQgKys7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIFBUUkFDRTIoKCAiY29udmVyc2lvbiBzdWNjZWVkZWQsIHNwYW4gZHJhd2luZyBzd2VlcFxuIiApKTsKKyAgICAgICAgaWYgKCByYXMuc3RhcnRfcHJvZiApCisgICAgICAgICAgaWYgKCBEcmF3X1N3ZWVwKCBSQVNfVkFSICkgKQorICAgICAgICAgICAgcmV0dXJuIHJhcy5lcnJvcjsKKyAgICAgICAgYmFuZCAtLTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBQVFJBQ0UyKCggInJhc3RlcjogZXhpdGluZyByZW5kZXJfc2luZ2xlX3Bhc3NcbiIgKSk7CisKKyAgICByZXR1cm4gU1VDQ0VTUzsgIC8qIHN1Y2Nlc3MgKi8KKyAgfQorCisKKyAgc3RhdGljCisgIGludCAgUmFzdGVyX1JlbmRlcjEoIEZUX1Jhc3RlciAgcmFzdGVyICkKKyAgeworICAgIGludCAgZXJyb3I7CisKKworICAgIGlmICggcmFzLnRhcmdldC53aWR0aCA+IEFCUyhyYXMudGFyZ2V0LnBpdGNoKSo4ICkKKyAgICAgIHJldHVybiBFcnJSYXN0ZXJfSW52YWxpZF9NYXA7CisKKyAgICByYXMuc2NhbGVfc2hpZnQgID0gcmFzLnByZWNpc2lvbl9iaXRzIC0gNjsKKyAgICByYXMuc2NhbGVfZGVsdGEgID0gcmFzLnByZWNpc2lvbl9oYWxmOworCisgICAgLyogVmVydGljYWwgU3dlZXAgKi8KKyAgICByYXMuYmFuZF90b3AgICAgICAgICAgICA9IDA7CisgICAgcmFzLmJhbmRfc3RhY2tbMF0ueV9taW4gPSAwOworICAgIHJhcy5iYW5kX3N0YWNrWzBdLnlfbWF4ID0gcmFzLnRhcmdldC5yb3dzOworCisgICAgcmFzLnJlbmRlciAgICAgPSB2ZXJ0aWNhbF9yZW5kZXJfbW9ubzsKKyAgICByYXMuYml0X3dpZHRoICA9IHJhcy50YXJnZXQud2lkdGg7CisgICAgcmFzLmJpdF9idWZmZXIgPSAodW5zaWduZWQgY2hhciopcmFzLnRhcmdldC5idWZmZXI7CisKKyAgICBpZiAoIChlcnJvciA9IFJlbmRlcl9TaW5nbGVfUGFzcyggUkFTX1ZBUl8gMCApKSAhPSAwICkKKyAgICAgIHJldHVybiBlcnJvcjsKKworICAgIC8qIEhvcml6b250YWwgU3dlZXAgKi8KKworICAgIGlmICggcmFzLnNlY29uZF9wYXNzICYmIHJhcy5kcm9wb3V0X21vZGUgIT0gMCApCisgICAgeworICAgICAgcmFzLnJlbmRlciAgICAgICAgICAgICAgPSBob3Jpem9udGFsX3JlbmRlcl9tb25vOworICAgICAgcmFzLmJhbmRfdG9wICAgICAgICAgICAgPSAwOworICAgICAgcmFzLmJhbmRfc3RhY2tbMF0ueV9taW4gPSAwOworICAgICAgcmFzLmJhbmRfc3RhY2tbMF0ueV9tYXggPSByYXMudGFyZ2V0LndpZHRoOworCisgICAgICBpZiAoIChlcnJvciA9IFJlbmRlcl9TaW5nbGVfUGFzcyggUkFTX1ZBUl8gIDEgKSkgIT0gMCApCisgICAgICAgIHJldHVybiBlcnJvcjsKKyAgICB9CisKKyAgICByZXR1cm4gRXJyUmFzdGVyX09rOworICB9CisKKworI2lmZGVmIEZUX1JBU1RFUl9PUFRJT05fQU5USV9BTElBUworCisKKyAgc3RhdGljCisgIGludCAgUmFzdGVyX1JlbmRlcjgoIEZUX1Jhc3RlciAgcmFzdGVyICkKKyAgeworICAgIGludCAgZXJyb3I7CisKKyAgICBpZiAoIHJhcy50YXJnZXQud2lkdGggPiBBQlMocmFzLnRhcmdldC5waXRjaCkgKQorICAgICAgcmV0dXJuIEVyclJhc3Rlcl9JbnZhbGlkX01hcDsKKworICAgIC8qIFZlcnRpY2FsIFN3ZWVwICovCisgICAgcmFzLmJhbmRfdG9wICAgICAgICAgICAgPSAwOworICAgIHJhcy5iYW5kX3N0YWNrWzBdLnlfbWluID0gMDsKKyAgICByYXMuYmFuZF9zdGFja1swXS55X21heCA9IHJhcy50YXJnZXQucm93czsKKworICAgIHJhcy5zY2FsZV9zaGlmdCAgPSAocmFzLnByZWNpc2lvbl9iaXRzLTYpOworICAgIHJhcy5zY2FsZV9kZWx0YSAgPSByYXMucHJlY2lzaW9uX2hhbGY7CisgICAgcmFzLmRyb3BvdXRfbW9kZSA9IDI7CisKKyAgICByYXMucmVuZGVyICAgICA9IHZlcnRpY2FsX3JlbmRlcl9ncmF5OworICAgIHJhcy5iaXRfd2lkdGggID0gcmFzLnRhcmdldC53aWR0aDsKKyAgICByYXMuYml0X2J1ZmZlciA9ICh1bnNpZ25lZCBjaGFyKilyYXMudGFyZ2V0LmJ1ZmZlcjsKKyAgICByYXMucGl4X2J1ZmZlciA9ICh1bnNpZ25lZCBjaGFyKilyYXMudGFyZ2V0LmJ1ZmZlcjsKKworICAgIGVycm9yID0gUmVuZGVyX1NpbmdsZV9QYXNzKCBSQVNfVkFSXyAgMCApOworICAgIGlmICggZXJyb3IgKQorICAgICAgcmV0dXJuIGVycm9yOworCisjaWYgMQorICAgIC8qIEhvcml6b250YWwgU3dlZXAgKi8KKyAgICByYXMucmVuZGVyICAgICAgICAgICAgICA9IGhvcml6b250YWxfcmVuZGVyX2dyYXk7CisgICAgcmFzLmJhbmRfdG9wICAgICAgICAgICAgPSAwOworICAgIHJhcy5iaXRfd2lkdGggICAgICAgICAgID0gcmFzLnRhcmdldC5yb3dzOworICAgIHJhcy5iYW5kX3N0YWNrWzBdLnlfbWluID0gMDsKKyAgICByYXMuYmFuZF9zdGFja1swXS55X21heCA9IHJhcy50YXJnZXQud2lkdGg7CisKKyAgICByZXR1cm4gUmVuZGVyX1NpbmdsZV9QYXNzKCBSQVNfVkFSXyAgMSApOworI2Vsc2UKKyAgICByZXR1cm4gMDsKKyNlbmRpZgorICB9CisKKworI2Vsc2UgIC8qIEZUX1JBU1RFUl9PUFRJT05fQU5USV9BTElBUyAqLworCisKKyAgc3RhdGljCisgIGludCAgUmFzdGVyX1JlbmRlcjgoIEZUX1Jhc3RlciAgcmFzdGVyICkKKyAgeworICAgIHJldHVybiBFcnJSYXN0ZXJfVW5pbXBsZW1lbnRlZDsKKyAgfQorCisKKyNlbmRpZiAvKiBGVF9SQVNURVJfT1BUSU9OX0FOVElfQUxJQVMgKi8KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX1Jhc3Rlcl9SZW5kZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFJlbmRlcnMgYW4gb3V0bGluZSBpbnRvIGEgdGFyZ2V0IGJpdG1hcC4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHJhc3RlciAgOjogQSBoYW5kbGUgdG8gdGhlIHJhc3RlciBvYmplY3QgdXNlZCBkdXJpbmcgcmVuZGVyaW5nLiAgICAqLworICAvKiAgICBvdXRsaW5lIDo6IEEgcG9pbnRlciB0byB0aGUgc291cmNlIG91dGxpbmUgcmVjb3JkL29iamVjdC4gICAgICAgICAgKi8KKyAgLyogICAgYml0bWFwICA6OiBBIHBvaW50ZXIgdG8gdGhlIHRhcmdldCBiaXRtYXAgZGVzY3JpcHRvci4gICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRXJyb3IgY29kZSwgaW50ZXJwcmV0ZWQgYXMgYSBGVF9FcnJvciBieSBGcmVlVHlwZS4gIDAgbWVhbnMgICAgICAgICovCisgIC8qICAgIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgRVhQT1JUX0ZVTkMKKyAgaW50ICBGVF9SYXN0ZXJfUmVuZGVyKCBGVF9SYXN0ZXIgICAgcmFzdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZUX091dGxpbmUqICBvdXRsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0JpdG1hcCogICB0YXJnZXRfbWFwICkKKyAgeworICAgIGlmICggIXJhc3RlciB8fCAhcmFzdGVyLT5wb29sIHx8ICFyYXN0ZXItPnBvb2xfc2l6ZSApCisgICAgICByZXR1cm4gRXJyUmFzdGVyX1VuaW5pdGlhbGl6ZWRfT2JqZWN0OworCisgICAgLyogcmV0dXJuIGltbWVkaWF0ZWx5IGlmIHRoZSBvdXRsaW5lIGlzIGVtcHR5ICovCisgICAgaWYgKCBvdXRsaW5lLT5uX3BvaW50cyA9PSAwIHx8IG91dGxpbmUtPm5fY29udG91cnMgPD0gMCApCisgICAgICByZXR1cm4gRXJyUmFzdGVyX09rOworCisgICAgaWYgKCAhb3V0bGluZSB8fCAhb3V0bGluZS0+Y29udG91cnMgfHwgIW91dGxpbmUtPnBvaW50cyApCisgICAgICByZXR1cm4gRXJyUmFzdGVyX0ludmFsaWRfT3V0bGluZTsKKworICAgIGlmICggb3V0bGluZS0+bl9wb2ludHMgIT0gb3V0bGluZS0+Y29udG91cnNbb3V0bGluZS0+bl9jb250b3VycyAtIDFdICsgMSApCisgICAgICByZXR1cm4gRXJyUmFzdGVyX0ludmFsaWRfT3V0bGluZTsKKworICAgIGlmICggIXRhcmdldF9tYXAgfHwgIXRhcmdldF9tYXAtPmJ1ZmZlciApCisgICAgICByZXR1cm4gRXJyUmFzdGVyX0ludmFsaWRfTWFwOworCisgICAgcmFzLm91dGxpbmUgID0gb3V0bGluZTsKKyAgICByYXMudGFyZ2V0ICAgPSAqdGFyZ2V0X21hcDsKKworICAgIHJhcy5kcm9wb3V0X21vZGUgPSBvdXRsaW5lLT5kcm9wb3V0X21vZGU7CisgICAgcmFzLnNlY29uZF9wYXNzICA9IG91dGxpbmUtPnNlY29uZF9wYXNzOworICAgIFNFVF9IaWdoX1ByZWNpc2lvbiggb3V0bGluZS0+aGlnaF9wcmVjaXNpb24gKTsKKworICAgIHN3aXRjaCAoIHRhcmdldF9tYXAtPnBpeGVsX21vZGUgKQorICAgIHsKKyAgICBjYXNlIGZ0X3BpeGVsX21vZGVfbW9ubzoKKyAgICAgIHJldHVybiBSYXN0ZXJfUmVuZGVyMSggcmFzdGVyICk7CisgICAgY2FzZSBmdF9waXhlbF9tb2RlX2dyYXlzOgorICAgICAgcmV0dXJuIFJhc3Rlcl9SZW5kZXI4KCByYXN0ZXIgKTsKKworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gRXJyUmFzdGVyX1VuaW1wbGVtZW50ZWQ7CisgICAgfQorICB9CisKKworI2lmZGVmIEZUX1JBU1RFUl9PUFRJT05fQU5USV9BTElBUworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgUmVzZXRfUGFsZXR0ZV81ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgUmVzZXRzIGxvb2t1cCB0YWJsZSB3aGVuIHRoZSA1LWdyYXktbGV2ZWxzIHBhbGV0dGUgY2hhbmdlcy4gICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBzdGF0aWMKKyAgdm9pZCAgUmVzZXRfUGFsZXR0ZV81KCBSQVNfQVJHICkKKyAgeworCisKKyNpZmRlZiBGVF9SQVNURVJfQU5ZX0VORElBTgorCisKKyAgICBpbnQgIGksIGosIGwsIGM7CisKKworICAgIGZvciAoIGkgPSAwOyBpIDwgMjU2OyBpKysgKQorICAgIHsKKyAgICAgIGwgPSAwOworICAgICAgaiA9IGk7CisKKyAgICAgIGZvciAoIGMgPSAwOyBjIDwgNDsgYysrICkKKyAgICAgIHsKKyAgICAgICAgbCA8PD0gNDsKKworICAgICAgICBpZiAoIGogJiAweDgwICkgbCsrOworICAgICAgICBpZiAoIGogJiAweDQwICkgbCsrOworCisgICAgICAgIGogPSAoIGogPDwgMiApICYgMHhGRjsKKyAgICAgIH0KKworICAgICAgcmFzLmNvdW50X3RhYmxlW2ldID0gbDsKKyAgICB9CisKKworI2Vsc2UgLyogRlRfUkFTVEVSX0FOWV9FTkRJQU4gKi8KKworCisgICAgaW50ICBpOworCisKKyAgICBmb3IgKCBpID0gMDsgaSA8IDI1NjsgaSsrICkKKyAgICB7CisgICAgICBpbnQgIGNudDEsIGNudDI7CisKKyAgICAgIGNudDEgPSAoKGkgJiAxMjgpID4+IDcpICsKKyAgICAgICAgICAgICAoKGkgJiA2NCkgID4+IDYpICsKKyAgICAgICAgICAgICAoKGkgJiA4KSAgID4+IDMpICsKKyAgICAgICAgICAgICAoKGkgJiA0KSAgID4+IDIpOworCisgICAgICBjbnQyID0gKChpICYgMzIpID4+IDUpICsKKyAgICAgICAgICAgICAoKGkgJiAxNikgPj4gNCkgKworICAgICAgICAgICAgICgoaSAmIDIpICA+PiAxKSArCisgICAgICAgICAgICAgIChpICYgMSk7CisKKyAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiBOb3RlIHRoYXQgd2hlbiB0aGUgZW5kaWFuZXNzIGlzbid0IHNwZWNpZmllZCB0aHJvdWdoIG9uZSBvZiB0aGUgKi8KKyAgICAvKiBjb25maWd1cmF0aW9uLCB3ZSB1c2UgdGhlIGJpZy1lbmRpYW4gc3RvcmFnZSBpbiBgY291bnRfdGFibGUnICAgKi8KKyAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworI2lmIGRlZmluZWQoIEZUX1JBU1RFUl9MSVRUTEVfRU5ESUFOICkKKyAgICAgIHJhcy5jb3VudF90YWJsZVtpXSA9IChyYXMuZ3JheXNbY250Ml0gPDwgOCkgfCByYXMuZ3JheXNbY250MV07CisjZWxzZQorICAgICAgcmFzLmNvdW50X3RhYmxlW2ldID0gKHJhcy5ncmF5c1tjbnQxXSA8PCA4KSB8IHJhcy5ncmF5c1tjbnQyXTsKKyNlbmRpZgorICAgIH0KKworCisjZW5kaWYgLyogRlRfUkFTVEVSX0FOWV9FTkRJQU4gKi8KKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgUmVzZXRfUGFsZXR0ZV8xNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgUmVzZXRzIGxvb2t1cCB0YWJsZSB3aGVuIDE3LWdyYXktbGV2ZWxzIHBhbGV0dGUgY2hhbmdlcy4gICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2lmZGVmIEZUX1JBU1RFUl9BTlRJX0FMSUFTXzE3CisKKworICBzdGF0aWMKKyAgdm9pZCAgUmVzZXRfUGFsZXR0ZV8xNyggUkFTX0FSRyApCisgIHsKKyAgICBpbnQgIGk7CisKKworICAgIGZvciAoIGkgPSAwOyBpIDwgMjU2OyBpKysgKQorICAgICAgcmFzLmNvdW50X3RhYmxlW2ldID0gKChpICYgMTI4KSA+PiA3KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGkgJiAgNjQpID4+IDYpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICgoaSAmICAgOCkgPj4gMykgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgKChpICYgICA0KSA+PiAyKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGkgJiAgMzIpID4+IDUpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICgoaSAmICAxNikgPj4gNCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgKChpICYgICAyKSA+PiAxKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGkgJiAgIDEpOworfQorCisKKyNlbmRpZiAvKiBGVF9SQVNURVJfQU5USV9BTElBU18xNyAqLworCisKKyNlbmRpZiAvKiBUVF9SQVNURVJfT1BUSU9OX0FOVElfQUxJQVMgKi8KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX1Jhc3Rlcl9PYmpTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgc2l6ZSBvZiBhIHJhc3RlciBvYmplY3QgaW4gYnl0ZXMuICAgICAgICAqLworICAvKiAgICBDbGllbnQgYXBwbGljYXRpb25zIGFyZSB0aHVzIGFibGUgdG8gYWxsb2NhdGUgb2JqZWN0cyBpbiB0aGVpciBvd24gKi8KKyAgLyogICAgaGVhcC9tZW1vcnkgc3BhY2UsIHdpdGhvdXQgcmV2ZWFsaW5nIHRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmVzIG9mICAgICovCisgIC8qICAgIHRoZSBzY2FuLWxpbmUgY29udmVydGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoZSBzaXplIGluIGJ5dGVzIG9mIGEgc2luZ2xlIHJhc3RlciBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgRVhQT1JUX0ZVTkMKKyAgbG9uZyAgRlRfUmFzdGVyX09ialNpemUoIHZvaWQgKQorICB7CisgICAgcmV0dXJuIChsb25nKXNpemVvZiggc3RydWN0IEZUX1Jhc3RlclJlY18gKTsKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfUmFzdGVyX0luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgSW5pdGlhbGl6ZXMgYSBmcmVzaCByYXN0ZXIgb2JqZWN0IHdoaWNoIHNob3VsZCBoYXZlIGJlZW4gYWxsb2NhdGVkICovCisgIC8qICAgIGJ5IGNsaWVudCBhcHBsaWNhdGlvbnMuICBUaGlzIGZ1bmN0aW9uIGlzIGFsc28gdXNlZCB0byBzZXQgdGhlICAgICAqLworICAvKiAgICBvYmplY3QncyByZW5kZXIgcG9vbC4gIEl0IGNhbiBiZSB1c2VkIHJlcGVhdGVkbHkgb24gYSBzaW5nbGUgICAgICAgKi8KKyAgLyogICAgb2JqZWN0IGlmIG9uZSB3YW50cyB0byBjaGFuZ2UgdGhlIHBvb2wncyBhZGRyZXNzIG9yIHNpemUuICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBOb3RlIHRoYXQgdGhlIHJlbmRlciBwb29sIGhhcyBubyBzdGF0ZSBhbmQgaXMgb25seSB1c2VkIGR1cmluZyBhICAgKi8KKyAgLyogICAgY2FsbCB0byBGVF9SYXN0ZXJfUmVuZGVyKCkuICBJdCBpcyB0aHVzIHRoZW9yaWNhbGx5IHBvc3NpYmxlIHRvICAgICovCisgIC8qICAgIHNoYXJlIGl0IGJldHdlZW4gc2V2ZXJhbCBub24tY29uY3VycmVudCBjb21wb25lbnRzIG9mIHlvdXIgICAgICAgICAqLworICAvKiAgICBhcHBsaWNhdGlvbnMgd2hlbiBtZW1vcnkgaXMgYSBzY2FyY2UgcmVzb3VyY2UuICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBwb29sX3NpemUgOjogVGhlIHJlbmRlciBwb29sJ3Mgc2l6ZSBpbiBieXRlcy4gIFRoaXMgbXVzdCBiZSBhdCAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgIGxlYXN0IDQga0J5dGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgcmFzdGVyICAgIDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgcmFzdGVyIG9iamVjdC4gICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBwb29sX2Jhc2UgOjogVGhlIHJlbmRlciBwb29sJ3MgYmFzZSBhZGRyZXNzIGluIG1lbW9yeS4gICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBbiBlcnJvciBjb25kaXRpb24sIHVzZWQgYXMgYSBGVF9FcnJvciBpbiB0aGUgRnJlZVR5cGUgbGlicmFyeS4gICAgKi8KKyAgLyogICAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBFWFBPUlRfRlVOQworICBpbnQgIEZUX1Jhc3Rlcl9Jbml0KCBGVF9SYXN0ZXIgICAgcmFzdGVyLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgcG9vbF9iYXNlLAorICAgICAgICAgICAgICAgICAgICAgICBsb25nICAgICAgICAgcG9vbF9zaXplICkKKyAgeworLyogICAgc3RhdGljIGNvbnN0IGNoYXIgIGRlZmF1bHRfcGFsZXR0ZVs1XSA9IHsgMCwgMSwgMiwgMywgNCB9OyAqLworCisgICAgLyogY2hlY2sgdGhlIG9iamVjdCBhZGRyZXNzICovCisgICAgaWYgKCAhcmFzdGVyICkKKyAgICAgIHJldHVybiBFcnJSYXN0ZXJfVW5pbml0aWFsaXplZF9PYmplY3Q7CisKKyAgICAvKiBjaGVjayB0aGUgcmVuZGVyIHBvb2wgLSB3ZSB3b24ndCBnbyB1bmRlciA0IEtiICovCisgICAgaWYgKCAhcG9vbF9iYXNlIHx8IHBvb2xfc2l6ZSA8IDQwOTYgKQorICAgICAgcmV0dXJuIEVyclJhc3Rlcl9JbnZhbGlkX1Bvb2w7CisKKyAgICAvKiBzYXZlIHRoZSBwb29sICovCisgICAgcmFzdGVyLT5wb29sICAgICAgPSAoUFBvcylwb29sX2Jhc2U7CisgICAgcmFzdGVyLT5wb29sX3NpemUgPSByYXN0ZXItPnBvb2wgKyBwb29sX3NpemUgLyBzaXplb2YgKCBUUG9zICk7CisKKyNpZmRlZiBGVF9SQVNURVJfT1BUSU9OX0FOVElfQUxJQVMKKyAgICByYXN0ZXItPmdyYXlfd2lkdGggPSBBTlRJX0FMSUFTX0JVRkZFUl9TSVpFLzI7CisgICAgLyogY2xlYXIgYW50aS1hbGlhcyBpbnRlcm1lZGlhdGUgbGluZXMgKi8KKyAgICB7CisgICAgICBjaGFyKiAgcCAgICAgPSByYXN0ZXItPmdyYXlfbGluZXM7CisgICAgICBjaGFyKiAgbGltaXQgPSBwICsgQU5USV9BTElBU19CVUZGRVJfU0laRTsgCisKKyAgICAgIGRvICpwKysgPSAwOyB3aGlsZSAoIHAgPCBsaW1pdCApOworICAgIH0KKyNlbmRpZgorCisjaWYgMAorICAgIC8qIHNldCB0aGUgZGVmYXVsdCBwYWxldHRlOiA1IGxldmVscyA9IDAsIDEsIDIsIDMsIGFuZCA0ICovCisgICAgRlRfUmFzdGVyX1NldFBhbGV0dGUoIHJhc3RlciwgNSwgZGVmYXVsdF9wYWxldHRlICk7CisjZW5kaWYKKworICAgIHJldHVybiBFcnJSYXN0ZXJfT2s7CisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX1Jhc3Rlcl9TZXRQYWxldHRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFNldHMgdGhlIHBpeG1hcCByZW5kZXJpbmcgcGFsZXR0ZS4gIEFudGktYWxpYXNpbmcgbW9kZXMgYXJlICAgICAgICAqLworICAvKiAgICBpbXBsZW1lbnRlZC9wb3NzaWJsZSwgdGhleSBkaWZmZXIgZnJvbSB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gICAgKi8KKyAgLyogICAgdGhlIHBhbGV0dGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgY291bnQgICA6OiBUaGUgbnVtYmVyIG9mIHBhbGV0dGUgZW50cmllcy4gIFZhbGlkIHZhbHVlcyBhcmUgMiwgNSwgICovCisgIC8qICAgICAgICAgICAgICAgYW5kIDE3LCB3aGljaCBhcmUgdGhlIG51bWJlciBvZiBpbnRlcm1lZGlhdGUgZ3JheSAgICAgICAqLworICAvKiAgICAgICAgICAgICAgIGxldmVscyBzdXBwb3J0ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHBhbGV0dGUgOjogQW4gYXJyYXkgb2YgYGNvdW50JyBjaGFycyBnaXZpbmcgdGhlIDgtYml0IHBhbGV0dGUgb2YgICAqLworICAvKiAgICAgICAgICAgICAgIGludGVybWVkaWF0ZSBgZ3JheScgbGV2ZWxzIGZvciBhbnRpLWFsaWFzZWQgcmVuZGVyaW5nLiAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgSW4gYWxsIG1vZGVzLCBwYWxldHRlWzBdIGNvcnJlc3BvbmRzIHRvIHRoZSBiYWNrZ3JvdW5kLCAqLworICAvKiAgICAgICAgICAgICAgIHdoaWxlIHBhbGV0dGVbY291bnQtMV0gdG8gdGhlIGZvcmVncm91bmQuICBIZW5jZSwgYSAgICAgKi8KKyAgLyogICAgICAgICAgICAgICBjb3VudCBvZiAyIGNvcnJlc3BvbmRzIHRvIG5vIGFudGktYWxpYXNpbmc7IGEgY291bnQgb2YgICovCisgIC8qICAgICAgICAgICAgICAgNSB1c2VzIDMgaW50ZXJtZWRpYXRlIGxldmVscyBiZXR3ZWVuIHRoZSBiYWNrZ3JvdW5kIGFuZCAqLworICAvKiAgICAgICAgICAgICAgIGZvcmVncm91bmQsIHdoaWxlIGEgY291bnQgb2YgMTcgdXNlcyAxNSBvZiB0aGVtLiAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBbiBlcnJvciBjb2RlLCB1c2VkIGFzIGEgRlRfRXJyb3IgYnkgdGhlIEZyZWVUeXBlIGxpYnJhcnkuICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBCeSBkZWZhdWx0LCBhIG5ldyBvYmplY3QgdXNlcyBtb2RlIDUsIHdpdGggYSBwYWxldHRlIG9mIDAsIDEsIDIsICAgKi8KKyAgLyogICAgMywgYW5kIDQuICBZb3UgZG9uJ3QgbmVlZCB0byBzZXQgdGhlIHBhbGV0dGUgaWYgeW91IGRvbid0IG5lZWQgdG8gICovCisgIC8qICAgIHJlbmRlciBwaXhtYXBzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgRVhQT1JUX0ZVTkMKKyAgaW50ICAgRlRfUmFzdGVyX1NldFBhbGV0dGUoIEZUX1Jhc3RlciAgICByYXN0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgcGFsZXR0ZSApCisgIHsKKyAgICBzd2l0Y2ggKCBjb3VudCApCisgICAgeworI2lmZGVmIEZUX1JBU1RFUl9PUFRJT05fQU5USV9BTElBUworCisKKyAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAvKiBUaGUgY2FzZSBvZiAxNyBncmF5IGxldmVscyAqLworICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgICAgY2FzZSAxNzoKKyNpZmRlZiBGVF9SQVNURVJfQU5USV9BTElBU18xNworICAgICAgeworICAgICAgICBpbnQgIG47CisKKworICAgICAgICByYXN0ZXItPmdyYXlzX2NvdW50ID0gY291bnQ7CisgICAgICAgIGZvciAoIG4gPSAwOyBuIDwgY291bnQ7IG4rKyApCisgICAgICAgICAgcmFzdGVyLT5ncmF5c1tuXSA9ICh1bnNpZ25lZCBjaGFyKXBhbGV0dGVbbl07CisgICAgICAgIFJlc2V0X1BhbGV0dGVfMTcoIFJBU19WQVIgKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisjZWxzZQorICAgICAgcmV0dXJuIEVyclJhc3Rlcl9VbmltcGxlbWVudGVkOworI2VuZGlmCisKKyAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgIC8qIFRoZSBjYXNlIG9mIDUgZ3JheSBsZXZlbHMgKi8KKyAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgICAgY2FzZSA1OgorI2lmZGVmIEZUX1JBU1RFUl9BTlRJX0FMSUFTXzUKKyAgICAgIHsKKyAgICAgICAgaW50ICBuOworCisKKyAgICAgICAgcmFzdGVyLT5ncmF5c19jb3VudCA9IGNvdW50OworICAgICAgICBmb3IgKCBuID0gMDsgbiA8IGNvdW50OyBuKysgKQorICAgICAgICAgIHJhc3Rlci0+Z3JheXNbbl0gPSAodW5zaWduZWQgY2hhcilwYWxldHRlW25dOworICAgICAgICBSZXNldF9QYWxldHRlXzUoIFJBU19WQVIgKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisjZWxzZQorICAgICAgcmV0dXJuIEVyclJhc3Rlcl9VbmltcGxlbWVudGVkOworI2VuZGlmCisKKworI2VuZGlmIC8qIEZUX1JBU1RFUl9PUFRJT05fQU5USV9BTElBUyAqLworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIEVyclJhc3Rlcl9CYWRfUGFsZXR0ZV9Db3VudDsKKyAgICB9CisKKyAgICByZXR1cm4gRXJyUmFzdGVyX09rOworICB9CisKKyAgRlRfUmFzdGVyX0ludGVyZmFjZSAgZnRfZGVmYXVsdF9yYXN0ZXIgPQorICB7CisgICAgc2l6ZW9mKCBzdHJ1Y3QgRlRfUmFzdGVyUmVjXyApLAorICAgIGZ0X2dseXBoX2Zvcm1hdF9vdXRsaW5lLAorICAgIAorICAgIChGVF9SYXN0ZXJfSW5pdF9Qcm9jKSAgICAgRlRfUmFzdGVyX0luaXQsCisgICAgKEZUX1Jhc3Rlcl9TZXRfTW9kZV9Qcm9jKSAwLAorICAgIChGVF9SYXN0ZXJfUmVuZGVyX1Byb2MpICAgRlRfUmFzdGVyX1JlbmRlciAgICAKKyAgfTsKKworCisvKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9iYXNlL2Z0c3RyZWFtLmMgYi9zcmMvYmFzZS9mdHN0cmVhbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzNzNjNjYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvYmFzZS9mdHN0cmVhbS5jCkBAIC0wLDAgKzEsNDM2IEBACisjaW5jbHVkZSA8ZnRzdHJlYW0uaD4KKyNpbmNsdWRlIDxmdGRlYnVnLmg+CisKKyN1bmRlZiAgRlRfQ09NUE9ORU5UCisjZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2Vfc3RyZWFtCisKKworICBCQVNFX0ZVTkMKKyAgdm9pZCAgRlRfTmV3X01lbW9yeV9TdHJlYW0oIEZUX0xpYnJhcnkgICAgIGxpYnJhcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgICBiYXNlLAorICAgICAJCQkgICAgICB1bnNpZ25lZCBsb25nICBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICAgICAgc3RyZWFtICkKKyAgeworICAgIHN0cmVhbS0+bWVtb3J5ID0gbGlicmFyeS0+bWVtb3J5OworICAgIHN0cmVhbS0+YmFzZSAgID0gKGNoYXIqKWJhc2U7CisgICAgc3RyZWFtLT5zaXplICAgPSBzaXplOworICAgIHN0cmVhbS0+cG9zICAgID0gMDsKKyAgICBzdHJlYW0tPmN1cnNvciA9IDA7CisgICAgc3RyZWFtLT5yZWFkICAgPSAwOworICAgIHN0cmVhbS0+Y2xvc2UgID0gMDsKKyAgfQorCisKKyAgQkFTRV9GVU5DCisgIEZUX0Vycm9yICBGVF9TZWVrX1N0cmVhbSggRlRfU3RyZWFtICBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICBwb3MgKQorICB7CisgICAgRlRfRXJyb3IgIGVycm9yOworICAgIAorICAgIHN0cmVhbS0+cG9zID0gcG9zOworICAgIAorICAgIGlmIChzdHJlYW0tPnJlYWQpCisgICAgeworICAgICAgaWYgKHN0cmVhbS0+cmVhZCggc3RyZWFtLCBwb3MsIDAsIDAgKSkKKyAgICAgIHsKKyAgICAgICAgZXJyb3IgPSBGVF9FcnJfSW52YWxpZF9TdHJlYW1fT3BlcmF0aW9uOworCisgICAgICAgIEZUX0VSUk9SKCggIkZUX1NlZWtfU3RyZWFtOiIgKSk7CisgICAgICAgIEZUX0VSUk9SKCggIiBpbnZhbGlkIGkvbywgcG9zID0gMHglbHgsIHNpemUgPSAweCVseFxuIiwKKyAgICAgICAgICAgICAgICAgICBwb3MsIHN0cmVhbS0+c2l6ZSApKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgZXJyb3IgPSBGVF9FcnJfT2s7CisgICAgfQorICAgIC8qIG5vdGUgdGhhdCBzZWVraW5nIHRvIHRoZSBmaXJzdCBwb3NpdGlvbiBhZnRlciB0aGUgZmlsZSBpcyB2YWxpZCAqLworICAgIGVsc2UgaWYgKHBvcyA+IHN0cmVhbS0+c2l6ZSkKKyAgICB7CisgICAgICBlcnJvciA9IEZUX0Vycl9JbnZhbGlkX1N0cmVhbV9PcGVyYXRpb247CisKKyAgICAgIEZUX0VSUk9SKCggIkZUX1NlZWtfU3RyZWFtOiIgKSk7CisgICAgICBGVF9FUlJPUigoICIgaW52YWxpZCBpL28sIHBvcyA9IDB4JWx4LCBzaXplID0gMHglbHhcbiIsCisgICAgICAgICAgICAgICAgIHBvcywgc3RyZWFtLT5zaXplICkpOworICAgIH0KKyAKKyAgICBlbHNlCisgICAgICBlcnJvciA9IEZUX0Vycl9PazsKKyAKKyAgICByZXR1cm4gZXJyb3I7IAorICB9CisgIAorICAKKyAgQkFTRV9GVU5DCisgIEZUX0Vycm9yICBGVF9Ta2lwX1N0cmVhbSggRlRfU3RyZWFtICBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICBkaXN0YW5jZSApCisgIHsKKyAgICByZXR1cm4gRlRfU2Vla19TdHJlYW0oIHN0cmVhbSwgKEZUX1VMb25nKShzdHJlYW0tPnBvcyArIGRpc3RhbmNlKSApOworICB9CisgIAorICAKKyAgCisgIEJBU0VfRlVOQworICBGVF9Mb25nICAgRlRfU3RyZWFtX1BvcyggRlRfU3RyZWFtICBzdHJlYW0gKQorICB7CisgICAgcmV0dXJuIHN0cmVhbS0+cG9zOworICB9CisgIAorICAKKyAgQkFTRV9GVU5DCisgIEZUX0Vycm9yICBGVF9SZWFkX1N0cmVhbSggRlRfU3RyZWFtICBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICBjb3VudCApCisgIHsKKyAgICByZXR1cm4gRlRfUmVhZF9TdHJlYW1fQXQoIHN0cmVhbSwgc3RyZWFtLT5wb3MsIGJ1ZmZlciwgY291bnQgKTsKKyAgfQorICAKKyAgCisgIEJBU0VfRlVOQworICBGVF9FcnJvciAgRlRfUmVhZF9TdHJlYW1fQXQoIEZUX1N0cmVhbSAgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgY291bnQgKQorICB7CisgICAgRlRfRXJyb3IgIGVycm9yID0gRlRfRXJyX09rOworICAgIEZUX1VMb25nICByZWFkX2J5dGVzOworICAgIAorICAgIGlmIChwb3MgPj0gc3RyZWFtLT5zaXplKQorICAgIHsKKyAgICAgIEZUX0VSUk9SKCggIkZUX1JlYWRfU3RyZWFtX0F0OiIgKSk7CisgICAgICBGVF9FUlJPUigoICIgaW52YWxpZCBpL28sIHBvcyA9IDB4JWx4LCBzaXplID0gMHglbHhcbiIsCisgICAgICAgICAgICAgICAgIHBvcywgc3RyZWFtLT5zaXplICkpOworIAorICAgICAgcmV0dXJuIEZUX0Vycl9JbnZhbGlkX1N0cmVhbV9PcGVyYXRpb247CisgICAgfQorIAorICAgIGlmIChzdHJlYW0tPnJlYWQpCisgICAgICByZWFkX2J5dGVzID0gc3RyZWFtLT5yZWFkKCBzdHJlYW0sIHBvcywgYnVmZmVyLCBjb3VudCApOworICAgIGVsc2UKKyAgICB7CisgICAgICByZWFkX2J5dGVzID0gc3RyZWFtLT5zaXplIC0gcG9zOworICAgICAgaWYgKHJlYWRfYnl0ZXMgPiBjb3VudCkKKyAgICAgICAgcmVhZF9ieXRlcyA9IGNvdW50OworICAgICAgCisgICAgICBNRU1fQ29weSggYnVmZmVyLCBzdHJlYW0tPmJhc2UgKyBwb3MsIHJlYWRfYnl0ZXMgKTsKKyAgICB9CisgICAgCisgICAgc3RyZWFtLT5wb3MgPSBwb3MgKyByZWFkX2J5dGVzOworCisgICAgaWYgKHJlYWRfYnl0ZXMgPCBjb3VudCkKKyAgICB7CisgICAgICBGVF9FUlJPUigoICJGVF9SZWFkX1N0cmVhbV9BdDoiICkpOworICAgICAgRlRfRVJST1IoKCAiIGludmFsaWQgcmVhZCwgZXhwZWN0ZWQgJWx1IGJ5dGVzLCBnb3QgJWx1IiwKKyAgICAgICAgICAgICAgICAgY291bnQsIHJlYWRfYnl0ZXMgKSk7CisgICAgICBlcnJvciA9IEZUX0Vycl9JbnZhbGlkX1N0cmVhbV9PcGVyYXRpb247CisgICAgfQorCisgICAgcmV0dXJuIGVycm9yOworICB9CisgIAorICAKKyAgCisgIEJBU0VfRlVOQworICBGVF9FcnJvciAgRlRfQWNjZXNzX0ZyYW1lKCBGVF9TdHJlYW0gIHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICBjb3VudCApCisgIHsKKyAgICBGVF9FcnJvciAgZXJyb3IgPSBGVF9FcnJfT2s7CisgICAgRlRfVUxvbmcgIHJlYWRfYnl0ZXM7CisKKyAgICAvKiBjaGVjayBmb3IgbmVzdGVkIGZyYW1lIGFjY2VzcyAqLworICAgIEZUX0Fzc2VydCggc3RyZWFtICYmIHN0cmVhbS0+Y3Vyc29yID09IDAgKTsgICAgCisgICAgIAorICAgIGlmIChzdHJlYW0tPnJlYWQpCisgICAgeworICAgICAgLyogYWxsb2NhdGUgdGhlIGZyYW1lIGluIG1lbW9yeSAqLworICAgICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBzdHJlYW0tPm1lbW9yeTsKKyAgICAgICAgCisgICAgICBpZiAoIEFMTE9DKCBzdHJlYW0tPmJhc2UsIGNvdW50ICkgKQorICAgICAgICBnb3RvIEV4aXQ7CisgICAgICAgICAgCisgICAgICAvKiByZWFkIGl0ICovCisgICAgICByZWFkX2J5dGVzID0gc3RyZWFtLT5yZWFkKCBzdHJlYW0sIHN0cmVhbS0+cG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLT5iYXNlLCBjb3VudCApOyAKKyAgICAgIGlmIChyZWFkX2J5dGVzIDwgY291bnQpCisgICAgICB7CisgICAgICAgIEZUX0VSUk9SKCggIkZUX0FjY2Vzc19GcmFtZToiICkpOworICAgICAgICBGVF9FUlJPUigoICIgaW52YWxpZCByZWFkLCBleHBlY3RlZCAlbHUgYnl0ZXMsIGdvdCAlbHUiLAorICAgICAgICAgICAgICAgICAgIGNvdW50LCByZWFkX2J5dGVzICkpOworICAgICAgICAgICAgICAgICAgIAorICAgICAgICBGUkVFKCBzdHJlYW0tPmJhc2UgKTsKKyAgICAgICAgZXJyb3IgPSBGVF9FcnJfSW52YWxpZF9TdHJlYW1fT3BlcmF0aW9uOworICAgICAgfQorICAgICAgc3RyZWFtLT5jdXJzb3IgPSBzdHJlYW0tPmJhc2U7CisgICAgICBzdHJlYW0tPmxpbWl0ICA9IHN0cmVhbS0+Y3Vyc29yICsgY291bnQ7CisgICAgICBzdHJlYW0tPnBvcyAgICs9IHJlYWRfYnl0ZXM7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBjaGVjayBjdXJyZW50IGFuZCBuZXcgcG9zaXRpb24gKi8KKyAgICAgIGlmIChzdHJlYW0tPnBvcyA+PSBzdHJlYW0tPnNpemUgfHwgc3RyZWFtLT5wb3MgKyBjb3VudCA+IHN0cmVhbS0+c2l6ZSkKKyAgICAgIHsKKyAgICAgICAgRlRfRVJST1IoKCAiRlRfQWNjZXNzX0ZyYW1lOiIgKSk7CisgICAgICAgIEZUX0VSUk9SKCggIiBpbnZhbGlkIGkvbywgcG9zID0gMHglbHgsIGNvdW50ID0gJWx1LCBzaXplID0gMHglbHgiLAorICAgICAgICAgICAgICAgICAgIHN0cmVhbS0+cG9zLCBjb3VudCwgc3RyZWFtLT5zaXplICkpOworICAgICAgICAgICAgICAgICAgIAorICAgICAgICBlcnJvciA9IEZUX0Vycl9JbnZhbGlkX1N0cmVhbV9PcGVyYXRpb247CisgICAgICAgIGdvdG8gRXhpdDsKKyAgICAgIH0KKyAgICAgIAorICAgICAgLyogc2V0IGN1cnNvciAqLworICAgICAgc3RyZWFtLT5jdXJzb3IgPSBzdHJlYW0tPmJhc2UgKyBzdHJlYW0tPnBvczsgICAgICAKKyAgICAgIHN0cmVhbS0+bGltaXQgID0gc3RyZWFtLT5jdXJzb3IgKyBjb3VudDsKKyAgICAgIHN0cmVhbS0+cG9zICAgKz0gY291bnQ7CisgICAgfQorICBFeGl0OgorICAgIHJldHVybiBlcnJvcjsKKyAgfQorICAKKyAgCisgIEJBU0VfRlVOQworICB2b2lkICBGVF9Gb3JnZXRfRnJhbWUoIEZUX1N0cmVhbSAgc3RyZWFtICkKKyAgeworICAgIEZUX0Fzc2VydCggc3RyZWFtICYmIHN0cmVhbS0+Y3Vyc29yICE9IDAgKTsKKyAgICAKKyAgICBpZiAoc3RyZWFtLT5yZWFkKQorICAgIHsKKyAgICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gc3RyZWFtLT5tZW1vcnk7CisgICAgICAKKyAgICAgIEZSRUUoIHN0cmVhbS0+YmFzZSApOworICAgIH0KKyAgICBzdHJlYW0tPmN1cnNvciA9IDA7CisgICAgc3RyZWFtLT5saW1pdCAgPSAwOworICB9CisKKworICBCQVNFX0ZVTkMKKyAgRlRfQ2hhciAgRlRfR2V0X0NoYXIoIEZUX1N0cmVhbSAgc3RyZWFtICkKKyAgeworICAgIEZUX0NoYXIgIHJlc3VsdDsKKyAgICAKKyAgICBGVF9Bc3NlcnQoIHN0cmVhbSAmJiBzdHJlYW0tPmN1cnNvciAmJiBzdHJlYW0tPmN1cnNvciApOworCisgICAgcmVzdWx0ID0gMDsKKyAgICBpZiAoc3RyZWFtLT5jdXJzb3IgPCBzdHJlYW0tPmxpbWl0KSAgICAKKyAgICAgIHJlc3VsdCA9ICpzdHJlYW0tPmN1cnNvcisrOworICAgICAgCisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorICAKKyAgCisgIEJBU0VfRlVOQworICBGVF9TaG9ydCAgRlRfR2V0X1Nob3J0KCBGVF9TdHJlYW0gIHN0cmVhbSApCisgIHsKKyAgICBjaGFyKiAgICAgcDsKKyAgICBGVF9TaG9ydCAgcmVzdWx0OworICAgIAorICAgIEZUX0Fzc2VydCggc3RyZWFtICYmIHN0cmVhbS0+Y3Vyc29yICk7CisgICAgCisgICAgcmVzdWx0ICAgICAgICAgPSAwOworICAgIHAgICAgICAgICAgICAgID0gc3RyZWFtLT5jdXJzb3I7CisgICAgaWYgKHArMSA8IHN0cmVhbS0+bGltaXQpCisgICAgICByZXN1bHQgICAgICAgPSBORVhUX1Nob3J0KHApOworICAgIHN0cmVhbS0+Y3Vyc29yID0gcDsKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisgIAorCisgIEJBU0VfRlVOQworICBGVF9Mb25nICBGVF9HZXRfT2Zmc2V0KCBGVF9TdHJlYW0gIHN0cmVhbSApCisgIHsKKyAgICBjaGFyKiAgICBwOworICAgIEZUX0xvbmcgIHJlc3VsdDsKKyAgICAKKyAgICBGVF9Bc3NlcnQoIHN0cmVhbSAmJiBzdHJlYW0tPmN1cnNvciApOworICAgIAorICAgIHJlc3VsdCAgICAgICAgID0gMDsKKyAgICBwICAgICAgICAgICAgICA9IHN0cmVhbS0+Y3Vyc29yOworICAgIGlmIChwKzIgPCBzdHJlYW0tPmxpbWl0KQorICAgICAgcmVzdWx0ICAgICAgID0gTkVYVF9PZmZzZXQocCk7CisgICAgc3RyZWFtLT5jdXJzb3IgPSBwOworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKyAgCisKKyAgQkFTRV9GVU5DCisgIEZUX0xvbmcgIEZUX0dldF9Mb25nKCBGVF9TdHJlYW0gIHN0cmVhbSApCisgIHsKKyAgICBjaGFyKiAgICBwOworICAgIEZUX0xvbmcgIHJlc3VsdDsKKyAgICAKKyAgICBGVF9Bc3NlcnQoIHN0cmVhbSAmJiBzdHJlYW0tPmN1cnNvciApOworCisgICAgcmVzdWx0ICAgICAgICAgPSAwOyAgICAKKyAgICBwICAgICAgICAgICAgICA9IHN0cmVhbS0+Y3Vyc29yOworICAgIGlmIChwKzMgPCBzdHJlYW0tPmxpbWl0KQorICAgICAgcmVzdWx0ICAgICAgID0gTkVYVF9Mb25nKHApOworICAgIHN0cmVhbS0+Y3Vyc29yID0gcDsKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisgIAorIAorICBCQVNFX0ZVTkMKKyAgRlRfQ2hhciAgRlRfUmVhZF9DaGFyKCBGVF9TdHJlYW0gIHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGVF9FcnJvciogIGVycm9yICkKKyAgeworICAgIGNoYXIgIHJlc3VsdCA9IDA7CisgICAgCisgICAgRlRfQXNzZXJ0KCBzdHJlYW0gKTsKKyAgICAKKyAgICAqZXJyb3IgPSBGVF9FcnJfT2s7CisgICAgCisgICAgaWYgKHN0cmVhbS0+cmVhZCkKKyAgICB7CisgICAgICBpZiAoIHN0cmVhbS0+cmVhZCggc3RyZWFtLCBzdHJlYW0tPnBvcywgJnJlc3VsdCwgMUwgKSAhPSAxTCApCisgICAgICAgIGdvdG8gRmFpbDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGlmIChzdHJlYW0tPnBvcyA8IHN0cmVhbS0+c2l6ZSkKKyAgICAgICAgcmVzdWx0ID0gc3RyZWFtLT5iYXNlW3N0cmVhbS0+cG9zKytdOworICAgICAgZWxzZQorICAgICAgICBnb3RvIEZhaWw7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CisgICAgCisgIEZhaWw6CisgICAgKmVycm9yID0gRlRfRXJyX0ludmFsaWRfU3RyZWFtX09wZXJhdGlvbjsKKyAgICBGVF9FUlJPUigoICJGVF9SZWFkX0NoYXI6IiApKTsKKyAgICBGVF9FUlJPUigoICIgaW52YWxpZCBpL28sIHBvcyA9IDB4JWx4LCBzaXplID0gMHglbHgiLAorICAgICAgICAgICAgICAgc3RyZWFtLT5wb3MsIHN0cmVhbS0+c2l6ZSApKTsKKyAgICByZXR1cm4gMDsKKyAgfQorIAorCisgIEJBU0VfRlVOQworICBGVF9TaG9ydCAgRlRfUmVhZF9TaG9ydCggRlRfU3RyZWFtICBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9FcnJvciogIGVycm9yICkKKyAgeworICAgIGNoYXIgICAgIHJlYWRzWzJdOworICAgIGNoYXIqICAgIHAgPSAwOworICAgIEZUX1Nob3J0IHJlc3VsdCA9IDA7CisgICAgCisgICAgRlRfQXNzZXJ0KCBzdHJlYW0gKTsKKyAgICAKKyAgICAqZXJyb3IgPSBGVF9FcnJfT2s7CisgICAgCisgICAgaWYgKHN0cmVhbS0+cG9zKzEgPCBzdHJlYW0tPnNpemUpCisgICAgeworICAgICAgaWYgKHN0cmVhbS0+cmVhZCkKKyAgICAgIHsKKyAgICAgICAgaWYgKHN0cmVhbS0+cmVhZCggc3RyZWFtLCBzdHJlYW0tPnBvcywgcmVhZHMsIDJMICkgIT0gMkwgKQorICAgICAgICAgIGdvdG8gRmFpbDsKKyAgICAgICAgICAKKyAgICAgICAgcCA9IHJlYWRzOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBwID0gc3RyZWFtLT5iYXNlICsgc3RyZWFtLT5wb3M7CisgICAgICB9CisgICAgICAKKyAgICAgIGlmIChwKQorICAgICAgeworICAgICAgICByZXN1bHQgICAgICAgPSBORVhUX1Nob3J0KHApOworICAgICAgICBzdHJlYW0tPnBvcyArPSAyOworICAgICAgfQorICAgIH0KKyAgICBlbHNlIGdvdG8gRmFpbDsKKworICAgIHJldHVybiByZXN1bHQ7CisgICAgCisgIEZhaWw6CisgICAgKmVycm9yID0gRlRfRXJyX0ludmFsaWRfU3RyZWFtX09wZXJhdGlvbjsKKyAgICBGVF9FUlJPUigoICJGVF9SZWFkX1Nob3J0OiIgKSk7CisgICAgRlRfRVJST1IoKCAiIGludmFsaWQgaS9vLCBwb3MgPSAweCVseCwgc2l6ZSA9IDB4JWx4IiwKKyAgICAgICAgICAgICAgIHN0cmVhbS0+cG9zLCBzdHJlYW0tPnNpemUgKSk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAKKworICBCQVNFX0ZVTkMKKyAgRlRfTG9uZyAgRlRfUmVhZF9PZmZzZXQoIEZUX1N0cmVhbSAgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRXJyb3IqICBlcnJvciApCisgIHsKKyAgICBjaGFyICAgICByZWFkc1szXTsKKyAgICBjaGFyKiAgICBwID0gMDsKKyAgICBGVF9Mb25nICByZXN1bHQgPSAwOworICAgIAorICAgIEZUX0Fzc2VydCggc3RyZWFtICk7CisgICAgCisgICAgKmVycm9yID0gRlRfRXJyX09rOworICAgIAorICAgIGlmIChzdHJlYW0tPnBvcysyIDwgc3RyZWFtLT5zaXplKQorICAgIHsKKyAgICAgIGlmIChzdHJlYW0tPnJlYWQpCisgICAgICB7CisgICAgICAgIGlmIChzdHJlYW0tPnJlYWQoIHN0cmVhbSwgc3RyZWFtLT5wb3MsIHJlYWRzLCAzTCApICE9IDNMICkKKyAgICAgICAgICBnb3RvIEZhaWw7CisgICAgICAgICAgCisgICAgICAgIHAgPSByZWFkczsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgcCA9IHN0cmVhbS0+YmFzZSArIHN0cmVhbS0+cG9zOworICAgICAgfQorICAgICAgCisgICAgICBpZiAocCkKKyAgICAgIHsKKyAgICAgICAgcmVzdWx0ICAgICAgID0gTkVYVF9PZmZzZXQocCk7CisgICAgICAgIHN0cmVhbS0+cG9zICs9IDM7CisgICAgICB9CisgICAgfQorICAgIGVsc2UgZ290byBGYWlsOworICAgICAgCisgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAKKyAgRmFpbDoKKyAgICAqZXJyb3IgPSBGVF9FcnJfSW52YWxpZF9TdHJlYW1fT3BlcmF0aW9uOworICAgIEZUX0VSUk9SKCggIkZUX1JlYWRfT2Zmc2V0OiIgKSk7CisgICAgRlRfRVJST1IoKCAiIGludmFsaWQgaS9vLCBwb3MgPSAweCVseCwgc2l6ZSA9IDB4JWx4IiwKKyAgICAgICAgICAgICAgIHN0cmVhbS0+cG9zLCBzdHJlYW0tPnNpemUgKSk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAKKworICBCQVNFX0ZVTkMKKyAgRlRfTG9uZyAgRlRfUmVhZF9Mb25nKCBGVF9TdHJlYW0gIHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGVF9FcnJvciogIGVycm9yICkKKyAgeworICAgIGNoYXIgICAgIHJlYWRzWzRdOworICAgIGNoYXIqICAgIHAgPSAwOworICAgIEZUX0xvbmcgIHJlc3VsdCA9IDA7CisgICAgCisgICAgRlRfQXNzZXJ0KCBzdHJlYW0gKTsKKyAgICAKKyAgICAqZXJyb3IgPSBGVF9FcnJfT2s7CisgICAgCisgICAgaWYgKHN0cmVhbS0+cG9zKzMgPCBzdHJlYW0tPnNpemUpCisgICAgeworICAgICAgaWYgKHN0cmVhbS0+cmVhZCkKKyAgICAgIHsKKyAgICAgICAgaWYgKHN0cmVhbS0+cmVhZCggc3RyZWFtLCBzdHJlYW0tPnBvcywgcmVhZHMsIDRMICkgIT0gNEwgKQorICAgICAgICAgIGdvdG8gRmFpbDsKKyAgICAgICAgICAKKyAgICAgICAgcCA9IHJlYWRzOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBwID0gc3RyZWFtLT5iYXNlICsgc3RyZWFtLT5wb3M7CisgICAgICB9CisgICAgICAKKyAgICAgIGlmIChwKQorICAgICAgeworICAgICAgICByZXN1bHQgICAgICAgPSBORVhUX0xvbmcocCk7CisgICAgICAgIHN0cmVhbS0+cG9zICs9IDQ7CisgICAgICB9CisgICAgfQorICAgIGVsc2UgZ290byBGYWlsOworCisgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAKKyAgRmFpbDoKKyAgICAqZXJyb3IgPSBGVF9FcnJfSW52YWxpZF9TdHJlYW1fT3BlcmF0aW9uOworICAgIEZUX0VSUk9SKCggIkZUX1JlYWRfTG9uZzoiICkpOworICAgIEZUX0VSUk9SKCggIiBpbnZhbGlkIGkvbywgcG9zID0gMHglbHgsIHNpemUgPSAweCVseCIsCisgICAgICAgICAgICAgICBzdHJlYW0tPnBvcywgc3RyZWFtLT5zaXplICkpOworICAgIHJldHVybiAwOworICB9CisKZGlmZiAtLWdpdCBhL3NyYy9iYXNlL2Z0c3RyZWFtLmggYi9zcmMvYmFzZS9mdHN0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0NDc5NWMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvYmFzZS9mdHN0cmVhbS5oCkBAIC0wLDAgKzEsMTc4IEBACisjaWZuZGVmIEZUU1RSRUFNX0gKKyNkZWZpbmUgRlRTVFJFQU1fSAorCisjaW5jbHVkZSA8ZnRvYmpzLmg+CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIGludGVnZXIgZXh0cmFjdGlvbiBtYWNyb3MgLSB0aGUgYGJ1ZmZlcicgcGFyYW1ldGVyIG11c3QgQUxXQVlTIGJlIG9mICAqLworICAvKiB0eXBlIGBjaGFyKicgb3IgZXF1aXZhbGVudCAoMS1ieXRlIGVsZW1lbnRzKS4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE5FWFRfQ2hhcihidWZmZXIpICAgICgoc2lnbmVkIGNoYXIpKmJ1ZmZlcisrKQorI2RlZmluZSBORVhUX0J5dGUoYnVmZmVyKSAgICAoKHVuc2lnbmVkIGNoYXIpKmJ1ZmZlcisrKQorCisjZGVmaW5lIE5FWFRfU2hvcnQoYnVmZmVyKSAgICggYnVmZmVyICs9IDIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCAoc2hvcnQpKChzaWduZWQgICBjaGFyKWJ1ZmZlclstMl0gPDwgOCkgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyKWJ1ZmZlclstMV0gICAgICAgKSApCisKKyNkZWZpbmUgTkVYVF9VU2hvcnQoYnVmZmVyKSAgKCh1bnNpZ25lZCBzaG9ydClORVhUX1Nob3J0KGJ1ZmZlcikpCisKKyNkZWZpbmUgTkVYVF9PZmZzZXQoYnVmZmVyKSAgKCBidWZmZXIgKz0gMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoICgobG9uZykoc2lnbmVkICAgY2hhcilidWZmZXJbLTNdIDw8IDE2KSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgobG9uZykodW5zaWduZWQgY2hhcilidWZmZXJbLTJdIDw8ICA4KSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZykodW5zaWduZWQgY2hhcilidWZmZXJbLTFdICAgICAgICApICkKKworI2RlZmluZSBORVhUX1VPZmZzZXQoYnVmZmVyKSAoKHVuc2lnbmVkIGxvbmcpTkVYVF9PZmZzZXQoYnVmZmVyKSkKKworI2RlZmluZSBORVhUX0xvbmcoYnVmZmVyKSAgICAoIGJ1ZmZlciArPSA0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggKChsb25nKShzaWduZWQgICBjaGFyKWJ1ZmZlclstNF0gPDwgMjQpIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChsb25nKSh1bnNpZ25lZCBjaGFyKWJ1ZmZlclstM10gPDwgMTYpIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChsb25nKSh1bnNpZ25lZCBjaGFyKWJ1ZmZlclstMl0gPDwgIDgpIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nKSh1bnNpZ25lZCBjaGFyKWJ1ZmZlclstMV0gICAgICAgICkgKQorCisjZGVmaW5lIE5FWFRfVUxvbmcoYnVmZmVyKSAgICgodW5zaWduZWQgbG9uZylORVhUX0xvbmcoYnVmZmVyKSkKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogRWFjaCBHRVRfeHh4eCgpIG1hY3JvIHVzZXMgYW4gaW1wbGljaXQgYHN0cmVhbScgdmFyaWFibGUuICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBGVF9HRVRfTUFDUk8oIGZ1bmMsIHR5cGUgKSAgICAgICAgKCAodHlwZSlmdW5jKHN0cmVhbSkgKQorCisjZGVmaW5lIEdFVF9DaGFyKCkgICAgIEZUX0dFVF9NQUNSTyggRlRfR2V0X0NoYXIsIEZUX0NoYXIgKQorI2RlZmluZSBHRVRfQnl0ZSgpICAgICBGVF9HRVRfTUFDUk8oIEZUX0dldF9DaGFyLCBGVF9CeXRlICkKKyNkZWZpbmUgR0VUX1Nob3J0KCkgICAgRlRfR0VUX01BQ1JPKCBGVF9HZXRfU2hvcnQsIEZUX1Nob3J0ICkKKyNkZWZpbmUgR0VUX1VTaG9ydCgpICAgRlRfR0VUX01BQ1JPKCBGVF9HZXRfU2hvcnQsIEZUX1VTaG9ydCApCisjZGVmaW5lIEdFVF9PZmZzZXQoKSAgIEZUX0dFVF9NQUNSTyggRlRfR2V0X09mZnNldCwgRlRfTG9uZyApCisjZGVmaW5lIEdFVF9VT2Zmc2V0KCkgIEZUX0dFVF9NQUNSTyggRlRfR2V0X09mZnNldCwgRlRfVUxvbmcgKQorI2RlZmluZSBHRVRfTG9uZygpICAgICBGVF9HRVRfTUFDUk8oIEZUX0dldF9Mb25nLCBGVF9Mb25nICkKKyNkZWZpbmUgR0VUX1VMb25nKCkgICAgRlRfR0VUX01BQ1JPKCBGVF9HZXRfTG9uZywgRlRfVUxvbmcgKQorI2RlZmluZSBHRVRfVGFnNCgpICAgICBGVF9HRVRfTUFDUk8oIEZUX0dldF9Mb25nLCBGVF9VTG9uZyApCisKKworI2RlZmluZSBGVF9SRUFEX01BQ1JPKCBmdW5jLCB0eXBlLCB2YXIgKSAgICAgICAgXAorICAgICAgICAgICggdmFyID0gKHR5cGUpZnVuYyggc3RyZWFtLCAmZXJyb3IgKSwgXAorICAgICAgICAgICAgZXJyb3IgIT0gRlRfRXJyX09rICkKKworI2RlZmluZSBSRUFEX0J5dGUoIHZhciApICAgICBGVF9SRUFEX01BQ1JPKCBGVF9SZWFkX0NoYXIsIEZUX0J5dGUsIHZhciApCisjZGVmaW5lIFJFQURfQ2hhciggdmFyICkgICAgIEZUX1JFQURfTUFDUk8oIEZUX1JlYWRfQ2hhciwgRlRfQ2hhciwgdmFyICkKKyNkZWZpbmUgUkVBRF9TaG9ydCggdmFyICkgICAgRlRfUkVBRF9NQUNSTyggRlRfUmVhZF9TaG9ydCwgRlRfU2hvcnQsIHZhciApCisjZGVmaW5lIFJFQURfVVNob3J0KCB2YXIgKSAgIEZUX1JFQURfTUFDUk8oIEZUX1JlYWRfU2hvcnQsIEZUX1VTaG9ydCwgdmFyICkKKyNkZWZpbmUgUkVBRF9PZmZzZXQoIHZhciApICAgRlRfUkVBRF9NQUNSTyggRlRfUmVhZF9PZmZzZXQsIEZUX0xvbmcsIHZhciApCisjZGVmaW5lIFJFQURfVU9mZnNldCggdmFyICkgIEZUX1JFQURfTUFDUk8oIEZUX1JlYWRfT2Zmc2V0LCBGVF9VTG9uZywgdmFyICkKKyNkZWZpbmUgUkVBRF9Mb25nKCB2YXIgKSAgICAgRlRfUkVBRF9NQUNSTyggRlRfUmVhZF9Mb25nLCBGVF9Mb25nLCB2YXIgKQorI2RlZmluZSBSRUFEX1VMb25nKCB2YXIgKSAgICBGVF9SRUFEX01BQ1JPKCBGVF9SZWFkX0xvbmcsIEZUX1VMb25nLCB2YXIgKQorCisKKworICBCQVNFX0RFRgorICB2b2lkICBGVF9OZXdfTWVtb3J5X1N0cmVhbSggRlRfTGlicmFyeSAgICAgbGlicmFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgICAgIGJhc2UsCisgICAgIAkJCSAgICAgIHVuc2lnbmVkIGxvbmcgIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gICAgICBzdHJlYW0gKTsKKyAKKyAgQkFTRV9ERUYKKyAgRlRfRXJyb3IgIEZUX1NlZWtfU3RyZWFtKCBGVF9TdHJlYW0gIHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgIHBvcyApOworCisgIEJBU0VfREVGCisgIEZUX0Vycm9yICBGVF9Ta2lwX1N0cmVhbSggRlRfU3RyZWFtICBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICBkaXN0YW5jZSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBCQVNFX0RFRgorICBGVF9Mb25nICAgRlRfU3RyZWFtX1BvcyggRlRfU3RyZWFtICBzdHJlYW0gKTsKKworCisgIEJBU0VfREVGCisgIEZUX0Vycm9yICBGVF9SZWFkX1N0cmVhbSggRlRfU3RyZWFtICBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICBjb3VudCApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBCQVNFX0RFRgorICBGVF9FcnJvciAgRlRfUmVhZF9TdHJlYW1fQXQoIEZUX1N0cmVhbSAgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgY291bnQgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgQkFTRV9ERUYKKyAgRlRfRXJyb3IgIEZUX0FjY2Vzc19GcmFtZSggRlRfU3RyZWFtICBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgY291bnQgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIEJBU0VfREVGCisgIHZvaWQgICAgICBGVF9Gb3JnZXRfRnJhbWUoIEZUX1N0cmVhbSAgc3RyZWFtICk7CisKKworCisgIEJBU0VfREVGCisgIEZUX0NoYXIgICBGVF9HZXRfQ2hhciggRlRfU3RyZWFtICBzdHJlYW0gKTsKKyAgCisgIEJBU0VfREVGCisgIEZUX1Nob3J0ICBGVF9HZXRfU2hvcnQoIEZUX1N0cmVhbSAgc3RyZWFtICk7CisgIAorICBCQVNFX0RFRgorICBGVF9Mb25nICAgRlRfR2V0X09mZnNldCggRlRfU3RyZWFtICBzdHJlYW0gKTsKKyAgCisgIEJBU0VfREVGCisgIEZUX0xvbmcgICBGVF9HZXRfTG9uZyggRlRfU3RyZWFtICBzdHJlYW0gKTsKKworCisKKyAgQkFTRV9ERUYKKyAgRlRfQ2hhciAgRlRfUmVhZF9DaGFyKCBGVF9TdHJlYW0gIHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGVF9FcnJvciogIGVycm9yICk7IAorCisgIEJBU0VfREVGCisgIEZUX1Nob3J0ICBGVF9SZWFkX1Nob3J0KCBGVF9TdHJlYW0gIHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0Vycm9yKiAgZXJyb3IgKTsgCisKKyAgQkFTRV9ERUYKKyAgRlRfTG9uZyAgRlRfUmVhZF9PZmZzZXQoIEZUX1N0cmVhbSAgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRXJyb3IqICBlcnJvciApOyAKKworICBCQVNFX0RFRgorICBGVF9Mb25nICBGVF9SZWFkX0xvbmcoIEZUX1N0cmVhbSAgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0Vycm9yKiAgZXJyb3IgKTsgCisKKworI2RlZmluZSBVU0VfU3RyZWFtKCByZXNvdXJjZSwgc3RyZWFtICkgIFwKKyAgICAgICAgICBGVF9TRVRfRVJST1IoIEZUX09wZW5fU3RyZWFtKCByZXNvdXJjZSwgc3RyZWFtICkgKQorCisjZGVmaW5lIERPTkVfU3RyZWFtKCBzdHJlYW0gKSAgXAorICAgICAgICAgIEZUX0RvbmVfU3RyZWFtKCBzdHJlYW0gKQorCisKKyNkZWZpbmUgQUNDRVNTX0ZyYW1lKCBzaXplICkgIFwKKyAgICAgICAgICBGVF9TRVRfRVJST1IoIEZUX0FjY2Vzc19GcmFtZSggc3RyZWFtLCBzaXplICkgKQorCisjZGVmaW5lIEFDQ0VTU19Db21wcmVzc2VkX0ZyYW1lKCBzaXplICkgIFwKKyAgICAgICAgICBGVF9TRVRfRVJST1IoIEZUX0FjY2Vzc19Db21wcmVzc2VkX0ZyYW1lKCBzdHJlYW0sIHNpemUgKSApCisKKworI2RlZmluZSBGT1JHRVRfRnJhbWUoKSBcCisgICAgICAgICAgRlRfRm9yZ2V0X0ZyYW1lKCBzdHJlYW0gKQorCisKKyNkZWZpbmUgRklMRV9TZWVrKCBwb3NpdGlvbiApICBcCisgICAgICAgICAgRlRfU0VUX0VSUk9SKCBGVF9TZWVrX1N0cmVhbSggc3RyZWFtLCBwb3NpdGlvbiApICkKKworI2RlZmluZSBGSUxFX1NraXAoIGRpc3RhbmNlICkgIFwKKyAgICAgICAgICBGVF9TRVRfRVJST1IoIEZUX1NraXBfU3RyZWFtKCBzdHJlYW0sIGRpc3RhbmNlICkgKQorCisjZGVmaW5lIEZJTEVfUG9zKCkgXAorICAgICAgICAgIEZUX1N0cmVhbV9Qb3MoIHN0cmVhbSApCisKKyNkZWZpbmUgRklMRV9SZWFkKCBidWZmZXIsIGNvdW50ICkgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIEZUX1NFVF9FUlJPUiggRlRfUmVhZF9TdHJlYW0oIHN0cmVhbSwgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX0NoYXIqKWJ1ZmZlciwgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCApICkKKworI2RlZmluZSBGSUxFX1JlYWRfQXQoIHBvc2l0aW9uLCBidWZmZXIsIGNvdW50ICkgICAgICAgICAgICAgIFwKKyAgICAgICAgICBGVF9TRVRfRVJST1IoIEZUX1JlYWRfU3RyZWFtX0F0KCBzdHJlYW0sICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24sICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9DaGFyKilidWZmZXIsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCApICkKKworCisKKyNlbmRpZiAvKiBGVElPX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9iYXNlL3J1bGVzLm1rIGIvc3JjL2Jhc2UvcnVsZXMubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U2NDczYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9iYXNlL3J1bGVzLm1rCkBAIC0wLDAgKzEsMTM2IEBACisjKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMqICBCYXNlIGxheWVyIE1ha2VmaWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisjKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIyogIENvcHlyaWdodCAxOTk2LTE5OTkgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMqICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICAqCisjKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCAgICAgICAgICoKKyMqICBtb2RpZmllZCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgICAqCisjKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAgKgorIyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgICoKKyMqICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisjKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCisjKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMqICBJTVBPUlRBTlQgTk9URTogVGhpcyBNYWtlZmlsZSBpcyBpbnRlbmRlZCBmb3IgR05VIE1ha2UhICAgICAgICAgICAgICAgICAqCisjKiAgICAgICAgICAgICAgICAgIElmIHlvdSBwcm92aWRlIE1ha2VmaWxlcyBmb3Igb3RoZXIgbWFrZSB1dGlsaXRpZXMsICAgICAgKgorIyogICAgICAgICAgICAgICAgICBwbGVhc2UgcGxhY2UgdGhlbSBpbiBgZnJlZXR5cGUvbGliL2FyY2gvPHN5c3RlbT4uJyAgICAgICoKKyMqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisjKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIyogIFRoaXMgZmlsZSBpcyB0byBiZSBpbmNsdWRlZCBieSB0aGUgcm9vdCBGcmVlVHlwZSBzdWItTWFrZWZpbGUsIHVzdWFsbHkgICoKKyMqICBuYW1lZCBgZnJlZXR5cGUvbGliL01ha2VmaWxlLmxpYi4nICBIZXJlIGlzIHRoZSBsaXN0IG9mIHRoZSB2YXJpYWJsZXMgICAqCisjKiAgdGhhdCBtdXN0IGJlIGRlZmluZWQgdG8gdXNlIGl0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMqICAgICBCQVNFX0RJUjogIFRoZSBsb2NhdGlvbiBvZiB0aGUgYmFzZSBsYXllcidzIGRpcmVjdG9yeS4gIFRoaXMgaXMgICAgICAqCisjKiAgICAgICAgICAgICAgICB1c3VhbGx5IGBmcmVldHlwZS9saWIvYmFzZS4nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMqICAgICBBUkNIX0RJUjogIFRoZSBsb2NhdGlvbiBvZiB0aGUgYXJjaGl0ZWN0dXJlLWRlcGVuZGVudCBkaXJlY3RvcnkuICAgICAqCisjKiAgICAgICAgICAgICAgICBUaGlzIGlzIHVzdWFsbHkgYGZyZWV0eXBlL2xpYi9hcmNoLzxzeXN0ZW0+LicgICAgICAgICAgICAgKgorIyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMqICAgICBPQkpfRElSOiAgIFRoZSBsb2NhdGlvbiB3aGVyZSB0aGUgY29tcGlsZWQgb2JqZWN0KHMpIGZpbGUgd2lsbCBiZSAgICAqCisjKiAgICAgICAgICAgICAgICBwbGFjZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMqICAgICBGVF9DRkxBR1M6IEEgc2V0IG9mIGZsYWdzIHVzZWQgZm9yIGNvbXBpbGF0aW9uIG9mIG9iamVjdCBmaWxlcy4gICAgICAqCisjKiAgICAgICAgICAgICAgICBUaGlzIGNvbnRhaW5zIGF0IGxlYXN0IHRoZSBpbmNsdWRlIHBhdGhzIG9mIHRoZSBgYXJjaCcgICAgKgorIyogICAgICAgICAgICAgICAgYW5kIGBiYXNlJyBkaXJlY3RvcmllcyArIG9wdGltaXphdGlvbiArIHdhcm5pbmdzICsgICAgICAgICoKKyMqICAgICAgICAgICAgICAgIEFOU0kgY29tcGxpYW5jZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisjKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIyogICAgIEZUX0lGTEFHUzogVGhlIGZsYWcgdXNlZCB0byBzcGVjaWZ5IGFuIGluY2x1ZGUgcGF0aCBvbiB0aGUgY29tcGlsZXIgICoKKyMqICAgICAgICAgICAgICAgIGNvbW1hbmQgbGluZS4gIEZvciBleGFtcGxlLCB3aXRoIEdDQywgdGhpcyBpcyBgLUknLCB3aGlsZSAqCisjKiAgICAgICAgICAgICAgICBzb21lIG90aGVyIGNvbXBpbGVycyB1c2UgYC9pPScgb3IgYC1KJywgZXRjLiAgICAgICAgICAgICAgKgorIyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMqICAgICBGVF9PQko6ICAgIFRoZSBzdWZmaXggb2YgYW4gb2JqZWN0IGZpbGUgZm9yIHRoZSBwbGF0Zm9ybS4gIENhbiBiZSAgICAqCisjKiAgICAgICAgICAgICAgICBgbycsIGBvYmonLCBgY29mZicsIGB0Y28nLCBldGMuICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMqICAgICBGVF9DQzogICAgIFRoZSBDIGNvbXBpbGVyIHRvIHVzZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisjKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMqICBJdCBzZXRzIHRoZSBmb2xsb3dpbmcgdmFyaWFibGVzLCB3aGljaCBhcmUgdXNlZCBieSB0aGUgcGFyZW50IE1ha2VmaWxlICAqCisjKiAgYWZ0ZXIgdGhlIGNhbGw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMqICAgICBCQVNFX0g6ICAgICAgIFRoZSBsaXN0IG9mIGJhc2UgbGF5ZXIgaGVhZGVyIGZpbGVzIG9uIHdoaWNoIHRoZSByZXN0ICAqCisjKiAgICAgICAgICAgICAgICAgICBvZiB0aGUgbGlicmFyeSAoaS5lLiwgZHJpdmVycykgcmVseS4gICAgICAgICAgICAgICAgICAgKgorIyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMqICAgICBCQVNFX09CSl9TOiAgIFRoZSBzaW5nbGUtb2JqZWN0IGJhc2UgbGF5ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisjKiAgICAgQkFTRV9PQkpfTTogICBBIGxpc3Qgb2YgYWxsIG9iamVjdHMgZm9yIGEgbXVsdGlwbGUtb2JqZWN0cyBidWlsZC4gICAgKgorIyogICAgIEJBU0VfRVhUX09CSjogQSBsaXN0IG9mIGJhc2UgbGF5ZXIgZXh0ZW5zaW9ucywgaS5lLiwgY29tcG9uZW50cyAgICAgICoKKyMqICAgICAgICAgICAgICAgICAgIGZvdW5kIGluIGBmcmVldHlwZS9saWIvYmFzZScgd2hpY2ggYXJlIG5vdCBjb21waWxlZCAgICAqCisjKiAgICAgICAgICAgICAgICAgICB3aXRoaW4gdGhlIGJhc2UgbGF5ZXIgcHJvcGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKK0lOQ0xVREVTICs9ICQoU1JDXyliYXNlCisKKyMgQmFzZSBsYXllciBzb3VyY2VzCisjCitCQVNFX1NSQyA6PSAkKEJBU0VfKWZ0c3RyZWFtLmMgIFwKKyAgICAgICAgICAgICQoQkFTRV8pZnRjYWxjLmMgICAgXAorICAgICAgICAgICAgJChCQVNFXylmdG9ianMuYyAgICBcCisgICAgICAgICAgICAkKEJBU0VfKWZ0ZXh0ZW5kLmMgIFwKKyAgICAgICAgICAgICQoQkFTRV8pZnRsaXN0LmMKKworIyBCYXNlIGxheWVyIGhlYWRlcnMKKyMKK0JBU0VfSCA6PSAkKEJBU0VfKWZ0Y2FsYy5oICAgIFwKKyAgICAgICAgICAkKEJBU0VfKWZ0b2Jqcy5oICAgIFwKKyAgICAgICAgICAkKEJBU0VfKWZ0ZHJpdmVyLmggIFwKKyAgICAgICAgICAkKEJBU0VfKWZ0ZXh0ZW5kLmggIFwKKyAgICAgICAgICAkKEJBU0VfKWZ0bGlzdC5oCisKKworIyBCYXNlIGxheWVyIGBleHRlbnNpb25zJyBzb3VyY2VzCisjCisjIEFuIGV4dGVuc2lvbiBpcyBhZGRlZCB0byB0aGUgbGlicmFyeSBmaWxlICguYSBvciAubGliKSBhcyBhIHNlcGFyYXRlCisjIG9iamVjdC4gIEl0IHdpbGwgdGhlbiBiZSBsaW5rZWQgdG8gdGhlIGZpbmFsIGV4ZWN1dGFibGUgb25seSBpZiBvbmUgb2YKKyMgaXRzIHN5bWJvbHMgaXMgdXNlZCBieSB0aGUgYXBwbGljYXRpb24uCisjCitCQVNFX0VYVF9TUkMgOj0gJChCQVNFXylmdGJib3guYyAgIFwKKyAgICAgICAgICAgICAgICAkKEJBU0VfKWZ0cmFzdGVyLmMgXAorICAgICAgICAgICAgICAgICQoQkFTRV8pZnRvdXRsbi5jCisKKworIyBCYXNlIGxheWVyIGV4dGVuc2lvbnMgaGVhZGVycworIworQkFTRV9FWFRfSCA6PSAkKEJBU0VfRVhUX1NSQzolYz0laCkKKworCisjIEJhc2UgbGF5ZXIgb2JqZWN0KHMpCisjCisjICAgQkFTRV9PQkpfTSBpcyB1c2VkIGR1cmluZyBgbXVsdGknIGJ1aWxkcyAoZWFjaCBiYXNlIHNvdXJjZSBmaWxlCisjICAgY29tcGlsZXMgdG8gYSBzaW5nbGUgb2JqZWN0IGZpbGUpLgorIworIyAgIEJBU0VfT0JKX1MgaXMgdXNlZCBkdXJpbmcgYHNpbmdsZScgYnVpbGRzICh0aGUgd2hvbGUgYmFzZSBsYXllcgorIyAgIGlzIGNvbXBpbGVkIGFzIGEgc2luZ2xlIG9iamVjdCBmaWxlIHVzaW5nIGZ0YmFzZS5jKS4KKyMKK0JBU0VfT0JKX00gOj0gJChCQVNFX1NSQzokKEJBU0VfKSUuYz0kKE9CSl8pJS4kTykKK0JBU0VfT0JKX1MgOj0gJChPQkpfKWZ0YmFzZS4kTworCisKKyMgRGVmYXVsdCBleHRlbnNpb25zIG9iamVjdHMKKyMKK0JBU0VfRVhUX09CSiA6PSAkKEJBU0VfRVhUX1NSQzokKEJBU0VfKSUuYz0kKE9CSl8pJS4kTykKKworCisjIEJhc2UgbGF5ZXIgcm9vdCBzb3VyY2UgZmlsZShzKQorIworQkFTRV9TUkNfTSA6PSAkKEJBU0VfU1JDKQorQkFTRV9TUkNfUyA6PSAkKEJBU0VfKWZ0YmFzZS5jCisKKworIyBNdWx0aXBsZSBvYmplY3RzIGJ1aWxkICsgZXh0ZW5zaW9ucworIworJChPQkpfKWZ0JS4kTzogJChCQVNFXylmdCUuYyAkKFBVQkxJQ19IKSAkKEJBU0VfSCkKKwkkKEZUX0NDKSAkVCRAICQ8CisKKworIyBCYXNlIGxheWVyIC0gc2luZ2xlIG9iamVjdCBidWlsZAorIworJChCQVNFX09CSl9TKTogJChQVUJMSUNfSCkgJChCQVNFX0gpICQoQkFTRV9TUkNfUykgJChCQVNFX1NSQykKKwkkKEZUX0NDKSAkVCRAICQoQkFTRV9TUkNfUykKKworCisjIEVORApkaWZmIC0tZ2l0IGEvc3JjL29sZGFwaS9NYWtlZmlsZSBiL3NyYy9vbGRhcGkvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I1ODU4YwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9vbGRhcGkvTWFrZWZpbGUKQEAgLTAsMCArMSwyOSBAQAorIworIyAgVGhlIE9sZEFwaSBjb21wb25lbnQgaGFkIG5vdCBiZWVuIG1pZ3JhdGVkIHRvIHRoZSBuZXcgZGVzaWduIHlldAorIyAgcGxlYXNlIHdhaXQgYSBmZXcgZGF5cyBmb3Igc29tZSB1cGRhdGVzLiBUaGlzIGZpbGUgc2hvdWxkIGJlCisjICBjb21wbGV0ZWx5IGlnbm9yZWQgZHVyaW5nIGEgQlVJTEQgISEKKyMKKyMKK2luY2x1ZGUgZHJpdmVycy9zaGFyZWQvc2ZudC9NYWtlZmlsZQorCitPTERBUElfRElSIDo9ICQoVE9QX0RJUikvb2xkYXBpCisKK09MREFQSV9JTkNMVURFUyA6PSAkKEZUX0lGTEFHKSQoU0ZOVF9ESVIpICAgIFwKKyAgICAgICAgICAgICAgICAgICAkKEZUX0lGTEFHKSQoT0xEQVBJX0RJUikgIFwKKyAgICAgICAgICAgICAgICAgICAkKEZUX0lGTEFHKSQoVFRfRElSKQorCitPTERBUElfQ0ZMQUdTICAgOj0gJChGVF9DRkxBR1MpICQoT0xEQVBJX0lOQ0xVREVTKQorCitPTERBUElfT0JKIDo9ICQoT0JKX0RJUikvdHRhcGkuJChGVF9PQkopCisKKyMgRnJlZVR5cGUtMS4xIGNvbXBhdGlibGUgaW50ZXJmYWNlCisjCiskKE9MREFQSV9PQkopOiAkKE9MREFQSV9ESVIpL3R0YXBpLmMgJChPTERBUElfRElSKS90cnVldHlwZS5oIFwKKyAgICAgICAgICAgICAgICAgICAgJChCQVNFX0gpICQoU0ZOVF9IKSAkKFRUX0RSVl9IKQorCSQoRlRfQ0MpICQoT0xEQVBJX0NGTEFHUykgJDwgLW8gJEAKKworIyB1cGRhdGUgbWFpbiBkcml2ZXIgb2JqZWN0IGxpc3RzCisjCitEUlZfT0JKU19TICs9ICQoT0xEQVBJX09CSikKK0RSVl9PQkpTX00gKz0gJChPTERBUElfT0JKKQorCmRpZmYgLS1naXQgYS9zcmMvb2xkYXBpL3JlYWRtZS50eHQgYi9zcmMvb2xkYXBpL3JlYWRtZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGE1MGZkNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9vbGRhcGkvcmVhZG1lLnR4dApAQCAtMCwwICsxLDE4IEBACitUaGlzIGRpcmVjdG9yeSBpcyBwcm92aWRlZCBpbiBvcmRlciB0byBjb21waWxlIGEgc3RhbmQtYWxvbmUKK1RydWVUeXBlIGRyaXZlciB3aGljaCBzaG91bGQgYmUgYmFja3dhcmRzIGFuZCBiaW5hcnkgY29tcGF0aWJsZQord2l0aCBGcmVlVHlwZSAxLjEKKworUmVhc29uIGlzIHNvbWUgaW1wb3J0YW50IGRlc2lnbiBjaGFuZ2VzIHdlcmUgaW50cm9kdWNlZCBpbiBGcmVlVHlwZQorbGF0ZWx5LCBpbiBvcmRlciB0byBzdXBwb3J0IHNldmVyYWwgZm9udCBmb3JtYXRzIHRyYW5zcGFyZW50bHkuCisKK1RoZSBmaWxlcyBhcmUgOgorCisidHJ1ZXR5cGUuaCIgICAgICAgIC0gYSByZXBsYWNlbWVudCBmb3IgdGhlIG9sZCAiZnJlZXR5cGUuaCIgZmlsZQorICAgICAgICAgICAgICAgICAgICAgIHRoYXQgd2FzIGluY2x1ZGVkIGJ5IGNsaWVudCBhcHBsaWNhdGlvbnMgYW5kCisgICAgICAgICAgICAgICAgICAgICAgZm9udCBzZXJ2ZXJzIG9mIDEuMQorCisidHRhcGkuYyIgICAgICAgICAgIC0gYSBmcm9udC1lbmQgZm9yIHRoZSBuZXcgVHJ1ZVR5cGUgZHJpdmVyLCB0aGF0CisgICAgICAgICAgICAgICAgICAgICAgcHJlc2VudHMgZXhhY3RseSB0aGUgc2FtZSBpbnRlcmZhY2UgYXMgdGhlIG9uZQorICAgICAgICAgICAgICAgICAgICAgIGluIDEuMQorCisKZGlmZiAtLWdpdCBhL3NyYy9vbGRhcGkvdHJ1ZXR5cGUuaCBiL3NyYy9vbGRhcGkvdHJ1ZXR5cGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmRlNDY5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL29sZGFwaS90cnVldHlwZS5oCkBAIC0wLDAgKzEsMTcwOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgdHJ1ZXR5cGUuaAorICoKKyAqICAgIEJhY2t3YXJkcy1jb21wYXRpYmxlIGhpZ2gtbGV2ZWwgaW50ZXJmYWNlIGZvciB0aGUgVHJ1ZVR5cGUKKyAqICAgIGRyaXZlci4gVGhpcyBmaWxlIGlzIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSBvbGQgImZyZWV0eXBlLmgiCisgKiAgICBmcm9tIDEuMCBhbmQgMS4xLiBJdCBjYW4gYmUgdXNlZCB0byBjb21waWxlIGFwcGxpY2F0aW9ucworICogICAgYW5kIHRvb2xzIHVzaW5nIHRoZSBvbGQgQVBJLi4KKyAqCisgKiAgICBOb3RlIHRoYXQgdGhpcyAob2xkKSBpbnRlcmZhY2UgaXMgbm93IGRlcHJlY2F0ZWQgYW5kIHdvbid0CisgKiAgICBiZSBtb2RpZmllZCBpbiB0aGUgZnV0dXJlLiBEZXZlbG9wZXJzIHdpbGwgaGF2ZSB0byBzd2l0Y2ggdG8KKyAqICAgIHRoZSBuZXdlciBpbnRlcmZhY2UgdG8gZ2V0IG5ldyBmZWF0dXJlcyAoIGtlcm5pbmcsIGVtYmVkZGVkCisgKiAgICBiaXRtYXBzLCBldGMuLiApLgorICoKKyAqCisgKgorICogIENvcHlyaWdodCAxOTk2LTE5OTggYnkKKyAqICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0IGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlIAorICogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKiAgTm90ZToKKyAqCisgKiAgICBUaGlzIGlzIHRoZSBvbmx5IGZpbGUgdGhhdCBzaG91bGQgYmUgaW5jbHVkZWQgYnkgY2xpZW50ICAgICAgICAgICAgCisgKiAgICBhcHBsaWNhdGlvbiBzb3VyY2VzLiAgQWxsIG90aGVyIHR5cGVzIGFuZCBmdW5jdGlvbnMgZGVmaW5lZAorICogICAgaW4gdGhlICJ0dCouaCIgZmlsZXMgYXJlIGxpYnJhcnkgaW50ZXJuYWxzIGFuZCBzaG91bGQgbm90IGJlCisgKiAgICBpbmNsdWRlZC4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIFRSVUVUWVBFX0gKKyNkZWZpbmUgVFJVRVRZUEVfSAorCisvKiBUbyBtYWtlIGZyZWV0eXBlLmggaW5kZXBlbmRlbnQgZnJvbSBjb25maWd1cmF0aW9uIGZpbGVzIHdlIGNoZWNrICovCisvKiB3aGV0aGVyIEVYUE9SVF9ERUYgaGFzIGJlZW4gZGVmaW5lZCBhbHJlYWR5LiAgICAgICAgICAgICAgICAgICAgICovCisKKyNpZm5kZWYgRVhQT1JUX0RFRgorI2RlZmluZSBFWFBPUlRfREVGIGV4dGVybgorI2VuZGlmCisKKy8qIFRoZSBzYW1lIGZvciBUVF9UZXh0LiAgSWYgeW91IGRlZmluZSB0aGUgSEFWRV9UVF9URVhUIG1hY3JvLCB5b3UgKi8KKy8qIGhhdmUgdG8gcHJvdmlkZSBhIHR5cGVkZWYgZGVjbGFyYXRpb24gZm9yIFRUX1RleHQgYmVmb3JlICAgICAgICAgKi8KKy8qIGluY2x1ZGluZyB0aGlzIGZpbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworI2lmbmRlZiBIQVZFX1RUX1RFWFQKKyNkZWZpbmUgSEFWRV9UVF9URVhUCisgIHR5cGVkZWYgY2hhciAgVFRfVGV4dDsgICAgICAgICAgICAgIC8qIHRoZSBkYXRhIHR5cGUgdG8gcmVwcmVzZW50ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZpbGUgbmFtZSBzdHJpbmcgZWxlbWVudHMgICovCisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVzCisgIGV4dGVybiAiQyIgeworI2VuZGlmCisKKworLyogVGhlIGZvbGxvd2luZyB0eXBlcyBhcmUgYWxzbyBkZWZpbmVkIGluICJkcml2ZXJzL3R0bGliL3R0b2Jqcy5oIiAgKi8KKy8qIFdlIHVzZSB0aGUgX1RSVUVUWVBFXyBtYWNybyB0byBwcmV2ZW50IHRoZWlyIHJlZGVmaW5pdGlvbiB3aGVuICAgICovCisvKiBfY29tcGlsaW5nXyB0aGUgYmFja3dhcmRzLWNvbXBhdGlibGUgbGF5ZXIgY2FsbGVkICJ0dGFwaS5jIiAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNpZm5kZWYgX1RSVUVUWVBFXworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogIEZyZWVUeXBlIHR5cGVzIGRlZmluaXRpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgQWxsIHRoZXNlIGJlZ2luIHdpdGggYSAnVFRfJyBwcmVmaXguICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIHR5cGVkZWYgdW5zaWduZWQgc2hvcnQgIFRUX0Jvb2w7CisKKyAgdHlwZWRlZiBzaWduZWQgbG9uZyAgICAgVFRfRml4ZWQ7ICAgLyogU2lnbmVkIEZpeGVkIDE2LjE2IEZsb2F0ICovCisKKyAgdHlwZWRlZiBzaWduZWQgc2hvcnQgICAgVFRfRldvcmQ7ICAgLyogRGlzdGFuY2UgaW4gRlVuaXRzICovCisgIHR5cGVkZWYgdW5zaWduZWQgc2hvcnQgIFRUX1VGV29yZDsgIC8qIFVuc2lnbmVkIGRpc3RhbmNlICovCisKKyAgdHlwZWRlZiBjaGFyICAgICAgICAgICAgVFRfU3RyaW5nOworICB0eXBlZGVmIHNpZ25lZCBjaGFyICAgICBUVF9DaGFyOworICB0eXBlZGVmIHVuc2lnbmVkIGNoYXIgICBUVF9CeXRlOworICB0eXBlZGVmIHNpZ25lZCBzaG9ydCAgICBUVF9TaG9ydDsKKyAgdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAgVFRfVVNob3J0OworICB0eXBlZGVmIHNpZ25lZCBsb25nICAgICBUVF9Mb25nOworICB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgICBUVF9VTG9uZzsKKyAgdHlwZWRlZiBpbnQgICAgICAgICAgICAgVFRfSW50OworCisgIHR5cGVkZWYgc2lnbmVkIHNob3J0ICAgIFRUX0YyRG90MTQ7IC8qIFNpZ25lZCBmaXhlZCBmbG9hdCAyLjE0IHVzZWQgZm9yICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHVuaXQgdmVjdG9ycywgd2l0aCBsYXlvdXQ6ICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICBzIDogMSAgLS0gc2lnbiBiaXQgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICBtIDogMSAgLS0gaW50ZWdlciBiaXQgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICBmIDogMTQgLS0gdW5zaWduZWQgZnJhY3Rpb25hbCAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAnczptJyBpcyB0aGUgMi1iaXQgc2lnbmVkIGludCAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICB2YWx1ZSB0byB3aGljaCB0aGUgcG9zaXRpdmUgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICBmcmFjdGlvbmFsIHBhcnQgc2hvdWxkIGJlICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICBhZGRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgdHlwZWRlZiBzaWduZWQgbG9uZyAgICAgVFRfRjI2RG90NjsgLyogMjYuNiBmaXhlZCBmbG9hdCwgdXNlZCBmb3IgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZ2x5cGggcG9pbnRzIHBpeGVsIGNvb3JkaW5hdGVzLiAgKi8KKworICB0eXBlZGVmIHNpZ25lZCBsb25nICAgICBUVF9Qb3M7ICAgICAvKiBwb2ludCBwb3NpdGlvbiwgZXhwcmVzc2VkIGVpdGhlciAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbiBmcmFjdGlvbmFsIHBpeGVscyBvciBub3Rpb25hbCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB1bml0cywgZGVwZW5kaW5nIG9uIGNvbnRleHQuICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGb3IgZXhhbXBsZSwgZ2x5cGggY29vcmRpbmF0ZXMgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZXR1cm5lZCBieSBUVF9Mb2FkX0dseXBoIGFyZSAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBleHByZXNzZWQgaW4gZm9udCB1bml0cyB3aGVuICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzY2FsaW5nIHdhc24ndCByZXF1ZXN0ZWQsIGFuZCAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbiAyNi42IGZyYWN0aW9uYWwgcGl4ZWxzIGlmIGl0ICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB3YXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisKKyAgc3RydWN0ICBUVF9Vbml0VmVjdG9yXyAgICAgIC8qIGd1ZXNzIHdoYXQuLi4gICovCisgIHsgCisgICAgVFRfRjJEb3QxNCAgeDsKKyAgICBUVF9GMkRvdDE0ICB5OworICB9OworCisgIHR5cGVkZWYgc3RydWN0IFRUX1VuaXRWZWN0b3JfICBUVF9Vbml0VmVjdG9yOworCisKKyAgc3RydWN0ICBUVF9WZWN0b3JfICAgICAgICAgIC8qIFNpbXBsZSB2ZWN0b3IgdHlwZSAqLworICB7CisgICAgVFRfRjI2RG90NiAgeDsKKyAgICBUVF9GMjZEb3Q2ICB5OworICB9OworCisgIHR5cGVkZWYgc3RydWN0IFRUX1ZlY3Rvcl8gIFRUX1ZlY3RvcjsKKworCisgIC8qIEEgc2ltcGxlIDJ4MiBtYXRyaXggdXNlZCBmb3IgdHJhbnNmb3JtYXRpb25zLiAqLworICAvKiBZb3Ugc2hvdWxkIHVzZSAxNi4xNiBmaXhlZCBmbG9hdHMuICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICB4JyA9IHh4KnggKyB4eSp5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgeScgPSB5eCp4ICsgeXkqeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgc3RydWN0ICBUVF9NYXRyaXhfCisgIHsKKyAgICBUVF9GaXhlZCAgeHgsIHh5OworICAgIFRUX0ZpeGVkICB5eCwgeXk7CisgIH07CisKKyAgdHlwZWRlZiBzdHJ1Y3QgVFRfTWF0cml4XyAgVFRfTWF0cml4OworCisKKyAgLyogQSBzdHJ1Y3R1cmUgdXNlZCB0byBkZXNjcmliZSBhIHNpbXBsZSBib3VuZGluZyBib3ggKi8KKworICBzdHJ1Y3QgVFRfQkJveF8KKyAgeworICAgIFRUX1BvcyAgeE1pbjsKKyAgICBUVF9Qb3MgIHlNaW47CisgICAgVFRfUG9zICB4TWF4OworICAgIFRUX1BvcyAgeU1heDsKKyAgfTsKKworICB0eXBlZGVmIHN0cnVjdCBUVF9CQm94XyAgVFRfQkJveDsKKworCisKKyNlbmRpZiAvKiBfVFJVRVRZUEVfICovCisKKworCisKKyAgLyogQSBzdHJ1Y3R1cmUgdXNlZCB0byBkZXNjcmliZSB0aGUgc291cmNlIGdseXBoIHRvIHRoZSByZW5kZXJlci4gKi8KKworICBzdHJ1Y3QgIFRUX091dGxpbmVfCisgIHsKKyAgICBUVF9TaG9ydCAgICAgICAgIG5fY29udG91cnM7ICAgLyogbnVtYmVyIG9mIGNvbnRvdXJzIGluIGdseXBoICAgICAgICAqLworICAgIFRUX1VTaG9ydCAgICAgICAgbl9wb2ludHM7ICAgICAvKiBudW1iZXIgb2YgcG9pbnRzIGluIHRoZSBnbHlwaCAgICAgICovCisKKyAgICBUVF9WZWN0b3IqICAgICAgIHBvaW50czsgICAgICAgLyogdGhlIG91dGxpbmUncyBwb2ludHMgICAqLworICAgIFRUX0J5dGUqICAgICAgICAgZmxhZ3M7ICAgICAgICAvKiB0aGUgcG9pbnRzIGZsYWdzICAgICAgICovCisgICAgVFRfVVNob3J0KiAgICAgICBjb250b3VyczsgICAgIC8qIHRoZSBjb250b3VyIGVuZCBwb2ludHMgKi8KKworICAgIC8qIFRoZSBmb2xsb3dpbmcgZmxhZyBpbmRpY2F0ZXMgdGhhdCB0aGUgb3V0bGluZSBvd25zIHRoZSBhcnJheXMgaXQgICovCisgICAgLyogcmVmZXJzIHRvLiAgVHlwaWNhbGx5LCB0aGlzIGlzIHRydWUgb2Ygb3V0bGluZXMgY3JlYXRlZCBmcm9tIHRoZSAgKi8KKyAgICAvKiBUVF9OZXdfT3V0bGluZSgpIEFQSSwgd2hpbGUgaXQgaXNuJ3QgZm9yIHRob3NlIHJldHVybmVkIGJ5ICAgICAgICAqLworICAgIC8qIFRUX0dldF9HbHlwaF9PdXRsaW5lKCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICBUVF9Cb29sICAgICAgICAgIG93bmVyOyAgICAgIC8qIHRoZSBvdXRsaW5lIG93bnMgdGhlIGNvb3JkaW5hdGVzLCAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZmxhZ3MgYW5kIGNvbnRvdXJzIGFycmF5IGl0IHVzZXMgICAgICovCisKKyAgICAvKiBUaGUgZm9sbG93aW5nIGZsYWdzIGFyZSBzZXQgYXV0b21hdGljYWxseSBieSAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qIFRUX0dldF9HbHlwaF9PdXRsaW5lKCkuICBUaGVpciBtZWFuaW5nIGlzIHRoZSBmb2xsb3dpbmc6ICAgICAgICAgICovCisgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgaGlnaF9wcmVjaXNpb24gICBXaGVuIHRydWUsIHRoZSBzY2FuLWxpbmUgY29udmVydGVyIHdpbGwgdXNlICAgICAqLworICAgIC8qICAgICAgICAgICAgICAgICAgIGEgaGlnaGVyIHByZWNpc2lvbiB0byByZW5kZXIgYml0bWFwcyAoaS5lLiBhICAgICovCisgICAgLyogICAgICAgICAgICAgICAgICAgMS8xMDI0IHBpeGVsIHByZWNpc2lvbikuICBUaGlzIGlzIGltcG9ydGFudCBmb3IgKi8KKyAgICAvKiAgICAgICAgICAgICAgICAgICBzbWFsbCBwcGVtIHNpemVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogIHNlY29uZF9wYXNzICAgICAgV2hlbiB0cnVlLCB0aGUgc2Nhbi1saW5lIGNvbnZlcnRlciBwZXJmb3JtcyAgICAgKi8KKyAgICAvKiAgICAgICAgICAgICAgICAgICBhIHNlY29uZCBzd2VlcCBwaGFzZSBkZWRpY2F0ZWQgdG8gZmluZCAgICAgICAgICAqLworICAgIC8qICAgICAgICAgICAgICAgICAgIHZlcnRpY2FsIGRyb3Atb3V0cy4gIElmIGZhbHNlLCBvbmx5IGhvcml6b250YWwgICovCisgICAgLyogICAgICAgICAgICAgICAgICAgZHJvcC1vdXRzIHdpbGwgYmUgY2hlY2tlZCBkdXJpbmcgdGhlIGZpcnN0ICAgICAgKi8KKyAgICAvKiAgICAgICAgICAgICAgICAgICB2ZXJ0aWNhbCBzd2VlcCAoeWVzLCB0aGlzIGlzIGEgYml0IGNvbmZ1c2luZyAgICAqLworICAgIC8qICAgICAgICAgICAgICAgICAgIGJ1dCBpdCdzIHJlYWxseSB0aGUgd2F5IGl0IHNob3VsZCB3b3JrKS4gICAgICAgICovCisgICAgLyogICAgICAgICAgICAgICAgICAgVGhpcyBpcyBpbXBvcnRhbnQgZm9yIHNtYWxsIHBwZW1zIHRvby4gICAgICAgICAgKi8KKyAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICBkcm9wb3V0X21vZGUgICAgIFNwZWNpZmllcyB0aGUgVHJ1ZVR5cGUgZHJvcC1vdXQgbW9kZSB0byAgICAgICAgICovCisgICAgLyogICAgICAgICAgICAgICAgICAgdXNlIGZvciBjb250aW51aXR5IGNoZWNraW5nLiB2YWxpZCB2YWx1ZXMgICAgICAgKi8KKyAgICAvKiAgICAgICAgICAgICAgICAgICBhcmUgMCAobm8gY2hlY2spLCAxLCAyLCA0LCBhbmQgNS4gICAgICAgICAgICAgICAqLworICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogIE1vc3Qgb2YgdGhlIGVuZ2luZSdzIHVzZXJzIHdpbGwgc2FmZWx5IGlnbm9yZSB0aGVzZSBmaWVsZHMuLi4gICAgKi8KKworICAgIFRUX0Jvb2wgICAgICAgICAgaGlnaF9wcmVjaXNpb247ICAvKiBoaWdoIHByZWNpc2lvbiByZW5kZXJpbmcgKi8KKyAgICBUVF9Cb29sICAgICAgICAgIHNlY29uZF9wYXNzOyAgICAgLyogdHdvIHN3ZWVwcyByZW5kZXJpbmcgICAgICovCisgICAgVFRfQ2hhciAgICAgICAgICBkcm9wb3V0X21vZGU7ICAgIC8qIGRyb3BvdXQgbW9kZSAqLworICB9OworCisgIHR5cGVkZWYgc3RydWN0IFRUX091dGxpbmVfICBUVF9PdXRsaW5lOworCisgCisgIC8qIEEgc3RydWN0dXJlIHVzZWQgdG8gcmV0dXJuIGdseXBoIG1ldHJpY3MuICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogVGhlICJiZWFyaW5nWCIgaXNuJ3QgY2FsbGVkICJsZWZ0LXNpZGUgYmVhcmluZyIgYW55bW9yZSBiZWNhdXNlICAgICovCisgIC8qIGl0IGhhcyBkaWZmZXJlbnQgbWVhbmluZ3MgZGVwZW5kaW5nIG9uIHRoZSBnbHlwaCdzIG9yaWVudGF0aW9uLiAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogVGhlIHNhbWUgaXMgdHJ1ZSBmb3IgImJlYXJpbmdZIiwgd2hpY2ggaXMgdGhlIHRvcC1zaWRlIGJlYXJpbmcgICAgICovCisgIC8qIGRlZmluZWQgYnkgdGhlIFRUX1NwZWMsIGkuZS4sIHRoZSBkaXN0YW5jZSBmcm9tIHRoZSBiYXNlbGluZSB0byAgICAqLworICAvKiB0aGUgdG9wIG9mIHRoZSBnbHlwaCdzIGJib3guICBBY2NvcmRpbmcgdG8gb3VyIGN1cnJlbnQgY29udmVudGlvbiwgKi8KKyAgLyogdGhpcyBpcyBhbHdheXMgdGhlIHNhbWUgYXMgImJib3gueU1heCIgYnV0IHdlIG1ha2UgaXQgYXBwZWFyIGZvciAgICovCisgIC8qIGNvbnNpc3RlbmN5IGluIGl0cyBwcm9wZXIgZmllbGQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogVGhlICJhZHZhbmNlIiB3aWR0aCBpcyB0aGUgYWR2YW5jZSB3aWR0aCBmb3IgaG9yaXpvbnRhbCBsYXlvdXQsICAgICovCisgIC8qIGFuZCBhZHZhbmNlIGhlaWdodCBmb3IgdmVydGljYWwgbGF5b3V0cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogRmluYWxseSwgdGhlIGxpYnJhcnkgKHZlci4gMS4xKSBkb2Vzbid0IHN1cHBvcnQgdmVydGljYWwgdGV4dCB5ZXQgICovCisgIC8qIGJ1dCB0aGVzZSBjaGFuZ2VzIHdlcmUgaW50cm9kdWNlZCB0byBhY2NvbW9kYXRlIGl0LCBhcyBpdCB3aWxsICAgICAqLworICAvKiBtb3N0IGNlcnRhaW5seSBiZSBpbnRyb2R1Y2VkIGluIGxhdGVyIHJlbGVhc2VzLiAgICAgICAgICAgICAgICAgICAgKi8KKworICBzdHJ1Y3QgIFRUX0dseXBoX01ldHJpY3NfCisgIHsKKyAgICBUVF9CQm94ICBiYm94OyAgICAgIC8qIGdseXBoIGJvdW5kaW5nIGJveCAqLworCisgICAgVFRfUG9zICAgYmVhcmluZ1g7ICAvKiBsZWZ0LXNpZGUgYmVhcmluZyAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBUVF9Qb3MgICBiZWFyaW5nWTsgIC8qIHRvcC1zaWRlIGJlYXJpbmcsIHBlciBzZSB0aGUgVFQgc3BlYyAqLworCisgICAgVFRfUG9zICAgYWR2YW5jZTsgICAvKiBhZHZhbmNlIHdpZHRoIChvciBoZWlnaHQpICovCisgIH07CisKKworICAvKiBBIHN0cnVjdHVyZSB1c2VkIHRvIHJldHVybiBob3Jpem9udGFsIF9hbmRfIHZlcnRpY2FsIGdseXBoICAgICAgICAgKi8KKyAgLyogbWV0cmljcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBBIGdseXBoIGNhbiBiZSB1c2VkIGVpdGhlciBpbiBhIGhvcml6b250YWwgb3IgdmVydGljYWwgbGF5b3V0LiAgICAgKi8KKyAgLyogSXRzIGdseXBoIG1ldHJpY3MgdmFyeSB3aXRoIG9yaWVudGF0aW9uLiAgVGhlIEJpZ19HbHlwaF9NZXRyaWNzICAgICovCisgIC8qIHN0cnVjdHVyZSBpcyB1c2VkIHRvIHJldHVybiBfYWxsXyBtZXRyaWNzIGluIG9uZSBjYWxsLiAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICBzdHJ1Y3QgVFRfQmlnX0dseXBoX01ldHJpY3NfCisgIHsKKyAgICBUVF9CQm94ICBiYm94OyAgICAgICAgICAvKiBnbHlwaCBib3VuZGluZyBib3ggKi8KKworICAgIFRUX1BvcyAgIGhvcmlCZWFyaW5nWDsgIC8qIGxlZnQgc2lkZSBiZWFyaW5nIGluIGhvcml6b250YWwgbGF5b3V0cyAqLworICAgIFRUX1BvcyAgIGhvcmlCZWFyaW5nWTsgIC8qIHRvcCBzaWRlIGJlYXJpbmcgaW4gaG9yaXpvbnRhbCBsYXlvdXRzICAqLworCisgICAgVFRfUG9zICAgdmVydEJlYXJpbmdYOyAgLyogbGVmdCBzaWRlIGJlYXJpbmcgaW4gdmVydGljYWwgbGF5b3V0cyAqLworICAgIFRUX1BvcyAgIHZlcnRCZWFyaW5nWTsgIC8qIHRvcCBzaWRlIGJlYXJpbmcgaW4gdmVydGljYWwgbGF5b3V0cyAgKi8KKworICAgIFRUX1BvcyAgIGhvcmlBZHZhbmNlOyAgIC8qIGFkdmFuY2Ugd2lkdGggZm9yIGhvcml6b250YWwgbGF5b3V0ICovCisgICAgVFRfUG9zICAgdmVydEFkdmFuY2U7ICAgLyogYWR2YW5jZSBoZWlnaHQgZm9yIHZlcnRpY2FsIGxheW91dCAgKi8KKworICAgIC8qIFRoZSBmb2xsb3dpbmcgZmllbGRzIHJlcHJlc2VudCB1bmhpbnRlZCBzY2FsZWQgbWV0cmljcyB2YWx1ZXMuICovCisgICAgLyogVGhleSBjYW4gYmUgdXNlZnVsIGZvciBhcHBsaWNhdGlvbnMgbmVlZGluZyB0byBkbyBzb21lIGRldmljZSAgKi8KKyAgICAvKiBpbmRlcGVuZGVudCBwbGFjZW1lbnQgb2YgZ2x5cGhzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogQXBwbHlpbmcgdGhlc2UgbWV0cmljcyB0byBoaW50ZWQgZ2x5cGhzIHdpbGwgbW9zdCBzdXJlbHkgcnVpbiAgKi8KKyAgICAvKiB0aGUgZ3JpZCBmaXR0aW5nIHBlcmZvcm1lZCBieSB0aGUgYnl0ZWNvZGUgaW50ZXJwcmV0ZXIuICBUaGVzZSAqLworICAgIC8qIHZhbHVlcyBhcmUgYmV0dGVyIHVzZWQgdG8gY29tcHV0ZSBhY2N1bXVsYXRlZCBwb3NpdGlvbmluZyAgICAgICovCisgICAgLyogZGlzdGFuY2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICAgIFRUX1BvcyAgIGxpbmVhckhvcmlCZWFyaW5nWDsgIC8qIGxpbmVhcmx5IHNjYWxlZCBob3Jpem9udGFsIGxzYiAgICAgKi8KKyAgICBUVF9Qb3MgICBsaW5lYXJIb3JpQWR2YW5jZTsgICAvKiBsaW5lYXJseSBzY2FsZWQgaG9yaXpvbnRhbCBhZHZhbmNlICovCisKKyAgICBUVF9Qb3MgICBsaW5lYXJWZXJ0QmVhcmluZ1k7ICAvKiBsaW5lYXJseSBzY2FsZWQgdmVydGljYWwgdHNiICAgICAqLworICAgIFRUX1BvcyAgIGxpbmVhclZlcnRBZHZhbmNlOyAgIC8qIGxpbmVhcmx5IHNjYWxlZCB2ZXJ0aWNhbCBhZHZhbmNlICovCisgIH07CisKKyAgdHlwZWRlZiBzdHJ1Y3QgVFRfR2x5cGhfTWV0cmljc18gICAgICBUVF9HbHlwaF9NZXRyaWNzOworICB0eXBlZGVmIHN0cnVjdCBUVF9CaWdfR2x5cGhfTWV0cmljc18gIFRUX0JpZ19HbHlwaF9NZXRyaWNzOworCisKKyAgLyogQSBzdHJ1Y3R1cmUgdXNlZCB0byByZXR1cm4gaW5zdGFuY2UgbWV0cmljcy4gKi8KKworICBzdHJ1Y3QgIFRUX0luc3RhbmNlX01ldHJpY3NfCisgIHsKKyAgICBUVF9GMjZEb3Q2ICBwb2ludFNpemU7ICAgICAvKiBjaGFyLiBzaXplIGluIHBvaW50cyAoMXB0ID0gMS83MiBpbmNoKSAqLworCisgICAgVFRfVVNob3J0ICAgeF9wcGVtOyAgICAgICAgLyogaG9yaXpvbnRhbCBwaXhlbHMgcGVyIEVNIHNxdWFyZSAqLworICAgIFRUX1VTaG9ydCAgIHlfcHBlbTsgICAgICAgIC8qIHZlcnRpY2FsIHBpeGVscyBwZXIgRU0gc3F1YXJlICAgKi8KKworICAgIFRUX0ZpeGVkICAgIHhfc2NhbGU7ICAgICAvKiAxNi4xNiB0byBjb252ZXJ0IGZyb20gRU0gdW5pdHMgdG8gMjYuNiBwaXggKi8KKyAgICBUVF9GaXhlZCAgICB5X3NjYWxlOyAgICAgLyogMTYuMTYgdG8gY29udmVydCBmcm9tIEVNIHVuaXRzIHRvIDI2LjYgcGl4ICovCisKKyAgICBUVF9VU2hvcnQgICB4X3Jlc29sdXRpb247ICAvKiBkZXZpY2UgaG9yaXpvbnRhbCByZXNvbHV0aW9uIGluIGRwaSAqLworICAgIFRUX1VTaG9ydCAgIHlfcmVzb2x1dGlvbjsgIC8qIGRldmljZSB2ZXJ0aWNhbCByZXNvbHV0aW9uIGluIGRwaSAgICovCisgIH07CisKKyAgdHlwZWRlZiBzdHJ1Y3QgVFRfSW5zdGFuY2VfTWV0cmljc18gIFRUX0luc3RhbmNlX01ldHJpY3M7CisKKworICAvKiBGbG93IGNvbnN0YW50czogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBUaGUgZmxvdyBvZiBhIGJpdG1hcCByZWZlcnMgdG8gdGhlIHdheSBsaW5lcyBhcmUgb3JpZW50ZWQgICAqLworICAvKiB3aXRoaW4gdGhlIGJpdG1hcCBkYXRhLCBpLmUuLCB0aGUgb3JpZW50YXRpb24gb2YgdGhlIFkgICAgICAqLworICAvKiBjb29yZGluYXRlIGF4aXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgIC8qIEZvciBleGFtcGxlLCBpZiB0aGUgZmlyc3QgYnl0ZXMgb2YgdGhlIGJpdG1hcCBwZXJ0YWluIHRvICAgICovCisgIC8qIGl0cyB0b3AtbW9zdCBsaW5lLCB0aGVuIHRoZSBmbG93IGlzICdkb3duJy4gIElmIHRoZXNlIGJ5dGVzICovCisgIC8qIHBlcnRhaW4gdG8gaXRzIGxvd2VzdCBsaW5lLCB0aGUgdGhlIGZsb3cgaXMgJ3VwJy4gICAgICAgICAgICovCisKKyNkZWZpbmUgVFRfRmxvd19Eb3duICAtMSAgLyogYml0bWFwIGlzIG9yaWVudGVkIGZyb20gdG9wIHRvIGJvdHRvbSAqLworI2RlZmluZSBUVF9GbG93X1VwICAgICAxICAvKiBiaXRtYXAgaXMgb3JpZW50ZWQgZnJvbSBib3R0b20gdG8gdG9wICovCisjZGVmaW5lIFRUX0Zsb3dfRXJyb3IgIDAgIC8qIGFuIGVycm9yIG9jY3VycmVkIGR1cmluZyByZW5kZXJpbmcgICAgKi8KKworCisgIC8qIEEgc3RydWN0dXJlIHVzZWQgdG8gZGVzY3JpYmUgdGhlIHRhcmdldCBiaXRtYXAgb3IgcGl4bWFwIHRvIHRoZSAgICovCisgIC8qIHJlbmRlcmVyLiAgTm90ZSB0aGF0IHRoZXJlIGlzIG5vdGhpbmcgaW4gdGhpcyBzdHJ1Y3R1cmUgdGhhdCAgICAgICovCisgIC8qIGdpdmVzIHRoZSBuYXR1cmUgb2YgdGhlIGJ1ZmZlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgLyogSU1QT1JUQU5UIE5PVEU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICBJbiB0aGUgY2FzZSBvZiBhIHBpeG1hcCwgdGhlICd3aWR0aCcgYW5kICdjb2xzJyBmaWVsZHMgbXVzdCAgICAgKi8KKyAgLyogICBoYXZlIHRoZSBfc2FtZV8gdmFsdWVzLCBhbmQgX211c3RfIGJlIHBhZGRlZCB0byAzMi1iaXRzLCBpLmUuLCAgKi8KKyAgLyogICBiZSBhIG11bHRpcGxlIG9mIDQuICBDbGlwcGluZyBwcm9ibGVtcyB3aWxsIGFyaXNlIG90aGVyd2lzZSwgICAgKi8KKyAgLyogICBpZiBub3QgZXZlbiBwYWdlIGZhdWx0cyEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICBUaGUgdHlwaWNhbCBzZXR0aW5ncyBhcmU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAtIGZvciBhbiBXeEggYml0bWFwOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgcm93cyAgPSBIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgY29scyAgPSAoVys3KS84ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgd2lkdGggPSBXICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgZmxvdyAgPSB5b3VyX2Nob2ljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAtIGZvciBhbiBXeEggcGl4bWFwOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgcm93cyAgPSBIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgY29scyAgPSAoVyszKSAmIH4zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgd2lkdGggPSBjb2xzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgZmxvdyAgPSB5b3VyX2Nob2ljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICBzdHJ1Y3QgIFRUX1Jhc3Rlcl9NYXBfCisgIHsKKyAgICBpbnQgICAgcm93czsgICAgLyogbnVtYmVyIG9mIHJvd3MgICAgICAgICAgICAgICAgICAgICovCisgICAgaW50ICAgIGNvbHM7ICAgIC8qIG51bWJlciBvZiBjb2x1bW5zIChieXRlcykgcGVyIHJvdyAqLworICAgIGludCAgICB3aWR0aDsgICAvKiBudW1iZXIgb2YgcGl4ZWxzIHBlciBsaW5lICAgICAgICAgKi8KKyAgICBpbnQgICAgZmxvdzsgICAgLyogYml0bWFwIG9yaWVudGF0aW9uICAgICAgICAgICAgICAgICovCisKKyAgICB2b2lkKiAgYml0bWFwOyAgLyogYml0L3BpeG1hcCBidWZmZXIgICAgICAgICAgICAgICAgICovCisgICAgbG9uZyAgIHNpemU7ICAgIC8qIGJpdC9waXhtYXAgc2l6ZSBpbiBieXRlcyAgICAgICAgICAqLworICB9OworCisgIHR5cGVkZWYgc3RydWN0IFRUX1Jhc3Rlcl9NYXBfICBUVF9SYXN0ZXJfTWFwOworCisKKworLyogVGhlIGZvbGxvd2luZyB0YWJsZXMgYXJlIGFsc28gZGVmaW5lZCBpbiAiZHJpdmVycy90dGxpYi90dG9ianMuaCIgKi8KKy8qIFdlIHVzZSB0aGUgX1RSVUVUWVBFXyBtYWNybyB0byBwcmV2ZW50IHRoZWlyIHJlZGVmaW5pdGlvbiB3aGVuICAgICovCisvKiBfY29tcGlsaW5nXyB0aGUgYmFja3dhcmRzLWNvbXBhdGlibGUgbGF5ZXIgY2FsbGVkICJvbGRhcGkuYyIgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNpZm5kZWYgX1RSVUVUWVBFXworCisgIC8qIC0tLS0tLS0gVGhlIGZvbnQgaGVhZGVyIFRydWVUeXBlIHRhYmxlIHN0cnVjdHVyZSAtLS0tLSAqLworCisgIHN0cnVjdCAgVFRfSGVhZGVyXworICB7CisgICAgVFRfRml4ZWQgICBUYWJsZV9WZXJzaW9uOworICAgIFRUX0ZpeGVkICAgRm9udF9SZXZpc2lvbjsKKworICAgIFRUX0xvbmcgICAgQ2hlY2tTdW1fQWRqdXN0OworICAgIFRUX0xvbmcgICAgTWFnaWNfTnVtYmVyOworCisgICAgVFRfVVNob3J0ICBGbGFnczsKKyAgICBUVF9VU2hvcnQgIFVuaXRzX1Blcl9FTTsKKworICAgIFRUX0xvbmcgICAgQ3JlYXRlZCBbMl07CisgICAgVFRfTG9uZyAgICBNb2RpZmllZFsyXTsKKworICAgIFRUX0ZXb3JkICAgeE1pbjsKKyAgICBUVF9GV29yZCAgIHlNaW47CisgICAgVFRfRldvcmQgICB4TWF4OworICAgIFRUX0ZXb3JkICAgeU1heDsKKworICAgIFRUX1VTaG9ydCAgTWFjX1N0eWxlOworICAgIFRUX1VTaG9ydCAgTG93ZXN0X1JlY19QUEVNOworCisgICAgVFRfU2hvcnQgICBGb250X0RpcmVjdGlvbjsKKyAgICBUVF9TaG9ydCAgIEluZGV4X1RvX0xvY19Gb3JtYXQ7CisgICAgVFRfU2hvcnQgICBHbHlwaF9EYXRhX0Zvcm1hdDsKKyAgfTsKKworICB0eXBlZGVmIHN0cnVjdCBUVF9IZWFkZXJfICBUVF9IZWFkZXI7CisKKworICAvKiAtLS0tLS0tIFRoZSBob3Jpem9udGFsIGhlYWRlciBUcnVlVHlwZSB0YWJsZSBzdHJ1Y3R1cmUgLS0tLS0gKi8KKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogIFRoaXMgc3RydWN0dXJlIGlzIHRoZSBvbmUgZGVmaW5lZCBieSB0aGUgVHJ1ZVR5cGUgICovCisgIC8qICBzcGVjaWZpY2F0aW9uLCBwbHVzIHR3byBmaWVsZHMgdXNlZCB0byBsaW5rIHRoZSAgICAqLworICAvKiAgZm9udC11bml0cyBtZXRyaWNzIHRvIHRoZSBoZWFkZXIuICAgICAgICAgICAgICAgICAgKi8KKworICBzdHJ1Y3QgIFRUX0hvcml6b250YWxfSGVhZGVyXworICB7CisgICAgVFRfRml4ZWQgICBWZXJzaW9uOworICAgIFRUX0ZXb3JkICAgQXNjZW5kZXI7CisgICAgVFRfRldvcmQgICBEZXNjZW5kZXI7CisgICAgVFRfRldvcmQgICBMaW5lX0dhcDsKKworICAgIFRUX1VGV29yZCAgYWR2YW5jZV9XaWR0aF9NYXg7ICAgICAgLyogYWR2YW5jZSB3aWR0aCBtYXhpbXVtICovCisKKyAgICBUVF9GV29yZCAgIG1pbl9MZWZ0X1NpZGVfQmVhcmluZzsgIC8qIG1pbmltdW0gbGVmdC1zYiAgICAgICAqLworICAgIFRUX0ZXb3JkICAgbWluX1JpZ2h0X1NpZGVfQmVhcmluZzsgLyogbWluaW11bSByaWdodC1zYiAgICAgICovCisgICAgVFRfRldvcmQgICB4TWF4X0V4dGVudDsgICAgICAgICAgICAvKiB4bWF4IGV4dGVudHMgICAgICAgICAgKi8KKyAgICBUVF9GV29yZCAgIGNhcmV0X1Nsb3BlX1Jpc2U7CisgICAgVFRfRldvcmQgICBjYXJldF9TbG9wZV9SdW47CisKKyAgICBUVF9TaG9ydCAgIGNhcmV0X09mZnNldDsgICAgICAgICAgIC8qIG9ubHkgdXNlZCBpbiB2ZXJ0aWNhbCBoZWFkZXIgKi8KKyAgICBUVF9TaG9ydCAgIFJlc2VydmVkWzRdOworCisgICAgVFRfU2hvcnQgICBtZXRyaWNfRGF0YV9Gb3JtYXQ7CisgICAgVFRfVVNob3J0ICBudW1iZXJfT2ZfSE1ldHJpY3M7CisgICAgCisgICAgLyogVGhlIGZvbGxvd2luZyBmaWVsZHMgYXJlIG5vdCBkZWZpbmVkIGJ5IHRoZSBUcnVlVHlwZSBzcGVjaWZpY2F0aW9uICovCisgICAgLyogYnV0IHRoZXkncmUgdXNlZCB0byBjb25uZWN0IHRoZSBtZXRyaWNzIGhlYWRlciB0byB0aGUgcmVsZXZhbnQgICAgICovCisgICAgLyogIkhNVFgiIG9yICJWTVRYIiB0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICB2b2lkKiAgICAgIGxvbmdfbWV0cmljczsKKyAgICB2b2lkKiAgICAgIHNob3J0X21ldHJpY3M7CisgIH07CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogIFRoaXMgc3RydWN0dXJlIGlzIHRoZSBvbmUgZGVmaW5lZCBieSB0aGUgVHJ1ZVR5cGUgICovCisgIC8qICBzcGVjaWZpY2F0aW9uLiAgTm90ZSB0aGF0IGl0IGhhcyBleGFjdGx5IHRoZSBzYW1lICAqLworICAvKiAgbGF5b3V0IGFzIHRoZSBob3Jpem9udGFsIGhlYWRlciAoYm90aCBhcmUgbG9hZGVkICAgKi8KKyAgLyogIGJ5IHRoZSBzYW1lIGZ1bmN0aW9uKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgc3RydWN0ICBUVF9WZXJ0aWNhbF9IZWFkZXJfCisgIHsKKyAgICBUVF9GaXhlZCAgIFZlcnNpb247CisgICAgVFRfRldvcmQgICBBc2NlbmRlcjsKKyAgICBUVF9GV29yZCAgIERlc2NlbmRlcjsKKyAgICBUVF9GV29yZCAgIExpbmVfR2FwOworCisgICAgVFRfVUZXb3JkICBhZHZhbmNlX0hlaWdodF9NYXg7ICAgICAgLyogYWR2YW5jZSBoZWlnaHQgbWF4aW11bSAqLworCisgICAgVFRfRldvcmQgICBtaW5fVG9wX1NpZGVfQmVhcmluZzsgICAgLyogbWluaW11bSBsZWZ0LXNiIG9yIHRvcC1zYiAgICAgICAqLworICAgIFRUX0ZXb3JkICAgbWluX0JvdHRvbV9TaWRlX0JlYXJpbmc7IC8qIG1pbmltdW0gcmlnaHQtc2Igb3IgYm90dG9tLXNiICAgKi8KKyAgICBUVF9GV29yZCAgIHlNYXhfRXh0ZW50OyAgICAgICAgICAgICAvKiB4bWF4IG9yIHltYXggZXh0ZW50cyAgICAgICAgICAgICovCisgICAgVFRfRldvcmQgICBjYXJldF9TbG9wZV9SaXNlOworICAgIFRUX0ZXb3JkICAgY2FyZXRfU2xvcGVfUnVuOworICAgIFRUX0ZXb3JkICAgY2FyZXRfT2Zmc2V0OworCisgICAgVFRfU2hvcnQgICBSZXNlcnZlZFs0XTsKKworICAgIFRUX1Nob3J0ICAgbWV0cmljX0RhdGFfRm9ybWF0OworICAgIFRUX1VTaG9ydCAgbnVtYmVyX09mX1ZNZXRyaWNzOworICAgIAorICAgIC8qIFRoZSBmb2xsb3dpbmcgZmllbGRzIGFyZSBub3QgZGVmaW5lZCBieSB0aGUgVHJ1ZVR5cGUgc3BlY2lmaWNhdGlvbiAqLworICAgIC8qIGJ1dCB0aGV5J3JlIHVzZWQgdG8gY29ubmVjdCB0aGUgbWV0cmljcyBoZWFkZXIgdG8gdGhlIHJlbGV2YW50ICAgICAqLworICAgIC8qICJITVRYIiBvciAiVk1UWCIgdGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgICAgdm9pZCogICAgICBsb25nX21ldHJpY3M7CisgICAgdm9pZCogICAgICBzaG9ydF9tZXRyaWNzOworICB9OworCisKKyAgdHlwZWRlZiBzdHJ1Y3QgVFRfSG9yaXpvbnRhbF9IZWFkZXJfICBUVF9Ib3Jpem9udGFsX0hlYWRlcjsKKyAgdHlwZWRlZiBzdHJ1Y3QgVFRfVmVydGljYWxfSGVhZGVyXyAgICBUVF9WZXJ0aWNhbF9IZWFkZXI7CisKKworICAvKiAtLS0tLS0tLS0tLSBPUy8yIFRhYmxlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyAgc3RydWN0ICBUVF9PUzJfCisgIHsKKyAgICBUVF9VU2hvcnQgIHZlcnNpb247ICAgICAgICAgICAgICAgIC8qIDB4MDAwMSAqLworICAgIFRUX0ZXb3JkICAgeEF2Z0NoYXJXaWR0aDsKKyAgICBUVF9VU2hvcnQgIHVzV2VpZ2h0Q2xhc3M7CisgICAgVFRfVVNob3J0ICB1c1dpZHRoQ2xhc3M7CisgICAgVFRfU2hvcnQgICBmc1R5cGU7CisgICAgVFRfRldvcmQgICB5U3Vic2NyaXB0WFNpemU7CisgICAgVFRfRldvcmQgICB5U3Vic2NyaXB0WVNpemU7CisgICAgVFRfRldvcmQgICB5U3Vic2NyaXB0WE9mZnNldDsKKyAgICBUVF9GV29yZCAgIHlTdWJzY3JpcHRZT2Zmc2V0OworICAgIFRUX0ZXb3JkICAgeVN1cGVyc2NyaXB0WFNpemU7CisgICAgVFRfRldvcmQgICB5U3VwZXJzY3JpcHRZU2l6ZTsKKyAgICBUVF9GV29yZCAgIHlTdXBlcnNjcmlwdFhPZmZzZXQ7CisgICAgVFRfRldvcmQgICB5U3VwZXJzY3JpcHRZT2Zmc2V0OworICAgIFRUX0ZXb3JkICAgeVN0cmlrZW91dFNpemU7CisgICAgVFRfRldvcmQgICB5U3RyaWtlb3V0UG9zaXRpb247CisgICAgVFRfU2hvcnQgICBzRmFtaWx5Q2xhc3M7CisKKyAgICBUVF9CeXRlICAgIHBhbm9zZVsxMF07CisKKyAgICBUVF9VTG9uZyAgIHVsVW5pY29kZVJhbmdlMTsgICAgICAgIC8qIEJpdHMgMC0zMSAgICovCisgICAgVFRfVUxvbmcgICB1bFVuaWNvZGVSYW5nZTI7ICAgICAgICAvKiBCaXRzIDMyLTYzICAqLworICAgIFRUX1VMb25nICAgdWxVbmljb2RlUmFuZ2UzOyAgICAgICAgLyogQml0cyA2NC05NSAgKi8KKyAgICBUVF9VTG9uZyAgIHVsVW5pY29kZVJhbmdlNDsgICAgICAgIC8qIEJpdHMgOTYtMTI3ICovCisKKyAgICBUVF9DaGFyICAgIGFjaFZlbmRJRFs0XTsKKworICAgIFRUX1VTaG9ydCAgZnNTZWxlY3Rpb247CisgICAgVFRfVVNob3J0ICB1c0ZpcnN0Q2hhckluZGV4OworICAgIFRUX1VTaG9ydCAgdXNMYXN0Q2hhckluZGV4OworICAgIFRUX1Nob3J0ICAgc1R5cG9Bc2NlbmRlcjsKKyAgICBUVF9TaG9ydCAgIHNUeXBvRGVzY2VuZGVyOworICAgIFRUX1Nob3J0ICAgc1R5cG9MaW5lR2FwOworICAgIFRUX1VTaG9ydCAgdXNXaW5Bc2NlbnQ7CisgICAgVFRfVVNob3J0ICB1c1dpbkRlc2NlbnQ7CisKKyAgICAvKiBvbmx5IHZlcnNpb24gMSB0YWJsZXM6ICovCisKKyAgICBUVF9VTG9uZyAgIHVsQ29kZVBhZ2VSYW5nZTE7ICAgICAgIC8qIEJpdHMgMC0zMSAgICovCisgICAgVFRfVUxvbmcgICB1bENvZGVQYWdlUmFuZ2UyOyAgICAgICAvKiBCaXRzIDMyLTYzICAqLworICB9OworCisgIHR5cGVkZWYgc3RydWN0IFRUX09TMl8gIFRUX09TMjsKKworCisgIC8qIC0tLS0tLS0tLS0tIFBvc3RzY3JpcHQgdGFibGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyAgc3RydWN0ICBUVF9Qb3N0c2NyaXB0XworICB7CisgICAgVFRfRml4ZWQgIEZvcm1hdFR5cGU7CisgICAgVFRfRml4ZWQgIGl0YWxpY0FuZ2xlOworICAgIFRUX0ZXb3JkICB1bmRlcmxpbmVQb3NpdGlvbjsKKyAgICBUVF9GV29yZCAgdW5kZXJsaW5lVGhpY2tuZXNzOworICAgIFRUX1VMb25nICBpc0ZpeGVkUGl0Y2g7CisgICAgVFRfVUxvbmcgIG1pbk1lbVR5cGU0MjsKKyAgICBUVF9VTG9uZyAgbWF4TWVtVHlwZTQyOworICAgIFRUX1VMb25nICBtaW5NZW1UeXBlMTsKKyAgICBUVF9VTG9uZyAgbWF4TWVtVHlwZTE7CisKKyAgICAvKiBHbHlwaCBuYW1lcyBmb2xsb3cgaW4gdGhlIGZpbGUsIGJ1dCB3ZSBkb24ndCAgICAgICAgICovCisgICAgLyogbG9hZCB0aGVtIGJ5IGRlZmF1bHQuICBTZWUgdGhlIGZ0eHBvc3QuYyBleHRlbnNpb24uICAqLworICB9OworCisgIHR5cGVkZWYgc3RydWN0IFRUX1Bvc3RzY3JpcHRfICBUVF9Qb3N0c2NyaXB0OworCisKKyAgLyogLS0tLS0tLS0tLS0tIGhvcml6b250YWwgZGV2aWNlIG1ldHJpY3MgImhkbXgiIC0tLS0tLS0tLS0gKi8KKworICBzdHJ1Y3QgIFRUX0hkbXhfUmVjb3JkXworICB7CisgICAgVFRfQnl0ZSAgIHBwZW07CisgICAgVFRfQnl0ZSAgIG1heF93aWR0aDsKKyAgICBUVF9CeXRlKiAgd2lkdGhzOworICB9OworCisgIHR5cGVkZWYgc3RydWN0IFRUX0hkbXhfUmVjb3JkXyAgVFRfSGRteF9SZWNvcmQ7CisKKworICBzdHJ1Y3QgIFRUX0hkbXhfCisgIHsKKyAgICBUVF9VU2hvcnQgICAgICAgIHZlcnNpb247CisgICAgVFRfU2hvcnQgICAgICAgICBudW1fcmVjb3JkczsKKyAgICBUVF9IZG14X1JlY29yZCogIHJlY29yZHM7CisgIH07CisKKyAgdHlwZWRlZiBzdHJ1Y3QgVFRfSGRteF8gIFRUX0hkbXg7CisKKworI2Vsc2UKKworICB0eXBlZGVmICBUVF9Ib3JpSGVhZGVyICAgVFRfSG9yaXpvbnRhbF9IZWFkZXI7CisgIHR5cGVkZWYgIFRUX1ZlcnRIZWFkZXIgICBUVF9WZXJ0aWNhbF9IZWFkZXI7CisKKyNlbmRpZiAvKiBfVFJVRVRZUEVfICovCisKKworICAvKiBBIHN0cnVjdHVyZSB1c2VkIHRvIGRlc2NyaWJlIGZhY2UgcHJvcGVydGllcy4gICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBiZSBhd2FyZSB0aGF0IHRoaXMgaXMgbm90IHRoZSBzYW1lIHN0cnVjdHVyZSBhcyB0aGUgb25lIGRlZmluZSAgICAgICAqLworICAvKiBpbiAiZnJlZXR5cGUvdHRsaWIvdHRkcml2ZXIuaCIuIEEgc3VpdGFibGUgY29udmVyc2lvbiBpcyBwZXJmb3JtZWQgICAqLworICAvKiBpbiAib2xkYXBpL3R0YXBpLmMiIHRvIGJ1aWxkIGEgYmluYXJ5IGRyaXZlciB0aGF0IGlzIGJhY2t3YXJkcyAgICAgICAqLworICAvKiBjb21wYXRpYmxlIHdpdGggRnJlZVR5cGUgMS4xLCBpbiB0aGUgZnVuY3Rpb24gVFRfR2V0X0ZhY2VfUHJvcGVydGllcyAqLworCisgIHN0cnVjdCAgVFRfRmFjZV9Qcm9wZXJ0aWVzXworICB7CisgICAgVFRfVVNob3J0ICBudW1fR2x5cGhzOyAgICAgIC8qIG51bWJlciBvZiBnbHlwaHMgaW4gZmFjZSAgICAgICAgICAgICAgKi8KKyAgICBUVF9VU2hvcnQgIG1heF9Qb2ludHM7ICAgICAgLyogbWF4aW11bSBudW1iZXIgb2YgcG9pbnRzIGluIGEgZ2x5cGggICAqLworICAgIFRUX1VTaG9ydCAgbWF4X0NvbnRvdXJzOyAgICAvKiBtYXhpbXVtIG51bWJlciBvZiBjb250b3VycyBpbiBhIGdseXBoICovCisKKyAgICBUVF9VU2hvcnQgIG51bV9DaGFyTWFwczsgICAgLyogbnVtYmVyIG9mIGNoYXJtYXBzIGluIHRoZSBmYWNlICAgICAqLworICAgIFRUX1VTaG9ydCAgbnVtX05hbWVzOyAgICAgICAvKiBudW1iZXIgb2YgbmFtZSByZWNvcmRzIGluIHRoZSBmYWNlICovCisKKyAgICBUVF9VTG9uZyAgIG51bV9GYWNlczsgIC8qIDEgZm9yIG5vcm1hbCBUcnVlVHlwZSBmaWxlcywgYW5kIHRoZSAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBlbWJlZGRlZCBmYWNlcyBmb3IgVHJ1ZVR5cGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbGxlY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICAgIFRUX0hlYWRlciogICAgICAgICAgICAgaGVhZGVyOyAgICAgICAgLyogVHJ1ZVR5cGUgaGVhZGVyIHRhYmxlICAgICAgICAgICovCisgICAgVFRfSG9yaXpvbnRhbF9IZWFkZXIqICBob3Jpem9udGFsOyAgICAvKiBUcnVlVHlwZSBob3Jpem9udGFsIGhlYWRlciAgICAgKi8KKyAgICBUVF9PUzIqICAgICAgICAgICAgICAgIG9zMjsgICAgICAgICAgIC8qIFRydWVUeXBlIE9TLzIgdGFibGUgICAgICAgICAgICAqLworICAgIFRUX1Bvc3RzY3JpcHQqICAgICAgICAgcG9zdHNjcmlwdDsgICAgLyogVHJ1ZVR5cGUgUG9zdHNjcmlwdCB0YWJsZSAgICAgICovCisgICAgVFRfSGRteCogICAgICAgICAgICAgICBoZG14OworICAgIFRUX1ZlcnRpY2FsX0hlYWRlciogICAgdmVydGljYWw7ICAgICAgLyogVFQgVmVydGljYWwgaGVhZGVyLCBpZiBwcmVzZW50ICovCisgIH07CisKKyAgdHlwZWRlZiBzdHJ1Y3QgVFRfRmFjZV9Qcm9wZXJ0aWVzXyAgVFRfRmFjZV9Qcm9wZXJ0aWVzOworCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFR5cGU+IFRUX0VuZ2luZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSBoYW5kbGUgdG8gYSBUcnVlVHlwZSBkcml2ZXIvZW5naW5lIGluc3RhbmNlLiBFbmdpbmUgb2JqZWN0cyAgICAqLworICAvKiAgICBjYW4gYmUgY3JlYXRlZCB3aXRoIHRoZSBUVF9OZXdfRW5naW5lIGFuZCBUVF9CdWlsZF9FbmdpbmUgQVBJcyAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfRG9uZV9FbmdpbmUgd2lsbCBkZXN0cm95IGFuIGVuZ2luZSwgYXMgd2VsbCBhcyBhbGwgdGhlICAgICAgICAqLworICAvKiAgICBvYmplY3RzIHRoYXQgd2VyZSBjcmVhdGVkIHdpdGhpbiBpdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICB0eXBlZGVmIHN0cnVjdCBUVF9FbmdpbmVSZWNfICAgKlRUX0VuZ2luZTsKKworICAvKiBOb3RlIDogVGhlIHR5cGUgVFRfRW5naW5lIGlzIG5vdCBkZWZpbmVkIGluICJkcml2ZXJzL3R0bGliL3R0b2Jqcy5oIiAqLworCisKKworCisvKiBUaGUgVFRfRmFjZSB0eXBlIGlzIGFscmVhZHkgZGVmaW5lZCBpbiAiZHJpdmVycy90dGxpYi90dG9ianMuaCIgICAqLworLyogV2UgdXNlIHRoZSBfVFJVRVRZUEVfIG1hY3JvIHRvIHByZXZlbnQgdGhlaXIgcmVkZWZpbml0aW9uIHdoZW4gICAgKi8KKy8qIF9jb21waWxpbmdfIHRoZSBiYWNrd2FyZHMtY29tcGF0aWJsZSBsYXllciBjYWxsZWQgIm9sZGFwaS5jIiAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2lmbmRlZiBfVFJVRVRZUEVfCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxUeXBlPiBUVF9GYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgaGFuZGxlIHRvIGEgVHJ1ZVR5cGUgZmFjZS9mb250IG9iamVjdC4gQSBUVF9GYWNlIGVuY2Fwc3VsYXRlcyAgKi8KKyAgLyogICAgdGhlIHJlc29sdXRpb24gYW5kIHNjYWxpbmcgaW5kZXBlbmRlbnQgcGFydHMgb2YgYSBUcnVlVHlwZSBmb250ICAqLworICAvKiAgICBmaWxlLiBJbnN0YW5jZXMgKGEuay5hLiBmb250c2l6ZXMpIGFuZCBnbHlwaCBvYmplY3RzIG11c3QgYmUgICAgICovCisgIC8qICAgIGNyZWF0ZWQgZnJvbSB0aGVtIGJlZm9yZSBhIGdseXBoIGNhbiBiZSBsb2FkZWQgaW4gbWVtb3J5LiAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGV5IGFyZSBjcmVhdGVkIHRocm91Z2ggVFRfTmV3X0ZhY2UgYW5kIGRlc3Ryb3llZCB3aXRoICAgICAgICAgICovCisgIC8qICAgIFRUX0RvbmVfRmFjZS4gVGhpcyB3aWxsIGRlc3Ryb3kgYWxsIGluc3RhbmNlIGFuZCBnbHlwaCBvYmplY3RzICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgIHR5cGVkZWYgc3RydWN0IFRUX0ZhY2VSZWNfKiAgIFRUX0ZhY2U7CisKKyNlbmRpZiAgLyogX1RSVUVUWVBFXyAqLworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxUeXBlPiBUVF9JbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgaGFuZGxlIHRvIGEgVHJ1ZVR5cGUgaW5zdGFuY2UvZm9udHNpemUgb2JqZWN0LiBBIFRUX0luc3RhbmNlICAgKi8KKyAgLyogICAgZW5jYXBzdWxhdGVzIGFsbCB0aGUgcmVzb2x1dGlvbiBhbmQgc2NhbGluZyBkZXBlbmRlbnQgcGFydCBvZiAgICAqLworICAvKiAgICBhIGdpdmVuIGZvbnQgc2l6ZSwgYnV0IGRvZXNuJ3QgY29udGFpbiBhbnkgZ2x5cGguIFRoZXkgbXVzdCBiZSAgICovCisgIC8qICAgIHVzZWQgd2l0aCBnbHlwaCBvYmplY3RzIGluIG9yZGVyIHRvIGxvYWQgZ2x5cGggb2JqZWN0cyBmcm9tICAgICAgKi8KKyAgLyogICAgYSBUVCBmaWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoZXkgYXJlIGNyZWF0ZWQgZnJvbSBmYWNlIG9iamVjdHMgd2l0aCBUVF9OZXdfSW5zdGFuY2UsIGFuZCAgICAgKi8KKyAgLyogICAgZGVzdHJveWVkIHdpdGggVFRfRG9uZV9JbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgZnJlc2ggbmV3IGluc3RhbmNlIGhhcyBhIGRlZmF1bHQgcmVzb2x1dGlvbiBvZiA5Nng5NiBkcGksICAgICAgKi8KKyAgLyogICAgYW5kIGEgZGVmYXVsdCBwb2ludCBzaXplIG9mIDEwIHB0LiBFYWNoIG9mIHRoZXNlIGNhbiBiZSBjaGFuZ2VkICAqLworICAvKiAgICBkeW5hbWljYWxseSB3aXRoIHZhcmlvdXMgQVBJcyBkZWZpbmVkIGJlbG93Li4gICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICB0eXBlZGVmIHN0cnVjdCBUVF9JbnN0YW5jZVJlY18qICBUVF9JbnN0YW5jZTsKKworICAvKiBOb3RlOiBUaGUgVFRfSW5zdGFuY2UgdHlwZSBpcyBub3QgZGVmaW5lZCBpbiAiZHJpdmVycy90dGxpYi90dG9ianMuaCIgKi8KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8VHlwZT4gVFRfR2x5cGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBIGhhbmRsZSB0byBhIFRydWVUeXBlIGdseXBoIG9iamVjdC4gQSBnbHlwaCBvYmplY3QgYWN0cyBhcyBhICAgICovCisgIC8qICAgIGNvbnRhaW5lciBmb3IgYW55IG9mIHRoZSBnbHlwaHMgb2YgYSBnaXZlbiBmYWNlIG9iamVjdC4gSXQgICAgICAgKi8KKyAgLyogICAgZW5jYXBzdWxhdGVzIGdseXBoIG1ldHJpY3MgYXMgd2VsbCBhcyBvdXRsaW5lIHNwYWNlIHNpemVkIGxhcmdlICAqLworICAvKiAgICBlbm91Z2ggdG8gYWxsb3cgdGhlIGxvYWRpbmcgb2YgYW55IGdseXBoIHdpdGhvdXQgZnVydGhlciAgICAgICAgICovCisgIC8qICAgIGFsbG9jYXRpb24uIEEgZ2x5cGggb2JqZWN0IGRvZXNuJ3QgY29udGFpbiBhbnkgYml0bWFwIG9yICAgICAgICAgKi8KKyAgLyogICAgcGl4bWFwIGRhdGEvYnVmZmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoZXkgYXJlIGNyZWF0ZWQgZnJvbSBmYWNlIG9iamVjdHMgd2l0aCBUVF9OZXdfR2x5cGgsIGFuZCAgICAgICAgKi8KKyAgLyogICAgZGVzdHJveWVkIHdpdGggVFRfRG9uZV9HbHlwaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIE9uZSBjYW4gY3JlYXRlIHNldmVyYWwgZ2x5cGggb2JqZWN0cyBwZXIgZmFjZSwgYW5kIHVzZSAgICAgICAgICAgKi8KKyAgLyogICAgYSBzaW5nbGUgaW5zdGFuY2UgdG8gbG9hZCBtdWx0aXBsZSBnbHlwaHMsIGV2ZW4gY29uY3VycmVudGx5ICAgICAqLworICAvKiAgICBpbiB0aHJlYWQtc2FmZSBhbmQgcmVlbnRyYW50IG1vZGVzLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICB0eXBlZGVmIHN0cnVjdCBUVF9HbHlwaFJlY18qICAgIFRUX0dseXBoOworCisgIC8qIE5vdGU6IHRoZSBUVF9HbHlwaCB0eXBlIGlzIG5vdCBkZWZpbmVkIGluICJkcml2ZXJzL3R0bGliL3R0b2Jqcy5oIiAqLworCisKKy8qIFRoZSBUVF9DaGFyTWFwIHR5cGUgaXMgYWxyZWFkeSBkZWZpbmVkIGluICJkcml2ZXJzL3R0bGliL3R0b2Jqcy5oIiAqLworLyogV2UgdXNlIHRoZSBfVFJVRVRZUEVfIG1hY3JvIHRvIHByZXZlbnQgdGhlaXIgcmVkZWZpbml0aW9uIHdoZW4gICAgICovCisvKiBfY29tcGlsaW5nXyB0aGUgYmFja3dhcmRzLWNvbXBhdGlibGUgbGF5ZXIgY2FsbGVkICJvbGRhcGkuYyIgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2lmbmRlZiBfVFJVRVRZUEVfCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxUeXBlPiBUVF9DaGFyTWFwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgaGFuZGxlIHRvIGEgVHJ1ZVR5cGUgY2hhcmFjdGVyIG1hcHBpbmcgb2JqZWN0LiBUaGVzZSBvYmplY3RzICAgKi8KKyAgLyogICAgYXJlIHVzZWQgdG8gY29udmVydCBjaGFyYWN0ZXIgY29kZXMgaW4gYSBzcGVjaWZpYyBsb2NhbGUgb3IgICAgICAqLworICAvKiAgICBlbmNvZGluZyBpbnRvIGZvbnQvZmFjZSBnbHlwaCBpbmRleGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhlIGxpc3Qgb2YgY2hhcmFjdGVyIG1hcHMgZm91bmQgd2l0aGluIGEgZmFjZSBjYW4gYmUgICAgICAgICAgICAqLworICAvKiAgICBlbnVtZXJhdGVkIHdpdGggQVBJIGZ1bmN0aW9ucyBkZWZpbmVkIGJlbG93LiBBbiBDaGFyTWFwIG9iamVjdCAgICovCisgIC8qICAgIGlzIGNyZWF0ZWQgd2l0aCBUVF9OZXdfQ2hhck1hcC4gVGhleSBhcmUgZGVzdHJveWVkIGF1dG9tYXRpY2FsbHkgKi8KKyAgLyogICAgd2hlbiB0aGVpciBwYXJlbnQgZmFjZSBvYmplY3RzIGFyZSBkaXNjYXJkZWQuICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgdHlwZWRlZiBzdHJ1Y3QgVFRfQ2hhck1hcFJlY18qICAgVFRfQ2hhck1hcDsKKworICB0eXBlZGVmIGxvbmcgIFRUX0Vycm9yOworCisjZW5kaWYgLyogX1RSVUVUWVBFXyAqLworCisKKworICBFWFBPUlRfREVGCisgIGNvbnN0IFRUX0luc3RhbmNlICAgVFRfTnVsbF9JbnN0YW5jZTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogIFBvc3RzY3JpcHQgTmFtZXMgZXh0ZW5zaW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBUVF9FcnJfSW52YWxpZF9Qb3N0X1RhYmxlX0Zvcm1hdCAgMHgwQjAwCisjZGVmaW5lIFRUX0Vycl9JbnZhbGlkX1Bvc3RfVGFibGUgICAgICAgICAweDBCMDEKKworICAvKiBJbml0aWFsaXNlIHRoZSBQb3N0c2NyaXB0IE5hbWVzIGV4dGVuc2lvbiAqLworICBFWFBPUlRfREVGCisgIFRUX0Vycm9yIFRUX0luaXRfUG9zdF9FeHRlbnNpb24oIFRUX0VuZ2luZSAgZW5naW5lICk7CisKKyAgLyogTG9hZCB0aGUgUG9zdHNjcmlwdCBOYW1lcyB0YWJsZSAtIG5vdGljZSB0aGF0IHRoZSAncG9zdCcgcGFyYW1ldGVyICovCisgIC8qIHdpbGwgYmUgaWdub3JlZCBpbiAyLjAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBFWFBPUlRfREVGCisgIFRUX0Vycm9yIFRUX0xvYWRfUFNfTmFtZXMoIFRUX0ZhY2UgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgcG9zdCApOworCisgIC8qIEdldHMgdGhlIHBvc3RzY3JpcHQgbmFtZSBvZiBhIHNpbmdsZSBnbHlwaCAqLworICBFWFBPUlRfREVGCisgIFRUX0Vycm9yIFRUX0dldF9QU19OYW1lKCBUVF9GYWNlICAgICAgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX1VTaG9ydCAgICBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX1N0cmluZyoqICBQU25hbWUgKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogIEVtYmVkZGVkIEJpdG1hcHMgKHNiaXRzKSBleHRlbnNpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfVFJVRVRZUEVfCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFN0cnVjdD4gVFRfU0JpdF9NZXRyaWNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSBzdHJ1Y3R1cmUgdXNlZCB0byBob2xkIHRoZSBiaWcgbWV0cmljcyBvZiBhIGdpdmVuICAgICovCisgIC8qICAgIGdseXBoIGJpdG1hcCBpbiBhIFRydWVUeXBlIG9yIE9wZW5UeXBlIGZvbnQuIFRoZXNlICAgICAqLworICAvKiAgICBhcmUgdXN1YWxseSBmb3VuZCBpbiB0aGUgIkVCRFQiIHRhYmxlLiAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBoZWlnaHQgICAgICAgOjogZ2x5cGggaGVpZ2h0IGluIHBpeGVscyAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgd2lkdGggICAgICAgIDo6IGdseXBoIHdpZHRoIGluIHBpeGVscyAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBob3JpQmVhcmluZ1ggOjogaG9yaXpvbnRhbCBsZWZ0IGJlYXJpbmcgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgaG9yaUJlYXJpbmdZIDo6IGhvcml6b250YWwgdG9wIGJlYXJpbmcgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGhvcmlBZHZhbmNlICA6OiBob3Jpem9udGFsIGFkdmFuY2UgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgdmVydEJlYXJpbmdYIDo6IHZlcnRpY2FsIGxlZnQgYmVhcmluZyAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHZlcnRCZWFyaW5nWSA6OiB2ZXJ0aWNhbCB0b3AgYmVhcmluZyAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB2ZXJ0QWR2YW5jZSAgOjogdmVydGljYWwgYWR2YW5jZSAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgc3RydWN0IFRUX1NCaXRfTWV0cmljc18KKyAgeworICAgIFRUX0J5dGUgIGhlaWdodDsKKyAgICBUVF9CeXRlICB3aWR0aDsKKworICAgIFRUX0NoYXIgIGhvcmlCZWFyaW5nWDsKKyAgICBUVF9DaGFyICBob3JpQmVhcmluZ1k7CisgICAgVFRfQnl0ZSAgaG9yaUFkdmFuY2U7CisKKyAgICBUVF9DaGFyICB2ZXJ0QmVhcmluZ1g7CisgICAgVFRfQ2hhciAgdmVydEJlYXJpbmdZOworICAgIFRUX0J5dGUgIHZlcnRBZHZhbmNlOworCisgIH0gVFRfU0JpdF9NZXRyaWNzOworCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxTdHJ1Y3Q+IFRUX1NCaXRfU21hbGxfTWV0cmljcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgc3RydWN0dXJlIHVzZWQgdG8gaG9sZCB0aGUgc21hbGwgbWV0cmljcyBvZiBhIGdpdmVuICAqLworICAvKiAgICBnbHlwaCBiaXRtYXAgaW4gYSBUcnVlVHlwZSBvciBPcGVuVHlwZSBmb250LiBUaGVzZSAgICAgKi8KKyAgLyogICAgYXJlIHVzdWFsbHkgZm91bmQgaW4gdGhlICJFQkRUIiB0YWJsZS4gICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgaGVpZ2h0ICAgIDo6IGdseXBoIGhlaWdodCBpbiBwaXhlbHMgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHdpZHRoICAgICA6OiBnbHlwaCB3aWR0aCBpbiBwaXhlbHMgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgYmVhcmluZ1ggIDo6IGxlZnQtc2lkZSBiZWFyaW5nICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGJlYXJpbmdZICA6OiB0b3Atc2lkZSBiZWFyaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBhZHZhbmNlICAgOjogYWR2YW5jZSB3aWR0aCBvciBoZWlnaHQgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgc3RydWN0IFRUX1NCaXRfU21hbGxfTWV0cmljc18KKyAgeworICAgIFRUX0J5dGUgIGhlaWdodDsKKyAgICBUVF9CeXRlICB3aWR0aDsKKworICAgIFRUX0NoYXIgIGJlYXJpbmdYOworICAgIFRUX0NoYXIgIGJlYXJpbmdZOworICAgIFRUX0J5dGUgIGFkdmFuY2U7CisKKyAgfSBUVF9TQml0X1NtYWxsX01ldHJpY3M7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxTdHJ1Y3Q+IFRUX1NCaXRfTGluZV9NZXRyaWNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgc3RydWN0dXJlIHVzZWQgdG8gZGVzY3JpYmUgdGhlIHRleHQgbGluZSBtZXRyaWNzIG9mICAqLworICAvKiAgICBhIGdpdmVuIGJpdG1hcCBzdHJpa2UsIGZvciBlaXRoZXIgYW4gaG9yaXpvbnRhbCBvciAgICAgKi8KKyAgLyogICAgdmVydGljYWwgbGF5b3V0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgYXNjZW5kZXIgIDo6IGFzY2VuZGVyIGluIHBpeGVscyAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGRlc2NlbmRlciA6OiBkZXNjZW5kZXIgaW4gcGl4ZWxzICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBtYXhfd2lkdGggOjogbWF4aW11bSBnbHlwaCB3aWR0aCBpbiBwaXhlbHMgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGNhcmV0X3Nsb3BlX2VudW1lcmF0b3IgIDo6ID8gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBjYXJldF9zbG9wZV9kZW5vbWluYXRvciA6OiA/ICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgY2FyZXRfb2Zmc2V0ICAgICAgICAgICAgOjogPyAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBtaW5fb3JpZ2luX1NCICA6OiA/ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbWluX2FkdmFuY2VfU0IgOjogPyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG1heF9iZWZvcmVfQkwgIDo6ID8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBtaW5fYWZ0ZXJfQkwgICA6OiA/ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgc3RydWN0IFRUX1NCaXRfTGluZV9NZXRyaWNzXworICB7CisgICAgVFRfQ2hhciAgYXNjZW5kZXI7CisgICAgVFRfQ2hhciAgZGVzY2VuZGVyOworICAgIFRUX0J5dGUgIG1heF93aWR0aDsKKyAgICBUVF9DaGFyICBjYXJldF9zbG9wZV9udW1lcmF0b3I7CisgICAgVFRfQ2hhciAgY2FyZXRfc2xvcGVfZGVub21pbmF0b3I7CisgICAgVFRfQ2hhciAgY2FyZXRfb2Zmc2V0OworICAgIFRUX0NoYXIgIG1pbl9vcmlnaW5fU0I7CisgICAgVFRfQ2hhciAgbWluX2FkdmFuY2VfU0I7CisgICAgVFRfQ2hhciAgbWF4X2JlZm9yZV9CTDsKKyAgICBUVF9DaGFyICBtaW5fYWZ0ZXJfQkw7CisgICAgVFRfQ2hhciAgcGFkc1syXTsKKworICB9IFRUX1NCaXRfTGluZV9NZXRyaWNzOworCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxTdHJ1Y3Q+IFRUX1NCaXRfUmFuZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgVHJ1ZVR5cGUvT3BlblR5cGUgc3ViSW5kZXhUYWJsZSBhcyBkZWZpbmVkIGluIHRoZSAgICAqLworICAvKiAgICAiRUJMQyIgb3IgImJsb2MiIHRhYmxlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZmlyc3RfZ2x5cGggIDo6IGZpcnN0IGdseXBoIGluZGV4IGluIHJhbmdlICAgICAgICAgICAgICovCisgIC8qICAgIGxhc3RfZ2x5cGggICA6OiBsYXN0IGdseXBoIGluZGV4IGluIHJhbmdlICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgaW5kZXhfZm9ybWF0IDo6IGZvcm1hdCBvZiBpbmRleCB0YWJsZS4gdmFsaWQgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgYXJlIDEgdG8gNS4gICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgaW1hZ2VfZm9ybWF0IDo6IGZvcm1hdCBvZiAnRUJEVCcgaW1hZ2UgZGF0YSAgICAgICAgICAgICovCisgIC8qICAgIGltYWdlX29mZnNldCA6OiBvZmZzZXQgdG8gaW1hZ2UgZGF0YSBpbiAnRUJEVCcgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgaW1hZ2Vfc2l6ZSAgIDo6IGZvciBpbmRleCBmb3JtYXRzIDIgYW5kIDUuIFRoaXMgaXMgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICB0aGUgc2l6ZSBpbiBieXRlcyBvZiBlYWNoIGdseXBoIGJpdG1hcCAqLworICAvKiAgICAgICAgICAgICAgICAgICAgZ2x5cGggYml0bWFwICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGJpZ19tZXRyaWNzICA6OiBmb3IgaW5kZXggZm9ybWF0cyAyIGFuZCA1LiBUaGlzIGlzICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgdGhlIGJpZyBtZXRyaWNzIGZvciBlYWNoIGdseXBoIGJpdG1hcCAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG51bV9nbHlwaHMgICA6OiBmb3IgaW5kZXggZm9ybWF0cyA0IGFuZCA1LiBUaGlzIGlzICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgdGhlIG51bWJlciBvZiBnbHlwaHMgaW4gdGhlIGNvZGUgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgIGFycmF5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBnbHlwaF9vZmZzZXRzIDo6IGZvciBpbmRleCBmb3JtYXRzIDEgYW5kIDMuICAgICAgICAgICAgKi8KKyAgLyogICAgZ2x5cGhfY29kZXMgICA6OiBmb3IgaW5kZXggZm9ybWF0cyA0IGFuZCA1LiAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB0YWJsZV9vZmZzZXQgIDo6IG9mZnNldCBvZiBpbmRleCB0YWJsZSBpbiAnRUJMQycgdGFibGUgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICBvbmx5IHVzZWQgZHVyaW5nIHN0cmlrZSBsb2FkaW5nLi4gICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHN0cnVjdCBUVF9TQml0X1JhbmdlCisgIHsKKyAgICBUVF9VU2hvcnQgICAgICAgIGZpcnN0X2dseXBoOworICAgIFRUX1VTaG9ydCAgICAgICAgbGFzdF9nbHlwaDsKKworICAgIFRUX1VTaG9ydCAgICAgICAgaW5kZXhfZm9ybWF0OworICAgIFRUX1VTaG9ydCAgICAgICAgaW1hZ2VfZm9ybWF0OworICAgIFRUX1VMb25nICAgICAgICAgaW1hZ2Vfb2Zmc2V0OworCisgICAgVFRfVUxvbmcgICAgICAgICBpbWFnZV9zaXplOworICAgIFRUX1NCaXRfTWV0cmljcyAgbWV0cmljczsKKyAgICBUVF9VTG9uZyAgICAgICAgIG51bV9nbHlwaHM7CisKKyAgICBUVF9VTG9uZyogICAgICAgIGdseXBoX29mZnNldHM7CisgICAgVFRfVVNob3J0KiAgICAgICBnbHlwaF9jb2RlczsKKworICAgIFRUX1VMb25nICAgICAgICAgdGFibGVfb2Zmc2V0OworCisgIH0gVFRfU0JpdF9SYW5nZTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFN0cnVjdD4gVFRfU0JpdF9TdHJpa2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSBzdHJ1Y3R1cmUgdXNlZCBkZXNjcmliZSBhIGdpdmVuIGJpdG1hcCBzdHJpa2UgaW4gdGhlICovCisgIC8qICAgICJFQkxDIiBvciAiYmxvYyIgdGFibGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIG51bV9pbmRleF9yYW5nZXMgIDo6IG51bWJlciBvZiBpbmRleCByYW5nZXMgICAgICAgICAgICAgKi8KKyAgLyogICBpbmRleF9yYW5nZXMgICAgICA6OiBhcnJheSBvZiBnbHlwaCBpbmRleCByYW5nZXMgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIGNvbG9yX3JlZiAgIDo6IHVudXNlZC4gY29sb3IgcmVmZXJlbmNlID8/ICAgICAgICAgICAgICAgKi8KKyAgLyogICBob3JpICAgICAgICA6OiBsaW5lIG1ldHJpY3MgZm9yIGhvcml6b250YWwgbGF5b3V0cy4gICAgICovCisgIC8qICAgdmVydCAgICAgICAgOjogbGluZSBtZXRyaWNzIGZvciB2ZXJ0aWNhbCBsYXlvdXRzLiAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICBzdGFydF9nbHlwaCA6OiBsb3dlc3QgZ2x5cGggaW5kZXggZm9yIHRoaXMgc3RyaWtlLiAgICAgICovCisgIC8qICAgZW5kX2dseXBoICAgOjogaGlnaGVyIGdseXBoIGluZGV4IGZvciB0aGlzIHN0cmlrZS4gICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICB4X3BwZW0gICAgICA6OiBob3Jpem9udGFsIHBpeGVscyBwZXIgRU0gICAgICAgICAgICAgICAgICovCisgIC8qICAgeV9wcGVtICAgICAgOjogdmVydGljYWwgcGl4ZWxzIHBlciBFTSAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIGJpdF9kZXB0aCAgIDo6IGJpdCBkZXB0aC4gdmFsaWQgdmFsdWVzIGFyZSAxLCAyLCA0ICYgOCAgKi8KKyAgLyogICBmbGFncyAgICAgICA6OiB2ZXJ0aWNhbCBvciBob3Jpem9udGFsID8gICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHN0cnVjdCBUVF9TQml0X1N0cmlrZV8KKyAgeworICAgIFRUX0ludCAgICAgICAgICAgICAgICAgbnVtX3JhbmdlczsKKyAgICBUVF9TQml0X1JhbmdlKiAgICAgICAgIHNiaXRfcmFuZ2VzOworICAgIFRUX1VMb25nICAgICAgICAgICAgICAgcmFuZ2VzX29mZnNldDsKKworICAgIFRUX1VMb25nICAgICAgICAgICAgICAgY29sb3JfcmVmOworCisgICAgVFRfU0JpdF9MaW5lX01ldHJpY3MgICBob3JpOworICAgIFRUX1NCaXRfTGluZV9NZXRyaWNzICAgdmVydDsKKworICAgIFRUX1VTaG9ydCAgICAgICAgICAgICAgc3RhcnRfZ2x5cGg7CisgICAgVFRfVVNob3J0ICAgICAgICAgICAgICBlbmRfZ2x5cGg7CisKKyAgICBUVF9CeXRlICAgICAgICAgICAgICAgIHhfcHBlbTsKKyAgICBUVF9CeXRlICAgICAgICAgICAgICAgIHlfcHBlbTsKKyAgICBUVF9CeXRlICAgICAgICAgICAgICAgIGJpdF9kZXB0aDsKKyAgICBUVF9DaGFyICAgICAgICAgICAgICAgIGZsYWdzOworCisgIH0gVFRfU0JpdF9TdHJpa2U7CisKKworCisgIAorICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxTdHJ1Y3Q+IFRUX1NCaXRfQ29tcG9uZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgc2ltcGxlIHN0cnVjdHVyZSB0byBkZXNjcmliZSBhIGNvbXBvdW5kIHNiaXQgZWxlbWVudCAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGdseXBoX2NvZGUgIDo6IGVsZW1lbnQncyBnbHlwaCBpbmRleCAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB4X29mZnNldCAgICA6OiBlbGVtZW50J3MgbGVmdCBiZWFyaW5nICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgeV9vZmZzZXQgICAgOjogZWxlbWVudCdzIHRvcCBiZWFyaW5nICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHN0cnVjdCBUVF9TQml0X0NvbXBvbmVudF8KKyAgeworICAgIFRUX1VTaG9ydCAgZ2x5cGhfY29kZTsKKyAgICBUVF9DaGFyICAgIHhfb2Zmc2V0OworICAgIFRUX0NoYXIgICAgeV9vZmZzZXQ7CisKKyAgfSBUVF9TQml0X0NvbXBvbmVudDsKKworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8U3RydWN0PiBUVF9TQml0X1NjYWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBIHN0cnVjdHVyZSB1c2VkIGRlc2NyaWJlIGEgZ2l2ZW4gYml0bWFwIHNjYWxpbmcgICAgICAgKi8KKyAgLyogICAgdGFibGUsIGFzZGVmaW5lZCBmb3IgdGhlICJFQlNDIiB0YWJsZS4gICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGhvcmkgICA6OiBob3Jpem9udGFsIGxpbmUgbWV0cmljcyAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB2ZXJ0ICAgOjogdmVydGljYWwgbGluZSBtZXRyaWNzICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHhfcHBlbSA6OiBob3Jpem9udGFsIHBpeGVscyBwZXIgRU0gICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB5X3BwZW0gOjogdmVydGljYWwgcGl4ZWxzIHBlciBFTSAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHhfcHBlbV9zdWJzdGl0dXRlICA6OiBzdWJzdGl0dXRpb24geF9wcGVtICAgICAgICAgICAgICAqLworICAvKiAgICB5X3BwZW1fc3Vic3RpdHV0ZSAgOjogc3Vic3RpdHV0aW9uIHlfcHBlbSAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgc3RydWN0IFRUX1NCaXRfU2NhbGVfCisgIHsKKyAgICBUVF9TQml0X0xpbmVfTWV0cmljcyAgaG9yaTsKKyAgICBUVF9TQml0X0xpbmVfTWV0cmljcyAgdmVydDsKKyAgICBUVF9CeXRlICAgICAgICAgICAgICAgeF9wcGVtOworICAgIFRUX0J5dGUgICAgICAgICAgICAgICB5X3BwZW07CisgICAgVFRfQnl0ZSAgICAgICAgICAgICAgIHhfcHBlbV9zdWJzdGl0dXRlOworICAgIFRUX0J5dGUgICAgICAgICAgICAgICB5X3BwZW1fc3Vic3RpdHV0ZTsKKworICB9IFRUX1NCaXRfU2NhbGU7CisjZW5kaWYgLyogX1RSVUVUWVBFXyAqLworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8U3RydWN0PiBUVF9TQml0X0ltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBIHN0cnVjdHVyZSB1c2VkIHRvIGRlc2NyaWJlIGEgZ2l2ZW4gZW1iZWRkZWQgYml0bWFwICAgKi8KKyAgLyogICAgaW1hZ2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbWFwICAgICAgICA6OiBiaXRtYXAgZGVzY3JpcHRvciAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGJpdF9kZXB0aCAgOjogcGl4ZWwgYml0IGRlcHRoICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBtZXRyaWNzICAgIDo6IGdseXBoIG1ldHJpY3MgZm9yIHRoZSBiaXRtYXAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgc3RydWN0IFRUX1NCaXRfSW1hZ2VfCisgIHsKKyAgICBUVF9SYXN0ZXJfTWFwICAgICAgICAgbWFwOworICAgIGludCAgICAgICAgICAgICAgICAgICBiaXRfZGVwdGg7CisgICAgVFRfQmlnX0dseXBoX01ldHJpY3MgIG1ldHJpY3M7CisKKyAgfSBUVF9TQml0X0ltYWdlOworCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxTdHJ1Y3Q+IFRUX0VCTEMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgc3RydWN0dXJlIHVzZWQgdG8gZGVzY3JpYmUgdGhlICJFQkxDIiB0YWJsZSBmcm9tICAgICAqLworICAvKiAgICBhIFRydWVUWXBlIGZvbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgdmVyc2lvbiAgICAgOjogdmVyc2lvbiBudW1iZXIgb2YgdGhlIEVCTEMgdGFibGUgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBudW1fc3RyaWtlcyA6OiB0aGUgbnVtYmVyIG9mIHN0cmlrZXMsIGkuZS4gYml0bWFwICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgc2l6ZXMsIHByZXNlbnQgaW4gdGhpcyBmb250ICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzdHJpa2VzICAgICA6OiBhcnJheSBvZiBzdHJpa2VzICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgc3RydWN0IFRUX0VCTENfCisgIHsKKyAgICBUVF9VTG9uZyAgICAgICAgIHZlcnNpb247CisgICAgVFRfVUxvbmcgICAgICAgICBudW1fc3RyaWtlczsKKyAgICBUVF9TQml0X1N0cmlrZSogIHN0cmlrZXM7CisKKyAgfSBUVF9FQkxDOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfSW5pdF9TQml0X0V4dGVuc2lvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgSW5pdGlhbGlzZSB0aGUgZW1iZWRkZWQgYml0bWFwcyBleHRlbnNpb24gZm9yIHRoZSAgICAgICovCisgIC8qICAgIEZyZWVUeXBlIGVuZ2luZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGVuZ2luZSAgOjogaGFuZGxlIHRvIGN1cnJlbnQgRnJlZVR5cGUgbGlicmFyeSBpbnN0YW5jZSAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEVycm9yIGNvZGUuIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgRVhQT1JUX0RFRgorICBUVF9FcnJvciAgVFRfSW5pdF9TQml0X0V4dGVuc2lvbiggVFRfRW5naW5lICBlbmdpbmUgKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX0dldF9GYWNlX0JpdG1hcHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIExvYWRzIHRoZSAiRUJMQyIgdGFibGUgZnJvbSBhIGZvbnQgZmlsZSwgaWYgYW55LiAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZhY2UgOjogaGFuZGxlIHRvIHRoZSBzb3VyY2UgVHJ1ZVR5cGUgZm9udC9mYWNlICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGVibGNfdGFibGUgOjogYSBkZXNjcmlwdG9yIGZvciB0aGUgRUJMQyB0YWJsZSAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEVycm9yIGNvZGUuIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBUVF9FcnJfVGFibGVfTWlzc2luZyB3aGVuIHRoZSAgICAqLworICAvKiAgICBmb250IGNvbnRhaW5zIG5vIGVtYmVkZGVkIGJpdG1hcHMuIEFsbCBmaWVsZHMgaW4gICAgICAgKi8KKyAgLyogICAgImVibGNfdGFibGUiIHdpbGwgdGhlbiBiZSBzZXQgdG8gMC4gICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBFWFBPUlRfREVGCisgIFRUX0Vycm9yICBUVF9HZXRfRmFjZV9CaXRtYXBzKCBUVF9GYWNlICAgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX0VCTEMgICplYmxjX3RhYmxlICk7CisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfTmV3X1NCaXRfSW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQWxsb2NhdGVzIGEgbmV3IGVtYmVkZGVkIGJpdG1hcCBjb250YWluZXIgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgaW1hZ2UgOjogc2JpdCBpbWFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRXJyb3IgY29kZS4gMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBFWFBPUlRfREVGCisgIFRUX0Vycm9yICBUVF9OZXdfU0JpdF9JbWFnZSggVFRfU0JpdF9JbWFnZSogICppbWFnZSApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfRG9uZV9TQml0X0ltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgUmVsZWFzZXMgYW4gZW1iZWRkZWQgYml0bWFwIGNvbnRhaW5lciAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgaW1hZ2UgOjogc2JpdCBpbWFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBFWFBPUlRfREVGCisgIHZvaWQgICAgICBUVF9Eb25lX1NCaXRfSW1hZ2UoIFRUX1NCaXRfSW1hZ2UqICBpbWFnZSApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfTG9hZF9HbHlwaF9CaXRtYXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgTG9hZHMgYSBnaXZlbiBnbHlwaCBlbWJlZGRlZCBiaXRtYXAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZmFjZSAgICAgICAgOjogaGFuZGxlIHRvIHRoZSBzb3VyY2UgVHJ1ZVR5cGUgZm9udC9mYWNlICovCisgIC8qICAgIGluc3RhbmNlICAgIDo6IGN1cnJlbnQgc2l6ZS90cmFuc2Zvcm0gaW5zdGFuY2UgICAgICAgICAqLworICAvKiAgICBnbHlwaF9pbmRleCA6OiBpbmRleCBvZiBzb3VyY2UgZ2x5cGggICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgYml0bWFwICAgICAgOjogdGFyZ2V0IGVtYmVkZGVkIGJpdG1hcCBkZXNjcmlwdG9yICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRXJyb3IgY29kZS4gMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIGFuIGVycm9yIGlmIHRoZXJlIGlzIG5vICAgICAgICAgICovCisgIC8qICAgIGVtYmVkZGVkIGJpdG1hcCBmb3IgdGhlIGdseXBoIGF0IHRoZSBnaXZlbiAgICAgICAgICAgICAqLworICAvKiAgICBpbnN0YW5jZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEVYUE9SVF9ERUYKKyAgVFRfRXJyb3IgIFRUX0xvYWRfR2x5cGhfQml0bWFwKCBUVF9GYWNlICAgICAgICAgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9JbnN0YW5jZSAgICAgaW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfVVNob3J0ICAgICAgIGdseXBoX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX1NCaXRfSW1hZ2UqICBiaXRtYXAgKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogIEZyZWVUeXBlIEFQSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgQWxsIHRoZXNlIGJlZ2luIHdpdGggYSAnVFRfJyBwcmVmaXguICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICBNb3N0IG9mIHRoZW0gYXJlIGltcGxlbWVudGVkIGluIHRoZSAndHRhcGkuYycgc291cmNlIGZpbGUuICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgLyogSW5pdGlhbGl6ZSB0aGUgZW5naW5lLiAqLworCisgIEVYUE9SVF9ERUYKKyAgVFRfRXJyb3IgIFRUX0luaXRfRnJlZVR5cGUoIFRUX0VuZ2luZSogIGVuZ2luZSApOworCisKKyAgLyogRmluYWxpemUgdGhlIGVuZ2luZSwgYW5kIHJlbGVhc2UgYWxsIGFsbG9jYXRlZCBvYmplY3RzLiAqLworCisgIEVYUE9SVF9ERUYKKyAgVFRfRXJyb3IgIFRUX0RvbmVfRnJlZVR5cGUoIFRUX0VuZ2luZSAgZW5naW5lICk7CisKKworICAvKiBTZXQgdGhlIGdyYXkgbGV2ZWwgcGFsZXR0ZS4gIFRoaXMgaXMgYW4gYXJyYXkgb2YgNSBieXRlcyB1c2VkICovCisgIC8qIHRvIHByb2R1Y2UgdGhlIGZvbnQgc21vb3RoZWQgcGl4bWFwcy4gIEJ5IGNvbnZlbnRpb246ICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgcGFsZXR0ZVswXSA9IGJhY2tncm91bmQgKHdoaXRlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICBwYWxldHRlWzFdID0gbGlnaHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogIHBhbGV0dGVbMl0gPSBtZWRpdW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgcGFsZXR0ZVszXSA9IGRhcmsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICBwYWxldHRlWzRdID0gZm9yZWdyb3VuZCAoYmxhY2spICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgIEVYUE9SVF9ERUYKKyAgVFRfRXJyb3IgIFRUX1NldF9SYXN0ZXJfR3JheV9QYWxldHRlKCBUVF9FbmdpbmUgICAgICAgZW5naW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUX0J5dGUqICBwYWxldHRlICk7CisgIAorCisgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGZhY2UgbWFuYWdlbWVudCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisgIC8qIE9wZW4gYSBuZXcgVHJ1ZVR5cGUgZm9udCBmaWxlLCBhbmQgcmV0dXJucyBhIGhhbmRsZSBmb3IgKi8KKyAgLyogaXQgaW4gdmFyaWFibGUgJypmYWNlJy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgIC8qIE5vdGU6IFRoZSBmaWxlIGNhbiBiZSBlaXRoZXIgYSBUcnVlVHlwZSBmaWxlICgqLnR0Zikgb3IgICovCisgIC8qICAgICAgIGEgVHJ1ZVR5cGUgY29sbGVjdGlvbiAoKi50dGMsIGluIHRoaXMgY2FzZSwgb25seSAgICovCisgIC8qICAgICAgIHRoZSBmaXJzdCBmYWNlIGlzIG9wZW5lZCkuICBUaGUgbnVtYmVyIG9mIGZhY2VzIGluICovCisgIC8qICAgICAgIHRoZSBzYW1lIGNvbGxlY3Rpb24gY2FuIGJlIG9idGFpbmVkIGluIHRoZSBmYWNlJ3MgICovCisgIC8qICAgICAgIHByb3BlcnRpZXMsIHVzaW5nIFRUX0dldF9GYWNlX1Byb3BlcnRpZXMoKSBhbmQgdGhlICovCisgIC8qICAgICAgICdtYXhfRmFjZXMnIGZpZWxkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgRVhQT1JUX0RFRgorICBUVF9FcnJvciAgVFRfT3Blbl9GYWNlKCBUVF9FbmdpbmUgICAgICAgZW5naW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVF9UZXh0KiAgZm9udFBhdGhOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9GYWNlKiAgICAgICAgZmFjZSApOworCisKKyAgLyogT3BlbiBhIFRydWVUeXBlIGZvbnQgZmlsZSBsb2NhdGVkIGluc2lkZSBhIGNvbGxlY3Rpb24uICovCisgIC8qIFRoZSBmb250IGlzIGFzc2lnbmVkIGJ5IGl0cyBpbmRleCBpbiAnZm9udEluZGV4Jy4gICAgICAqLworCisgIEVYUE9SVF9ERUYKKyAgVFRfRXJyb3IgIFRUX09wZW5fQ29sbGVjdGlvbiggVFRfRW5naW5lICAgICAgIGVuZ2luZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFRfVGV4dCogIGNvbGxlY3Rpb25QYXRoTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfVUxvbmcgICAgICAgIGZvbnRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfRmFjZSogICAgICAgIGZhY2UgKTsKKworCisgIC8qIFJldHVybiBmYWNlIHByb3BlcnRpZXMgaW4gdGhlICdwcm9wZXJ0aWVzJyBzdHJ1Y3R1cmUuICovCisKKyAgRVhQT1JUX0RFRgorICBUVF9FcnJvciAgVFRfR2V0X0ZhY2VfUHJvcGVydGllcyggVFRfRmFjZSAgICAgICAgICAgICAgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX0ZhY2VfUHJvcGVydGllcyogIHByb3BlcnRpZXMgKTsKKworCisgIC8qIFNldCBhIGZhY2Ugb2JqZWN0J3MgZ2VuZXJpYyBwb2ludGVyICovCisKKyAgRVhQT1JUX0RFRgorICBUVF9FcnJvciAgVFRfU2V0X0ZhY2VfUG9pbnRlciggVFRfRmFjZSAgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqICAgIGRhdGEgKTsKKworCisgIC8qIEdldCBhIGZhY2Ugb2JqZWN0J3MgZ2VuZXJpYyBwb2ludGVyICovCisKKyAgRVhQT1JUX0RFRgorICB2b2lkKiAgICAgVFRfR2V0X0ZhY2VfUG9pbnRlciggVFRfRmFjZSAgZmFjZSApOworCisKKyAgLyogQ2xvc2UgYSBmYWNlJ3MgZmlsZSBoYW5kbGUgdG8gc2F2ZSBzeXN0ZW0gcmVzb3VyY2VzLiAgVGhlIGZpbGUgKi8KKyAgLyogd2lsbCBiZSByZS1vcGVuZWQgYXV0b21hdGljYWxseSBvbiB0aGUgbmV4dCBkaXNrIGFjY2Vzcy4gICAgICAgKi8KKworICBFWFBPUlRfREVGCisgIFRUX0Vycm9yICBUVF9GbHVzaF9GYWNlKCBUVF9GYWNlICBmYWNlICk7CisKKyAgLyogR2V0IGEgZmFjZSdzIGdseXBoIG1ldHJpY3MgZXhwcmVzc2VkIGluIGZvbnQgdW5pdHMuICBSZXR1cm5zIGFueSAgICovCisgIC8qIG51bWJlciBvZiBhcnJheXMuICBTZXQgdGhlIGZpZWxkcyB0byBOVUxMIGlmIHlvdSdyZSBub3QgaW50ZXJlc3RlZCAqLworICAvKiBieSBhIGdpdmVuIGFycmF5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICBFWFBPUlRfREVGCisgIFRUX0Vycm9yICBUVF9HZXRfRmFjZV9NZXRyaWNzKCBUVF9GYWNlICAgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfVVNob3J0ICAgZmlyc3RHbHlwaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX1VTaG9ydCAgIGxhc3RHbHlwaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX1Nob3J0KiAgIGxlZnRCZWFyaW5ncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX1VTaG9ydCogIHdpZHRocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX1Nob3J0KiAgIHRvcEJlYXJpbmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfVVNob3J0KiAgaGVpZ2h0cyApOworCisgIC8qIENsb3NlIGEgZ2l2ZW4gZm9udCBvYmplY3QsIGRlc3Ryb3lpbmcgYWxsIGFzc29jaWF0ZWQgKi8KKyAgLyogaW5zdGFuY2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgIEVYUE9SVF9ERUYKKyAgVFRfRXJyb3IgIFRUX0Nsb3NlX0ZhY2UoIFRUX0ZhY2UgIGZhY2UgKTsKKworCisgIC8qIEdldCBmb250IG9yIHRhYmxlIGRhdGEuICovCisKKyAgRVhQT1JUX0RFRgorICBUVF9FcnJvciAgVFRfR2V0X0ZvbnRfRGF0YSggVFRfRmFjZSAgIGZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9VTG9uZyAgdGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfTG9uZyAgIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9Mb25nKiAgbGVuZ3RoICk7CisKKworLyogQSBzaW1wbGUgbWFjcm8gdG8gYnVpbGQgdGFibGUgdGFncyBmcm9tIEFTQ0lJIGNoYXJzICovCisKKyNkZWZpbmUgTUFLRV9UVF9UQUcoIF94MSwgX3gyLCBfeDMsIF94NCApIFwKKyAgICAgICAgICAoKChUVF9VTG9uZylfeDEgPDwgMjQpIHwgICAgICAgIFwKKyAgICAgICAgICAgKChUVF9VTG9uZylfeDIgPDwgMTYpIHwgICAgICAgIFwKKyAgICAgICAgICAgKChUVF9VTG9uZylfeDMgPDwgOCkgIHwgICAgICAgIFwKKyAgICAgICAgICAgIChUVF9VTG9uZylfeDQpCisKKworCisgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGluc3RhbmNlIG1hbmFnZW1lbnQgLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworICAvKiBPcGVuIGEgbmV3IGZvbnQgaW5zdGFuY2UgYW5kIHJldHVybnMgYW4gaW5zdGFuY2UgaGFuZGxlICovCisgIC8qIGZvciBpdCBpbiAnKmluc3RhbmNlJy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICBFWFBPUlRfREVGCisgIFRUX0Vycm9yICBUVF9OZXdfSW5zdGFuY2UoIFRUX0ZhY2UgICAgICAgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfSW5zdGFuY2UqICBpbnN0YW5jZSApOworCisKKyAgLyogU2V0IGRldmljZSByZXNvbHV0aW9uIGZvciBhIGdpdmVuIGluc3RhbmNlLiAgVGhlIHZhbHVlcyBhcmUgICAgICAqLworICAvKiBnaXZlbiBpbiBkcGkgKERvdHMgUGVyIEluY2gpLiAgRGVmYXVsdCBpcyA5NiBpbiBib3RoIGRpcmVjdGlvbnMuICovCisKKyAgRVhQT1JUX0RFRgorICBUVF9FcnJvciAgVFRfU2V0X0luc3RhbmNlX1Jlc29sdXRpb25zKCBUVF9JbnN0YW5jZSAgaW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX1VTaG9ydCAgICB4UmVzb2x1dGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfVVNob3J0ICAgIHlSZXNvbHV0aW9uICk7CisKKworICAvKiBTZXQgdGhlIHBvaW50c2l6ZSBmb3IgYSBnaXZlbiBpbnN0YW5jZS4gIERlZmF1bHQgaXMgMTBwdC4gKi8KKworICBFWFBPUlRfREVGCisgIFRUX0Vycm9yICBUVF9TZXRfSW5zdGFuY2VfQ2hhclNpemUoIFRUX0luc3RhbmNlICBpbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfRjI2RG90NiAgIGNoYXJTaXplICk7CisKKyAgRVhQT1JUX0RFRgorICBUVF9FcnJvciAgVFRfU2V0X0luc3RhbmNlX0NoYXJTaXplcyggVFRfSW5zdGFuY2UgIGluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfRjI2RG90NiAgIGNoYXJXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX0YyNkRvdDYgICBjaGFySGVpZ2h0ICk7CisKKyNkZWZpbmUgVFRfU2V0X0luc3RhbmNlX1BvaW50U2l6ZSggaW5zLCBwdHNpemUgKSAgIFwKKyAgICAgICAgICAgIFRUX1NldF9JbnN0YW5jZV9DaGFyU2l6ZSggaW5zLCBwdHNpemUqNjQgKQorCisgIEVYUE9SVF9ERUYKKyAgVFRfRXJyb3IgIFRUX1NldF9JbnN0YW5jZV9QaXhlbFNpemVzKCBUVF9JbnN0YW5jZSAgaW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfVVNob3J0ICAgIHBpeGVsV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfVVNob3J0ICAgIHBpeGVsSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX0YyNkRvdDYgICBwb2ludFNpemUgKTsKKworCisgIC8qIFRoaXMgZnVuY3Rpb24gaGFzIGJlZW4gZGVwcmVjYXRlZCAhISBEbyBub3QgdXNlIGl0LCBhcyBpdCAgICAqLworICAvKiBkb2Vzbid0IHdvcmsgcmVsaWFibHkuIFlvdSBjYW4gcGVyZmVjdGx5IGNvbnRyb2wgaGludGluZyAgICAgKi8KKyAgLyogeW91cnNlbGYgd2hlbiBsb2FkaW5nIGdseXBocywgdGhlbiBhcHBseSB0cmFuc2Zvcm1zIGFzIHVzdWFsICovCisKKyAgRVhQT1JUX0RFRgorICBUVF9FcnJvciAgVFRfU2V0X0luc3RhbmNlX1RyYW5zZm9ybV9GbGFncyggVFRfSW5zdGFuY2UgIGluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfQm9vbCAgICAgIHJvdGF0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9Cb29sICAgICAgc3RyZXRjaGVkICk7CisKKworICAvKiBSZXR1cm4gaW5zdGFuY2UgbWV0cmljcyBpbiAnbWV0cmljcycuICovCisKKyAgRVhQT1JUX0RFRgorICBUVF9FcnJvciAgVFRfR2V0X0luc3RhbmNlX01ldHJpY3MoIFRUX0luc3RhbmNlICAgICAgICAgICBpbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9JbnN0YW5jZV9NZXRyaWNzKiAgbWV0cmljcyApOworCisKKyAgLyogU2V0IGFuIGluc3RhbmNlJ3MgZ2VuZXJpYyBwb2ludGVyLiAqLworCisgIEVYUE9SVF9ERUYKKyAgVFRfRXJyb3IgIFRUX1NldF9JbnN0YW5jZV9Qb2ludGVyKCBUVF9JbnN0YW5jZSAgaW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICAgIGRhdGEgKTsKKworCisgIC8qIEdldCBhbiBpbnN0YW5jZSdzIGdlbmVyaWMgcG9pbnRlci4gKi8KKworICBFWFBPUlRfREVGCisgIHZvaWQqICAgICBUVF9HZXRfSW5zdGFuY2VfUG9pbnRlciggVFRfSW5zdGFuY2UgIGluc3RhbmNlICk7CisKKworICAvKiBDbG9zZSBhIGdpdmVuIGluc3RhbmNlIG9iamVjdCwgZGVzdHJveWluZyBhbGwgYXNzb2NpYXRlZCBkYXRhLiAqLworCisgIEVYUE9SVF9ERUYKKyAgVFRfRXJyb3IgIFRUX0RvbmVfSW5zdGFuY2UoIFRUX0luc3RhbmNlICBpbnN0YW5jZSApOworCisKKworICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBnbHlwaCBtYW5hZ2VtZW50IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyAgLyogQ3JlYXRlIGEgbmV3IGdseXBoIG9iamVjdCByZWxhdGVkIHRvIHRoZSBnaXZlbiAnZmFjZScuICovCisKKyAgRVhQT1JUX0RFRgorICBUVF9FcnJvciAgVFRfTmV3X0dseXBoKCBUVF9GYWNlICAgIGZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX0dseXBoKiAgZ2x5cGggKTsKKworCisgIC8qIERpc2NhcmQgKGFuZCBkZXN0cm95KSBhIGdpdmVuIGdseXBoIG9iamVjdC4gKi8KKworICBFWFBPUlRfREVGCisgIFRUX0Vycm9yICBUVF9Eb25lX0dseXBoKCBUVF9HbHlwaCAgZ2x5cGggKTsKKworCisjZGVmaW5lIFRUTE9BRF9TQ0FMRV9HTFlQSCAgMQorI2RlZmluZSBUVExPQURfSElOVF9HTFlQSCAgIDIKKworI2RlZmluZSBUVExPQURfREVGQVVMVCAgKFRUTE9BRF9TQ0FMRV9HTFlQSCB8IFRUTE9BRF9ISU5UX0dMWVBIKQorCisKKyAgLyogTG9hZCBhbmQgcHJvY2VzcyAoc2NhbGUvdHJhbnNmb3JtIGFuZCBoaW50KSBhIGdseXBoIGZyb20gdGhlICovCisgIC8qIGdpdmVuICdpbnN0YW5jZScuICBUaGUgZ2x5cGggYW5kIGluc3RhbmNlIGhhbmRsZXMgbXVzdCBiZSAgICAqLworICAvKiByZWxhdGVkIHRvIHRoZSBzYW1lIGZhY2Ugb2JqZWN0LiAgVGhlIGdseXBoIGluZGV4IGNhbiBiZSAgICAgKi8KKyAgLyogY29tcHV0ZWQgd2l0aCBhIGNhbGwgdG8gVFRfQ2hhcl9JbmRleCgpLiAgICAgICAgICAgICAgICAgICAgICovCisKKyAgLyogVGhlICdsb2FkX2ZsYWdzJyBhcmd1bWVudCBpcyBhIGNvbWJpbmF0aW9uIG9mIHRoZSBtYWNyb3MgICAgICovCisgIC8qIFRUTE9BRF9TQ0FMRV9HTFlQSCBhbmQgVFRMT0FEX0hJTlRfR0xZUEguICBIaW50aW5nIHdpbGwgYmUgICAqLworICAvKiBhcHBsaWVkIG9ubHkgaWYgdGhlIHNjYWxpbmcgaXMgc2VsZWN0ZWQuICAgICAgICAgICAgICAgICAgICAgKi8KKworICAvKiBXaGVuIHNjYWxpbmcgaXMgb2ZmIChpLmUuLCBsb2FkX2ZsYWdzID0gMCksIHRoZSByZXR1cm5lZCAgICAgKi8KKyAgLyogb3V0bGluZXMgYXJlIGluIEVNIHNxdWFyZSBjb29yZGluYXRlcyAoYWxzbyBjYWxsZWQgRlVuaXRzKSwgICovCisgIC8qIGV4dHJhY3RlZCBkaXJlY3RseSBmcm9tIHRoZSBmb250IHdpdGggbm8gaGludGluZy4gICAgICAgICAgICAqLworICAvKiBPdGhlciBnbHlwaCBtZXRyaWNzIGFyZSBhbHNvIGluIEZVbml0cy4gICAgICAgICAgICAgICAgICAgICAgKi8KKworICAvKiBXaGVuIHNjYWxpbmcgaXMgb24sIHRoZSByZXR1cm5lZCBvdXRsaW5lcyBhcmUgaW4gZnJhY3Rpb25hbCAgKi8KKyAgLyogcGl4ZWwgdW5pdHMgKGkuZS4gVFRfRjI2RG90NiA9IDI2LjYgZml4ZWQgZmxvYXRzKS4gICAgICAgICAgICovCisKKyAgLyogTk9URTogIFRoZSBnbHlwaCBpbmRleCBtdXN0IGJlIGluIHRoZSByYW5nZSAwLi5udW1fZ2x5cGhzLTEgICovCisgIC8qICAgICAgICB3aGVyZSAnbnVtX2dseXBocycgaXMgdGhlIHRvdGFsIG51bWJlciBvZiBnbHlwaHMgaW4gICAqLworICAvKiAgICAgICAgdGhlIGZvbnQgZmlsZSAoZ2l2ZW4gaW4gdGhlIGZhY2UgcHJvcGVydGllcykuICAgICAgICAgKi8KKworICBFWFBPUlRfREVGCisgIFRUX0Vycm9yICBUVF9Mb2FkX0dseXBoKCBUVF9JbnN0YW5jZSAgaW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9HbHlwaCAgICAgZ2x5cGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9VU2hvcnQgICAgZ2x5cGhJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX1VTaG9ydCAgICBsb2FkRmxhZ3MgKTsKKworCisgIC8qIFJldHVybiBnbHlwaCBvdXRsaW5lIHBvaW50ZXJzIGluICdvdXRsaW5lJy4gIE5vdGUgdGhhdCB0aGUgcmV0dXJuZWQgKi8KKyAgLyogcG9pbnRlcnMgYXJlIG93bmVkIGJ5IHRoZSBnbHlwaCBvYmplY3QsIGFuZCB3aWxsIGJlIGRlc3Ryb3llZCB3aXRoICAqLworICAvKiBpdC4gIFRoZSBjbGllbnQgYXBwbGljYXRpb24gc2hvdWxkIF9ub3RfIGNoYW5nZSB0aGUgcG9pbnRlcnMuICAgICAgICovCisgIAorICBFWFBPUlRfREVGCisgIFRUX0Vycm9yICBUVF9HZXRfR2x5cGhfT3V0bGluZSggVFRfR2x5cGggICAgIGdseXBoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX091dGxpbmUqICBvdXRsaW5lICk7CisKKworICAvKiBDb3B5IHRoZSBnbHlwaCBtZXRyaWNzIGludG8gJ21ldHJpY3MnLiAqLworCisgIEVYUE9SVF9ERUYKKyAgVFRfRXJyb3IgIFRUX0dldF9HbHlwaF9NZXRyaWNzKCBUVF9HbHlwaCAgICAgICAgICAgZ2x5cGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfR2x5cGhfTWV0cmljcyogIG1ldHJpY3MgKTsKKworCisgIC8qIENvcHkgdGhlIGdseXBoJ3MgYmlnIG1ldHJpY3MgaW50byAnbWV0cmljcycuICovCisgIC8qIE5lY2Vzc2FyeSB0byBvYnRhaW4gdmVydGljYWwgbWV0cmljcy4gICAgICAgICovCisKKyAgRVhQT1JUX0RFRgorICBUVF9FcnJvciAgVFRfR2V0X0dseXBoX0JpZ19NZXRyaWNzKCBUVF9HbHlwaCAgICAgICAgICAgICAgIGdseXBoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9CaWdfR2x5cGhfTWV0cmljcyogIG1ldHJpY3MgKTsKKworCisgIC8qIFJlbmRlciB0aGUgZ2x5cGggaW50byBhIGJpdG1hcCwgd2l0aCBnaXZlbiBwb3NpdGlvbiBvZmZzZXRzLiAgICAgKi8KKworICAvKiAgTm90ZTogIE9ubHkgdXNlIGludGVnZXIgcGl4ZWwgb2Zmc2V0cyB0byBwcmVzZXJ2ZSB0aGUgZmluZSAgICAgICovCisgIC8qICAgICAgICAgaGludGluZyBvZiB0aGUgZ2x5cGggYW5kIHRoZSAnY29ycmVjdCcgYW50aS1hbGlhc2luZyAgICAgKi8KKyAgLyogICAgICAgICAod2hlcmUgdmVydGljYWwgYW5kIGhvcml6b250YWwgc3RlbXMgYXJlbid0IGdyYXllZCkuICAgICAqLworICAvKiAgICAgICAgIFRoaXMgbWVhbnMgdGhhdCB4T2Zmc2V0IGFuZCB5T2Zmc2V0IG11c3QgYmUgbXVsdGlwbGVzICAgICovCisgIC8qICAgICAgICAgb2YgNjQhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICBFWFBPUlRfREVGCisgIFRUX0Vycm9yICBUVF9HZXRfR2x5cGhfQml0bWFwKCBUVF9HbHlwaCAgICAgICAgZ2x5cGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9SYXN0ZXJfTWFwKiAgbWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfRjI2RG90NiAgICAgIHhPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9GMjZEb3Q2ICAgICAgeU9mZnNldCApOworCisKKyAgLyogUmVuZGVyIHRoZSBnbHlwaCBpbnRvIGEgcGl4bWFwLCB3aXRoIGdpdmVuIHBvc2l0aW9uIG9mZnNldHMuICAgICAqLworCisgIC8qICBOb3RlIDogT25seSB1c2UgaW50ZWdlciBwaXhlbCBvZmZzZXRzIHRvIHByZXNlcnZlIHRoZSBmaW5lICAgICAgKi8KKyAgLyogICAgICAgICBoaW50aW5nIG9mIHRoZSBnbHlwaCBhbmQgdGhlICdjb3JyZWN0JyBhbnRpLWFsaWFzaW5nICAgICAqLworICAvKiAgICAgICAgICh3aGVyZSB2ZXJ0aWNhbCBhbmQgaG9yaXpvbnRhbCBzdGVtcyBhcmVuJ3QgZ3JheWVkKS4gICAgICovCisgIC8qICAgICAgICAgVGhpcyBtZWFucyB0aGF0IHhPZmZzZXQgYW5kIHlPZmZzZXQgbXVzdCBiZSBtdWx0aXBsZXMgICAgKi8KKyAgLyogICAgICAgICBvZiA2NCEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgIEVYUE9SVF9ERUYKKyAgVFRfRXJyb3IgIFRUX0dldF9HbHlwaF9QaXhtYXAoIFRUX0dseXBoICAgICAgICBnbHlwaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX1Jhc3Rlcl9NYXAqICBtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9GMjZEb3Q2ICAgICAgeE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX0YyNkRvdDYgICAgICB5T2Zmc2V0ICk7CisKKworCisgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIG91dGxpbmUgc3VwcG9ydCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworICAvKiBBbGxvY2F0ZSBhIG5ldyBvdXRsaW5lLiAgUmVzZXJ2ZSBzcGFjZSBmb3IgJ251bVBvaW50cycgYW5kICovCisgIC8qICdudW1Db250b3VycycuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICBFWFBPUlRfREVGCisgIFRUX0Vycm9yICBUVF9OZXdfT3V0bGluZSggVFRfVVNob3J0ICAgIG51bVBvaW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9TaG9ydCAgICAgbnVtQ29udG91cnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfT3V0bGluZSogIG91dGxpbmUgKTsKKworCisgIC8qIFJlbGVhc2UgYW4gb3V0bGluZS4gKi8KKworICBFWFBPUlRfREVGCisgIFRUX0Vycm9yICBUVF9Eb25lX091dGxpbmUoIFRUX091dGxpbmUqICBvdXRsaW5lICk7CisKKworICAvKiBDb3B5IGFuIG91dGxpbmUgaW50byBhbm90aGVyIG9uZS4gKi8KKworICBFWFBPUlRfREVGCisgIFRUX0Vycm9yICBUVF9Db3B5X091dGxpbmUoIFRUX091dGxpbmUqICBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX091dGxpbmUqICB0YXJnZXQgKTsKKworCisgIC8qIFJlbmRlciBhbiBvdXRsaW5lIGludG8gYSBiaXRtYXAuICovCisKKyAgRVhQT1JUX0RFRgorICBUVF9FcnJvciAgVFRfR2V0X091dGxpbmVfQml0bWFwKCBUVF9FbmdpbmUgICAgICAgZW5naW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9PdXRsaW5lKiAgICAgb3V0bGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfUmFzdGVyX01hcCogIG1hcCApOworCisKKyAgLyogUmVuZGVyIGFuIG91dGxpbmUgaW50byBhIHBpeG1hcCAtLSBub3RlIHRoYXQgdGhpcyBmdW5jdGlvbiB1c2VzICovCisgIC8qIGEgZGlmZmVyZW50IHBpeGVsIHNjYWxlLCB3aGVyZSAxLjAgcGl4ZWxzID0gMTI4ICAgICAgICAgICBYWFhYICAqLworCisgIEVYUE9SVF9ERUYKKyAgVFRfRXJyb3IgIFRUX0dldF9PdXRsaW5lX1BpeG1hcCggVFRfRW5naW5lICAgICAgIGVuZ2luZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfT3V0bGluZSogICAgIG91dGxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX1Jhc3Rlcl9NYXAqICBtYXAgKTsKKworCisgIC8qIFJldHVybiBhbiBvdXRsaW5lJ3MgYm91bmRpbmcgYm94IC0tIHRoaXMgZnVuY3Rpb24gaXMgc2xvdyBhcyBpdCAqLworICAvKiBwZXJmb3JtcyBhIGNvbXBsZXRlIHNjYW4tbGluZSBwcm9jZXNzLCB3aXRob3V0IGRyYXdpbmcsIHRvIGdldCAgKi8KKyAgLyogdGhlIG1vc3QgYWNjdXJhdGUgdmFsdWVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhYWFggICovCisKKyAgRVhQT1JUX0RFRgorICBUVF9FcnJvciAgVFRfR2V0X091dGxpbmVfQkJveCggVFRfT3V0bGluZSogIG91dGxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9CQm94KiAgICAgYmJveCApOworCisKKyAgLyogQXBwbHkgYSB0cmFuc2Zvcm1hdGlvbiB0byBhIGdseXBoIG91dGxpbmUuICovCisKKyAgRVhQT1JUX0RFRgorICB2b2lkICAgICAgVFRfVHJhbnNmb3JtX091dGxpbmUoIFRUX091dGxpbmUqICBvdXRsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX01hdHJpeCogICBtYXRyaXggKTsKKworCisgIC8qIEFwcGx5IGEgdHJhbnNsYXRpb24gdG8gYSBnbHlwaCBvdXRsaW5lLiAqLworCisgIEVYUE9SVF9ERUYKKyAgdm9pZCAgICAgIFRUX1RyYW5zbGF0ZV9PdXRsaW5lKCBUVF9PdXRsaW5lKiAgb3V0bGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9GMjZEb3Q2ICAgeE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9GMjZEb3Q2ICAgeU9mZnNldCApOworCisKKyAgLyogQXBwbHkgYSB0cmFuc2Zvcm1hdGlvbiB0byBhIHZlY3Rvci4gKi8KKworICBFWFBPUlRfREVGCisgIHZvaWQgICAgICBUVF9UcmFuc2Zvcm1fVmVjdG9yKCBUVF9GMjZEb3Q2KiAgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX0YyNkRvdDYqICB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfTWF0cml4KiAgIG1hdHJpeCApOworCisKKyAgLyogTXVsdGlwbHkgYSBtYXRyaXggd2l0aCBhbm90aGVyIC0tIGNvbXB1dGVzICJiIDo9IGEqYiIuICovCisKKyAgRVhQT1JUX0RFRgorICB2b2lkICAgICAgVFRfTWF0cml4X011bHRpcGx5KCBUVF9NYXRyaXgqICBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9NYXRyaXgqICBiICk7CisgICAgICAgICAgICAgICAgIAorCisgIC8qIEludmVydCBhIHRyYW5zZm9ybWF0aW9uIG1hdHJpeC4gKi8KKworICBFWFBPUlRfREVGCisgIFRUX0Vycm9yICBUVF9NYXRyaXhfSW52ZXJ0KCBUVF9NYXRyaXgqICBtYXRyaXggKTsKKworCisgIC8qIENvbXB1dGUgQSpCL0Mgd2l0aCA2NCBiaXRzIGludGVybWVkaWF0ZSBwcmVjaXNpb24uICovCisKKyAgRVhQT1JUX0RFRgorICBUVF9Mb25nICAgVFRfTXVsRGl2KCBUVF9Mb25nIEEsIFRUX0xvbmcgQiwgVFRfTG9uZyBDICk7CisKKyAgCisgIC8qIENvbXB1dGUgQSpCLzB4MTAwMDAgd2l0aCA2NCBiaXRzIGludGVybWVkaWF0ZSBwcmVjaXNpb24uICovCisgIC8qIFVzZWZ1bCB0byBtdWx0aXBseSBieSBhIDE2LjE2IGZpeGVkIGZsb2F0IHZhbHVlLiAgICAgICAgICovCisKKyAgRVhQT1JUX0RFRgorICBUVF9Mb25nICAgVFRfTXVsRml4KCBUVF9Mb25nIEEsIFRUX0xvbmcgQiApOworCisKKworICAvKiAtLS0tLS0tLS0tLS0tLS0tLSBjaGFyYWN0ZXIgbWFwcGluZ3Mgc3VwcG9ydCAtLS0tLS0tLS0tLS0tICovCisKKyAgLyogUmV0dXJuIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVyIG1hcHBpbmdzIGZvdW5kIGluIHRoaXMgZmlsZS4gKi8KKyAgLyogUmV0dXJucyAtMSBpbiBjYXNlIG9mIGZhaWx1cmUgKGludmFsaWQgZmFjZSBoYW5kbGUpLiAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogRE9OJ1QgVVNFIFRISVMgRlVOQ1RJT04hIElUIEhBUyBCRUVOIERFUFJFQ0FURUQhICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogSXQgaXMgcmV0YWluZWQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IG9ubHkgYW5kIHdpbGwgICAgKi8KKyAgLyogZmFpbCBvbiAxNmJpdCBzeXN0ZW1zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogWW91IGNhbiBub3cgZ2V0IHRoZSBjaGFybWFwIGNvdW50IGluIHRoZSAibnVtX0NoYXJNYXBzIiAgICAgKi8KKyAgLyogZmllbGQgb2YgYSBmYWNlJ3MgcHJvcGVydGllcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICBFWFBPUlRfREVGCisgIGludCAgVFRfR2V0X0NoYXJNYXBfQ291bnQoIFRUX0ZhY2UgIGZhY2UgKTsKKworCisgIC8qIFJldHVybiB0aGUgSUQgb2YgY2hhcm1hcCBudW1iZXIgJ2NoYXJtYXBJbmRleCcgb2YgYSBnaXZlbiBmYWNlICovCisgIC8qIHVzZWQgdG8gZW51bWVyYXRlIHRoZSBjaGFybWFwcyBwcmVzZW50IGluIGEgVHJ1ZVR5cGUgZmlsZS4gICAgICovCisKKyAgRVhQT1JUX0RFRgorICBUVF9FcnJvciAgVFRfR2V0X0NoYXJNYXBfSUQoIFRUX0ZhY2UgICAgIGZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfVVNob3J0ICAgY2hhcm1hcEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX1VTaG9ydCogIHBsYXRmb3JtSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfVVNob3J0KiAgZW5jb2RpbmdJRCApOworCisKKyAgLyogTG9vayB1cCB0aGUgY2hhcmFjdGVyIG1hcHMgZm91bmQgaW4gJ2ZhY2UnIGFuZCByZXR1cm4gYSBoYW5kbGUgKi8KKyAgLyogZm9yIHRoZSBvbmUgbWF0Y2hpbmcgJ3BsYXRmb3JtSUQnIGFuZCAncGxhdGZvcm1FbmNvZGluZ0lEJyAgICAgKi8KKyAgLyogKHNlZSB0aGUgVHJ1ZVR5cGUgc3BlY3MgcmVsYXRpbmcgdG8gdGhlICdjbWFwJyB0YWJsZSBmb3IgICAgICAgKi8KKyAgLyogaW5mb3JtYXRpb24gb24gdGhlc2UgSUQgbnVtYmVycykuICBSZXR1cm5zIGFuIGVycm9yIGNvZGUuICAgICAgKi8KKyAgLyogSW4gY2FzZSBvZiBmYWlsdXJlLCB0aGUgaGFuZGxlIGlzIHNldCB0byBOVUxMIGFuZCBpcyBpbnZhbGlkLiAgKi8KKworICBFWFBPUlRfREVGCisgIFRUX0Vycm9yICBUVF9HZXRfQ2hhck1hcCggVFRfRmFjZSAgICAgIGZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfVVNob3J0ICAgIGNoYXJtYXBJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9DaGFyTWFwKiAgY2hhck1hcCApOworCisKKyAgLyogVHJhbnNsYXRlIGEgY2hhcmFjdGVyIGNvZGUgdGhyb3VnaCBhIGdpdmVuIGNoYXJhY3RlciBtYXAgICAqLworICAvKiBhbmQgcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIGdseXBoIGluZGV4IHRvIGJlIHVzZWQgaW4gICAgICovCisgIC8qIGEgVFRfTG9hZF9HbHlwaCBjYWxsLiAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIDAgaW4gY2FzZSBvZiAgKi8KKyAgLyogZmFpbHVyZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgIEVYUE9SVF9ERUYKKyAgVFRfVVNob3J0ICBUVF9DaGFyX0luZGV4KCBUVF9DaGFyTWFwICBjaGFyTWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX1VTaG9ydCAgIGNoYXJDb2RlICk7CisKKworCisgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSBuYW1lcyB0YWJsZSBzdXBwb3J0IC0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworICAvKiBSZXR1cm4gdGhlIG51bWJlciBvZiBuYW1lIHN0cmluZ3MgZm91bmQgaW4gdGhlIG5hbWUgdGFibGUuICAqLworICAvKiBSZXR1cm5zIC0xIGluIGNhc2Ugb2YgZmFpbHVyZSAoaW52YWxpZCBmYWNlIGhhbmRsZSkuICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBET04nVCBVU0UgVEhJUyBGVU5DVElPTiEgSVQgSEFTIEJFRU4gREVQUkVDQVRFRCEgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBJdCBpcyByZXRhaW5lZCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgb25seSBhbmQgd2lsbCAgICAqLworICAvKiBmYWlsIG9uIDE2Yml0IHN5c3RlbXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBZb3UgY2FuIG5vdyBnZXQgdGhlIG51bWJlciBvZiBuYW1lIHN0cmluZ3MgaW4gYSBmYWNlIHdpdGggICAqLworICAvKiB0aGUgIm51bV9OYW1lcyIgZmllbGQgb2YgaXRzIHByb3BlcnRpZXMuLiAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgIEVYUE9SVF9ERUYKKyAgaW50ICBUVF9HZXRfTmFtZV9Db3VudCggVFRfRmFjZSAgZmFjZSApOworCisKKyAgLyogUmV0dXJuIHRoZSBJRCBvZiB0aGUgbmFtZSBudW1iZXIgJ25hbWVJbmRleCcgb2YgYSBnaXZlbiBmYWNlICovCisgIC8qIHVzZWQgdG8gZW51bWVyYXRlIHRoZSBjaGFybWFwcyBwcmVzZW50IGluIGEgVHJ1ZVR5cGUgZmlsZS4gICAqLworCisgIEVYUE9SVF9ERUYKKyAgVFRfRXJyb3IgIFRUX0dldF9OYW1lX0lEKCBUVF9GYWNlICAgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX1VTaG9ydCAgIG5hbWVJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9VU2hvcnQqICBwbGF0Zm9ybUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX1VTaG9ydCogIGVuY29kaW5nSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfVVNob3J0KiAgbGFuZ3VhZ2VJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9VU2hvcnQqICBuYW1lSUQgKTsKKworCisgIC8qIFJldHVybiB0aGUgYWRkcmVzcyBhbmQgbGVuZ3RoIG9mIHRoZSBuYW1lIG51bWJlciAnbmFtZUluZGV4JyAqLworICAvKiBvZiBhIGdpdmVuIGZhY2UuICBUaGUgc3RyaW5nIGlzIHBhcnQgb2YgdGhlIGZhY2Ugb2JqZWN0IGFuZCAgKi8KKyAgLyogc2hvdWxkbid0IGJlIHdyaXR0ZW4gdG8gb3IgcmVsZWFzZWQuICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgLyogTm90ZSB0aGF0IGlmIGZvciBhbiBpbnZhbGlkIHBsYXRmb3JtSUQgYSBudWxsIHBvaW50ZXIgd2lsbCAgICovCisgIC8qIGJlIHJldHVybmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgIEVYUE9SVF9ERUYKKyAgVFRfRXJyb3IgIFRUX0dldF9OYW1lX1N0cmluZyggVFRfRmFjZSAgICAgIGZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX1VTaG9ydCAgICBuYW1lSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX1N0cmluZyoqICBzdHJpbmdQdHIsIC8qIHBvaW50ZXIgYWRkcmVzcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9VU2hvcnQqICAgbGVuZ3RoICk7ICAvKiBzdHJpbmcgbGVuZ3RoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MgKi8KKworIAorCisjaWZkZWYgX19jcGx1c3BsdXMKKyAgfQorI2VuZGlmCisKKyNlbmRpZiAvKiBUUlVFVFlQRV9IICovCisKKworLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvb2xkYXBpL3R0YXBpLmMgYi9zcmMvb2xkYXBpL3R0YXBpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWUzMWYwMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9vbGRhcGkvdHRhcGkuYwpAQCAtMCwwICsxLDIyNjcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIHR0YXBpLmMgICAgCisgKgorICogICAgSGlnaC1sZXZlbCBpbnRlcmZhY2UgaW1wbGVtZW50YXRpb24KKyAqCisgKiAgQ29weXJpZ2h0IDE5OTYtMTk5OCBieQorICogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlIAorICogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKiAgTm90ZXM6CisgKgorICogICAgVGhpcyBmaWxlIGlzIHVzZWQgdG8gaW1wbGVtZW50IG1vc3Qgb2YgdGhlIGZ1bmN0aW9ucyB0aGF0IGFyZQorICogICAgZGVmaW5lZCBpbiB0aGUgZmlsZSAiZnJlZXR5cGUuaCIuIEhvd2V2ZXIsIHR3byBmdW5jdGlvbnMgYXJlCisgKiAgICBpbXBsZW1lbnRlZCBlbHNld2hlcmUgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGZyZWV0eXBlLmg+CisKKyNpbmNsdWRlIDxmdGRlYnVnLmg+CisjaW5jbHVkZSA8ZnRzdHJlYW0uaD4KKyNpbmNsdWRlIDxmdGNhbGMuaD4KKyNpbmNsdWRlIDxmdGxpc3QuaD4KKyNpbmNsdWRlIDxmdHJhc3Rlci5oPgorCisjaW5jbHVkZSA8dHRkcml2ZXIuaD4KKyNpbmNsdWRlIDx0dG9ianMuaD4KKyNpbmNsdWRlIDx0dGNtYXAuaD4KKworI2RlZmluZSBfVFJVRVRZUEVfCisjaW5jbHVkZSA8dHJ1ZXR5cGUuaD4gIC8qIGJhY2t3YXJkcyBjb21wYXRpYmxlIGludGVyZmFjZSAqLworCisKKworLyogcmVxdWlyZWQgYnkgdGhlIHRyYWNpbmcgbW9kZSAqLworI3VuZGVmICBGVF9DT01QT05FTlQKKyNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV90dGFwaQorCisKKyNkZWZpbmUgUkVOREVSX1BPT0xfU0laRSAgNjQwMDAKKworICBzdGF0aWMKKyAgY29uc3QgRlRfRHJpdmVySW50ZXJmYWNlKiAgdHRfaW50ZXJmYWNlID0gJnR0X2RyaXZlcl9pbnRlcmZhY2U7CisgIAorICBzdGF0aWMKKyAgY29uc3QgVFRfRHJpdmVySW50ZXJmYWNlKiAgdHRfZXh0ZW5zaW9uID0gJnR0X2Zvcm1hdF9pbnRlcmZhY2U7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiBUVF9Jbml0X0ZyZWVUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQ3JlYXRlcyBhIG5ldyBUcnVlVHlwZSBkcml2ZXIvZW5naW5lIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZW5naW5lICAgOjogIGhhbmRsZSB0byB0aGUgbmV3IGVuZ2luZSBvYmplY3QgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVHJ1ZVR5cGUgZXJyb3IgY29kZS4gMCBtZWFucyBzdWNjZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxNVC1Ob3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgTm8uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhpcyBmdW5jdGlvbiBpcyBwcm92aWRlZCBmb3Igc3RhbmQtYWxvbmUgY29tcGlsZXMgb2YgdGhlICAgICAgICAqLworICAvKiAgICBUcnVlVHlwZSBkcml2ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICBFWFBPUlRfRlVOQworICBUVF9FcnJvciAgVFRfSW5pdF9GcmVlVHlwZSggVFRfRW5naW5lKiAgZW5naW5lICkKKyAgeworICAgIEZUX0xpYnJhcnkgbGlicmFyeTsKKyAgICBGVF9TeXN0ZW0gIHN5c3RlbTsKKyAgICBUVF9FcnJvciAgIGVycm9yOworCisgICAgKmVuZ2luZSA9IDA7CisKKyAgICBlcnJvciA9IEZUX05ld19TeXN0ZW0oICZzeXN0ZW0gKTsKKyAgICBpZiAoZXJyb3IpIHJldHVybiBlcnJvcjsKKyAgICAKKyAgICBlcnJvciA9IEZUX05ld19MaWJyYXJ5KCBzeXN0ZW0sICZsaWJyYXJ5ICk7CisgICAgaWYgKCFlcnJvcikKKyAgICAgIC8qIE5vdyBjcmVhdGUgYSBuZXcgVHJ1ZVR5cGUgZHJpdmVyIG9iamVjdCAqLworICAgICAgZXJyb3IgPSBGVF9BZGRfRHJpdmVyKCBsaWJyYXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfRHJpdmVySW50ZXJmYWNlKikmdHRfZHJpdmVyX2ludGVyZmFjZSApOworICAgIGlmIChlcnJvcikKKyAgICAgIEZUX0RvbmVfTGlicmFyeShsaWJyYXJ5KTsKKyAgICBlbHNlCisgICAgICAqZW5naW5lID0gKFRUX0VuZ2luZSlsaWJyYXJ5OworCisgICAgcmV0dXJuIGVycm9yOworICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiBUVF9Eb25lX0ZyZWVUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRGVzdHJveXMgYSBnaXZlbiBUcnVlVHlwZSBlbmdpbmUgb2JqZWN0IGNyZWF0ZWQgd2l0aCAgICAgICAgICAgICAqLworICAvKiAgICBUVF9Jbml0X0ZyZWVUeXBlLiBBbGwgYXNzb2NpYXRlZCBvYmplY3RzLCAoaS5lLiBmYWNlcywgb3V0bGluZXMgICovCisgIC8qICAgIGFuZCBjaGFybWFwcykgd2lsbCBiZSBkZXN0cm95ZWQuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGVuZ2luZSAgIDo6IGhhbmRsZSB0byB0aGUgZW5naW5lIG9iamVjdCAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRydWVUeXBlIGVycm9yIGNvZGUuIDAgbWVhbnMgc3VjY2VzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8TVQtTm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIE5vLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoaXMgZnVuY3Rpb24gaXMgcHJvdmlkZWQgZm9yIHN0YW5kLWFsb25lIGNvbXBpbGVzIG9mIHRoZSAgICAgICAgKi8KKyAgLyogICAgVHJ1ZVR5cGUgZHJpdmVyLiBUaGUgRnJlZVR5cGUgbGlicmFyeSB1c2VzIHRoZSBUVF9Eb25lX0VuZ2luZSAgICAqLworICAvKiAgICBBUEkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICBFWFBPUlRfRlVOQworICBUVF9FcnJvciAgVFRfRG9uZV9GcmVlVHlwZSggVFRfRW5naW5lICBlbmdpbmUgKQorICB7CisgICAgRlRfTGlicmFyeSAgbGlicmFyeSA9IChGVF9MaWJyYXJ5KWVuZ2luZTsKKworICAgIEZUX0RvbmVfRnJlZVR5cGUoIGxpYnJhcnkgKTsKKyAgICByZXR1cm4gRlRfRXJyX09rOworICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiBUVF9TZXRfUmFzdGVyX0dyYXlfUGFsZXR0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgU2V0cyB0aGUgcmFzdGVyJ3MgZ3JheSA1LWxldmVscyBwYWxldHRlLiBFbnRyeSAwIGNvcnJlc3BvbmQgdG8gICAqLworICAvKiAgICB0aGUgYmFja2dyb3VuZCwgRW50cnkgNCB0byB0aGUgZm9yZWdyb3VuZC4gSW50ZXJtZWRpYXRlIGVudHJpZXMgICovCisgIC8qICAgIGNvcnJlc3BvbmQgdG8gZ3JheSBsZXZlbHMuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGVuZ2luZSAgIDo6IGhhbmRsZSB0byB0aGUgZW5naW5lIG9iamVjdCAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgcGFsZXR0ZSAgOjogYW4gYXJyYXkgb2YgNSBieXRlcyB1c2VkIHRvIHJlbmRlciA4LWJpdCBwaXhtYXBzICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVHJ1ZVR5cGUgZXJyb3IgY29kZS4gMCBtZWFucyBzdWNjZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxNVC1Ob3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgTm8uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhpcyBmdW5jdGlvbiBpcyBwcm92aWRlZCBmb3Igc3RhbmQtYWxvbmUgY29tcGlsZXMgb2YgdGhlICAgICAgICAqLworICAvKiAgICBUcnVlVHlwZSBkcml2ZXIuIFRoZSBGcmVlVHlwZSBsaWJyYXJ5IGFjY2Vzc2VzIGRpcmVjdGx5IHRoZSAgICAgICovCisgIC8qICAgIHJhc3RlciBvYmplY3QgdG8gc2V0IHRoZSBwYWxldHRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGlzIGZ1bmN0aW9uIE9OTFkgc3VwcG9ydHMgNSBsZXZlbHMgb2YgZ3JheXMuICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICBFWFBPUlRfRlVOQworICBUVF9FcnJvciAgVFRfU2V0X1Jhc3Rlcl9HcmF5X1BhbGV0dGUoIFRUX0VuZ2luZSAgICAgICBlbmdpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFRfQnl0ZSogIHBhbGV0dGUgKQorICB7ICAKKyAgICBGVF9MaWJyYXJ5ICBsaWJyYXJ5OworICAgIAorICAgIGlmICghZW5naW5lKQorICAgICAgcmV0dXJuIFRUX0Vycl9JbnZhbGlkX0VuZ2luZTsKKyAgICAKKyAgICBsaWJyYXJ5ID0gKEZUX0xpYnJhcnkpZW5naW5lOworICAgIHJldHVybiBGVF9TZXRfUmFzdGVyX1BhbGV0dGUoIGxpYnJhcnksIDUsICh1bnNpZ25lZCBjaGFyKilwYWxldHRlICk7CisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+IFRUX09wZW5fRmFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBDcmVhdGVzIGEgbmV3IGZhY2Ugb2JqZWN0IGZyb20gYSBnaXZlbiByZXNvdXJjZS4gVGhlIGZpbGUgY2FuICAgICovCisgIC8qICAgIGJlIGVpdGhlciBhIFRydWVUeXBlIGZpbGUgKHR0Zikgb3IgYSBUcnVlVHlwZSBjb2xsZWN0aW9uICh0dGMpLiAgKi8KKyAgLyogICAgSW4gdGhlIGxhdHRlciBjYXNlLCBvbmx5IHRoZSBmaXJzdCBmYWNlIGlzIG9wZW5lZC4gVGhlIG51bWJlciAgICAqLworICAvKiAgICBvZiBmYWNlcyBpbiBhIGNvbGxlY3Rpb24gY2FuIGJlIG9idGFpbmVkIGluIHRoZSBmYWNlJ3MgICAgICAgICAgICovCisgIC8qICAgIHByb3BlcnRpZXMgZmllbGQgIm51bV9GYWNlcyIuIE90aGVyIGZhY2VzIGNhbiBiZSBvcGVuZWQgd2l0aCAgICAgKi8KKyAgLyogICAgVFRfT3Blbl9Db2xsZWN0aW9uIChzZWUgYmVsb3cpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZW5naW5lICAgIDo6IHRoZSBwYXJlbnQgZW5naW5lIG9iamVjdCB3aGVyZSB0byBjcmVhdGUgdGhlIGZhY2UgICAqLworICAvKiAgICAgICAgICAgICAgICAgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgcGF0aG5hbWUgIDo6IHBhdGhuYW1lIGZvciB0aGUgZm9udCBmaWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZmFjZSAgICAgIDo6IGEgaGFuZGxlIHRvIHRoZSBmcmVzaCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVHJ1ZVR5cGUgZXJyb3IgY29kZS4gMCBtZWFucyBzdWNjZXNzLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxNVC1Ob3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgWWVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhpcyBBUEkgaXMgcHJvdmlkZWQgZnJvIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LiBQbGVhc2UgdXNlICAgICAqLworICAvKiAgICB0aGUgZnVuY3Rpb25zIFRUX05ld19GYWNlL1RUX0RvbmVfRmFjZSBub3cgdG8gY3JlYXRlIGFuZCAgICAgICAgICovCisgIC8qICAgIGRpc2NhcmQgZmFjZSBvYmplY3RzLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisKKyAgICAgICAgc3RhdGljCisgICAgICAgIFRUX0Vycm9yICBvcGVuX2ZhY2UoIEZUX0xpYnJhcnkgICAgICBsaWJyYXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVF9UZXh0KiAgcGF0aG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX0ludCAgICAgICAgICBmYWNlX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9GYWNlICAgICAgICAqYWZhY2UgKQorICAgICAgICB7CisgICAgICAgICAgVFRfRXJyb3IgICAgZXJyb3I7CisgICAgICAgICAgRlRfUmVzb3VyY2UgcmVzb3VyY2U7CisgICAgICAKKyAgICAgICAgICAqYWZhY2UgPSAwOworICAgICAgCisgICAgICAgICAgZXJyb3IgPSBGVF9OZXdfUmVzb3VyY2UoIGxpYnJhcnksIHBhdGhuYW1lLCAmcmVzb3VyY2UgKTsKKyAgICAgICAgICBpZiAoZXJyb3IpIHJldHVybiBlcnJvcjsKKworI2lmIDAgICAgICAKKyAgICAgICAgICBlcnJvciA9IEZUX0FkZF9SZXNvdXJjZSggbGlicmFyeSwgcmVzb3VyY2UgKTsKKyAgICAgICAgICBpZiAoZXJyb3IpIGdvdG8gRmFpbF9JbnN0YWxsOworI2VuZGlmCisgICAgICAgICAgZXJyb3IgPSBGVF9OZXdfRmFjZSggcmVzb3VyY2UsIGZhY2VfaW5kZXgsIChGVF9GYWNlKilhZmFjZSApOworCisgICAgICAgICAgLyogRGVzdHJveSBnbHlwaCBzbG90IHRvIGNvbXBseSB3aXRoIHRoZSAxLnggQVBJICovCisgICAgICAgICAgaWYgKCFlcnJvcikKKyAgICAgICAgICAgIEZUX0RvbmVfR2x5cGhTbG90KCAoKmFmYWNlKS0+cm9vdC5zbG90ICk7CisgICAgICAKKyAgICAgICAgICBpZiAoZXJyb3IpCisgICAgICAgICAgICBGVF9Eb25lX1Jlc291cmNlKHJlc291cmNlKTsKKyAgICAgIAorICAgICAgICAgIHJldHVybiBlcnJvcjsKKyAgICAgICAgfQorCisKKyAgRVhQT1JUX0RFRgorICBUVF9FcnJvciAgVFRfT3Blbl9GYWNlKCBUVF9FbmdpbmUgICAgICBlbmdpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUX1RleHQqIHBhdGhuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9GYWNlKiAgICAgICBhZmFjZSApCisgIHsKKyAgICBpZiAoIWVuZ2luZSkKKyAgICAgIHJldHVybiBUVF9FcnJfSW52YWxpZF9Ecml2ZXJfSGFuZGxlOworCisgICAgcmV0dXJuICBvcGVuX2ZhY2UoIChGVF9MaWJyYXJ5KWVuZ2luZSwgcGF0aG5hbWUsIDAsIGFmYWNlICk7CisgIH0KKyAgCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gVFRfT3Blbl9Db2xsZWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIExvYWRzIGEgZ2l2ZW4gZmFjZSB3aXRoaW4gYSBjb2xsZWN0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGVuZ2luZSAgICA6OiBUcnVlVHlwZSBlbmdpbmUgb2JqZWN0IHdoZXJlIHRvIGxvYWQgdGhlIGZhY2UgICAgICAgKi8KKyAgLyogICAgcGF0aG5hbWUgIDo6IHRoZSBjb2xsZWN0aW9uJ3MgcGF0aG5hbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBmb250SW5kZXggOjogaW5kZXggb2YgZmFjZSB3aXRoaW4gdGhlIGNvbGxlY3Rpb24uIGZpcnN0IGlzIDAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBmYWNlICAgICAgOjogaGFuZGxlIHRvIHRoZSBuZXcgZmFjZSBvYmplY3QuIEFsd2F5cyBzZXQgdG8gTlVMTCAgICovCisgIC8qICAgICAgICAgICAgICAgICBpbiBjYXNlIG9mIGVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUcnVlVHlwZSBlcnJvciBjb2RlLiAwIG1lYW5zIHN1Y2Nlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE1ULU5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBZZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGlzIEFQSSBpcyBwcm92aWRlZCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuIFBsZWFzZSB1c2UgICAgICovCisgIC8qICAgIHRoZSBmdW5jdGlvbnMgVFRfTmV3X0NvbGxlY3Rpb24vVFRfRG9uZV9GYWNlIG5vdyB0byBjcmVhdGUgYW5kICAgKi8KKyAgLyogICAgZGlzY2FyZCBmYWNlL2NvbGxlY3Rpb24gb2JqZWN0cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgRVhQT1JUX0RFRgorICBUVF9FcnJvciAgVFRfT3Blbl9Db2xsZWN0aW9uKCBUVF9FbmdpbmUgICAgICAgZW5naW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVF9UZXh0KiAgcGF0aG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX1VMb25nICAgICAgICBmb250SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX0ZhY2UqICAgICAgICBhZmFjZSApCisgIHsKKyAgICBpZiAoIWVuZ2luZSkKKyAgICAgIHJldHVybiBUVF9FcnJfSW52YWxpZF9Ecml2ZXJfSGFuZGxlOworCisgICAgcmV0dXJuIG9wZW5fZmFjZSggKEZUX0xpYnJhcnkpZW5naW5lLCBwYXRobmFtZSwgZm9udEluZGV4LCBhZmFjZSApOworICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiBUVF9DbG9zZV9GYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRGVzdHJveXMgYSBnaXZlbiBmYWNlIG9iamVjdCBvcGVuZWQgdGhyb3VnaCBlaXRoZXIgVFRfT3Blbl9GYWNlICAqLworICAvKiAgICBvZiBUVF9PcGVuX0NvbGxlY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBmYWNlICA6OiBoYW5kbGUgdG8gdGhlIHRhcmdldCBmYWNlIG9iamVjdCAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUcnVlVHlwZSBlcnJvciBjb2RlLiAwIG1lYW5zIHN1Y2Nlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE1ULU5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBOby4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGlzIEFQSSBpcyBwcm92aWRlZCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuIFBsZWFzZSB1c2UgICAgICovCisgIC8qICAgIHRoZSBmdW5jdGlvbnMgVFRfTmV3X0ZhY2UvVFRfRG9uZV9GYWNlIG5vdyB0byBjcmVhdGUgYW5kICAgICAgICAgKi8KKyAgLyogICAgZGlzY2FyZCBmYWNlL2NvbGxlY3Rpb24gb2JqZWN0cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgRVhQT1JUX0RFRgorICBUVF9FcnJvciAgVFRfQ2xvc2VfRmFjZSggVFRfRmFjZSAgZmFjZSApCisgIHsKKyAgICBGVF9SZXNvdXJjZSAgcmVzb3VyY2U7CisgICAgCisgICAgaWYgKCFmYWNlKQorICAgICAgcmV0dXJuIFRUX0Vycl9JbnZhbGlkX0ZhY2VfSGFuZGxlOworCisgICAgcmVzb3VyY2UgPSBmYWNlLT5yb290LnJlc291cmNlOworICAgIEZUX0RvbmVfRmFjZSggKEZUX0ZhY2UpZmFjZSApOworCisgICAgLyogdW5pbnN0YWxsIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2UgKi8KKyAgICBGVF9Eb25lX1Jlc291cmNlKCByZXNvdXJjZSApOworCisgICAgcmV0dXJuIFRUX0Vycl9PazsKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqKiovCisgIC8qKioqKioqKioqKiAgIEVuZCBvZiBiYWNrd2FyZHMgY29tcGF0aWJsZSBBUElzLi4gICAgICAgICAgICAqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiBUVF9HZXRfRmFjZV9Qcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgUmV0dXJuIGEgZ2l2ZW4gZmFjZSdzIHByb3BlcnRpZXMgdG8gdGhlIGNhbGxlci4gICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZmFjZSAgOjogaGFuZGxlIHRvIHRoZSBzb3VyY2UgZmFjZSBvYmplY3QgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgcHJvcGVydGllcyA6OiB0YXJnZXQgcHJvcGVydGllcyBzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVHJ1ZVR5cGUgZXJyb3IgY29kZS4gMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxNVC1Ob3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgWWVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgRVhQT1JUX0ZVTkMKKyAgVFRfRXJyb3IgIFRUX0dldF9GYWNlX1Byb3BlcnRpZXMoIFRUX0ZhY2UgICAgICAgICAgICAgIGZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9GYWNlX1Byb3BlcnRpZXMqICBwcm9wcyApCisgIHsKKyAgICBwcm9wcy0+bnVtX0dseXBocyAgID0gKFRUX1VTaG9ydClmYWNlLT5yb290Lm51bV9nbHlwaHM7CisgICAgcHJvcHMtPm1heF9Qb2ludHMgICA9IChUVF9VU2hvcnQpZmFjZS0+cm9vdC5tYXhfcG9pbnRzOworICAgIHByb3BzLT5tYXhfQ29udG91cnMgPSAoVFRfVVNob3J0KWZhY2UtPnJvb3QubWF4X2NvbnRvdXJzOworICAgIHByb3BzLT5udW1fQ2hhck1hcHMgPSAoVFRfVVNob3J0KWZhY2UtPnJvb3QubnVtX2NoYXJtYXBzOworICAgIHByb3BzLT5udW1fRmFjZXMgICAgPSBmYWNlLT5yb290Lm51bV9mYWNlczsKKyAgICBwcm9wcy0+bnVtX05hbWVzICAgID0gZmFjZS0+bnVtX25hbWVzOworICAgIHByb3BzLT5oZWFkZXIgICAgICAgPSAmZmFjZS0+aGVhZGVyOworICAgIHByb3BzLT5ob3Jpem9udGFsICAgPSAmZmFjZS0+aG9yaXpvbnRhbDsKKyAgICAgIAorICAgICAgLyogVGhlIGRyaXZlciBzdXBwb3J0cyBvbGQgTWFjIGZvbnRzIHdoZXJlIHRoZXJlIGFyZSBubyBPUy8yICAqLworICAgICAgLyogdGFibGVzIHByZXNlbnQgaW4gdGhlIGZpbGUuIEhvd2V2ZXIsIHRoaXMgaXMgbm90IHRydWUgb2YgICAqLworICAgICAgLyogRnJlZVR5cGUgMS4xLiBGb3IgdGhlIHNha2Ugb2YgYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIHdlICAqLworICAgICAgLyogYWx3YXlzIHJldHVybiB0aGUgYWRkcmVzcyBvZiB0aGUgZmFjZSdzIG9zMiB0YWJsZSwgZXZlbiBpZiAqLworICAgICAgLyogaXQgaXMgZW1wdHkgKGluIHdoaWNoIGNhc2UsIHRoZSAncHJvcHMub3MyJyBmaWVsZCBpcyBzZXQgICAqLworICAgICAgLyogdG8gTlVMTC4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgLyogTm90ZSBob3dldmVyLCB0aGF0IHRoZSAnb3MyLT52ZXJzaW9uJyBmaWVsZCBpcyBzZXQgdG8gICAgICAqLworICAgICAgLyogMHhGRkZGIHRvIGluZGljYXRlIGEgbWlzc2luZyB0YWJsZSB0aG91Z2guLi4gICAgICAgICAgICAgICAqLworICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgICAgcHJvcHMtPm9zMiAgICAgICAgICA9ICZmYWNlLT5vczI7CisgICAgICAKKyAgICBwcm9wcy0+cG9zdHNjcmlwdCAgICA9ICZmYWNlLT5wb3N0c2NyaXB0OworICAgIHByb3BzLT5oZG14ICAgICAgICAgID0gJmZhY2UtPmhkbXg7CisgICAgcHJvcHMtPnZlcnRpY2FsICAgICAgPSAoIGZhY2UtPnZlcnRpY2FsX2luZm8gPyAmZmFjZS0+dmVydGljYWwgOiAwICk7CisKKyAgICByZXR1cm4gVFRfRXJyX09rOworICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiBUVF9TZXRfRmFjZV9Qb2ludGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRWFjaCBmYWNlIG9iamVjdCBjb250YWlucyBhIHR5cGVsZXNzIHBvaW50ZXIsIHdoaWNoIHVzZSBpcyBsZWZ0ICAqLworICAvKiAgICB0byBjbGllbnQgYXBwbGljYXRpb25zIChvciB0aGUgaGlnaC1sZXZlbCBsaWJyYXJ5KS4gVGhpcyBBUEkgaXMgICovCisgIC8qICAgIHVzZWQgdG8gc2V0IHRoaXMgZ2VuZXJpYyBwb2ludGVyLiBJdCBpcyBpZ25vcmVkIGJ5IHRoZSBkcml2ZXIuICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZhY2UgICA6OiB0YXJnZXQgZmFjZSBvYmplY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZGF0YSAgIDo6IGdlbmVyaWMgcG9pbnRlcidzIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVHJ1ZVR5cGUgZXJyb3IgY29kZS4gMCBtZWFucyBzdWNjZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxNVC1Ob3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgTm8uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhlIGdlbmVyaWMgcG9pbnRlciBpcyB1c2VkIGJ5IHRoZSBITGliIHdoZW4gdXNpbmcgdGhlIGRyaXZlciAgICAqLworICAvKiAgICB3aXRoaW4gdGhlIEZyZWVUeXBlIGxpYnJhcnkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICBFWFBPUlRfRlVOQworICBUVF9FcnJvciAgVFRfU2V0X0ZhY2VfUG9pbnRlciggVFRfRmFjZSAgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqICAgIGRhdGEgKQorICB7CisgICAgaWYgKCAhZmFjZSApCisgICAgICByZXR1cm4gVFRfRXJyX0ludmFsaWRfRmFjZV9IYW5kbGU7CisgICAgZWxzZQorICAgICAgZmFjZS0+cm9vdC5nZW5lcmljLmRhdGEgPSBkYXRhOworCisgICAgcmV0dXJuIFRUX0Vycl9PazsKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gVFRfR2V0X0ZhY2VfUG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEVhY2ggZmFjZSBvYmplY3QgY29udGFpbnMgYSB0eXBlbGVzcyBwb2ludGVyLCB3aGljaCB1c2UgaXMgbGVmdCAgKi8KKyAgLyogICAgdG8gY2xpZW50IGFwcGxpY2F0aW9ucyAob3IgdGhlIGhpZ2gtbGV2ZWwgbGlicmFyeSkuIFRoaXMgQVBJIGlzICAqLworICAvKiAgICB1c2VkIHRvIHJldHJpZXZlIHRoaXMgZ2VuZXJpYyBwb2ludGVyLCB3aGljaCBpcyBpZ25vcmVkIGJ5IHRoZSAgICovCisgIC8qICAgIGRyaXZlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZhY2UgICAgOjogaGFuZGxlIHRvIHNvdXJjZSBmYWNlIG9iamVjdCAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGdlbmVyaWMgcG9pbnRlciB2YWx1ZS4gTlVMTCBpZiB0aGUgZmFjZSBoYW5kbGUgaXMgaW52YWxpZC4uICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8TVQtTm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIE5vLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgIEVYUE9SVF9GVU5DCisgIHZvaWQqICBUVF9HZXRfRmFjZV9Qb2ludGVyKCBUVF9GYWNlICBmYWNlICkKKyAgeworICAgIHJldHVybiAoIGZhY2UgPyBmYWNlLT5yb290LmdlbmVyaWMuZGF0YSA6IE5VTEwgKTsKKyAgfQorCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+IFRUX0dldF9GYWNlX01ldHJpY3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBHZXQgdGhlIG1ldHJpY3Mgb2YgYSBnaXZlbiBhcnJheSBvZiBnbHlwaHMuIFJldHVybnMgYW55IG51bWJlciAgICovCisgIC8qICAgIG9mIG1ldHJpY3MgYXJyYXlzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZhY2UgICAgICAgOjogaGFuZGxlIHRvIHRoZSBzb3VyY2UgZmFjZSBvYmplY3QgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZmlyc3RHbHlwaCA6OiBpbmRleCBvZiBmaXJzdCBnbHlwaCBpbiB0aGUgYXJyYXkgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBsYXN0R2x5cGggIDo6IGluZGV4IG9mIGxhc3QgZ2x5cGggaW4gdGhlIGFycmF5ICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBsZWZ0QmVhcmluZ3MgOjogdGFyZ2V0IGFycmF5IG9mIHNob3J0cyBmb3IgdGhlIGdseXBoIGxlZnQgc2lkZSAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICBiZWFyaW5ncy4gU2V0IHRoaXMgZmllbGQgdG8gTlVMTCBpZiB5b3UncmUgbm90ICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgIGludGVyZXN0ZWQgaW4gdGhlc2UgbWV0cmljcy4gICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHdpZHRocyA6OiB0YXJnZXQgYXJyYXkgb2YgdW5zaWduZWQgc2hvcnRzIGZvciB0aGUgZ2x5cGggYWR2YW5jZSAgKi8KKyAgLyogICAgICAgICAgICAgIHdpZHRocy4gU2V0IHRoaXMgZmllbGQgdG8gTlVMTCBpZiB5b3UncmUgbm90ICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgaW50ZXJlc3RlZCBpbiB0aGVzZSBtZXRyaWNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgdG9wQmVhcmluZ3MgOjogdGFyZ2V0IGFycmF5IG9mIHNob3J0cyBmb3IgdGhlIGdseXBoIHRvcCBzaWRlICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICBiZWFyaW5ncy4gU2V0IHRoaXMgZmllbGQgdG8gTlVMTCBpZiB5b3UncmUgbm90ICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgIGludGVyZXN0ZWQgaW4gdGhlc2UgbWV0cmljcy4gICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBoZWlnaHRzIDo6IHRhcmdldCBhcnJheSBvZiB1bnNpZ25lZCBzaG9ydHMgZm9yIHRoZSBnbHlwaCBhZHZhbmNlICovCisgIC8qICAgICAgICAgICAgICAgaGVpZ2h0cy4gU2V0IHRoaXMgZmllbGQgdG8gTlVMTCBpZiB5b3UncmUgbm90ICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICBpbnRlcmVzdGVkIGluIHRoZXNlIG1ldHJpY3MuICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVHJ1ZVR5cGUgZXJyb3IgY29kZS4gMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxNVC1Ob3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgTm8uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAvKiBSZXR1cm4gaG9yaXpvbnRhbCBvciB2ZXJ0aWNhbCBtZXRyaWNzIGluIGZvbnQgdW5pdHMgICovCisgICAgICAgIC8qIGZvciBhIGdpdmVuIGdseXBoLiAgVGhlIG1ldHJpY3MgYXJlIHRoZSBsZWZ0IHNpZGUgICAgKi8KKyAgICAgICAgLyogYmVhcmluZyAocmVzcC4gdG9wIHNpZGUgYmVhcmluZykgYW5kIGFkdmFuY2Ugd2lkdGggICAqLworICAgICAgICAvKiAocmVzcC4gYWR2YW5jZSBoZWlnaHQpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgLyogVGhpcyBmdW5jdGlvbiB3aWxsIG11Y2ggcHJvYmFibHkgbW92ZSB0byBhbm90aGVyICAgICAqLworICAgICAgICAvKiBjb21wb25lbnQgaW4gdGhlIHNob3J0IGZ1dHVyZSwgYnV0IEkgaGF2ZW4ndCBkZWNpZGVkICovCisgICAgICAgIC8qIHdoaWNoIHlldC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAKKyAgICAgICAgICBzdGF0aWMKKyAgICAgICAgICB2b2lkICBnZXRfbWV0cmljcyggVFRfSG9yaUhlYWRlciogIGhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfSW50ICAgICAgICAgIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9TaG9ydCogICAgICAgYmVhcmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfVVNob3J0KiAgICAgIGFkdmFuY2UgKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIFRUX0xvbmdNZXRyaWNzKiAgbG9uZ3NfbTsKKyAgICAKKyAgICAgICAgICAgIFRUX1VTaG9ydCAgayA9IGhlYWRlci0+bnVtYmVyX09mX0hNZXRyaWNzOworICAgIAorICAgIAorICAgICAgICAgICAgaWYgKCBpbmRleCA8IGsgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBsb25nc19tID0gKFRUX0xvbmdNZXRyaWNzKiloZWFkZXItPmxvbmdfbWV0cmljcyArIGluZGV4OworICAgICAgICAgICAgICAqYmVhcmluZyA9IGxvbmdzX20tPmJlYXJpbmc7CisgICAgICAgICAgICAgICphZHZhbmNlID0gbG9uZ3NfbS0+YWR2YW5jZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgKmJlYXJpbmcgPSAoKFRUX1Nob3J0TWV0cmljcyopaGVhZGVyLT5zaG9ydF9tZXRyaWNzKVtpbmRleCAtIGtdOworICAgICAgICAgICAgICAqYWR2YW5jZSA9ICgoVFRfTG9uZ01ldHJpY3MqKWhlYWRlci0+bG9uZ19tZXRyaWNzKVtrIC0gMV0uYWR2YW5jZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgCisKKworICBFWFBPUlRfRlVOQworICBUVF9FcnJvciAgVFRfR2V0X0ZhY2VfTWV0cmljcyggVFRfRmFjZSAgICAgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX1VTaG9ydCAgIGZpcnN0R2x5cGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9VU2hvcnQgICBsYXN0R2x5cGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9TaG9ydCogICBsZWZ0QmVhcmluZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9VU2hvcnQqICB3aWR0aHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9TaG9ydCogICB0b3BCZWFyaW5ncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX1VTaG9ydCogIGhlaWdodHMgKQorICB7CisgICAgVFRfVVNob3J0ICBudW07CisKKyAgICBpZiAoICFmYWNlICkKKyAgICAgIHJldHVybiBUVF9FcnJfSW52YWxpZF9GYWNlX0hhbmRsZTsKKworICAgIC8qIENoZWNrIHRoZSBnbHlwaCByYW5nZSAqLworICAgIGlmICggbGFzdEdseXBoID49IGZhY2UtPnJvb3QubnVtX2dseXBocyB8fCBmaXJzdEdseXBoID4gbGFzdEdseXBoICkKKyAgICAgIHJldHVybiBUVF9FcnJfSW52YWxpZF9Bcmd1bWVudDsKKworICAgIG51bSA9IGxhc3RHbHlwaCAtIGZpcnN0R2x5cGg7ICAgLyogbnVtYmVyIG9mIGVsZW1lbnRzLTEgaW4gZWFjaCBhcnJheSAqLworCisgICAgLyogc3RvcmUgdGhlIGxlZnQgc2lkZSBiZWFyaW5ncyBhbmQgYWR2YW5jZSB3aWR0aHMgZmlyc3QgKi8KKyAgICB7CisgICAgICBUVF9VU2hvcnQgIG47CisgICAgICBUVF9TaG9ydCAgIGxlZnRfYmVhcmluZzsKKyAgICAgIFRUX1VTaG9ydCAgYWR2YW5jZV93aWR0aDsKKworCisgICAgICBmb3IgKCBuID0gMDsgbiA8PSBudW07IG4rKyApCisgICAgICB7CisgICAgICAgIGdldF9tZXRyaWNzKCAmZmFjZS0+aG9yaXpvbnRhbCwKKyAgICAgICAgICAgICAgICAgICAgICBmaXJzdEdseXBoICsgbiwgJmxlZnRfYmVhcmluZywgJmFkdmFuY2Vfd2lkdGggKTsKKworICAgICAgICBpZiAoIGxlZnRCZWFyaW5ncyApICBsZWZ0QmVhcmluZ3Nbbl0gPSBsZWZ0X2JlYXJpbmc7CisgICAgICAgIGlmICggd2lkdGhzICkgICAgICAgIHdpZHRoc1tuXSAgICAgICA9IGFkdmFuY2Vfd2lkdGg7CisgICAgICB9CisgICAgfQorCisgICAgLyogY2hlY2sgZm9yIHZlcnRpY2FsIGRhdGEgaWYgdG9wQmVhcmluZ3Mgb3IgaGVpZ2h0cyBpcyBub24tTlVMTCAqLworICAgIGlmICggIXRvcEJlYXJpbmdzICYmICFoZWlnaHRzICkKKyAgICAgIHJldHVybiBUVF9FcnJfT2s7CisKKyAgICBpZiAoICFmYWNlLT52ZXJ0aWNhbF9pbmZvICkKKyAgICAgIHJldHVybiBUVF9FcnJfTm9fVmVydGljYWxfRGF0YTsKKworICAgIC8qIHN0b3JlIHRoZSB0b3Agc2lkZSBiZWFyaW5ncyAqLworICAgIHsKKyAgICAgIFRUX1VTaG9ydCAgbjsKKyAgICAgIFRUX1Nob3J0ICAgdG9wX2JlYXJpbmc7CisgICAgICBUVF9VU2hvcnQgIGFkdmFuY2VfaGVpZ2h0OworCisgICAgICBmb3IgKCBuID0gMDsgbiA8PSBudW07IG4rKyApCisgICAgICB7CisgICAgICAgIGdldF9tZXRyaWNzKCAoVFRfSG9yaUhlYWRlciopJmZhY2UtPnZlcnRpY2FsLAorICAgICAgICAgICAgICAgICAgICAgZmlyc3RHbHlwaCArIG4sICZ0b3BfYmVhcmluZywgJmFkdmFuY2VfaGVpZ2h0ICk7CisKKyAgICAgICAgaWYgKCB0b3BCZWFyaW5ncyApICB0b3BCZWFyaW5nc1tuXSA9IHRvcF9iZWFyaW5nOworICAgICAgICBpZiAoIGhlaWdodHMgKSAgICAgIGhlaWdodHNbbl0gICAgID0gYWR2YW5jZV9oZWlnaHQ7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIFRUX0Vycl9PazsKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gVFRfTmV3X0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2JqZWN0IGZyb20gYSBnaXZlbiBmYWNlICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZhY2UgIDo6IGhhbmRsZSB0byBzb3VyY2UvcGFyZW50IGZhY2Ugb2JqZWN0ICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGluc3RhbmNlIDo6IGhhbmRsZSB0byBmcmVzaCBvYmplY3QuIFNldCB0byBOVUxMIGluIGNhc2Ugb2YgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgZXJyb3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVHJ1ZVR5cGUgZXJyb3IgY29kZS4gMCBtZWFucyBzdWNjZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxNVC1Ob3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgWWVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQW55IG5ldyBpbnN0YW5jZSB1c2VzIGEgZGVmYXVsdCByZXNvbHV0aW9uIG9mIDk2eDk2IGRwaSwgYW5kICAgICAqLworICAvKiAgICBhIGRlZmF1bHQgcG9pbnQgc2l6ZSBvZiAxMCBwdHMuIFlvdSBjYW4gY2hhbmdlIHRoZXNlIGFueXRpbWUgICAgICovCisgIC8qICAgIHdpdGggVFRfU2V0X0luc3RhbmNlX1Jlc29sdXRpb25zL0NoYXJTaXplL0NoYXJTaXplcy9QaXhlbFNpemVzICAgKi8KKyAgLyogICAgKHNlZSBiZWxvdykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgRVhQT1JUX0ZVTkMKKyAgVFRfRXJyb3IgIFRUX05ld19JbnN0YW5jZSggVFRfRmFjZSAgICAgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9JbnN0YW5jZSogIGluc3RhbmNlICkKKyAgeworICAgIHJldHVybiBGVF9OZXdfU2l6ZSggKEZUX0ZhY2UpZmFjZSwgKEZUX1NpemUqKWluc3RhbmNlICk7CisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+IFRUX1NldF9JbnN0YW5jZV9SZXNvbHV0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBTZXRzIGFuIGluc3RhbmNlIHJlc29sdXRpb25zIGluIGRvdC1wZXItaW5jaGVzLiBEZWZhdWx0IHZhbHVlcyAgICovCisgIC8qICAgIGZvciAibmV3IiBpbnN0YW5jZXMgYXJlIDk2eDk2IGRwaSwgYnV0IHRoZXNlIGNhbiBiZSBjaGFuZ2VkIGFueSAgKi8KKyAgLyogICAgdGltZSBieSBjYWxsaW5nIHRoaXMgQVBJLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgaW5zdGFuY2UgICAgOjogaGFuZGxlIHRvIHRhcmdldCBpbnN0YW5jZSBvYmplY3QgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB4UmVzb2x1dGlvbiA6OiBob3Jpem9udGFsIGRldmljZSByZXNvbHV0aW9uIGluIGRwaS4gICAgICAgICAgICAgICovCisgIC8qICAgIHlSZXNvbHV0aW9uIDo6IHZlcnRpY2FsIGRldmljZSByZXNvbHV0aW9uIGluIGRwaS4gICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRydWVUeXBlIGVycm9yIGNvZGUuIDAgbWVhbnMgc3VjY2VzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8TVQtTm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFlvdSBzaG91bGQgc2V0IHRoZSBjaGFyc2l6ZSBvciBwaXhlbCBzaXplIGltbWVkaWF0ZWx5IGFmdGVyICAgICAgKi8KKyAgLyogICAgY2FsbCBpbiBtdWx0aS1odHJlYWRlZCBwcm9ncmFtcy4gVGhpcyB3aWxsIGZvcmNlIHRoZSBpbnN0YW5jZSAgICAqLworICAvKiAgICBkYXRhIHRvIGJlIHJlc2V0dGVkLiBPdGhlcndpc2UsIHlvdSBtYXkgZW5jb3VudGVyIGNvcnJ1cHRpb24gICAgICovCisgIC8qICAgIHdoZW4gbG9hZGluZyB0d28gZ2x5cGhzIGZyb20gdGhlIHNhbWUgaW5zdGFuY2UgY29uY3VycmVudGx5ISAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBIYXBwaWx5LCA5OS45OSUgd2lsbCBkbyBqdXN0IHRoYXQgOi0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgRVhQT1JUX0ZVTkMKKyAgVFRfRXJyb3IgIFRUX1NldF9JbnN0YW5jZV9SZXNvbHV0aW9ucyggVFRfSW5zdGFuY2UgIGlucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfVVNob3J0ICAgIHhSZXNvbHV0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9VU2hvcnQgICAgeVJlc29sdXRpb24gKQorICB7CisgICAgcmV0dXJuIEZUX1NldF9SZXNvbHV0aW9ucyggKEZUX1NpemUpaW5zLCB4UmVzb2x1dGlvbiwgeVJlc29sdXRpb24gKTsKKyAgfQorCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+IFRUX1NldF9JbnN0YW5jZV9DaGFyU2l6ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBTYW1lIGFzIFRUX1NldF9JbnN0YW5jZV9DaGFyU2l6ZSwgYnV0IHVzZWQgdG8gc3BlY2lmeSBkaXN0aW5jdCAgICovCisgIC8qICAgIGhvcml6b250YWwgYW5kIHZlcnRpY2FsIGNvb3JkaW5hdGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGluc3RhbmNlICAgOjogaGFuZGxlIHRvIHRhcmdldCBpbnN0YW5jZSBvYmplY3QgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgY2hhcldpZHRoICA6OiBob3Jpem9udGFsIGNoYXJhY3RlciBzaXplICgyNi42IHBvaW50cykgICAgICAgICAgICAqLworICAvKiAgICBjaGFySGVpZ2h0IDo6IHZlcnRpY2FsIGNoYXJhY3RlciBzaXplICgyNi42IHBvaW50cykgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUcnVlVHlwZSBlcnJvciBjb2RlLiAwIG1lYW5zIHN1Y2Nlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE1ULU5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBOby4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGVyZSBpcyBubyBjaGVjayBmb3Igb3ZlcmZsb3c7IHdpdGggb3RoZXIgd29yZHMsIHRoZSBwcm9kdWN0ICAgICovCisgIC8qICAgIG9mIGdseXBoIGRpbWVuc2lvbnMgdGltZXMgdGhlIGRldmljZSByZXNvbHV0aW9uIG11c3QgaGF2ZSAgICAgICAgKi8KKyAgLyogICAgcmVhc29uYWJsZSB2YWx1ZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgRVhQT1JUX0ZVTkMKKyAgVFRfRXJyb3IgIFRUX1NldF9JbnN0YW5jZV9DaGFyU2l6ZXMoIFRUX0luc3RhbmNlICBpbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9GMjZEb3Q2ICAgY2hhcldpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfRjI2RG90NiAgIGNoYXJIZWlnaHQgKQorICB7CisgICAgcmV0dXJuIEZUX1NldF9DaGFyX1NpemVzKCAoRlRfU2l6ZSlpbnMsIGNoYXJXaWR0aCwgY2hhckhlaWdodCApOworICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiBUVF9TZXRfSW5zdGFuY2VfQ2hhclNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgU2V0cyBhbiBpbnN0YW5jZSdzIGNoYXJhY3RlciBzaXplLiBUaGUgc2l6ZSBpcyBpbiBmcmFjdGlvbmFsICAgICAqLworICAvKiAgICAoMjYuNikgcG9pbnQgdW5pdHMuIFRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgaG9yaXpvbnRhbCBhbmQgICAgICAgICovCisgIC8qICAgIHZlcnRpY2FsIHNpemVzIHRvIGJlIGVxdWFsLiBVc2UgVFRfU2V0X0luc3RhbmNlX0NoYXJTaXplcyAgICAgICAgKi8KKyAgLyogICAgZm9yIGRpc3RpbmN0IFggYW5kIFkgY2hhciBzaXplcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoZSBkZWZhdWx0IGNoYXJzaXplIG9mIGEgbmV3IGluc3RhbmNlIG9iamVjdCBpcyAxMCBwdHMuICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGluc3RhbmNlICA6OiBoYW5kbGUgdG8gdGFyZ2V0IGluc3RhbmNlIG9iamVjdCAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgY2hhclNpemUgIDo6IGNoYXJhY3RlciBzaXplIGV4cHJlc3NlZCBpbiAyNi42IGZpeGVkIGZsb2F0ICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgcG9pbnRzLiAxIHBvaW50ID0gMS83MiBkcGkuICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUcnVlVHlwZSBlcnJvciBjb2RlLiAwIG1lYW5zIHN1Y2Nlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE1ULU5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBOby4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICBFWFBPUlRfRlVOQworICBUVF9FcnJvciAgVFRfU2V0X0luc3RhbmNlX0NoYXJTaXplKCBUVF9JbnN0YW5jZSAgaW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX0YyNkRvdDYgICBjaGFyU2l6ZSApCisgIHsKKyAgICByZXR1cm4gVFRfU2V0X0luc3RhbmNlX0NoYXJTaXplcyggaW5zdGFuY2UsIGNoYXJTaXplLCBjaGFyU2l6ZSApOworICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiBUVF9TZXRfSW5zdGFuY2VfUGl4ZWxTaXplcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHNldCBhbiBpbnN0YW5jZSdzIHBpeGVsIHNpemVzIGRpcmVjdGx5ICAqLworICAvKiAgICBJdCBpZ25vcmVzIHRoZSBpbnN0YW5jZSdzIHJlc29sdXRpb25zIGZpZWxkcywgYW5kIHlvdSdsbCBoYXZlIHRvICovCisgIC8qICAgIHNwZWNpZnkgdGhlIGNvcnJlc3BvbmRpbmcgcG9pbnRzaXplIGluIDI2LjYgZml4ZWQgZmxvYXQgcG9pbnQgICAgKi8KKyAgLyogICAgdW5pdHMuIFRoZSBsYXR0ZXIgaXMgYSByZXF1aXJlbWVudCBvZiB0aGUgVHJ1ZVR5cGUgYnl0ZWNvZGUgICAgICAqLworICAvKiAgICBpbnRlcnByZXRlciBidXQgY2FuIGJlIGlnbm9yZWQgKG9yIG1vcmUgc2FmZWx5LCBzZXQgdG8gdGhlICAgICAgICovCisgIC8qICAgIG1heGltdW0gcGl4ZWwgc2l6ZSBtdWx0aXBsaWVkIGJ5IDY0KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGluc3RhbmNlICAgIDo6IGhhbmRsZSB0byB0YXJnZXQgaW5zdGFuY2Ugb2JqZWN0ICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgcGl4ZWxXaWR0aCAgOjogaG9yaXpvbnRhbCBwaXhlbCB3aWR0aCAoaW50ZWdlciB2YWx1ZSkgICAgICAgICAgICAqLworICAvKiAgICBwaXhlbEhlaWdodCA6OiB2ZXJ0aWNhbCBwaXhlbCBoZWlnaHQgKGludGVnZXIgdmFsdWUpICAgICAgICAgICAgICovCisgIC8qICAgIHBvaW50U2l6ZSAgIDo6IGNvcnJlc3BvbmRpbmcgcG9pbnQgc2l6ZSAoMjYuNiBwb2ludHMpICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRydWVUeXBlIGVycm9yIGNvZGUuIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8TVQtTm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgTm8uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgIEVYUE9SVF9GVU5DCisgIFRUX0Vycm9yICBUVF9TZXRfSW5zdGFuY2VfUGl4ZWxTaXplcyggVFRfSW5zdGFuY2UgIGlucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9VU2hvcnQgICAgcGl4ZWxXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9VU2hvcnQgICAgcGl4ZWxIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfRjI2RG90NiAgIHBvaW50U2l6ZSApCisgIHsKKyAgICAvKiBUaGUgcG9pbnQgc2l6ZSBpcyBub3cgaWdub3JlZCBieSB0aGUgZHJpdmVyICovCisgICAgKHZvaWQpcG9pbnRTaXplOworICAgIAorICAgIHJldHVybiBGVF9TZXRfUGl4ZWxfU2l6ZXMoIChGVF9TaXplKWlucywgcGl4ZWxXaWR0aCwgcGl4ZWxIZWlnaHQgKTsKKyAgfQorCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+IFRUX0dldF9JbnN0YW5jZV9NZXRyaWNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBSZXR1cm5zIGFuIGluc3RhbmNlJ3MgbWV0cmljcyBpbnRvIGNhbGxlciBzcGFjZS4gICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBpbnN0YW5jZSAgOjogaGFuZGxlIHRvIHNvdXJjZSBpbnN0YW5jZSBvYmplY3QgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBtZXRyaWNzICAgOjogdGFyZ2V0IGluc3RhbmNlIG1ldHJpY3Mgc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUcnVlVHlwZSBlcnJvciBjb2RlLiAwIG1lYW5zIHN1Y2Nlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE1ULU5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBOby4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGUgVFRfSW5zdGFuY2VfTWV0cmljcyBzdHJ1Y3R1cmUgZGlmZmVycyBzbGlnaHRseSBmcm9tIHRoZSAgICAgICovCisgIC8qICAgIEZUX0luc3RhbmNlX01ldHJpY3Mgb25lLCB3aGljaCBpcyB3aHkgd2UgcmUtaW1wbGVtZW50IHRoaXMgICAgICAgKi8KKyAgLyogICAgZnVuY3Rpb24sIHJhdGhlciB0aGFuIGNhbGwgYSBkcml2ZXIgbWV0aG9kIGZvciB0aGlzLi4gICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgRVhQT1JUX0ZVTkMKKyAgVFRfRXJyb3IgIFRUX0dldF9JbnN0YW5jZV9NZXRyaWNzKCBUVF9JbnN0YW5jZSAgICAgICAgICAgaW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX0luc3RhbmNlX01ldHJpY3MqICBtZXRyaWNzICkKKyAgeworICAgIFRUX1NpemUgIHNpemUgPSAoVFRfU2l6ZSlpbnM7CisKKyAgICBpZiAoIWlucykKKyAgICAgIHJldHVybiBUVF9FcnJfSW52YWxpZF9JbnN0YW5jZV9IYW5kbGU7CisKKyAgICBtZXRyaWNzLT54X3NjYWxlICAgICAgPSBzaXplLT5yb290Lm1ldHJpY3MueF9zY2FsZTsKKyAgICBtZXRyaWNzLT55X3NjYWxlICAgICAgPSBzaXplLT5yb290Lm1ldHJpY3MueV9zY2FsZTsKKyAgICBtZXRyaWNzLT54X3Jlc29sdXRpb24gPSBzaXplLT5yb290Lm1ldHJpY3MueF9yZXNvbHV0aW9uOworICAgIG1ldHJpY3MtPnlfcmVzb2x1dGlvbiA9IHNpemUtPnJvb3QubWV0cmljcy55X3Jlc29sdXRpb247CisgICAgbWV0cmljcy0+eF9wcGVtICAgICAgID0gc2l6ZS0+cm9vdC5tZXRyaWNzLnhfcHBlbTsKKyAgICBtZXRyaWNzLT55X3BwZW0gICAgICAgPSBzaXplLT5yb290Lm1ldHJpY3MueV9wcGVtOworCisgICAgbWV0cmljcy0+cG9pbnRTaXplICAgID0gc2l6ZS0+cm9vdC5tZXRyaWNzLnBvaW50U2l6ZTsgICAgCisgICAgcmV0dXJuIFRUX0Vycl9PazsKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gVFRfU2V0X0luc3RhbmNlX1BvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEVhY2ggaW5zdGFuY2Ugb2JqZWN0IGNvbnRhaW5zIGEgdHlwZWxlc3MgcG9pbnRlciwgd2hpY2ggdXNlIGlzICAgKi8KKyAgLyogICAgbGVmdCB0byBjbGllbnQgYXBwbGljYXRpb25zIChvciB0aGUgaGlnaC1sZXZlbCBsaWJyYXJ5KS4gVGhpcyAgICAqLworICAvKiAgICBBUEkgaXMgdXNlZCB0byBzZXQgdGhpcyBnZW5lcmljIHBvaW50ZXIuIEl0IGlzIGlnbm9yZWQgYnkgdGhlICAgICovCisgIC8qICAgIGRyaXZlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGluc3RhbmNlICA6OiBoYW5kbGUgdG8gdGhlIHRhcmdldCBpbnN0YW5jZSBvYmplY3QgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZGF0YSAgICAgIDo6IHZhbHVlIG9mIHRoZSBnZW5lcmljIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVHJ1ZVR5cGUgZXJyb3IgY29kZS4gMCBtZWFucyBzdWNjZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxNVC1Ob3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgTm8uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgRVhQT1JUX0ZVTkMKKyAgVFRfRXJyb3IgIFRUX1NldF9JbnN0YW5jZV9Qb2ludGVyKCBUVF9JbnN0YW5jZSAgaW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgICBkYXRhICkKKyAgeworICAgIGlmICggIWlucyApCisgICAgICByZXR1cm4gVFRfRXJyX0ludmFsaWRfSW5zdGFuY2VfSGFuZGxlOworICAgIGVsc2UKKyAgICAgICgoRlRfU2l6ZSlpbnMpLT5nZW5lcmljLmRhdGEgPSBkYXRhOworCisgICAgcmV0dXJuIFRUX0Vycl9PazsKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gVFRfR2V0X0luc3RhbmNlX1BvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEVhY2ggaW5zdGFuY2Ugb2JqZWN0IGNvbnRhaW5zIGEgdHlwZWxlc3MgcG9pbnRlciwgd2hpY2ggdXNlIGlzICAgKi8KKyAgLyogICAgbGVmdCB0byBjbGllbnQgYXBwbGljYXRpb25zIChvciB0aGUgaGlnaC1sZXZlbCBsaWJyYXJ5KS4gVGhpcyAgICAqLworICAvKiAgICBBUEkgaXMgdXNlZCB0byByZXRyaWV2ZSB0aGlzIGdlbmVyaWMgcG9pbnRlci4gSXQgaXMgaWdub3JlZCBieSAgICovCisgIC8qICAgIHRoZSBkcml2ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGluc3RhbmNlICA6OiBoYW5kbGUgdG8gc291cmNlIGluc3RhbmNlIG9iamVjdCAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHZhbHVlIG9mIGdlbmVyaWMgcG9pbnRlci4gTlVMTCBpZiBpbnZhbGlkIGluc3RhbmNlICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8TVQtTm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIE5vLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICBFWFBPUlRfRlVOQworICB2b2lkKiAgVFRfR2V0X0luc3RhbmNlX1BvaW50ZXIoIFRUX0luc3RhbmNlICBpbnN0YW5jZSApCisgIHsKKyAgICBpZiAoICFpbnN0YW5jZSApCisgICAgICByZXR1cm4gTlVMTDsKKyAgICBlbHNlCisgICAgICByZXR1cm4gKChGVF9TaXplKWluc3RhbmNlKS0+Z2VuZXJpYy5kYXRhOworICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiBUVF9Eb25lX0luc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRGVzdHJveXMgYSBnaXZlbiBpbnN0YW5jZSBvYmplY3QuIEFsbCBpbnN0YW5jZXMgYXJlIGRlc3Ryb3llZCAgICAqLworICAvKiAgICBhdXRvbWF0aWNhbGx5IHdoZW4gdGhlaXIgcGFyZW50IGZhY2Ugb2JqZWN0IGlzIGRpc2NhcmRlZC4gICAgICAgICovCisgIC8qICAgIEhvd2V2ZXIsIHRoaXMgQVBJIGNhbiBiZSB1c2VkIHRvIHNhdmUgbWVtb3J5LiAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGluc3RhbmNlICA6OiBoYW5kbGUgdG8gdGFyZ2V0IGluc3RhbmNlIG9iamVjdCAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRydWVUeXBlIGVycm9yIGNvZGUuIDAgbWVhbnMgc3VjY2VzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8TVQtTm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIE5vLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICBFWFBPUlRfRlVOQworICBUVF9FcnJvciAgVFRfRG9uZV9JbnN0YW5jZSggVFRfSW5zdGFuY2UgIGlucyApCisgIHsKKyAgICBGVF9Eb25lX1NpemUoIChGVF9TaXplKWlucyApOworICAgIHJldHVybiBUVF9FcnJfT2s7CisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+IFRUX1NldF9JbnN0YW5jZV9UcmFuc2Zvcm1fRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBOb3RoaW5nLiBUaGlzIGZ1bmN0aW9uIGhhcyBiZWVuIGRlcHJlY2F0ZWQuLi4gICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBpbnN0YW5jZSAgICAgIDo6IGhhbmRsZSB0byB0YXJnZXQgaW5zdGFuY2Ugb2JqZWN0ICAgICAgICAgICAgICAgICovCisgIC8qICAgIHJvdGF0ZWQgICAgICAgOjogJ3JvdGF0aW9uJyBmbGFnLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgc3RyZXRjaGVkICAgICA6OiAnc3RyZXRjaCcgZmxhZy4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQWx3YXlzIDAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhpcyBmdW5jdGlvbiBoYXMgYmVlbiBkZXByZWNhdGVkICEhIERvIG5vdCB1c2UgaXQsIGl0IGRvZXNuJ3QgICAqLworICAvKiAgICBkbyBhbnl0aGluZyBub3cuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICBFWFBPUlRfRlVOQworICBUVF9FcnJvciAgVFRfU2V0X0luc3RhbmNlX1RyYW5zZm9ybV9GbGFncyggVFRfSW5zdGFuY2UgIGluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfQm9vbCAgICAgIHJvdGF0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9Cb29sICAgICAgc3RyZXRjaGVkICkKKyAgeworICAgICh2b2lkKWluc3RhbmNlOyAgIC8qIHRoZSBwYXJhbWV0ZXJzIGFyZSB1bnVzZWQsIHRoZSAodm9pZCkgcHJldmVudHMgKi8KKyAgICAodm9pZClyb3RhdGVkOyAgICAvKiB3YXJuaW5ncyBmcm9tIHBlZGFudGljIGNvbXBpbGVycy4uICAgICAgICAgICAgICovCisgICAgKHZvaWQpc3RyZXRjaGVkOworICAgIAorICAgIHJldHVybiBUVF9FcnJfT2s7CisgIH0KKworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRydWVUeXBlIGVycm9yIGNvZGUuIDAgbWVhbnMgc3VjY2VzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxNVC1Ob3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgRnVuY3Rpb24gICAgOiAgVFRfTmV3X0dseXBoCisgKgorICogIERlc2NyaXB0aW9uIDogIENyZWF0ZXMgYSBuZXcgZ2x5cGggb2JqZWN0IHJlbGF0ZWQgdG8gYSBnaXZlbgorICogICAgICAgICAgICAgICAgIGZhY2UuCisgKgorICogIElucHV0ICA6ICBmYWNlICAgICAgIHRoZSBmYWNlIGhhbmRsZQorICogICAgICAgICAgICBnbHlwaCAgICAgIGFkZHJlc3Mgb2YgdGFyZ2V0IGdseXBoIGhhbmRsZQorICoKKyAqICBPdXRwdXQgOiAgRXJyb3IgY29kZS4KKyAqCisgKiAgTVQtU2FmZSA6IFlFUyEKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIEVYUE9SVF9GVU5DCisgIFRUX0Vycm9yICBUVF9OZXdfR2x5cGgoIFRUX0ZhY2UgICAgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfR2x5cGgqICBhZ2x5cGggKQorICB7CisgICAgcmV0dXJuIEZUX05ld19HbHlwaFNsb3QoIChGVF9GYWNlKWZhY2UsIChGVF9HbHlwaFNsb3QqKWFnbHlwaCApOworICB9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgRnVuY3Rpb24gICAgOiAgVFRfRG9uZV9HbHlwaAorICoKKyAqICBEZXNjcmlwdGlvbiA6ICBEZXN0cm95cyBhIGdpdmVuIGdseXBoIG9iamVjdC4KKyAqCisgKiAgSW5wdXQgIDogIGdseXBoICB0aGUgZ2x5cGggaGFuZGxlCisgKgorICogIE91dHB1dCA6ICBFcnJvciBjb2RlLgorICoKKyAqICBNVC1TYWZlIDogWUVTIQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgRVhQT1JUX0ZVTkMKKyAgVFRfRXJyb3IgIFRUX0RvbmVfR2x5cGgoIFRUX0dseXBoICBnbHlwaCApCisgIHsKKyAgICBGVF9Eb25lX0dseXBoU2xvdCggKEZUX0dseXBoU2xvdClnbHlwaCApOworICAgIHJldHVybiBUVF9FcnJfT2s7CisgIH0KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBGdW5jdGlvbiAgICA6ICBUVF9Mb2FkX0dseXBoCisgKgorICogIERlc2NyaXB0aW9uIDogIExvYWRzIGEgZ2x5cGguCisgKgorICogIElucHV0ICA6ICBpbnN0YW5jZSAgICAgIHRoZSBpbnN0YW5jZSBoYW5kbGUKKyAqICAgICAgICAgICAgZ2x5cGggICAgICAgICB0aGUgZ2x5cGggaGFuZGxlCisgKiAgICAgICAgICAgIGdseXBoSW5kZXggICAgdGhlIGdseXBoIGluZGV4CisgKiAgICAgICAgICAgIGxvYWRGbGFncyAgICAgZmxhZ3MgY29udHJvbGxpbmcgaG93IHRvIGxvYWQgdGhlIGdseXBoCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgKG5vbmUsIHNjYWxlZCwgaGludGVkLCBib3RoKQorICoKKyAqICBPdXRwdXQgOiAgRXJyb3IgY29kZS4KKyAqCisgKiAgTVQtU2FmZSA6IFlFUyEKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIEVYUE9SVF9GVU5DCisgIFRUX0Vycm9yICBUVF9Mb2FkX0dseXBoKCBUVF9JbnN0YW5jZSAgaW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9HbHlwaCAgICAgZ2x5cGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9VU2hvcnQgICAgZ2x5cGhJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX1VTaG9ydCAgICBsb2FkRmxhZ3MgICApCisgIHsKKyAgICBUVF9JbnQgIHJlc3VsdCwgZmxhZ3M7CisKKyAgICBmbGFncyA9IDA7CisKKyAgICAvKiBDb252ZXJ0IGxvYWQgZmxhZ3MgKi8KKyAgICBpZiAoIChsb2FkRmxhZ3MgJiBUVExPQURfU0NBTEVfR0xZUEgpID09IDAgKQorICAgICAgZmxhZ3MgPSBGVF9MT0FEX05PX1NDQUxFOworCisgICAgZWxzZSBpZiAoIChsb2FkRmxhZ3MgJiBUVExPQURfSElOVF9HTFlQSCkgPT0gMCApCisgICAgICBmbGFncyA9IEZUX0xPQURfTk9fSElOVElORzsKKworICAgIGVsc2UKKyAgICAgIGZsYWdzID0gRlRfTE9BRF9ERUZBVUxUOworCisgICAgZmxhZ3MgfD0gRlRfTE9BRF9OT19CSVRNQVAgfCAgIC8qIHByZXZlbnQgYml0bWFwIGxvYWRpbmcgZm9yICovCisgICAgICAgICAgICAgRlRfTE9BRF9MSU5FQVI7ICAgICAgIC8qIGNvbXBhdGliaWxpdHkgcHVycG9zZXMuLiAgICovCisKKyAgICByZXR1cm4gRlRfTG9hZF9HbHlwaCggKEZUX0dseXBoU2xvdClnbHlwaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX1NpemUpaW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBoSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0ICk7CisgIH0KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBGdW5jdGlvbiAgICA6ICBUVF9HZXRfR2x5cGhfT3V0bGluZQorICoKKyAqICBEZXNjcmlwdGlvbiA6ICBSZXR1cm5zIHRoZSBnbHlwaCdzIG91dGxpbmUgZGF0YS4KKyAqCisgKiAgSW5wdXQgIDogIGdseXBoICAgICB0aGUgZ2x5cGggaGFuZGxlCisgKiAgICAgICAgICAgIG91dGxpbmUgICBhZGRyZXNzIHdoZXJlIHRoZSBnbHlwaCBvdXRsaW5lIHdpbGwgYmUgcmV0dXJuZWQKKyAqCisgKiAgT3V0cHV0IDogIEVycm9yIGNvZGUuCisgKgorICogIE1ULVNhZmUgOiBZRVMhICBSZWFkcyBvbmx5IHNlbWktcGVybWFuZW50IGRhdGEuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICBFWFBPUlRfRlVOQworICBUVF9FcnJvciAgVFRfR2V0X0dseXBoX091dGxpbmUoIFRUX0dseXBoICAgICBnbHlwaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9PdXRsaW5lKiAgb3V0bGluZSApCisgIHsKKyAgICBGVF9HbHlwaFNsb3QgIHNsb3QgPSAoRlRfR2x5cGhTbG90KWdseXBoOworCisgICAgaWYgKCFnbHlwaCkKKyAgICAgIHJldHVybiBUVF9FcnJfSW52YWxpZF9HbHlwaF9IYW5kbGU7CisKKyAgICAvKiB0aGUgc3RydWN0dXJlcyBUVF9PdXRsaW5lIGFuZCBGVF9PdXRsaW5lIGFyZSBlcXVpdmFsZW50ICovCisgICAgKigoRlRfT3V0bGluZSopb3V0bGluZSkgPSBzbG90LT5vdXRsaW5lOworICAgIHJldHVybiBUVF9FcnJfT2s7CisgIH0KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBGdW5jdGlvbiAgICA6ICBUVF9HZXRfR2x5cGhfTWV0cmljcworICoKKyAqICBEZXNjcmlwdGlvbiA6ICBFeHRyYWN0cyB0aGUgZ2x5cGgncyBob3Jpem9udGFsIG1ldHJpY3MgaW5mb3JtYXRpb24uCisgKgorICogIElucHV0ICA6ICBnbHlwaCAgICAgICBnbHlwaCBvYmplY3QgaGFuZGxlCisgKiAgICAgICAgICAgIG1ldHJpY3MgICAgIGFkZHJlc3Mgd2hlcmUgbWV0cmljcyB3aWxsIGJlIHJldHVybmVkCisgKgorICogIE91dHB1dCA6ICBFcnJvciBjb2RlLgorICoKKyAqICBNVC1TYWZlIDogTk8hICBHbHlwaCBjb250YWluZXJzIGNhbid0IGJlIHNoYXJlZC4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIEVYUE9SVF9GVU5DCisgIFRUX0Vycm9yICBUVF9HZXRfR2x5cGhfTWV0cmljcyggVFRfR2x5cGggICAgICAgICAgIGdseXBoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX0dseXBoX01ldHJpY3MqICBtZXRyaWNzICkKKyAgeworICAgIEZUX0dseXBoU2xvdCAgc2xvdCA9IChGVF9HbHlwaFNsb3QpZ2x5cGg7CisKKyAgICBpZiAoIWdseXBoKQorICAgICAgcmV0dXJuIFRUX0Vycl9JbnZhbGlkX0dseXBoX0hhbmRsZTsKKworICAgIC8qIFRUX0dseXBoX01ldHJpY3MgYW5kIEZUX0dseXBoX01ldHJpY3MgYXJlIHNsaWdodGx5IGRpZmZlcmVudCAqLworICAgIG1ldHJpY3MtPmJib3gueE1pbiA9IHNsb3QtPm1ldHJpY3MuaG9yaUJlYXJpbmdYOworCisgICAgbWV0cmljcy0+YmJveC54TWF4ID0gc2xvdC0+bWV0cmljcy5ob3JpQmVhcmluZ1ggKworICAgICAgICAgICAgICAgICAgICAgICAgIHNsb3QtPm1ldHJpY3Mud2lkdGg7CisKKyAgICBtZXRyaWNzLT5iYm94LnlNYXggPSBzbG90LT5tZXRyaWNzLmhvcmlCZWFyaW5nWTsKKworICAgIG1ldHJpY3MtPmJib3gueU1pbiA9IHNsb3QtPm1ldHJpY3MuaG9yaUJlYXJpbmdZIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICBzbG90LT5tZXRyaWNzLmhlaWdodDsKKworICAgIG1ldHJpY3MtPmJlYXJpbmdYICA9IHNsb3QtPm1ldHJpY3MuaG9yaUJlYXJpbmdYOworICAgIG1ldHJpY3MtPmJlYXJpbmdZICA9IHNsb3QtPm1ldHJpY3MuaG9yaUJlYXJpbmdZOworICAgIG1ldHJpY3MtPmFkdmFuY2UgICA9IHNsb3QtPm1ldHJpY3MuaG9yaUFkdmFuY2U7CisgICAgCisgICAgcmV0dXJuIFRUX0Vycl9PazsKKyAgfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIEZ1bmN0aW9uICAgIDogIFRUX0dldF9CaWdfR2x5cGhfTWV0cmljcworICoKKyAqICBEZXNjcmlwdGlvbiA6ICBFeHRyYWN0cyB0aGUgZ2x5cGgncyBiaWcgbWV0cmljcyBpbmZvcm1hdGlvbi4KKyAqCisgKiAgSW5wdXQgIDogIGdseXBoICAgICAgIGdseXBoIG9iamVjdCBoYW5kbGUKKyAqICAgICAgICAgICAgbWV0cmljcyAgICAgYWRkcmVzcyB3aGVyZSBiaWcgbWV0cmljcyB3aWxsIGJlIHJldHVybmVkCisgKgorICogIE91dHB1dCA6ICBFcnJvciBjb2RlLgorICoKKyAqICBNVC1TYWZlIDogTk8hICBHbHlwaCBjb250YWluZXJzIGNhbid0IGJlIHNoYXJlZC4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIEVYUE9SVF9GVU5DCisgIFRUX0Vycm9yICBUVF9HZXRfR2x5cGhfQmlnX01ldHJpY3MoIFRUX0dseXBoICAgICAgICAgICAgICAgZ2x5cGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX0JpZ19HbHlwaF9NZXRyaWNzKiAgbWV0cmljcyApCisgIHsKKyAgICBGVF9HbHlwaFNsb3QgICAgICAgc2xvdCA9IChGVF9HbHlwaFNsb3QpZ2x5cGg7CisgICAgRlRfR2x5cGhfTWV0cmljcyogIG1ldDsKKyAgICBGVF9HbHlwaF9NZXRyaWNzKiAgbWV0MjsKKworICAgIGlmICghZ2x5cGgpCisgICAgICByZXR1cm4gVFRfRXJyX0ludmFsaWRfR2x5cGhfSGFuZGxlOworCisgICAgbWV0ICA9ICZzbG90LT5tZXRyaWNzOworICAgIG1ldDIgPSAmc2xvdC0+bWV0cmljczI7CisKKyAgICBtZXRyaWNzLT5iYm94LnhNaW4gPSBtZXQtPmhvcmlCZWFyaW5nWDsKKyAgICBtZXRyaWNzLT5iYm94LnhNYXggPSBtZXQtPmhvcmlCZWFyaW5nWCArIG1ldC0+d2lkdGg7CisgICAgbWV0cmljcy0+YmJveC55TWluID0gbWV0LT5ob3JpQmVhcmluZ1kgLSBtZXQtPmhlaWdodDsKKyAgICBtZXRyaWNzLT5iYm94LnlNYXggPSBtZXQtPmhvcmlCZWFyaW5nWTsKKworICAgIG1ldHJpY3MtPmhvcmlCZWFyaW5nWCA9IG1ldC0+aG9yaUJlYXJpbmdYOworICAgIG1ldHJpY3MtPmhvcmlCZWFyaW5nWSA9IG1ldC0+aG9yaUJlYXJpbmdZOworICAgIG1ldHJpY3MtPmhvcmlBZHZhbmNlICA9IG1ldC0+aG9yaUFkdmFuY2U7CisKKyAgICBtZXRyaWNzLT52ZXJ0QmVhcmluZ1ggPSBtZXQtPnZlcnRCZWFyaW5nWDsKKyAgICBtZXRyaWNzLT52ZXJ0QmVhcmluZ1kgPSBtZXQtPnZlcnRCZWFyaW5nWTsKKyAgICBtZXRyaWNzLT52ZXJ0QWR2YW5jZSAgPSBtZXQtPnZlcnRBZHZhbmNlOworCisgICAgbWV0cmljcy0+bGluZWFySG9yaUFkdmFuY2UgID0gbWV0Mi0+aG9yaUFkdmFuY2U7CisgICAgbWV0cmljcy0+bGluZWFySG9yaUJlYXJpbmdYID0gbWV0Mi0+aG9yaUJlYXJpbmdYOworCisgICAgbWV0cmljcy0+bGluZWFyVmVydEFkdmFuY2UgID0gbWV0Mi0+dmVydEFkdmFuY2U7CisgICAgbWV0cmljcy0+bGluZWFyVmVydEJlYXJpbmdZID0gbWV0Mi0+dmVydEJlYXJpbmdZOworICAgCisgICAgcmV0dXJuIFRUX0Vycl9PazsKKyAgfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIEZ1bmN0aW9uICAgIDogIFRUX0dldF9HbHlwaF9CaXRtYXAKKyAqCisgKiAgRGVzY3JpcHRpb24gOiAgUHJvZHVjZXMgYSBiaXRtYXAgZnJvbSBhIGdseXBoIG91dGxpbmUuCisgKgorICogIElucHV0ICA6ICBnbHlwaCAgICAgIHRoZSBnbHlwaCBjb250YWluZXIncyBoYW5kbGUKKyAqICAgICAgICAgICAgbWFwICAgICAgICB0YXJnZXQgcGl4bWFwIGRlc2NyaXB0aW9uIGJsb2NrCisgKiAgICAgICAgICAgIHhPZmZzZXQgICAgeCBvZmZzZXQgaW4gZnJhY3Rpb25hbCBwaXhlbHMgKDI2LjYgZm9ybWF0KQorICogICAgICAgICAgICB5T2Zmc2V0ICAgIHkgb2Zmc2V0IGluIGZyYWN0aW9uYWwgcGl4ZWxzICgyNi42IGZvcm1hdCkKKyAqCisgKiAgT3V0cHV0IDogIEVycm9yIGNvZGUuCisgKgorICogIE5vdGUgOiBPbmx5IHVzZSBpbnRlZ2VyIHBpeGVsIG9mZnNldHMgaWYgeW91IHdhbnQgdG8gcHJlc2VydmUKKyAqICAgICAgICAgdGhlIGZpbmUgaGludHMgYXBwbGllZCB0byB0aGUgb3V0bGluZS4gIFRoaXMgbWVhbnMgdGhhdAorICogICAgICAgICB4T2Zmc2V0IGFuZCB5T2Zmc2V0IG11c3QgYmUgbXVsdGlwbGVzIG9mIDY0IQorICoKKyAqICBNVC1TYWZlIDogTk8hICBHbHlwaCBjb250YWluZXJzIGNhbid0IGJlIHNoYXJlZC4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIEVYUE9SVF9GVU5DCisgIFRUX0Vycm9yICBUVF9HZXRfR2x5cGhfQml0bWFwKCBUVF9HbHlwaCAgICAgICAgZ2x5cGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9SYXN0ZXJfTWFwKiAgbWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfRjI2RG90NiAgICAgIHhPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9GMjZEb3Q2ICAgICAgeU9mZnNldCApCisgIHsKKyAgICBGVF9MaWJyYXJ5ICAgICBsaWJyYXJ5OworICAgIFRUX0Vycm9yICAgICAgIGVycm9yOworICAgIEZUX0dseXBoU2xvdCAgIHNsb3QgPSAoRlRfR2x5cGhTbG90KWdseXBoOworICAgIEZUX091dGxpbmUgICAgIG91dGxpbmU7CisgICAgRlRfUmFzdGVyX01hcCAgYml0bWFwOworCisgICAgaWYgKCAhZ2x5cGggKQorICAgICAgcmV0dXJuIFRUX0Vycl9JbnZhbGlkX0dseXBoX0hhbmRsZTsKKworICAgIGxpYnJhcnkgPSBzbG90LT5mYWNlLT5yZXNvdXJjZS0+bGlicmFyeTsKKyAgICBvdXRsaW5lID0gc2xvdC0+b3V0bGluZTsKKworICAgIC8qIFhYWCA6IEZvciBub3csIHVzZSBvbmx5IGRyb3BvdXQgbW9kZSAyICAgICovCisgICAgLyogb3V0bGluZS5kcm9wb3V0X21vZGUgPSBfZ2x5cGgtPnNjYW5fdHlwZTsgKi8KKyAgICBvdXRsaW5lLmRyb3BvdXRfbW9kZSA9IDI7CisKKyAgICBiaXRtYXAud2lkdGggICAgPSBtYXAtPndpZHRoOworICAgIGJpdG1hcC5yb3dzICAgICA9IG1hcC0+cm93czsKKyAgICBiaXRtYXAuY29scyAgICAgPSBtYXAtPmNvbHM7CisgICAgYml0bWFwLmZsb3cgICAgID0gbWFwLT5mbG93OworICAgIGJpdG1hcC5waXhfYml0cyA9IDE7CisgICAgYml0bWFwLmJ1ZmZlciAgID0gbWFwLT5iaXRtYXA7CisKKyAgICBGVF9UcmFuc2xhdGVfT3V0bGluZSggJm91dGxpbmUsIHhPZmZzZXQsIHlPZmZzZXQgKTsKKworICAgIGVycm9yID0gRlRfR2V0X091dGxpbmVfQml0bWFwKCBsaWJyYXJ5LCAmb3V0bGluZSwgJmJpdG1hcCApOworCisgICAgRlRfVHJhbnNsYXRlX091dGxpbmUoICZvdXRsaW5lLCAteE9mZnNldCwgLXlPZmZzZXQgKTsKKworICAgIHJldHVybiBlcnJvcjsKKyAgfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIEZ1bmN0aW9uICAgIDogIFRUX0dldF9HbHlwaF9QaXhtYXAKKyAqCisgKiAgRGVzY3JpcHRpb24gOiAgUHJvZHVjZXMgYSBncmF5c2NhbGVkIHBpeG1hcCBmcm9tIGEgZ2x5cGgKKyAqICAgICAgICAgICAgICAgICBvdXRsaW5lLgorICoKKyAqICBJbnB1dCAgOiAgZ2x5cGggICAgICB0aGUgZ2x5cGggY29udGFpbmVyJ3MgaGFuZGxlCisgKiAgICAgICAgICAgIG1hcCAgICAgICAgdGFyZ2V0IHBpeG1hcCBkZXNjcmlwdGlvbiBibG9jaworICogICAgICAgICAgICB4T2Zmc2V0ICAgIHggb2Zmc2V0IGluIGZyYWN0aW9uYWwgcGl4ZWxzICgyNi42IGZvcm1hdCkKKyAqICAgICAgICAgICAgeU9mZnNldCAgICB5IG9mZnNldCBpbiBmcmFjdGlvbmFsIHBpeGVscyAoMjYuNiBmb3JtYXQpCisgKgorICogIE91dHB1dCA6ICBFcnJvciBjb2RlLgorICoKKyAqICBOb3RlIDogT25seSB1c2UgaW50ZWdlciBwaXhlbCBvZmZzZXRzIHRvIHByZXNlcnZlIHRoZSBmaW5lCisgKiAgICAgICAgIGhpbnRpbmcgb2YgdGhlIGdseXBoIGFuZCB0aGUgJ2NvcnJlY3QnIGFudGktYWxpYXNpbmcKKyAqICAgICAgICAgKHdoZXJlIHZlcnRpY2FsIGFuZCBob3Jpem9udGFsIHN0ZW1zIGFyZW4ndCBncmF5ZWQpLgorICogICAgICAgICBUaGlzIG1lYW5zIHRoYXQgeE9mZnNldCBhbmQgeU9mZnNldCBtdXN0IGJlIG11bHRpcGxlcworICogICAgICAgICBvZiA2NCEKKyAqCisgKiAgICAgICAgIFlvdSBjYW4gZXhwZXJpbWVudCB3aXRoIG9mZnNldHMgb2YgKzMyIHRvIGdldCAnYmx1cnJlZCcKKyAqICAgICAgICAgdmVyc2lvbnMgb2YgdGhlIGdseXBocyAoYSBuaWNlIGVmZmVjdCBhdCBsYXJnZSBzaXplcyB0aGF0CisgKiAgICAgICAgIHNvbWUgZ3JhcGhpYyBkZXNpZ25lcnMgbWF5IGFwcHJlY2lhdGUgOikKKyAqCisgKiAgTVQtU2FmZSA6IE5PISAgR2x5cGggY29udGFpbmVycyBjYW4ndCBiZSBzaGFyZWQuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICBFWFBPUlRfRlVOQworICBUVF9FcnJvciAgVFRfR2V0X0dseXBoX1BpeG1hcCggVFRfR2x5cGggICAgICAgIGdseXBoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfUmFzdGVyX01hcCogIG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX0YyNkRvdDYgICAgICB4T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfRjI2RG90NiAgICAgIHlPZmZzZXQgKQorICB7CisgICAgRlRfTGlicmFyeSAgICAgbGlicmFyeTsKKyAgICBUVF9FcnJvciAgICAgICBlcnJvcjsKKyAgICBGVF9HbHlwaFNsb3QgICBzbG90ID0gKEZUX0dseXBoU2xvdClnbHlwaDsKKyAgICBGVF9PdXRsaW5lICAgICBvdXRsaW5lOworICAgIEZUX1Jhc3Rlcl9NYXAgIGJpdG1hcDsKKworICAgIGlmICggIWdseXBoICkKKyAgICAgIHJldHVybiBUVF9FcnJfSW52YWxpZF9HbHlwaF9IYW5kbGU7CisKKyAgICBsaWJyYXJ5ID0gc2xvdC0+ZmFjZS0+cmVzb3VyY2UtPmxpYnJhcnk7CisgICAgb3V0bGluZSA9IHNsb3QtPm91dGxpbmU7CisKKyAgICAvKiBYWFggOiBGb3Igbm93LCB1c2Ugb25seSBkcm9wb3V0IG1vZGUgMiAgICAqLworICAgIC8qIG91dGxpbmUuZHJvcG91dF9tb2RlID0gX2dseXBoLT5zY2FuX3R5cGU7ICovCisgICAgb3V0bGluZS5kcm9wb3V0X21vZGUgPSAyOworCisgICAgYml0bWFwLndpZHRoICAgID0gbWFwLT53aWR0aDsKKyAgICBiaXRtYXAucm93cyAgICAgPSBtYXAtPnJvd3M7CisgICAgYml0bWFwLmNvbHMgICAgID0gbWFwLT5jb2xzOworICAgIGJpdG1hcC5mbG93ICAgICA9IG1hcC0+ZmxvdzsKKyAgICBiaXRtYXAucGl4X2JpdHMgPSA4OworICAgIGJpdG1hcC5idWZmZXIgICA9IG1hcC0+Yml0bWFwOworCisgICAgRlRfVHJhbnNsYXRlX091dGxpbmUoICZvdXRsaW5lLCB4T2Zmc2V0LCB5T2Zmc2V0ICk7CisKKyAgICBlcnJvciA9IEZUX0dldF9PdXRsaW5lX0JpdG1hcCggbGlicmFyeSwgJm91dGxpbmUsICZiaXRtYXAgKTsKKworICAgIEZUX1RyYW5zbGF0ZV9PdXRsaW5lKCAmb3V0bGluZSwgLXhPZmZzZXQsIC15T2Zmc2V0ICk7CisKKyAgICByZXR1cm4gZXJyb3I7CisgIH0KKworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gVFRfR2V0X091dGxpbmVfQml0bWFwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICBSZW5kZXJzIGFuIG91dGxpbmUgd2l0aGluIGEgYml0bWFwLiBUaGUgb3V0bGluZSdzIGltYWdlIGlzICAgICAgKi8KKyAgLyogICAgIHNpbXBseSBvci1lZCB0byB0aGUgdGFyZ2V0IGJpdG1hcC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgIGVuZ2luZSAgOjogICBoYW5kbGUgdG8gdGhlIFRydWVUeXBlIGRyaXZlciBvYmplY3QgICAgICAgICAgICAgICAqLworICAvKiAgICAgb3V0bGluZSA6OiAgIHBvaW50ZXIgdG8gdGhlIHNvdXJjZSBvdXRsaW5lIGRlc2NyaXB0b3IgICAgICAgICAgICovCisgIC8qICAgICByYXN0ZXIgIDo6ICAgcG9pbnRlciB0byB0aGUgdGFyZ2V0IGJpdG1hcCBkZXNjcmlwdG9yICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICBUcnVlVHlwZSBlcnJvciBjb2RlLiAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8TVQtTm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICBZZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgIEVYUE9SVF9GVU5DCisgIFRUX0Vycm9yICBUVF9HZXRfT3V0bGluZV9CaXRtYXAoIFRUX0VuZ2luZSAgICAgICBlbmdpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX091dGxpbmUqICAgICBvdXRsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9SYXN0ZXJfTWFwKiAgbWFwICkKKyAgeworICAgIEZUX0xpYnJhcnkgICAgIGxpYnJhcnkgPSAoRlRfTGlicmFyeSllbmdpbmU7CisgICAgRlRfUmFzdGVyX01hcCAgYml0bWFwOworCisgICAgaWYgKCAhZW5naW5lICkKKyAgICAgIHJldHVybiBUVF9FcnJfSW52YWxpZF9FbmdpbmU7CisKKyAgICBpZiAoICFvdXRsaW5lIHx8ICFtYXAgKQorICAgICAgcmV0dXJuIFRUX0Vycl9JbnZhbGlkX0FyZ3VtZW50OworCisgICAgYml0bWFwLndpZHRoICAgID0gbWFwLT53aWR0aDsKKyAgICBiaXRtYXAucm93cyAgICAgPSBtYXAtPnJvd3M7CisgICAgYml0bWFwLmNvbHMgICAgID0gbWFwLT5jb2xzOworICAgIGJpdG1hcC5mbG93ICAgICA9IG1hcC0+ZmxvdzsKKyAgICBiaXRtYXAucGl4X2JpdHMgPSAxOworICAgIGJpdG1hcC5idWZmZXIgICA9IG1hcC0+Yml0bWFwOworCisgICAgcmV0dXJuIEZUX0dldF9PdXRsaW5lX0JpdG1hcCggbGlicmFyeSwgKEZUX091dGxpbmUqKW91dGxpbmUsICZiaXRtYXAgKTsKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gVFRfR2V0X091dGxpbmVfUGl4bWFwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICBSZW5kZXJzIGFuIG91dGxpbmUgd2l0aGluIGEgcGl4bWFwLiBUaGUgb3V0bGluZSdzIGltYWdlIGlzICAgICAgKi8KKyAgLyogICAgIHNpbXBseSBvci1lZCB0byB0aGUgdGFyZ2V0IHBpeG1hcC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgIGVuZ2luZSAgOjogICBoYW5kbGUgdG8gdGhlIFRydWVUeXBlIGRyaXZlciBvYmplY3QgICAgICAgICAgICAgICAqLworICAvKiAgICAgb3V0bGluZSA6OiAgIHBvaW50ZXIgdG8gdGhlIHNvdXJjZSBvdXRsaW5lIGRlc2NyaXB0b3IgICAgICAgICAgICovCisgIC8qICAgICByYXN0ZXIgIDo6ICAgcG9pbnRlciB0byB0aGUgdGFyZ2V0IHBpeG1hcCBkZXNjcmlwdG9yICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICBUcnVlVHlwZSBlcnJvciBjb2RlLiAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8TVQtTm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICBZZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgIEVYUE9SVF9GVU5DCisgIFRUX0Vycm9yICBUVF9HZXRfT3V0bGluZV9QaXhtYXAoIFRUX0VuZ2luZSAgICAgICBlbmdpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX091dGxpbmUqICAgICBvdXRsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9SYXN0ZXJfTWFwKiAgbWFwICkKKyAgeworICAgIEZUX0xpYnJhcnkgICAgIGxpYnJhcnkgPSAoRlRfTGlicmFyeSllbmdpbmU7CisgICAgRlRfUmFzdGVyX01hcCAgYml0bWFwOworCisgICAgaWYgKCAhZW5naW5lICkKKyAgICAgIHJldHVybiBUVF9FcnJfSW52YWxpZF9FbmdpbmU7CisKKyAgICBpZiAoICFvdXRsaW5lIHx8ICFtYXAgKQorICAgICAgcmV0dXJuIFRUX0Vycl9JbnZhbGlkX0FyZ3VtZW50OworCisgICAgYml0bWFwLndpZHRoICAgID0gbWFwLT53aWR0aDsKKyAgICBiaXRtYXAucm93cyAgICAgPSBtYXAtPnJvd3M7CisgICAgYml0bWFwLmNvbHMgICAgID0gbWFwLT5jb2xzOworICAgIGJpdG1hcC5mbG93ICAgICA9IG1hcC0+ZmxvdzsKKyAgICBiaXRtYXAucGl4X2JpdHMgPSA4OworICAgIGJpdG1hcC5idWZmZXIgICA9IG1hcC0+Yml0bWFwOworCisgICAgcmV0dXJuIEZUX0dldF9PdXRsaW5lX0JpdG1hcCggbGlicmFyeSwgKEZUX091dGxpbmUqKW91dGxpbmUsICZiaXRtYXAgKTsKKyAgfQorCisKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+IFRUX05ld19PdXRsaW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBDcmVhdGVzIGEgbmV3IG91dGxpbmUgb2YgYSBnaXZlbiBzaXplLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBudW1Qb2ludHMgOjogIG1heGltdW0gbnVtYmVyIG9mIHBvaW50cyB3aXRoaW4gdGhlIG91dGxpbmUgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbnVtQ29udG91cnMgOjogbWF4aW11bSBudW1iZXIgb2YgY29udG91cnMgd2l0aGluIHRoZSBvdXRsaW5lICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgb3V0bGluZSAgOjogdGFyZ2V0IG91dGxpbmUgZGVzY3JpcHRvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVHJ1ZVR5cGUgZXJyb3IgY29kZS4gMCBtZWFucyBzdWNjZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxNVC1Ob3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgWWVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhpcyBmdW5jdGlvbiB1c2VzICdtYWxsb2MnIHRvIGFsbG9jYXRlIHRoZSBvdXRsaW5lJ3MgYXJyYXksICAgICAqLworICAvKiAgICBfdW5saWtlXyBhbGwgb3RoZXIgZnVuY3Rpb25zIGluIHRoZSBUcnVlVHlwZSBBUEkuIFRoaXMgbWVhbnMgICAgICovCisgIC8qICAgIHRoYXQgdGhlIG91dGxpbmUgd29uJ3QgYmUgZGVzdHJveWVkIHdoZW4gdGhlIFRydWVUeXBlIGVuZ2luZSAgICAgKi8KKyAgLyogICAgaXMgZmluYWxpemVkLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEl0IGlzIHByb3ZpZGVkIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBPTkxZLiBVc2UgdGhlIG5ldyAgICAgKi8KKyAgLyogICAgRlRfTmV3X091dGxpbmUgZnVuY3Rpb24gZGVmaW5lZCBpbiAiZnRvdXRsbi5oIiBpbnN0ZWFkIGlmIHlvdSdyZSAqLworICAvKiAgICB3b3JraW5nIHdpdGggdGhlIEZyZWVUeXBlIDIuMCBBUEkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPiAgLyogZm9yIG1hbGxvYyBhbmQgZnJlZSAqLworCisgIHN0YXRpYyAgVFRfT3V0bGluZSAgbnVsbF9hcGlfb3V0bGluZSA9IHsgMCwgMCwgTlVMTCwgTlVMTCwgTlVMTCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMCwgMCB9OworCisgIEVYUE9SVF9GVU5DCisgIFRUX0Vycm9yICBUVF9OZXdfT3V0bGluZSggVFRfVVNob3J0ICAgIG51bVBvaW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9TaG9ydCAgICAgbnVtQ29udG91cnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfT3V0bGluZSogIG91dGxpbmUgKQorICB7CisgICAgaWYgKCAhb3V0bGluZSApCisgICAgICByZXR1cm4gVFRfRXJyX0ludmFsaWRfQXJndW1lbnQ7CisKKyAgICAqb3V0bGluZSA9IG51bGxfYXBpX291dGxpbmU7CisKKyAgICBpZiAoIG51bVBvaW50cyA+IDAgJiYgbnVtQ29udG91cnMgPiAwICkKKyAgICB7CisgICAgICBvdXRsaW5lLT5wb2ludHMgICA9IChUVF9WZWN0b3IqKW1hbGxvYyggbnVtUG9pbnRzICogc2l6ZW9mKFRUX1ZlY3RvcikgKTsKKyAgICAgIG91dGxpbmUtPmZsYWdzICAgID0gKFRUX0J5dGUqKSAgbWFsbG9jKCBudW1Qb2ludHMgKiBzaXplb2YoVFRfQ2hhcikgICApOworICAgICAgb3V0bGluZS0+Y29udG91cnMgPSAoVFRfVVNob3J0KiltYWxsb2MoIG51bVBvaW50cyAqIHNpemVvZihUVF9VU2hvcnQpICk7CisgICAgCisgICAgICBpZiAoICFvdXRsaW5lLT5wb2ludHMgfHwgIW91dGxpbmUtPmZsYWdzIHx8ICFvdXRsaW5lLT5jb250b3VycyApCisgICAgICAgIGdvdG8gRmFpbDsKKworICAgICAgb3V0bGluZS0+bl9wb2ludHMgICA9IG51bVBvaW50czsKKyAgICAgIG91dGxpbmUtPm5fY29udG91cnMgPSBudW1Db250b3VyczsKKyAgICAgIG91dGxpbmUtPm93bmVyICAgICAgPSBUUlVFOworICAgIH0KKyAgICByZXR1cm4gVFRfRXJyX09rOworCisgIEZhaWw6CisgICAgb3V0bGluZS0+b3duZXIgPSBUUlVFOworICAgIFRUX0RvbmVfT3V0bGluZSggb3V0bGluZSApOworICAgIHJldHVybiBUVF9FcnJfT3V0X09mX01lbW9yeTsKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gVFRfRG9uZV9PdXRsaW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIERlc3Ryb3lzIGFuIG91dGxpbmUgY3JlYXRlZCB3aXRoIEZUX05ld19PdXRsaW5lICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG91dGxpbmUgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgcG9pbnRlciB0byB0aGUgb3V0bGluZSBkZXN0cnVjdG9yIHRvIGRpc2NhcmQuIFRoaXMgZnVuY3Rpb24gICAqLworICAvKiAgICAgICBkb2Vzbid0IGRlc3Ryb3kgdGhlIFRUX091dGxpbmUgc3R1cmN0dXJlLCBvbmx5IHRoZSBkYXRhIGl0ICAgICovCisgIC8qICAgICAgIGNvbnRhaW5zL293bi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRydWVUeXBlIGVycm9yIGNvZGUuIDAgbWVhbnMgc3VjY2VzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8TVQtTm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIE5vLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoaXMgZnVuY3Rpb24gdXNlcyAnZnJlZScgdG8gZGlzY2FyZCB0aGUgb3V0bGluZSdzIGFycmF5cy4gICAgICAgKi8KKyAgLyogICAgWW91IHNob3VsZCBvbmx5IGRpc2NhcmQgb3V0bGluZSBhbGxvY2F0ZWQgd2l0aCBUVF9OZXdfT3V0bGluZS4gICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEl0IGlzIHByb3ZpZGVkIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBPTkxZLiBVc2UgdGhlIG5ldyAgICAgKi8KKyAgLyogICAgRlRfRG9uZV9PdXRsaW5lIGZ1bmN0aW9uIGRlZmluZWQgaW4gImZ0b3V0bG4uaCIgaW5zdGVhZCBpZiB5b3UncmUqLworICAvKiAgICB3b3JraW5nIHdpdGggdGhlIEZyZWVUeXBlIDIuMCBBUEkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICBFWFBPUlRfRlVOQworICBUVF9FcnJvciAgVFRfRG9uZV9PdXRsaW5lKCBUVF9PdXRsaW5lKiAgb3V0bGluZSApCisgIHsKKyAgICBpZiAoIG91dGxpbmUgKQorICAgIHsKKyAgICAgIGlmICggb3V0bGluZS0+b3duZXIgKQorICAgICAgeworICAgICAgICBmcmVlKCBvdXRsaW5lLT5wb2ludHMgICApOworICAgICAgICBmcmVlKCBvdXRsaW5lLT5mbGFncyAgICApOworICAgICAgICBmcmVlKCBvdXRsaW5lLT5jb250b3VycyApOworICAgICAgfQorICAgICAgKm91dGxpbmUgPSBudWxsX2FwaV9vdXRsaW5lOworICAgICAgcmV0dXJuIFRUX0Vycl9PazsKKyAgICB9CisgICAgZWxzZQorICAgICAgcmV0dXJuIFRUX0Vycl9JbnZhbGlkX0FyZ3VtZW50OworICB9CisKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+IFRUX0NvcHlfT3V0bGluZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgQ29weSBhbiBvdXRsaW5lIGludG8gYW5vdGhlciBvbmUuIEJvdGggb2JqZWN0cyBtdXN0IGhhdmUgICAgICAgICovCisgIC8qICAgICB0aGUgc2FtZSBzaXplcyAoIG51bS4gcG9pbnRzICYgbnVtLiBjb250b3VycyApIHdoZW4gdGhpcyAgICAgICAgKi8KKyAgLyogICAgIGZ1bmN0aW9uIGlzIGNhbGxlZC4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgIHNvdXJjZSAgOjogaGFuZGxlIHRvIHNvdXJjZSBvdXRsaW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgdGFyZ2V0ICA6OiBoYW5kbGUgdG8gdGFyZ2V0IG91dGxpbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgVHJ1ZVR5cGUgZXJyb3IgY29kZS4gMCBtZWFucyBzdWNjZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICBFWFBPUlRfRlVOQworICBUVF9FcnJvciAgVFRfQ29weV9PdXRsaW5lKCBUVF9PdXRsaW5lKiAgc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9PdXRsaW5lKiAgdGFyZ2V0ICkKKyAgeworICAgIHJldHVybiBGVF9Db3B5X091dGxpbmUoIChGVF9PdXRsaW5lKilzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX091dGxpbmUqKXRhcmdldCApOworICB9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgRnVuY3Rpb24gICAgOiAgVFRfVHJhbnNmb3JtX091dGxpbmUKKyAqCisgKiAgRGVzY3JpcHRpb24gOiAgQXBwbGllcyBhIHNpbXBsZSB0cmFuc2Zvcm1hdGlvbiB0byBhbiBvdXRsaW5lLgorICoKKyAqICBJbnB1dCAgOiAgb3V0bGluZSAgICAgdGhlIGdseXBoJ3Mgb3V0bGluZS4gIENhbiBiZSBleHRyYWN0ZWQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBhIGdseXBoIGNvbnRhaW5lciB0aHJvdWdoCisgKiAgICAgICAgICAgICAgICAgICAgICAgIFRUX0dldF9HbHlwaF9PdXRsaW5lKCkuCisgKgorICogICAgICAgICAgICBtYXRyaXggICAgICBzaW1wbGUgbWF0cml4IHdpdGggMTYuMTYgZml4ZWQgZmxvYXRzCisgKgorICogIE91dHB1dCA6ICBFcnJvciBjb2RlIChhbHdheXMgVFRfRXJyX09rKS4KKyAqCisgKiAgTVQtU2FmZSA6IFlFUyEKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIEVYUE9SVF9GVU5DCisgIHZvaWQgIFRUX1RyYW5zZm9ybV9PdXRsaW5lKCBUVF9PdXRsaW5lKiAgb3V0bGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX01hdHJpeCogICBtYXRyaXggKQorICB7CisgICAgRlRfVHJhbnNmb3JtX091dGxpbmUoIChGVF9PdXRsaW5lKilvdXRsaW5lLCAoRlRfTWF0cml4KiltYXRyaXggKTsKKyAgfSAgCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIEZ1bmN0aW9uICAgIDogIFRUX1RyYW5zZm9ybV9WZWN0b3IKKyAqCisgKiAgRGVzY3JpcHRpb24gOiAgQXBwbHkgYSBzaW1wbGUgdHJhbnNmb3JtIHRvIGEgdmVjdG9yCisgKgorICogIElucHV0ICA6ICB4LCB5ICAgICAgICB0aGUgdmVjdG9yLgorICoKKyAqICAgICAgICAgICAgbWF0cml4ICAgICAgc2ltcGxlIG1hdHJpeCB3aXRoIDE2LjE2IGZpeGVkIGZsb2F0cworICoKKyAqICBPdXRwdXQgOiAgTm9uZS4KKyAqCisgKiAgTVQtU2FmZSA6IFlFUyEKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIEVYUE9SVF9GVU5DCisgIHZvaWQgIFRUX1RyYW5zZm9ybV9WZWN0b3IoIFRUX0YyNkRvdDYqICB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9GMjZEb3Q2KiAgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfTWF0cml4KiAgIG1hdHJpeCApCisgIHsKKyAgICBGVF9UcmFuc2Zvcm1fVmVjdG9yKCB4LCB5LCAoRlRfTWF0cml4KikgbWF0cml4ICk7CisgIH0KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBGdW5jdGlvbiAgICA6ICBUVF9UcmFuc2xhdGVfT3V0bGluZQorICoKKyAqICBEZXNjcmlwdGlvbiA6ICBBcHBsaWVzIGEgc2ltcGxlIHRyYW5zbGF0aW9uLgorICoKKyAqICBJbnB1dCAgOiAgb3V0bGluZSAgIG5vIGNvbW1lbnQgOikKKyAqICAgICAgICAgICAgeE9mZnNldAorICogICAgICAgICAgICB5T2Zmc2V0CisgKgorICogIE91dHB1dCA6ICBFcnJvciBjb2RlLgorICoKKyAqICBNVC1TYWZlIDogWUVTIQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgRVhQT1JUX0ZVTkMKKyAgdm9pZCAgICAgIFRUX1RyYW5zbGF0ZV9PdXRsaW5lKCBUVF9PdXRsaW5lKiAgb3V0bGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9GMjZEb3Q2ICAgeE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9GMjZEb3Q2ICAgeU9mZnNldCApCisgIHsKKyAgICBGVF9UcmFuc2xhdGVfT3V0bGluZSggKEZUX091dGxpbmUqKW91dGxpbmUsIHhPZmZzZXQsIHlPZmZzZXQgKTsKKyAgfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIEZ1bmN0aW9uICAgIDogIFRUX0dldF9PdXRsaW5lX0JCb3gKKyAqCisgKiAgRGVzY3JpcHRpb24gOiAgUmV0dXJucyBhbiBvdXRsaW5lJ3MgYm91bmRpbmcgYm94LgorICoKKyAqICBJbnB1dCAgOiAgb3V0bGluZSAgIG5vIGNvbW1lbnQgOikKKyAqICAgICAgICAgICAgYmJveCAgICAgIGFkZHJlc3Mgd2hlcmUgdGhlIGJvdW5kaW5nIGJveCBpcyByZXR1cm5lZAorICoKKyAqICBPdXRwdXQgOiAgRXJyb3IgY29kZS4KKyAqCisgKiAgTVQtU2FmZSA6IFlFUyEKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIEVYUE9SVF9GVU5DCisgIFRUX0Vycm9yICBUVF9HZXRfT3V0bGluZV9CQm94KCBUVF9PdXRsaW5lKiAgb3V0bGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX0JCb3gqICAgICBiYm94ICkKKyAgeworICAgIHJldHVybiBGVF9HZXRfT3V0bGluZV9DQm94KCAoRlRfT3V0bGluZSopb3V0bGluZSwgKEZUX0JCb3gqKWJib3ggKTsKKyAgfQorCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE1ULU5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIENvbXB1dGUgQSpCL0Mgd2l0aCA2NCBiaXRzIGludGVybWVkaWF0ZSBwcmVjaXNpb24uICovCisKKyAgRVhQT1JUX0ZVTkMKKyAgVFRfTG9uZyAgIFRUX011bERpdiggVFRfTG9uZyBBLCBUVF9Mb25nIEIsIFRUX0xvbmcgQyApCisgIHsKKyAgICByZXR1cm4gRlRfTXVsRGl2KCBBLCBCLCBDICk7CisgIH0KKworICAKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8TVQtTm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogQ29tcHV0ZSBBKkIvMHgxMDAwMCB3aXRoIDY0IGJpdHMgaW50ZXJtZWRpYXRlIHByZWNpc2lvbi4gKi8KKyAgLyogVXNlZnVsIHRvIG11bHRpcGx5IGJ5IGEgMTYuMTYgZml4ZWQgZmxvYXQgdmFsdWUuICAgICAgICAgKi8KKworICBFWFBPUlRfRlVOQworICBUVF9Mb25nICAgVFRfTXVsRml4KCBUVF9Mb25nIEEsIFRUX0xvbmcgQiApCisgIHsKKyAgICByZXR1cm4gRlRfTXVsRml4KCBBLCBCICk7CisgIH0KKworICAvKiAtLS0tLS0tLS0tLS0tLS0tLSBjaGFyYWN0ZXIgbWFwcGluZ3Mgc3VwcG9ydCAtLS0tLS0tLS0tLS0tICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIEZ1bmN0aW9uICAgIDogIFRUX0dldF9DaGFyTWFwX0NvdW50CisgKgorICogIERlc2NyaXB0aW9uIDogIFJldHVybnMgdGhlIG51bWJlciBvZiBjaGFybWFwcyBpbiBhIGdpdmVuIGZhY2UuCisgKgorICogIElucHV0ICA6ICBmYWNlICAgZmFjZSBvYmplY3QgaGFuZGxlCisgKgorICogIE91dHB1dCA6ICBOdW1iZXIgb2YgdGFibGVzLiAtMSBpbiBjYXNlIG9mIGVycm9yIChiYWQgaGFuZGxlKS4KKyAqCisgKiAgTm90ZSAgIDogIERPTidUIFVTRSBUSElTIEZVTkNUSU9OISBJVCBIQVMgQkVFTiBERVBSRUNBVEVEIQorICoKKyAqICAgICAgICAgICAgSXQgaXMgcmV0YWluZWQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IG9ubHkgYW5kIHdpbGwKKyAqICAgICAgICAgICAgZmFpbCBvbiAxNmJpdCBzeXN0ZW1zLgorICoKKyAqICBNVC1TYWZlIDogWUVTICEKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIEVYUE9SVF9GVU5DCisgIGludCAgVFRfR2V0X0NoYXJNYXBfQ291bnQoIFRUX0ZhY2UgIGZhY2UgKQorICB7CisgICAgRlRfRmFjZSAgX2ZhY2UgPSAoRlRfRmFjZSlmYWNlOworCisgICAgcmV0dXJuICggX2ZhY2UgPyBfZmFjZS0+bnVtX2NoYXJtYXBzIDogLTEgKTsKKyAgfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIEZ1bmN0aW9uICAgIDogIFRUX0dldF9DaGFyTWFwX0lECisgKgorICogIERlc2NyaXB0aW9uIDogIFJldHVybnMgdGhlIElEIG9mIGEgZ2l2ZW4gY2hhcm1hcC4KKyAqCisgKiAgSW5wdXQgIDogIGZhY2UgICAgICAgICAgICAgZmFjZSBvYmplY3QgaGFuZGxlCisgKiAgICAgICAgICAgIGNoYXJtYXBJbmRleCAgICAgaW5kZXggb2YgY2hhcm1hcCBpbiBkaXJlY3RvcnkKKyAqICAgICAgICAgICAgcGxhdGZvcm1JRCAgICAgICBhZGRyZXNzIG9mIHJldHVybmVkIHBsYXRmb3JtIElECisgKiAgICAgICAgICAgIGVuY29kaW5nSUQgICAgICAgYWRkcmVzcyBvZiByZXR1cm5lZCBlbmNvZGluZyBJRAorICoKKyAqICBPdXRwdXQgOiAgZXJyb3IgY29kZQorICoKKyAqICBNVC1TYWZlIDogWUVTICEKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIEVYUE9SVF9GVU5DCisgIFRUX0Vycm9yICBUVF9HZXRfQ2hhck1hcF9JRCggVFRfRmFjZSAgICAgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9VU2hvcnQgICBjaGFybWFwSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfVVNob3J0KiAgcGxhdGZvcm1JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9VU2hvcnQqICBlbmNvZGluZ0lEICkKKyAgeworICAgIFRUX0NoYXJNYXAgIGNtYXA7CisKKyAgICBpZiAoICFmYWNlICkKKyAgICAgIHJldHVybiBUVF9FcnJfSW52YWxpZF9GYWNlX0hhbmRsZTsKKworICAgIGlmICggY2hhcm1hcEluZGV4ID49IGZhY2UtPm51bV9jaGFybWFwcyApCisgICAgICByZXR1cm4gVFRfRXJyX0JhZF9Bcmd1bWVudDsKKworICAgIGNtYXAgPSAoVFRfQ2hhck1hcClmYWNlLT5jaGFybWFwcyArIGNoYXJtYXBJbmRleDsKKworICAgICpwbGF0Zm9ybUlEID0gY21hcC0+cm9vdC5wbGF0Zm9ybV9pZDsKKyAgICAqZW5jb2RpbmdJRCA9IGNtYXAtPnJvb3QuZW5jb2RpbmdfaWQ7CisKKyAgICByZXR1cm4gVFRfRXJyX09rOworICB9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgRnVuY3Rpb24gICAgOiAgVFRfR2V0X0NoYXJNYXAKKyAqCisgKiAgRGVzY3JpcHRpb24gOiAgTG9va3MgdXAgYSBjaGFybWFwLgorICoKKyAqICBJbnB1dCAgOiAgZmFjZSAgICAgICAgICBmYWNlIG9iamVjdCBoYW5kbGUKKyAqICAgICAgICAgICAgY2hhcm1hcEluZGV4ICBpbmRleCBvZiBjaGFybWFwIGluIGRpcmVjdG9yeQorICogICAgICAgICAgICBjaGFyTWFwICAgICAgIGFkZHJlc3Mgb2YgcmV0dXJuZWQgY2hhcm1hcCBoYW5kbGUKKyAqCisgKiAgT3V0cHV0IDogIEVycm9yIGNvZGUuCisgKgorICogIE1ULVNhZmUgOiBZRVMhCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICBFWFBPUlRfRlVOQworICBUVF9FcnJvciAgVFRfR2V0X0NoYXJNYXAoIFRUX0ZhY2UgICAgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX1VTaG9ydCAgICBjaGFybWFwSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfQ2hhck1hcCogIGNoYXJNYXAgKQorICB7CisgICAgaWYgKCAhZmFjZSApCisgICAgICByZXR1cm4gVFRfRXJyX0ludmFsaWRfRmFjZV9IYW5kbGU7CisKKyAgICBpZiAoIGNoYXJtYXBJbmRleCA+PSBmYWNlLT5udW1fY2hhcm1hcHMgKQorICAgICAgcmV0dXJuIFRUX0Vycl9CYWRfQXJndW1lbnQ7CisKKyAgICAqY2hhck1hcCA9IChUVF9DaGFyTWFwKWZhY2UtPmNoYXJtYXBzICsgY2hhcm1hcEluZGV4OworICAgIHJldHVybiBUVF9FcnJfT2s7CisgIH0KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBGdW5jdGlvbiAgICA6ICBUVF9DaGFyX0luZGV4CisgKgorICogIERlc2NyaXB0aW9uIDogIFJldHVybnMgdGhlIGdseXBoIGluZGV4IGNvcnJlc3BvbmRpbmcgdG8KKyAqICAgICAgICAgICAgICAgICBhIGdpdmVuIGNoYXJhY3RlciBjb2RlIGRlZmluZWQgZm9yIHRoZSAnY2hhcm1hcCcuCisgKgorICogIElucHV0ICA6ICBjaGFyTWFwICAgIGNoYXJtYXAgaGFuZGxlCisgKiAgICAgICAgICAgIGNoYXJjb2RlICAgY2hhcmFjdGVyIGNvZGUKKyAqCisgKiAgT3V0cHV0IDogIGdseXBoIGluZGV4LgorICoKKyAqICBOb3RlcyAgOiAgQ2hhcmFjdGVyIGNvZGUgMCBpcyB0aGUgdW5rbm93biBnbHlwaCwgd2hpY2ggc2hvdWxkIG5ldmVyCisgKiAgICAgICAgICAgIGJlIGRpc3BsYXllZC4KKyAqCisgKiAgTVQtU2FmZSA6IFlFUyEKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIEVYUE9SVF9GVU5DCisgIFRUX1VTaG9ydCAgVFRfQ2hhcl9JbmRleCggVFRfQ2hhck1hcCAgY2hhck1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9VU2hvcnQgICBjaGFyQ29kZSApCisgIHsKKyAgICByZXR1cm4gdHRfaW50ZXJmYWNlLT5nZXRfY2hhcl9pbmRleCggKEZUX0NoYXJNYXApY2hhck1hcCwgY2hhckNvZGUgKTsKKyAgfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIEZ1bmN0aW9uICAgIDogIFRUX0dldF9OYW1lX0NvdW50CisgKgorICogIERlc2NyaXB0aW9uIDogIFJldHVybnMgdGhlIG51bWJlciBvZiBzdHJpbmdzIGZvdW5kIGluIHRoZQorICogICAgICAgICAgICAgICAgIG5hbWUgdGFibGUuCisgKgorICogIElucHV0ICA6ICBmYWNlICAgZmFjZSBoYW5kbGUKKyAqCisgKiAgT3V0cHV0IDogIG51bWJlciBvZiBzdHJpbmdzLgorICoKKyAqICBOb3RlcyAgOiAgUmV0dXJucyAtMSBvbiBlcnJvciAoaW52YWxpZCBoYW5kbGUpLgorICoKKyAqICAgICAgICAgICAgRE9OJ1QgVVNFIFRISVMgRlVOQ1RJT04hIElUIEhBUyBCRUVOIERFUFJFQ0FURUQhCisgKgorICogICAgICAgICAgICBJdCBpcyByZXRhaW5lZCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgb25seSBhbmQgd2lsbAorICogICAgICAgICAgICBmYWlsIG9uIDE2Yml0IHN5c3RlbXMuCisgKgorICogIE1ULVNhZmUgOiBZRVMhCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICBFWFBPUlRfRlVOQworICBpbnQgIFRUX0dldF9OYW1lX0NvdW50KCBUVF9GYWNlICBmYWNlICkKKyAgeworICAgIGlmICggIWZhY2UgKQorICAgICAgcmV0dXJuIC0xOworCisgICAgcmV0dXJuIGZhY2UtPm51bV9uYW1lczsKKyAgfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIEZ1bmN0aW9uICAgIDogIFRUX0dldF9OYW1lX0lECisgKgorICogIERlc2NyaXB0aW9uIDogIFJldHVybnMgdGhlIElEcyBvZiB0aGUgc3RyaW5nIG51bWJlciAnbmFtZUluZGV4JworICogICAgICAgICAgICAgICAgIGluIHRoZSBuYW1lIHRhYmxlIG9mIGEgZ2l2ZW4gZmFjZS4KKyAqCisgKiAgSW5wdXQgIDogIGZhY2UgICAgICAgIGZhY2UgaGFuZGxlCisgKiAgICAgICAgICAgIG5hbWVJbmRleCAgIGluZGV4IG9mIHN0cmluZy4gRmlyc3QgaXMgMAorICogICAgICAgICAgICBwbGF0Zm9ybUlEICBhZGRyZXNzZXMgb2YgcmV0dXJuZWQgSURzCisgKiAgICAgICAgICAgIGVuY29kaW5nSUQKKyAqICAgICAgICAgICAgbGFuZ3VhZ2VJRAorICogICAgICAgICAgICBuYW1lSUQKKyAqCisgKiAgT3V0cHV0IDogIEVycm9yIGNvZGUuCisgKgorICogIE5vdGVzICA6ICBTb21lIGZpbGVzIGhhdmUgYSBjb3JydXB0IG9yIHVudXN1YWwgbmFtZSB0YWJsZSwgd2l0aCBzb21lCisgKiAgICAgICAgICAgIGVudHJpZXMgaGF2aW5nIGEgcGxhdGZvcm1JRCA+IDMuICBUaGVzZSBjYW4gdXN1YWxseQorICogICAgICAgICAgICBiZSBpZ25vcmVkIGJ5IGEgY2xpZW50IGFwcGxpY2F0aW9uLgorICoKKyAqICBNVC1TYWZlIDogWUVTIQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgRVhQT1JUX0ZVTkMKKyAgVFRfRXJyb3IgIFRUX0dldF9OYW1lX0lEKCBUVF9GYWNlICAgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX1VTaG9ydCAgIG5hbWVJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9VU2hvcnQqICBwbGF0Zm9ybUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX1VTaG9ydCogIGVuY29kaW5nSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfVVNob3J0KiAgbGFuZ3VhZ2VJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9VU2hvcnQqICBuYW1lSUQgKQorICB7CisgICAgVFRfTmFtZVJlYyogIG5hbWU7CisKKyAgICBpZiAoIWZhY2UpCisgICAgICByZXR1cm4gVFRfRXJyX0ludmFsaWRfRmFjZV9IYW5kbGU7CisgICAgICAKKyAgICBpZiAoIG5hbWVJbmRleCA+PSBmYWNlLT5udW1fbmFtZXMgKQorICAgICAgcmV0dXJuIFRUX0Vycl9CYWRfQXJndW1lbnQ7CisKKyAgICBuYW1lID0gZmFjZS0+bmFtZV90YWJsZS5uYW1lcyArIG5hbWVJbmRleDsKKyAgICAgICAgCisgICAgKnBsYXRmb3JtSUQgPSBuYW1lLT5wbGF0Zm9ybUlEOworICAgICplbmNvZGluZ0lEID0gbmFtZS0+ZW5jb2RpbmdJRDsKKyAgICAqbGFuZ3VhZ2VJRCA9IG5hbWUtPmxhbmd1YWdlSUQ7CisgICAgKm5hbWVJRCAgICAgPSBuYW1lLT5uYW1lSUQ7CisKKyAgICByZXR1cm4gVFRfRXJyX09rOworICB9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgRnVuY3Rpb24gICAgOiAgVFRfR2V0X05hbWVfU3RyaW5nCisgKgorICogIERlc2NyaXB0aW9uIDogIFJldHVybnMgdGhlIGFkZHJlc3MgYW5kIGxlbmd0aCBvZiBhIGdpdmVuCisgKiAgICAgICAgICAgICAgICAgc3RyaW5nIGZvdW5kIGluIHRoZSBuYW1lIHRhYmxlLgorICoKKyAqICBJbnB1dCAgOiAgZmFjZSAgICAgICAgZmFjZSBoYW5kbGUKKyAqICAgICAgICAgICAgbmFtZUluZGV4ICAgc3RyaW5nIGluZGV4CisgKiAgICAgICAgICAgIHN0cmluZ1B0ciAgIGFkZHJlc3Mgb2YgcmV0dXJuZWQgcG9pbnRlciB0byBzdHJpbmcKKyAqICAgICAgICAgICAgbGVuZ3RoICAgICAgYWRkcmVzcyBvZiByZXR1cm5lZCBzdHJpbmcgbGVuZ3RoCisgKgorICogIE91dHB1dCA6ICBFcnJvciBjb2RlLgorICoKKyAqICBOb3RlcyAgOiAgSWYgdGhlIHN0cmluZydzIHBsYXRmb3JtSUQgaXMgaW52YWxpZCwKKyAqICAgICAgICAgICAgc3RyaW5nUHRyIGlzIE5VTEwsIGFuZCBsZW5ndGggaXMgMC4KKyAqCisgKiAgTVQtU2FmZSA6IFlFUyEKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIEVYUE9SVF9GVU5DCisgIFRUX0Vycm9yICBUVF9HZXRfTmFtZV9TdHJpbmcoIFRUX0ZhY2UgICAgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9VU2hvcnQgICAgbmFtZUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9TdHJpbmcqKiAgc3RyaW5nUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9VU2hvcnQqICAgbGVuZ3RoICkKKyAgeworICAgIFRUX05hbWVSZWMqIG5hbWU7CisgICAgCisgICAgaWYgKCFmYWNlKQorICAgICAgcmV0dXJuIFRUX0Vycl9JbnZhbGlkX0ZhY2VfSGFuZGxlOworICAgICAgCisgICAgaWYgKCBuYW1lSW5kZXggPj0gZmFjZS0+bnVtX25hbWVzICkKKyAgICAgIHJldHVybiBUVF9FcnJfQmFkX0FyZ3VtZW50OworCisgICAgbmFtZSA9IGZhY2UtPm5hbWVfdGFibGUubmFtZXMgKyBuYW1lSW5kZXg7CisKKyAgICAqc3RyaW5nUHRyID0gKFRUX1N0cmluZyopbmFtZS0+c3RyaW5nOworICAgICpsZW5ndGggICAgPSBuYW1lLT5zdHJpbmdMZW5ndGg7ICAgICAgICAKKyAgICAKKyAgICByZXR1cm4gVFRfRXJyX09rOworICB9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgRnVuY3Rpb24gICAgOiAgVFRfR2V0X0ZvbnRfRGF0YQorICoKKyAqICBEZXNjcmlwdGlvbiA6ICBMb2FkcyBhbnkgZm9udCB0YWJsZSBpbiBjbGllbnQgbWVtb3J5LiAgVXNlZCBieQorICogICAgICAgICAgICAgICAgIHRoZSBUVF9HZXRfRm9udF9EYXRhKCkuCisgKgorICogIElucHV0ICA6ICBmYWNlICAgICBGYWNlIG9iamVjdCB0byBsb29rIGZvci4KKyAqCisgKiAgICAgICAgICAgIHRhZyAgICAgIFRhZyBvZiB0YWJsZSB0byBsb2FkLiAgVXNlIHRoZSB2YWx1ZSAwIGlmIHlvdQorICogICAgICAgICAgICAgICAgICAgICB3YW50IHRvIGFjY2VzcyB0aGUgd2hvbGUgZm9udCBmaWxlLCBlbHNlIHNldAorICogICAgICAgICAgICAgICAgICAgICB0aGlzIHBhcmFtZXRlciB0byBhIHZhbGlkIFRydWVUeXBlIHRhYmxlIHRhZworICogICAgICAgICAgICAgICAgICAgICB0aGF0IHlvdSBjYW4gZm9yZ2Ugd2l0aCB0aGUgTUFLRV9UVF9UQUcKKyAqICAgICAgICAgICAgICAgICAgICAgbWFjcm8uCisgKgorICogICAgICAgICAgICBvZmZzZXQgICBTdGFydGluZyBvZmZzZXQgaW4gdGhlIHRhYmxlIChvciB0aGUgZmlsZQorICogICAgICAgICAgICAgICAgICAgICBpZiB0YWcgPT0gMCkuCisgKgorICogICAgICAgICAgICBidWZmZXIgICBBZGRyZXNzIG9mIHRhcmdldCBidWZmZXIKKyAqCisgKiAgICAgICAgICAgIGxlbmd0aCAgIEFkZHJlc3Mgb2YgZGVjaXNpb24gdmFyaWFibGU6CisgKgorICogICAgICAgICAgICAgICAgICAgICAgIGlmIGxlbmd0aCA9PSBOVUxMOgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvYWQgdGhlIHdob2xlIHRhYmxlLiAgUmV0dXJucyBhbgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuIGVycm9yIGlmICdvZmZzZXQnICE9IDAuCisgKgorICogICAgICAgICAgICAgICAgICAgICAgIGlmICpsZW5ndGggPT0gMCA6CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhpdCBpbW1lZGlhdGVseSwgcmV0dXJuaW5nIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCBvZiB0aGUgZ2l2ZW4gdGFibGUsIG9yIG9mCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGZvbnQgZmlsZSwgZGVwZW5kaW5nIG9uIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIG9mICd0YWcnLgorICoKKyAqICAgICAgICAgICAgICAgICAgICAgICBpZiAqbGVuZ3RoICE9IDAgOgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvYWQgdGhlIG5leHQgJ2xlbmd0aCcgYnl0ZXMgb2YKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZSBvciBmb250LCBzdGFydGluZyBhdCBvZmZzZXQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnb2Zmc2V0JyAoaW4gdGFibGUgb3IgZm9udCB0b28pLgorICoKKyAqICBPdXRwdXQgOiAgRXJyb3IgY29kZS4KKyAqCisgKiAgTVQtU2FmZSA6IFlFUyEKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIEVYUE9SVF9GVU5DCisgIFRUX0Vycm9yICBUVF9HZXRfRm9udF9EYXRhKCBUVF9GYWNlICAgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX1VMb25nICB0YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9Mb25nICAgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX0xvbmcqICBsZW5ndGggKQorICB7CisgICAgcmV0dXJuIHR0X2V4dGVuc2lvbi0+Z2V0X2ZvbnRfZGF0YSggZmFjZSwgdGFnLCBvZmZzZXQsIGJ1ZmZlciwgbGVuZ3RoICk7CisgIH0KKworCisKKworCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogIFBvc3RzY3JpcHQgTmFtZXMgZXh0ZW5zaW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIC8qIEluaXRpYWxpc2UgdGhlIFBvc3RzY3JpcHQgTmFtZXMgZXh0ZW5zaW9uICovCisgIEVYUE9SVF9GVU5DCisgIFRUX0Vycm9yIFRUX0luaXRfUG9zdF9FeHRlbnNpb24oIFRUX0VuZ2luZSAgZW5naW5lICkKKyAgeworICAgICh2b2lkKWVuZ2luZTsKKyAgICByZXR1cm4gVFRfRXJyX09rOworICB9CisKKyAgLyogTG9hZCB0aGUgUG9zdHNjcmlwdCBOYW1lcyB0YWJsZSAtIG5vdGljZSB0aGF0IHRoZSAncG9zdCcgcGFyYW1ldGVyICovCisgIC8qIHdpbGwgYmUgaWdub3JlZCBpbiAyLjAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBFWFBPUlRfREVGCisgIFRUX0Vycm9yIFRUX0xvYWRfUFNfTmFtZXMoIFRUX0ZhY2UgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgcG9zdCApCisgIHsKKyAgICAodm9pZClwb3N0OworICAgICh2b2lkKWZhY2U7CisKKyAgICAvKiB0aGUgbmFtZXMgYXJlIG5vdyBsb2FkZWQgb24gZGVtYW5kIGluIDIuMCAqLworICAgIHJldHVybiBUVF9FcnJfT2s7CisgIH0KKworCisgIC8qIFRoZSBmb2xsb3dpbmcgaXMgZGlyZWN0bHkgaW1wbGVtZW50ZWQgaW4gdGhlIFRydWVUeXBlIGRyaXZlciAqLworI2lmIDAKKyAgLyogR2V0cyB0aGUgcG9zdHNjcmlwdCBuYW1lIG9mIGEgc2luZ2xlIGdseXBoICovCisgIEVYUE9SVF9ERUYKKyAgVFRfRXJyb3IgVFRfR2V0X1BTX05hbWUoIFRUX0ZhY2UgICAgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfVVNob3J0ICAgIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfU3RyaW5nKiogIFBTbmFtZSApOworI2VuZGlmCisKKworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICBFbWJlZGRlZCBCaXRtYXAgKHNiaXRzKSBleHRlbnNpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX0luaXRfU0JpdF9FeHRlbnNpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEluaXRpYWxpc2UgdGhlIGVtYmVkZGVkIGJpdG1hcHMgZXh0ZW5zaW9uIGZvciB0aGUgICAgICAqLworICAvKiAgICBGcmVlVHlwZSBlbmdpbmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBlbmdpbmUgIDo6IGhhbmRsZSB0byBjdXJyZW50IEZyZWVUeXBlIGxpYnJhcnkgaW5zdGFuY2UgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBFcnJvciBjb2RlLiAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEVYUE9SVF9GVU5DCisgIFRUX0Vycm9yICBUVF9Jbml0X1NCaXRfRXh0ZW5zaW9uKCBUVF9FbmdpbmUgIGVuZ2luZSApCisgIHsKKyAgICAodm9pZCllbmdpbmU7CisgICAgcmV0dXJuIFRUX0Vycl9PazsKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfR2V0X0ZhY2VfQml0bWFwcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgTG9hZHMgdGhlICJFQkxDIiB0YWJsZSBmcm9tIGEgZm9udCBmaWxlLCBpZiBhbnkuICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZmFjZSA6OiBoYW5kbGUgdG8gdGhlIHNvdXJjZSBUcnVlVHlwZSBmb250L2ZhY2UgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZWJsY190YWJsZSA6OiBhIGRlc2NyaXB0b3IgZm9yIHRoZSBFQkxDIHRhYmxlICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRXJyb3IgY29kZS4gMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIFRUX0Vycl9UYWJsZV9NaXNzaW5nIHdoZW4gdGhlICAgICovCisgIC8qICAgIGZvbnQgY29udGFpbnMgbm8gZW1iZWRkZWQgYml0bWFwcy4gQWxsIGZpZWxkcyBpbiAgICAgICAqLworICAvKiAgICAiZWJsY190YWJsZSIgd2lsbCB0aGVuIGJlIHNldCB0byAwLiAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEVYUE9SVF9GVU5DCisgIFRUX0Vycm9yICBUVF9HZXRfRmFjZV9CaXRtYXBzKCBUVF9GYWNlICAgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX0VCTEMgICplYmxjX3RhYmxlICkKKyAgeworICAgIGlmICghZmFjZSkKKyAgICAgIHJldHVybiBGVF9FcnJfSW52YWxpZF9GYWNlX0hhbmRsZTsKKworICAgIGVibGNfdGFibGUtPm51bV9zdHJpa2VzID0gZmFjZS0+bnVtX3NiaXRfc3RyaWtlczsKKyAgICBlYmxjX3RhYmxlLT5zdHJpa2VzICAgICA9IGZhY2UtPnNiaXRfc3RyaWtlczsKKworICAgIGlmICggZmFjZS0+bnVtX3NiaXRfc3RyaWtlcyA+IDAgKQorICAgIHsKKyAgICAgIGVibGNfdGFibGUtPnZlcnNpb24gPSAweDAwMDAyMDAwOworICAgICAgcmV0dXJuIFRUX0Vycl9PazsKKyAgICB9CisKKyAgICBlYmxjX3RhYmxlLT52ZXJzaW9uID0gMDsKKyAgICByZXR1cm4gVFRfRXJyX1RhYmxlX01pc3Npbmc7CisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX05ld19TQml0X0ltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEFsbG9jYXRlcyBhIG5ldyBlbWJlZGRlZCBiaXRtYXAgY29udGFpbmVyICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGltYWdlIDo6IHNiaXQgaW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEVycm9yIGNvZGUuIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgRVhQT1JUX0RFRgorICBUVF9FcnJvciAgVFRfTmV3X1NCaXRfSW1hZ2UoIFRUX1NCaXRfSW1hZ2UqICAqaW1hZ2UgKQorICB7CisgICAgKmltYWdlID0gKFRUX1NCaXRfSW1hZ2UqKW1hbGxvYyggc2l6ZW9mKCoqaW1hZ2UpICk7CisgICAgaWYgKCAhKmltYWdlICkKKyAgICAgIHJldHVybiBUVF9FcnJfT3V0X09mX01lbW9yeTsKKworICAgIE1FTV9TZXQoICppbWFnZSwgc2l6ZW9mKCoqaW1hZ2UpLCAwICk7CisgICAgcmV0dXJuIFRUX0Vycl9PazsKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfRG9uZV9TQml0X0ltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgUmVsZWFzZXMgYW4gZW1iZWRkZWQgYml0bWFwIGNvbnRhaW5lciAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgaW1hZ2UgOjogc2JpdCBpbWFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBFWFBPUlRfREVGCisgIHZvaWQgICAgICBUVF9Eb25lX1NCaXRfSW1hZ2UoIFRUX1NCaXRfSW1hZ2UqICBpbWFnZSApCisgIHsKKyAgICBmcmVlKCBpbWFnZS0+bWFwLmJpdG1hcCApOworICAgIGZyZWUoIGltYWdlICk7CisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX0xvYWRfR2x5cGhfQml0bWFwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIExvYWRzIGEgZ2l2ZW4gZ2x5cGggZW1iZWRkZWQgYml0bWFwICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZhY2UgICAgICAgIDo6IGhhbmRsZSB0byB0aGUgc291cmNlIFRydWVUeXBlIGZvbnQvZmFjZSAqLworICAvKiAgICBpbnN0YW5jZSAgICA6OiBjdXJyZW50IHNpemUvdHJhbnNmb3JtIGluc3RhbmNlICAgICAgICAgKi8KKyAgLyogICAgZ2x5cGhfaW5kZXggOjogaW5kZXggb2Ygc291cmNlIGdseXBoICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGJpdG1hcCAgICAgIDo6IHRhcmdldCBlbWJlZGRlZCBiaXRtYXAgZGVzY3JpcHRvciAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEVycm9yIGNvZGUuIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhbiBlcnJvciBpZiB0aGVyZSBpcyBubyAgICAgICAgICAqLworICAvKiAgICBlbWJlZGRlZCBiaXRtYXAgZm9yIHRoZSBnbHlwaCBhdCB0aGUgZ2l2ZW4gICAgICAgICAgICAgKi8KKyAgLyogICAgaW5zdGFuY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBFWFBPUlRfRlVOQworICBUVF9FcnJvciAgVFRfTG9hZF9HbHlwaF9CaXRtYXAoIFRUX0ZhY2UgICAgICAgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX0luc3RhbmNlICAgICBpbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9VU2hvcnQgICAgICAgZ2x5cGhfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfU0JpdF9JbWFnZSogIGJpdG1hcCApCisgIHsKKyAgICBGVF9HbHlwaFNsb3QgIHNsb3Q7CisgICAgVFRfRXJyb3IgICAgICBlcnJvcjsKKworICAgIGVycm9yID0gRlRfTmV3X0dseXBoU2xvdCggKEZUX0ZhY2UpZmFjZSwgJnNsb3QgKTsKKyAgICBpZiAoZXJyb3IpIGdvdG8gRXhpdDsKKworICAgIGVycm9yID0gRlRfTG9hZF9HbHlwaCggc2xvdCwgKEZUX1NpemUpaW5zdGFuY2UsIGdseXBoX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTE9BRF9OT19PVVRMSU5FLCAwICk7CisgICAgaWYgKCFlcnJvcikKKyAgICB7CisgICAgICAvKiBjb3B5IGJpdG1hcCAqLworICAgICAgYml0bWFwLT5tYXAud2lkdGggID0gc2xvdC0+Yml0bWFwLndpZHRoOworICAgICAgYml0bWFwLT5tYXAucm93cyAgID0gc2xvdC0+Yml0bWFwLnJvd3M7CisgICAgICBiaXRtYXAtPm1hcC5jb2xzICAgPSBzbG90LT5iaXRtYXAuY29sczsKKyAgICAgIGJpdG1hcC0+bWFwLmZsb3cgICA9IHNsb3QtPmJpdG1hcC5mbG93OworICAgICAgYml0bWFwLT5iaXRfZGVwdGggID0gc2xvdC0+Yml0bWFwLnBpeF9iaXRzOworICAgICAgYml0bWFwLT5tYXAuYml0bWFwID0gc2xvdC0+Yml0bWFwLmJ1ZmZlcjsKKworICAgICAgLyogY29weSBtZXRyaWNzICovCisgICAgICBiaXRtYXAtPm1ldHJpY3MuYmJveC54TWluID0gc2xvdC0+bWV0cmljcy5ob3JpQmVhcmluZ1ggPj4gNjsKKyAgICAgIGJpdG1hcC0+bWV0cmljcy5iYm94LnhNYXggPSBiaXRtYXAtPm1ldHJpY3MuYmJveC54TWluICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2xvdC0+bWV0cmljcy53aWR0aCA+PiA2KTsKKyAgICAgIGJpdG1hcC0+bWV0cmljcy5iYm94LnlNYXggPSBzbG90LT5tZXRyaWNzLmhvcmlCZWFyaW5nWSA+PiA2OworICAgICAgYml0bWFwLT5tZXRyaWNzLmJib3gueU1pbiA9IGJpdG1hcC0+bWV0cmljcy5iYm94LnlNYXggLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzbG90LT5tZXRyaWNzLmhlaWdodCA+PiA2KTsKKworICAgICAgYml0bWFwLT5tZXRyaWNzLmhvcmlCZWFyaW5nWCA9IGJpdG1hcC0+bWV0cmljcy5iYm94LnhNaW47CisgICAgICBiaXRtYXAtPm1ldHJpY3MuaG9yaUJlYXJpbmdZID0gYml0bWFwLT5tZXRyaWNzLmJib3gueU1heDsKKyAgICAgIGJpdG1hcC0+bWV0cmljcy5ob3JpQWR2YW5jZSAgPSBzbG90LT5tZXRyaWNzLmhvcmlBZHZhbmNlID4+IDY7CisKKyAgICAgIGJpdG1hcC0+bWV0cmljcy52ZXJ0QmVhcmluZ1ggPSBzbG90LT5tZXRyaWNzLnZlcnRCZWFyaW5nWCA+PiA2OworICAgICAgYml0bWFwLT5tZXRyaWNzLnZlcnRCZWFyaW5nWSA9IHNsb3QtPm1ldHJpY3MudmVydEJlYXJpbmdZID4+IDY7CisgICAgICBiaXRtYXAtPm1ldHJpY3MudmVydEFkdmFuY2UgID0gc2xvdC0+bWV0cmljcy52ZXJ0QWR2YW5jZSAgPj4gNjsKKworICAgICAgc2xvdC0+Yml0bWFwLmJ1ZmZlciA9IDA7CisgICAgfQorCisgICAgRlRfRG9uZV9HbHlwaFNsb3QoIHNsb3QgKTsKKyAgRXhpdDoKKyAgICByZXR1cm4gZXJyb3I7CisgIH0KKworLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvc2ZudC9ydWxlcy5tayBiL3NyYy9zZm50L3J1bGVzLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhYTAwOGIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvc2ZudC9ydWxlcy5tawpAQCAtMCwwICsxLDE3MiBAQAorIyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyMqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisjKiAgU0ZOVCBkcml2ZXIgTWFrZWZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMqICBDb3B5cmlnaHQgMTk5Ni0xOTk5IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisjKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAgKgorIyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQgICAgICAgICAqCisjKiAgbW9kaWZpZWQgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICAgKgorIyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgICoKKyMqICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICAqCisjKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKworIyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyMqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisjKiAgSU1QT1JUQU5UIE5PVEU6IFRoaXMgTWFrZWZpbGUgaXMgaW50ZW5kZWQgZm9yIEdOVSBNYWtlISAgICAgICAgICAgICAgICAgKgorIyogICAgICAgICAgICAgICAgICBJZiB5b3UgcHJvdmlkZSBNYWtlZmlsZXMgZm9yIG90aGVyIG1ha2UgdXRpbGl0aWVzLCAgICAgICoKKyMqICAgICAgICAgICAgICAgICAgcGxlYXNlIHBsYWNlIHRoZW0gaW4gYGZyZWV0eXBlL2xpYi9hcmNoLzxzeXN0ZW0+Jy4gICAgICAqCisjKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMqICBUaGlzIGZpbGUgaXMgdG8gYmUgaW5jbHVkZWQgYnkgdGhlIEZyZWVUeXBlIE1ha2VmaWxlLmxpYiwgbG9jYXRlZCBpbiAgICAqCisjKiAgdGhlIGBmcmVldHlwZS9saWInIGRpcmVjdG9yeS4gIEhlcmUgaXMgdGhlIGxpc3Qgb2YgdGhlIHZhcmlhYmxlcyB0aGF0ICAgKgorIyogIG11c3QgYmUgZGVmaW5lZCB0byB1c2UgaXQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisjKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIyogICAgIEJBU0VfRElSOiAgICBUaGUgbG9jYXRpb24gb2YgdGhlIGJhc2UgbGF5ZXIncyBkaXJlY3RvcnkuICBUaGlzIGlzICAgICoKKyMqICAgICAgICAgICAgICAgICAgdXN1YWxseSBgZnJlZXR5cGUvbGliL2Jhc2UnLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisjKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIyogICAgIEFSQ0hfRElSOiAgICBUaGUgbG9jYXRpb24gb2YgdGhlIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgZGlyZWN0b3J5LiAgICoKKyMqICAgICAgICAgICAgICAgICAgVGhpcyBpcyB1c3VhbGx5IGBmcmVldHlwZS9saWIvYXJjaC88c3lzdGVtPicuICAgICAgICAgICAqCisjKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIyogICAgIERSSVZFUlNfRElSOiBUaGUgbG9jYXRpb24gb2YgdGhlIGZvbnQgZHJpdmVyIHN1Yi1kaXJzLCB1c3VhbGx5ICAgICAgICoKKyMqICAgICAgICAgICAgICAgICAgYGZyZWV0eXBlL2xpYi9kcml2ZXJzJy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisjKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIyogICAgIE9CSl9ESVI6ICAgICBUaGUgbG9jYXRpb24gd2hlcmUgdGhlIGNvbXBpbGVkIG9iamVjdChzKSBmaWxlIHdpbGwgYmUgICoKKyMqICAgICAgICAgICAgICAgICAgcGxhY2VkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisjKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIyogICAgIEJBU0VfSDogICAgICBBIGxpc3Qgb2YgcGF0aG5hbWVzIHRvIHRoZSBiYXNlIGxheWVyJ3MgaGVhZGVyIGZpbGVzIG9uICoKKyMqICAgICAgICAgICAgICAgICAgd2hpY2ggdGhlIGRyaXZlciBkZXBlbmRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisjKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIyogICAgIEZUX0NGTEFHUzogICBBIHNldCBvZiBmbGFncyB1c2VkIGZvciBjb21waWxhdGlvbiBvZiBvYmplY3QgZmlsZXMuICAgICoKKyMqICAgICAgICAgICAgICAgICAgVGhpcyBjb250YWlucyBhdCBsZWFzdCB0aGUgaW5jbHVkZSBwYXRocyBvZiB0aGUgYXJjaCAgICAqCisjKiAgICAgICAgICAgICAgICAgIGFuZCBiYXNlIGRpcmVjdG9yaWVzICsgb3B0aW1pemF0aW9uICsgd2FybmluZ3MgKyBBTlNJICAgKgorIyogICAgICAgICAgICAgICAgICBjb21wbGlhbmNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisjKiAgICAgRlRfSUZMQUc6ICAgIFRoZSBmbGFnIHVzZWQgdG8gc3BlY2lmeSBhbiBpbmNsdWRlIHBhdGggb24gdGhlICAgICAgICAgKgorIyogICAgICAgICAgICAgICAgICBjb21waWxlciBjb21tYW5kIGxpbmUuICBGb3IgZXhhbXBsZSwgd2l0aCBHQ0MsIHRoaXMgaXMgICoKKyMqICAgICAgICAgICAgICAgICAgYC1JJywgd2hpbGUgc29tZSBvdGhlciBjb21waWxlcnMgdXNlIGAvaT0nIG9yIGAtSicsICAgICAqCisjKiAgICAgICAgICAgICAgICAgIGV0Yy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMqICAgICBGVF9PQko6ICAgICAgVGhlIHN1ZmZpeCBvZiBhbiBvYmplY3QgZmlsZSBmb3IgdGhlIHBsYXRmb3JtOyBjYW4gYmUgICAqCisjKiAgICAgICAgICAgICAgICAgIGBvJywgYG9iaicsIGBjb2ZmJywgYHRjbycsIGV0Yy4gZGVwZW5kaW5nIG9uIHRoZSAgICAgICAgKgorIyogICAgICAgICAgICAgICAgICBwbGF0Zm9ybS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisjKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIyogIEl0IGFsc28gdXBkYXRlcyB0aGUgZm9sbG93aW5nIHZhcmlhYmxlcyBkZWZpbmVkIGFuZCB1c2VkIGluIHRoZSBtYWluICAgICoKKyMqICBNYWtlZmlsZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisjKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIyogICAgIERSVl9PQkpfUzogICAgICAgICAgICBUaGUgbGlzdCBvZiBkcml2ZXIgb2JqZWN0IGZpbGVzIGluICAgICAgICAgICAgICoKKyMqICAgICAgICAgICAgICAgICAgICAgICAgICAgc2luZ2xlLW9iamVjdCBtb2RlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisjKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIyogICAgIERSVl9PQkpfTTogICAgICAgICAgICBUaGUgbGlzdCBvZiBkcml2ZXIgb2JqZWN0IGZpbGVzIGluICAgICAgICAgICAgICoKKyMqICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVsdGlwbGUtb2JqZWN0cyBtb2RlLiAgICAgICAgICAgICAgICAgICAgICAgICAqCisjKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIyogICAgIEZUSU5JVF9EUklWRVJfUEFUSFM6ICBUaGUgbGlzdCBvZiBpbmNsdWRlIHBhdGhzIHVzZWQgdG8gY29tcGlsZSB0aGUgICoKKyMqICAgICAgICAgICAgICAgICAgICAgICAgICAgYGZ0aW5pdCcgY29tcG9uZW50IHdoaWNoIHJlZ2lzdGVycyBhbGwgZm9udCAgICAqCisjKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcml2ZXJzIGluIHRoZSBGVF9Jbml0X0ZyZWVUeXBlKCkgZnVuY3Rpb24uICAgKgorIyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMqICAgICBGVElOSVRfRFJJVkVSX0g6ICAgICAgVGhlIGxpc3Qgb2YgaGVhZGVyIGRlcGVuZGVuY2llcyB1c2VkIHRvICAgICAgICAqCisjKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGUgdGhlIGBmdGluaXQnIGNvbXBvbmVudC4gICAgICAgICAgICAgICAgKgorIyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMqICAgICBGVElOSVRfRFJJVkVSX01BQ1JPUzogVGhlIGxpc3Qgb2YgbWFjcm9zIHRvIGJlIGRlZmluZWQgd2hlbiAgICAgICAgICAqCisjKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGluZyB0aGUgYGZ0aW5pdCcgY29tcG9uZW50LiAgICAgICAgICAgICAgKgorIyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMqICBgU2luZ2xlLW9iamVjdCBjb21waWxhdGlvbicgbWVhbnMgdGhhdCBlYWNoIGZvbnQgZHJpdmVyIGlzIGNvbXBpbGVkICAgICAqCisjKiAgaW50byBhIHNpbmdsZSBvYmplY3QgZmlsZS4gIFRoaXMgaXMgdXNlZnVsIHRvIGdldCByaWQgb2YgYWxsICAgICAgICAgICAgKgorIyogIGRyaXZlci1zcGVjaWZpYyBlbnRyaWVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisjKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCitpZm5kZWYgU0ZOVF9JTkNMVURFCitTRk5UX0lOQ0xVREVEIDo9IDEKKworaW5jbHVkZSAkKFNSQ18pc2hhcmVkL3J1bGVzLm1rCisKKyMgU0ZOVCBkcml2ZXIgZGlyZWN0b3J5CisjCitTRk5UX0RJUiAgOj0gJChTUkNfKXNmbnQKK1NGTlRfRElSXyA6PSAkKFNGTlRfRElSKSQoU0VQKQorCisjIGFkZGl0aW9uYWwgaW5jbHVkZSBmbGFncyB1c2VkIHdoZW4gY29tcGlsaW5nIHRoZSBkcml2ZXIKKyMKK1NGTlRfSU5DTFVERSA6PSAkKFNIQVJFRCkgJChTRk5UX0RJUikKKworCisjIGNvbXBpbGF0aW9uIGZsYWdzIGZvciB0aGUgZHJpdmVyCisjCitTRk5UX0NGTEFHUyAgOj0gJChTRk5UX0lOQ0xVREU6JT0kSSUpCitTRk5UX0NPTVBJTEUgOj0gJChGVF9DQykgJChTRk5UX0NGTEFHUykgCisKKworIyBUcnVlVHlwZSBkcml2ZXIgc291cmNlcyAoaS5lLiwgQyBmaWxlcykKKyMKK1NGTlRfRFJWX1NSQyA6PSAkKFNGTlRfRElSXyl0dGxvYWQuYyAgICBcCisgICAgICAgICAgICAgICAgJChTRk5UX0RJUl8pdHRjbWFwLmMgICAgXAorICAgICAgICAgICAgICAgICQoU0ZOVF9ESVJfKXR0c2JpdC5jICAgIFwKKyAgICAgICAgICAgICAgICAkKFNGTlRfRElSXyl0dHBvc3QuYyAgICBcCisgICAgICAgICAgICAgICAgJChTRk5UX0RJUl8pc2Zkcml2ZXIuYyAgXAorCisKKyMgVHJ1ZVR5cGUgZHJpdmVyIGhlYWRlcnMKKyMKK1NGTlRfRFJWX0ggOj0gJChTSEFSRURfSCkgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICQoU0ZOVF9ESVJfKXNmY29uZmlnLmggICAgXAorICAgICAgICAgICAgICAkKFNGTlRfRElSXyl0dGxvYWQuaCAgICAgIFwKKyAgICAgICAgICAgICAgJChTRk5UX0RJUl8pdHRzYml0LmggICAgICBcCisgICAgICAgICAgICAgICQoU0ZOVF9ESVJfKXR0Y21hcC5oICAgICAgXAorICAgICAgICAgICAgICAkKFNGTlRfRElSXyl0dHBvc3QuaAorCisKKyMgZHJpdmVyIG9iamVjdChzKQorIworIyAgIFNGTlRfRFJWX09CSl9NIGlzIHVzZWQgZHVyaW5nIGBkZWJ1ZycgYnVpbGRzCisjICAgU0ZOVF9EUlZfT0JKX1MgaXMgdXNlZCBkdXJpbmcgYHJlbGVhc2UnIGJ1aWxkcworIworU0ZOVF9EUlZfT0JKX00gOj0gJChTRk5UX0RSVl9TUkM6JChTRk5UX0RJUl8pJS5jPSQoT0JKXyklLiRPKQorU0ZOVF9EUlZfT0JKX1MgOj0gJChPQkpfKXNmbnQuJE8KKworCisjIGRyaXZlciByb290IHNvdXJjZSBmaWxlKHMpCisjCitTRk5UX0RSVl9TUkNfTSA6PSAkKFNGTlRfRFJWX1NSQykKK1NGTlRfRFJWX1NSQ19TIDo9ICQoU0ZOVF9ESVJfKXNmbnQuYworCisKKyMgZHJpdmVyIC0gc2luZ2xlIG9iamVjdAorIworIyAgdGhlIGRyaXZlciBpcyByZWNvbXBpbGVkIGlmIGFueSBvZiB0aGUgaGVhZGVyIG9yIHNvdXJjZSBmaWxlcyBpcyBjaGFuZ2VkCisjICBhcyB3ZWxsIGFzIGFueSBvZiB0aGUgc2hhcmVkIHNvdXJjZSBmaWxlcyBmb3VuZCBpbiBgc2hhcmVkL3NmbnQnCisjCiskKFNGTlRfRFJWX09CSl9TKTogJChCQVNFX0gpICQoU0hBUkVEX0gpICQoU0ZOVF9EUlZfSCkgJChTRk5UX0RSVl9TUkMpICQoU0ZOVF9EUlZfU1JDX1MpCisJJChTRk5UX0NPTVBJTEUpICRUJEAgJChTRk5UX0RSVl9TUkNfUykKKworCisKKyMgZHJpdmVyIC0gbXVsdGlwbGUgb2JqZWN0cworIworIyAgIEFsbCBvYmplY3RzIGFyZSByZWNvbXBpbGVkIGlmIGFueSBvZiB0aGUgaGVhZGVyIGZpbGVzIGlzIGNoYW5nZWQKKyMKKyQoT0JKXyl0dCUuJE86ICQoU0ZOVF9ESVJfKXR0JS5jICQoQkFTRV9IKSAkKFNIQVJFRF9IKSAkKFNGTlRfRFJWX0gpCisJJChTRk5UX0NPTVBJTEUpICRUJEAgJDwKKworJChPQkpfKXNmJS4kTzogJChTRk5UX0RJUl8pc2YlLmMgJChCQVNFX0gpICQoU0hBUkVEX0gpICQoU0ZOVF9EUlZfSCkKKwkkKFNGTlRfQ09NUElMRSkgJFQkQCAkPAorCisjIHVwZGF0ZSBtYWluIGRyaXZlciBvYmplY3QgbGlzdHMKKyMKK0RSVl9PQkpTX1MgKz0gJChTRk5UX0RSVl9PQkpfUykKK0RSVl9PQkpTX00gKz0gJChTRk5UX0RSVl9PQkpfTSkKKworCisjIHVwZGF0ZSBgZnRpbml0JyB2YXJpYWJsZXMKKyMKK0ZUSU5JVF9EUklWRVJfUEFUSFMgICs9ICQoU0ZOVF9ESVIpICQoU0hBUkVEKQorRlRJTklUX0RSSVZFUl9IICAgICAgKz0gJChTRk5UX0RSVl9IKQorRlRJTklUX0RSSVZFUl9NQUNST1MgKz0gRlRfU1VQUE9SVF9TRk5UCisKK2VuZGlmCisjIEVORApkaWZmIC0tZ2l0IGEvc3JjL3NmbnQvc2Zjb25maWcuaCBiL3NyYy9zZm50L3NmY29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGMxNmI5ZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9zZm50L3NmY29uZmlnLmgKQEAgLTAsMCArMSw1MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgc2Zjb25maWcuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIHRoZSBgc2ZudCcgZHJpdmVyIGNvbmZpZ3VyYXRpb24gZmlsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAxOTk2LTE5OTkgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCAgICAgICAgKi8KKy8qICBtb2RpZmllZCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgICovCisvKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLworLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KKy8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogVGhpcyBmaWxlIGlzIHVzZWQgdG8gY29uZmlndXJlIHZhcmlvdXMgYXNwZWN0cyBvZiB0aGUgVHJ1ZVR5cGUgICAgICAgICovCisgIC8qIGRyaXZlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2lmbmRlZiBTRkNPTkZJR19ICisjZGVmaW5lIFNGQ09ORklHX0gKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogRGVmaW5lIFRUX0NPTkZJR19PUFRJT05fRU1CRURERURfQklUTUFQUyBpZiB5b3Ugd2FudCB0byBzdXBwb3J0ICAgICAgICovCisgIC8qIGVtYmVkZGVkIGJpdG1hcHMgaW4gdGhlIFRydWVUeXBlL09wZW5UeXBlIGRyaXZlci4gICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVFRfQ09ORklHX09QVElPTl9FTUJFRERFRF9CSVRNQVBTCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIERlZmluZSBUVF9DT05GSUdfT1BUSU9OX1BPU1RTQ1JJUFRfTkFNRVMgaWYgeW91IHdhbnQgdG8gYmUgYWJsZSB0byAgICAqLworICAvKiBsb2FkIGFuZCBlbnVtZXJhdGUgdGhlIGdseXBoIFBvc3RzY3JpcHQgbmFtZXMgaW4gYSBUcnVlVHlwZSBvciAgICAgICAgKi8KKyAgLyogT3BlblR5cGUgZmlsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUVF9DT05GSUdfT1BUSU9OX1BPU1RTQ1JJUFRfTkFNRVMKKworCisjZW5kaWYgLyogU0ZDT05GSUdfSCAqLworCisKKy8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3NmbnQvc2Zkcml2ZXIuYyBiL3NyYy9zZm50L3NmZHJpdmVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGYxNzNmYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9zZm50L3NmZHJpdmVyLmMKQEAgLTAsMCArMSw3MiBAQAorI2luY2x1ZGUgPHNmZHJpdmVyLmg+CisjaW5jbHVkZSA8dHRsb2FkLmg+CisjaW5jbHVkZSA8dHRzYml0Lmg+CisjaW5jbHVkZSA8dHRwb3N0Lmg+CisjaW5jbHVkZSA8dHRjbWFwLmg+CisjaW5jbHVkZSA8c2Zjb25maWcuaD4KKyNpbmNsdWRlIDxzZm50Lmg+CisKKyAgc3RhdGljIGNvbnN0IFNGTlRfSW50ZXJmYWNlICBzZm50X2ludGVyZmFjZSA9CisgIHsKKyAgICBUVF9Hb3RvX1RhYmxlLAorICAgIAorICAgIFRUX0xvYWRfQW55LAorICAgIFRUX0xvYWRfRGlyZWN0b3J5LAorCisgICAgVFRfTG9hZF9IZWFkZXIsCisgICAgVFRfTG9hZF9NZXRyaWNzX0hlYWRlciwKKyAgICBUVF9Mb2FkX0NNYXAsCisgICAgVFRfTG9hZF9NYXhQcm9maWxlLAorICAgIFRUX0xvYWRfT1MyLAorICAgIFRUX0xvYWRfUG9zdFNjcmlwdCwKKworICAgIFRUX0xvYWRfTmFtZXMsCisgICAgVFRfRnJlZV9OYW1lcywKKworICAgIFRUX0xvYWRfSGRteCwKKyAgICBUVF9GcmVlX0hkbXgsCisKKyAgICBUVF9Mb2FkX0tlcm4sCisgICAgVFRfTG9hZF9HYXNwLAorCisjaWZkZWYgVFRfQ09ORklHX09QVElPTl9FTUJFRERFRF9CSVRNQVBTCisgICAgLyogc2VlIGB0dHNiaXQuaCcgKi8KKyAgICBUVF9Mb2FkX1NCaXRfU3RyaWtlcywKKyAgICBUVF9Mb2FkX1NCaXRfSW1hZ2UsCisgICAgVFRfRnJlZV9TQml0X1N0cmlrZXMsCisjZWxzZQorICAgIDAsCisgICAgMCwKKyAgICAwLAorI2VuZGlmICAKKyAgICAKKyAgICAvKiBzZWUgYHR0cG9zdC5oJyAqLworI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fUE9TVFNDUklQVF9OQU1FUyAKKyAgICBUVF9HZXRfUFNfTmFtZSwKKyAgICBUVF9GcmVlX1Bvc3RfTmFtZXMsICAgIAorI2Vsc2UKKyAgICAwLAorICAgIDAsCisjZW5kaWYgCisKKyAgICAvKiBzZWUgYHR0Y21hcC5oJyAqLworICAgIFRUX0NoYXJNYXBfTG9hZCwKKyAgICBUVF9DaGFyTWFwX0ZyZWUsCisgIH07CisgIAorCisgIEVYUE9SVF9GVU5DCisgIGNvbnN0IEZUX0RyaXZlckludGVyZmFjZSAgc2ZudF9kcml2ZXJfaW50ZXJmYWNlID0KKyAgeworICAgIHNpemVvZihGVF9Ecml2ZXJSZWMpLAorICAgIDAsCisgICAgMCwKKyAgICAwLAorCisgICAgInNmbnQiLCAgICAgLyogZHJpdmVyIG5hbWUgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAxLCAgICAgICAgICAvKiBkcml2ZXIgdmVyc2lvbiAgICAgICAgICAgICAgICAgICAgICAqLworICAgIDIsICAgICAgICAgIC8qIGRyaXZlciByZXF1aXJlcyBGcmVlVHlwZSAyIG9yIGFib3ZlICovCisKKyAgICAodm9pZCopJnNmbnRfaW50ZXJmYWNlCisgIH07CisKZGlmZiAtLWdpdCBhL3NyYy9zZm50L3NmZHJpdmVyLmggYi9zcmMvc2ZudC9zZmRyaXZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkMTBkODgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvc2ZudC9zZmRyaXZlci5oCkBAIC0wLDAgKzEsODMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHNmZHJpdmVyLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBIaWdoLWxldmVsIFNGTlQgZHJpdmVyIGludGVyZmFjZSAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMTk5Ni0xOTk5IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCisvKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLworLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KKy8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCisvKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2lmbmRlZiBTRkRSSVZFUl9ICisjZGVmaW5lIFNGRFJJVkVSX0gKKworI2luY2x1ZGUgPGZyZWV0eXBlLmg+CisjaW5jbHVkZSA8ZnRkcml2ZXIuaD4KKworICBFWFBPUlRfREVGCisgIGNvbnN0IEZUX0RyaXZlckludGVyZmFjZSAgc2ZudF9kcml2ZXJfaW50ZXJmYWNlOworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgSGVyZSBpcyBhIHRlbXBsYXRlIG9mIHRoZSBjb2RlIHRoYXQgc2hvdWxkIGFwcGVhciBpbiBlYWNoCisgKiAgZm9udCBkcml2ZXIncyBfaW50ZXJmYWNlXyBmaWxlICh0aGUgb25lIGluY2x1ZGVkIGJ5ICJmdGluaXQuYyIpLgorICoKKyAqICBJdCBpcyB1c2VkIHRvIGJ1aWxkLCBhdCBjb21waWxlIHRpbWUsIGEgc2ltcGxlIGxpbmtlZCBsaXN0IG9mCisgKiAgdGhlIGludGVyZmFjZXMgb2YgdGhlIGRyaXZlcnMgd2hpY2ggaGF2ZSBiZWVuICNpbmNsdWRlZCBpbiAKKyAqICAiZnRpbml0LmMiLiBTZWUgdGhlIHNvdXJjZSBjb2RlIG9mIHRoZSBsYXR0ZXIgZmlsZSBmb3IgZGV0YWlscworICoKKyAqICAoTm90ZSB0aGF0IHRoaXMgaXMgb25seSByZXF1aXJlZCB3aGVuIHlvdSB3YW50IHlvdXIgZHJpdmVyIGluY2x1ZGVkCisgKiAgIGluIHRoZSBzZXQgb2YgZGVmYXVsdCBkcml2ZXJzIGxvYWRlZCBieSBGVF9Jbml0X0ZyZWVUeXBlLiBPdGhlcgorICogICBkcml2ZXJzIGNhbiBzdGlsbCBiZSBhZGRlZCBtYW51YWxseSBhdCBydW50aW1lIHdpdGggRlRfQWRkX0RyaXZlci4KKyAqCisgKiB7CisgKiAgICNpZmRlZiBGVElOSVRfRFJJVkVSX0NIQUlOCisgKgorICogICBzdGF0aWMKKyAqICAgY29uc3QgRlRfRHJpdmVyQ2hhaW4gIGZ0aW5pdF88Rk9STUFUPl9kcml2ZXJfY2hhaW4gPQorICogICB7CisgKiAgICAgRlRfSU5JVF9MQVNUX0RSSVZFUl9DSEFJTiwKKyAqICAgICAmPEZPUk1BVD5fZHJpdmVyX2ludGVyZmFjZQorICogICB9OworICogCisgKiAgICN1bmRlZiAgRlRfSU5JVF9MQVNUX0RSSVZFUl9DSEFJTgorICogICAjZGVmaW5lIEZUX0lOSVRfTEFTVF9EUklWRVJfQ0hBSU4gICAmZnRpbml0XzxGT1JNQVQ+X2RyaXZlcl9jaGFpbgorICoKKyAqICAgI2VuZGlmIAorICogfQorICoKKyAqICByZXBsYWNlIDxGT1JNQVQ+IHdpdGggeW91ciBkcml2ZXIncyBwcmVmaXgKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjaWZkZWYgRlRJTklUX0RSSVZFUl9DSEFJTgorCisgIHN0YXRpYworICBjb25zdCBGVF9Ecml2ZXJDaGFpbiAgZnRpbml0X3NmbnRfZHJpdmVyX2NoYWluID0KKyAgeworICAgIEZUX0lOSVRfTEFTVF9EUklWRVJfQ0hBSU4sCisgICAgJnNmbnRfZHJpdmVyX2ludGVyZmFjZQorICB9OworCisjdW5kZWYgIEZUX0lOSVRfTEFTVF9EUklWRVJfQ0hBSU4KKyNkZWZpbmUgRlRfSU5JVF9MQVNUX0RSSVZFUl9DSEFJTiAgICZmdGluaXRfc2ZudF9kcml2ZXJfY2hhaW4KKworI2VuZGlmIC8qIEZUSU5JVF9EUklWRVJfQ0hBSU4gKi8gCisKKworCisjZW5kaWYgLyogU0ZEUklWRVJfSCAqLworCisKKy8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3NmbnQvc2ZudC5jIGIvc3JjL3NmbnQvc2ZudC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4ZWIwNmIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvc2ZudC9zZm50LmMKQEAgLTAsMCArMSwxNSBAQAorI2luY2x1ZGUgPHNmY29uZmlnLmg+CisjaW5jbHVkZSA8dHRsb2FkLmM+CisjaW5jbHVkZSA8dHRjbWFwLmM+CisKKyNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX0VNQkVEREVEX0JJVE1BUFMKKyNpbmNsdWRlIDx0dHNiaXQuYz4KKyNlbmRpZgorCisjaWZkZWYgVFRfQ09ORklHX09QVElPTl9QT1NUU0NSSVBUX05BTUVTCisjaW5jbHVkZSA8dHRwb3N0LmM+CisjZW5kaWYKKworI2luY2x1ZGUgPHNmZHJpdmVyLmM+CisKKwpkaWZmIC0tZ2l0IGEvc3JjL3NmbnQvdHRjbWFwLmMgYi9zcmMvc2ZudC90dGNtYXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTg3ZTRlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3NmbnQvdHRjbWFwLmMKQEAgLTAsMCArMSw1MDggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHR0Y21hcC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBUcnVlVHlwZSBjaGFyYWN0ZXIgbWFwcGluZyB0YWJsZSAoY21hcCkgc3VwcG9ydCAoYm9keSkuICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMTk5Ni0xOTk5IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQgICAgICAgICovCisvKiAgbW9kaWZpZWQgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICAqLworLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KKy8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCisvKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2luY2x1ZGUgPGZ0ZGVidWcuaD4KKworI2luY2x1ZGUgPHR0bG9hZC5oPgorI2luY2x1ZGUgPHR0Y21hcC5oPgorI2luY2x1ZGUgPHR0ZXJyb3JzLmg+CisKKy8qIHJlcXVpcmVkIGJ5IHRoZSB0cmFjaW5nIG1vZGUgKi8KKyN1bmRlZiAgRlRfQ09NUE9ORU5UCisjZGVmaW5lIEZUX0NPTVBPTkVOVCAgICAgIHRyYWNlX3R0Y21hcAorCisKKyAgc3RhdGljIFRUX1VJbnQgIGNvZGVfdG9faW5kZXgwKCBUVF9DTWFwVGFibGUqICBjaGFybWFwLCBUVF9VTG9uZyAgY2hhcl9jb2RlICk7CisgIHN0YXRpYyBUVF9VSW50ICBjb2RlX3RvX2luZGV4MiggVFRfQ01hcFRhYmxlKiAgY2hhcm1hcCwgVFRfVUxvbmcgIGNoYXJfY29kZSApOworICBzdGF0aWMgVFRfVUludCAgY29kZV90b19pbmRleDQoIFRUX0NNYXBUYWJsZSogIGNoYXJtYXAsIFRUX1VMb25nICBjaGFyX2NvZGUgKTsKKyAgc3RhdGljIFRUX1VJbnQgIGNvZGVfdG9faW5kZXg2KCBUVF9DTWFwVGFibGUqICBjaGFybWFwLCBUVF9VTG9uZyAgY2hhcl9jb2RlICk7ICAgICAgCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfQ2hhck1hcF9Mb2FkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgTG9hZHMgYSBnaXZlbiBUcnVlVHlwZSBjaGFyYWN0ZXIgbWFwIGludG8gbWVtb3J5LiAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZmFjZSAgIDo6IEEgaGFuZGxlIHRvIHRoZSBwYXJlbnQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHN0cmVhbSA6OiBBIGhhbmRsZSB0byB0aGUgY3VycmVudCBzdHJlYW0gb2JqZWN0LiAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHRhYmxlICA6OiBBIHBvaW50ZXIgdG8gYSBjbWFwIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoZSBmdW5jdGlvbiBhc3N1bWVzIHRoYXQgdGhlIHN0cmVhbSBpcyBhbHJlYWR5IGluIHVzZSAoaS5lLiwgICAgICAqLworICAvKiAgICBvcGVuZWQpLiAgSW4gY2FzZSBvZiBlcnJvciwgYWxsIHBhcnRpYWxseSBhbGxvY2F0ZWQgdGFibGVzIGFyZSAgICAgKi8KKyAgLyogICAgcmVsZWFzZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBMT0NBTF9GVU5DCisgIFRUX0Vycm9yICBUVF9DaGFyTWFwX0xvYWQoIFRUX0ZhY2UgICAgICAgIGZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX0NNYXBUYWJsZSogIGNtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgICAgIHN0cmVhbSApCisgIHsKKyAgICBUVF9FcnJvciAgIGVycm9yOworICAgIEZUX01lbW9yeSAgbWVtb3J5OworICAgIFRUX1VTaG9ydCAgbnVtX1NILCBudW1fU2VnLCBpOworCisgICAgVFRfVVNob3J0ICB1LCBsOworCisgICAgVFRfQ01hcDAqICBjbWFwMDsKKyAgICBUVF9DTWFwMiogIGNtYXAyOworICAgIFRUX0NNYXA0KiAgY21hcDQ7CisgICAgVFRfQ01hcDYqICBjbWFwNjsKKworICAgIFRUX0NNYXAyU3ViSGVhZGVyKiBjbWFwMnN1YjsKKyAgICBUVF9DTWFwNFNlZ21lbnQqICAgc2VnbWVudHM7CisKKworICAgIGlmICggY21hcC0+bG9hZGVkICkKKyAgICAgIHJldHVybiBUVF9FcnJfT2s7CisKKyAgICBtZW1vcnkgPSBzdHJlYW0tPm1lbW9yeTsKKworICAgIGlmICggRklMRV9TZWVrKCBjbWFwLT5vZmZzZXQgKSApCisgICAgICByZXR1cm4gZXJyb3I7CisKKyAgICBzd2l0Y2ggKCBjbWFwLT5mb3JtYXQgKQorICAgIHsKKyAgICBjYXNlIDA6CisgICAgICBjbWFwMCA9ICZjbWFwLT5jLmNtYXAwOworCisgICAgICBpZiAoIEFMTE9DKCBjbWFwMC0+Z2x5cGhJZEFycmF5LCAyNTZMICkgICAgICAgICAgICB8fAorICAgICAgICAgICBGSUxFX1JlYWQoICh2b2lkKiljbWFwMC0+Z2x5cGhJZEFycmF5LCAyNTZMICkgKQorICAgICAgICAgZ290byBGYWlsOworCisgICAgICBjbWFwLT5nZXRfaW5kZXggPSBjb2RlX3RvX2luZGV4MDsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAyOgorICAgICAgbnVtX1NIID0gMDsKKyAgICAgIGNtYXAyICA9ICZjbWFwLT5jLmNtYXAyOworCisgICAgICAvKiBhbGxvY2F0ZSBzdWJoZWFkZXIga2V5cyAqLworCisgICAgICBpZiAoIEFMTE9DX0FSUkFZKCBjbWFwMi0+c3ViSGVhZGVyS2V5cywgMjU2LCBUVF9VU2hvcnQgKSB8fAorICAgICAgICAgICBBQ0NFU1NfRnJhbWUoIDUxMkwgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICBnb3RvIEZhaWw7CisKKyAgICAgIGZvciAoIGkgPSAwOyBpIDwgMjU2OyBpKysgKQorICAgICAgeworICAgICAgICB1ID0gR0VUX1VTaG9ydCgpIC8gODsKKyAgICAgICAgY21hcDItPnN1YkhlYWRlcktleXNbaV0gPSB1OworCisgICAgICAgIGlmICggbnVtX1NIIDwgdSApCisgICAgICAgICAgbnVtX1NIID0gdTsKKyAgICAgIH0KKworICAgICAgRk9SR0VUX0ZyYW1lKCk7CisKKyAgICAgIC8qIGxvYWQgc3ViaGVhZGVycyAqLworCisgICAgICBjbWFwMi0+bnVtR2x5cGhJZCA9IGwgPQorICAgICAgICAoICggY21hcC0+bGVuZ3RoIC0gMkwqKDI1NiszKSAtIG51bV9TSCo4TCApICYgMHhmZmZmICkgLyAyOworCisgICAgICBpZiAoIEFMTE9DX0FSUkFZKCBjbWFwMi0+c3ViSGVhZGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bV9TSCArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICBUVF9DTWFwMlN1YkhlYWRlciApICAgIHx8CisgICAgICAgICAgIEFDQ0VTU19GcmFtZSggKCBudW1fU0ggKyAxICkgKiA4TCApICkKKyAgICAgICAgZ290byBGYWlsOworCisgICAgICBjbWFwMnN1YiA9IGNtYXAyLT5zdWJIZWFkZXJzOworCisgICAgICBmb3IgKCBpID0gMDsgaSA8PSBudW1fU0g7IGkrKyApCisgICAgICB7CisgICAgICAgIGNtYXAyc3ViLT5maXJzdENvZGUgICAgID0gR0VUX1VTaG9ydCgpOworICAgICAgICBjbWFwMnN1Yi0+ZW50cnlDb3VudCAgICA9IEdFVF9VU2hvcnQoKTsKKyAgICAgICAgY21hcDJzdWItPmlkRGVsdGEgICAgICAgPSBHRVRfU2hvcnQoKTsKKyAgICAgICAgLyogd2UgYXBwbHkgdGhlIGxvY2F0aW9uIG9mZnNldCBpbW1lZGlhdGVseSAqLworICAgICAgICBjbWFwMnN1Yi0+aWRSYW5nZU9mZnNldCA9IEdFVF9VU2hvcnQoKSAtICggbnVtX1NIIC0gaSApICogOCAtIDI7CisKKyAgICAgICAgY21hcDJzdWIrKzsKKyAgICAgIH0KKworICAgICAgRk9SR0VUX0ZyYW1lKCk7CisKKyAgICAgIC8qIGxvYWQgZ2x5cGggSURzICovCisKKyAgICAgIGlmICggQUxMT0NfQVJSQVkoIGNtYXAyLT5nbHlwaElkQXJyYXksIGwsIFRUX1VTaG9ydCApIHx8CisgICAgICAgICAgIEFDQ0VTU19GcmFtZSggbCAqIDJMICkgICAgICAgICAgICAgICAgICAgICAgICAgICApCisgICAgICAgIGdvdG8gRmFpbDsKKworICAgICAgZm9yICggaSA9IDA7IGkgPCBsOyBpKysgKQorICAgICAgICBjbWFwMi0+Z2x5cGhJZEFycmF5W2ldID0gR0VUX1VTaG9ydCgpOworCisgICAgICBGT1JHRVRfRnJhbWUoKTsKKyAgICAgIAorICAgICAgY21hcC0+Z2V0X2luZGV4ID0gY29kZV90b19pbmRleDI7CisgICAgICBicmVhazsKKworICAgIGNhc2UgNDoKKyAgICAgIGNtYXA0ID0gJmNtYXAtPmMuY21hcDQ7CisKKyAgICAgIC8qIGxvYWQgaGVhZGVyICovCisKKyAgICAgIGlmICggQUNDRVNTX0ZyYW1lKCA4TCApICkKKyAgICAgICAgZ290byBGYWlsOworCisgICAgICBjbWFwNC0+c2VnQ291bnRYMiAgICA9IEdFVF9VU2hvcnQoKTsKKyAgICAgIGNtYXA0LT5zZWFyY2hSYW5nZSAgID0gR0VUX1VTaG9ydCgpOworICAgICAgY21hcDQtPmVudHJ5U2VsZWN0b3IgPSBHRVRfVVNob3J0KCk7CisgICAgICBjbWFwNC0+cmFuZ2VTaGlmdCAgICA9IEdFVF9VU2hvcnQoKTsKKworICAgICAgbnVtX1NlZyA9IGNtYXA0LT5zZWdDb3VudFgyIC8gMjsKKworICAgICAgRk9SR0VUX0ZyYW1lKCk7CisKKyAgICAgIC8qIGxvYWQgc2VnbWVudHMgKi8KKworICAgICAgaWYgKCBBTExPQ19BUlJBWSggY21hcDQtPnNlZ21lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgbnVtX1NlZywKKyAgICAgICAgICAgICAgICAgICAgICAgIFRUX0NNYXA0U2VnbWVudCApICAgICAgICAgfHwKKyAgICAgICAgICAgQUNDRVNTX0ZyYW1lKCAobnVtX1NlZyAqIDQgKyAxKSAqIDJMICkgKQorICAgICAgICBnb3RvIEZhaWw7CisKKyAgICAgIHNlZ21lbnRzID0gY21hcDQtPnNlZ21lbnRzOworCisgICAgICBmb3IgKCBpID0gMDsgaSA8IG51bV9TZWc7IGkrKyApCisgICAgICAgIHNlZ21lbnRzW2ldLmVuZENvdW50ICAgICAgPSBHRVRfVVNob3J0KCk7CisKKyAgICAgICh2b2lkKUdFVF9VU2hvcnQoKTsKKworICAgICAgZm9yICggaSA9IDA7IGkgPCBudW1fU2VnOyBpKysgKQorICAgICAgICBzZWdtZW50c1tpXS5zdGFydENvdW50ICAgID0gR0VUX1VTaG9ydCgpOworCisgICAgICBmb3IgKCBpID0gMDsgaSA8IG51bV9TZWc7IGkrKyApCisgICAgICAgIHNlZ21lbnRzW2ldLmlkRGVsdGEgICAgICAgPSBHRVRfU2hvcnQoKTsKKworICAgICAgZm9yICggaSA9IDA7IGkgPCBudW1fU2VnOyBpKysgKQorICAgICAgICBzZWdtZW50c1tpXS5pZFJhbmdlT2Zmc2V0ID0gR0VUX1VTaG9ydCgpOworCisgICAgICBGT1JHRVRfRnJhbWUoKTsKKworICAgICAgY21hcDQtPm51bUdseXBoSWQgPSBsID0KKyAgICAgICAgKCAoIGNtYXAtPmxlbmd0aCAtICggMTZMICsgOEwgKiBudW1fU2VnICkgKSAmIDB4RkZGRiApIC8yOworCisgICAgICAvKiBsb2FkIElEcyAqLworCisgICAgICBpZiAoIEFMTE9DX0FSUkFZKCBjbWFwNC0+Z2x5cGhJZEFycmF5LCBsLCBUVF9VU2hvcnQgKSB8fAorICAgICAgICAgICBBQ0NFU1NfRnJhbWUoIGwqMkwgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICBnb3RvIEZhaWw7CisKKyAgICAgIGZvciAoIGkgPSAwOyBpIDwgbDsgaSsrICkKKyAgICAgICAgY21hcDQtPmdseXBoSWRBcnJheVtpXSA9IEdFVF9VU2hvcnQoKTsKKworICAgICAgRk9SR0VUX0ZyYW1lKCk7CisgICAgICAKKyAgICAgIGNtYXAtPmdldF9pbmRleCA9IGNvZGVfdG9faW5kZXg0OworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIDY6CisgICAgICBjbWFwNiA9ICZjbWFwLT5jLmNtYXA2OworCisgICAgICBpZiAoIEFDQ0VTU19GcmFtZSggNEwgKSApCisgICAgICAgIGdvdG8gRmFpbDsKKworICAgICAgY21hcDYtPmZpcnN0Q29kZSAgPSBHRVRfVVNob3J0KCk7CisgICAgICBjbWFwNi0+ZW50cnlDb3VudCA9IEdFVF9VU2hvcnQoKTsKKworICAgICAgRk9SR0VUX0ZyYW1lKCk7CisKKyAgICAgIGwgPSBjbWFwNi0+ZW50cnlDb3VudDsKKworICAgICAgaWYgKCBBTExPQ19BUlJBWSggY21hcDYtPmdseXBoSWRBcnJheSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNtYXA2LT5lbnRyeUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgVFRfU2hvcnQgKSAgICAgICAgICAgfHwKKyAgICAgICAgICAgQUNDRVNTX0ZyYW1lKCBsICogMkwgKSAgICAgICAgICAgICkKKyAgICAgICAgZ290byBGYWlsOworCisgICAgICBmb3IgKCBpID0gMDsgaSA8IGw7IGkrKyApCisgICAgICAgIGNtYXA2LT5nbHlwaElkQXJyYXlbaV0gPSBHRVRfVVNob3J0KCk7CisKKyAgICAgIEZPUkdFVF9GcmFtZSgpOworICAgICAgY21hcC0+Z2V0X2luZGV4ID0gY29kZV90b19pbmRleDY7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6ICAgLyogY29ycnVwdCBjaGFyYWN0ZXIgbWFwcGluZyB0YWJsZSAqLworICAgICAgcmV0dXJuIFRUX0Vycl9JbnZhbGlkX0NoYXJNYXBfRm9ybWF0OworCisgICAgfQorICAgIHJldHVybiBUVF9FcnJfT2s7CisKKyAgRmFpbDoKKyAgICBUVF9DaGFyTWFwX0ZyZWUoIGZhY2UsIGNtYXAgKTsKKyAgICByZXR1cm4gZXJyb3I7CisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX0NoYXJNYXBfRnJlZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIERlc3Ryb3lzIGEgY2hhcmFjdGVyIG1hcHBpbmcgdGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZhY2UgOjogQSBoYW5kbGUgdG8gdGhlIHBhcmVudCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBjbWFwIDo6IEEgaGFuZGxlIHRvIGEgY21hcCBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBFcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIExPQ0FMX0ZVTkMKKyAgVFRfRXJyb3IgIFRUX0NoYXJNYXBfRnJlZSggVFRfRmFjZSAgICAgICAgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfQ01hcFRhYmxlKiAgY21hcCApCisgIHsKKyAgICBGVF9NZW1vcnkgIG1lbW9yeTsKKworCisgICAgaWYgKCAhY21hcCApCisgICAgICByZXR1cm4gVFRfRXJyX09rOworCisgICAgbWVtb3J5ID0gZmFjZS0+cm9vdC5kcml2ZXItPm1lbW9yeTsKKworICAgIHN3aXRjaCAoIGNtYXAtPmZvcm1hdCApCisgICAgeworICAgIGNhc2UgMDoKKyAgICAgIEZSRUUoIGNtYXAtPmMuY21hcDAuZ2x5cGhJZEFycmF5ICk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgMjoKKyAgICAgIEZSRUUoIGNtYXAtPmMuY21hcDIuc3ViSGVhZGVyS2V5cyApOworICAgICAgRlJFRSggY21hcC0+Yy5jbWFwMi5zdWJIZWFkZXJzICk7CisgICAgICBGUkVFKCBjbWFwLT5jLmNtYXAyLmdseXBoSWRBcnJheSApOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIDQ6CisgICAgICBGUkVFKCBjbWFwLT5jLmNtYXA0LnNlZ21lbnRzICk7CisgICAgICBGUkVFKCBjbWFwLT5jLmNtYXA0LmdseXBoSWRBcnJheSApOworICAgICAgY21hcC0+Yy5jbWFwNC5zZWdDb3VudFgyID0gMDsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSA2OgorICAgICAgRlJFRSggY21hcC0+Yy5jbWFwNi5nbHlwaElkQXJyYXkgKTsKKyAgICAgIGNtYXAtPmMuY21hcDYuZW50cnlDb3VudCA9IDA7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAvKiBpbnZhbGlkIHRhYmxlIGZvcm1hdCwgZG8gbm90aGluZyAqLworICAgICAgOworICAgIH0KKworICAgIGNtYXAtPmxvYWRlZCA9IEZBTFNFOworICAgIHJldHVybiBUVF9FcnJfT2s7CisgIH0KKworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgY29kZV90b19pbmRleDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQ29udmVydHMgdGhlIGNoYXJhY3RlciBjb2RlIGludG8gYSBnbHlwaCBpbmRleC4gIFVzZXMgZm9ybWF0IDAuICAgICovCisgIC8qICAgIGBjaGFyQ29kZScgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgMHgwMC0weEZGIChvdGhlcndpc2UgMCBpcyAgICAgICAgICAqLworICAvKiAgICByZXR1cm5lZCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBjaGFyQ29kZSA6OiBUaGUgd2FudGVkIGNoYXJhY3RlciBjb2RlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgY21hcDAgICAgOjogQSBwb2ludGVyIHRvIGEgY21hcCB0YWJsZSBpbiBmb3JtYXQgMC4gICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgR2x5cGggaW5kZXggaW50byB0aGUgZ2x5cGhzIGFycmF5LiAgMCBpZiB0aGUgZ2x5cGggZG9lcyBub3QgICAgICAgICovCisgIC8qICAgIGV4aXN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgc3RhdGljCisgIFRUX1VJbnQgY29kZV90b19pbmRleDAoIFRUX0NNYXBUYWJsZSogIGNtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX1VMb25nICAgICAgIGNoYXJDb2RlICkKKyAgeworICAgIFRUX0NNYXAwKiAgY21hcDAgPSAmY21hcC0+Yy5jbWFwMDsKKyAgICAKKyAgICByZXR1cm4gKCBjaGFyQ29kZSA8PSAweEZGID8gY21hcDAtPmdseXBoSWRBcnJheVtjaGFyQ29kZV0gOiAwICk7CisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGNvZGVfdG9faW5kZXgyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIENvbnZlcnRzIHRoZSBjaGFyYWN0ZXIgY29kZSBpbnRvIGEgZ2x5cGggaW5kZXguICBVc2VzIGZvcm1hdCAyLiAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGNoYXJDb2RlIDo6IFRoZSB3YW50ZWQgY2hhcmFjdGVyIGNvZGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBjbWFwMiAgICA6OiBBIHBvaW50ZXIgdG8gYSBjbWFwIHRhYmxlIGluIGZvcm1hdCAyLiAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBHbHlwaCBpbmRleCBpbnRvIHRoZSBnbHlwaHMgYXJyYXkuICAwIGlmIHRoZSBnbHlwaCBkb2VzIG5vdCAgICAgICAgKi8KKyAgLyogICAgZXhpc3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBzdGF0aWMKKyAgVFRfVUludCAgY29kZV90b19pbmRleDIoIFRUX0NNYXBUYWJsZSogIGNtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9VTG9uZyAgICAgICBjaGFyQ29kZSApCisgIHsKKyAgICBUVF9VSW50ICAgICAgICAgICAgcmVzdWx0LCBpbmRleDEsIG9mZnNldDsKKyAgICBUVF9VSW50ICAgICAgICAgICAgY2hhcl9sbzsKKyAgICBUVF9VTG9uZyAgICAgICAgICAgY2hhcl9oaTsKKyAgICBUVF9DTWFwMlN1YkhlYWRlciogc2gyOworICAgIFRUX0NNYXAyKiAgICAgICAgICBjbWFwMjsKKworICAgIGNtYXAyICAgPSAmY21hcC0+Yy5jbWFwMjsKKyAgICByZXN1bHQgID0gMDsKKyAgICBjaGFyX2xvID0gKFRUX1VJbnQpKGNoYXJDb2RlICYgMHhGRik7CisgICAgY2hhcl9oaSA9IGNoYXJDb2RlID4+IDg7CisKKyAgICBpZiAoIGNoYXJfaGkgPT0gMCApCisgICAgeworICAgICAgLyogYW4gOC1iaXQgY2hhcmFjdGVyIGNvZGUgLSB3ZSB1c2UgdGhlIHN1YkhlYWRlciAwIGluIHRoaXMgY2FzZSAqLworICAgICAgLyogdG8gdGVzdCB3ZXRoZXIgdGhlIGNoYXJhY3RlciBjb2RlIGlzIGluIHRoZSBjaGFybWFwICAgICAgICAgICAqLworICAgICAgaWYgKCBjbWFwMi0+c3ViSGVhZGVyS2V5c1tjaGFyX2xvXSA9PSAwICkKKyAgICAgIHsKKyAgICAgICAgcmVzdWx0ID0gY21hcDItPmdseXBoSWRBcnJheVtjaGFyX2xvXTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIGEgMTYtYml0IGNoYXJhY3RlciBjb2RlICovCisgICAgICBpbmRleDEgPSBjbWFwMi0+c3ViSGVhZGVyS2V5c1sgY2hhcl9oaSAmIDB4RkYgXTsKKyAgICAgIGlmIChpbmRleDEpCisgICAgICB7CisgICAgICAgIHNoMiAgICAgID0gY21hcDItPnN1YkhlYWRlcnMgKyBpbmRleDE7CisgICAgICAgIGNoYXJfbG8gLT0gc2gyLT5maXJzdENvZGU7CisKKyAgICAgICAgaWYgKGNoYXJfbG8gPCBzaDItPmVudHJ5Q291bnQpCisgICAgICAgIHsKKyAgICAgICAgICBvZmZzZXQgPSBzaDItPmlkUmFuZ2VPZmZzZXQvMiArIGNoYXJfbG87CisgICAgICAgICAgaWYgKG9mZnNldCA8IGNtYXAyLT5udW1HbHlwaElkKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IGNtYXAyLT5nbHlwaElkQXJyYXlbb2Zmc2V0XTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQpCisgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgKyBzaDItPmlkRGVsdGEpICYgMHhGRkZGOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBjb2RlX3RvX2luZGV4NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBDb252ZXJ0cyB0aGUgY2hhcmFjdGVyIGNvZGUgaW50byBhIGdseXBoIGluZGV4LiAgVXNlcyBmb3JtYXQgNC4gICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBjaGFyQ29kZSA6OiBUaGUgd2FudGVkIGNoYXJhY3RlciBjb2RlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgY21hcDQgICAgOjogQSBwb2ludGVyIHRvIGEgY21hcCB0YWJsZSBpbiBmb3JtYXQgNC4gICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgR2x5cGggaW5kZXggaW50byB0aGUgZ2x5cGhzIGFycmF5LiAgMCBpZiB0aGUgZ2x5cGggZG9lcyBub3QgICAgICAgICovCisgIC8qICAgIGV4aXN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgc3RhdGljCisgIFRUX1VJbnQgIGNvZGVfdG9faW5kZXg0KCBUVF9DTWFwVGFibGUqICBjbWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfVUxvbmcgICAgICAgY2hhckNvZGUgKQorICB7CisgICAgVFRfVUludCAgICAgICAgICByZXN1bHQsIGluZGV4MSwgc2VnQ291bnQ7CisgICAgVFRfQ01hcDQqICAgICAgICBjbWFwNDsKKyAgICBUVF9DTWFwNFNlZ21lbnQgICpzZWc0LCAqbGltaXQ7CisKKyAgICBjbWFwNCAgICA9ICZjbWFwLT5jLmNtYXA0OworICAgIHJlc3VsdCAgID0gMDsKKyAgICBzZWdDb3VudCA9IGNtYXA0LT5zZWdDb3VudFgyIC8gMjsKKyAgICBzZWc0ICAgICA9IGNtYXA0LT5zZWdtZW50czsKKyAgICBsaW1pdCAgICA9IHNlZzQgKyBzZWdDb3VudDsKKworICAgIGZvciAoIDsgc2VnNCA8IGxpbWl0OyBzZWc0KysgKQorICAgIHsKKyAgICAgIGlmICggY2hhckNvZGUgPD0gc2VnNC0+ZW5kQ291bnQgKQorICAgICAgeworICAgICAgICAvKiB0aGUgcmFuZ2VzIGFyZSBzb3J0ZWQgaW4gaW5jcmVhc2luZyBvcmRlciwgaWYgd2UncmUgb3V0IG9mICAqLworICAgICAgICAvKiB0aGUgcmFuZ2UgaGVyZSwgdGhlIGNoYXIgY29kZSBpc24ndCBpbiB0aGUgY2hhcm1hcCwgc28gZXhpdCAqLworICAgICAgICBpZiAoIGNoYXJDb2RlIDwgc2VnNC0+c3RhcnRDb3VudCApCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLyogd2hlbiB0aGUgaWRSYW5nZU9mZnNldCBpcyAwLCB3ZSBjYW4gY29tcHV0ZSB0aGUgZ2x5cGggaW5kZXggKi8KKyAgICAgICAgLyogZGlyZWN0bHkuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgaWYgKCBzZWc0LT5pZFJhbmdlT2Zmc2V0ID09IDAgKQorICAgICAgICAgIHJlc3VsdCA9IChjaGFyQ29kZSArIHNlZzQtPmlkRGVsdGEpICYgMHhGRkZGOworICAgICAgICBlbHNlCisgICAgICAgIC8qIG90aGVyd2lzZSwgd2UgbXVzdCB1c2UgdGhlIGdseXBoSWRBcnJheSB0byBkbyBpdCAgICAgICAgICAgICovCisgICAgICAgIHsKKyAgICAgICAgICBpbmRleDEgPSBzZWc0LT5pZFJhbmdlT2Zmc2V0LzIgKyAoY2hhckNvZGUgLSBzZWc0LT5zdGFydENvdW50KQorICAgICAgICAgICAgICAgICAgIC0gKHNlZ0NvdW50LTEpOworCisgICAgICAgICAgaWYgKCBpbmRleDEgPCBjbWFwNC0+bnVtR2x5cGhJZCAgICAgICAmJgorICAgICAgICAgICAgICAgY21hcDQtPmdseXBoSWRBcnJheVtpbmRleDFdICE9IDAgKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IChjbWFwNC0+Z2x5cGhJZEFycmF5W2luZGV4MV0gKyBzZWc0LT5pZERlbHRhKSAmIDB4RkZGRjsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgY29kZV90b19pbmRleDYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQ29udmVydHMgdGhlIGNoYXJhY3RlciBjb2RlIGludG8gYSBnbHlwaCBpbmRleC4gIFVzZXMgZm9ybWF0IDYuICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgY2hhckNvZGUgOjogVGhlIHdhbnRlZCBjaGFyYWN0ZXIgY29kZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGNtYXA2ICAgIDo6IEEgcG9pbnRlciB0byBhIGNtYXAgdGFibGUgaW4gZm9ybWF0IDYuICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEdseXBoIGluZGV4IGludG8gdGhlIGdseXBocyBhcnJheS4gIDAgaWYgdGhlIGdseXBoIGRvZXMgbm90ICAgICAgICAqLworICAvKiAgICBleGlzdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0YXRpYworICBUVF9VSW50ICBjb2RlX3RvX2luZGV4NiggVFRfQ01hcFRhYmxlKiAgY21hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX1VMb25nICAgY2hhckNvZGUgKQorICB7CisgICAgVFRfQ01hcDYqICBjbWFwNjsKKyAgICBUVF9VSW50ICAgIHJlc3VsdCA9IDA7CisKKyAgICBjbWFwNiAgICAgPSAmY21hcC0+Yy5jbWFwNjsKKyAgICByZXN1bHQgICAgPSAwOworICAgIGNoYXJDb2RlIC09IGNtYXA2LT5maXJzdENvZGU7CisKKyAgICBpZiAoIGNoYXJDb2RlIDwgY21hcDYtPmVudHJ5Q291bnQgKQorICAgICAgcmVzdWx0ID0gIGNtYXA2LT5nbHlwaElkQXJyYXlbY2hhckNvZGVdOworCisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisKKy8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3NmbnQvdHRjbWFwLmggYi9zcmMvc2ZudC90dGNtYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWRhMjQwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3NmbnQvdHRjbWFwLmgKQEAgLTAsMCArMSw4NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgdHRjbWFwLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIFRydWVUeXBlIGNoYXJhY3RlciBtYXBwaW5nIHRhYmxlIChjbWFwKSBzdXBwb3J0IChzcGVjaWZpY2F0aW9uKS4gICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAxOTk2LTE5OTkgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCAgICAgICAgKi8KKy8qICBtb2RpZmllZCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgICovCisvKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLworLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KKy8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjaWZuZGVmIFRUQ01BUF9ICisjZGVmaW5lIFRUQ01BUF9ICisKKyNpbmNsdWRlIDx0dHR5cGVzLmg+CisKKyNpZmRlZiBfX2NwbHVzcGx1cworICBleHRlcm4gIkMiIHsKKyNlbmRpZgorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfQ2hhck1hcF9Mb2FkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgTG9hZHMgYSBnaXZlbiBUcnVlVHlwZSBjaGFyYWN0ZXIgbWFwIGludG8gbWVtb3J5LiAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZmFjZSAgIDo6IEEgaGFuZGxlIHRvIHRoZSBwYXJlbnQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHN0cmVhbSA6OiBBIGhhbmRsZSB0byB0aGUgY3VycmVudCBzdHJlYW0gb2JqZWN0LiAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGNtYXAgICA6OiBBIHBvaW50ZXIgdG8gYSBjbWFwIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoZSBmdW5jdGlvbiBhc3N1bWVzIHRoYXQgdGhlIHN0cmVhbSBpcyBhbHJlYWR5IGluIHVzZSAoaS5lLiwgICAgICAqLworICAvKiAgICBvcGVuZWQpLiAgSW4gY2FzZSBvZiBlcnJvciwgYWxsIHBhcnRpYWxseSBhbGxvY2F0ZWQgdGFibGVzIGFyZSAgICAgKi8KKyAgLyogICAgcmVsZWFzZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBMT0NBTF9ERUYKKyAgVFRfRXJyb3IgIFRUX0NoYXJNYXBfTG9hZCggVFRfRmFjZSAgICAgICAgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfQ01hcFRhYmxlKiAgY21hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICAgICAgaW5wdXQgKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX0NoYXJNYXBfRnJlZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIERlc3Ryb3lzIGEgY2hhcmFjdGVyIG1hcHBpbmcgdGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZhY2UgOjogQSBoYW5kbGUgdG8gdGhlIHBhcmVudCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBjbWFwIDo6IEEgaGFuZGxlIHRvIGEgY21hcCBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBFcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIExPQ0FMX0RFRgorICBUVF9FcnJvciAgVFRfQ2hhck1hcF9GcmVlKCBUVF9GYWNlICAgICAgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9DTWFwVGFibGUqICBjbWFwICk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworICB9CisjZW5kaWYKKworI2VuZGlmIC8qIFRUQ01BUF9IICovCisKKworLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvc2ZudC90dGxvYWQuYyBiL3NyYy9zZm50L3R0bG9hZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiZGRlNzkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvc2ZudC90dGxvYWQuYwpAQCAtMCwwICsxLDE0NzcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHR0bG9hZC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBUcnVlVHlwZSB0YWJsZXMgbG9hZGVyIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMTk5Ni0xOTk5IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQgICAgICAgICovCisvKiAgbW9kaWZpZWQgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICAqLworLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KKy8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCisvKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgV0FSTklORzogVGhpcyBmaWxlIHNob3VsZCBub3QgYmUgY29tcGlsZWQgZGlyZWN0bHk7IGl0IGlzIG1lYW50IHRvIGJlICAqLworLyogICAgICAgICAgIGluY2x1ZGVkIGluIHRoZSBzb3VyY2Ugb2Ygc2V2ZXJhbCBmb250IGRyaXZlcnMgKGkuZS4sIHRoZSBUVEYgKi8KKy8qICAgICAgICAgICBhbmQgT1RGIGRyaXZlcnMpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjaW5jbHVkZSA8ZnRkZWJ1Zy5oPgorCisjaW5jbHVkZSA8dHRsb2FkLmg+CisjaW5jbHVkZSA8dHR0YWdzLmg+CisjaW5jbHVkZSA8dHRjbWFwLmg+CisjaW5jbHVkZSA8dHRlcnJvcnMuaD4KKworLyogcmVxdWlyZWQgYnkgdGhlIHRyYWNpbmcgbW9kZSAqLworI3VuZGVmICBGVF9DT01QT05FTlQKKyNkZWZpbmUgRlRfQ09NUE9ORU5UICAgICAgdHJhY2VfdHRsb2FkCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUVF9Mb29rVXBfVGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBMb29rcyBmb3IgYSBUcnVlVHlwZSB0YWJsZSBieSBuYW1lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBmYWNlIDo6IEEgZmFjZSBvYmplY3QgaGFuZGxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgdGFnICA6OiBUaGUgIHNlYXJjaGVkIHRhZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgcG9pbnRlciB0byB0YWJsZSBkaXJlY3RvcnkgZW50cnkuIDAgaWYgbm90IGZvdW5kLi4gICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBFWFBPUlRfRlVOQworICBUVF9UYWJsZSogIFRUX0xvb2tVcF9UYWJsZSggVFRfRmFjZSAgIGZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9VTG9uZyAgdGFnICApCisgIHsKKyAgICBUVF9UYWJsZSogIGVudHJ5OworICAgIFRUX1RhYmxlKiAgbGltaXQ7CisgICAgCisgICAgRlRfVFJBQ0U0KCggIlRUX0xvb2tVcF9UYWJsZSggJTA4bHgsICVjJWMlYyVjIClcbiIsCisgICAgICAgICAgICAgICAgICAoVFRfTG9uZylmYWNlLAorICAgICAgICAgICAgICAgICAgKFRUX0NoYXIpKHRhZyA+PiAyNCksCisgICAgICAgICAgICAgICAgICAoVFRfQ2hhcikodGFnID4+IDE2KSwKKyAgICAgICAgICAgICAgICAgIChUVF9DaGFyKSh0YWcgPj4gOCksCisgICAgICAgICAgICAgICAgICAoVFRfQ2hhcikodGFnKSApKTsKKworICAgIGVudHJ5ID0gZmFjZS0+ZGlyX3RhYmxlczsKKyAgICBsaW1pdCA9IGVudHJ5ICsgZmFjZS0+bnVtX3RhYmxlczsKKyAgICBmb3IgKCA7IGVudHJ5IDwgbGltaXQ7IGVudHJ5KysgKQorICAgIHsKKyAgICAgIGlmICggZW50cnktPlRhZyA9PSB0YWcgKQorICAgICAgICByZXR1cm4gZW50cnk7CisgICAgfSAgICAKKyAgICBGVF9UUkFDRTQoKCAiICAgIENvdWxkIG5vdCBmaW5kIHRhYmxlIVxuIiApKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX0dvdG9fVGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIExvb2tzIGZvciBhIFRydWVUeXBlIHRhYmxlIGJ5IG5hbWUsIHRoZW4gc2VlayBhIHN0cmVhbSB0byBpdC4gICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZhY2UgICA6OiBhIGZhY2Ugb2JqZWN0IGhhbmRsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB0YWcgICAgOjogdGhlICBzZWFyY2hlZCB0YWcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgc3RyZWFtIDo6IHRoZSBzdHJlYW0gdG8gc2VlayB3aGVuIHRoZSB0YWJsZSBpcyBmb3VuZCAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgcG9pbnRlciB0byB0YWJsZSBkaXJlY3RvcnkgZW50cnkuIDAgaWYgbm90IGZvdW5kLi4gICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBFWFBPUlRfRlVOQworICBUVF9FcnJvciAgIFRUX0dvdG9fVGFibGUoIFRUX0ZhY2UgICAgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9VTG9uZyAgIHRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gIHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9VTG9uZyAgKmxlbmd0aCApCisgIHsKKyAgICBUVF9UYWJsZSogIHRhYmxlOworICAgIFRUX0Vycm9yICAgZXJyb3I7CisgICAgCisgICAgdGFibGUgPSBUVF9Mb29rVXBfVGFibGUoIGZhY2UsIHRhZyApOworICAgIGlmICh0YWJsZSkKKyAgICB7CisgICAgICBpZiAobGVuZ3RoKQorICAgICAgICAqbGVuZ3RoID0gdGFibGUtPkxlbmd0aDsKKyAgICAgICAgCisgICAgICAodm9pZClGSUxFX1NlZWsoIHRhYmxlLT5PZmZzZXQgKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgZXJyb3IgPSBUVF9FcnJfVGFibGVfTWlzc2luZzsKKyAgICAgIAorICAgIHJldHVybiBlcnJvcjsKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfTG9hZF9EaXJlY3RvcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgTG9hZHMgdGhlIHRhYmxlIGRpcmVjdG9yeSBpbnRvIGEgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZmFjZSAgICAgIDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHN0cmVhbSAgICA6OiBUaGUgaW5wdXQgc3RyZWFtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBmYWNlSW5kZXggOjogVGhlIGluZGV4IG9mIHRoZSBUcnVlVHlwZSBmb250LCBpZiB3ZSdyZSBvcGVuaW5nIGEgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgIGNvbGxlY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVHJ1ZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhlIHN0cmVhbSBjdXJzb3IgbXVzdCBiZSBhdCB0aGUgZm9udCBmaWxlJ3Mgb3JpZ2luICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBMT0NBTF9GVU5DCisgIFRUX0Vycm9yICBUVF9Mb2FkX0RpcmVjdG9yeSggVFRfRmFjZSAgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX0xvbmcgICAgZmFjZUluZGV4ICkKKyAgeworICAgIFRUX0Vycm9yICAgZXJyb3I7CisgICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBzdHJlYW0tPm1lbW9yeTsKKworICAgIFRUX1RhYmxlRGlyICB0YWJsZURpcjsKKyAgICBUVF9VTG9uZyAgICAgdGFnOworCisgICAgVFRfVGFibGUgKmVudHJ5LCAqbGltaXQ7CisKKworICAgIEZUX1RSQUNFMigoICJUVF9Mb2FkX0RpcmVjdG9yeSggJTA4bHgsICVsZCApXG4iLAorICAgICAgICAgICAgICAoVFRfTG9uZylmYWNlLCBmYWNlSW5kZXggKSk7CisKKyAgICBmYWNlLT50dGNfaGVhZGVyLlRhZyAgICAgID0gMDsKKyAgICBmYWNlLT50dGNfaGVhZGVyLnZlcnNpb24gID0gMDsKKyAgICBmYWNlLT50dGNfaGVhZGVyLkRpckNvdW50ID0gMDsKKworICAgIGZhY2UtPm51bV90YWJsZXMgPSAwOworCisgICAgLyogZmlyc3Qgb2YgYWxsLCByZWFkIHRoZSAgZmlyc3QgNCBieXRlcy4gSWYgaXQncyBgdHRjZicsIHRoZW4gdGhlICovCisgICAgLyogZmlsZSBpcyBhIFRydWVUeXBlIGNvbGxlY3Rpb24sIG90aGVyd2lzZSBpdCBtdXN0IGJlIGEgbm9ybWFsICAgICovCisgICAgLyogVHJ1ZVR5cGUgZmlsZS4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICBpZiAoIFJFQURfVUxvbmcodGFnKSApCisgICAgICBnb3RvIEV4aXQ7CisKKyAgICBpZiAoIHRhZyA9PSBUVEFHX3R0Y2YgKQorICAgIHsKKyAgICAgIFRUX0ludCAgbjsKKyAgICAKKyAgICAgIEZUX1RSQUNFNCgoICJUVF9Mb2FkX0RpcmVjdG9yeTogZmlsZSBpcyBhIGNvbGxlY3Rpb25cbiIgKSk7CisgICAgICAKKyAgICAgIC8qIGl0J3MgYSBUcnVlVHlwZSBjb2xsZWN0aW9uLCBpLmUuIGEgZmlsZSBjb250YWluaW5nIHNldmVyYWwgKi8KKyAgICAgIC8qIGZvbnQgZmlsZXMuIFJlYWQgdGhlIGZvbnQgZGlyZWN0b3J5IG5vdyAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgIGlmICggQUNDRVNTX0ZyYW1lKCA4ICkgKSBnb3RvIEV4aXQ7ICAgCisgICAgICAgIAorICAgICAgZmFjZS0+dHRjX2hlYWRlci52ZXJzaW9uICA9IEdFVF9Mb25nKCk7CisgICAgICBmYWNlLT50dGNfaGVhZGVyLkRpckNvdW50ID0gR0VUX0xvbmcoKTsKKyAgICAgICAgICAgCisgICAgICBGT1JHRVRfRnJhbWUoKTsKKworICAgICAgLyogbm93IHJlYWQgdGhlIG9mZnNldHMgb2YgZWFjaCBmb250IGluIHRoZSBmaWxlICAgICAgICAgKi8KKyAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICBpZiAoIEFMTE9DX0FSUkFZKCBmYWNlLT50dGNfaGVhZGVyLlRhYmxlRGlyZWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgZmFjZS0+dHRjX2hlYWRlci5EaXJDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRUX1VMb25nICkgICAgICAgICAgICAgICAgICAgICAgICB8fAorICAgICAgICAgICBBQ0NFU1NfRnJhbWUoIGZhY2UtPnR0Y19oZWFkZXIuRGlyQ291bnQgKiA0TCApICkKKyAgICAgICAgZ290byBFeGl0OworCisgICAgICBmb3IgKCBuID0gMDsgbiA8IGZhY2UtPnR0Y19oZWFkZXIuRGlyQ291bnQ7IG4rKyApCisgICAgICAgIGZhY2UtPnR0Y19oZWFkZXIuVGFibGVEaXJlY3Rvcnlbbl0gPSBHRVRfVUxvbmcoKTsKKworICAgICAgRk9SR0VUX0ZyYW1lKCk7CisKKyAgICAgIC8qIGNoZWNrIGZhY2UgaW5kZXggKi8KKyAgICAgIGlmIChmYWNlSW5kZXggPj0gZmFjZS0+dHRjX2hlYWRlci5EaXJDb3VudCkKKyAgICAgIHsKKyAgICAgICAgZXJyb3IgPSBUVF9FcnJfQmFkX0FyZ3VtZW50OworICAgICAgICBnb3RvIEV4aXQ7CisgICAgICB9ICAgICAgCisgICAgICAKKyAgICAgIC8qIGlmIHdlJ3JlIGNoZWNraW5nIHRoZSBmb250IGZvcm1hdCwgZXhpdCBpbW1lZGlhdGVseSAqLworICAgICAgaWYgKGZhY2VJbmRleCA8IDApCisgICAgICAgIGdvdG8gRXhpdDsKKyAgICAgICAgCisgICAgICAvKiBzZWVrIHRvIHRoZSBhcHByb3ByaWF0ZSBUcnVlVHlwZSBmaWxlLCB0aGVuIHJlYWQgdGFnICovCisgICAgICBpZiAoIEZJTEVfU2tpcCggZmFjZS0+dHRjX2hlYWRlci5UYWJsZURpcmVjdG9yeVtmYWNlSW5kZXhdIC0gMTIgKSB8fAorICAgICAgICAgICBSRUFEX0xvbmcoIHRhYmxlRGlyLnZlcnNpb24gKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICBnb3RvIEV4aXQ7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBGVF9UUkFDRTYoKCAiVFRfTG9hZF9EaXJlY3Rvcnk6IGZpbGUgaXMgbm90IGEgY29sbGVjdGlvblxuIiApKTsKKyAgICAgIC8qIHRoZSBmaWxlIGlzbid0IGEgY29sbGVjdGlvbiwgZXhpdCBpZiB3ZSdyZSBhc2tpbmcgZm9yIGEgKi8KKyAgICAgIC8qIGNvbGxlY3RlZCBmb250Li4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgIGlmIChmYWNlSW5kZXggPiAwKQorICAgICAgeworICAgICAgICBlcnJvciA9IFRUX0Vycl9GaWxlX0lzX05vdF9Db2xsZWN0aW9uOworICAgICAgICBnb3RvIEV4aXQ7CisgICAgICB9CisgICAgICAKKyAgICAgIHRhYmxlRGlyLnZlcnNpb24gPSB0YWc7CisgICAgfQorCisgICAgaWYgKCBBQ0NFU1NfRnJhbWUoIDhMICkgKQorICAgICAgZ290byBFeGl0OworCisgICAgdGFibGVEaXIubnVtVGFibGVzID0gR0VUX1VTaG9ydCgpOworCisgICAgdGFibGVEaXIuc2VhcmNoUmFuZ2UgICA9IEdFVF9VU2hvcnQoKTsKKyAgICB0YWJsZURpci5lbnRyeVNlbGVjdG9yID0gR0VUX1VTaG9ydCgpOworICAgIHRhYmxlRGlyLnJhbmdlU2hpZnQgICAgPSBHRVRfVVNob3J0KCk7CisKKyAgICBGT1JHRVRfRnJhbWUoKTsKKworICAgIEZUX1RSQUNFMigoICItLSBUYWJsZXMgY291bnQgICA6ICUxMnVcbiIsICB0YWJsZURpci5udW1UYWJsZXMgKSk7CisgICAgRlRfVFJBQ0UyKCggIi0tIEZvcm1hdCB2ZXJzaW9uIDogJTA4bHhcbiIsIHRhYmxlRGlyLnZlcnNpb24gKSk7CisKKyAgICAvKiBDaGVjayB0aGF0IHdlIGhhdmUgYSBgc2ZudCcgZm9ybWF0IHRoZXJlICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiBXZSBtdXN0IGFsc28gYmUgYWJsZSB0byBhY2NlcHQgTWFjL0dYIGZvbnRzLCBhcyB3ZWxsIGFzIE9UIG9uZXMgKi8KKworICAgIGlmICggdGFibGVEaXIudmVyc2lvbiAhPSAweDAwMDEwMDAwICYmICAgIC8qIE1TIGZvbnRzICAgICAgICAgICovCisgICAgICAgICB0YWJsZURpci52ZXJzaW9uICE9IFRUQUdfdHJ1ZSAgJiYgICAgLyogTWFjIGZvbnRzICAgICAgICAgKi8KKyAgICAgICAgIHRhYmxlRGlyLnZlcnNpb24gIT0gVFRBR19PVFRPICApICAgIC8qIE9ULVR5cGUyIGZvbnRzICAgICovCisgICAgeworICAgICAgRlRfVFJBQ0UyKCggIltub3QgYSB2YWxpZCBUVEYgb3IgT1RGIGZvbnRdIiApKTsKKyAgICAgIGVycm9yID0gVFRfRXJyX0ludmFsaWRfRmlsZV9Gb3JtYXQ7CisgICAgICBnb3RvIEV4aXQ7CisgICAgfQorCisgICAgLyogaWYgd2UncmUgcGVyZm9ybWluZyBhIGZvbnQgZm9ybWF0IGNoZWNrLCBleGl0IGltbWVkaWF0ZWx5ICovCisgICAgLyogd2l0aCBzdWNjZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgaWYgKCBmYWNlSW5kZXggPCAwICkKKyAgICAgIGdvdG8gRXhpdDsKKworICAgIGZhY2UtPm51bV90YWJsZXMgPSB0YWJsZURpci5udW1UYWJsZXM7CisKKyAgICBpZiAoIEFMTE9DX0FSUkFZKCBmYWNlLT5kaXJfdGFibGVzLAorICAgICAgICAgICAgICAgICAgICAgIGZhY2UtPm51bV90YWJsZXMsCisgICAgICAgICAgICAgICAgICAgICAgVFRfVGFibGUgKSApCisgICAgICBnb3RvIEV4aXQ7CisKKyAgICBpZiAoIEFDQ0VTU19GcmFtZSggZmFjZS0+bnVtX3RhYmxlcyAqIDE2TCApICkKKyAgICAgIGdvdG8gRXhpdDsKKworICAgIGVudHJ5ID0gZmFjZS0+ZGlyX3RhYmxlczsKKyAgICBsaW1pdCA9IGVudHJ5ICsgZmFjZS0+bnVtX3RhYmxlczsKKworICAgIGZvciAoIDsgZW50cnkgPCBsaW1pdDsgZW50cnkrKyApCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAvKiBsb29wIHRocm91Z2ggdGhlIHRhYmxlcyBhbmQgZ2V0IGFsbCBlbnRyaWVzICovCisgICAgICBlbnRyeS0+VGFnICAgICAgPSBHRVRfVGFnNCgpOworICAgICAgZW50cnktPkNoZWNrU3VtID0gR0VUX1VMb25nKCk7CisgICAgICBlbnRyeS0+T2Zmc2V0ICAgPSBHRVRfTG9uZygpOworICAgICAgZW50cnktPkxlbmd0aCAgID0gR0VUX0xvbmcoKTsKKworICAgICAgRlRfVFJBQ0UyKCggIiAgJWMlYyVjJWMgIC0gICUwOGx4ICAtICAlMDhseFxuIiwKKyAgICAgICAgICAgICAgICAoVFRfQ2hhcikoZW50cnktPlRhZyA+PiAyNCksCisgICAgICAgICAgICAgICAgKFRUX0NoYXIpKGVudHJ5LT5UYWcgPj4gMTYpLAorICAgICAgICAgICAgICAgIChUVF9DaGFyKShlbnRyeS0+VGFnID4+IDggKSwKKyAgICAgICAgICAgICAgICAoVFRfQ2hhcikoZW50cnktPlRhZyksCisgICAgICAgICAgICAgICAgZW50cnktPk9mZnNldCwKKyAgICAgICAgICAgICAgICBlbnRyeS0+TGVuZ3RoICkpOworICAgIH0KKworICAgIEZPUkdFVF9GcmFtZSgpOworCisgICAgRlRfVFJBQ0UyKCggIkRpcmVjdG9yeSBsb2FkZWRcblxuIiApKTsKKworICBFeGl0OgorICAgIHJldHVybiBlcnJvcjsKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfTG9hZF9BbnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgTG9hZHMgYW55IGZvbnQgdGFibGUgaW50byBjbGllbnQgbWVtb3J5LiAgVXNlZCBieSB0aGUgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX0dldF9Gb250X0RhdGEoKSBBUEkgZnVuY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZhY2UgICA6OiBUaGUgZmFjZSBvYmplY3QgdG8gbG9vayBmb3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgdGFnICAgIDo6IFRoZSB0YWcgb2YgdGFibGUgdG8gbG9hZC4gIFVzZSB0aGUgdmFsdWUgMCBpZiB5b3UgIHdhbnQgICovCisgIC8qICAgICAgICAgICAgICB0byBhY2Nlc3MgdGhlIHdob2xlIGZvbnQgZmlsZSwgZWxzZSBzZXQgdGhpcyBwYXJhbWV0ZXIgICAqLworICAvKiAgICAgICAgICAgICAgdG8gYSB2YWxpZCBUcnVlVHlwZSB0YWJsZSB0YWcgdGhhdCB5b3UgY2FuIGZvcmdlIHdpdGggICAgKi8KKyAgLyogICAgICAgICAgICAgIHRoZSBNQUtFX1RUX1RBRyBtYWNyby4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBvZmZzZXQgOjogVGhlIHN0YXJ0aW5nIG9mZnNldCBpbiB0aGUgdGFibGUgKG9yIHRoZSBmaWxlIGlmICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgIHRhZyA9PSAwKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBsZW5ndGggOjogVGhlIGFkZHJlc3Mgb2YgdGhlIGRlY2lzaW9uIHZhcmlhYmxlOiAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgIElmIGxlbmd0aCA9PSBOVUxMOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgIExvYWRzIHRoZSB3aG9sZSB0YWJsZS4gIFJldHVybnMgYW4gZXJyb3IgaWYgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICBgb2Zmc2V0JyA9PSAwISAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICBJZiAqbGVuZ3RoID09IDA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICBFeGl0cyBpbW1lZGlhdGVseTsgcmV0dXJuaW5nIHRoZSBsZW5ndGggb2YgdGhlIGdpdmVuICovCisgIC8qICAgICAgICAgICAgICAgICAgdGFibGUgb3Igb2YgdGhlIGZvbnQgZmlsZSwgZGVwZW5kaW5nIG9uIHRoZSB2YWx1ZSBvZiAqLworICAvKiAgICAgICAgICAgICAgICAgIGB0YWcnLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgIElmICpsZW5ndGggIT0gMDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgIExvYWRzIHRoZSBuZXh0IGBsZW5ndGgnIGJ5dGVzIG9mIHRhYmxlIG9yIGZvbnQsICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICBzdGFydGluZyBhdCBvZmZzZXQgYG9mZnNldCcgKGluIHRhYmxlIG9yIGZvbnQgdG9vKS4gICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgYnVmZmVyIDo6IFRoZSBhZGRyZXNzIG9mIHRhcmdldCBidWZmZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVHJ1ZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBMT0NBTF9GVU5DCisgIFRUX0Vycm9yICBUVF9Mb2FkX0FueSggVFRfRmFjZSAgIGZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgVFRfVUxvbmcgIHRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICBUVF9Mb25nICAgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgVFRfTG9uZyogIGxlbmd0aCApCisgIHsKKyAgICBUVF9FcnJvciAgIGVycm9yOworICAgIEZUX1N0cmVhbSAgc3RyZWFtOworICAgIFRUX1RhYmxlKiAgdGFibGU7CisgICAgVFRfVUxvbmcgICBzaXplOworCisgICAgaWYgKCB0YWcgIT0gMCApCisgICAgeworICAgICAgLyogbG9vayBmb3IgdGFnIGluIGZvbnQgZGlyZWN0b3J5ICovCisgICAgICB0YWJsZSA9IFRUX0xvb2tVcF9UYWJsZSggZmFjZSwgdGFnICk7CisgICAgICBpZiAoICF0YWJsZSApCisgICAgICB7CisgICAgICAgIGVycm9yID0gVFRfRXJyX1RhYmxlX01pc3Npbmc7CisgICAgICAgIGdvdG8gRXhpdDsKKyAgICAgIH0KKworICAgICAgb2Zmc2V0ICs9IHRhYmxlLT5PZmZzZXQ7CisgICAgICBzaXplICAgID0gdGFibGUtPkxlbmd0aDsKKyAgICB9CisgICAgZWxzZQorICAgIC8qIHRhZyA9IDAgLS0gdGhlIHVzZSB3YW50IHRvIGFjY2VzcyB0aGUgZm9udCBmaWxlIGRpcmVjdGx5ICovCisgICAgeworICAgICAgc2l6ZSA9IGZhY2UtPnJvb3Quc3RyZWFtLT5zaXplOworICAgIH0KKworICAgIGlmICggbGVuZ3RoICYmICpsZW5ndGggPT0gMCApCisgICAgeworICAgICAgKmxlbmd0aCA9IHNpemU7CisgICAgICByZXR1cm4gVFRfRXJyX09rOworICAgIH0KKworICAgIGlmICggbGVuZ3RoICkKKyAgICAgIHNpemUgPSAqbGVuZ3RoOworCisgICAgc3RyZWFtID0gZmFjZS0+cm9vdC5zdHJlYW07CisgICAgKHZvaWQpRklMRV9SZWFkX0F0KCBvZmZzZXQsIGJ1ZmZlciwgc2l6ZSApOworCisgIEV4aXQ6CisgICAgcmV0dXJuIGVycm9yOworICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUVF9Mb2FkX0hlYWRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBMb2FkcyB0aGUgVHJ1ZVR5cGUgZm9udCBoZWFkZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBmYWNlICAgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgc3RyZWFtIDo6IFRoZSBpbnB1dCBzdHJlYW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVHJ1ZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBMT0NBTF9GVU5DCisgIFRUX0Vycm9yICBUVF9Mb2FkX0hlYWRlciggVFRfRmFjZSAgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgc3RyZWFtICkKKyAgeworICAgIFRUX0Vycm9yICAgIGVycm9yOworICAgIFRUX0hlYWRlciogIGhlYWRlcjsKKworCisgICAgRlRfVFJBQ0UyKCggIkxvYWRfVFRfSGVhZGVyKCAlMDhseCApXG4iLCAoVFRfTG9uZylmYWNlICkpOworCisgICAgZXJyb3IgPSBmYWNlLT5nb3RvX3RhYmxlKCBmYWNlLCBUVEFHX2hlYWQsIHN0cmVhbSwgMCApOworICAgIGlmICggZXJyb3IgKQorICAgIHsKKyAgICAgIEZUX1RSQUNFMCgoICJGb250IEhlYWRlciBpcyBtaXNzaW5nIVxuIiApKTsKKyAgICAgIGdvdG8gRXhpdDsKKyAgICB9CisKKyAgICBpZiAoIEFDQ0VTU19GcmFtZSggNTRMICkgKQorICAgICAgZ290byBFeGl0OworCisgICAgaGVhZGVyID0gJmZhY2UtPmhlYWRlcjsKKworICAgIGhlYWRlci0+VGFibGVfVmVyc2lvbiA9IEdFVF9VTG9uZygpOworICAgIGhlYWRlci0+Rm9udF9SZXZpc2lvbiA9IEdFVF9VTG9uZygpOworCisgICAgaGVhZGVyLT5DaGVja1N1bV9BZGp1c3QgPSBHRVRfTG9uZygpOworICAgIGhlYWRlci0+TWFnaWNfTnVtYmVyICAgID0gR0VUX0xvbmcoKTsKKworICAgIGhlYWRlci0+RmxhZ3MgICAgICAgID0gR0VUX1VTaG9ydCgpOworICAgIGhlYWRlci0+VW5pdHNfUGVyX0VNID0gR0VUX1VTaG9ydCgpOworCisgICAgaGVhZGVyLT5DcmVhdGVkIFswXSA9IEdFVF9Mb25nKCk7CisgICAgaGVhZGVyLT5DcmVhdGVkIFsxXSA9IEdFVF9Mb25nKCk7CisgICAgaGVhZGVyLT5Nb2RpZmllZFswXSA9IEdFVF9Mb25nKCk7CisgICAgaGVhZGVyLT5Nb2RpZmllZFsxXSA9IEdFVF9Mb25nKCk7CisKKyAgICBoZWFkZXItPnhNaW4gPSBHRVRfU2hvcnQoKTsKKyAgICBoZWFkZXItPnlNaW4gPSBHRVRfU2hvcnQoKTsKKyAgICBoZWFkZXItPnhNYXggPSBHRVRfU2hvcnQoKTsKKyAgICBoZWFkZXItPnlNYXggPSBHRVRfU2hvcnQoKTsKKworICAgIGhlYWRlci0+TWFjX1N0eWxlICAgICAgID0gR0VUX1VTaG9ydCgpOworICAgIGhlYWRlci0+TG93ZXN0X1JlY19QUEVNID0gR0VUX1VTaG9ydCgpOworCisgICAgaGVhZGVyLT5Gb250X0RpcmVjdGlvbiAgICAgID0gR0VUX1Nob3J0KCk7CisgICAgaGVhZGVyLT5JbmRleF9Ub19Mb2NfRm9ybWF0ID0gR0VUX1Nob3J0KCk7CisgICAgaGVhZGVyLT5HbHlwaF9EYXRhX0Zvcm1hdCAgID0gR0VUX1Nob3J0KCk7CisKKyAgICBGT1JHRVRfRnJhbWUoKTsKKworICAgIEZUX1RSQUNFMigoICIgICAgVW5pdHMgcGVyIEVNIDogJTh1XG4iLCBoZWFkZXItPlVuaXRzX1Blcl9FTSApKTsKKyAgICBGVF9UUkFDRTIoKCAiICAgIEluZGV4VG9Mb2MgICA6ICU4ZFxuIiwgaGVhZGVyLT5JbmRleF9Ub19Mb2NfRm9ybWF0ICkpOworICAgIEZUX1RSQUNFMigoICJGb250IEhlYWRlciBMb2FkZWQuXG4iICkpOworCisgIEV4aXQ6CisgICAgcmV0dXJuIGVycm9yOworICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUVF9Mb2FkX01heFByb2ZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBMb2FkcyB0aGUgbWF4aW11bSBwcm9maWxlIGludG8gYSBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBmYWNlICAgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgc3RyZWFtIDo6IFRoZSBpbnB1dCBzdHJlYW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVHJ1ZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBMT0NBTF9GVU5DCisgIFRUX0Vycm9yICBUVF9Mb2FkX01heFByb2ZpbGUoIFRUX0ZhY2UgICAgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICBzdHJlYW0gKQorICB7CisgICAgVFRfRXJyb3IgICAgICAgIGVycm9yOworICAgIFRUX01heFByb2ZpbGUqICBtYXhQcm9maWxlID0gJmZhY2UtPm1heF9wcm9maWxlOworCisKKyAgICBGVF9UUkFDRTIoKCAiTG9hZF9UVF9NYXhQcm9maWxlKCAlMDhseCApXG4iLCAoVFRfTG9uZylmYWNlICkpOworCisgICAgZXJyb3IgPSBmYWNlLT5nb3RvX3RhYmxlKCBmYWNlLCBUVEFHX21heHAsIHN0cmVhbSwgMCApOworICAgIGlmIChlcnJvcikgZ290byBFeGl0OworCisgICAgaWYgKCBBQ0NFU1NfRnJhbWUoIDMyTCApICkKKyAgICAgIGdvdG8gRXhpdDsKKworICAgIC8qIHJlYWQgZnJhbWUgZGF0YSBpbnRvIGZhY2UgdGFibGUgKi8KKyAgICBtYXhQcm9maWxlLT52ZXJzaW9uICAgICAgICAgICAgICAgPSBHRVRfVUxvbmcoKTsKKyAgICBtYXhQcm9maWxlLT5udW1HbHlwaHMgICAgICAgICAgICAgPSBHRVRfVVNob3J0KCk7CisKKyAgICBtYXhQcm9maWxlLT5tYXhQb2ludHMgICAgICAgICAgICAgPSBHRVRfVVNob3J0KCk7CisgICAgbWF4UHJvZmlsZS0+bWF4Q29udG91cnMgICAgICAgICAgID0gR0VUX1VTaG9ydCgpOworICAgIG1heFByb2ZpbGUtPm1heENvbXBvc2l0ZVBvaW50cyAgICA9IEdFVF9VU2hvcnQoKTsKKyAgICBtYXhQcm9maWxlLT5tYXhDb21wb3NpdGVDb250b3VycyAgPSBHRVRfVVNob3J0KCk7CisKKyAgICBtYXhQcm9maWxlLT5tYXhab25lcyAgICAgICAgICAgICAgPSBHRVRfVVNob3J0KCk7CisgICAgbWF4UHJvZmlsZS0+bWF4VHdpbGlnaHRQb2ludHMgICAgID0gR0VUX1VTaG9ydCgpOworCisgICAgbWF4UHJvZmlsZS0+bWF4U3RvcmFnZSAgICAgICAgICAgID0gR0VUX1VTaG9ydCgpOworICAgIG1heFByb2ZpbGUtPm1heEZ1bmN0aW9uRGVmcyAgICAgICA9IEdFVF9VU2hvcnQoKTsKKyAgICBtYXhQcm9maWxlLT5tYXhJbnN0cnVjdGlvbkRlZnMgICAgPSBHRVRfVVNob3J0KCk7CisgICAgbWF4UHJvZmlsZS0+bWF4U3RhY2tFbGVtZW50cyAgICAgID0gR0VUX1VTaG9ydCgpOworICAgIG1heFByb2ZpbGUtPm1heFNpemVPZkluc3RydWN0aW9ucyA9IEdFVF9VU2hvcnQoKTsKKyAgICBtYXhQcm9maWxlLT5tYXhDb21wb25lbnRFbGVtZW50cyAgPSBHRVRfVVNob3J0KCk7CisgICAgbWF4UHJvZmlsZS0+bWF4Q29tcG9uZW50RGVwdGggICAgID0gR0VUX1VTaG9ydCgpOworCisgICAgRk9SR0VUX0ZyYW1lKCk7CisKKyAgICAvKiBYWFg6IGFuIGFkanVzdG1lbnQgdGhhdCBpcyBuZWNlc3NhcnkgdG8gbG9hZCBjZXJ0YWluICovCisgICAgLyogICAgICAgYnJva2VuIGZvbnRzIGxpa2UgYEtleXN0cm9rZXMgTVQnIDotKCAgICAgICAgICAqLworICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgIFdlIGFsbG9jYXRlIDY0IGZ1bmN0aW9uIGVudHJpZXMgYnkgZGVmYXVsdCB3aGVuICAgICovCisgICAgLyogICB0aGUgbWF4RnVuY3Rpb25EZWZzIGZpZWxkIGlzIG51bGwuICAgICAgICAgICAgICAgICAqLworCisgICAgaWYgKCBtYXhQcm9maWxlLT5tYXhGdW5jdGlvbkRlZnMgPT0gMCApCisgICAgICBtYXhQcm9maWxlLT5tYXhGdW5jdGlvbkRlZnMgPSA2NDsKKworICAgIGZhY2UtPnJvb3QubnVtX2dseXBocyA9IG1heFByb2ZpbGUtPm51bUdseXBoczsKKworICAgIGZhY2UtPnJvb3QubWF4X3BvaW50cyA9IE1BWCggbWF4UHJvZmlsZS0+bWF4Q29tcG9zaXRlUG9pbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4UHJvZmlsZS0+bWF4UG9pbnRzICk7CisKKyAgICBmYWNlLT5yb290Lm1heF9jb250b3VycyA9IE1BWCggbWF4UHJvZmlsZS0+bWF4Q29tcG9zaXRlQ29udG91cnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFByb2ZpbGUtPm1heENvbnRvdXJzICk7CisKKyAgICBmYWNlLT5tYXhfY29tcG9uZW50cyA9IChUVF9VTG9uZyltYXhQcm9maWxlLT5tYXhDb21wb25lbnRFbGVtZW50cyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhQcm9maWxlLT5tYXhDb21wb25lbnREZXB0aDsKKworICAgIC8qIFhYWDogc29tZSBmb250cyBoYXZlIG1heENvbXBvbmVudHMgc2V0IHRvIDA7IHdlIHdpbGwgKi8KKyAgICAvKiAgICAgIHRoZW4gdXNlIDE2IG9mIHRoZW0gYnkgZGVmYXVsdC4gICAgICAgICAgICAgICAgICovCisgICAgaWYgKCBmYWNlLT5tYXhfY29tcG9uZW50cyA9PSAwICkKKyAgICAgIGZhY2UtPm1heF9jb21wb25lbnRzID0gMTY7CisKKyAgICAvKiBXZSBhbHNvIGluY3JlYXNlIG1heFBvaW50cyBhbmQgbWF4Q29udG91cnMgaW4gb3JkZXIgdG8gc3VwcG9ydCAqLworICAgIC8qIHNvbWUgYnJva2VuIGZvbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgZmFjZS0+cm9vdC5tYXhfcG9pbnRzICAgKz0gODsKKyAgICBmYWNlLT5yb290Lm1heF9jb250b3VycyArPSA0OworCisgICAgRlRfVFJBQ0UyKCggIk1BWFAgbG9hZGVkLlxuIiApKTsKKyAgRXhpdDoKKyAgICByZXR1cm4gZXJyb3I7CisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX0xvYWRfTWV0cmljcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIExvYWRzIHRoZSBob3Jpem9udGFsIG9yIHZlcnRpY2FsIG1ldHJpY3MgdGFibGUgaW50byBhIGZhY2Ugb2JqZWN0LiAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZhY2UgICAgIDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzdHJlYW0gICA6OiBUaGUgaW5wdXQgc3RyZWFtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgdmVydGljYWwgOjogQSBib29sZWFuIGZsYWcuICBJZiBzZXQsIGxvYWQgdmVydGljYWwgbWV0cmljcy4gICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVHJ1ZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBzdGF0aWMKKyAgVFRfRXJyb3IgIFRUX0xvYWRfTWV0cmljcyggVFRfRmFjZSAgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gIHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfQm9vbCAgICB2ZXJ0aWNhbCApCisgIHsKKyAgICBUVF9FcnJvciAgIGVycm9yOworICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gc3RyZWFtLT5tZW1vcnk7CisKKyAgICBUVF9VTG9uZyAgIHRhYmxlX2xlbjsKKyAgICBUVF9Mb25nICAgIG51bV9zaG9ydHMsIG51bV9sb25ncywgbnVtX3Nob3J0c19jaGVja2VkOworCisgICAgVFRfTG9uZ01ldHJpY3MqKiAgIGxvbmdzOworICAgIFRUX1Nob3J0TWV0cmljcyoqICBzaG9ydHM7CisKKyAgICBGVF9UUkFDRTIoKCAiVFRfTG9hZF8lc19NZXRyaWNzKCAlMDhseCApXG4iLAorICAgICAgICAgICAgICB2ZXJ0aWNhbCA/ICJWZXJ0aWNhbCIgOiAiSG9yaXpvbnRhbCIsIChUVF9Mb25nKWZhY2UgKSk7CisKKyAgICBpZiAoIHZlcnRpY2FsICkKKyAgICB7CisgICAgICAvKiBUaGUgdGFibGUgaXMgb3B0aW9uYWwsIHF1aXQgc2lsZW50bHkgaWYgaXQgd2Fzbid0IGZvdW5kICAgICAgICovCisgICAgICAvKiBYWFg6IFNvbWUgZm9udHMgaGF2ZSBhIHZhbGlkIHZlcnRpY2FsIGhlYWRlciB3aXRoIGEgbm9uLW51bGwgICovCisgICAgICAvKiAgICAgIGBudW1iZXJfb2ZfVk1ldHJpY3MnIGZpZWxkcywgYnV0IG5vIGNvcnJlc3BvbmRpbmcgYHZtdHgnICovCisgICAgICAvKiAgICAgIHRhYmxlIHRvIGdldCB0aGUgbWV0cmljcyBmcm9tIChlLmcuIG1pbmdsaXUpLiAgICAgICAgICAgICovCisgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAvKiAgICAgIEZvciBzYWZldHksIHdlIHNldCB0aGUgZmllbGQgdG8gMCEgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICBlcnJvciA9IGZhY2UtPmdvdG9fdGFibGUoIGZhY2UsIFRUQUdfdm10eCwgc3RyZWFtLCAmdGFibGVfbGVuICk7CisgICAgICBpZiAoIGVycm9yICkKKyAgICAgIHsKKyAgICAgICAgLyogU2V0IHRoZSBudW1iZXJfT2ZfVk1ldHJpY3MgdG8gMCEgKi8KKyAgICAgICAgRlRfVFJBQ0UyKCggIiAgbm8gdmVydGljYWwgaGVhZGVyIGluIGZpbGUuXG4iICkpOworICAgICAgICBmYWNlLT52ZXJ0aWNhbC5udW1iZXJfT2ZfVk1ldHJpY3MgPSAwOworICAgICAgICBlcnJvciA9IFRUX0Vycl9PazsKKyAgICAgICAgZ290byBFeGl0OworICAgICAgfQorCisgICAgICBudW1fbG9uZ3MgPSBmYWNlLT52ZXJ0aWNhbC5udW1iZXJfT2ZfVk1ldHJpY3M7CisgICAgICBsb25ncyAgICAgPSAoVFRfTG9uZ01ldHJpY3MqKikmZmFjZS0+dmVydGljYWwubG9uZ19tZXRyaWNzOworICAgICAgc2hvcnRzICAgID0gKFRUX1Nob3J0TWV0cmljcyoqKSZmYWNlLT52ZXJ0aWNhbC5zaG9ydF9tZXRyaWNzOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgZXJyb3IgPSBmYWNlLT5nb3RvX3RhYmxlKCBmYWNlLCBUVEFHX2htdHgsIHN0cmVhbSwgJnRhYmxlX2xlbiApOworICAgICAgaWYgKGVycm9yKQorICAgICAgeworICAgICAgICBGVF9FUlJPUigoICIgbm8gaG9yaXpvbnRhbCBtZXRyaWNzIGluIGZpbGUhXG4iICkpOworICAgICAgICBlcnJvciA9IFRUX0Vycl9IbXR4X1RhYmxlX01pc3Npbmc7CisgICAgICAgIGdvdG8gRXhpdDsKKyAgICAgIH0KKworICAgICAgbnVtX2xvbmdzID0gZmFjZS0+aG9yaXpvbnRhbC5udW1iZXJfT2ZfSE1ldHJpY3M7CisgICAgICBsb25ncyAgICAgPSAoVFRfTG9uZ01ldHJpY3MqKikmZmFjZS0+aG9yaXpvbnRhbC5sb25nX21ldHJpY3M7CisgICAgICBzaG9ydHMgICAgPSAoVFRfU2hvcnRNZXRyaWNzKiopJmZhY2UtPmhvcml6b250YWwuc2hvcnRfbWV0cmljczsKKyAgICB9CisKKyAgICAvKiBuZXZlciB0cnVzdCBkZXJpdmVkIHZhbHVlcyAqLworCisgICAgbnVtX3Nob3J0cyAgICAgICAgID0gZmFjZS0+bWF4X3Byb2ZpbGUubnVtR2x5cGhzIC0gbnVtX2xvbmdzOworICAgIG51bV9zaG9ydHNfY2hlY2tlZCA9ICggdGFibGVfbGVuIC0gbnVtX2xvbmdzKjRMICkvMjsKKworICAgIGlmICggbnVtX3Nob3J0cyA8IDAgKQorICAgIHsKKyAgICAgIEZUX0VSUk9SKCggIiEhIG1vcmUgbWV0cmljcyB0aGFuIGdseXBocyFcbiIgKSk7CisgICAgICBlcnJvciA9ICggdmVydGljYWwgPyBUVF9FcnJfSW52YWxpZF9WZXJ0X01ldHJpY3MKKyAgICAgICAgICAgICAgICAgICAgICAgICA6IFRUX0Vycl9JbnZhbGlkX0hvcml6X01ldHJpY3MgKTsKKyAgICAgIGdvdG8gRXhpdDsKKyAgICB9CisKKyAgICBpZiAoIEFMTE9DX0FSUkFZKCAqbG9uZ3MsICBudW1fbG9uZ3MsICBUVF9Mb25nTWV0cmljcyApIHx8CisgICAgICAgICBBTExPQ19BUlJBWSggKnNob3J0cywgbnVtX3Nob3J0cywgVFRfU2hvcnRNZXRyaWNzICkgKQorICAgICAgZ290byBFeGl0OworCisgICAgaWYgKCBBQ0NFU1NfRnJhbWUoIHRhYmxlX2xlbiApICkKKyAgICAgIGdvdG8gRXhpdDsKKworICAgIHsKKyAgICAgIFRUX0xvbmdNZXRyaWNzKiAgY3VyICAgPSAqbG9uZ3M7CisgICAgICBUVF9Mb25nTWV0cmljcyogIGxpbWl0ID0gY3VyICsgbnVtX2xvbmdzOworCisgICAgICBmb3IgKCA7IGN1ciA8IGxpbWl0OyBjdXIrKyApCisgICAgICB7CisgICAgICAgIGN1ci0+YWR2YW5jZSA9IEdFVF9VU2hvcnQoKTsKKyAgICAgICAgY3VyLT5iZWFyaW5nID0gR0VUX1Nob3J0KCk7CisgICAgICB9CisgICAgfQorCisgICAgLyogZG8gd2UgaGF2ZSBhbiBpbmNvbnNpc3RlbnQgbnVtYmVyIG9mIG1ldHJpYyB2YWx1ZXMgPyAqLworICAgIHsKKyAgICAgIFRUX1Nob3J0TWV0cmljcyogIGN1ciAgID0gKnNob3J0czsKKyAgICAgIFRUX1Nob3J0TWV0cmljcyogIGxpbWl0ID0gY3VyICsgTUlOKCBudW1fc2hvcnRzLCBudW1fc2hvcnRzX2NoZWNrZWQgKTsKKworICAgICAgZm9yICggOyBjdXIgPCBsaW1pdDsgY3VyKysgKQorICAgICAgICAqY3VyID0gR0VUX1Nob3J0KCk7CisKKyAgICAgIC8qIHdlIGZpbGwgdXAgdGhlIG1pc3NpbmcgbGVmdCBzaWRlIGJlYXJpbmdzIHdpdGggdGhlICAgICovCisgICAgICAvKiBsYXN0IHZhbGlkIHZhbHVlLiBTaW5jZSB0aGlzIHdpbGwgb2NjdXIgZm9yIGJ1Z2d5IENKSyAqLworICAgICAgLyogZm9udHMgdXN1YWxseSwgbm90aGluZyBzZXJpb3VzIHdpbGwgaGFwcGVuICAgICAgICAgICAgKi8KKyAgICAgIGlmICggbnVtX3Nob3J0cyA+IG51bV9zaG9ydHNfY2hlY2tlZCAmJiBudW1fc2hvcnRzX2NoZWNrZWQgPiAwICkKKyAgICAgIHsKKyAgICAgICAgVFRfU2hvcnQgIHZhbCA9ICooc2hvcnRzKVtudW1fc2hvcnRzX2NoZWNrZWQtMV07CisKKyAgICAgICAgbGltaXQgPSAqc2hvcnRzICsgbnVtX3Nob3J0czsKKyAgICAgICAgZm9yICggOyBjdXIgPCBsaW1pdDsgY3VyKysgKQorICAgICAgICAgICpjdXIgPSB2YWw7CisgICAgICB9CisgICAgfQorCisgICAgRk9SR0VUX0ZyYW1lKCk7CisKKyAgICBGVF9UUkFDRTIoKCAibG9hZGVkXG4iICkpOworCisgIEV4aXQ6CisgICAgcmV0dXJuIGVycm9yOworICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUVF9Mb2FkX01ldHJpY3NfSGVhZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBMb2FkcyB0aGUgaG9yaXpvbnRhbCBvciB2ZXJ0aWNhbCBoZWFkZXIgaW4gYSBmYWNlIG9iamVjdC4gICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBmYWNlICAgICA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgc3RyZWFtICAgOjogVGhlIGlucHV0IHN0cmVhbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHZlcnRpY2FsIDo6IEEgYm9vbGVhbiBmbGFnLiAgSWYgc2V0LCBsb2FkIHZlcnRpY2FsIG1ldHJpY3MuICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRydWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgTE9DQUxfRlVOQworICBUVF9FcnJvciAgVFRfTG9hZF9NZXRyaWNzX0hlYWRlciggVFRfRmFjZSAgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9Cb29sICAgIHZlcnRpY2FsICkKKyAgeworICAgIFRUX0Vycm9yICAgICAgICBlcnJvcjsKKyAgICBUVF9Ib3JpSGVhZGVyKiAgaGVhZGVyOworCisgICAgRlRfVFJBQ0UyKCggdmVydGljYWwgPyAiVmVydGljYWwgaGVhZGVyICIgOiAiSG9yaXpvbnRhbCBoZWFkZXIgIiApKTsKKworICAgIGlmICggdmVydGljYWwgKQorICAgIHsKKyAgICAgIGZhY2UtPnZlcnRpY2FsX2luZm8gPSAwOworCisgICAgICAvKiBUaGUgdmVydGljYWwgaGVhZGVyIHRhYmxlIGlzIG9wdGlvbmFsLCBzbyByZXR1cm4gcXVpZXRseSBpZiAqLworICAgICAgLyogd2UgZG9uJ3QgZmluZCBpdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgIGVycm9yID0gZmFjZS0+Z290b190YWJsZSggZmFjZSwgVFRBR192aGVhLCBzdHJlYW0sIDAgKTsKKyAgICAgIGlmIChlcnJvcikKKyAgICAgIHsKKyAgICAgICAgZXJyb3IgPSBUVF9FcnJfT2s7CisgICAgICAgIGdvdG8gRXhpdDsKKyAgICAgIH0KKworICAgICAgZmFjZS0+dmVydGljYWxfaW5mbyA9IDE7CisgICAgICBoZWFkZXIgPSAoVFRfSG9yaUhlYWRlciopJmZhY2UtPnZlcnRpY2FsOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogVGhlIGhvcml6b250YWwgaGVhZGVyIGlzIG1hbmRhdG9yeSwgcmV0dXJuIGFuIGVycm9yIGlmIHdlICovCisgICAgICAvKiBkb24ndCBmaW5kIGl0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgIGVycm9yID0gZmFjZS0+Z290b190YWJsZSggZmFjZSwgVFRBR19oaGVhLCBzdHJlYW0sIDAgKTsKKyAgICAgIGlmIChlcnJvcikKKyAgICAgIHsKKyAgICAgICAgZXJyb3IgPSBUVF9FcnJfSG9yaXpfSGVhZGVyX01pc3Npbmc7CisgICAgICAgIGdvdG8gRXhpdDsKKyAgICAgIH0KKworICAgICAgaGVhZGVyID0gJmZhY2UtPmhvcml6b250YWw7CisgICAgfQorCisgICAgaWYgKCBBQ0NFU1NfRnJhbWUoIDM2TCApICkKKyAgICAgIGdvdG8gRXhpdDsKKworICAgIGhlYWRlci0+VmVyc2lvbiAgID0gR0VUX1VMb25nKCk7CisgICAgaGVhZGVyLT5Bc2NlbmRlciAgPSBHRVRfU2hvcnQoKTsKKyAgICBoZWFkZXItPkRlc2NlbmRlciA9IEdFVF9TaG9ydCgpOworICAgIGhlYWRlci0+TGluZV9HYXAgID0gR0VUX1Nob3J0KCk7CisKKyAgICBoZWFkZXItPmFkdmFuY2VfV2lkdGhfTWF4ID0gR0VUX1VTaG9ydCgpOworCisgICAgaGVhZGVyLT5taW5fTGVmdF9TaWRlX0JlYXJpbmcgID0gR0VUX1Nob3J0KCk7CisgICAgaGVhZGVyLT5taW5fUmlnaHRfU2lkZV9CZWFyaW5nID0gR0VUX1Nob3J0KCk7CisgICAgaGVhZGVyLT54TWF4X0V4dGVudCAgICAgICAgICAgID0gR0VUX1Nob3J0KCk7CisgICAgaGVhZGVyLT5jYXJldF9TbG9wZV9SaXNlICAgICAgID0gR0VUX1Nob3J0KCk7CisgICAgaGVhZGVyLT5jYXJldF9TbG9wZV9SdW4gICAgICAgID0gR0VUX1Nob3J0KCk7CisKKyAgICBoZWFkZXItPlJlc2VydmVkWzBdID0gR0VUX1Nob3J0KCk7ICAvKiB0aGlzIGlzIGNhcmV0X09mZnNldCBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0aWNhbCBoZWFkZXJzICovCisgICAgaGVhZGVyLT5SZXNlcnZlZFsxXSA9IEdFVF9TaG9ydCgpOworICAgIGhlYWRlci0+UmVzZXJ2ZWRbMl0gPSBHRVRfU2hvcnQoKTsKKyAgICBoZWFkZXItPlJlc2VydmVkWzNdID0gR0VUX1Nob3J0KCk7CisgICAgaGVhZGVyLT5SZXNlcnZlZFs0XSA9IEdFVF9TaG9ydCgpOworCisgICAgaGVhZGVyLT5tZXRyaWNfRGF0YV9Gb3JtYXQgPSBHRVRfU2hvcnQoKTsKKyAgICBoZWFkZXItPm51bWJlcl9PZl9ITWV0cmljcyA9IEdFVF9VU2hvcnQoKTsKKworICAgIEZPUkdFVF9GcmFtZSgpOworCisgICAgaGVhZGVyLT5sb25nX21ldHJpY3MgID0gTlVMTDsKKyAgICBoZWFkZXItPnNob3J0X21ldHJpY3MgPSBOVUxMOworCisgICAgRlRfVFJBQ0UyKCggImxvYWRlZFxuIiApKTsKKworICAgIC8qIE5vdyB0cnkgdG8gbG9hZCB0aGUgY29ycmVzcG9uZGluZyBtZXRyaWNzICovCisKKyAgICBlcnJvciA9IFRUX0xvYWRfTWV0cmljcyggZmFjZSwgc3RyZWFtLCB2ZXJ0aWNhbCApOworICBFeGl0OgorICAgIHJldHVybiBlcnJvcjsKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfTG9hZF9OYW1lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgTG9hZHMgdGhlIG5hbWUgcmVjb3Jkcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZmFjZSAgIDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHN0cmVhbSA6OiBUaGUgaW5wdXQgc3RyZWFtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRydWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgTE9DQUxfRlVOQworICBUVF9FcnJvciAgVFRfTG9hZF9OYW1lcyggVFRfRmFjZSAgZmFjZSwgRlRfU3RyZWFtICBzdHJlYW0gKQorICB7CisgICAgVFRfRXJyb3IgICBlcnJvcjsKKyAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IHN0cmVhbS0+bWVtb3J5OworCisgICAgVFRfVUxvbmcgICB0YWJsZV9wb3MsIHRhYmxlX2xlbjsKKyAgICBUVF9VTG9uZyAgIHN0b3JhZ2VTaXplOworCisgICAgVFRfTmFtZVRhYmxlKiAgbmFtZXM7CisKKworICAgIEZUX1RSQUNFMigoICJOYW1lcyAiICkpOworCisgICAgZXJyb3IgPSBmYWNlLT5nb3RvX3RhYmxlKCBmYWNlLCBUVEFHX25hbWUsIHN0cmVhbSwgJnRhYmxlX2xlbiApOworICAgIGlmIChlcnJvcikKKyAgICB7CisgICAgICAvKiBUaGUgbmFtZSB0YWJsZSBpcyByZXF1aXJlZCBzbyBpbmRpY2F0ZSBmYWlsdXJlLiAqLworICAgICAgRlRfVFJBQ0UyKCggImlzIG1pc3NpbmchXG4iICkpOworICAgICAgZXJyb3IgPSBUVF9FcnJfTmFtZV9UYWJsZV9NaXNzaW5nOworICAgICAgZ290byBFeGl0OworICAgIH0KKworICAgIHRhYmxlX3BvcyA9IEZJTEVfUG9zKCk7CisKKyAgICBpZiAoIEFDQ0VTU19GcmFtZSggNkwgKSApCisgICAgICBnb3RvIEV4aXQ7CisKKyAgICBuYW1lcyA9ICZmYWNlLT5uYW1lX3RhYmxlOworCisgICAgLyogTG9hZCB0aGUgaW5pdGlhbCBuYW1lcyBkYXRhLiAqLworICAgIG5hbWVzLT5mb3JtYXQgICAgICAgICA9IEdFVF9VU2hvcnQoKTsKKyAgICBuYW1lcy0+bnVtTmFtZVJlY29yZHMgPSBHRVRfVVNob3J0KCk7CisgICAgbmFtZXMtPnN0b3JhZ2VPZmZzZXQgID0gR0VUX1VTaG9ydCgpOworCisgICAgRk9SR0VUX0ZyYW1lKCk7CisKKyAgICAvKiBBbGxvY2F0ZSB0aGUgYXJyYXkgb2YgbmFtZSByZWNvcmRzLiAqLworICAgIGlmICggQUxMT0NfQVJSQVkoIG5hbWVzLT5uYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICBuYW1lcy0+bnVtTmFtZVJlY29yZHMsCisgICAgICAgICAgICAgICAgICAgICAgVFRfTmFtZVJlYyApICAgICAgICAgICAgICAgICAgIHx8CisgICAgICAgICBBQ0NFU1NfRnJhbWUoIG5hbWVzLT5udW1OYW1lUmVjb3JkcyAqIDEyTCApICkKKyAgICAgIGdvdG8gRXhpdDsKKworICAgIC8qIExvYWQgdGhlIG5hbWUgcmVjb3JkcyBhbmQgZGV0ZXJtaW5lIGhvdyBtdWNoIHN0b3JhZ2UgaXMgbmVlZGVkICovCisgICAgLyogdG8gaG9sZCB0aGUgc3RyaW5ncyB0aGVtc2VsdmVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICB7CisgICAgICBUVF9OYW1lUmVjKiAgICBjdXIgICA9IG5hbWVzLT5uYW1lczsKKyAgICAgIFRUX05hbWVSZWMqICAgIGxpbWl0ID0gY3VyICsgbmFtZXMtPm51bU5hbWVSZWNvcmRzOworCisgICAgICBzdG9yYWdlU2l6ZSA9IDA7CisKKyAgICAgIGZvciAoIDsgY3VyIDwgbGltaXQ7IGN1ciArKyApCisgICAgICB7CisgICAgICAgIFRUX1VMb25nICB1cHBlcjsKKworICAgICAgICBjdXItPnBsYXRmb3JtSUQgICA9IEdFVF9VU2hvcnQoKTsKKyAgICAgICAgY3VyLT5lbmNvZGluZ0lEICAgPSBHRVRfVVNob3J0KCk7CisgICAgICAgIGN1ci0+bGFuZ3VhZ2VJRCAgID0gR0VUX1VTaG9ydCgpOworICAgICAgICBjdXItPm5hbWVJRCAgICAgICA9IEdFVF9VU2hvcnQoKTsKKyAgICAgICAgY3VyLT5zdHJpbmdMZW5ndGggPSBHRVRfVVNob3J0KCk7CisgICAgICAgIGN1ci0+c3RyaW5nT2Zmc2V0ID0gR0VUX1VTaG9ydCgpOworCisgICAgICAgIHVwcGVyID0gKFRUX1VMb25nKShjdXItPnN0cmluZ09mZnNldCArIGN1ci0+c3RyaW5nTGVuZ3RoKTsKKyAgICAgICAgaWYgKCB1cHBlciA+IHN0b3JhZ2VTaXplICkgc3RvcmFnZVNpemUgPSB1cHBlcjsKKyAgICAgIH0KKyAgICB9CisKKyAgICBGT1JHRVRfRnJhbWUoKTsKKworICAgIGlmIChzdG9yYWdlU2l6ZSA+IDApCisgICAgeworICAgICAgLyogYWxsb2NhdGUgdGhlIG5hbWUgc3RvcmFnZSBhcmVhIGluIG1lbW9yeSwgdGhlbiByZWFkIGl0ICovCisgICAgICBpZiAoIEFMTE9DKCBuYW1lcy0+c3RvcmFnZSwgc3RvcmFnZVNpemUgKSAgfHwKKyAgICAgICAgICAgRklMRV9SZWFkX0F0KCB0YWJsZV9wb3MgKyBuYW1lcy0+c3RvcmFnZU9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbmFtZXMtPnN0b3JhZ2UsIHN0b3JhZ2VTaXplICkgKQorICAgICAgICBnb3RvIEV4aXQ7CisgIAorICAgICAgLyogR28gdGhyb3VnaCBhbmQgYXNzaWduIHRoZSBzdHJpbmcgcG9pbnRlcnMgdG8gdGhlIG5hbWUgcmVjb3Jkcy4gKi8KKyAgICAgIHsKKyAgICAgICAgVFRfTmFtZVJlYyogIGN1ciAgID0gbmFtZXMtPm5hbWVzOworICAgICAgICBUVF9OYW1lUmVjKiAgbGltaXQgPSBjdXIgKyBuYW1lcy0+bnVtTmFtZVJlY29yZHM7CisgIAorICAgICAgICBmb3IgKCA7IGN1ciA8IGxpbWl0OyBjdXIrKyApCisgICAgICAgICAgY3VyLT5zdHJpbmcgPSBuYW1lcy0+c3RvcmFnZSArIGN1ci0+c3RyaW5nT2Zmc2V0OworICAgICAgfQorCisjaWZkZWYgRlRfREVCVUdfTEVWRUxfVFJBQ0UgIAorICAgICAgLyogUHJpbnQgTmFtZSBSZWNvcmQgVGFibGUgaW4gY2FzZSBvZiBkZWJ1Z2dpbmcgKi8KKyAgICAgIHsKKyAgICAgICAgVFRfTmFtZVJlYyogIGN1ciAgID0gbmFtZXMtPm5hbWVzOworICAgICAgICBUVF9OYW1lUmVjKiAgbGltaXQgPSBjdXIgKyBuYW1lcy0+bnVtTmFtZVJlY29yZHM7CisKKyAgICAgICAgZm9yICggOyBjdXIgPCBsaW1pdDsgY3VyKysgKQorICAgICAgICB7CisgICAgICAgICAgVFRfVUludCAgajsKKyAgICAKKyAgICAgICAgICBGVF9UUkFDRTIoKCAiJWQgJWQgJXggJWQgIiwKKyAgICAgICAgICAgICAgICAgICAgICAgY3VyLT5wbGF0Zm9ybUlELAorICAgICAgICAgICAgICAgICAgICAgICBjdXItPmVuY29kaW5nSUQsCisgICAgICAgICAgICAgICAgICAgICAgIGN1ci0+bGFuZ3VhZ2VJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgY3VyLT5uYW1lSUQgKSk7CisgICAgCisgICAgICAgICAgLyogSSBrbm93IHRoYXQgTSQgZW5jb2RlZCBzdHJpbmdzIGFyZSBVbmljb2RlLCAgICAgICAgICAgICovCisgICAgICAgICAgLyogYnV0IHRoaXMgd29ya3MgcmVhc29uYWJsZSB3ZWxsIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMuICovCisgICAgICAgICAgaWYgKCBjdXItPnN0cmluZyApCisgICAgICAgICAgICBmb3IgKCBqID0gMDsgaiA8IGN1ci0+c3RyaW5nTGVuZ3RoOyBqKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBUVF9DaGFyICBjID0gKihjdXItPnN0cmluZyArIGopOworICAgIAorICAgICAgICAgICAgICBpZiAoIChUVF9CeXRlKWMgPCAxMjggKQorICAgICAgICAgICAgICAgIEZUX1RSQUNFMigoICIlYyIsIGMgKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIEZUX1RSQUNFMigoICJcbiIgKSk7CisjZW5kaWYKKyAgICB9CisgICAgRlRfVFJBQ0UyKCggImxvYWRlZFxuIiApKTsKKworICBFeGl0OgorICAgIHJldHVybiBlcnJvcjsKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfRnJlZV9OYW1lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRnJlZXMgdGhlIG5hbWUgcmVjb3Jkcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZmFjZSA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBMT0NBTF9GVU5DCisgIHZvaWQgIFRUX0ZyZWVfTmFtZXMoIFRUX0ZhY2UgIGZhY2UgKQorICB7CisgICAgRlRfTWVtb3J5ICAgICAgbWVtb3J5ID0gZmFjZS0+cm9vdC5kcml2ZXItPm1lbW9yeTsKKyAgICBUVF9OYW1lVGFibGUqICBuYW1lcyAgPSAmZmFjZS0+bmFtZV90YWJsZTsKKworCisgICAgLyogZnJlZSBzdHJpbmdzIHRhYmxlICovCisgICAgRlJFRSggbmFtZXMtPm5hbWVzICk7CisKKyAgICAvKiBmcmVlIHN0cmluZ3Mgc3RvcmFnZSAqLworICAgIEZSRUUoIG5hbWVzLT5zdG9yYWdlICk7CisKKyAgICBuYW1lcy0+bnVtTmFtZVJlY29yZHMgPSAwOworICAgIG5hbWVzLT5mb3JtYXQgICAgICAgICA9IDA7CisgICAgbmFtZXMtPnN0b3JhZ2VPZmZzZXQgID0gMDsKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfTG9hZF9DTWFwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgTG9hZHMgdGhlIGNtYXAgZGlyZWN0b3J5IGluIGEgZmFjZSBvYmplY3QuICBUaGUgY21hcHMgaXRzZWx2ZXMgYXJlICovCisgIC8qICAgIGxvYWRlZCBvbiBkZW1hbmQgaW4gdGhlIGB0dGNtYXAuYycgbW9kdWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZhY2UgICAgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzdHJlYW0gIDo6IEEgaGFuZGxlIHRvIHRoZSBpbnB1dCBzdHJlYW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgVHJ1ZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIExPQ0FMX0ZVTkMKKyAgVFRfRXJyb3IgIFRUX0xvYWRfQ01hcCggVFRfRmFjZSAgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gIHN0cmVhbSApCisgIHsKKyAgICBUVF9FcnJvciAgICBlcnJvcjsKKyAgICBGVF9NZW1vcnkgICBtZW1vcnkgPSBzdHJlYW0tPm1lbW9yeTsKKyAgICBUVF9Mb25nICAgICBvZmYsIGN1cl9vZmYsIHRhYmxlX3N0YXJ0OworICAgIFRUX0NNYXBEaXIgIGNtYXBfZGlyOworCisgICAgRlRfVFJBQ0UyKCggIkNNYXBzICIgKSk7CisKKyAgICBlcnJvciA9IGZhY2UtPmdvdG9fdGFibGUoIGZhY2UsIFRUQUdfY21hcCwgc3RyZWFtLCAwICk7CisgICAgaWYgKGVycm9yKQorICAgIHsKKyAgICAgIGVycm9yID0gVFRfRXJyX0NNYXBfVGFibGVfTWlzc2luZzsKKyAgICAgIGdvdG8gRXhpdDsKKyAgICB9CisKKyAgICB0YWJsZV9zdGFydCA9IEZJTEVfUG9zKCk7CisKKyAgICBpZiAoIEFDQ0VTU19GcmFtZSggNEwgKSApICAgICAgICAgICAvKiA0IGJ5dGVzIGNtYXAgaGVhZGVyICovCisgICAgICBnb3RvIEV4aXQ7CisKKyAgICBjbWFwX2Rpci50YWJsZVZlcnNpb25OdW1iZXIgPSBHRVRfVVNob3J0KCk7CisgICAgY21hcF9kaXIubnVtQ01hcHMgICAgICAgICAgID0gR0VUX1VTaG9ydCgpOworCisgICAgRk9SR0VUX0ZyYW1lKCk7CisKKyAgICBvZmYgPSBGSUxFX1BvcygpOyAgLyogc2F2ZSBvZmZzZXQgdG8gY21hcGRpcltdIHdoaWNoIGZvbGxvd3MgKi8KKworICAgIC8qIHNhdmUgc3BhY2UgaW4gZmFjZSB0YWJsZSBmb3IgY21hcCB0YWJsZXMgKi8KKyAgICBpZiAoIEFMTE9DX0FSUkFZKCBmYWNlLT5jaGFybWFwcywKKyAgICAgICAgICAgICAgICAgICAgICBjbWFwX2Rpci5udW1DTWFwcywKKyAgICAgICAgICAgICAgICAgICAgICBUVF9DaGFyTWFwUmVjICkgKQorICAgICAgZ290byBFeGl0OworCisgICAgZmFjZS0+bnVtX2NoYXJtYXBzID0gY21hcF9kaXIubnVtQ01hcHM7CisgICAgeworICAgICAgVFRfQ2hhck1hcCAgY2hhcm1hcCA9IGZhY2UtPmNoYXJtYXBzOworICAgICAgVFRfQ2hhck1hcCAgbGltaXQgICA9IGNoYXJtYXAgKyBmYWNlLT5udW1fY2hhcm1hcHM7CisKKyAgICAgIGZvciAoIDsgY2hhcm1hcCA8IGxpbWl0OyBjaGFybWFwKysgKQorICAgICAgeworICAgICAgICBUVF9DTWFwVGFibGUqICBjbWFwOworCisgICAgICAgIGNoYXJtYXAtPnJvb3QuZmFjZSA9IChGVF9GYWNlKWZhY2U7CisgICAgICAgIGNtYXAgICAgICAgICAgICAgICA9ICZjaGFybWFwLT5jbWFwOworCisgICAgICAgIGlmICggRklMRV9TZWVrKCBvZmYgKSAgfHwKKyAgICAgICAgICAgICBBQ0NFU1NfRnJhbWUoIDhMICkgKQorICAgICAgICAgIGdvdG8gRXhpdDsKKworICAgICAgICBjbWFwLT5sb2FkZWQgICAgICAgICAgICAgPSBGQUxTRTsKKyAgICAgICAgY21hcC0+cGxhdGZvcm1JRCAgICAgICAgID0gR0VUX1VTaG9ydCgpOworICAgICAgICBjbWFwLT5wbGF0Zm9ybUVuY29kaW5nSUQgPSBHRVRfVVNob3J0KCk7CisKKyAgICAgICAgY3VyX29mZiA9IEdFVF9Mb25nKCk7CisKKyAgICAgICAgRk9SR0VUX0ZyYW1lKCk7CisKKyAgICAgICAgb2ZmID0gRklMRV9Qb3MoKTsKKworICAgICAgICBpZiAoIEZJTEVfU2VlayggdGFibGVfc3RhcnQgKyBjdXJfb2ZmICkgfHwKKyAgICAgICAgICAgICBBQ0NFU1NfRnJhbWUoIDZMICkgKQorICAgICAgICAgIGdvdG8gRXhpdDsKKworICAgICAgICBjbWFwLT5mb3JtYXQgID0gR0VUX1VTaG9ydCgpOworICAgICAgICBjbWFwLT5sZW5ndGggID0gR0VUX1VTaG9ydCgpOworICAgICAgICBjbWFwLT52ZXJzaW9uID0gR0VUX1VTaG9ydCgpOworCisgICAgICAgIEZPUkdFVF9GcmFtZSgpOworCisgICAgICAgIGNtYXAtPm9mZnNldCA9IEZJTEVfUG9zKCk7CisgICAgICAgIGNoYXJtYXArKzsKKyAgICAgIH0KKyAgICB9CisKKyAgICBGVF9UUkFDRTIoKCAibG9hZGVkXG4iICkpOworICBFeGl0OgorICAgIHJldHVybiBlcnJvcjsKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfTG9hZF9PUzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgTG9hZHMgdGhlIE9TMiB0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZmFjZSAgIDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHN0cmVhbSA6OiBBIGhhbmRsZSB0byB0aGUgaW5wdXQgc3RyZWFtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRydWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgTE9DQUxfRlVOQworICBUVF9FcnJvciAgVFRfTG9hZF9PUzIoIFRUX0ZhY2UgICAgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gIHN0cmVhbSApCisgIHsKKyAgICBUVF9FcnJvciAgZXJyb3I7CisgICAgVFRfSW50ICAgIGo7CisgICAgVFRfT1MyKiAgIG9zMjsKKworCisgICAgRlRfVFJBQ0UyKCggIk9TLzIgVGFibGUgIiApKTsKKworICAgIC8qIFdlIG5vdyBzdXBwb3J0IG9sZCBNYWMgZm9udHMgd2hlcmUgdGhlIE9TLzIgdGFibGUgZG9lc24ndCAgKi8KKyAgICAvKiBleGlzdC4gIFNpbXBseSBwdXQsIHdlIHNldCB0aGUgYHZlcnNpb24nIGZpZWxkIHRvIDB4RkZGRiAgICovCisgICAgLyogYW5kIHRlc3QgdGhpcyB2YWx1ZSBlYWNoIHRpbWUgd2UgbmVlZCB0byBhY2Nlc3MgdGhlIHRhYmxlLiAqLworICAgIGVycm9yID0gZmFjZS0+Z290b190YWJsZSggZmFjZSwgVFRBR19PUzIsIHN0cmVhbSwgMCApOworICAgIGlmIChlcnJvcikKKyAgICB7CisgICAgICBGVF9UUkFDRTIoKCAiaXMgbWlzc2luZ1xuISIgKSk7CisgICAgICBmYWNlLT5vczIudmVyc2lvbiA9IDB4RkZGRjsKKyAgICAgIGVycm9yID0gVFRfRXJyX09rOworICAgICAgZ290byBFeGl0OworICAgIH0KKworICAgIGlmICggQUNDRVNTX0ZyYW1lKCA3OEwgKSApCisgICAgICBnb3RvIEV4aXQ7CisKKyAgICBvczIgPSAmZmFjZS0+b3MyOworCisgICAgb3MyLT52ZXJzaW9uICAgICAgICAgICAgID0gR0VUX1VTaG9ydCgpOworICAgIG9zMi0+eEF2Z0NoYXJXaWR0aCAgICAgICA9IEdFVF9TaG9ydCgpOworICAgIG9zMi0+dXNXZWlnaHRDbGFzcyAgICAgICA9IEdFVF9VU2hvcnQoKTsKKyAgICBvczItPnVzV2lkdGhDbGFzcyAgICAgICAgPSBHRVRfVVNob3J0KCk7CisgICAgb3MyLT5mc1R5cGUgICAgICAgICAgICAgID0gR0VUX1Nob3J0KCk7CisgICAgb3MyLT55U3Vic2NyaXB0WFNpemUgICAgID0gR0VUX1Nob3J0KCk7CisgICAgb3MyLT55U3Vic2NyaXB0WVNpemUgICAgID0gR0VUX1Nob3J0KCk7CisgICAgb3MyLT55U3Vic2NyaXB0WE9mZnNldCAgID0gR0VUX1Nob3J0KCk7CisgICAgb3MyLT55U3Vic2NyaXB0WU9mZnNldCAgID0gR0VUX1Nob3J0KCk7CisgICAgb3MyLT55U3VwZXJzY3JpcHRYU2l6ZSAgID0gR0VUX1Nob3J0KCk7CisgICAgb3MyLT55U3VwZXJzY3JpcHRZU2l6ZSAgID0gR0VUX1Nob3J0KCk7CisgICAgb3MyLT55U3VwZXJzY3JpcHRYT2Zmc2V0ID0gR0VUX1Nob3J0KCk7CisgICAgb3MyLT55U3VwZXJzY3JpcHRZT2Zmc2V0ID0gR0VUX1Nob3J0KCk7CisgICAgb3MyLT55U3RyaWtlb3V0U2l6ZSAgICAgID0gR0VUX1Nob3J0KCk7CisgICAgb3MyLT55U3RyaWtlb3V0UG9zaXRpb24gID0gR0VUX1Nob3J0KCk7CisgICAgb3MyLT5zRmFtaWx5Q2xhc3MgICAgICAgID0gR0VUX1Nob3J0KCk7CisKKyAgICBmb3IgKCBqID0gMDsgaiA8IDEwOyBqKysgKQorICAgICAgb3MyLT5wYW5vc2Vbal0gPSBHRVRfQnl0ZSgpOworCisgICAgb3MyLT51bFVuaWNvZGVSYW5nZTEgICAgID0gR0VUX1VMb25nKCk7CisgICAgb3MyLT51bFVuaWNvZGVSYW5nZTIgICAgID0gR0VUX1VMb25nKCk7CisgICAgb3MyLT51bFVuaWNvZGVSYW5nZTMgICAgID0gR0VUX1VMb25nKCk7CisgICAgb3MyLT51bFVuaWNvZGVSYW5nZTQgICAgID0gR0VUX1VMb25nKCk7CisKKyAgICBmb3IgKCBqID0gMDsgaiA8IDQ7IGorKyApCisgICAgICBvczItPmFjaFZlbmRJRFtqXSA9IEdFVF9CeXRlKCk7CisKKyAgICBvczItPmZzU2VsZWN0aW9uICAgICAgICAgPSBHRVRfVVNob3J0KCk7CisgICAgb3MyLT51c0ZpcnN0Q2hhckluZGV4ICAgID0gR0VUX1VTaG9ydCgpOworICAgIG9zMi0+dXNMYXN0Q2hhckluZGV4ICAgICA9IEdFVF9VU2hvcnQoKTsKKyAgICBvczItPnNUeXBvQXNjZW5kZXIgICAgICAgPSBHRVRfU2hvcnQoKTsKKyAgICBvczItPnNUeXBvRGVzY2VuZGVyICAgICAgPSBHRVRfU2hvcnQoKTsKKyAgICBvczItPnNUeXBvTGluZUdhcCAgICAgICAgPSBHRVRfU2hvcnQoKTsKKyAgICBvczItPnVzV2luQXNjZW50ICAgICAgICAgPSBHRVRfVVNob3J0KCk7CisgICAgb3MyLT51c1dpbkRlc2NlbnQgICAgICAgID0gR0VUX1VTaG9ydCgpOworCisgICAgRk9SR0VUX0ZyYW1lKCk7CisKKyAgICBvczItPnVsQ29kZVBhZ2VSYW5nZTEgPSAwOworICAgIG9zMi0+dWxDb2RlUGFnZVJhbmdlMiA9IDA7CisKKyAgICBpZiAoIG9zMi0+dmVyc2lvbiA+PSAweDAwMDEgKQorICAgIHsKKyAgICAgIC8qIG9ubHkgdmVyc2lvbiAxIHRhYmxlcyAqLworCisgICAgICBpZiAoIEFDQ0VTU19GcmFtZSggOEwgKSApICAvKiByZWFkIGludG8gZnJhbWUgKi8KKyAgICAgICAgZ290byBFeGl0OworCisgICAgICBvczItPnVsQ29kZVBhZ2VSYW5nZTEgPSBHRVRfVUxvbmcoKTsKKyAgICAgIG9zMi0+dWxDb2RlUGFnZVJhbmdlMiA9IEdFVF9VTG9uZygpOworCisgICAgICBGT1JHRVRfRnJhbWUoKTsKKyAgICB9CisKKyAgICBGVF9UUkFDRTIoKCAibG9hZGVkXG4iICkpOworCisgIEV4aXQ6CisgICAgcmV0dXJuIGVycm9yOworICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUVF9Mb2FkX1Bvc3RzY3JpcHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBMb2FkcyB0aGUgUG9zdHNjcmlwdCB0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBmYWNlICAgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgc3RyZWFtIDo6IEEgaGFuZGxlIHRvIHRoZSBpbnB1dCBzdHJlYW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVHJ1ZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBMT0NBTF9GVU5DCisgIFRUX0Vycm9yICBUVF9Mb2FkX1Bvc3RTY3JpcHQoIFRUX0ZhY2UgICAgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICBzdHJlYW0gKQorICB7CisgICAgVFRfRXJyb3IgICAgICAgIGVycm9yOworICAgIFRUX1Bvc3RzY3JpcHQqICBwb3N0ID0gJmZhY2UtPnBvc3RzY3JpcHQ7CisKKyAgICBGVF9UUkFDRTIoKCAiUG9zdFNjcmlwdCAiICkpOworCisgICAgZXJyb3IgPSBmYWNlLT5nb3RvX3RhYmxlKCBmYWNlLCBUVEFHX3Bvc3QsIHN0cmVhbSwgMCApOworICAgIGlmIChlcnJvcikKKyAgICAgIHJldHVybiBUVF9FcnJfUG9zdF9UYWJsZV9NaXNzaW5nOworCisgICAgaWYgKCBBQ0NFU1NfRnJhbWUoIDMyTCApICkKKyAgICAgIHJldHVybiBlcnJvcjsKKworICAgIC8qIHJlYWQgZnJhbWUgZGF0YSBpbnRvIGZhY2UgdGFibGUgKi8KKworICAgIHBvc3QtPkZvcm1hdFR5cGUgICAgICAgICA9IEdFVF9VTG9uZygpOworICAgIHBvc3QtPml0YWxpY0FuZ2xlICAgICAgICA9IEdFVF9VTG9uZygpOworICAgIHBvc3QtPnVuZGVybGluZVBvc2l0aW9uICA9IEdFVF9TaG9ydCgpOworICAgIHBvc3QtPnVuZGVybGluZVRoaWNrbmVzcyA9IEdFVF9TaG9ydCgpOworICAgIHBvc3QtPmlzRml4ZWRQaXRjaCAgICAgICA9IEdFVF9VTG9uZygpOworICAgIHBvc3QtPm1pbk1lbVR5cGU0MiAgICAgICA9IEdFVF9VTG9uZygpOworICAgIHBvc3QtPm1heE1lbVR5cGU0MiAgICAgICA9IEdFVF9VTG9uZygpOworICAgIHBvc3QtPm1pbk1lbVR5cGUxICAgICAgICA9IEdFVF9VTG9uZygpOworICAgIHBvc3QtPm1heE1lbVR5cGUxICAgICAgICA9IEdFVF9VTG9uZygpOworCisgICAgRk9SR0VUX0ZyYW1lKCk7CisKKyAgICAvKiB3ZSBkb24ndCBsb2FkIHRoZSBnbHlwaCBuYW1lcywgd2UgZG8gdGhhdCBpbiBhbm90aGVyICovCisgICAgLyogbW9kdWxlICh0dHBvc3QpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIEZUX1RSQUNFMigoICJsb2FkZWRcbiIgKSk7CisKKyAgICByZXR1cm4gVFRfRXJyX09rOworICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUVF9Mb2FkX0dhc3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBMb2FkcyB0aGUgYEdBU1AnIHRhYmxlIGludG8gYSBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBmYWNlICAgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgc3RyZWFtIDo6IFRoZSBpbnB1dCBzdHJlYW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVHJ1ZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBMT0NBTF9GVU5DCisgIFRUX0Vycm9yICBUVF9Mb2FkX0dhc3AoIFRUX0ZhY2UgICAgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICBzdHJlYW0gKQorICB7CisgICAgVFRfRXJyb3IgICBlcnJvcjsKKyAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IHN0cmVhbS0+bWVtb3J5OworCisgICAgVFRfVUludCAgICAgICAgaixudW1fcmFuZ2VzOworICAgIFRUX0dhc3BSYW5nZSogIGdhc3ByYW5nZXM7CisKKworICAgIEZUX1RSQUNFMigoICJUVF9Mb2FkX0dhc3AoICUwOGx4IClcbiIsIChUVF9Mb25nKWZhY2UgKSk7CisKKyAgICAvKiB0aGUgZ2FzcCB0YWJsZSBpcyBvcHRpb25hbCAqLworICAgIGVycm9yID0gZmFjZS0+Z290b190YWJsZSggZmFjZSwgVFRBR19nYXNwLCBzdHJlYW0sIDAgKTsKKyAgICBpZiAoZXJyb3IpIHJldHVybiBUVF9FcnJfT2s7CisKKyAgICBpZiAoIEFDQ0VTU19GcmFtZSggNEwgKSApCisgICAgICBnb3RvIEV4aXQ7CisKKyAgICBmYWNlLT5nYXNwLnZlcnNpb24gICA9IEdFVF9VU2hvcnQoKTsKKyAgICBmYWNlLT5nYXNwLm51bVJhbmdlcyA9IEdFVF9VU2hvcnQoKTsKKworICAgIEZPUkdFVF9GcmFtZSgpOworCisgICAgbnVtX3JhbmdlcyA9IGZhY2UtPmdhc3AubnVtUmFuZ2VzOworICAgIEZUX1RSQUNFMygoICJudW1iZXIgb2YgcmFuZ2VzID0gJWRcbiIsIG51bV9yYW5nZXMgKSk7CisKKyAgICBpZiAoIEFMTE9DX0FSUkFZKCBnYXNwcmFuZ2VzLCBudW1fcmFuZ2VzLCBUVF9HYXNwUmFuZ2UgKSB8fAorICAgICAgICAgQUNDRVNTX0ZyYW1lKCBudW1fcmFuZ2VzICogNEwgKSApCisgICAgICBnb3RvIEV4aXQ7CisKKyAgICBmYWNlLT5nYXNwLmdhc3BSYW5nZXMgPSBnYXNwcmFuZ2VzOworCisgICAgZm9yICggaiA9IDA7IGogPCBudW1fcmFuZ2VzOyBqKysgKQorICAgIHsKKyAgICAgIGdhc3ByYW5nZXNbal0ubWF4UFBFTSAgPSBHRVRfVVNob3J0KCk7CisgICAgICBnYXNwcmFuZ2VzW2pdLmdhc3BGbGFnID0gR0VUX1VTaG9ydCgpOworCisgICAgICBGVF9UUkFDRTMoKCAiIFttYXg6JWQgZmxhZzolZF0iLAorICAgICAgICAgICAgICAgIGdhc3ByYW5nZXNbal0ubWF4UFBFTSwKKyAgICAgICAgICAgICAgICBnYXNwcmFuZ2VzW2pdLmdhc3BGbGFnICkpOworICAgIH0KKyAgICBGVF9UUkFDRTMoKCAiXG4iICkpOworCisgICAgRk9SR0VUX0ZyYW1lKCk7CisgICAgRlRfVFJBQ0UyKCggIkdBU1AgbG9hZGVkXG4iICkpOworCisgIEV4aXQ6CisgICAgcmV0dXJuIGVycm9yOworICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUVF9Mb2FkX0tlcm4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBMb2FkcyB0aGUgZmlyc3Qga2VybmluZyB0YWJsZSB3aXRoIGZvcm1hdCAwIGluIHRoZSBmb250LiAgT25seSAgICAgKi8KKyAgLyogICAgYWNjZXB0cyB0aGUgZmlyc3QgaG9yaXpvbnRhbCBrZXJuaW5nIHRhYmxlLiAgRGV2ZWxvcGVycyBzaG91bGQgdXNlICovCisgIC8qICAgIHRoZSBgZnR4a2VybicgZXh0ZW5zaW9uIHRvIGFjY2VzcyBvdGhlciBrZXJuaW5nIHRhYmxlcyBpbiB0aGUgZm9udCAqLworICAvKiAgICBmaWxlLCBpZiB0aGV5IHJlYWxseSB3YW50IHRvLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBmYWNlICAgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgc3RyZWFtIDo6IFRoZSBpbnB1dCBzdHJlYW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVHJ1ZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBMT0NBTF9GVU5DCisgIFRUX0Vycm9yICBUVF9Mb2FkX0tlcm4oIFRUX0ZhY2UgICAgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICBzdHJlYW0gKQorICB7CisgICAgVFRfRXJyb3IgICBlcnJvcjsKKyAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IHN0cmVhbS0+bWVtb3J5OworCisgICAgVFRfVUludCAgICBuLCBudW1fdGFibGVzLCB2ZXJzaW9uOworCisgICAgLyogdGhlIGtlcm4gdGFibGUgaXMgb3B0aW9uYWwuIGV4aXQgc2lsZW50bHkgaWYgaXQncyBtaXNzaW5nICovCisgICAgZXJyb3IgPSBmYWNlLT5nb3RvX3RhYmxlKCBmYWNlLCBUVEFHX2tlcm4sIHN0cmVhbSwgMCApOworICAgIGlmICggZXJyb3IgKSByZXR1cm4gVFRfRXJyX09rOworCisgICAgaWYgKCBBQ0NFU1NfRnJhbWUoIDRMICkgKSBnb3RvIEV4aXQ7CisKKyAgICB2ZXJzaW9uICAgID0gR0VUX1VTaG9ydCgpOworICAgIG51bV90YWJsZXMgPSBHRVRfVVNob3J0KCk7CisKKyAgICBGT1JHRVRfRnJhbWUoKTsKKworICAgIGZvciAoIG4gPSAwOyBuIDwgbnVtX3RhYmxlczsgbisrICkKKyAgICB7CisgICAgICBUVF9VSW50ICBjb3ZlcmFnZTsKKyAgICAgIFRUX1VJbnQgIGxlbmd0aDsKKworICAgICAgaWYgKCBBQ0NFU1NfRnJhbWUoIDZMICkgKSBnb3RvIEV4aXQ7CisKKyAgICAgIHZlcnNpb24gID0gR0VUX1VTaG9ydCgpOyAgICAgIC8qIHZlcnNpb24gICAgICAgICAgICAgICAgICovCisgICAgICBsZW5ndGggICA9IEdFVF9VU2hvcnQoKSAtIDY7ICAvKiBzdWJzdHJhY3QgaGVhZGVyIGxlbmd0aCAqLworICAgICAgY292ZXJhZ2UgPSBHRVRfVVNob3J0KCk7CisKKyAgICAgIEZPUkdFVF9GcmFtZSgpOworICAgICAgCisgICAgICBpZiAoIGNvdmVyYWdlID09IDB4MDAwMSApCisgICAgICB7CisgICAgICAgIFRUX1VJbnQgICAgICAgICAgbnVtX3BhaXJzOworICAgICAgICBUVF9LZXJuXzBfUGFpciogIHBhaXI7CisgICAgICAgIFRUX0tlcm5fMF9QYWlyKiAgbGltaXQ7CisKKyAgICAgICAgLyogZm91bmQgYSBob3Jpem9udGFsIGZvcm1hdCAwIGtlcm5pbmcgdGFibGUgISAqLworICAgICAgICBpZiAoIEFDQ0VTU19GcmFtZSg4TCkgKQorICAgICAgICAgIGdvdG8gRXhpdDsKKworICAgICAgICBudW1fcGFpcnMgPSBHRVRfVVNob3J0KCk7CisgICAgICAgIC8qIHNraXAgdGhlIHJlc3QgKi8KKworICAgICAgICBGT1JHRVRfRnJhbWUoKTsKKworICAgICAgICAvKiBhbGxvY2F0ZSBhcnJheSBvZiBrZXJuaW5nIHBhaXJzICovCisgICAgICAgIGlmICggQUxMT0NfQVJSQVkoIGZhY2UtPmtlcm5fcGFpcnMsIG51bV9wYWlycywgVFRfS2Vybl8wX1BhaXIgKSB8fAorICAgICAgICAgICAgIEFDQ0VTU19GcmFtZSggNkwgKiBudW1fcGFpcnMgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgIGdvdG8gRXhpdDsKKworICAgICAgICBwYWlyICA9IGZhY2UtPmtlcm5fcGFpcnM7CisgICAgICAgIGxpbWl0ID0gcGFpciArIG51bV9wYWlyczsKKyAgICAgICAgZm9yICggOyBwYWlyIDwgbGltaXQ7IHBhaXIrKyApCisgICAgICAgIHsKKyAgICAgICAgICBwYWlyLT5sZWZ0ICA9IEdFVF9VU2hvcnQoKTsKKyAgICAgICAgICBwYWlyLT5yaWdodCA9IEdFVF9VU2hvcnQoKTsKKyAgICAgICAgICBwYWlyLT52YWx1ZSA9IEdFVF9VU2hvcnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEZPUkdFVF9GcmFtZSgpOworCisgICAgICAgIGZhY2UtPm51bV9rZXJuX3BhaXJzICAgPSBudW1fcGFpcnM7CisgICAgICAgIGZhY2UtPmtlcm5fdGFibGVfaW5kZXggPSBuOworICAgICAgICBnb3RvIEV4aXQ7CisgICAgICB9CisgICAgICAKKyAgICAgIGlmICggRklMRV9Ta2lwKCBsZW5ndGggKSApCisgICAgICAgIGdvdG8gRXhpdDsKKyAgICB9CisKKyAgICAvKiBubyBrZXJuIHRhYmxlIGZvdW5kIC0tIGRvZXNuJ3QgbWF0dGVyICovCisgICAgZmFjZS0+a2Vybl90YWJsZV9pbmRleCA9IC0xOworICAgIGZhY2UtPm51bV9rZXJuX3BhaXJzICAgPSAwOworICAgIGZhY2UtPmtlcm5fcGFpcnMgICAgICAgPSBOVUxMOworCisgIEV4aXQ6CisgICAgcmV0dXJuIGVycm9yOworICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUVF9Mb2FkX0hkbXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBMb2FkcyB0aGUgaG9yaXpvbnRhbCBkZXZpY2UgbWV0cmljcyB0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBmYWNlICAgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgc3RyZWFtIDo6IEEgaGFuZGxlIHRvIHRoZSBpbnB1dCBzdHJlYW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVHJ1ZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBMT0NBTF9GVU5DCisgIFRUX0Vycm9yICBUVF9Mb2FkX0hkbXgoIFRUX0ZhY2UgICAgZmFjZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgc3RyZWFtICkKKyAgeworICAgIFRUX0Vycm9yICBlcnJvcjsKKyAgICBGVF9NZW1vcnkgbWVtb3J5ID0gc3RyZWFtLT5tZW1vcnk7CisKKyAgICBUVF9IZG14KiAgICAgaGRteCA9ICZmYWNlLT5oZG14OworICAgIFRUX0xvbmcgICAgICBudW1fZ2x5cGhzOworICAgIFRUX0xvbmcgICAgICByZWNvcmRfc2l6ZTsKKworICAgIGhkbXgtPnZlcnNpb24gICAgID0gMDsKKyAgICBoZG14LT5udW1fcmVjb3JkcyA9IDA7CisgICAgaGRteC0+cmVjb3JkcyAgICAgPSAwOworCisgICAgLyogdGhpcyB0YWJsZSBpcyBvcHRpb25hbCAqLworICAgIGVycm9yID0gZmFjZS0+Z290b190YWJsZSggZmFjZSwgVFRBR19oZG14LCBzdHJlYW0sIDAgKTsKKyAgICBpZiAoZXJyb3IpIHJldHVybiBUVF9FcnJfT2s7CisKKyAgICBpZiAoIEFDQ0VTU19GcmFtZSggOEwgKSApIGdvdG8gRXhpdDsKKworICAgIGhkbXgtPnZlcnNpb24gICAgID0gR0VUX1VTaG9ydCgpOworICAgIGhkbXgtPm51bV9yZWNvcmRzID0gR0VUX1Nob3J0KCk7CisgICAgcmVjb3JkX3NpemUgICAgICAgPSBHRVRfTG9uZygpOworCisgICAgRk9SR0VUX0ZyYW1lKCk7CisKKyAgICAvKiBPbmx5IHJlY29nbml6ZSBmb3JtYXQgMCAqLworICAgIGlmICggaGRteC0+dmVyc2lvbiAhPSAwICkKKyAgICAgIGdvdG8gRXhpdDsKKworICAgIGlmICggQUxMT0NfQVJSQVkoIGhkbXgtPnJlY29yZHMsIGhkbXgtPm51bV9yZWNvcmRzLCBUVF9IZG14UmVjICkgKQorICAgICAgZ290byBFeGl0OworCisgICAgbnVtX2dseXBocyAgID0gZmFjZS0+cm9vdC5udW1fZ2x5cGhzOworICAgIHJlY29yZF9zaXplIC09IG51bV9nbHlwaHMgKyAyOworCisgICAgeworICAgICAgVFRfSGRteFJlYyogIGN1ciAgID0gaGRteC0+cmVjb3JkczsKKyAgICAgIFRUX0hkbXhSZWMqICBsaW1pdCA9IGN1ciArIGhkbXgtPm51bV9yZWNvcmRzOworCisgICAgICBmb3IgKCA7IGN1ciA8IGxpbWl0OyBjdXIrKyApCisgICAgICB7CisgICAgICAgIC8qIHJlYWQgcmVjb3JkICovCisgICAgICAgIGlmICggUkVBRF9CeXRlKCBjdXItPnBwZW0gICAgICApIHx8CisgICAgICAgICAgICAgUkVBRF9CeXRlKCBjdXItPm1heF93aWR0aCApICkKKyAgICAgICAgICBnb3RvIEV4aXQ7CisgIAorICAgICAgICBpZiAoIEFMTE9DKCBjdXItPndpZHRocywgbnVtX2dseXBocyApICB8fAorICAgICAgICAgICAgIEZJTEVfUmVhZCggY3VyLT53aWR0aHMsIG51bV9nbHlwaHMgKSApCisgICAgICAgICAgZ290byBFeGl0OworICAKKyAgICAgICAgLyogc2tpcCBwYWRkaW5nIGJ5dGVzICovCisgICAgICAgIGlmICggcmVjb3JkX3NpemUgPiAwICYmIEZJTEVfU2tpcChyZWNvcmRfc2l6ZSkgKQorICAgICAgICAgICAgZ290byBFeGl0OworICAgICAgfQorICAgIH0KKworICBFeGl0OgorICAgIHJldHVybiBlcnJvcjsKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfRnJlZV9IZG14ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRnJlZXMgdGhlIGhvcml6b250YWwgZGV2aWNlIG1ldHJpY3MgdGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZmFjZSA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBMT0NBTF9GVU5DCisgIHZvaWQgIFRUX0ZyZWVfSGRteCggVFRfRmFjZSAgZmFjZSApCisgIHsKKyAgICBpZiAoIGZhY2UgKQorICAgIHsKKyAgICAgIFRUX0ludCAgICAgbjsKKyAgICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gZmFjZS0+cm9vdC5kcml2ZXItPm1lbW9yeTsKKworICAgICAgZm9yICggbiA9IDA7IG4gPCBmYWNlLT5oZG14Lm51bV9yZWNvcmRzOyBuKysgKQorICAgICAgICBGUkVFKCBmYWNlLT5oZG14LnJlY29yZHNbbl0ud2lkdGhzICk7CisKKyAgICAgIEZSRUUoIGZhY2UtPmhkbXgucmVjb3JkcyApOworICAgICAgZmFjZS0+aGRteC5udW1fcmVjb3JkcyA9IDA7CisgICAgfQorICB9CisKKworLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvc2ZudC90dGxvYWQuaCBiL3NyYy9zZm50L3R0bG9hZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5ZWEwYTcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvc2ZudC90dGxvYWQuaApAQCAtMCwwICsxLDM4MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgdHRsb2FkLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIExvYWQgdGhlIGJhc2ljIFRydWVUeXBlIHRhYmxlcywgaS5lLiwgdGFibGVzIHRoYXQgY2FuIGJlIGVpdGhlciBpbiAgICovCisvKiAgICBUVEYgb3IgT1RGIGZvbnQgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMTk5Ni0xOTk5IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQgICAgICAgICovCisvKiAgbW9kaWZpZWQgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICAqLworLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KKy8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCisvKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2lmbmRlZiBUVExPQURfSAorI2RlZmluZSBUVExPQURfSAorCisKKyNpbmNsdWRlIDxmdHN0cmVhbS5oPgorI2luY2x1ZGUgPHR0dHlwZXMuaD4KKy8qCisjaW5jbHVkZSA8dHRvYmpzLmg+CisqLworCisjaWZkZWYgX19jcGx1c3BsdXMKKyAgZXh0ZXJuICJDIiB7CisjZW5kaWYKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX0xvb2tVcF9UYWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIExvb2tzIGZvciBhIFRydWVUeXBlIHRhYmxlIGJ5IG5hbWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZhY2UgOjogQSBmYWNlIG9iamVjdCBoYW5kbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB0YWcgIDo6IFRoZSAgc2VhcmNoZWQgdGFnLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBwb2ludGVyIHRvIHRhYmxlIGRpcmVjdG9yeSBlbnRyeS4gMCBpZiBub3QgZm91bmQuLiAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEVYUE9SVF9ERUYKKyAgVFRfVGFibGUqICBUVF9Mb29rVXBfVGFibGUoIFRUX0ZhY2UgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfVUxvbmcgIHRhZyApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfR290b19UYWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgTG9va3MgZm9yIGEgVHJ1ZVR5cGUgdGFibGUgYnkgbmFtZSwgdGhlbiBzZWVrIGEgc3RyZWFtIHRvIGl0LiAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZmFjZSAgIDo6IGEgZmFjZSBvYmplY3QgaGFuZGxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHRhZyAgICA6OiB0aGUgIHNlYXJjaGVkIHRhZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzdHJlYW0gOjogdGhlIHN0cmVhbSB0byBzZWVrIHdoZW4gdGhlIHRhYmxlIGlzIGZvdW5kICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBwb2ludGVyIHRvIHRhYmxlIGRpcmVjdG9yeSBlbnRyeS4gMCBpZiBub3QgZm91bmQuLiAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEVYUE9SVF9ERUYKKyAgVFRfRXJyb3IgICBUVF9Hb3RvX1RhYmxlKCBUVF9GYWNlICAgIGZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfVUxvbmcgICB0YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfVUxvbmcgICpsZW5ndGggKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX0xvYWRfRGlyZWN0b3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIExvYWRzIHRoZSB0YWJsZSBkaXJlY3RvcnkgaW50byBhIGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZhY2UgICAgICA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzdHJlYW0gICAgOjogVGhlIGlucHV0IHN0cmVhbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZmFjZUluZGV4IDo6IFRoZSBpbmRleCBvZiB0aGUgVHJ1ZVR5cGUgZm9udCwgaWYgd2UncmUgb3BlbmluZyBhICAgICovCisgIC8qICAgICAgICAgICAgICAgICBjb2xsZWN0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRydWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoZSBzdHJlYW0gY3Vyc29yIG11c3QgYmUgYXQgdGhlIGZvbnQgZmlsZSdzIG9yaWdpbiAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgTE9DQUxfREVGCisgIFRUX0Vycm9yICBUVF9Mb2FkX0RpcmVjdG9yeSggVFRfRmFjZSAgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX0xvbmcgICAgZmFjZUluZGV4ICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUVF9Mb2FkX0FueSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBMb2FkcyBhbnkgZm9udCB0YWJsZSBpbnRvIGNsaWVudCBtZW1vcnkuICBVc2VkIGJ5IHRoZSAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfR2V0X0ZvbnRfRGF0YSgpIEFQSSBmdW5jdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZmFjZSAgIDo6IFRoZSBmYWNlIG9iamVjdCB0byBsb29rIGZvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB0YWcgICAgOjogVGhlIHRhZyBvZiB0YWJsZSB0byBsb2FkLiAgVXNlIHRoZSB2YWx1ZSAwIGlmIHlvdSAgd2FudCAgKi8KKyAgLyogICAgICAgICAgICAgIHRvIGFjY2VzcyB0aGUgd2hvbGUgZm9udCBmaWxlLCBlbHNlIHNldCB0aGlzIHBhcmFtZXRlciAgICovCisgIC8qICAgICAgICAgICAgICB0byBhIHZhbGlkIFRydWVUeXBlIHRhYmxlIHRhZyB0aGF0IHlvdSBjYW4gZm9yZ2Ugd2l0aCAgICAqLworICAvKiAgICAgICAgICAgICAgdGhlIE1BS0VfVFRfVEFHIG1hY3JvLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG9mZnNldCA6OiBUaGUgc3RhcnRpbmcgb2Zmc2V0IGluIHRoZSB0YWJsZSAob3IgdGhlIGZpbGUgaWYgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgdGFnID09IDApLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGxlbmd0aCA6OiBUaGUgYWRkcmVzcyBvZiB0aGUgZGVjaXNpb24gdmFyaWFibGU6ICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgSWYgbGVuZ3RoID09IE5VTEw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgTG9hZHMgdGhlIHdob2xlIHRhYmxlLiAgUmV0dXJucyBhbiBlcnJvciBpZiAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgIGBvZmZzZXQnID09IDAhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgIElmICpsZW5ndGggPT0gMDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgIEV4aXRzIGltbWVkaWF0ZWx5OyByZXR1cm5pbmcgdGhlIGxlbmd0aCBvZiB0aGUgZ2l2ZW4gKi8KKyAgLyogICAgICAgICAgICAgICAgICB0YWJsZSBvciBvZiB0aGUgZm9udCBmaWxlLCBkZXBlbmRpbmcgb24gdGhlIHZhbHVlIG9mICovCisgIC8qICAgICAgICAgICAgICAgICAgYHRhZycuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgSWYgKmxlbmd0aCAhPSAwOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgTG9hZHMgdGhlIG5leHQgYGxlbmd0aCcgYnl0ZXMgb2YgdGFibGUgb3IgZm9udCwgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgIHN0YXJ0aW5nIGF0IG9mZnNldCBgb2Zmc2V0JyAoaW4gdGFibGUgb3IgZm9udCB0b28pLiAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBidWZmZXIgOjogVGhlIGFkZHJlc3Mgb2YgdGFyZ2V0IGJ1ZmZlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUcnVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIExPQ0FMX0RFRgorICBUVF9FcnJvciAgVFRfTG9hZF9BbnkoIFRUX0ZhY2UgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgIFRUX1VMb25nICB0YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgVFRfTG9uZyAgIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIFRUX0xvbmcqICBsZW5ndGggKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX0xvYWRfSGVhZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIExvYWRzIHRoZSBUcnVlVHlwZSBmb250IGhlYWRlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZhY2UgICA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzdHJlYW0gOjogVGhlIGlucHV0IHN0cmVhbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUcnVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIExPQ0FMX0RFRgorICBUVF9FcnJvciAgVFRfTG9hZF9IZWFkZXIoIFRUX0ZhY2UgICAgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gIHN0cmVhbSApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfTG9hZF9NZXRyaWNzX0hlYWRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgTG9hZHMgdGhlIGhvcml6b250YWwgb3IgdmVydGljYWwgaGVhZGVyIGluIGEgZmFjZSBvYmplY3QuICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZmFjZSAgICAgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHN0cmVhbSAgIDo6IFRoZSBpbnB1dCBzdHJlYW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB2ZXJ0aWNhbCA6OiBBIGJvb2xlYW4gZmxhZy4gIElmIHNldCwgbG9hZCB2ZXJ0aWNhbCBtZXRyaWNzLiAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUcnVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIExPQ0FMX0RFRgorICBUVF9FcnJvciAgVFRfTG9hZF9NZXRyaWNzX0hlYWRlciggVFRfRmFjZSAgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9Cb29sICAgIHZlcnRpY2FsICk7CisKKworICBMT0NBTF9ERUYKKyAgVFRfRXJyb3IgIFRUX0xvYWRfQ01hcCggVFRfRmFjZSAgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gIHN0cmVhbSApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfTG9hZF9NYXhQcm9maWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgTG9hZHMgdGhlIG1heGltdW0gcHJvZmlsZSBpbnRvIGEgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZmFjZSAgIDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHN0cmVhbSA6OiBUaGUgaW5wdXQgc3RyZWFtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRydWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgTE9DQUxfREVGCisgIFRUX0Vycm9yICBUVF9Mb2FkX01heFByb2ZpbGUoIFRUX0ZhY2UgICAgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICBzdHJlYW0gKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX0xvYWRfTmFtZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIExvYWRzIHRoZSBuYW1lIHJlY29yZHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZhY2UgICA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzdHJlYW0gOjogVGhlIGlucHV0IHN0cmVhbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUcnVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIExPQ0FMX0RFRgorICBUVF9FcnJvciAgVFRfTG9hZF9OYW1lcyggVFRfRmFjZSAgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICBzdHJlYW0gKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX0xvYWRfT1MyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIExvYWRzIHRoZSBPUzIgdGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZhY2UgICA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzdHJlYW0gOjogQSBoYW5kbGUgdG8gdGhlIGlucHV0IHN0cmVhbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUcnVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIExPQ0FMX0RFRgorICBUVF9FcnJvciAgVFRfTG9hZF9PUzIoIFRUX0ZhY2UgICAgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gIHN0cmVhbSApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfTG9hZF9Qb3N0c2NyaXB0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgTG9hZHMgdGhlIFBvc3RzY3JpcHQgdGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZmFjZSAgIDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHN0cmVhbSA6OiBBIGhhbmRsZSB0byB0aGUgaW5wdXQgc3RyZWFtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRydWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgTE9DQUxfREVGCisgIFRUX0Vycm9yICBUVF9Mb2FkX1Bvc3RTY3JpcHQoIFRUX0ZhY2UgICAgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICBzdHJlYW0gKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX0xvYWRfSGRteCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIExvYWRzIHRoZSBob3Jpem9udGFsIGRldmljZSBtZXRyaWNzIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZhY2UgICA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzdHJlYW0gOjogQSBoYW5kbGUgdG8gdGhlIGlucHV0IHN0cmVhbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUcnVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIExPQ0FMX0RFRgorICBUVF9FcnJvciAgVFRfTG9hZF9IZG14KCBUVF9GYWNlICAgIGZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgc3RyZWFtICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUVF9GcmVlX05hbWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGcmVlcyB0aGUgbmFtZSByZWNvcmRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBmYWNlIDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUcnVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIExPQ0FMX0RFRgorICB2b2lkICBUVF9GcmVlX05hbWVzKCBUVF9GYWNlICBmYWNlICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUVF9GcmVlX0hkbXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGcmVlcyB0aGUgaG9yaXpvbnRhbCBkZXZpY2UgbWV0cmljcyB0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBmYWNlIDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUcnVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIExPQ0FMX0RFRgorICB2b2lkICBUVF9GcmVlX0hkbXggKCBUVF9GYWNlICBmYWNlICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUVF9Mb2FkX0tlcm4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBMb2FkcyB0aGUgZmlyc3Qga2VybmluZyB0YWJsZSB3aXRoIGZvcm1hdCAwIGluIHRoZSBmb250LiAgT25seSAgICAgKi8KKyAgLyogICAgYWNjZXB0cyB0aGUgZmlyc3QgaG9yaXpvbnRhbCBrZXJuaW5nIHRhYmxlLiAgRGV2ZWxvcGVycyBzaG91bGQgdXNlICovCisgIC8qICAgIHRoZSBgZnR4a2VybicgZXh0ZW5zaW9uIHRvIGFjY2VzcyBvdGhlciBrZXJuaW5nIHRhYmxlcyBpbiB0aGUgZm9udCAqLworICAvKiAgICBmaWxlLCBpZiB0aGV5IHJlYWxseSB3YW50IHRvLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBmYWNlICAgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgc3RyZWFtIDo6IFRoZSBpbnB1dCBzdHJlYW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVHJ1ZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBMT0NBTF9ERUYKKyAgVFRfRXJyb3IgIFRUX0xvYWRfS2VybiggVFRfRmFjZSAgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gIHN0cmVhbSApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfTG9hZF9HYXNwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgTG9hZHMgdGhlIGBHQVNQJyB0YWJsZSBpbnRvIGEgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZmFjZSAgIDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHN0cmVhbSA6OiBUaGUgaW5wdXQgc3RyZWFtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRydWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgTE9DQUxfREVGCisgIFRUX0Vycm9yICBUVF9Mb2FkX0dhc3AoIFRUX0ZhY2UgICAgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICBzdHJlYW0gKTsKKworCisjZW5kaWYgLyogVFRMT0FEX0ggKi8KKworCisvKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9zZm50L3R0cG9zdC5jIGIvc3JjL3NmbnQvdHRwb3N0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTUzMTE4ZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9zZm50L3R0cG9zdC5jCkBAIC0wLDAgKzEsNzAwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICB0dHBvc3QuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgUG9zdHNjcmlwdCBuYW1lcyB0YWJsZSBwcm9jZXNzaW5nIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDE5OTYtMTk5OSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkICAgICAgICAqLworLyogIG1vZGlmaWVkIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAgKi8KKy8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCisvKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLworLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBUaGUgcG9zdCB0YWJsZSBpcyBub3QgY29tcGxldGVseSBsb2FkZWQgYnkgdGhlIGNvcmUgZW5naW5lLiAgVGhpcyAgICAgKi8KKyAgLyogZmlsZSBsb2FkcyB0aGUgbWlzc2luZyBQUyBnbHlwaCBuYW1lcyBhbmQgaW1wbGVtZW50cyBhbiBBUEkgdG8gYWNjZXNzICovCisgIC8qIHRoZW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2luY2x1ZGUgPHR0cG9zdC5oPgorI2luY2x1ZGUgPGZ0c3RyZWFtLmg+CisjaW5jbHVkZSA8dHRlcnJvcnMuaD4KKyNpbmNsdWRlIDx0dGxvYWQuaD4KKyNpbmNsdWRlIDx0dHRhZ3MuaD4KKworICAvKiB0aGUgMjU4IGRlZmF1bHQgTWFjIFBTIGdseXBoIG5hbWVzICovCisKKyAgY29uc3QgVFRfU3RyaW5nKiAgVFRfTWFjX1Bvc3RzY3JpcHRfTmFtZXNbMjU4XSA9CisgIHsKKyAgICAvKiAgIDAgKi8KKyAgICAiLm5vdGRlZiIsCisgICAgIi5udWxsIiwKKyAgICAiQ1IiLAorICAgICJzcGFjZSIsCisgICAgImV4Y2xhbSIsCisgICAgInF1b3RlZGJsIiwKKyAgICAibnVtYmVyc2lnbiIsCisgICAgImRvbGxhciIsCisgICAgInBlcmNlbnQiLAorICAgICJhbXBlcnNhbmQiLAorCisgICAgLyogIDEwICovCisgICAgInF1b3Rlc2luZ2xlIiwKKyAgICAicGFyZW5sZWZ0IiwKKyAgICAicGFyZW5yaWdodCIsCisgICAgImFzdGVyaXNrIiwKKyAgICAicGx1cyIsCisgICAgImNvbW1hIiwKKyAgICAiaHlwaGVuIiwKKyAgICAicGVyaW9kIiwKKyAgICAic2xhc2giLAorICAgICJ6ZXJvIiwKKworICAgIC8qICAyMCAqLworICAgICJvbmUiLAorICAgICJ0d28iLAorICAgICJ0aHJlZSIsCisgICAgImZvdXIiLAorICAgICJmaXZlIiwKKyAgICAic2l4IiwKKyAgICAic2V2ZW4iLAorICAgICJlaWdodCIsCisgICAgIm5pbmUiLAorICAgICJjb2xvbiIsCisKKyAgICAvKiAgMzAgKi8KKyAgICAic2VtaWNvbG9uIiwKKyAgICAibGVzcyIsCisgICAgImVxdWFsIiwKKyAgICAiZ3JlYXRlciIsICJxdWVzdGlvbiIsCisgICAgImF0IiwKKyAgICAiQSIsCisgICAgIkIiLAorICAgICJDIiwKKyAgICAiRCIsCisKKyAgICAvKiAgNDAgKi8KKyAgICAiRSIsCisgICAgIkYiLAorICAgICJHIiwKKyAgICAiSCIsCisgICAgIkkiLAorICAgICJKIiwKKyAgICAiSyIsCisgICAgIkwiLAorICAgICJNIiwKKyAgICAiTiIsCisKKyAgICAvKiAgNTAgKi8KKyAgICAiTyIsCisgICAgIlAiLAorICAgICJRIiwKKyAgICAiUiIsCisgICAgIlMiLAorICAgICJUIiwKKyAgICAiVSIsCisgICAgIlYiLAorICAgICJXIiwKKyAgICAiWCIsCisKKyAgICAvKiAgNjAgKi8KKyAgICAiWSIsCisgICAgIloiLAorICAgICJicmFja2V0bGVmdCIsCisgICAgImJhY2tzbGFzaCIsCisgICAgImJyYWNrZXRyaWdodCIsCisgICAgImFzY2lpY2lyY3VtIiwKKyAgICAidW5kZXJzY29yZSIsCisgICAgImdyYXZlIiwKKyAgICAiYSIsCisgICAgImIiLAorCisgICAgLyogIDcwICovCisgICAgImMiLAorICAgICJkIiwKKyAgICAiZSIsCisgICAgImYiLAorICAgICJnIiwKKyAgICAiaCIsCisgICAgImkiLAorICAgICJqIiwKKyAgICAiayIsCisgICAgImwiLAorCisgICAgLyogIDgwICovCisgICAgIm0iLAorICAgICJuIiwKKyAgICAibyIsCisgICAgInAiLAorICAgICJxIiwKKyAgICAiciIsCisgICAgInMiLAorICAgICJ0IiwKKyAgICAidSIsCisgICAgInYiLAorCisgICAgLyogIDkwICovCisgICAgInciLAorICAgICJ4IiwKKyAgICAieSIsCisgICAgInoiLAorICAgICJicmFjZWxlZnQiLAorICAgICJiYXIiLAorICAgICJicmFjZXJpZ2h0IiwKKyAgICAiYXNjaWl0aWxkZSIsCisgICAgIkFkaWVyZXNpcyIsCisgICAgIkFyaW5nIiwKKworICAgIC8qIDEwMCAqLworICAgICJDY2VkaWxsYSIsCisgICAgIkVhY3V0ZSIsCisgICAgIk50aWxkZSIsCisgICAgIk9kaWVyZXNpcyIsCisgICAgIlVkaWVyZXNpcyIsCisgICAgImFhY3V0ZSIsCisgICAgImFncmF2ZSIsCisgICAgImFjaXJjdW1mbGV4IiwKKyAgICAiYWRpZXJlc2lzIiwKKyAgICAiYXRpbGRlIiwKKworICAgIC8qIDExMCAqLworICAgICJhcmluZyIsCisgICAgImNjZWRpbGxhIiwKKyAgICAiZWFjdXRlIiwKKyAgICAiZWdyYXZlIiwKKyAgICAiZWNpcmN1bWZsZXgiLAorICAgICJlZGllcmVzaXMiLAorICAgICJpYWN1dGUiLAorICAgICJpZ3JhdmUiLAorICAgICJpY2lyY3VtZmxleCIsCisgICAgImlkaWVyZXNpcyIsCisKKyAgICAvKiAxMjAgKi8KKyAgICAibnRpbGRlIiwKKyAgICAib2FjdXRlIiwKKyAgICAib2dyYXZlIiwKKyAgICAib2NpcmN1bWZsZXgiLAorICAgICJvZGllcmVzaXMiLAorICAgICJvdGlsZGUiLAorICAgICJ1YWN1dGUiLAorICAgICJ1Z3JhdmUiLAorICAgICJ1Y2lyY3VtZmxleCIsCisgICAgInVkaWVyZXNpcyIsCisKKyAgICAvKiAxMzAgKi8KKyAgICAiZGFnZ2VyIiwKKyAgICAiZGVncmVlIiwKKyAgICAiY2VudCIsCisgICAgInN0ZXJsaW5nIiwKKyAgICAic2VjdGlvbiIsCisgICAgImJ1bGxldCIsCisgICAgInBhcmFncmFwaCIsCisgICAgImdlcm1hbmRibHMiLAorICAgICJyZWdpc3RlcmVkIiwKKyAgICAiY29weXJpZ2h0IiwKKworICAgIC8qIDE0MCAqLworICAgICJ0cmFkZW1hcmsiLAorICAgICJhY3V0ZSIsCisgICAgImRpZXJlc2lzIiwKKyAgICAibm90ZXF1YWwiLAorICAgICJBRSIsCisgICAgIk9zbGFzaCIsCisgICAgImluZmluaXR5IiwKKyAgICAicGx1c21pbnVzIiwKKyAgICAibGVzc2VxdWFsIiwKKyAgICAiZ3JlYXRlcmVxdWFsIiwKKworICAgIC8qIDE1MCAqLworICAgICJ5ZW4iLAorICAgICJtdSIsCisgICAgInBhcnRpYWxkaWZmIiwKKyAgICAic3VtbWF0aW9uIiwKKyAgICAicHJvZHVjdCIsCisgICAgInBpIiwKKyAgICAiaW50ZWdyYWwiLAorICAgICJvcmRmZW1pbmluZSIsCisgICAgIm9yZG1hc2N1bGluZSIsCisgICAgIk9tZWdhIiwKKworICAgIC8qIDE2MCAqLworICAgICJhZSIsCisgICAgIm9zbGFzaCIsCisgICAgInF1ZXN0aW9uZG93biIsCisgICAgImV4Y2xhbWRvd24iLAorICAgICJsb2dpY2Fsbm90IiwKKyAgICAicmFkaWNhbCIsCisgICAgImZsb3JpbiIsCisgICAgImFwcHJveGVxdWFsIiwKKyAgICAiRGVsdGEiLAorICAgICJndWlsbGVtb3RsZWZ0IiwKKworICAgIC8qIDE3MCAqLworICAgICJndWlsbGVtb3RyaWdodCIsCisgICAgImVsbGlwc2lzIiwKKyAgICAibmJzcGFjZSIsCisgICAgIkFncmF2ZSIsCisgICAgIkF0aWxkZSIsCisgICAgIk90aWxkZSIsCisgICAgIk9FIiwKKyAgICAib2UiLAorICAgICJlbmRhc2giLAorICAgICJlbWRhc2giLAorCisgICAgLyogMTgwICovCisgICAgInF1b3RlZGJsbGVmdCIsCisgICAgInF1b3RlZGJscmlnaHQiLAorICAgICJxdW90ZWxlZnQiLAorICAgICJxdW90ZXJpZ2h0IiwKKyAgICAiZGl2aWRlIiwKKyAgICAibG96ZW5nZSIsCisgICAgInlkaWVyZXNpcyIsCisgICAgIllkaWVyZXNpcyIsCisgICAgImZyYWN0aW9uIiwKKyAgICAiY3VycmVuY3kiLAorCisgICAgLyogMTkwICovCisgICAgImd1aWxzaW5nbGxlZnQiLAorICAgICJndWlsc2luZ2xyaWdodCIsCisgICAgImZpIiwKKyAgICAiZmwiLAorICAgICJkYWdnZXJkYmwiLAorICAgICJwZXJpb2RjZW50ZXJlZCIsCisgICAgInF1b3Rlc2luZ2xiYXNlIiwKKyAgICAicXVvdGVkYmxiYXNlIiwKKyAgICAicGVydGhvdXNhbmQiLAorICAgICJBY2lyY3VtZmxleCIsCisKKyAgICAvKiAyMDAgKi8KKyAgICAiRWNpcmN1bWZsZXgiLAorICAgICJBYWN1dGUiLAorICAgICJFZGllcmVzaXMiLAorICAgICJFZ3JhdmUiLAorICAgICJJYWN1dGUiLAorICAgICJJY2lyY3VtZmxleCIsCisgICAgIklkaWVyZXNpcyIsCisgICAgIklncmF2ZSIsCisgICAgIk9hY3V0ZSIsCisgICAgIk9jaXJjdW1mbGV4IiwKKworICAgIC8qIDIxMCAqLworICAgICJhcHBsZSIsCisgICAgIk9ncmF2ZSIsCisgICAgIlVhY3V0ZSIsCisgICAgIlVjaXJjdW1mbGV4IiwKKyAgICAiVWdyYXZlIiwKKyAgICAiZG90bGVzc2kiLAorICAgICJjaXJjdW1mbGV4IiwKKyAgICAgInRpbGRlIiwKKyAgICAgIm1hY3JvbiIsCisgICAgICJicmV2ZSIsCisKKyAgICAvKiAyMjAgKi8KKyAgICAiZG90YWNjZW50IiwKKyAgICAicmluZyIsCisgICAgImNlZGlsbGEiLAorICAgICJodW5nYXJ1bWxhdXQiLAorICAgICJvZ29uZWsiLAorICAgICJjYXJvbiIsCisgICAgIkxzbGFzaCIsCisgICAgImxzbGFzaCIsCisgICAgIlNjYXJvbiIsCisgICAgInNjYXJvbiIsCisKKyAgICAvKiAyMzAgKi8KKyAgICAiWmNhcm9uIiwKKyAgICAiemNhcm9uIiwKKyAgICAiYnJva2VuYmFyIiwKKyAgICAiRXRoIiwKKyAgICAiZXRoIiwKKyAgICAiWWFjdXRlIiwKKyAgICAieWFjdXRlIiwKKyAgICAiVGhvcm4iLAorICAgICJ0aG9ybiIsCisgICAgIm1pbnVzIiwKKworICAgIC8qIDI0MCAqLworICAgICJtdWx0aXBseSIsCisgICAgIm9uZXN1cGVyaW9yIiwKKyAgICAidHdvc3VwZXJpb3IiLAorICAgICJ0aHJlZXN1cGVyaW9yIiwKKyAgICAib25laGFsZiIsCisgICAgIm9uZXF1YXJ0ZXIiLAorICAgICJ0aHJlZXF1YXJ0ZXJzIiwKKyAgICAiZnJhbmMiLAorICAgICJHYnJldmUiLAorICAgICJnYnJldmUiLAorCisgICAgLyogMjUwICovCisgICAgIklkb3QiLAorICAgICJTY2VkaWxsYSIsCisgICAgInNjZWRpbGxhIiwKKyAgICAiQ2FjdXRlIiwKKyAgICAiY2FjdXRlIiwKKyAgICAiQ2Nhcm9uIiwKKyAgICAiY2Nhcm9uIiwKKyAgICAiZG1hY3JvbiIsCisgIH07CisKKworICBzdGF0aWMKKyAgVFRfRXJyb3IgIExvYWRfRm9ybWF0XzIwKCBUVF9GYWNlICAgIGZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICBzdHJlYW0gKQorICB7CisgICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBzdHJlYW0tPm1lbW9yeTsKKyAgICBUVF9FcnJvciAgIGVycm9yOworCisgICAgVFRfSW50ICAgICBudW1fZ2x5cGhzOworICAgIFRUX0ludCAgICAgbnVtX25hbWVzOworCisgICAgVFRfVVNob3J0KiBnbHlwaF9pbmRpY2VzID0gMDsKKyAgICBUVF9DaGFyKiogIG5hbWVfc3RyaW5ncyAgPSAwOworCisKKyAgICBpZiAoIFJFQURfVVNob3J0KCBudW1fZ2x5cGhzICkgKQorICAgICAgZ290byBFeGl0OworCisgICAgLyogVU5ET0NVTUVOVEVEISAgVGhlIG51bWJlciBvZiBnbHlwaHMgaW4gdGhpcyB0YWJsZSBjYW4gYmUgc21hbGxlciAqLworICAgIC8qIHRoYW4gdGhlIHZhbHVlIGluIHRoZSBtYXhwIHRhYmxlIChjZi4gY3liZXJiaXQudHRmKS4gICAgICAgICAgICAgKi8KKworICAgIC8qIFRoZXJlIGFscmVhZHkgZXhpc3QgZm9udHMgd2hpY2ggaGF2ZSBtb3JlIHRoYW4gMzI3NjggZ2x5cGggbmFtZXMgKi8KKyAgICAvKiBpbiB0aGlzIHRhYmxlLCBzbyB0aGUgdGVzdCBmb3IgdGhpcyB0aHJlc2hvbGQgaGFzIGJlZW4gZHJvcHBlZC4gICovCisKKyAgICBpZiAoIG51bV9nbHlwaHMgPiBmYWNlLT5yb290Lm51bV9nbHlwaHMgKQorICAgIHsKKyAgICAgIGVycm9yID0gVFRfRXJyX0ludmFsaWRfRmlsZV9Gb3JtYXQ7CisgICAgICBnb3RvIEV4aXQ7CisgICAgfQorCisgICAgLyogbG9hZCB0aGUgaW5kaWNlcyAqLworICAgIHsKKyAgICAgIFRUX0ludCAgbjsKKworICAgICAgaWYgKCBBTExPQ19BUlJBWSAoIGdseXBoX2luZGljZXMsIG51bV9nbHlwaHMsIFRUX1VTaG9ydCApIHx8CisgICAgICAgICAgIEFDQ0VTU19GcmFtZSggbnVtX2dseXBocyAqIDJMICkgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICBnb3RvIEZhaWw7CisKKyAgICAgIGZvciAoIG4gPSAwOyBuIDwgbnVtX2dseXBoczsgbisrICkKKyAgICAgICAgZ2x5cGhfaW5kaWNlc1tuXSA9IEdFVF9VU2hvcnQoKTsKKworICAgICAgRk9SR0VUX0ZyYW1lKCk7CisgICAgfQorCisgICAgLyogY29tcHV0ZSBudW1iZXIgb2YgbmFtZXMgc3RvcmVkIGluIHRhYmxlICovCisgICAgeworICAgICAgVFRfSW50ICBuOworCisgICAgICBudW1fbmFtZXMgPSAwOworCisgICAgICBmb3IgKCBuID0gMDsgbiA8IG51bV9nbHlwaHM7IG4rKyApCisgICAgICB7CisgICAgICAgIFRUX0ludCAgaW5kZXg7CisKKyAgICAgICAgaW5kZXggPSBnbHlwaF9pbmRpY2VzW25dOworICAgICAgICBpZiAoIGluZGV4ID49IDI1OCApCisgICAgICAgIHsKKyAgICAgICAgICBpbmRleCAtPSAyNTc7CisgICAgICAgICAgaWYgKCBpbmRleCA+IG51bV9uYW1lcyApCisgICAgICAgICAgICBudW1fbmFtZXMgPSBpbmRleDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIC8qIG5vdyBsb2FkIHRoZSBuYW1lIHN0cmluZ3MgKi8KKyAgICB7CisgICAgICBUVF9JbnQgIG47CisKKyAgICAgIGlmICggQUxMT0NfQVJSQVkoIG5hbWVfc3RyaW5ncywgbnVtX25hbWVzLCBUVF9DaGFyKiApICkKKyAgICAgICAgZ290byBGYWlsOworCisgICAgICBmb3IgKCBuID0gMDsgbiA8IG51bV9uYW1lczsgbisrICkKKyAgICAgIHsKKyAgICAgICAgVFRfVUludCAgbGVuOworCisgICAgICAgIGlmICggUkVBRF9CeXRlICAoIGxlbiApICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fAorICAgICAgICAgICAgIEFMTE9DX0FSUkFZKCBuYW1lX3N0cmluZ3Nbbl0sIGxlbisxLCBUVF9DaGFyICkgfHwKKyAgICAgICAgICAgICBGSUxFX1JlYWQgICggbmFtZV9zdHJpbmdzW25dLCBsZW4gKSAgICAgICAgICAgICkKKyAgICAgICAgICBnb3RvIEZhaWwxOworCisgICAgICAgIG5hbWVfc3RyaW5nc1tuXVtsZW5dID0gJ1wwJzsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBhbGwgcmlnaHQsIHNldCB0YWJsZSBmaWVsZHMgYW5kIGV4aXQgc3VjY2Vzc2Z1bHkgKi8KKyAgICB7CisgICAgICBUVF9Qb3N0XzIwKiAgdGFibGUgPSAmZmFjZS0+cG9zdHNjcmlwdF9uYW1lcy5uYW1lcy5mb3JtYXRfMjA7CisKKyAgICAgIHRhYmxlLT5udW1fZ2x5cGhzICAgID0gbnVtX2dseXBoczsKKyAgICAgIHRhYmxlLT5udW1fbmFtZXMgICAgID0gbnVtX25hbWVzOworICAgICAgdGFibGUtPmdseXBoX2luZGljZXMgPSBnbHlwaF9pbmRpY2VzOworICAgICAgdGFibGUtPmdseXBoX25hbWVzICAgPSBuYW1lX3N0cmluZ3M7CisgICAgfQorICAgIHJldHVybiBUVF9FcnJfT2s7CisKKworICBGYWlsMToKKyAgICB7CisgICAgICBUVF9JbnQgIG47CisKKyAgICAgIGZvciAoIG4gPSAwOyBuIDwgbnVtX25hbWVzOyBuKysgKQorICAgICAgICBGUkVFKCBuYW1lX3N0cmluZ3Nbbl0gKTsKKyAgICB9CisKKyAgRmFpbDoKKyAgICBGUkVFKCBuYW1lX3N0cmluZ3MgKTsKKyAgICBGUkVFKCBnbHlwaF9pbmRpY2VzICk7CisKKyAgRXhpdDoKKyAgICByZXR1cm4gZXJyb3I7CisgIH0KKworCisgIHN0YXRpYworICBUVF9FcnJvciAgTG9hZF9Gb3JtYXRfMjUoIFRUX0ZhY2UgICAgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gIHN0cmVhbSApCisgIHsKKyAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IHN0cmVhbS0+bWVtb3J5OworICAgIFRUX0Vycm9yICAgZXJyb3I7CisKKyAgICBUVF9JbnQgICAgIG51bV9nbHlwaHM7CisgICAgVFRfQ2hhciogICBvZmZzZXRfdGFibGUgPSAwOworCisKKyAgICAvKiBVTkRPQ1VNRU5URUQhICBUaGlzIHZhbHVlIGFwcGVhcnMgb25seSBpbiB0aGUgQXBwbGUgVFQgc3BlY3MuICovCisgICAgaWYgKCBSRUFEX1VTaG9ydCggbnVtX2dseXBocyApICkKKyAgICAgIGdvdG8gRXhpdDsKKworICAgIC8qIGNoZWNrIHRoZSBudW1iZXIgb2YgZ2x5cGhzICovCisgICAgaWYgKCBudW1fZ2x5cGhzID4gZmFjZS0+cm9vdC5udW1fZ2x5cGhzIHx8IG51bV9nbHlwaHMgPiAyNTggKQorICAgIHsKKyAgICAgIGVycm9yID0gVFRfRXJyX0ludmFsaWRfRmlsZV9Gb3JtYXQ7CisgICAgICBnb3RvIEV4aXQ7CisgICAgfQorCisgICAgaWYgKCBBTExPQyAgICAoIG9mZnNldF90YWJsZSwgbnVtX2dseXBocyApIHx8CisgICAgICAgICBGSUxFX1JlYWQoIG9mZnNldF90YWJsZSwgbnVtX2dseXBocyApICkKKyAgICAgIGdvdG8gRmFpbDsKKworICAgIC8qIG5vdyBjaGVjayB0aGUgb2Zmc2V0IHRhYmxlICovCisgICAgeworICAgICAgVFRfSW50ICBuOworCisKKyAgICAgIGZvciAoIG4gPSAwOyBuIDwgbnVtX2dseXBoczsgbisrICkKKyAgICAgIHsKKyAgICAgICAgVFRfTG9uZyAgaW5kZXggPSAoVFRfTG9uZyluICsgb2Zmc2V0X3RhYmxlW25dOworCisKKyAgICAgICAgaWYgKCBpbmRleCA8IDAgfHwgaW5kZXggPiBudW1fZ2x5cGhzICkKKyAgICAgICAgeworICAgICAgICAgIGVycm9yID0gVFRfRXJyX0ludmFsaWRfRmlsZV9Gb3JtYXQ7CisgICAgICAgICAgZ290byBGYWlsOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgLyogT0ssIHNldCB0YWJsZSBmaWVsZHMgYW5kIGV4aXQgc3VjY2Vzc2Z1bHkgKi8KKyAgICB7CisgICAgICBUVF9Qb3N0XzI1KiAgdGFibGUgPSAmZmFjZS0+cG9zdHNjcmlwdF9uYW1lcy5uYW1lcy5mb3JtYXRfMjU7CisKKworICAgICAgdGFibGUtPm51bV9nbHlwaHMgPSBudW1fZ2x5cGhzOworICAgICAgdGFibGUtPm9mZnNldHMgICAgPSBvZmZzZXRfdGFibGU7CisgICAgfQorCisgICAgcmV0dXJuIFRUX0Vycl9PazsKKworICBGYWlsOgorICAgIEZSRUUoIG9mZnNldF90YWJsZSApOworCisgIEV4aXQ6CisgICAgcmV0dXJuIGVycm9yOworICB9CisKKworICBzdGF0aWMKKyAgVFRfRXJyb3IgIExvYWRfUG9zdF9OYW1lcyggVFRfRmFjZSAgZmFjZSApCisgIHsKKyAgICBGVF9TdHJlYW0gICBzdHJlYW07CisgICAgVFRfRXJyb3IgICAgZXJyb3I7CisKKyAgICAvKiBnZXQgYSBzdHJlYW0gZm9yIHRoZSBmYWNlJ3MgcmVzb3VyY2UgKi8KKyAgICBzdHJlYW0gPSBmYWNlLT5yb290LnN0cmVhbTsKKworICAgIC8qIHNlZWsgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgUFMgbmFtZXMgdGFibGUgKi8KKyAgICBlcnJvciA9IGZhY2UtPmdvdG9fdGFibGUoIGZhY2UsIFRUQUdfcG9zdCwgc3RyZWFtLCAwICk7CisgICAgaWYgKGVycm9yKSBnb3RvIEV4aXQ7CisKKyAgICAvKiBub3cgcmVhZCBwb3N0c2NyaXB0IHRhYmxlICovCisgICAgc3dpdGNoICggZmFjZS0+cG9zdHNjcmlwdC5Gb3JtYXRUeXBlICkKKyAgICB7CisgICAgY2FzZSAweDAwMDIwMDAwOgorICAgICAgZXJyb3IgPSBMb2FkX0Zvcm1hdF8yMCggZmFjZSwgc3RyZWFtICk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgMHgwMDAyODAwMDoKKyAgICAgIGVycm9yID0gTG9hZF9Gb3JtYXRfMjUoIGZhY2UsIHN0cmVhbSApOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgZXJyb3IgPSBUVF9FcnJfSW52YWxpZF9GaWxlX0Zvcm1hdDsKKyAgICB9CisKKyAgICBmYWNlLT5wb3N0c2NyaXB0X25hbWVzLmxvYWRlZCA9IDE7CisKKyAgRXhpdDoKKyAgICByZXR1cm4gZXJyb3I7CisgIH0KKworCisgIExPQ0FMX0ZVTkMKKyAgdm9pZCAgVFRfRnJlZV9Qb3N0X05hbWVzKCBUVF9GYWNlICBmYWNlICkKKyAgeworICAgIEZUX01lbW9yeSAgICAgICBtZW1vcnkgPSBmYWNlLT5yb290Lm1lbW9yeTsKKyAgICBUVF9Qb3N0X05hbWVzKiAgbmFtZXMgID0gJmZhY2UtPnBvc3RzY3JpcHRfbmFtZXM7CisKKworICAgIGlmICggbmFtZXMtPmxvYWRlZCApCisgICAgeworICAgICAgc3dpdGNoICggZmFjZS0+cG9zdHNjcmlwdC5Gb3JtYXRUeXBlICkKKyAgICAgIHsKKyAgICAgIGNhc2UgMHgwMDAyMDAwMDoKKyAgICAgICAgeworICAgICAgICAgIFRUX1Bvc3RfMjAqICB0YWJsZSA9ICZuYW1lcy0+bmFtZXMuZm9ybWF0XzIwOworICAgICAgICAgIFRUX1VJbnQgICAgICBuOworCisKKyAgICAgICAgICBGUkVFKCB0YWJsZS0+Z2x5cGhfaW5kaWNlcyApOworICAgICAgICAgIHRhYmxlLT5udW1fZ2x5cGhzID0gMDsKKworICAgICAgICAgIGZvciAoIG4gPSAwOyBuIDwgdGFibGUtPm51bV9uYW1lczsgbisrICkKKyAgICAgICAgICAgIEZSRUUoIHRhYmxlLT5nbHlwaF9uYW1lc1tuXSApOworCisgICAgICAgICAgRlJFRSggdGFibGUtPmdseXBoX25hbWVzICk7CisgICAgICAgICAgdGFibGUtPm51bV9uYW1lcyA9IDA7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgMHgwMDAyODAwMDoKKyAgICAgICAgeworICAgICAgICAgIFRUX1Bvc3RfMjUqICB0YWJsZSA9ICZuYW1lcy0+bmFtZXMuZm9ybWF0XzI1OworCisKKyAgICAgICAgICBGUkVFKCB0YWJsZS0+b2Zmc2V0cyApOworICAgICAgICAgIHRhYmxlLT5udW1fZ2x5cGhzID0gMDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgbmFtZXMtPmxvYWRlZCA9IDA7CisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX0dldF9QU19OYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEdldHMgdGhlIFBvc3RTY3JpcHQgZ2x5cGggbmFtZSBvZiBhIGdseXBoLiAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGluZGV4ICA6OiBUaGUgZ2x5cGggaW5kZXguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgUFNuYW1lIDo6IFRoZSBhZGRyZXNzIG9mIGEgc3RyaW5nIHBvaW50ZXIuICBXaWxsIGJlIE5VTEwgaW4gY2FzZSAgICovCisgIC8qICAgICAgICAgICAgICBvZiBlcnJvciwgb3RoZXJ3aXNlIGl0IGlzIGEgcG9pbnRlciB0byB0aGUgZ2x5cGggbmFtZS4gICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgIFlvdSBtdXN0IG5vdCBtb2RpZnkgdGhlIHJldHVybmVkIHN0cmluZyEgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVHJ1ZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBFWFBPUlRfRlVOQworICBUVF9FcnJvciAgVFRfR2V0X1BTX05hbWUoIFRUX0ZhY2UgICAgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX1VJbnQgICAgICBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9TdHJpbmcqKiAgUFNuYW1lICkKKyAgeworICAgIFRUX0Vycm9yICAgICAgICBlcnJvcjsKKyAgICBUVF9Qb3N0X05hbWVzKiAgbmFtZXM7CisKKyAgICBpZiAoICFmYWNlICkKKyAgICAgIHJldHVybiBUVF9FcnJfSW52YWxpZF9GYWNlX0hhbmRsZTsKKworICAgIGlmICggaW5kZXggPj0gKFRUX1VJbnQpZmFjZS0+cm9vdC5udW1fZ2x5cGhzICkKKyAgICAgIHJldHVybiBUVF9FcnJfSW52YWxpZF9HbHlwaF9JbmRleDsKKworICAgIG5hbWVzICAgPSAmZmFjZS0+cG9zdHNjcmlwdF9uYW1lczsKKworICAgIC8qIGAubm90ZGVmJyBieSBkZWZhdWx0ICovCisgICAgKlBTbmFtZSA9IChUVF9TdHJpbmcqKVRUX01hY19Qb3N0c2NyaXB0X05hbWVzWzBdOworCisgICAgc3dpdGNoICggZmFjZS0+cG9zdHNjcmlwdC5Gb3JtYXRUeXBlICkKKyAgICB7CisgICAgY2FzZSAweDAwMDEwMDAwOgorICAgICAgaWYgKCBpbmRleCA8IDI1OCApICAgICAgICAgICAgICAgICAgICAvKiBwYXJhbm9pZCBjaGVja2luZyAqLworICAgICAgICAqUFNuYW1lID0gKFRUX1N0cmluZyopVFRfTWFjX1Bvc3RzY3JpcHRfTmFtZXNbaW5kZXhdOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIDB4MDAwMjAwMDA6CisgICAgICB7CisgICAgICAgIFRUX1Bvc3RfMjAqICB0YWJsZSA9ICZuYW1lcy0+bmFtZXMuZm9ybWF0XzIwOworCisKKyAgICAgICAgaWYgKCAhbmFtZXMtPmxvYWRlZCApCisgICAgICAgIHsKKyAgICAgICAgICBlcnJvciA9IExvYWRfUG9zdF9OYW1lcyggZmFjZSApOworICAgICAgICAgIGlmICggZXJyb3IgKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIGluZGV4IDwgdGFibGUtPm51bV9nbHlwaHMgKQorICAgICAgICB7CisgICAgICAgICAgVFRfVVNob3J0ICBuYW1lX2luZGV4ID0gdGFibGUtPmdseXBoX2luZGljZXNbaW5kZXhdOworCisKKyAgICAgICAgICBpZiAoIG5hbWVfaW5kZXggPCAyNTggKQorICAgICAgICAgICAgKlBTbmFtZSA9IChUVF9TdHJpbmcqKVRUX01hY19Qb3N0c2NyaXB0X05hbWVzW25hbWVfaW5kZXhdOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICpQU25hbWUgPSAoVFRfU3RyaW5nKil0YWJsZS0+Z2x5cGhfbmFtZXNbbmFtZV9pbmRleCAtIDI1OF07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAweDAwMDI4MDAwOgorICAgICAgeworICAgICAgICBUVF9Qb3N0XzI1KiAgdGFibGUgPSAmbmFtZXMtPm5hbWVzLmZvcm1hdF8yNTsKKworCisgICAgICAgIGlmICggIW5hbWVzLT5sb2FkZWQgKQorICAgICAgICB7CisgICAgICAgICAgZXJyb3IgPSBMb2FkX1Bvc3RfTmFtZXMoIGZhY2UgKTsKKyAgICAgICAgICBpZiAoIGVycm9yICkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCBpbmRleCA8IHRhYmxlLT5udW1fZ2x5cGhzICkgICAgLyogcGFyYW5vaWQgY2hlY2tpbmcgKi8KKyAgICAgICAgeworICAgICAgICAgIGluZGV4ICArPSB0YWJsZS0+b2Zmc2V0c1tpbmRleF07CisgICAgICAgICAgKlBTbmFtZSA9IChUVF9TdHJpbmcqKVRUX01hY19Qb3N0c2NyaXB0X05hbWVzW2luZGV4XTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIDB4MDAwMzAwMDA6CisgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vdGhpbmcgdG8gZG8gKi8KKyAgICB9CisKKyAgICByZXR1cm4gVFRfRXJyX09rOworICB9CisKKworLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvc2ZudC90dHBvc3QuaCBiL3NyYy9zZm50L3R0cG9zdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlYjBiZjEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvc2ZudC90dHBvc3QuaApAQCAtMCwwICsxLDg3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICB0dHBvc3QuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgUG9zdGNyaXB0IG5hbWUgdGFibGUgcHJvY2Vzc2luZyBmb3IgVHJ1ZVR5cGUgYW5kIE9wZW5UeXBlIGZvbnRzICAgICAgKi8KKy8qICAgIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAxOTk2LTE5OTkgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCAgICAgICAgKi8KKy8qICBtb2RpZmllZCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgICovCisvKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLworLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KKy8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogVGhlIHBvc3QgdGFibGUgaXMgbm90IGNvbXBsZXRlbHkgbG9hZGVkIGJ5IHRoZSBjb3JlIGVuZ2luZS4gIFRoaXMgICAgICovCisgIC8qIGZpbGUgbG9hZHMgdGhlIG1pc3NpbmcgUFMgZ2x5cGggbmFtZXMgYW5kIGltcGxlbWVudHMgYW4gQVBJIHRvIGFjY2VzcyAqLworICAvKiB0aGVtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNpZm5kZWYgVFRQT1NUX0gKKyNkZWZpbmUgVFRQT1NUX0gKKworI2luY2x1ZGUgPGZ0Y29uZmlnLmg+CisjaW5jbHVkZSA8dHR0eXBlcy5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKworI2RlZmluZSBUVF9FcnJfSW52YWxpZF9Qb3N0X1RhYmxlX0Zvcm1hdCAgMHgwQjAwCisjZGVmaW5lIFRUX0Vycl9JbnZhbGlkX1Bvc3RfVGFibGUgICAgICAgICAweDBCMDEKKworI2lmIDAKKyAgLyogdGhlIDI1OCBzdGFuZGFyZCBNYWMgZ2x5cGggbmFtZXMsIHVzZWQgZm9yIGZvcm1hdCAxLjAgYW5kIDIuNSAqLworICBMT0NBTF9ERUYKKyAgY29uc3QgVFRfU3RyaW5nKiAgVFRfTWFjX1Bvc3RzY3JpcHRfTmFtZXNbXTsKKyNlbmRpZgorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfR2V0X1BTX05hbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgR2V0cyB0aGUgUG9zdFNjcmlwdCBnbHlwaCBuYW1lIG9mIGEgZ2x5cGguICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgaW5kZXggIDo6IFRoZSBnbHlwaCBpbmRleC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBQU25hbWUgOjogVGhlIGFkZHJlc3Mgb2YgYSBzdHJpbmcgcG9pbnRlci4gIFdpbGwgYmUgTlVMTCBpbiBjYXNlICAgKi8KKyAgLyogICAgICAgICAgICAgIG9mIGVycm9yLCBvdGhlcndpc2UgaXQgaXMgYSBwb2ludGVyIHRvIHRoZSBnbHlwaCBuYW1lLiAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgWW91IG11c3Qgbm90IG1vZGlmeSB0aGUgcmV0dXJuZWQgc3RyaW5nISAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUcnVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEVYUE9SVF9ERUYKKyAgVFRfRXJyb3IgVFRfR2V0X1BTX05hbWUoIFRUX0ZhY2UgICAgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfVUludCAgICAgIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfU3RyaW5nKiogIFBTbmFtZSApOworCisKKyAgTE9DQUxfREVGCisgIHZvaWQgIFRUX0ZyZWVfUG9zdF9OYW1lcyggVFRfRmFjZSAgZmFjZSApOworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKworI2VuZGlmIC8qIFRUUE9TVF9IICovCisKKworLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvc2ZudC90dHNiaXQuYyBiL3NyYy9zZm50L3R0c2JpdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3MDIwYmIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvc2ZudC90dHNiaXQuYwpAQCAtMCwwICsxLDE0MzcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHR0c2JpdC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBUcnVlVHlwZSBhbmQgT3BlblR5cGUgZW1iZWRkZWQgYml0bWFwIHN1cHBvcnQgKGJvZHkpLiAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMTk5Ni0xOTk5IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQgICAgICAgICovCisvKiAgbW9kaWZpZWQgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICAqLworLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KKy8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCisvKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgV0FSTklORzogVGhpcyBmaWxlIHNob3VsZCBub3QgYmUgY29tcGlsZWQgZGlyZWN0bHksIGl0IGlzIG1lYW50IHRvIGJlICAqLworLyogICAgICAgICAgIGluY2x1ZGVkIGluIHRoZSBzb3VyY2Ugb2Ygc2V2ZXJhbCBmb250IGRyaXZlcnMgKGkuZS4sIHRoZSBUVEYgKi8KKy8qICAgICAgICAgICBhbmQgT1RGIGRyaXZlcnMpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjaW5jbHVkZSA8ZnRkZWJ1Zy5oPgorCisjaW5jbHVkZSA8dHRzYml0Lmg+CisjaW5jbHVkZSA8dHR0YWdzLmg+CisjaW5jbHVkZSA8dHRlcnJvcnMuaD4KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGJsaXRfc2JpdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEJsaXRzIGEgYml0bWFwIGZyb20gYW4gaW5wdXQgc3RyZWFtIGludG8gYSBnaXZlbiB0YXJnZXQuICBTdXBwb3J0cyAqLworICAvKiAgICB4IGFuZCB5IG9mZnNldHMgYXMgd2VsbCBhcyBieXRlIHBhZGRlZCBsaW5lcy4gICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB0YXJnZXQgICAgICA6OiBUaGUgdGFyZ2V0IGJpdG1hcC9waXhtYXAuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHNvdXJjZSAgICAgIDo6IFRoZSBpbnB1dCBwYWNrZWQgYml0bWFwIGRhdGEuICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbGluZV9iaXRzICAgOjogVGhlIG51bWJlciBvZiBiaXRzIHBlciBsaW5lLiAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBieXRlX3BhZGRlZCA6OiBBIGZsYWcgd2hpY2ggaXMgdHJ1ZSBpZiBsaW5lcyBhcmUgYnl0ZS1wYWRkZWQuICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHhfb2Zmc2V0ICAgIDo6IFRoZSBob3Jpem9udGFsIG9mZnNldC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgeV9vZmZzZXQgICAgOjogVGhlIHZlcnRpY2FsIG9mZnNldC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgSU1QT1JUQU5UOiBUaGUgeCBhbmQgeSBvZmZzZXRzIGFyZSByZWxhdGl2ZSB0byB0aGUgdG9wIGNvcm5lciBvZiAgICovCisgIC8qICAgICAgICAgICAgICAgdGhlIHRhcmdldCBiaXRtYXAgKHVubGlrZSB0aGUgbm9ybWFsIFRydWVUeXBlICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgIGNvbnZlbnRpb24pLiAgQSBwb3NpdGl2ZSB5IG9mZnNldCBpbmRpY2F0ZXMgYSBkb3dud2FyZHMgKi8KKyAgLyogICAgICAgICAgICAgICBkaXJlY3Rpb24hICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBzdGF0aWMKKyAgdm9pZCAgYmxpdF9zYml0KCBGVF9CaXRtYXAqICB0YXJnZXQsCisgICAgICAgICAgICAgICAgICAgY2hhciogICAgICAgc291cmNlLAorICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgIGxpbmVfYml0cywKKyAgICAgICAgICAgICAgICAgICBGVF9Cb29sICAgICBieXRlX3BhZGRlZCwKKyAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICB4X29mZnNldCwKKyAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICB5X29mZnNldCApCisgIHsKKyAgICBGVF9CeXRlKiAgIGxpbmVfYnVmZjsKKyAgICBGVF9JbnQgICAgIGxpbmVfaW5jcjsKKyAgICBGVF9JbnQgICAgIGhlaWdodDsKKworICAgIEZUX1VTaG9ydCAgYWNjOworICAgIEZUX0J5dGUgICAgbG9hZGVkOworCisKKyAgICAvKiBmaXJzdCBvZiBhbGwsIGNvbXB1dGUgc3RhcnRpbmcgd3JpdGUgcG9zaXRpb24gKi8KKyAgICBsaW5lX2luY3IgPSB0YXJnZXQtPnBpdGNoOworICAgIGxpbmVfYnVmZiA9IHRhcmdldC0+YnVmZmVyOworICAgIAorICAgIGlmIChsaW5lX2luY3IgPCAwKQorICAgICAgbGluZV9idWZmIC09IGxpbmVfaW5jcioodGFyZ2V0LT5yb3dzLTEpOworCisgICAgbGluZV9idWZmICs9ICh4X29mZnNldCA+PiAzKSArIHlfb2Zmc2V0ICogbGluZV9pbmNyOworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiBXZSB1c2UgdGhlIGV4dHJhLWNsYXNzaWMgYGFjY3VtdWxhdG9yJyB0cmljayB0byBleHRyYWN0IHRoZSBiaXRzICAgICovCisgICAgLyogZnJvbSB0aGUgc291cmNlIGJ5dGUgc3RyZWFtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiBOYW1lbHksIHRoZSB2YXJpYWJsZSBgYWNjJyBpcyBhIDE2LWJpdCBhY2N1bXVsYXRvciBjb250YWluaW5nIHRoZSAgICovCisgICAgLyogbGFzdCBgbG9hZGVkJyBiaXRzIGZyb20gdGhlIGlucHV0IHN0cmVhbS4gIFRoZSBiaXRzIGFyZSBzaGlmdGVkIHRvICAqLworICAgIC8qIHRoZSB1cG1vc3QgcG9zaXRpb24gaW4gYGFjYycuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgYWNjICAgID0gMDsgIC8qIGNsZWFyIGFjY3VtdWxhdG9yICAgKi8KKyAgICBsb2FkZWQgPSAwOyAgLyogbm8gYml0cyB3ZXJlIGxvYWRlZCAqLworCisgICAgZm9yICggaGVpZ2h0ID0gdGFyZ2V0LT5yb3dzOyBoZWlnaHQgPiAwOyBoZWlnaHQtLSApCisgICAgeworICAgICAgRlRfQnl0ZSogIGN1ciAgID0gbGluZV9idWZmOyAgICAvKiBjdXJyZW50IHdyaXRlIGN1cnNvciAgICAgICAgICAqLworICAgICAgRlRfSW50ICAgIGNvdW50ID0gbGluZV9iaXRzOyAgICAvKiAjIG9mIGJpdHMgdG8gZXh0cmFjdCBwZXIgbGluZSAqLworICAgICAgRlRfQnl0ZSAgIHNoaWZ0ID0geF9vZmZzZXQgJiA3OyAvKiBjdXJyZW50IHdyaXRlIHNoaWZ0ICAgICAgICAgICAqLworICAgICAgRlRfQnl0ZSAgIHNwYWNlID0gOCAtIHNoaWZ0OworCisKKyAgICAgIC8qIGZpcnN0IG9mIGFsbCwgcmVhZCBpbmRpdmlkdWFsIHNvdXJjZSBieXRlcyAqLworICAgICAgaWYgKCBjb3VudCA+PSA4ICkKKyAgICAgIHsKKyAgICAgICAgY291bnQgLT0gODsKKyAgICAgICAgeworICAgICAgICAgIGRvCisgICAgICAgICAgeworICAgICAgICAgICAgRlRfQnl0ZSAgdmFsOworCisgICAgICAgICAgICAvKiBlbnN1cmUgdGhhdCB0aGVyZSBhcmUgYXQgbGVhc3QgOCBiaXRzIGluIHRoZSBhY2N1bXVsYXRvciAqLworICAgICAgICAgICAgaWYgKCBsb2FkZWQgPCA4ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgYWNjICAgIHw9ICgoRlRfVVNob3J0KSpzb3VyY2UrKykgPDwgKDggLSBsb2FkZWQpOworICAgICAgICAgICAgICBsb2FkZWQgKz0gODsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogbm93IHdyaXRlIG9uZSBieXRlICovCisgICAgICAgICAgICB2YWwgICAgID0gKEZUX0J5dGUpKGFjYyA+PiA4KTsKKyAgICAgICAgICAgIGlmIChzaGlmdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgY3VyWzBdIHw9IHZhbCA+PiBzaGlmdDsKKyAgICAgICAgICAgICAgY3VyWzFdIHw9IHZhbCA8PCBzcGFjZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgY3VyWzBdID0gdmFsOworCisgICAgICAgICAgICBjdXIrKzsKKyAgICAgICAgICAgIGFjYyAgIDw8PSA4OyAgLyogcmVtb3ZlIGJpdHMgZnJvbSBhY2N1bXVsYXRvciAqLworICAgICAgICAgICAgbG9hZGVkIC09IDg7CisgICAgICAgICAgICBjb3VudCAgLT0gODsKKyAgICAgICAgICB9CisgICAgICAgICAgd2hpbGUgKCBjb3VudCA+PSAwICk7CisgICAgICAgIH0KKworICAgICAgICAvKiByZXN0b3JlIGBjb3VudCcgdG8gY29ycmVjdCB2YWx1ZSAqLworICAgICAgICBjb3VudCArPSA4OworICAgICAgfQorCisgICAgICAvKiBub3cgd3JpdGUgcmVtYWluaW5nIGJpdHMgKGNvdW50IDwgOCkgKi8KKyAgICAgIGlmICggY291bnQgPiAwICkKKyAgICAgIHsKKyAgICAgICAgRlRfQnl0ZSAgdmFsOworCisKKyAgICAgICAgLyogZW5zdXJlIHRoYXQgdGhlcmUgYXJlIGF0IGxlYXN0IGBjb3VudCcgYml0cyBpbiB0aGUgYWNjdW11bGF0b3IgKi8KKyAgICAgICAgaWYgKCBsb2FkZWQgPCBjb3VudCApCisgICAgICAgIHsKKyAgICAgICAgICBhY2MgICAgfD0gKChGVF9VU2hvcnQpKnNvdXJjZSsrKSA8PCAoOCAtIGxvYWRlZCk7CisgICAgICAgICAgbG9hZGVkICs9IDg7CisgICAgICAgIH0KKworICAgICAgICAvKiBub3cgd3JpdGUgcmVtYWluaW5nIGJpdHMgKi8KKyAgICAgICAgdmFsICAgICA9ICgoRlRfQnl0ZSkoYWNjID4+IDgpKSAmIH4oMHhGRiA+PiBjb3VudCk7CisgICAgICAgIGN1clswXSB8PSB2YWwgPj4gc2hpZnQ7CisKKyAgICAgICAgaWYgKCBjb3VudCA+IHNwYWNlICkKKyAgICAgICAgICBjdXJbMV0gfD0gdmFsIDw8IHNwYWNlOworCisgICAgICAgIGFjYyAgIDw8PSBjb3VudDsKKyAgICAgICAgbG9hZGVkIC09IGNvdW50OworICAgICAgfQorCisgICAgICAvKiBub3csIHNraXAgdG8gbmV4dCBsaW5lICovCisgICAgICBpZiAoIGJ5dGVfcGFkZGVkICkKKyAgICAgICAgYWNjID0gbG9hZGVkID0gMDsgICAvKiBjbGVhciBhY2N1bXVsYXRvciBvbiBieXRlLXBhZGRlZCBsaW5lcyAqLworCisgICAgICBsaW5lX2J1ZmYgKz0gbGluZV9pbmNyOworICAgIH0KKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfTG9hZF9TbWFsbF9TQml0X01ldHJpY3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgTG9hZHMgYSBzbWFsbCBiaXRtYXAgbWV0cmljcyByZWNvcmQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgc3RyZWFtICA6OiBUaGUgaW5wdXQgc3RyZWFtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbWV0cmljcyA6OiBBIHNtYWxsIG1ldHJpY3Mgc3RydWN0dXJlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBzdGF0aWMKKyAgdm9pZCAgVFRfTG9hZF9TbWFsbF9TQml0X01ldHJpY3MoIFRUX1NCaXRfU21hbGxfTWV0cmljcyogIG1ldHJpY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gICAgICAgICAgICAgICBzdHJlYW0gKQorICB7CisgICAgbWV0cmljcy0+aGVpZ2h0ICAgPSBHRVRfQnl0ZSgpOworICAgIG1ldHJpY3MtPndpZHRoICAgID0gR0VUX0J5dGUoKTsKKyAgICBtZXRyaWNzLT5iZWFyaW5nWCA9IEdFVF9DaGFyKCk7CisgICAgbWV0cmljcy0+YmVhcmluZ1kgPSBHRVRfQ2hhcigpOworICAgIG1ldHJpY3MtPmFkdmFuY2UgID0gR0VUX0J5dGUoKTsKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfTG9hZF9TQml0X01ldHJpY3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgTG9hZHMgYSBiaXRtYXAgbWV0cmljcyByZWNvcmQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgc3RyZWFtICA6OiBUaGUgaW5wdXQgc3RyZWFtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbWV0cmljcyA6OiBBIG1ldHJpY3Mgc3RydWN0dXJlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBzdGF0aWMKKyAgdm9pZCAgVFRfTG9hZF9TQml0X01ldHJpY3MoIFRUX1NCaXRfTWV0cmljcyogIG1ldHJpY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gICAgICAgICBzdHJlYW0gKQorICB7CisgICAgbWV0cmljcy0+aGVpZ2h0ICAgICAgID0gR0VUX0J5dGUoKTsKKyAgICBtZXRyaWNzLT53aWR0aCAgICAgICAgPSBHRVRfQnl0ZSgpOworCisgICAgbWV0cmljcy0+aG9yaUJlYXJpbmdYID0gR0VUX0NoYXIoKTsKKyAgICBtZXRyaWNzLT5ob3JpQmVhcmluZ1kgPSBHRVRfQ2hhcigpOworICAgIG1ldHJpY3MtPmhvcmlBZHZhbmNlICA9IEdFVF9CeXRlKCk7CisKKyAgICBtZXRyaWNzLT52ZXJ0QmVhcmluZ1ggPSBHRVRfQ2hhcigpOworICAgIG1ldHJpY3MtPnZlcnRCZWFyaW5nWSA9IEdFVF9DaGFyKCk7CisgICAgbWV0cmljcy0+dmVydEFkdmFuY2UgID0gR0VUX0J5dGUoKTsKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfTG9hZF9TQml0X0xpbmVfTWV0cmljcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgTG9hZHMgYSBiaXRtYXAgbGluZSBtZXRyaWNzIHJlY29yZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgc3RyZWFtICA6OiBUaGUgaW5wdXQgc3RyZWFtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbWV0cmljcyA6OiBBIGxpbmUgbWV0cmljcyBzdHJ1Y3R1cmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBzdGF0aWMKKyAgdm9pZCAgVFRfTG9hZF9TQml0X0xpbmVfTWV0cmljcyggVFRfU0JpdF9MaW5lX01ldHJpY3MqICBtZXRyaWNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gICAgICAgICAgICAgIHN0cmVhbSApCisgIHsKKyAgICBtZXRyaWNzLT5hc2NlbmRlciAgPSBHRVRfQ2hhcigpOworICAgIG1ldHJpY3MtPmRlc2NlbmRlciA9IEdFVF9DaGFyKCk7CisgICAgbWV0cmljcy0+bWF4X3dpZHRoID0gR0VUX0J5dGUoKTsKKworICAgIG1ldHJpY3MtPmNhcmV0X3Nsb3BlX251bWVyYXRvciAgID0gR0VUX0NoYXIoKTsKKyAgICBtZXRyaWNzLT5jYXJldF9zbG9wZV9kZW5vbWluYXRvciA9IEdFVF9DaGFyKCk7CisgICAgbWV0cmljcy0+Y2FyZXRfb2Zmc2V0ICAgICAgICAgICAgPSBHRVRfQ2hhcigpOworCisgICAgbWV0cmljcy0+bWluX29yaWdpbl9TQiAgPSBHRVRfQ2hhcigpOworICAgIG1ldHJpY3MtPm1pbl9hZHZhbmNlX1NCID0gR0VUX0NoYXIoKTsKKyAgICBtZXRyaWNzLT5tYXhfYmVmb3JlX0JMICA9IEdFVF9DaGFyKCk7CisgICAgbWV0cmljcy0+bWluX2FmdGVyX0JMICAgPSBHRVRfQ2hhcigpOworICAgIG1ldHJpY3MtPnBhZHNbMF0gICAgICAgID0gR0VUX0NoYXIoKTsKKyAgICBtZXRyaWNzLT5wYWRzWzFdICAgICAgICA9IEdFVF9DaGFyKCk7CisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX0xvYWRfU0JpdF9Db25zdF9NZXRyaWNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIExvYWRzIHRoZSBtZXRyaWNzIGZvciBgRUJMQycgaW5kZXggdGFibGVzIGZvcm1hdCAyIGFuZCA1LiAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHJhbmdlICA6OiBUaGUgdGFyZ2V0IHJhbmdlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgc3RyZWFtIDo6IFRoZSBpbnB1dCBzdHJlYW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVHJ1ZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBzdGF0aWMKKyAgVFRfRXJyb3IgIExvYWRfU0JpdF9Db25zdF9NZXRyaWNzKCBUVF9TQml0X1JhbmdlKiAgcmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICAgICAgIHN0cmVhbSApCisgIHsKKyAgICBUVF9FcnJvciAgZXJyb3I7CisKKyAgICBpZiAoICFBQ0NFU1NfRnJhbWUoIDEyTCApICkKKyAgICB7CisgICAgICByYW5nZS0+aW1hZ2Vfc2l6ZSA9IEdFVF9VTG9uZygpOworICAgICAgVFRfTG9hZF9TQml0X01ldHJpY3MoICZyYW5nZS0+bWV0cmljcywgc3RyZWFtICk7CisKKyAgICAgIEZPUkdFVF9GcmFtZSgpOworICAgIH0KKworICAgIHJldHVybiBlcnJvcjsKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfTG9hZF9TQml0X1JhbmdlX0NvZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgTG9hZHMgdGhlIHJhbmdlIGNvZGVzIGZvciBgRUJMQycgaW5kZXggdGFibGVzIGZvcm1hdCA0IGFuZCA1LiAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgcmFuZ2UgICAgICAgIDo6IFRoZSB0YXJnZXQgcmFuZ2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzdHJlYW0gICAgICAgOjogVGhlIGlucHV0IHN0cmVhbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGxvYWRfb2Zmc2V0cyA6OiBBIGZsYWcgd2hldGhlciB0byBsb2FkIHRoZSBnbHlwaCBvZmZzZXQgdGFibGUuICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRydWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgc3RhdGljCisgIFRUX0Vycm9yICBMb2FkX1NCaXRfUmFuZ2VfQ29kZXMoIFRUX1NCaXRfUmFuZ2UqICByYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICAgICAgIHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfQm9vbCAgICAgICAgIGxvYWRfb2Zmc2V0cyApCisgIHsKKyAgICBUVF9FcnJvciAgIGVycm9yOworICAgIFRUX1VMb25nICAgY291bnQsIG4sIHNpemU7CisgICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBzdHJlYW0tPm1lbW9yeTsKKworCisgICAgaWYgKCBSRUFEX1VMb25nKCBjb3VudCApICkKKyAgICAgIGdvdG8gRXhpdDsKKworICAgIHJhbmdlLT5udW1fZ2x5cGhzID0gY291bnQ7CisKKyAgICAvKiBBbGxvY2F0ZSBnbHlwaCBvZmZzZXRzIHRhYmxlIGlmIG5lZWRlZCAqLworICAgIGlmICggbG9hZF9vZmZzZXRzICkKKyAgICB7CisgICAgICBpZiAoIEFMTE9DX0FSUkFZKCByYW5nZS0+Z2x5cGhfb2Zmc2V0cywgY291bnQsIFRUX1VMb25nICkgKQorICAgICAgICBnb3RvIEV4aXQ7CisKKyAgICAgIHNpemUgPSBjb3VudCAqIDRMOworICAgIH0KKyAgICBlbHNlCisgICAgICBzaXplID0gY291bnQgKiAyTDsKKworICAgIC8qIEFsbG9jYXRlIGdseXBoIGNvZGVzIHRhYmxlIGFuZCBhY2Nlc3MgZnJhbWUgKi8KKyAgICBpZiAoIEFMTE9DX0FSUkFZICggcmFuZ2UtPmdseXBoX2NvZGVzLCBjb3VudCwgVFRfVVNob3J0ICkgfHwKKyAgICAgICAgIEFDQ0VTU19GcmFtZSggc2l6ZSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgZ290byBFeGl0OworCisgICAgZm9yICggbiA9IDA7IG4gPCBjb3VudDsgbisrICkKKyAgICB7CisgICAgICByYW5nZS0+Z2x5cGhfY29kZXNbbl0gPSBHRVRfVVNob3J0KCk7CisKKyAgICAgIGlmIChsb2FkX29mZnNldHMpCisgICAgICAgIHJhbmdlLT5nbHlwaF9vZmZzZXRzW25dID0gKFRUX1VMb25nKXJhbmdlLT5pbWFnZV9vZmZzZXQgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRVRfVVNob3J0KCk7CisgICAgfQorCisgICAgRk9SR0VUX0ZyYW1lKCk7CisKKyAgRXhpdDoKKyAgICByZXR1cm4gZXJyb3I7CisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX0xvYWRfU0JpdF9SYW5nZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIExvYWRzIGEgZ2l2ZW4gYEVCTEMnIGluZGV4L3JhbmdlIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHJhbmdlICA6OiBUaGUgdGFyZ2V0IHJhbmdlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzdHJlYW0gOjogVGhlIGlucHV0IHN0cmVhbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUcnVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0YXRpYworICBUVF9FcnJvciAgTG9hZF9TQml0X1JhbmdlKCBUVF9TQml0X1JhbmdlKiAgcmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgICAgICBzdHJlYW0gKQorICB7CisgICAgVFRfRXJyb3IgICBlcnJvcjsKKyAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IHN0cmVhbS0+bWVtb3J5OworCisKKyAgICBzd2l0Y2goIHJhbmdlLT5pbmRleF9mb3JtYXQgKQorICAgIHsKKyAgICBjYXNlIDE6ICAgLyogdmFyaWFibGUgbWV0cmljcyB3aXRoIDQtYnl0ZSBvZmZzZXRzICovCisgICAgY2FzZSAzOiAgIC8qIHZhcmlhYmxlIG1ldHJpY3Mgd2l0aCAyLWJ5dGUgb2Zmc2V0cyAqLworICAgICAgeworICAgICAgICBUVF9VTG9uZyAgbnVtX2dseXBocywgbjsKKyAgICAgICAgVFRfSW50ICAgIHNpemVfZWxlbTsKKyAgICAgICAgVFRfQm9vbCAgIGxhcmdlID0gKHJhbmdlLT5pbmRleF9mb3JtYXQgPT0gMSk7CisKKworICAgICAgICBudW1fZ2x5cGhzICAgICAgICA9IHJhbmdlLT5sYXN0X2dseXBoIC0gcmFuZ2UtPmZpcnN0X2dseXBoICsgMUw7CisgICAgICAgIHJhbmdlLT5udW1fZ2x5cGhzID0gbnVtX2dseXBoczsKKyAgICAgICAgbnVtX2dseXBocysrOyAgICAvKiBYWFggOiBCRVdBUkUgLSBzZWUgc3BlYyAqLworCisgICAgICAgIHNpemVfZWxlbSAgPSAoIGxhcmdlID8gNCA6IDIgKTsKKworICAgICAgICBpZiAoIEFMTE9DX0FSUkFZKCByYW5nZS0+Z2x5cGhfb2Zmc2V0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX2dseXBocywgVFRfVUxvbmcgKSAgICB8fAorCisgICAgICAgICAgICAgQUNDRVNTX0ZyYW1lKCBudW1fZ2x5cGhzICogc2l6ZV9lbGVtICkgKQorICAgICAgICAgIGdvdG8gRXhpdDsKKworICAgICAgICBmb3IgKCBuID0gMDsgbiA8IG51bV9nbHlwaHM7IG4rKyApCisgICAgICAgICAgcmFuZ2UtPmdseXBoX29mZnNldHNbbl0gPSAoVFRfVUxvbmcpKCByYW5nZS0+aW1hZ2Vfb2Zmc2V0ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobGFyZ2UgPyBHRVRfVUxvbmcoKSA6IEdFVF9VU2hvcnQoKSkgKTsKKyAgICAgICAgRk9SR0VUX0ZyYW1lKCk7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgMjogICAvKiBhbGwgZ2x5cGhzIGhhdmUgaWRlbnRpY2FsIG1ldHJpY3MgKi8KKyAgICAgIGVycm9yID0gTG9hZF9TQml0X0NvbnN0X01ldHJpY3MoIHJhbmdlLCBzdHJlYW0gKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSA0OgorICAgICAgZXJyb3IgPSBMb2FkX1NCaXRfUmFuZ2VfQ29kZXMoIHJhbmdlLCBzdHJlYW0sIDEgKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSA1OgorICAgICAgZXJyb3IgPSBMb2FkX1NCaXRfQ29uc3RfTWV0cmljcyggcmFuZ2UsIHN0cmVhbSApIHx8CisgICAgICAgICAgICAgIExvYWRfU0JpdF9SYW5nZV9Db2RlcyggcmFuZ2UsIHN0cmVhbSwgMCApOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgZXJyb3IgPSBUVF9FcnJfSW52YWxpZF9GaWxlX0Zvcm1hdDsKKyAgICB9CisKKyAgRXhpdDoKKyAgICByZXR1cm4gZXJyb3I7CisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX0xvYWRfU0JpdF9TdHJpa2VzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIExvYWRzIHRoZSB0YWJsZSBvZiBlbWJlZGRlZCBiaXRtYXAgc2l6ZXMgZm9yIHRoaXMgZmFjZS4gICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZhY2UgICA6OiBUaGUgdGFyZ2V0IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzdHJlYW0gOjogVGhlIGlucHV0IHN0cmVhbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUcnVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIExPQ0FMX0ZVTkMKKyAgVFRfRXJyb3IgIFRUX0xvYWRfU0JpdF9TdHJpa2VzKCBUVF9GYWNlICAgIGZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICBzdHJlYW0gKQorICB7CisgICAgVFRfRXJyb3IgICBlcnJvciAgPSAwOworICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gc3RyZWFtLT5tZW1vcnk7CisgICAgVFRfRml4ZWQgICB2ZXJzaW9uOworICAgIFRUX1VMb25nICAgbnVtX3N0cmlrZXM7CisgICAgVFRfVUxvbmcgICB0YWJsZV9iYXNlOworCisKKyAgICAvKiB0aGlzIHRhYmxlIGlzIG9wdGlvbmFsICovCisgICAgZXJyb3IgPSBmYWNlLT5nb3RvX3RhYmxlKCBmYWNlLCBUVEFHX0VCTEMsIHN0cmVhbSwgMCApOworICAgIHsKKyAgICAgIGVycm9yID0gMDsKKyAgICAgIGdvdG8gRXhpdDsKKyAgICB9CisKKyAgICB0YWJsZV9iYXNlID0gRklMRV9Qb3MoKTsKKyAgICBpZiAoIEFDQ0VTU19GcmFtZSggOEwgKSApCisgICAgICBnb3RvIEV4aXQ7CisKKyAgICB2ZXJzaW9uICAgICA9IEdFVF9Mb25nKCk7CisgICAgbnVtX3N0cmlrZXMgPSBHRVRfVUxvbmcoKTsKKworICAgIEZPUkdFVF9GcmFtZSgpOworCisgICAgLyogY2hlY2sgdmVyc2lvbiBudW1iZXIgYW5kIHN0cmlrZSBjb3VudCAqLworICAgIGlmICggdmVyc2lvbiAgICAgIT0gMHgwMDAyMDAwMCB8fAorICAgICAgICAgbnVtX3N0cmlrZXMgPj0gMHgxMDAwMCAgICApCisgICAgeworICAgICAgRlRfRVJST1IoKCAiVFRfTG9hZF9TQml0X1N0cmlrZXM6IGludmFsaWQgdGFibGUgdmVyc2lvbiFcbiIgKSk7CisgICAgICBlcnJvciA9IFRUX0Vycl9JbnZhbGlkX0ZpbGVfRm9ybWF0OworCisgICAgICBnb3RvIEV4aXQ7CisgICAgfQorCisgICAgLyogYWxsb2NhdGUgdGhlIHN0cmlrZXMgdGFibGUgKi8KKyAgICBpZiAoIEFMTE9DX0FSUkFZKCBmYWNlLT5zYml0X3N0cmlrZXMsIG51bV9zdHJpa2VzLCBUVF9TQml0X1N0cmlrZSApICkKKyAgICAgIGdvdG8gRXhpdDsKKworICAgIGZhY2UtPm51bV9zYml0X3N0cmlrZXMgPSBudW1fc3RyaWtlczsKKworICAgIC8qIG5vdyByZWFkIGVhY2ggc3RyaWtlIHRhYmxlIHNlcGFyYXRlbHkgKi8KKyAgICB7CisgICAgICBUVF9TQml0X1N0cmlrZSogIHN0cmlrZSA9IGZhY2UtPnNiaXRfc3RyaWtlczsKKyAgICAgIFRUX1VMb25nICAgICAgICAgY291bnQgID0gbnVtX3N0cmlrZXM7CisKKyAgICAgIGlmICggQUNDRVNTX0ZyYW1lKCA0OEwgKiBudW1fc3RyaWtlcyApICkKKyAgICAgICAgZ290byBFeGl0OworCisgICAgICB3aGlsZSAoIGNvdW50ID4gMCApCisgICAgICB7CisgICAgICAgIFRUX1VMb25nICBpbmRleFRhYmxlc1NpemU7CisKKworICAgICAgICBzdHJpa2UtPnJhbmdlc19vZmZzZXQgICAgPSBHRVRfVUxvbmcoKTsKKyAgICAgICAgaW5kZXhUYWJsZXNTaXplICAgICAgICAgID0gR0VUX1VMb25nKCk7ICAvKiBkb24ndCBzYXZlICovCisKKyAgICAgICAgc3RyaWtlLT5udW1fcmFuZ2VzICAgICAgID0gR0VUX1VMb25nKCk7CisgICAgICAgIHN0cmlrZS0+Y29sb3JfcmVmICAgICAgICA9IEdFVF9VTG9uZygpOworCisgICAgICAgIFRUX0xvYWRfU0JpdF9MaW5lX01ldHJpY3MoICZzdHJpa2UtPmhvcmksIHN0cmVhbSApOworICAgICAgICBUVF9Mb2FkX1NCaXRfTGluZV9NZXRyaWNzKCAmc3RyaWtlLT52ZXJ0LCBzdHJlYW0gKTsKKworICAgICAgICBzdHJpa2UtPnN0YXJ0X2dseXBoICAgICAgPSBHRVRfVVNob3J0KCk7CisgICAgICAgIHN0cmlrZS0+ZW5kX2dseXBoICAgICAgICA9IEdFVF9VU2hvcnQoKTsKKyAgICAgICAgc3RyaWtlLT54X3BwZW0gICAgICAgICAgID0gR0VUX0J5dGUoKTsKKyAgICAgICAgc3RyaWtlLT55X3BwZW0gICAgICAgICAgID0gR0VUX0J5dGUoKTsKKyAgICAgICAgc3RyaWtlLT5iaXRfZGVwdGggICAgICAgID0gR0VUX0J5dGUoKTsKKyAgICAgICAgc3RyaWtlLT5mbGFncyAgICAgICAgICAgID0gR0VUX0NoYXIoKTsKKworICAgICAgICBjb3VudC0tOworICAgICAgICBzdHJpa2UrKzsKKyAgICAgIH0KKworICAgICAgRk9SR0VUX0ZyYW1lKCk7CisgICAgfQorCisgICAgLyogYWxsb2NhdGUgdGhlIGluZGV4IHJhbmdlcyBmb3IgZWFjaCBzdHJpa2UgdGFibGUgKi8KKyAgICB7CisgICAgICBUVF9TQml0X1N0cmlrZSogIHN0cmlrZSA9IGZhY2UtPnNiaXRfc3RyaWtlczsKKyAgICAgIFRUX1VMb25nICAgICAgICAgY291bnQgID0gbnVtX3N0cmlrZXM7CisKKworICAgICAgd2hpbGUgKCBjb3VudCA+IDAgKQorICAgICAgeworICAgICAgICBUVF9TQml0X1JhbmdlKiByYW5nZTsKKyAgICAgICAgVFRfVUxvbmcgICAgICAgY291bnQyID0gc3RyaWtlLT5udW1fcmFuZ2VzOworCisKKyAgICAgICAgaWYgKCBBTExPQ19BUlJBWSggc3RyaWtlLT5zYml0X3JhbmdlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWtlLT5udW1fcmFuZ2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9TQml0X1JhbmdlICkgKQorICAgICAgICAgIGdvdG8gRXhpdDsKKworICAgICAgICAvKiByZWFkIGVhY2ggcmFuZ2UgKi8KKyAgICAgICAgaWYgKCBGSUxFX1NlZWsoIHRhYmxlX2Jhc2UgKyBzdHJpa2UtPnJhbmdlc19vZmZzZXQgKSB8fAorICAgICAgICAgICAgIEFDQ0VTU19GcmFtZSggc3RyaWtlLT5udW1fcmFuZ2VzICogOEwgKSAgICAgICAgICkKKyAgICAgICAgICBnb3RvIEV4aXQ7CisKKyAgICAgICAgcmFuZ2UgPSBzdHJpa2UtPnNiaXRfcmFuZ2VzOworICAgICAgICB3aGlsZSAoIGNvdW50MiA+IDAgKQorICAgICAgICB7CisgICAgICAgICAgcmFuZ2UtPmZpcnN0X2dseXBoICA9IEdFVF9VU2hvcnQoKTsKKyAgICAgICAgICByYW5nZS0+bGFzdF9nbHlwaCAgID0gR0VUX1VTaG9ydCgpOworICAgICAgICAgIHJhbmdlLT50YWJsZV9vZmZzZXQgPSB0YWJsZV9iYXNlICsgc3RyaWtlLT5yYW5nZXNfb2Zmc2V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIEdFVF9VTG9uZygpOworICAgICAgICAgIGNvdW50Mi0tOworICAgICAgICAgIHJhbmdlKys7CisgICAgICAgIH0KKworICAgICAgICBGT1JHRVRfRnJhbWUoKTsKKworICAgICAgICAvKiBOb3csIHJlYWQgZWFjaCBpbmRleCB0YWJsZSAqLworICAgICAgICBjb3VudDIgPSBzdHJpa2UtPm51bV9yYW5nZXM7CisgICAgICAgIHJhbmdlICA9IHN0cmlrZS0+c2JpdF9yYW5nZXM7CisgICAgICAgIHdoaWxlICggY291bnQyID4gMCApCisgICAgICAgIHsKKyAgICAgICAgICAvKiBSZWFkIHRoZSBoZWFkZXIgKi8KKyAgICAgICAgICBpZiAoIEZJTEVfU2VlayggcmFuZ2UtPnRhYmxlX29mZnNldCApIHx8CisgICAgICAgICAgICAgICBBQ0NFU1NfRnJhbWUoIDhMICkgICAgICAgICAgICAgICApCisgICAgICAgICAgICBnb3RvIEV4aXQ7CisKKyAgICAgICAgICByYW5nZS0+aW5kZXhfZm9ybWF0ID0gR0VUX1VTaG9ydCgpOworICAgICAgICAgIHJhbmdlLT5pbWFnZV9mb3JtYXQgPSBHRVRfVVNob3J0KCk7CisgICAgICAgICAgcmFuZ2UtPmltYWdlX29mZnNldCA9IEdFVF9VTG9uZygpOworCisgICAgICAgICAgRk9SR0VUX0ZyYW1lKCk7CisKKyAgICAgICAgICBlcnJvciA9IExvYWRfU0JpdF9SYW5nZSggcmFuZ2UsIHN0cmVhbSApOworICAgICAgICAgIGlmICggZXJyb3IgKQorICAgICAgICAgICAgZ290byBFeGl0OworCisgICAgICAgICAgY291bnQyLS07CisgICAgICAgICAgcmFuZ2UrKzsKKyAgICAgICAgfQorCisgICAgICAgIGNvdW50LS07CisgICAgICAgIHN0cmlrZSsrOworICAgICAgfQorICAgIH0KKworICBFeGl0OgorICAgIHJldHVybiBlcnJvcjsKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfRnJlZV9TQml0X1N0cmlrZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgUmVsZWFzZXMgdGhlIGVtYmVkZGVkIGJpdG1hcCB0YWJsZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZmFjZSA6OiBUaGUgdGFyZ2V0IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBMT0NBTF9GVU5DCisgIHZvaWQgIFRUX0ZyZWVfU0JpdF9TdHJpa2VzKCBUVF9GYWNlICBmYWNlICkKKyAgeworICAgIEZUX01lbW9yeSAgICAgICAgbWVtb3J5ICAgICAgID0gZmFjZS0+cm9vdC5tZW1vcnk7CisgICAgVFRfU0JpdF9TdHJpa2UqICBzdHJpa2UgICAgICAgPSBmYWNlLT5zYml0X3N0cmlrZXM7CisgICAgVFRfU0JpdF9TdHJpa2UqICBzdHJpa2VfbGltaXQgPSBzdHJpa2UgKyBmYWNlLT5udW1fc2JpdF9zdHJpa2VzOworCisKKyAgICBpZiAoIHN0cmlrZSApCisgICAgeworICAgICAgZm9yICggOyBzdHJpa2UgPCBzdHJpa2VfbGltaXQ7IHN0cmlrZSsrICkKKyAgICAgIHsKKyAgICAgICAgVFRfU0JpdF9SYW5nZSogIHJhbmdlICAgICAgID0gc3RyaWtlLT5zYml0X3JhbmdlczsKKyAgICAgICAgVFRfU0JpdF9SYW5nZSogIHJhbmdlX2xpbWl0ID0gcmFuZ2UgKyBzdHJpa2UtPm51bV9yYW5nZXM7CisKKyAgICAgICAgaWYgKCByYW5nZSApCisgICAgICAgIHsKKyAgICAgICAgICBmb3IgKCA7IHJhbmdlIDwgcmFuZ2VfbGltaXQ7IHJhbmdlKysgKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIHJlbGVhc2UgdGhlIGdseXBoIG9mZnNldHMgYW5kIGNvZGVzIHRhYmxlcyAqLworICAgICAgICAgICAgLyogd2hlcmUgYXBwcm9wcmlhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICBGUkVFKCByYW5nZS0+Z2x5cGhfb2Zmc2V0cyApOworICAgICAgICAgICAgRlJFRSggcmFuZ2UtPmdseXBoX2NvZGVzICk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEZSRUUoIHN0cmlrZS0+c2JpdF9yYW5nZXMgKTsKKyAgICAgICAgc3RyaWtlLT5udW1fcmFuZ2VzID0gMDsKKyAgICAgIH0KKyAgICAgIEZSRUUoIGZhY2UtPnNiaXRfc3RyaWtlcyApOworICAgIH0KKyAgICBmYWNlLT5udW1fc2JpdF9zdHJpa2VzID0gMDsKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRmluZF9TQml0X1JhbmdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgU2NhbnMgYSBnaXZlbiBzdHJpa2UncyByYW5nZXMgYW5kIHJldHVybiwgZm9yIGEgZ2l2ZW4gZ2x5cGggICAgICAgICovCisgIC8qICAgIGluZGV4LCB0aGUgY29ycmVzcG9uZGluZyBzYml0IHJhbmdlLCBhbmQgYEVCRFQnIG9mZnNldC4gICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGdseXBoX2luZGV4ICAgOjogVGhlIGdseXBoIGluZGV4LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzdHJpa2UgICAgICAgIDo6IFRoZSBzb3VyY2UvY3VycmVudCBzYml0IHN0cmlrZS4gICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBhcmFuZ2UgICAgICAgIDo6IFRoZSBzYml0IHJhbmdlIGNvbnRhaW5pbmcgdGhlIGdseXBoIGluZGV4LiAgICAgICAgKi8KKyAgLyogICAgYWdseXBoX29mZnNldCA6OiBUaGUgb2Zmc2V0IG9mIHRoZSBnbHlwaCBkYXRhIGluIGBFQkRUJyB0YWJsZS4gICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVHJ1ZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgdGhlIGdseXBoIGluZGV4IHdhcyBmb3VuZC4gICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBzdGF0aWMKKyAgVFRfRXJyb3IgIEZpbmRfU0JpdF9SYW5nZSggVFRfVUludCAgICAgICAgICBnbHlwaF9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfU0JpdF9TdHJpa2UqICBzdHJpa2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX1NCaXRfUmFuZ2UqKiAgYXJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9VTG9uZyogICAgICAgIGFnbHlwaF9vZmZzZXQgKQorICB7CisgICAgVFRfU0JpdF9SYW5nZSAgKnJhbmdlLCAqcmFuZ2VfbGltaXQ7CisKKworICAgIC8qIGNoZWNrIHdoZXRoZXIgdGhlIGdseXBoIGluZGV4IGlzIHdpdGhpbiB0aGlzIHN0cmlrZSdzICovCisgICAgLyogZ2x5cGggcmFuZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBpZiAoIGdseXBoX2luZGV4IDwgc3RyaWtlLT5zdGFydF9nbHlwaCB8fAorICAgICAgICAgZ2x5cGhfaW5kZXggPiBzdHJpa2UtPmVuZF9nbHlwaCAgICkKKyAgICAgIGdvdG8gRmFpbDsKKworICAgIC8qIHNjYW4gYWxsIHJhbmdlcyBpbiBzdHJpa2UgKi8KKyAgICByYW5nZSAgICAgICA9IHN0cmlrZS0+c2JpdF9yYW5nZXM7CisgICAgcmFuZ2VfbGltaXQgPSByYW5nZSArIHN0cmlrZS0+bnVtX3JhbmdlczsKKyAgICBpZiAoICFyYW5nZSApCisgICAgICBnb3RvIEZhaWw7CisKKyAgICBmb3IgKCA7IHJhbmdlIDwgcmFuZ2VfbGltaXQ7IHJhbmdlKysgKQorICAgIHsKKyAgICAgIGlmICggZ2x5cGhfaW5kZXggPj0gcmFuZ2UtPmZpcnN0X2dseXBoICYmCisgICAgICAgICAgIGdseXBoX2luZGV4IDw9IHJhbmdlLT5sYXN0X2dseXBoICApCisgICAgICB7CisgICAgICAgIFRUX1VTaG9ydCAgZGVsdGEgPSBnbHlwaF9pbmRleCAtIHJhbmdlLT5maXJzdF9nbHlwaDsKKworCisgICAgICAgIHN3aXRjaCAoIHJhbmdlLT5pbmRleF9mb3JtYXQgKQorICAgICAgICB7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgY2FzZSAzOgorICAgICAgICAgICphZ2x5cGhfb2Zmc2V0ID0gcmFuZ2UtPmdseXBoX29mZnNldHNbZGVsdGFdOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAqYWdseXBoX29mZnNldCA9IHJhbmdlLT5pbWFnZV9vZmZzZXQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UtPmltYWdlX3NpemUgKiBkZWx0YTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDQ6CisgICAgICAgIGNhc2UgNToKKyAgICAgICAgICB7CisgICAgICAgICAgICBUVF9VTG9uZyAgbjsKKworCisgICAgICAgICAgICBmb3IgKCBuID0gMDsgbiA8IHJhbmdlLT5udW1fZ2x5cGhzOyBuKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpZiAoIHJhbmdlLT5nbHlwaF9jb2Rlc1tuXSA9PSBnbHlwaF9pbmRleCApCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIHJhbmdlLT5pbmRleF9mb3JtYXQgPT0gNCApCisgICAgICAgICAgICAgICAgICAqYWdseXBoX29mZnNldCA9IHJhbmdlLT5nbHlwaF9vZmZzZXRzW25dOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICphZ2x5cGhfb2Zmc2V0ID0gcmFuZ2UtPmltYWdlX29mZnNldCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gKiByYW5nZS0+aW1hZ2Vfc2l6ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIC8qIGZhbGwtdGhyb3VnaCAqLworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBnb3RvIEZhaWw7CisgICAgICAgIH0KKworICAgICAgICAvKiByZXR1cm4gc3VjY2Vzc2Z1bGx5ISAqLworICAgICAgICAqYXJhbmdlICA9IHJhbmdlOworCisgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgIH0KKworICBGYWlsOgorICAgICphcmFuZ2UgICAgICAgID0gMDsKKyAgICAqYWdseXBoX29mZnNldCA9IDA7CisKKyAgICByZXR1cm4gVFRfRXJyX0ludmFsaWRfQXJndW1lbnQ7CisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZpbmRfU0JpdF9JbWFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIENoZWNrcyB3aGV0aGVyIGFuIGVtYmVkZGVkIGJpdG1hcCAoYW4gYHNiaXQnKSBleGlzdHMgZm9yIGEgZ2l2ZW4gICAqLworICAvKiAgICBnbHlwaCwgYXQgZ2l2ZW4geCBhbmQgeSBwcGVtcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBmYWNlICAgICAgICAgIDo6IFRoZSB0YXJnZXQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZ2x5cGhfaW5kZXggICA6OiBUaGUgZ2x5cGggaW5kZXguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHhfcHBlbSAgICAgICAgOjogVGhlIGhvcml6b250YWwgcmVzb2x1dGlvbiBpbiBwb2ludHMgcGVyIEVNLiAgICAgICAqLworICAvKiAgICB5X3BwZW0gICAgICAgIDo6IFRoZSB2ZXJ0aWNhbCByZXNvbHV0aW9uIGluIHBvaW50cyBwZXIgRU0uICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBhcmFuZ2UgICAgICAgIDo6IFRoZSBTQml0IHJhbmdlIGNvbnRhaW5pbmcgdGhlIGdseXBoIGluZGV4LiAgICAgICAgKi8KKyAgLyogICAgYXN0cmlrZSAgICAgICA6OiBUaGUgU0JpdCBzdHJpa2UgY29udGFpbmluZyB0aGUgZ2x5cGggaW5kZXguICAgICAgICovCisgIC8qICAgIGFnbHlwaF9vZmZzZXQgOjogVGhlIG9mZnNldCBvZiB0aGUgZ2x5cGggZGF0YSBpbiBgRUJEVCcgdGFibGUuICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRydWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICBSZXR1cm5zICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUVF9FcnJfSW52YWxpZF9Bcmd1bWVudCBpZiBubyBzYml0IGV4aXN0IGZvciB0aGUgcmVxdWVzdGVkIGdseXBoLiAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0YXRpYworICBUVF9FcnJvciAgRmluZF9TQml0X0ltYWdlKCBUVF9GYWNlICAgICAgICAgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9VSW50ICAgICAgICAgICBnbHlwaF9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfSW50ICAgICAgICAgICAgeF9wcGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9JbnQgICAgICAgICAgICB5X3BwZW0sCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfU0JpdF9SYW5nZSoqICAgYXJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9TQml0X1N0cmlrZSoqICBhc3RyaWtlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9VTG9uZyogICAgICAgICBhZ2x5cGhfb2Zmc2V0ICkKKyAgeworICAgIFRUX1NCaXRfU3RyaWtlKiAgc3RyaWtlID0gZmFjZS0+c2JpdF9zdHJpa2VzOworICAgIFRUX1NCaXRfU3RyaWtlKiAgc3RyaWtlX2xpbWl0ID0gc3RyaWtlICsgZmFjZS0+bnVtX3NiaXRfc3RyaWtlczsKKworCisgICAgaWYgKCAhc3RyaWtlKQorICAgICAgZ290byBGYWlsOworCisgICAgZm9yICggOyBzdHJpa2UgPCBzdHJpa2VfbGltaXQ7IHN0cmlrZSsrICkKKyAgICB7CisgICAgICBpZiAoIHN0cmlrZS0+eF9wcGVtID09IHhfcHBlbSAmJiBzdHJpa2UtPnlfcHBlbSA9PSB5X3BwZW0gKQorICAgICAgeworICAgICAgICBUVF9FcnJvciAgZXJyb3I7CisKKworICAgICAgICBlcnJvciA9IEZpbmRfU0JpdF9SYW5nZSggZ2x5cGhfaW5kZXgsIHN0cmlrZSwgYXJhbmdlLCBhZ2x5cGhfb2Zmc2V0ICk7CisgICAgICAgIGlmICggZXJyb3IgKQorICAgICAgICAgIGdvdG8gRmFpbDsKKworICAgICAgICAqYXN0cmlrZSA9IHN0cmlrZTsKKworICAgICAgICByZXR1cm4gVFRfRXJyX09rOworICAgICAgfQorICAgIH0KKworICBGYWlsOgorICAgIC8qIG5vIGVtYmVkZGVkIGJpdG1hcCBmb3IgdGhpcyBnbHlwaCBpbiBmYWNlICovCisgICAgKmFyYW5nZSAgICAgICAgPSAwOworICAgICphc3RyaWtlICAgICAgID0gMDsKKyAgICAqYWdseXBoX29mZnNldCA9IDA7CisKKyAgICByZXR1cm4gVFRfRXJyX0ludmFsaWRfQXJndW1lbnQ7CisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIExvYWRfU0JpdF9NZXRyaWNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEdldHMgdGhlIGJpZyBtZXRyaWNzIGZvciBhIGdpdmVuIFNCaXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHN0cmVhbSAgICAgIDo6IFRoZSBpbnB1dCBzdHJlYW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICByYW5nZSAgICAgICA6OiBUaGUgU0JpdCByYW5nZSBjb250YWluaW5nIHRoZSBnbHlwaC4gICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBiaWdfbWV0cmljcyA6OiBBIGJpZyBTQml0IG1ldHJpY3Mgc3RydWN0dXJlIGZvciB0aGUgZ2x5cGguICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUcnVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGUgc3RyZWFtIGN1cnNvciBtdXN0IGJlIHBvc2l0aW9uZWQgYXQgdGhlIGdseXBoJ3Mgb2Zmc2V0IHdpdGhpbiAgKi8KKyAgLyogICAgdGhlIGBFQkRUJyB0YWJsZSBiZWZvcmUgdGhlIGNhbGwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBJZiB0aGUgaW1hZ2UgZm9ybWF0IHVzZXMgdmFyaWFibGUgbWV0cmljcywgdGhlIHN0cmVhbSBjdXJzb3IgaXMgICAgKi8KKyAgLyogICAgcG9zaXRpb25lZCBqdXN0IGFmdGVyIHRoZSBtZXRyaWNzIGhlYWRlciBpbiB0aGUgYEVCRFQnIHRhYmxlIG9uICAgICovCisgIC8qICAgIGZ1bmN0aW9uIGV4aXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgc3RhdGljCisgIFRUX0Vycm9yICBMb2FkX1NCaXRfTWV0cmljcyggRlRfU3RyZWFtICAgICAgICAgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX1NCaXRfUmFuZ2UqICAgIHJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX1NCaXRfTWV0cmljcyogIG1ldHJpY3MgKQorICB7CisgICAgVFRfRXJyb3IgIGVycm9yID0gVFRfRXJyX09rOworCisKKyAgICBzd2l0Y2ggKCByYW5nZS0+aW5kZXhfZm9ybWF0ICkKKyAgICB7CisgICAgY2FzZSAxOiAgLyogdmFyaWFibGUgbWV0cmljcyAqLworICAgIGNhc2UgMzoKKyAgICBjYXNlIDQ6CisgICAgICB7CisgICAgICAgIHN3aXRjaCAoIHJhbmdlLT5pbWFnZV9mb3JtYXQgKQorICAgICAgICB7CisgICAgICAgIGNhc2UgMTogIC8qIHNtYWxsIG1ldHJpY3MgKi8KKyAgICAgICAgY2FzZSAyOgorICAgICAgICBjYXNlIDg6CisgICAgICAgICAgeworICAgICAgICAgICAgVFRfU0JpdF9TbWFsbF9NZXRyaWNzICBzbWV0cmljczsKKworCisgICAgICAgICAgICAvKiByZWFkIHNtYWxsIG1ldHJpY3MgKi8KKyAgICAgICAgICAgIGlmICggQUNDRVNTX0ZyYW1lKCA1TCApICkKKyAgICAgICAgICAgICAgZ290byBFeGl0OworICAgICAgICAgICAgVFRfTG9hZF9TbWFsbF9TQml0X01ldHJpY3MoICZzbWV0cmljcywgc3RyZWFtICk7CisgICAgICAgICAgICBGT1JHRVRfRnJhbWUoKTsKKworICAgICAgICAgICAgLyogY29udmVydCBpdCB0byBhIGJpZyBtZXRyaWNzICovCisgICAgICAgICAgICBtZXRyaWNzLT5oZWlnaHQgICAgICAgPSBzbWV0cmljcy5oZWlnaHQ7CisgICAgICAgICAgICBtZXRyaWNzLT53aWR0aCAgICAgICAgPSBzbWV0cmljcy53aWR0aDsKKyAgICAgICAgICAgIG1ldHJpY3MtPmhvcmlCZWFyaW5nWCA9IHNtZXRyaWNzLmJlYXJpbmdYOworICAgICAgICAgICAgbWV0cmljcy0+aG9yaUJlYXJpbmdZID0gc21ldHJpY3MuYmVhcmluZ1k7CisgICAgICAgICAgICBtZXRyaWNzLT5ob3JpQWR2YW5jZSAgPSBzbWV0cmljcy5hZHZhbmNlOworCisgICAgICAgICAgICAvKiB0aGVzZSBtZXRyaWNzIGFyZSBtYWRlIHVwIGF0IGEgaGlnaGVyIGxldmVsIHdoZW4gKi8KKyAgICAgICAgICAgIC8qIG5lZWRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgbWV0cmljcy0+dmVydEJlYXJpbmdYID0gMDsKKyAgICAgICAgICAgIG1ldHJpY3MtPnZlcnRCZWFyaW5nWSA9IDA7CisgICAgICAgICAgICBtZXRyaWNzLT52ZXJ0QWR2YW5jZSAgPSAwOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OiAgLyogYmlnIG1ldHJpY3MgKi8KKyAgICAgICAgICBpZiAoIEFDQ0VTU19GcmFtZSggOEwgKSApCisgICAgICAgICAgICBnb3RvIEV4aXQ7CisgICAgICAgICAgVFRfTG9hZF9TQml0X01ldHJpY3MoIG1ldHJpY3MsIHN0cmVhbSApOworICAgICAgICAgIEZPUkdFVF9GcmFtZSgpOworICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6ICAvKiBjb25zdGFudCBtZXRyaWNzICovCisgICAgICAqbWV0cmljcyA9IHJhbmdlLT5tZXRyaWNzOworICAgIH0KKworICBFeGl0OgorICAgIHJldHVybiBlcnJvcjsKKyAgfQorCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBDcm9wX0JpdG1hcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBDcm9wcyBhIGJpdG1hcCB0byBpdHMgdGlnaHRlc3QgYm91bmRpbmcgYm94LCBhbmQgYWRqdXN0cyBpdHMgICAgICAgKi8KKyAgLyogICAgbWV0cmljcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgaW1hZ2UgICA6OiBUaGUgaW5wdXQgZ2x5cGggc2xvdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBtZXRyaWNzIDo6IFRoZSBjb3JyZXNwb25kaW5nIG1ldHJpY3Mgc3RydWN0dXJlLiAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0YXRpYworICB2b2lkICBDcm9wX0JpdG1hcCggRlRfQml0bWFwKiAgICAgICAgbWFwLAorICAgICAgICAgICAgICAgICAgICAgVFRfU0JpdF9NZXRyaWNzKiAgbWV0cmljcyApCisgIHsKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qIEluIHRoaXMgc2l0dWF0aW9uLCBzb21lIGJvdW5kaW5nIGJveGVzIG9mIGVtYmVkZGVkIGJpdG1hcHMgYXJlIHRvbyAgKi8KKyAgICAvKiBsYXJnZS4gIFdlIG5lZWQgdG8gY3JvcCBpdCB0byBhIHJlYXNvbmFibGUgc2l6ZS4gICAgICAgICAgICAgICAgICAgICovCisgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICAgICAgLS0tLS0tLS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgICAgIHwgICAgICAgfCAgICAgICAgICAgICAgICAtLS0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogICAgICB8ICAqKiogIHwgICAgICAgICAgICAgICAgfCoqKnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICAgICAgfCAgICogICB8ICAgICAgICAgICAgICAgIHwgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgICAgIHwgICAqICAgfCAgICAtLS0tLS0+ICAgICB8ICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogICAgICB8ICAgKiAgIHwgICAgICAgICAgICAgICAgfCAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICAgICAgfCAgICogICB8ICAgICAgICAgICAgICAgIHwgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgICAgIHwgICoqKiAgfCAgICAgICAgICAgICAgICB8KioqfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogICAgICAtLS0tLS0tLS0gICAgICAgICAgICAgICAgLS0tLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBUVF9JbnQgICAgcm93cywgY291bnQ7CisgICAgVFRfTG9uZyAgIGxpbmVfbGVuOworICAgIFRUX0J5dGUqICBsaW5lOworCisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qIGZpcnN0IG9mIGFsbCwgY2hlY2tzIHRoZSB0b3AtbW9zdCBsaW5lcyBvZiB0aGUgYml0bWFwLCBhbmQgcmVtb3ZlcyAgKi8KKyAgICAvKiB0aGVtIGlmIHRoZXkncmUgZW1wdHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIHsKKyAgICAgIGxpbmUgICAgID0gKFRUX0J5dGUqKW1hcC0+YnVmZmVyOworICAgICAgcm93cyAgICAgPSBtYXAtPnJvd3M7CisgICAgICBsaW5lX2xlbiA9IG1hcC0+cGl0Y2g7CisKKworICAgICAgZm9yICggY291bnQgPSAwOyBjb3VudCA8IHJvd3M7IGNvdW50KysgKQorICAgICAgeworICAgICAgICBUVF9CeXRlKiAgY3VyICAgPSBsaW5lOworICAgICAgICBUVF9CeXRlKiAgbGltaXQgPSBsaW5lICsgbGluZV9sZW47CisKKworICAgICAgICBmb3IgKCA7IGN1ciA8IGxpbWl0OyBjdXIrKyApCisgICAgICAgICAgaWYgKCBjdXJbMF0gKQorICAgICAgICAgICAgZ290byBGb3VuZF9Ub3A7CisKKyAgICAgICAgLyogdGhlIGN1cnJlbnQgbGluZSB3YXMgZW1wdHkgLSBza2lwIHRvIG5leHQgb25lICovCisgICAgICAgIGxpbmUgID0gbGltaXQ7CisgICAgICB9CisKKyAgICBGb3VuZF9Ub3A6CisgICAgICAvKiBjaGVjayB0aGF0IHdlIGhhdmUgYXQgbGVhc3Qgb25lIGZpbGxlZCBsaW5lICovCisgICAgICBpZiAoIGNvdW50ID49IHJvd3MgKQorICAgICAgICBnb3RvIEVtcHR5X0JpdG1hcDsKKworICAgICAgLyogbm93LCBjcm9wIHRoZSBlbXB0eSB1cHBlciBsaW5lcyAqLworICAgICAgaWYgKCBjb3VudCA+IDAgKQorICAgICAgeworICAgICAgICBsaW5lID0gKFRUX0J5dGUqKW1hcC0+YnVmZmVyOworCisgICAgICAgIE1FTV9Nb3ZlKCBsaW5lLCBsaW5lICsgY291bnQgKiBsaW5lX2xlbiwgKHJvd3MgLSBjb3VudCkgKiBsaW5lX2xlbiApOworCisgICAgICAgIG1ldHJpY3MtPmhlaWdodCAgICAgICAtPSBjb3VudDsKKyAgICAgICAgbWV0cmljcy0+aG9yaUJlYXJpbmdZIC09IGNvdW50OworICAgICAgICBtZXRyaWNzLT52ZXJ0QmVhcmluZ1kgLT0gY291bnQ7CisKKyAgICAgICAgbWFwLT5yb3dzIC09IGNvdW50OworICAgICAgICByb3dzICAgICAgLT0gY291bnQ7CisgICAgICB9CisgICAgfQorCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiBzZWNvbmQsIGNyb3AgdGhlIGxvd2VyIGxpbmVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIHsKKyAgICAgIGxpbmUgPSAoVFRfQnl0ZSopbWFwLT5idWZmZXIgKyAocm93cyAtIDEpICogbGluZV9sZW47CisKKyAgICAgIGZvciAoIGNvdW50ID0gMDsgY291bnQgPCByb3dzOyBjb3VudCsrICkKKyAgICAgIHsKKyAgICAgICAgVFRfQnl0ZSogIGN1ciAgID0gbGluZTsKKyAgICAgICAgVFRfQnl0ZSogIGxpbWl0ID0gbGluZSArIGxpbmVfbGVuOworCisKKyAgICAgICAgZm9yICggOyBjdXIgPCBsaW1pdDsgY3VyKysgKQorICAgICAgICAgIGlmICggY3VyWzBdICkKKyAgICAgICAgICAgIGdvdG8gRm91bmRfQm90dG9tOworCisgICAgICAgIC8qIHRoZSBjdXJyZW50IGxpbmUgd2FzIGVtcHR5IC0gc2tpcCB0byBwcmV2aW91cyBvbmUgKi8KKyAgICAgICAgbGluZSAtPSBsaW5lX2xlbjsKKyAgICAgIH0KKworICAgIEZvdW5kX0JvdHRvbToKKyAgICAgIGlmICggY291bnQgPiAwICkKKyAgICAgIHsKKyAgICAgICAgbWV0cmljcy0+aGVpZ2h0IC09IGNvdW50OworICAgICAgICByb3dzICAgICAgICAgICAgLT0gY291bnQ7CisgICAgICAgIG1hcC0+cm93cyAgICAgICAtPSBjb3VudDsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qIHRoaXJkLCBnZXQgcmlkIG9mIHRoZSBzcGFjZSBvbiB0aGUgbGVmdCBzaWRlIG9mIHRoZSBnbHlwaCAgICAgICAgICAgKi8KKyAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgZG8KKyAgICB7CisgICAgICBUVF9CeXRlKiAgbGltaXQ7CisKKworICAgICAgbGluZSAgPSAoVFRfQnl0ZSopbWFwLT5idWZmZXI7CisgICAgICBsaW1pdCA9IGxpbmUgKyByb3dzICogbGluZV9sZW47CisKKyAgICAgIGZvciAoIDsgbGluZSA8IGxpbWl0OyBsaW5lICs9IGxpbmVfbGVuICkKKyAgICAgICAgaWYgKCBsaW5lWzBdICYgMHg4MCApCisgICAgICAgICAgZ290byBGb3VuZF9MZWZ0OworCisgICAgICAvKiBzaGlmdCB0aGUgd2hvbGUgZ2x5cGggb25lIHBpeGVsIHRvIHRoZSBsZWZ0ICovCisgICAgICBsaW5lICA9IChUVF9CeXRlKiltYXAtPmJ1ZmZlcjsKKyAgICAgIGxpbWl0ID0gbGluZSArIHJvd3MgKiBsaW5lX2xlbjsKKworICAgICAgZm9yICggOyBsaW5lIDwgbGltaXQ7IGxpbmUgKz0gbGluZV9sZW4gKQorICAgICAgeworICAgICAgICBUVF9JbnQgICAgbiwgd2lkdGggPSBtYXAtPndpZHRoOworICAgICAgICBUVF9CeXRlICAgb2xkOworICAgICAgICBUVF9CeXRlKiAgY3VyID0gbGluZTsKKworCisgICAgICAgIG9sZCA9IGN1clswXSA8PCAxOworICAgICAgICBmb3IgKCBuID0gODsgbiA8IHdpZHRoOyBuICs9IDggKQorICAgICAgICB7CisgICAgICAgICAgVFRfQnl0ZSAgdmFsOworCisKKyAgICAgICAgICB2YWwgICAgPSBjdXJbMV07CisgICAgICAgICAgY3VyWzBdID0gb2xkIHwgKHZhbCA+PiA3KTsKKyAgICAgICAgICBvbGQgICAgPSB2YWwgPDwgMTsKKyAgICAgICAgICBjdXIrKzsKKyAgICAgICAgfQorICAgICAgICBjdXJbMF0gPSBvbGQ7CisgICAgICB9CisKKyAgICAgIG1hcC0+d2lkdGgtLTsKKyAgICAgIG1ldHJpY3MtPmhvcmlCZWFyaW5nWCsrOworICAgICAgbWV0cmljcy0+dmVydEJlYXJpbmdYKys7CisgICAgICBtZXRyaWNzLT53aWR0aC0tOworICAgIH0gd2hpbGUgKCBtYXAtPndpZHRoID4gMCApOworCisgIEZvdW5kX0xlZnQ6CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qIGZpbmFsbHksIGNyb3AgdGhlIGJpdG1hcCB3aWR0aCB0byBnZXQgcmlkIG9mIHRoZSBzcGFjZSBvbiB0aGUgcmlnaHQgKi8KKyAgICAvKiBzaWRlIG9mIHRoZSBnbHlwaC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGRvCisgICAgeworICAgICAgVFRfSW50ICAgIHJpZ2h0ID0gbWFwLT53aWR0aC0xOworICAgICAgVFRfQnl0ZSogIGxpbWl0OworICAgICAgVFRfQnl0ZSAgIG1hc2s7CisKKworICAgICAgbGluZSAgPSAoVFRfQnl0ZSopbWFwLT5idWZmZXIgKyAocmlnaHQgPj4gMyk7CisgICAgICBsaW1pdCA9IGxpbmUgKyByb3dzKmxpbmVfbGVuOworICAgICAgbWFzayAgPSAweDgwID4+IChyaWdodCAmIDcpOworCisgICAgICBmb3IgKCA7IGxpbmUgPCBsaW1pdDsgbGluZSArPSBsaW5lX2xlbiApCisgICAgICAgIGlmICggbGluZVswXSAmIG1hc2sgKQorICAgICAgICAgIGdvdG8gRm91bmRfUmlnaHQ7CisKKyAgICAgIC8qIGNyb3AgdGhlIHdob2xlIGdseXBoIHRvIHRoZSByaWdodCAqLworICAgICAgbWFwLT53aWR0aC0tOworICAgICAgbWV0cmljcy0+d2lkdGgtLTsKKyAgICB9IHdoaWxlICggbWFwLT53aWR0aCA+IDAgKTsKKworICBGb3VuZF9SaWdodDoKKyAgICAvKiBhbGwgcmlnaHQsIHRoZSBiaXRtYXAgd2FzIGNyb3BwZWQgKi8KKyAgICByZXR1cm47CisKKyAgRW1wdHlfQml0bWFwOgorICAgIG1hcC0+d2lkdGggICAgICA9IDA7CisgICAgbWFwLT5yb3dzICAgICAgID0gMDsKKyAgICBtYXAtPnBpdGNoICAgICAgPSAwOworICAgIG1hcC0+cGl4ZWxfbW9kZSA9IGZ0X3BpeGVsX21vZGVfbW9ubzsKKyAgfQorCisKKyAgc3RhdGljCisgIFRUX0Vycm9yIExvYWRfU0JpdF9TaW5nbGUoIEZUX0JpdG1hcCogICAgICAgIG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfSW50ICAgICAgICAgICAgeF9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX0ludCAgICAgICAgICAgIHlfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9JbnQgICAgICAgICAgICBwaXhfYml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfVVNob3J0ICAgICAgICAgaW1hZ2VfZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9TQml0X01ldHJpY3MqICBtZXRyaWNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gICAgICAgICBzdHJlYW0gKQorICB7CisgICAgVFRfRXJyb3IgIGVycm9yOworCisKKyAgICAvKiBjaGVjayB0aGF0IHRoZSBzb3VyY2UgYml0bWFwIGZpdHMgaW50byB0aGUgdGFyZ2V0IHBpeG1hcCAqLworICAgIGlmICggeF9vZmZzZXQgPCAwIHx8IHhfb2Zmc2V0ICsgbWV0cmljcy0+d2lkdGggID4gbWFwLT53aWR0aCB8fAorICAgICAgICAgeV9vZmZzZXQgPCAwIHx8IHlfb2Zmc2V0ICsgbWV0cmljcy0+aGVpZ2h0ID4gbWFwLT5yb3dzICApCisgICAgeworICAgICAgZXJyb3IgPSBUVF9FcnJfSW52YWxpZF9Bcmd1bWVudDsKKworICAgICAgZ290byBFeGl0OworICAgIH0KKworICAgIHsKKyAgICAgIFRUX0ludCAgZ2x5cGhfd2lkdGggID0gbWV0cmljcy0+d2lkdGg7CisgICAgICBUVF9JbnQgIGdseXBoX2hlaWdodCA9IG1ldHJpY3MtPmhlaWdodDsKKyAgICAgIFRUX0ludCAgZ2x5cGhfc2l6ZTsKKyAgICAgIFRUX0ludCAgbGluZV9iaXRzICAgID0gcGl4X2JpdHMgKiBnbHlwaF93aWR0aDsKKyAgICAgIFRUX0Jvb2wgcGFkX2J5dGVzICAgID0gMDsKKworCisgICAgICAvKiBjb21wdXRlIHNpemUgb2YgZ2x5cGggaW1hZ2UgKi8KKyAgICAgIHN3aXRjaCAoIGltYWdlX2Zvcm1hdCApCisgICAgICB7CisgICAgICBjYXNlIDE6ICAvKiBieXRlLXBhZGRlZCBmb3JtYXRzICovCisgICAgICBjYXNlIDY6CisgICAgICAgIHsKKyAgICAgICAgICBUVF9JbnQgIGxpbmVfbGVuZ3RoOworCisKKyAgICAgICAgICBzd2l0Y2ggKCBwaXhfYml0cyApCisgICAgICAgICAgeworICAgICAgICAgIGNhc2UgMTogIGxpbmVfbGVuZ3RoID0gKGdseXBoX3dpZHRoKzcpID4+IDM7ICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAyOiAgbGluZV9sZW5ndGggPSAoZ2x5cGhfd2lkdGgrMykgPj4gMjsgICBicmVhazsKKyAgICAgICAgICBjYXNlIDQ6ICBsaW5lX2xlbmd0aCA9IChnbHlwaF93aWR0aCsxKSA+PiAxOyAgIGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6IGxpbmVfbGVuZ3RoID0gIGdseXBoX3dpZHRoOworICAgICAgICAgIH0KKworICAgICAgICAgIGdseXBoX3NpemUgPSBnbHlwaF9oZWlnaHQgKiBsaW5lX2xlbmd0aDsKKyAgICAgICAgICBwYWRfYnl0ZXMgID0gMTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgICAgY2FzZSAyOgorICAgICAgY2FzZSA1OgorICAgICAgY2FzZSA3OgorICAgICAgICBsaW5lX2JpdHMgID0gIGdseXBoX3dpZHRoICogcGl4X2JpdHM7CisgICAgICAgIGdseXBoX3NpemUgPSAoZ2x5cGhfaGVpZ2h0ICogbGluZV9iaXRzICsgNykgPj4gMzsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6ICAvKiBpbnZhbGlkIGZvcm1hdCAqLworICAgICAgICByZXR1cm4gVFRfRXJyX0ludmFsaWRfRmlsZV9Gb3JtYXQ7CisgICAgICB9CisKKyAgICAgIC8qIE5vdyByZWFkIGRhdGEgYW5kIGRyYXcgZ2x5cGggaW50byB0YXJnZXQgcGl4bWFwICAgICAgICovCisgICAgICBpZiAoIEFDQ0VTU19GcmFtZSggZ2x5cGhfc2l6ZSApICkKKyAgICAgICAgZ290byBFeGl0OworCisgICAgICAvKiBkb24ndCBmb3JnZXQgdG8gbXVsdGlwbHkgYHhfb2Zmc2V0JyBieSBgbWFwLT5waXhfYml0cycgYXMgKi8KKyAgICAgIC8qIHRoZSBzYml0IGJsaXR0ZXIgZG9lc24ndCBtYWtlIGEgZGlmZmVyZW5jZSBiZXR3ZWVuIHBpeG1hcCAqLworICAgICAgLyogZGVwdGhzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICBibGl0X3NiaXQoIG1hcCwgc3RyZWFtLT5jdXJzb3IsIGxpbmVfYml0cywgcGFkX2J5dGVzLAorICAgICAgICAgICAgICAgICB4X29mZnNldCAqIHBpeF9iaXRzLCB5X29mZnNldCApOworCisgICAgICBGT1JHRVRfRnJhbWUoKTsKKyAgICB9CisKKyAgRXhpdDoKKyAgICByZXR1cm4gZXJyb3I7CisgIH0KKworCisgIHN0YXRpYworICBUVF9FcnJvciBMb2FkX1NCaXRfSW1hZ2UoIFRUX1NCaXRfU3RyaWtlKiAgIHN0cmlrZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9TQml0X1JhbmdlKiAgICByYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9VTG9uZyAgICAgICAgICBlYmR0X3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9VTG9uZyAgICAgICAgICBnbHlwaF9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQml0bWFwKiAgICAgICAgbWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX0ludCAgICAgICAgICAgIHhfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX0ludCAgICAgICAgICAgIHlfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgICAgICAgIHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9TQml0X01ldHJpY3MqICBtZXRyaWNzICkKKyAgeworICAgIEZUX01lbW9yeSAgICAgICAgICAgIG1lbW9yeSA9IHN0cmVhbS0+bWVtb3J5OworICAgIFRUX0Vycm9yICAgICAgICAgICAgIGVycm9yOworCisKKyAgICAvKiBwbGFjZSBzdHJlYW0gYXQgYmVnaW5uaW5nIG9mIGdseXBoIGRhdGEgYW5kIHJlYWQgbWV0cmljcyAqLworICAgIGlmICggRklMRV9TZWVrKCBlYmR0X3BvcyArIGdseXBoX29mZnNldCApICkKKyAgICAgIGdvdG8gRXhpdDsKKworICAgIGVycm9yID0gTG9hZF9TQml0X01ldHJpY3MoIHN0cmVhbSwgcmFuZ2UsIG1ldHJpY3MgKTsKKyAgICBpZiAoIGVycm9yICkKKyAgICAgIGdvdG8gRXhpdDsKKworICAgIC8qIHRoaXMgZnVuY3Rpb24gaXMgcmVjdXJzaXZlLiAgQXQgdGhlIHRvcC1sZXZlbCBjYWxsLCB0aGUgKi8KKyAgICAvKiBmaWVsZCBtYXAuYnVmZmVyIGlzIE5VTEwuICBXZSB0aHVzIGJlZ2luIGJ5IGZpbmRpbmcgdGhlICovCisgICAgLyogZGltZW5zaW9ucyBvZiB0aGUgaGlnaGVyLWxldmVsIGdseXBoIHRvIGFsbG9jYXRlIHRoZSAgICAqLworICAgIC8qIGZpbmFsIHBpeG1hcCBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBpZiAoIG1hcC0+YnVmZmVyID09IDAgKQorICAgIHsKKyAgICAgIFRUX0xvbmcgIHNpemU7CisKKworICAgICAgbWFwLT53aWR0aCAgICA9IG1ldHJpY3MtPndpZHRoOworICAgICAgbWFwLT5yb3dzICAgICA9IG1ldHJpY3MtPmhlaWdodDsKKworICAgICAgc3dpdGNoICggc3RyaWtlLT5iaXRfZGVwdGggKQorICAgICAgeworICAgICAgY2FzZSAxOgorICAgICAgICBtYXAtPnBpeGVsX21vZGUgPSBmdF9waXhlbF9tb2RlX21vbm87IAorICAgICAgICBtYXAtPnBpdGNoICAgICAgPSAobWFwLT53aWR0aCs3KSA+PiAzOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMjoKKyAgICAgICAgbWFwLT5waXhlbF9tb2RlID0gZnRfcGl4ZWxfbW9kZV9wYWwyOyAKKyAgICAgICAgbWFwLT5waXRjaCAgICAgID0gKG1hcC0+d2lkdGgrMykgPj4gMjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDQ6CisgICAgICAgIG1hcC0+cGl4ZWxfbW9kZSA9IGZ0X3BpeGVsX21vZGVfcGFsNDsgCisgICAgICAgIG1hcC0+cGl0Y2ggICAgICA9IChtYXAtPndpZHRoKzEpID4+IDE7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA4OgorICAgICAgICBtYXAtPnBpeGVsX21vZGUgPSBmdF9waXhlbF9tb2RlX2dyYXlzOyAKKyAgICAgICAgbWFwLT5waXRjaCAgICAgID0gbWFwLT53aWR0aDsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBUVF9FcnJfSW52YWxpZF9GaWxlX0Zvcm1hdDsKKyAgICAgIH0KKworICAgICAgc2l6ZSA9IG1hcC0+cm93cyAqIG1hcC0+cGl0Y2g7CisKKyAgICAgIC8qIGNoZWNrIHRoYXQgdGhlcmUgaXMgbm8gZW1wdHkgaW1hZ2UgKi8KKyAgICAgIGlmICggc2l6ZSA9PSAwICkKKyAgICAgICAgZ290byBFeGl0OyAgICAgLyogZXhpdCBzdWNjZXNzZnVsbHkhICovCisKKyAgICAgIGlmICggQUxMT0MoIG1hcC0+YnVmZmVyLCBzaXplICkgKQorICAgICAgICBnb3RvIEV4aXQ7CisgICAgfQorCisgICAgc3dpdGNoICggcmFuZ2UtPmltYWdlX2Zvcm1hdCApCisgICAgeworICAgIGNhc2UgMTogIC8qIHNpbmdsZSBzYml0IGltYWdlIC0gbG9hZCBpdCAqLworICAgIGNhc2UgMjoKKyAgICBjYXNlIDU6CisgICAgY2FzZSA2OgorICAgIGNhc2UgNzoKKyAgICAgIHJldHVybiBMb2FkX1NCaXRfU2luZ2xlKCBtYXAsIHhfb2Zmc2V0LCB5X29mZnNldCwgc3RyaWtlLT5iaXRfZGVwdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UtPmltYWdlX2Zvcm1hdCwgbWV0cmljcywgc3RyZWFtICk7CisKKyAgICBjYXNlIDg6ICAvKiBjb21wb3VuZCBmb3JtYXQgKi8KKyAgICBjYXNlIDk6CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6IC8qIGludmFsaWQgaW1hZ2UgZm9ybWF0ICovCisgICAgICByZXR1cm4gVFRfRXJyX0ludmFsaWRfRmlsZV9Gb3JtYXQ7CisgICAgfQorCisgICAgLyogQWxsIHJpZ2h0LCB3ZSdyZSBpbiBhIGNvbXBvdW5kIGZvcm1hdC4gIEZpcnN0IG9mIGFsbCwgcmVhZCAqLworICAgIC8qIHRoZSBhcnJheSBvZiBlbGVtZW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICB7CisgICAgICBUVF9TQml0X0NvbXBvbmVudCogIGNvbXBvbmVudHM7CisgICAgICBUVF9TQml0X0NvbXBvbmVudCogIGNvbXA7CisgICAgICBUVF9VU2hvcnQgICAgICAgICAgIG51bV9jb21wb25lbnRzLCBjb3VudDsKKworCisgICAgICBpZiAoIFJFQURfVVNob3J0KCBudW1fY29tcG9uZW50cyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fAorICAgICAgICAgICBBTExPQ19BUlJBWSggY29tcG9uZW50cywgbnVtX2NvbXBvbmVudHMsIFRUX1NCaXRfQ29tcG9uZW50ICkgKQorICAgICAgICBnb3RvIEV4aXQ7CisKKyAgICAgIGNvdW50ID0gbnVtX2NvbXBvbmVudHM7CisKKyAgICAgIGlmICggQUNDRVNTX0ZyYW1lKCA0TCAqIG51bV9jb21wb25lbnRzICkgKQorICAgICAgICBnb3RvIEZhaWxfTWVtb3J5OworCisgICAgICBmb3IgKCBjb21wID0gY29tcG9uZW50czsgY291bnQgPiAwOyBjb3VudC0tLCBjb21wKysgKQorICAgICAgeworICAgICAgICBjb21wLT5nbHlwaF9jb2RlID0gR0VUX1VTaG9ydCgpOworICAgICAgICBjb21wLT54X29mZnNldCAgID0gR0VUX0NoYXIoKTsKKyAgICAgICAgY29tcC0+eV9vZmZzZXQgICA9IEdFVF9DaGFyKCk7CisgICAgICB9CisKKyAgICAgIEZPUkdFVF9GcmFtZSgpOworCisgICAgICAvKiBOb3cgcmVjdXJzaXZlbHkgbG9hZCBlYWNoIGVsZW1lbnQgZ2x5cGggKi8KKyAgICAgIGNvdW50ID0gbnVtX2NvbXBvbmVudHM7CisgICAgICBjb21wICA9IGNvbXBvbmVudHM7CisgICAgICBmb3IgKCA7IGNvdW50ID4gMDsgY291bnQtLSwgY29tcCsrICkKKyAgICAgIHsKKyAgICAgICAgVFRfU0JpdF9SYW5nZSogICBlbGVtX3JhbmdlOworICAgICAgICBUVF9TQml0X01ldHJpY3MgIGVsZW1fbWV0cmljczsKKyAgICAgICAgVFRfVUxvbmcgICAgICAgICBlbGVtX29mZnNldDsKKworCisgICAgICAgIC8qIGZpbmQgdGhlIHJhbmdlIGZvciB0aGlzIGVsZW1lbnQgKi8KKyAgICAgICAgZXJyb3IgPSBGaW5kX1NCaXRfUmFuZ2UoIGNvbXAtPmdseXBoX2NvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpa2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZWxlbV9yYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlbGVtX29mZnNldCApOworICAgICAgICBpZiAoIGVycm9yICkKKyAgICAgICAgICBnb3RvIEZhaWxfTWVtb3J5OworCisgICAgICAgIC8qIG5vdyBsb2FkIHRoZSBlbGVtZW50LCByZWN1cnNpdmVseSAqLworICAgICAgICBlcnJvciA9IExvYWRfU0JpdF9JbWFnZSggc3RyaWtlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbV9yYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGViZHRfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbV9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4X29mZnNldCArIGNvbXAtPnhfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeV9vZmZzZXQgKyBjb21wLT55X29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlbGVtX21ldHJpY3MgKTsKKyAgICAgICAgaWYgKCBlcnJvciApCisgICAgICAgICAgZ290byBGYWlsX01lbW9yeTsKKyAgICAgIH0KKworICAgIEZhaWxfTWVtb3J5OgorICAgICAgRlJFRSggY29tcG9uZW50cyApOworICAgIH0KKworICBFeGl0OgorICAgIHJldHVybiBlcnJvcjsKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfTG9hZF9TQml0X0ltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgTG9hZHMgYSBnaXZlbiBnbHlwaCBzYml0IGltYWdlIGZyb20gdGhlIGZvbnQgcmVzb3VyY2UuICBUaGlzIGFsc28gICovCisgIC8qICAgIHJldHVybnMgaXRzIG1ldHJpY3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZhY2UgICAgICAgIDo6IFRoZSB0YXJnZXQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgeF9wcGVtICAgICAgOjogVGhlIGhvcml6b250YWwgcmVzb2x1dGlvbiBpbiBwb2ludHMgcGVyIEVNLiAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB5X3BwZW0gICAgICA6OiBUaGUgdmVydGljYWwgcmVzb2x1dGlvbiBpbiBwb2ludHMgcGVyIEVNLiAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGdseXBoX2luZGV4IDo6IFRoZSBjdXJyZW50IGdseXBoIGluZGV4LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgc3RyZWFtICAgICAgOjogVGhlIGlucHV0IHN0cmVhbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbWFwICAgICAgICAgOjogVGhlIHRhcmdldCBwaXhtYXAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG1ldHJpY3MgICAgIDo6IEEgYmlnIHNiaXQgbWV0cmljcyBzdHJ1Y3R1cmUgZm9yIHRoZSBnbHlwaCBpbWFnZS4gICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRydWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICBSZXR1cm5zIGFuIGVycm9yIGlmIG5vICAgICAqLworICAvKiAgICBnbHlwaCBzYml0IGV4aXN0cyBmb3IgdGhlIGluZGV4LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGUgYG1hcC5idWZmZXInIGZpZWxkIGlzIGFsd2F5cyBmcmVlZCBiZWZvcmUgdGhlIGdseXBoIGlzIGxvYWRlZC4gKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIExPQ0FMX0ZVTkMKKyAgVFRfRXJyb3IgIFRUX0xvYWRfU0JpdF9JbWFnZSggVFRfRmFjZSAgICAgICAgICAgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfSW50ICAgICAgICAgICAgeF9wcGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9JbnQgICAgICAgICAgICB5X3BwZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX1VJbnQgICAgICAgICAgIGdseXBoX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gICAgICAgICBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0JpdG1hcCogICAgICAgIG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfU0JpdF9NZXRyaWNzKiAgbWV0cmljcyApCisgIHsKKyAgICBUVF9FcnJvciAgICAgICAgIGVycm9yOworICAgIEZUX01lbW9yeSAgICAgICAgbWVtb3J5ID0gc3RyZWFtLT5tZW1vcnk7CisgICAgVFRfVUxvbmcgICAgICAgICBlYmR0X3BvcywgZ2x5cGhfb2Zmc2V0OworCisgICAgVFRfU0JpdF9TdHJpa2UqICBzdHJpa2U7CisgICAgVFRfU0JpdF9SYW5nZSogICByYW5nZTsKKworCisgICAgLyogQ2hlY2sgd2hldGhlciB0aGVyZSBpcyBhIGdseXBoIHNiaXQgZm9yIHRoZSBjdXJyZW50IGluZGV4ICovCisgICAgZXJyb3IgPSBGaW5kX1NCaXRfSW1hZ2UoIGZhY2UsIGdseXBoX2luZGV4LCB4X3BwZW0sIHlfcHBlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJhbmdlLCAmc3RyaWtlLCAmZ2x5cGhfb2Zmc2V0ICk7CisgICAgaWYgKCBlcnJvciApCisgICAgICBnb3RvIEV4aXQ7CisKKyAgICAvKiBub3csIGZpbmQgdGhlIGxvY2F0aW9uIG9mIHRoZSBgRUJEVCcgdGFibGUgaW4gKi8KKyAgICAvKiB0aGUgZm9udCBmaWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBlcnJvciA9IGZhY2UtPmdvdG9fdGFibGUoIGZhY2UsIFRUQUdfRUJEVCwgc3RyZWFtLCAwICk7CisgICAgaWYgKGVycm9yKSBnb3RvIEV4aXQ7CisgICAgCisgICAgZWJkdF9wb3MgPSBGSUxFX1BvcygpOworCisgICAgLyogY2xlYXIgdGhlIGJpdG1hcCAmIGxvYWQgdGhlIGJpdG1hcCAqLworICAgIEZSRUUoIG1hcC0+YnVmZmVyICk7CisgICAgbWFwLT5yb3dzID0gbWFwLT5waXRjaCA9IG1hcC0+d2lkdGggPSAwOworCisgICAgZXJyb3IgPSBMb2FkX1NCaXRfSW1hZ2UoIHN0cmlrZSwgcmFuZ2UsIGViZHRfcG9zLCBnbHlwaF9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcCwgMCwgMCwgc3RyZWFtLCBtZXRyaWNzICk7CisgICAgaWYgKCBlcnJvciApCisgICAgICBnb3RvIEV4aXQ7CisKKyAgICAvKiBzZXR1cCB2ZXJ0aWNhbCBtZXRyaWNzIGlmIG5lZWRlZCAqLworICAgIGlmICggc3RyaWtlLT5mbGFncyAmIDEgKQorICAgIHsKKyAgICAgIC8qIGluIGNhc2Ugb2YgYSBob3Jpem9udGFsIHN0cmlrZSBvbmx5ICovCisgICAgICBGVF9JbnQgIGFkdmFuY2U7CisgICAgICBGVF9JbnQgIHRvcDsKKworCisgICAgICBhZHZhbmNlID0gc3RyaWtlLT5ob3JpLmFzY2VuZGVyIC0gc3RyaWtlLT5ob3JpLmRlc2NlbmRlcjsKKyAgICAgIHRvcCAgICAgPSBhZHZhbmNlIC8gMTA7CisKKyAgICAgIG1ldHJpY3MtPnZlcnRCZWFyaW5nWCA9IC1tZXRyaWNzLT53aWR0aCAvIDI7CisgICAgICBtZXRyaWNzLT52ZXJ0QmVhcmluZ1kgPSAgYWR2YW5jZSAvIDEwOworICAgICAgbWV0cmljcy0+dmVydEFkdmFuY2UgID0gIGFkdmFuY2UgKiAxMiAvIDEwOworICAgIH0KKworICAgIC8qIENyb3AgdGhlIGJpdG1hcCBub3cgKi8KKyAgICBDcm9wX0JpdG1hcCggbWFwLCBtZXRyaWNzICk7CisKKyAgRXhpdDoKKyAgICByZXR1cm4gZXJyb3I7CisgIH0KKworCisvKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9zZm50L3R0c2JpdC5oIGIvc3JjL3NmbnQvdHRzYml0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE0Y2VhZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9zZm50L3R0c2JpdC5oCkBAIC0wLDAgKzEsMTA0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICB0dHNiaXQuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgVHJ1ZVR5cGUgYW5kIE9wZW5UeXBlIGVtYmVkZGVkIGJpdG1hcCBzdXBwb3J0IChzcGVjaWZpY2F0aW9uKS4gICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDE5OTYtMTk5OSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkICAgICAgICAqLworLyogIG1vZGlmaWVkIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAgKi8KKy8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCisvKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLworLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNpZm5kZWYgVFRTQklUX0gKKyNkZWZpbmUgVFRTQklUX0gKKworI2luY2x1ZGUgPHR0bG9hZC5oPgorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfTG9hZF9TQml0X1N0cmlrZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgTG9hZHMgdGhlIHRhYmxlIG9mIGVtYmVkZGVkIGJpdG1hcCBzaXplcyBmb3IgdGhpcyBmYWNlLiAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZmFjZSAgIDo6IFRoZSB0YXJnZXQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHN0cmVhbSA6OiBUaGUgaW5wdXQgc3RyZWFtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRydWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgTE9DQUxfREVGCisgIFRUX0Vycm9yICBUVF9Mb2FkX1NCaXRfU3RyaWtlcyggVFRfRmFjZSAgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgc3RyZWFtICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUVF9GcmVlX1NCaXRfU3RyaWtlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBSZWxlYXNlcyB0aGUgZW1iZWRkZWQgYml0bWFwIHRhYmxlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBmYWNlIDo6IFRoZSB0YXJnZXQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIExPQ0FMX0RFRgorICB2b2lkICBUVF9GcmVlX1NCaXRfU3RyaWtlcyggVFRfRmFjZSAgZmFjZSApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfTG9hZF9TQml0X0ltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgTG9hZHMgYSBnaXZlbiBnbHlwaCBzYml0IGltYWdlIGZyb20gdGhlIGZvbnQgcmVzb3VyY2UuICBUaGlzIGFsc28gICovCisgIC8qICAgIHJldHVybnMgaXRzIG1ldHJpY3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZhY2UgICAgICAgIDo6IFRoZSB0YXJnZXQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgeF9wcGVtICAgICAgOjogVGhlIGhvcml6b250YWwgcmVzb2x1dGlvbiBpbiBwb2ludHMgcGVyIEVNLiAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB5X3BwZW0gICAgICA6OiBUaGUgdmVydGljYWwgcmVzb2x1dGlvbiBpbiBwb2ludHMgcGVyIEVNLiAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGdseXBoX2luZGV4IDo6IFRoZSBjdXJyZW50IGdseXBoIGluZGV4LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgc3RyZWFtICAgICAgOjogVGhlIGlucHV0IHN0cmVhbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbWFwICAgICAgICAgOjogVGhlIHRhcmdldCBwaXhtYXAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG1ldHJpY3MgICAgIDo6IEEgYmlnIHNiaXQgbWV0cmljcyBzdHJ1Y3R1cmUgZm9yIHRoZSBnbHlwaCBpbWFnZS4gICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRydWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICBSZXR1cm5zIGFuIGVycm9yIGlmIG5vICAgICAqLworICAvKiAgICBnbHlwaCBzYml0IGV4aXN0cyBmb3IgdGhlIGluZGV4LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGUgYG1hcC5idWZmZXInIGZpZWxkIGlzIGFsd2F5cyBmcmVlZCBiZWZvcmUgdGhlIGdseXBoIGlzIGxvYWRlZC4gKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIExPQ0FMX0RFRgorICBUVF9FcnJvciAgVFRfTG9hZF9TQml0X0ltYWdlKCBUVF9GYWNlICAgICAgICAgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9JbnQgICAgICAgICAgICB4X3BwZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX0ludCAgICAgICAgICAgIHlfcHBlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfVUludCAgICAgICAgICAgZ2x5cGhfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgICAgICAgIHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQml0bWFwKiAgICAgICAgbWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9TQml0X01ldHJpY3MqICBtZXRyaWNzICk7CisKKworI2VuZGlmIC8qIFRUU0JJVF9IICovCisKKworLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvc2hhcmVkL290bGF5b3V0L290bGF5b3V0LmggYi9zcmMvc2hhcmVkL290bGF5b3V0L290bGF5b3V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTYwNmNmYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9zaGFyZWQvb3RsYXlvdXQvb3RsYXlvdXQuaApAQCAtMCwwICsxLDM3MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgb3RsYXlvdXQuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9wZW5UeXBlIGxheW91dCB0eXBlIGRlZmluaXRpb25zIChzcGVjaWZpY2F0aW9uIG9ubHkpLiAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAxOTk2LTE5OTkgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCAgICAgICAgKi8KKy8qICBtb2RpZmllZCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgICovCisvKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLworLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KKy8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjaWZuZGVmIE9UTEFZT1VUX0gKKyNkZWZpbmUgT1RMQVlPVVRfSAorCisjaW5jbHVkZSA8dHR0eXBlcy5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBPVExfTGFuZ1N5cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBbiBPVEwgTGFuZ1N5cyByZWNvcmQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBsYW5nX3RhZyAgICAgICAgICAgIDo6IFRoZSBsYW5ndWFnZSB0YWcuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbGFuZ19vZmZzZXQgICAgICAgICA6OiBUaGUgb2Zmc2V0IG9mIHRoZSBsYW5nc3lzIGRhdGEgaW4gdGhlCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbG9va3VwX29yZGVyICAgICAgICA6OiBBbHdheXMgMCBmb3IgT1RMIDEuMC4gICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHJlcV9mZWF0dXJlX2luZGV4ICAgOjogVGhlIGByZXF1aXJlZCBmZWF0dXJlJyBpbmRleC4gICAgICAgICAgICAgICAqLworICAvKiAgICBudW1fZmVhdHVyZV9pbmRpY2VzIDo6IFRoZSBudW1iZXIgb2YgZmVhdHVyZSBpbmRpY2VzLiAgICAgICAgICAgICAgKi8KKyAgLyogICAgZmVhdHVyZV9pbmRpY2VzICAgICA6OiBBbiBhcnJheSBvZiBmZWF0dXJlIGluZGljZXMuICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHN0cnVjdCAgT1RMX0xhbmdTeXNfCisgIHsKKyAgICBUVF9VTG9uZyAgICBsYW5nX3RhZzsKKyAgICBUVF9VTG9uZyAgICBsYW5nX29mZnNldDsKKworICAgIFRUX1VTaG9ydCAgIGxvb2t1cF9vcmRlcjsgICAgICAgICAgIC8qIGFsd2F5cyAwIGZvciBUVCBPcGVuIDEuMCAgKi8KKyAgICBUVF9VU2hvcnQgICByZXFfZmVhdHVyZV9pbmRleDsgICAgICAvKiByZXF1aXJlZCBGZWF0dXJlSW5kZXggICAgICovCisgICAgVFRfVVNob3J0ICAgbnVtX2ZlYXR1cmVfaW5kaWNlczsgICAgLyogbnVtYmVyIG9mIEZlYXR1cmUgaW5kaWNlcyAqLworICAgIFRUX1VTaG9ydCogIGZlYXR1cmVfaW5kaWNlczsgICAgICAgIC8qIGFycmF5IG9mIEZlYXR1cmUgaW5kaWNlcyAgKi8KKworICB9IE9UTF9MYW5nU3lzOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgT1RMX1NjcmlwdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQW4gT1RMIFNjcmlwdCByZWNvcmQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgc2NyaXB0X3RhZyAgICAgIDo6IFRoZSBzY3JpcHQgdGFnLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHNjcmlwdF9vZmZzZXQgICA6OiBUaGUgb2Zmc2V0IG9mIHRoZSBzY3JpcHQgZGF0YSBpbiB0aGUgcmVzb3VyY2UuICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbnVtX2xhbmdzeXMgICAgIDo6IFRoZSBudW1iZXIgb2YgbGFuZ3N5cyByZWNvcmRzLiAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGxhbmdzeXMgICAgICAgICA6OiBBbiBhcnJheSBvZiBsYW5nc3lzIHJlY29yZHMuICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBsYW5nc3lzX2RlZmF1bHQgOjogQSBwb2ludGVyIHRvIHRoZSBkZWZhdWx0IGxhbmdzeXMgdGFibGUgZm9yIHRoaXMgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHN0cnVjdCAgT1RMX1NjcmlwdF8KKyAgeworICAgIFRUX1VMb25nICAgICAgc2NyaXB0X3RhZzsKKyAgICBUVF9VTG9uZyAgICAgIHNjcmlwdF9vZmZzZXQ7CisKKyAgICBUVF9VU2hvcnQgICAgIG51bV9sYW5nc3lzOworICAgIE9UTF9MYW5nU3lzKiAgbGFuZ3N5czsKKyAgICBPVExfTGFuZ1N5cyogIGxhbmdzeXNfZGVmYXVsdDsKKworICB9IE9UTF9TY3JpcHQ7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBPVExfU2NyaXB0X0xpc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBbiBPVEwgU2NyaXB0IExpc3QgcmVjb3JkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBudW1fc2NyaXB0cyA6OiBUaGUgbnVtYmVyIG9mIHNjcmlwdHMgcmVjb3Jkcy4gICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgc2NyaXB0cyAgICAgOjogQW4gYXJyYXkgb2Ygc2NyaXB0IHJlY29yZHMuICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHN0cnVjdCAgT1RMX1NjcmlwdF9MaXN0XworICB7CisgICAgVFRfVVNob3J0ICAgIG51bV9zY3JpcHRzOworICAgIE9UTF9TY3JpcHQqICBzY3JpcHRzOworCisgIH0gT1RMX1NjcmlwdF9MaXN0OworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgT1RMX0ZlYXR1cmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQW4gT1RMIEZlYXR1cmUgcmVjb3JkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZmVhdHVyZV90YWcgICAgOjogVGhlIGZlYXR1cmUgdGFnLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZlYXR1cmVfb2Zmc2V0IDo6IFRoZSBvZmZzZXQgb2YgdGhlIGZlYXR1cmUgZGF0YSBpbiB0aGUgcmVzb3VyY2UuICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZmVhdHVyZV9wYXJhbXMgOjogQWx3YXlzIDAgZm9yIE9wZW5UeXBlIExheW91dCAxLjAuICAgICAgICAgICAgICAgICovCisgIC8qICAgIG51bV9sb29rdXBzICAgIDo6IFRoZSBudW1iZXIgb2YgbG9va3VwIGluZGljZXMuICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBsb29rdXBzICAgICAgICA6OiBBbiBhcnJheSBvZiBsb29rdXAgaW5kaWNlcy4gICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgc3RydWN0ICBPVExfRmVhdHVyZV8KKyAgeworICAgIFRUX1VMb25nICAgIGZlYXR1cmVfdGFnOworICAgIFRUX1VMb25nICAgIGZlYXR1cmVfb2Zmc2V0OworCisgICAgVFRfVVNob3J0ICAgZmVhdHVyZV9wYXJhbXM7ICAgIC8qIGFsd2F5cyAwIGZvciBPcGVuVHlwZSBMYXlvdXQgMS4wICovCisgICAgVFRfVVNob3J0ICAgbnVtX2xvb2t1cHM7CisgICAgVFRfVVNob3J0KiAgbG9va3VwczsKKworICB9IE9UTF9GZWF0dXJlOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgT1RMX0ZlYXR1cmVfTGlzdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQW4gT1RMIEZlYXR1cmUgTGlzdCByZWNvcmQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbnVtX2ZlYXR1cmVzIDo6IFRoZSBudW1iZXIgb2YgZmVhdHVyZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZlYXR1cmVzICAgICA6OiBBbiBhcnJheSBvZiBmZWF0dXJlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBzdHJ1Y3QgIE9UTF9GZWF0dXJlX0xpc3RfCisgIHsKKyAgICBUVF9VU2hvcnQgICAgIG51bV9mZWF0dXJlczsKKyAgICBPVExfRmVhdHVyZSogIGZlYXR1cmVzOworCisgIH0gT1RMX0ZlYXR1cmVfTGlzdDsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIE9UTF9Mb29rdXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEFuIE9UTCBMb29rdXAgcmVjb3JkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGxvb2t1cF9vZmZzZXQgICAgOjogVGhlIG9mZnNldCBvZiB0aGUgbG9va3VwIGRhdGEgaW4gdGhlIHJlc291cmNlLiAqLworICAvKiAgICBsb29rdXBfdHlwZSAgICAgIDo6IFRoZSBsb29rdXAgdHlwZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbG9va3VwX2ZsYWcgICAgICA6OiBUaGUgbG9va3VwIGJpdCBmbGFncy4gICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBudW1fc3VidGFibGVzICAgIDo6IFRoZSBudW1iZXIgb2Ygc3VidGFibGVzLiAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgc3VidGFibGVfb2Zmc2V0cyA6OiBBbiBhcnJheSBvZiBvZmZzZXRzIHRvIHRoZSBzdWJ0YWJsZXMuICAgICAgICAgICovCisgIC8qICAgIHN1YnRhYmxlcyAgICAgICAgOjogQW4gYXJyYXkgb2YgcG9pbnRlcnMgdG8gdGhlIHN1YnRhYmxlIHJlY29yZHMuICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoZSBmb3JtYXQgb2YgZWFjaCBsb29rdXAgc3ViLXRhYmxlIGlzIGRldGVybWluZWQgYnkgdGhlIHBhcmVudCAgICAqLworICAvKiAgICBPcGVuVHlwZSB0YWJsZSwgYW5kIGNhbm5vdCBiZSBrbm93biBoZXJlLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoZSBgc3VidGFibGVfb2Zmc2V0cycgYXJyYXkgaXMgZmlsbGVkIHdoZW4gdGhlIGxvb2t1cCB0YWJsZSBpcyAgICAqLworICAvKiAgICBsb2FkZWQgdGhlIGZpcnN0IHRpbWUuICBJdCBpcyB1cCB0byBPVCB0YWJsZSBoYW5kbGVycyB0byByZWFkIHRoZSAgKi8KKyAgLyogICAgY29ycmVzcG9uZGluZyBzdWItdGFibGUgcmVjb3JkcyBhbmQgc3RvcmUgdGhlbSBpbiB0aGUgYHN1YnRhYmxlcycgICovCisgIC8qICAgIGFycmF5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBzdHJ1Y3QgIE9UTF9Mb29rdXBfCisgIHsKKyAgICBUVF9VTG9uZyAgIGxvb2t1cF9vZmZzZXQ7CisgICAgVFRfVVNob3J0ICBsb29rdXBfdHlwZTsKKyAgICBUVF9VU2hvcnQgIGxvb2t1cF9mbGFnOworCisgICAgVFRfVVNob3J0ICBudW1fc3VidGFibGVzOworICAgIFRUX1VMb25nKiAgc3VidGFibGVfb2Zmc2V0czsKKyAgICB2b2lkKiogICAgIHN1YnRhYmxlczsKKworICB9IE9UTF9Mb29rdXA7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBPVExfTG9va3VwX0xpc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBbiBPVEwgTG9va3VwIExpc3QgcmVjb3JkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBudW1fbG9va3VwcyA6OiBUaGUgbnVtYmVyIG9mIGxvb2t1cHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbG9va3VwcyAgICAgOjogQW4gYXJyYXkgb2YgbG9va3Vwcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHN0cnVjdCAgT1RMX0xvb2t1cF9MaXN0XworICB7CisgICAgVFRfVVNob3J0ICAgIG51bV9sb29rdXBzOworICAgIE9UTF9Mb29rdXAqICBsb29rdXBzOworCisgIH0gT1RMX0xvb2t1cF9MaXN0OworCisKKyNkZWZpbmUgT1RMX0xPT0tVUF9GTEFHX1JJR0hUX1RPX0xFRlQgICAgICAgMQorI2RlZmluZSBPVExfTE9PS1VQX0ZMQUdfSUdOT1JFX0JBU0VfR0xZUEhTICAyCisjZGVmaW5lIE9UTF9MT09LVVBfRkxBR19JR05PUkVfTElHQVRVUkVTICAgIDQKKyNkZWZpbmUgT1RMX0xPT0tVUF9GTEFHX0lHTk9SRV9NQVJLUyAgICAgICAgOAorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgT1RMX1N1YlRhYmxlMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhlIGZpcnN0IGdlbmVyaWMgT1RMIHN1Yi10YWJsZSBmb3JtYXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbnVtX2luZGljZXMgOjogVGhlIG51bWJlciBvZiBpbmRpY2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGluZGljZXMgICAgIDo6IEFuIGFycmF5IG9mIGluZGljZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBkYXRhICAgICAgICA6OiBBIGdlbmVyaWMgdmFsdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgc3RydWN0ICBPVExfU3ViVGFibGUxXworICB7CisgICAgVFRfVVNob3J0ICAgbnVtX2luZGljZXM7CisgICAgVFRfVVNob3J0KiAgaW5kaWNlczsKKyAgICBUVF9VU2hvcnQgICBkYXRhOworCisgIH0gT1RMX1N1YlRhYmxlMTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIE9UTF9TdWJUYWJsZTJfUmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgcmVjb3JkIGZvciB0aGUgc2Vjb25kIGdlbmVyaWMgT1RMIHN1Yi10YWJsZSBmb3JtYXQuICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHN0YXJ0IDo6IFRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSByYW5nZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBlbmQgICA6OiBUaGUgbGFzdCBlbGVtZW50IGluIHRoZSByYW5nZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZGF0YSAgOjogQSBnZW5lcmljIHZhbHVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHN0cnVjdCAgT1RMX1N1YlRhYmxlMl9SZWNfCisgIHsKKyAgICBUVF9VU2hvcnQgIHN0YXJ0OworICAgIFRUX1VTaG9ydCAgZW5kOworICAgIFRUX1VTaG9ydCAgZGF0YTsKKworICB9IE9UTF9TdWJUYWJsZTJfUmVjOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgT1RMX1N1YlRhYmxlMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhlIHNlY29uZCBnZW5lcmljIE9UTCBzdWItdGFibGUgZm9ybWF0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbnVtX3JhbmdlcyA6OiBUaGUgbnVtYmVyIG9mIHJhbmdlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHJhbmdlcyAgICAgOjogQW4gYXJyYXkgb2YgcmFuZ2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBzdHJ1Y3QgIE9UTF9TdWJUYWJsZTJfCisgIHsKKyAgICBUVF9VU2hvcnQgICAgICAgICAgIG51bV9yYW5nZXM7CisgICAgT1RMX1N1YlRhYmxlMl9SZWMqICByYW5nZXM7CisKKyAgfSBPVExfU3ViVGFibGUyOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgT1RMX1N1YlRhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSBnZW5lcmljIE9UTCBzdWItdGFibGUgd2hpY2ggaXMgYSB1bmlvbiBvZiB0d28gcG9zc2libGUgZm9ybWF0cyAgICovCisgIC8qICAgIGp1c3QgZGVmaW5lZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZvcm1hdCA6OiBUaGUgZm9ybWF0IG9mIHRoZSBzdWItdGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzZXQgICAgOjogQSB1bmlvbiBvZiBgZm9ybWF0MScgYW5kIGBmb3JtYXQyJywgcmVwcmVzZW50aW5nICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgIHN1Yi10YWJsZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHN0cnVjdCAgT1RMX1N1YlRhYmxlXworICB7CisgICAgVFRfVVNob3J0ICBmb3JtYXQ7CisKKyAgICB1bmlvbgorICAgIHsKKyAgICAgIE9UTF9TdWJUYWJsZTEgIGZvcm1hdDE7CisgICAgICBPVExfU3ViVGFibGUyICBmb3JtYXQyOworCisgICAgfSBzZXQ7CisKKyAgfSBPVExfU3ViVGFibGU7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBPVExfQ292ZXJhZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBbiBPVEwgQ292ZXJhZ2Ugc3ViLXRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgT1RMX1N1YlRhYmxlICAgICAgIE9UTF9Db3ZlcmFnZTsKKyAgdHlwZWRlZiBPVExfU3ViVGFibGUxICAgICAgT1RMX0NvdmVyYWdlMTsKKyAgdHlwZWRlZiBPVExfU3ViVGFibGUyICAgICAgT1RMX0NvdmVyYWdlMjsKKyAgdHlwZWRlZiBPVExfU3ViVGFibGUyX1JlYyAgT1RMX0NvdmVyYWdlMl9SZWM7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBPVExfQ2xhc3NfRGVmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBbiBPVEwgQ2xhc3MgRGVmaW5pdGlvbiBzdWItdGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgT1RMX1N1YlRhYmxlICAgICAgIE9UTF9DbGFzc19EZWY7CisgIHR5cGVkZWYgT1RMX1N1YlRhYmxlMSAgICAgIE9UTF9DbGFzc19EZWYxOworICB0eXBlZGVmIE9UTF9TdWJUYWJsZTIgICAgICBPVExfQ2xhc3NfRGVmMjsKKyAgdHlwZWRlZiBPVExfU3ViVGFibGUyX1JlYyAgT1RMX0NsYXNzX0RlZjJfUmVjOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgT1RMX0RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQW4gT1RMIERldmljZSBzdWItdGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgc3RhcnRfc2l6ZSAgIDo6IFRoZSBzbWFsbGVzdCBzaXplIHRvIGNvcnJlY3QuICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGVuZF9zaXplICAgICA6OiBUaGUgbGFyZ2VzdCBzaXplIHRvIGNvcnJlY3QuICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBkZWx0YV9mb3JtYXQgOjogVGhlIGZvcm1hdCBvZiB0aGUgYGRlbHRhX3ZhbHVlcycgYXJyYXkuICAgICAgICAgICAgKi8KKyAgLyogICAgZGVsdGFfdmFsdWVzIDo6IEFuIGFycmF5IG9mIGNvbXByZXNzZWQgZGVsdGEgdmFsdWVzLiAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgc3RydWN0ICBPVExfRGV2aWNlXworICB7CisgICAgVFRfVVNob3J0ICAgc3RhcnRfc2l6ZTsKKyAgICBUVF9VU2hvcnQgICBlbmRfc2l6ZTsKKyAgICBUVF9VU2hvcnQgICBkZWx0YV9mb3JtYXQ7CisgICAgVFRfVVNob3J0KiAgZGVsdGFfdmFsdWVzOworCisgIH0gT1RMX0RldmljZTsKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogT1RMQVlPVVRfSCAqLworCisKKy8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3NoYXJlZC9vdGxheW91dC9vdGxvYWQuYyBiL3NyYy9zaGFyZWQvb3RsYXlvdXQvb3Rsb2FkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzg2YmViMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9zaGFyZWQvb3RsYXlvdXQvb3Rsb2FkLmMKQEAgLTAsMCArMSw4OTAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIG90bG9hZC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPcGVuVHlwZSBMYXlvdXQgbG9hZGVyIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMTk5Ni0xOTk5IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQgICAgICAgICovCisvKiAgbW9kaWZpZWQgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICAqLworLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KKy8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCisvKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2luY2x1ZGUgPG90bGF5b3V0Lmg+CisjaW5jbHVkZSA8b3Rsb2FkLmg+CisKKyNpbmNsdWRlIDx0dGVycm9ycy5oPgorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKiBTY3JpcHQgcmVsYXRlZCBmdW5jdGlvbnMKKyAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIE9UTF9GcmVlX1NjcmlwdF9MaXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFJlbGVhc2VzIGEgZ2l2ZW4gT3BlblR5cGUgU2NyaXB0IGxpc3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGxpc3QgICA6OiBUaGUgdGFyZ2V0IHNjcmlwdCBsaXN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzeXN0ZW0gOjogVGhlIGN1cnJlbnQgc3lzdGVtIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIExPQ0FMX0ZVTkMKKyAgdm9pZCAgT1RMX0ZyZWVfU2NyaXB0X0xpc3QoIE9UTF9TY3JpcHRfTGlzdCogIGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TeXN0ZW0gICAgICAgICBzeXN0ZW0gKQorICB7CisgICAgaWYgKCBsaXN0ICkKKyAgICB7CisgICAgICBpZiAoIGxpc3QtPnNjcmlwdHMgKQorICAgICAgeworICAgICAgICBPVExfU2NyaXB0KiAgc2NyaXB0ICAgICAgID0gbGlzdC0+c2NyaXB0czsKKyAgICAgICAgT1RMX1NjcmlwdCogIHNjcmlwdF9saW1pdCA9IHNjcmlwdCArIGxpc3QtPm51bV9zY3JpcHRzOworCisKKyAgICAgICAgZm9yICggOyBzY3JpcHQgPCBzY3JpcHRfbGltaXQ7IHNjcmlwdCsrICkKKyAgICAgICAgeworICAgICAgICAgIGlmICggc2NyaXB0LT5sYW5nc3lzICkKKyAgICAgICAgICB7CisgICAgICAgICAgICBPVExfTGFuZ1N5cyogIGxhbmdzeXMgICAgICAgPSBzY3JpcHQtPmxhbmdzeXM7CisgICAgICAgICAgICBPVExfTGFuZ1N5cyogIGxhbmdzeXNfbGltaXQgPSBsYW5nc3lzICsgc2NyaXB0LT5udW1fbGFuZ3N5czsKKworCisgICAgICAgICAgICBmb3IgKCA7IGxhbmdzeXMgPCBsYW5nc3lzX2xpbWl0OyBsYW5nc3lzKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBGUkVFKCBsYW5nc3lzLT5mZWF0dXJlX2luZGljZXMgKTsKKyAgICAgICAgICAgICAgbGFuZ3N5cy0+bnVtX2ZlYXR1cmVfaW5kaWNlcyA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGUkVFKCBzY3JpcHQtPmxhbmdzeXMgKTsKKyAgICAgICAgICB9CisgICAgICAgICAgc2NyaXB0LT5sYW5nc3lzX2RlZmF1bHQgPSBOVUxMOworICAgICAgICAgIHNjcmlwdC0+bnVtX2xhbmdzeXMgICAgID0gMDsKKyAgICAgICAgfQorICAgICAgICBGUkVFKCBsaXN0LT5zY3JpcHRzICk7CisgICAgICB9CisgICAgICBsaXN0LT5udW1fc2NyaXB0cyA9IDA7CisgICAgfQorICB9CisKKworICBzdGF0aWMKKyAgVFRfRXJyb3IgIExvYWRfT1RMX0xhbmdTeXNfTGlzdCggT1RMX1NjcmlwdCogIHNjcmlwdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICAgIHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfVUxvbmcgICAgIGRlZmF1bHRfb2Zmc2V0ICkKKyAgeworICAgIEZUX1N5c3RlbSAgc3lzdGVtID0gc3RyZWFtLT5zeXN0ZW07CisgICAgVFRfRXJyb3IgICBlcnJvcjsKKworICAgIFRUX1VTaG9ydCAgICAgbiwgY291bnQ7CisgICAgT1RMX0xhbmdTeXMqICBsYW5nc3lzOworCisKKyAgICAvKiByZWFkIHRoZSBsYW5nc3lzIHRhZ3MgYW5kIG9mZnNldHMgKi8KKyAgICB7CisgICAgICBjb3VudCAgID0gc2NyaXB0LT5udW1fbGFuZ3N5czsKKyAgICAgIGxhbmdzeXMgPSBzY3JpcHQtPmxhbmdzeXM7CisKKyAgICAgIGlmICggQUNDRVNTX0ZyYW1lKCA2TCAqIGNvdW50ICkgKQorICAgICAgICBnb3RvIEV4aXQ7CisKKyAgICAgIGZvciAoIG4gPSAwOyBuIDwgY291bnQ7IG4rKywgbGFuZ3N5cysrICkKKyAgICAgIHsKKyAgICAgICAgVFRfVUxvbmcgIG9mZnNldDsKKworCisgICAgICAgIGxhbmdzeXMtPmxhbmdfdGFnID0gR0VUX1VMb25nKCk7CisgICAgICAgIG9mZnNldCAgICAgICAgICAgID0gR0VUX1VTaG9ydCgpOworCisgICAgICAgIGlmICggbGFuZ3N5cy0+bGFuZ19vZmZzZXQgPT0gZGVmYXVsdF9vZmZzZXQgKQorICAgICAgICAgIHNjcmlwdC0+bGFuZ3N5c19kZWZhdWx0ID0gbGFuZ3N5czsKKworICAgICAgICBsYW5nc3lzLT5sYW5nX29mZnNldCA9IG9mZnNldCArIHNjcmlwdC0+c2NyaXB0X29mZnNldDsKKyAgICAgIH0KKworICAgICAgRk9SR0VUX0ZyYW1lKCk7CisgICAgfQorCisgICAgLyogbm93IHJlYWQgZWFjaCBsYW5nc3lzIHJlY29yZCAqLworICAgIHsKKyAgICAgIGNvdW50ICAgPSBzY3JpcHQtPm51bV9sYW5nc3lzOworICAgICAgbGFuZ3N5cyA9IHNjcmlwdC0+bGFuZ3N5czsKKworICAgICAgZm9yICggbiA9IDA7IG4gPCBjb3VudDsgbisrLCBsYW5nc3lzKysgKQorICAgICAgeworICAgICAgICBUVF9VU2hvcnQgIG51bV9mZWF0dXJlX2luZGljZXMsIGk7CisKKworICAgICAgICBpZiAoIEZJTEVfU2VlayggbGFuZ3N5cy0+bGFuZ19vZmZzZXQgKSB8fAorICAgICAgICAgICAgIEFDQ0VTU19GcmFtZSggOEwgKSAgICAgICAgICAgICAgICApCisgICAgICAgICAgZ290byBFeGl0OworCisgICAgICAgIGxhbmdzeXMtPmxvb2t1cF9vcmRlciAgICAgICAgPSBHRVRfVUxvbmcoKTsKKyAgICAgICAgbGFuZ3N5cy0+cmVxX2ZlYXR1cmVfaW5kZXggICA9IEdFVF9VU2hvcnQoKTsKKyAgICAgICAgbGFuZ3N5cy0+bnVtX2ZlYXR1cmVfaW5kaWNlcyA9IEdFVF9VU2hvcnQoKTsKKworICAgICAgICBGT1JHRVRfRnJhbWUoKTsKKworICAgICAgICBudW1fZmVhdHVyZV9pbmRpY2VzID0gbGFuZ3N5cy0+bnVtX2ZlYXR1cmVfaW5kaWNlczsKKworICAgICAgICBpZiAoIEFMTE9DX0FSUkFZICggbGFuZ3N5cy0+ZmVhdHVyZV9pbmRpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX2ZlYXR1cmVfaW5kaWNlcywgVFRfVVNob3J0ICkgfHwKKyAgICAgICAgICAgICBBQ0NFU1NfRnJhbWUoIG51bV9mZWF0dXJlX2luZGljZXMgKiAyTCApICAgICAgICkKKyAgICAgICAgICBnb3RvIEV4aXQ7CisKKyAgICAgICAgZm9yICggaSA9IDA7IGkgPCBudW1fZmVhdHVyZV9pbmRpY2VzOyBpKysgKQorICAgICAgICAgIGxhbmdzeXMtPmZlYXR1cmVfaW5kaWNlc1tpXSA9IEdFVF9VU2hvcnQoKTsKKworICAgICAgICBGT1JHRVRfRnJhbWUoKTsKKyAgICAgIH0KKyAgICB9CisKKyAgRXhpdDoKKyAgICByZXR1cm4gZXJyb3I7CisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIE9UTF9Mb2FkX1NjcmlwdF9MaXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIExvYWRzIGFuIE9wZW5UeXBlIFNjcmlwdCBMaXN0IGZyb20gYSBmb250IHJlc291cmNlLiAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGxpc3QgICA6OiBUaGUgdGFyZ2V0IHNjcmlwdCBsaXN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzdHJlYW0gOjogVGhlIGlucHV0IHN0cmVhbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUcnVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIExPQ0FMX0ZVTkMKKyAgVFRfRXJyb3IgIE9UTF9Mb2FkX1NjcmlwdF9MaXN0KCBPVExfU2NyaXB0X0xpc3QqICBsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgICAgICAgIHN0cmVhbSApCisgIHsKKyAgICBGVF9TeXN0ZW0gIHN5c3RlbSA9IHN0cmVhbS0+c3lzdGVtOworICAgIFRUX0Vycm9yICAgZXJyb3I7CisKKyAgICBUVF9VTG9uZyAgICAgc3RhcnRfcG9zOworICAgIFRUX1VTaG9ydCAgICBudW1fc2NyaXB0czsKKyAgICBPVExfU2NyaXB0KiAgc2NyaXB0czsKKworCisgICAgc3RhcnRfcG9zID0gRklMRV9Qb3MoKTsKKworICAgIGlmICggUkVBRF9VU2hvcnQoIGxpc3QtPm51bV9zY3JpcHRzICkgKQorICAgICAgZ290byBFeGl0OworCisgICAgbnVtX3NjcmlwdHMgPSBsaXN0LT5udW1fc2NyaXB0czsKKworICAgIC8qIEFsbG9jYXRlIHRoZSBzY3JpcHRzIHRhYmxlLCByZWFkIHRoZWlyIHRhZ3MgYW5kIG9mZnNldHMgKi8KKyAgICB7CisgICAgICBUVF9VU2hvcnQgIG47CisKKworICAgICAgaWYgKCBBTExPQ19BUlJBWSggbGlzdC0+c2NyaXB0cywgbnVtX3NjcmlwdHMsIE9UTF9TY3JpcHQgKSB8fAorICAgICAgICAgICBBQ0NFU1NfRnJhbWUoIG51bV9zY3JpcHRzICogNkwgKSAgICAgICAgICAgICAgICAgICAgICApCisgICAgICAgIGdvdG8gRXhpdDsKKworICAgICAgc2NyaXB0cyA9IGxpc3QtPnNjcmlwdHM7CisKKyAgICAgIGZvciAoIG4gPSAwOyBuIDwgbnVtX3NjcmlwdHM7IG4rKyApCisgICAgICB7CisgICAgICAgIHNjcmlwdHNbbl0uc2NyaXB0X3RhZyAgICA9IEdFVF9VTG9uZygpOworICAgICAgICBzY3JpcHRzW25dLnNjcmlwdF9vZmZzZXQgPSBHRVRfVVNob3J0KCkgKyBzdGFydF9wb3M7CisgICAgICB9CisKKyAgICAgIEZPUkdFVF9GcmFtZSgpOworICAgIH0KKworICAgIC8qIG5vdyByZWFkIGVhY2ggc2NyaXB0IGluIHRoZSB0YWJsZSAqLworICAgIHsKKyAgICAgIFRUX1VTaG9ydCAgICBuOworICAgICAgT1RMX1NjcmlwdCogIHNjcmlwdCA9IHNjcmlwdHM7CisKKworICAgICAgZm9yICggbiA9IG51bV9zY3JpcHRzOyBuID4gMDsgbi0tLCBzY3JpcHQrKyApCisgICAgICB7CisgICAgICAgIFRUX1VMb25nICBkZWZhdWx0X2xhbmdzeXNfb2Zmc2V0OworCisKKyAgICAgICAgaWYgKCBGSUxFX1NlZWsgICggc2NyaXB0LT5zY3JpcHRfb2Zmc2V0ICkgICAgICAgICAgICB8fAorICAgICAgICAgICAgIFJFQURfVUxvbmcgKCBkZWZhdWx0X2xhbmdzeXNfb2Zmc2V0ICkgICAgICAgICAgIHx8CisgICAgICAgICAgICAgUkVBRF9VU2hvcnQoIHNjcmlwdC0+bnVtX2xhbmdzeXMgKSAgICAgICAgICAgICAgfHwKKyAgICAgICAgICAgICBBTExPQ19BUlJBWSggc2NyaXB0LT5sYW5nc3lzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHQtPm51bV9sYW5nc3lzLCBPVExfTGFuZ1N5cyApICkKKyAgICAgICAgICBnb3RvIEV4aXQ7CisKKyAgICAgICAgLyogcmVhZCB0aGUgY29ycmVzcG9uZGluZyBsYW5nc3lzIGxpc3QgKi8KKyAgICAgICAgZXJyb3IgPSBMb2FkX09UTF9MYW5nU3lzX0xpc3QoCisgICAgICAgICAgICAgICAgICAgICBzY3JpcHQsCisgICAgICAgICAgICAgICAgICAgICBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0X2xhbmdzeXNfb2Zmc2V0ICsgc2NyaXB0LT5zY3JpcHRfb2Zmc2V0ICk7CisgICAgICAgIGlmICggZXJyb3IgKQorICAgICAgICAgIGdvdG8gRXhpdDsKKyAgICAgIH0KKyAgICB9CisKKyAgRXhpdDoKKyAgICBpZiAoIGVycm9yICkKKyAgICAgIE9UTF9GcmVlX1NjcmlwdF9MaXN0KCBsaXN0LCBzeXN0ZW0gKTsKKworICAgIHJldHVybiBlcnJvcjsKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKiBGZWF0dXJlIExpc3QgcmVsYXRlZCBmdW5jdGlvbnMKKyAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIE9UTF9GcmVlX0ZlYXR1cmVzX0xpc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFJlbGVhc2VzIGEgZ2l2ZW4gT3BlblR5cGUgRmVhdHVyZXMgbGlzdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGxpc3QgICA6OiBUaGUgdGFyZ2V0IGZlYXR1cmUgbGlzdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzeXN0ZW0gOjogVGhlIGN1cnJlbnQgc3lzdGVtIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIExPQ0FMX0ZVTkMKKyAgdm9pZCAgT1RMX0ZyZWVfRmVhdHVyZXNfTGlzdCggT1RMX0ZlYXR1cmVfTGlzdCogIGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1N5c3RlbSAgICAgICAgICBzeXN0ZW0gKQorICB7CisgICAgaWYgKCBsaXN0ICkKKyAgICB7CisgICAgICBpZiAoIGxpc3QtPmZlYXR1cmVzICkKKyAgICAgIHsKKyAgICAgICAgT1RMX0ZlYXR1cmUqICBmZWF0dXJlICAgICAgID0gbGlzdC0+ZmVhdHVyZXM7CisgICAgICAgIE9UTF9GZWF0dXJlKiAgZmVhdHVyZV9saW1pdCA9IGZlYXR1cmUgKyBsaXN0LT5udW1fZmVhdHVyZXM7CisKKworICAgICAgICBmb3IgKCA7IGZlYXR1cmUgPCBmZWF0dXJlX2xpbWl0OyBmZWF0dXJlKysgKQorICAgICAgICB7CisgICAgICAgICAgRlJFRSggZmVhdHVyZS0+bG9va3VwcyApOworICAgICAgICAgIGZlYXR1cmUtPm51bV9sb29rdXBzID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIEZSRUUoIGxpc3QtPmZlYXR1cmVzICk7CisgICAgICB9CisgICAgICBsaXN0LT5udW1fZmVhdHVyZXMgPSAwOworICAgIH0KKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgT1RMX0xvYWRfRmVhdHVyZV9MaXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgTG9hZHMgYW4gT3BlblR5cGUgRmVhdHVyZSBMaXN0IGZyb20gYSBmb250IHJlc291cmNlLiAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbGlzdCAgIDo6IFRoZSB0YXJnZXQgZmVhdHVyZSBsaXN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHN0cmVhbSA6OiBUaGUgaW5wdXQgc3RyZWFtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRydWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgTE9DQUxfRlVOQworICBUVF9FcnJvciAgT1RMX0xvYWRfRmVhdHVyZV9MaXN0KCBPVExfRmVhdHVyZV9MaXN0KiAgbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICAgICAgICAgIHN0cmVhbSApCisgIHsKKyAgICBGVF9TeXN0ZW0gIHN5c3RlbSA9IHN0cmVhbS0+c3lzdGVtOworICAgIFRUX0Vycm9yICAgZXJyb3I7CisgICAgVFRfVUxvbmcgICBzdGFydF9wb3M7CisgICAgVFRfVVNob3J0ICBudW1fZmVhdHVyZXMsIG47CisKKworICAgIHN0YXJ0X3BvcyA9IEZJTEVfUG9zKCk7CisKKyAgICBpZiAoIFJFQURfVVNob3J0KCBudW1fZmVhdHVyZXMgKSApCisgICAgICBnb3RvIEV4aXQ7CisKKyAgICAvKiBhbGxvY2F0ZSB0aGUgZmVhdHVyZXMgYXJyYXkgYW5kIHJlYWQgdGhlaXIgdGFnIGFuZCBvZmZzZXQgKi8KKyAgICB7CisgICAgICBPVExfRmVhdHVyZSogIGZlYXR1cmU7CisgICAgICBPVExfRmVhdHVyZSogIGZlYXR1cmVfbGltaXQ7CisKKworICAgICAgaWYgKCBBTExPQ19BUlJBWSAoIGxpc3QtPmZlYXR1cmVzLCBudW1fZmVhdHVyZXMsIE9UTF9GZWF0dXJlICkgfHwKKyAgICAgICAgICAgQUNDRVNTX0ZyYW1lKCBudW1fZmVhdHVyZXMgKiA2TCApICAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgZ290byBFeGl0OworCisgICAgICBsaXN0LT5udW1fZmVhdHVyZXMgPSBudW1fZmVhdHVyZXM7CisgICAgICBmZWF0dXJlICAgICAgICAgICAgPSBsaXN0LT5mZWF0dXJlczsKKyAgICAgIGZlYXR1cmVfbGltaXQgICAgICA9IGZlYXR1cmUgKyBudW1fZmVhdHVyZXM7CisKKyAgICAgIGZvciAoIDsgZmVhdHVyZSA8IGZlYXR1cmVfbGltaXQ7IGZlYXR1cmUrKyApCisgICAgICB7CisgICAgICAgIGZlYXR1cmUtPmZlYXR1cmVfdGFnICAgID0gR0VUX1VMb25nKCk7CisgICAgICAgIGZlYXR1cmUtPmZlYXR1cmVfb2Zmc2V0ID0gR0VUX1VTaG9ydCgpICsgc3RhcnRfcG9zOworICAgICAgfQorCisgICAgICBGT1JHRVRfRnJhbWUoKTsKKyAgICB9CisKKyAgICAvKiBub3cgcmVhZCBlYWNoIGZlYXR1cmUgKi8KKyAgICB7CisgICAgICBPVExfRmVhdHVyZSogIGZlYXR1cmU7CisgICAgICBPVExfRmVhdHVyZSogIGZlYXR1cmVfbGltaXQ7CisKKworICAgICAgZmVhdHVyZSAgICAgICAgICAgID0gbGlzdC0+ZmVhdHVyZXM7CisgICAgICBmZWF0dXJlX2xpbWl0ICAgICAgPSBmZWF0dXJlICsgbnVtX2ZlYXR1cmVzOworCisgICAgICBmb3IgKCA7IGZlYXR1cmUgPCBmZWF0dXJlX2xpbWl0OyBmZWF0dXJlKysgKQorICAgICAgeworICAgICAgICBUVF9VU2hvcnQgICBudW1fbG9va3VwczsKKyAgICAgICAgVFRfVVNob3J0KiAgbG9va3VwOworICAgICAgICBUVF9VU2hvcnQqICBsb29rdXBfbGltaXQ7CisKKworICAgICAgICBpZiAoIEZJTEVfU2VlayAgICggZmVhdHVyZS0+ZmVhdHVyZV9vZmZzZXQgICkgfHwKKyAgICAgICAgICAgICBSRUFEX1VMb25nICAoIGZlYXR1cmUtPmZlYXR1cmVfcGFyYW1zICkgIHx8CisgICAgICAgICAgICAgUkVBRF9VU2hvcnQgKCBudW1fbG9va3VwcyApICAgICAgICAgICAgICB8fAorICAgICAgICAgICAgIEFMTE9DX0FSUkFZICggZmVhdHVyZS0+bG9va3VwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9sb29rdXBzLCBUVF9VU2hvcnQgKSAgIHx8CisgICAgICAgICAgICAgQUNDRVNTX0ZyYW1lKCBudW1fbG9va3VwcyAqIDJMICkgICAgICAgICApCisgICAgICAgICAgZ290byBFeGl0OworCisgICAgICAgIGZlYXR1cmUtPm51bV9sb29rdXBzID0gbnVtX2xvb2t1cHM7CisgICAgICAgIGxvb2t1cCAgICAgICAgICAgICAgID0gZmVhdHVyZS0+bG9va3VwczsKKyAgICAgICAgbG9va3VwX2xpbWl0ICAgICAgICAgPSBsb29rdXAgKyBudW1fbG9va3VwczsKKworICAgICAgICBmb3IgKCA7IGxvb2t1cCA8IGxvb2t1cF9saW1pdDsgbG9va3VwKysgKQorICAgICAgICAgIGxvb2t1cFswXSA9IEdFVF9VU2hvcnQoKTsKKworICAgICAgICBGT1JHRVRfRnJhbWUoKTsKKyAgICAgIH0KKyAgICB9CisKKyAgRXhpdDoKKyAgICBpZiAoIGVycm9yICkKKyAgICAgIE9UTF9GcmVlX0ZlYXR1cmVfTGlzdCggbGlzdCwgc3lzdGVtICk7CisKKyAgICByZXR1cm4gZXJyb3I7CisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKiBMb29rdXAgTGlzdCByZWxhdGVkIGZ1bmN0aW9ucworICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBPVExfSXRlcmF0ZV9Mb29rdXBfTGlzdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBTY2FucyBhbiBPcGVuVHlwZSBMb29rdXAgTGlzdC4gIFRoaXMgY2FuIGJlIHVzZWQgdG8gbG9hZCB0aGUgICAgICAgKi8KKyAgLyogICAgTG9va3VwIHN1Yi10YWJsZXMgaW4gYSBHU1VCIG9yIEdQT1MgbG9hZGVyLiAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbGlzdCAgICAgOjogVGhlIHNvdXJjZSBsaXN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGl0ZXJhdG9yIDo6IFRoZSBpdGVyYXRvciAtLSBhIGZ1bmN0aW9uIHdoaWNoIGlzIGNhbGxlZCBvbiBlYWNoICAgICAqLworICAvKiAgICAgICAgICAgICAgICBlbGVtZW50IG9mIHRoZSBsaXN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgY2xvc3VyZSAgOjogVXNlci1zcGVjaWZpZWQgZGF0YSB3aGljaCBpcyBwYXNzZWQgdG8gZWFjaCBpdGVyYXRvciAgICovCisgIC8qICAgICAgICAgICAgICAgIHdpdGggdGhlIGxvb2t1cCBlbGVtZW50IHBvaW50ZXIuICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIElmIG9uZSBpdGVyYXRvciBjYWxsIHJldHVybnMgYSBub24temVybyBgcmVzdWx0JywgdGhlIGxpc3QgcGFyc2luZyAqLworICAvKiAgICBpcyBhYm9ydGVkIGFuZCB0aGUgdmFsdWUgaXMgcmV0dXJuZWQgdG8gdGhlIGNhbGxlci4gIE90aGVyd2lzZSwgICAgKi8KKyAgLyogICAgdGhlIGZ1bmN0aW9uIHJldHVybnMgMCB3aGVuIHRoZSBsaXN0IGhhcyBiZWVuIHBhcnNlZCBjb21wbGV0ZWx5LiAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBMT0NBTF9GVU5DCisgIFRUX0Vycm9yICBPVExfSXRlcmF0ZV9Mb29rdXBfTGlzdCggT1RMX0xvb2t1cF9MaXN0KiAgICAgbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPVExfTG9va3VwX0l0ZXJhdG9yICBpdGVyYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgICAgICAgICBjbG9zdXJlICkKKyAgeworICAgIGludCAgcmVzdWx0ID0gMDsKKworCisgICAgaWYgKCBsaXN0LT5sb29rdXBzICkKKyAgICB7CisgICAgICBPVExfTG9va3VwKiAgbG9va3VwID0gbGlzdC0+bG9va3VwczsKKyAgICAgIE9UTF9Mb29rdXAqICBsaW1pdCAgPSBsb29rdXAgKyBsaXN0LT5udW1fbG9va3VwczsKKworCisgICAgICBmb3IgKCA7IGxvb2t1cCA8IGxpbWl0OyBsb29rdXArKyApCisgICAgICB7CisgICAgICAgIHJlc3VsdCA9IGl0ZXJhdG9yKCBsb29rdXAsIGNsb3N1cmUgKTsKKyAgICAgICAgaWYgKCByZXN1bHQgKQorICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBPVExfRnJlZV9Mb29rdXBfTGlzdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBSZWxlYXNlcyBhIGdpdmVuIE9wZW5UeXBlIExvb2t1cCBsaXN0LiAgVXNlcyBhIGRlc3RydWN0b3IgY2FsbGVkICAgKi8KKyAgLyogICAgdG8gZGVzdHJveSB0aGUgTG9va3VwIHN1Yi10YWJsZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbGlzdCAgICAgICA6OiBUaGUgdGFyZ2V0IGxvb2t1cCBsaXN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHN5c3RlbSAgICAgOjogVGhlIGN1cnJlbnQgc3lzdGVtIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBkZXN0cnVjdG9yIDo6IEEgZGVzdHJ1Y3RvciBmdW5jdGlvbiBjYWxsZWQgb24gZWFjaCBsb29rdXAgZWxlbWVudC4gKi8KKyAgLyogICAgICAgICAgICAgICAgICBDYW4gYmUgdXNlZCB0byBkZXN0cm95IHN1Yi10YWJsZXMuICBJZ25vcmVkIGlmIE5VTEwuICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBMT0NBTF9GVU5DCisgIHZvaWQgIE9UTF9GcmVlX0xvb2t1cF9MaXN0KCBPVExfTG9va3VwX0xpc3QqICAgICAgIGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TeXN0ZW0gICAgICAgICAgICAgIHN5c3RlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9UTF9Mb29rdXBfRGVzdHJ1Y3RvciAgZGVzdHJveSApCisgIHsKKyAgICBpZiAoIGxpc3QgKQorICAgIHsKKyAgICAgIGlmICggbGlzdC0+bG9va3VwcyApCisgICAgICB7CisgICAgICAgIE9UTF9Mb29rdXAqICBsb29rdXAgPSBsaXN0LT5sb29rdXBzOworICAgICAgICBPVExfTG9va3VwKiAgbGltaXQgID0gbG9va3VwICsgbGlzdC0+bnVtX2xvb2t1cHM7CisKKworICAgICAgICBmb3IgKCA7IGxvb2t1cCA8IGxpbWl0OyBsb29rdXArKyApCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoIGRlc3Ryb3kgKQorICAgICAgICAgICAgZGVzdHJveSggbG9va3VwLCBzeXN0ZW0gKTsKKworICAgICAgICAgIEZSRUUoIGxvb2t1cC0+c3VidGFibGVfb2Zmc2V0cyApOworICAgICAgICAgIGxvb2t1cC0+bnVtX3N1YnRhYmxlcyA9IDA7CisgICAgICAgIH0KKworICAgICAgICBGUkVFKCBsaXN0LT5sb29rdXBzICk7CisgICAgICB9CisgICAgfQorICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBPVExfTG9hZF9Mb29rdXBfTGlzdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBMb2FkcyBhbiBPcGVuVHlwZSBMb29rdXAgTGlzdCBmcm9tIGEgZm9udCByZXNvdXJjZS4gICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBsaXN0ICAgOjogVGhlIHRhcmdldCBsb29rdXAgbGlzdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgc3RyZWFtIDo6IFRoZSBpbnB1dCBzdHJlYW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVHJ1ZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhpcyBmdW5jdGlvbiBkb2VzIE5PVCBsb2FkIHRoZSBsb29rdXAgc3ViLXRhYmxlcy4gIEluc3RlYWQsIGl0ICAgICovCisgIC8qICAgIHN0b3JlcyB0aGUgZmlsZSBvZmZzZXRzIG9mIHRoZSBwYXJ0aWN1bGFyIHRhYmxlIGluIGVhY2ggbG9va3VwICAgICAqLworICAvKiAgICBlbGVtZW50LiAgSXQgaXMgdXAgdG8gdGhlIGNhbGxlciB0byBsb2FkIHRoZXNlIHN1Yi10YWJsZXMuICBUaGlzICAgKi8KKyAgLyogICAgY2FuIGJlIGRvbmUgbW9yZSBlYXNpbHkgd2l0aCBPVExfSXRlcmF0ZV9Mb29rdXBfTGlzdCgpLiAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBMT0NBTF9GVU5DCisgIFRUX0Vycm9yICBPVExfTG9hZF9Mb29rdXBfTGlzdCggT1RMX0xvb2t1cF9MaXN0KiAgbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gICAgICAgICBzdHJlYW0gKQorICB7CisgICAgRlRfU3lzdGVtICBzeXN0ZW0gPSBzdHJlYW0tPnN5c3RlbTsKKyAgICBUVF9FcnJvciAgIGVycm9yOworCisgICAgVFRfVVNob3J0ICBudW1fbG9va3VwczsKKyAgICBUVF9VTG9uZyAgIHN0YXJ0X3BvczsKKworCisgICAgc3RhcnRfcG9zID0gR0VUX1VMb25nKCk7CisKKyAgICBpZiAoIFJFQURfVVNob3J0KCBudW1fbG9va3VwcyApICkKKyAgICAgIGdvdG8gRXhpdDsKKworICAgIC8qIGFsbG9jYXRlIHRoZSBsb29rdXBzIGFycmF5IGFuZCByZWFkIHRoZWlyIHRhZ3MgYW5kIG9mZnNldCAqLworICAgIHsKKyAgICAgIFRUX1VTaG9ydCAgbjsKKworCisgICAgICBpZiAoIEFMTE9DX0FSUkFZICggbGlzdC0+bG9va3VwcywgbnVtX2xvb2t1cHMsIE9UTF9Mb29rdXAgKSB8fAorICAgICAgICAgICBBQ0NFU1NfRnJhbWUoIG51bV9sb29rdXBzICogMkwgKSAgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICBnb3RvIEV4aXQ7CisKKyAgICAgIGxpc3QtPm51bV9sb29rdXBzID0gbnVtX2xvb2t1cHM7CisgICAgICBmb3IgKCBuID0gMDsgbiA8IG51bV9sb29rdXBzOyBuKysgKQorICAgICAgICBsaXN0LT5sb29rdXBzW25dLmxvb2t1cF9vZmZzZXQgPSBzdGFydF9wb3MgKyBHRVRfVVNob3J0KCk7CisKKyAgICAgIEZPUkdFVF9GcmFtZSgpOworICAgIH0KKworICAgIC8qIG5vdyByZWFkIGVhY2ggbG9va3VwIHRhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogTk9URSB0aGF0IHdlIGRvbid0IGxvYWQgdGhlIHN1Yi10YWJsZXMgaGVyZSwgYnV0IHNpbXBseSAgKi8KKyAgICAvKiBzdG9yZSB0aGVpciBmaWxlIG9mZnNldHMgaW4gdGhlIGBzdWJ0YWJsZV9vZmZzZXRzJyBhcnJheSAqLworICAgIHsKKyAgICAgIE9UTF9Mb29rdXAqICBsb29rdXAgICAgICAgPSBsaXN0LT5sb29rdXBzOworICAgICAgT1RMX0xvb2t1cCogIGxvb2t1cF9saW1pdCA9IGxvb2t1cCArIG51bV9sb29rdXBzOworCisKKyAgICAgIGZvciAoIDsgbG9va3VwIDwgbG9va3VwX2xpbWl0OyBsb29rdXArKyApCisgICAgICB7CisgICAgICAgIFRUX1VTaG9ydCAgIG4sIG51bV9zdWJ0YWJsZXM7CisgICAgICAgIFRUX1VMb25nKiAgb2Zmc2V0czsKKworCisgICAgICAgIGlmICggRklMRV9TZWVrICAgKCBsb29rdXAtPmxvb2t1cF9vZmZzZXQgKSB8fAorICAgICAgICAgICAgIEFDQ0VTU19GcmFtZSggNkwgKSAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgIGdvdG8gRXhpdDsKKworICAgICAgICBsb29rdXAtPmxvb2t1cF90eXBlICAgPSBHRVRfVVNob3J0KCk7CisgICAgICAgIGxvb2t1cC0+bG9va3VwX2ZsYWcgICA9IEdFVF9VU2hvcnQoKTsKKyAgICAgICAgbG9va3VwLT5udW1fc3VidGFibGVzID0gR0VUX1VTaG9ydCgpOworCisgICAgICAgIG51bV9zdWJ0YWJsZXMgPSBsb29rdXAtPm51bV9zdWJ0YWJsZXM7CisKKyAgICAgICAgRk9SR0VUX0ZyYW1lKCk7CisKKyAgICAgICAgaWYgKCBBTExPQ19BUlJBWSAoIGxvb2t1cC0+c3VidGFibGVfb2Zmc2V0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9zdWJ0YWJsZXMsIFRUX1VMb25nICkgfHwKKyAgICAgICAgICAgICBBQ0NFU1NfRnJhbWUoIG51bV9zdWJ0YWJsZXMgKiAyTCApICAgICAgKQorICAgICAgICAgIGdvdG8gRXhpdDsKKworICAgICAgICBvZmZzZXRzID0gbG9va3VwLT5zdWJ0YWJsZV9vZmZzZXRzOworICAgICAgICBmb3IgKCBuID0gMDsgbiA8IG51bV9zdWJ0YWJsZXM7IG4rKyApCisgICAgICAgICAgb2Zmc2V0c1tuXSA9IGxvb2t1cC0+bG9va3VwX29mZnNldCArIEdFVF9VU2hvcnQoKTsKKworICAgICAgICBGT1JHRVRfRnJhbWUoKTsKKyAgICAgIH0KKyAgICB9CisKKyAgRXhpdDoKKyAgICBpZiAoIGVycm9yICkKKyAgICAgIE9UTF9GcmVlX0xvb2t1cF9MaXN0KCBsaXN0LCBzeXN0ZW0sIDAgKTsKKworICAgIHJldHVybiBlcnJvcjsKKyAgfQorCisKKyAgLyogZ2VuZXJpYyBzdWItdGFibGUgZnJlZWluZyBhbmQgbG9hZGluZyAqLworCisgIHN0YXRpYworICB2b2lkICBGcmVlX1N1YlRhYmxlKCBPVExfU3ViVGFibGUqICBzdWJ0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgRlRfU3lzdGVtICAgICAgc3lzdGVtICkKKyAgeworICAgIGlmICggc3VidGFibGUgKQorICAgIHsKKyAgICAgIHN3aXRjaCAoIHN1YnRhYmxlLT5mb3JtYXQgKQorICAgICAgeworICAgICAgY2FzZSAxOgorICAgICAgICB7CisgICAgICAgICAgT1RMX1N1YlRhYmxlMSogIHN0ID0gJnN1YnRhYmxlLT5zZXQuZm9ybWF0MTsKKworCisgICAgICAgICAgRlJFRSggc3QtPmluZGljZXMgKTsKKyAgICAgICAgICBzdC0+bnVtX2luZGljZXMgPSAwOworICAgICAgICAgIEZSRUUoIHN0ICk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgMjoKKyAgICAgICAgeworICAgICAgICAgIE9UTF9TdWJUYWJsZTIqICBzdCA9ICZzdWJ0YWJsZS0+c2V0LmZvcm1hdDI7CisKKworICAgICAgICAgIEZSRUUoIHN0LT5yYW5nZXMgKTsKKyAgICAgICAgICBzdC0+bnVtX3JhbmdlcyA9IDA7CisgICAgICAgICAgRlJFRSggc3QgKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIEZSRUUoIHN1YnRhYmxlICk7CisgICAgfQorICB9CisKKworICBzdGF0aWMKKyAgVFRfRXJyb3IgIExvYWRfU3ViVGFibGUoIE9UTF9TdWJUYWJsZSogIHN1YnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICAgICAgc3RyZWFtICkKKyAgeworICAgIEZUX1N5c3RlbSAgc3lzdGVtID0gc3RyZWFtLT5zeXN0ZW07CisgICAgVFRfRXJyb3IgICBlcnJvcjsKKworCisgICAgaWYgKCBSRUFEX1VTaG9ydCggc3VidGFibGUtPmZvcm1hdCApICkKKyAgICAgIGdvdG8gRXhpdDsKKworICAgIHN3aXRjaCAoIHN1YnRhYmxlLT5mb3JtYXQgKQorICAgIHsKKyAgICBjYXNlIDE6CisgICAgICB7CisgICAgICAgIE9UTF9TdWJUYWJsZTEqICBzdCA9ICZzdWJ0YWJsZS0+c2V0LmZvcm1hdDE7CisgICAgICAgIFRUX1VTaG9ydCAgICAgICBudW1faW5kaWNlcywgbjsKKworCisgICAgICAgIGlmICggUkVBRF9VU2hvcnQgKCBudW1faW5kaWNlcyApICAgICAgICAgICAgICAgICAgICAgICAgIHx8CisgICAgICAgICAgICAgQUxMT0NfQVJSQVkgKCBzdC0+aW5kaWNlcywgbnVtX2luZGljZXMsIFRUX1VTaG9ydCApIHx8CisgICAgICAgICAgICAgQUNDRVNTX0ZyYW1lKCBudW1faW5kaWNlcyAqIDJMICkgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICBnb3RvIEV4aXQ7CisKKyAgICAgICAgc3QtPm51bV9pbmRpY2VzID0gbnVtX2luZGljZXM7CisgICAgICAgIGZvciAoIG4gPSAwOyBuIDwgbnVtX2luZGljZXM7IG4rKyApCisgICAgICAgICAgc3QtPmluZGljZXNbbl0gPSBHRVRfVVNob3J0KCk7CisKKyAgICAgICAgRk9SR0VUX0ZyYW1lKCk7CisgICAgICB9CisKKyAgICBjYXNlIDI6CisgICAgICB7CisgICAgICAgIE9UTF9TdWJUYWJsZTIqICAgICAgc3QgPSAmc3VidGFibGUtPnNldC5mb3JtYXQyOworICAgICAgICBUVF9VU2hvcnQgICAgICAgICAgIG51bV9yYW5nZXMsIG47CisgICAgICAgIE9UTF9TdWJUYWJsZTJfUmVjKiAgcmFuZ2U7CisKKworICAgICAgICBpZiAoIFJFQURfVVNob3J0KCBudW1fcmFuZ2VzICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8CisgICAgICAgICAgICAgQUxMT0NfQVJSQVkoIHN0LT5yYW5nZXMsIG51bV9yYW5nZXMsIE9UTF9TdWJUYWJsZTJfUmVjICkgfHwKKyAgICAgICAgICAgICBBQ0NFU1NfRnJhbWUoIG51bV9yYW5nZXMgKiA2TCApICAgICAgICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgZ290byBFeGl0OworCisgICAgICAgIHN0LT5udW1fcmFuZ2VzID0gbnVtX3JhbmdlczsKKyAgICAgICAgcmFuZ2UgICAgICAgICAgPSBzdC0+cmFuZ2VzOworICAgICAgICBmb3IgKCA7IG51bV9yYW5nZXMgPiAwOyBudW1fcmFuZ2VzLS0sIHJhbmdlKysgKQorICAgICAgICB7CisgICAgICAgICAgcmFuZ2UtPnN0YXJ0ID0gR0VUX1VTaG9ydCgpOworICAgICAgICAgIHJhbmdlLT5lbmQgICA9IEdFVF9VU2hvcnQoKTsKKyAgICAgICAgICByYW5nZS0+ZGF0YSAgPSBHRVRfVVNob3J0KCk7CisgICAgICAgIH0KKworICAgICAgICBGT1JHRVRfRnJhbWUoKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIGVycm9yID0gVFRfRXJyX0ludmFsaWRfRmlsZV9Gb3JtYXQ7CisgICAgfQorCisgIEV4aXQ6CisgICAgaWYgKCBlcnJvciApCisgICAgICBGcmVlX1N1YlRhYmxlKCBzdWJ0YWJsZSwgc3lzdGVtICk7CisKKyAgICByZXR1cm4gZXJyb3I7CisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKiBDb3ZlcmFnZSByZWxhdGVkIGZ1bmN0aW9ucworICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBPVExfRnJlZV9Db3ZlcmFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBSZWxlYXNlcyBhIGdpdmVuIE9wZW5UeXBlIENvdmVyYWdlIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBjb3ZlcmFnZSA6OiBUaGUgdGFyZ2V0IGNvdmVyYWdlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgc3lzdGVtICAgOjogVGhlIGN1cnJlbnQgc3lzdGVtIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBMT0NBTF9GVU5DCisgIHZvaWQgIE9UTF9GcmVlX0NvdmVyYWdlKCBPVExfQ292ZXJhZ2UqICBjb3ZlcmFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1N5c3RlbSAgICAgIHN5c3RlbSApCisgIHsKKyAgICBGcmVlX1N1YlRhYmxlKCAoT1RMX1N1YlRhYmxlKiljb3ZlcmFnZSwgc3lzdGVtICk7CisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIE9UTF9Mb2FkX0NvdmVyYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIExvYWRzIGFuIE9wZW5UeXBlIENvdmVyYWdlIHRhYmxlIGZyb20gYSBmb250IHJlc291cmNlLiAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGNvdmVyYWdlIDo6IFRoZSB0YXJnZXQgY292ZXJhZ2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzdHJlYW0gICA6OiBUaGUgaW5wdXQgc3RyZWFtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUcnVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIExPQ0FMX0ZVTkMKKyAgVFRfRXJyb3IgIE9UTF9Mb2FkX0NvdmVyYWdlKCBPVExfQ292ZXJhZ2UqICBjb3ZlcmFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gICAgICBzdHJlYW0gKQorICB7CisgICAgcmV0dXJuIExvYWRfU3ViVGFibGUoIChPVExfU3ViVGFibGUqKWNvdmVyYWdlLCBzdHJlYW0gKTsKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICogQ2xhc3MgRGVmaW5pdGlvbiByZWxhdGVkIGZ1bmN0aW9ucworICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIE9UTF9GcmVlX0NsYXNzX0RlZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFJlbGVhc2VzIGEgZ2l2ZW4gT3BlblR5cGUgQ2xhc3MgRGVmaW5pdGlvbiB0YWJsZS4gICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGNsYXNzX2RlZiA6OiBUaGUgdGFyZ2V0IGNsYXNzIGRlZmluaXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzeXN0ZW0gICAgOjogVGhlIGN1cnJlbnQgc3lzdGVtIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIExPQ0FMX0ZVTkMKKyAgdm9pZCAgT1RMX0ZyZWVfQ2xhc3NfRGVmKCBPVExfQ2xhc3NfRGVmKiAgY2xhc3NfZGVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1N5c3RlbSAgICAgICBzeXN0ZW0gKQorICB7CisgICAgRnJlZV9TdWJUYWJsZSggKE9UTF9TdWJUYWJsZSopY2xhc3NfZGVmLCBzeXN0ZW0gKTsKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgT1RMX0xvYWRfQ2xhc3NfRGVmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgTG9hZHMgYW4gT3BlblR5cGUgQ2xhc3MgRGVmaW5pdGlvbiB0YWJsZSBmcm9tIGEgcmVzb3VyY2UuICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgY2xhc3NfZGVmIDo6IFRoZSB0YXJnZXQgY2xhc3MgZGVmaW5pdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHN0cmVhbSAgICA6OiBUaGUgaW5wdXQgc3RyZWFtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRydWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgTE9DQUxfRlVOQworICBUVF9FcnJvciAgT1RMX0xvYWRfQ2xhc3NfRGVmKCBPVExfQ2xhc3NfRGVmKiAgY2xhc3NfZGVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gICAgICAgc3RyZWFtICkKKyAgeworICAgIHJldHVybiBPVExfTG9hZF9TdWJUYWJsZSggKE9UTF9TdWJUYWJsZSopY2xhc3NfZGVmLCBzdHJlYW0gKTsKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICogRGV2aWNlIHJlbGF0ZWQgZnVuY3Rpb25zCisgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgT1RMX0ZyZWVfRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgUmVsZWFzZXMgYSBnaXZlbiBPcGVuVHlwZSBMYXlvdXQgRGV2aWNlIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZGV2aWNlICA6OiBUaGUgdGFyZ2V0IGRldmljZSB0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHN5c3RlbSAgOjogVGhlIGN1cnJlbnQgc3lzdGVtIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgTE9DQUxfRlVOQworICB2b2lkICBPVExfRnJlZV9EZXZpY2UoIE9UTF9EZXZpY2UqICBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3lzdGVtICAgIHN5c3RlbSApCisgIHsKKyAgICBpZiAoIGRldmljZSApCisgICAgeworICAgICAgRlJFRSggZGV2aWNlLT5kZWx0YV92YWx1ZXMgKTsKKyAgICAgIEZSRUUoIGRldmljZSApOworICAgIH0KKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgT1RMX0xvYWRfRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgTG9hZHMgYW4gT3BlblR5cGUgRGV2aWNlIHRhYmxlIGZyb20gYSBmb250IHJlc291cmNlLiAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZGV2aWNlIDo6IFRoZSB0YXJnZXQgZGV2aWNlIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHN0cmVhbSA6OiBUaGUgaW5wdXQgc3RyZWFtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRydWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgTE9DQUxfRlVOQworICBUVF9FcnJvciAgT1RMX0xvYWRfRGV2aWNlKCBPVExfRGV2aWNlKiAgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gICAgc3RyZWFtICkKKyAgeworICAgIEZUX1N5c3RlbSAgIHN5c3RlbSA9IHN0cmVhbS0+c3lzdGVtOworICAgIFRUX0Vycm9yICAgIGVycm9yOworICAgIFRUX1VTaG9ydCogIGRlbHRhczsKKyAgICBUVF9VU2hvcnQgICBudW1fZGVsdGFzLCBudW1fdmFsdWVzOworCisKKyAgICBpZiAoIEFDQ0VTU19GcmFtZSggNkwgKSApCisgICAgICBnb3RvIEV4aXQ7CisKKyAgICBkZXZpY2UtPnN0YXJ0X3NpemUgICA9IEdFVF9VU2hvcnQoKTsKKyAgICBkZXZpY2UtPmVuZF9zaXplICAgICA9IEdFVF9VU2hvcnQoKTsKKyAgICBkZXZpY2UtPmRlbHRhX2Zvcm1hdCA9IEdFVF9VU2hvcnQoKTsKKworICAgIEZPUkdFVF9GcmFtZSgpOworCisgICAgbnVtX2RlbHRhcyA9IGRldmljZS0+ZW5kX3NpemUgLSBkZXZpY2UtPnN0YXJ0X3NpemUgKyAxOworCisgICAgc3dpdGNoICggZGV2aWNlLT5kZWx0YV9mb3JtYXQgKQorICAgIHsKKyAgICBjYXNlIDE6CisgICAgICBudW1fdmFsdWVzID0gKCBudW1fZGVsdGFzICsgNyApID4+IDM7CisgICAgICBicmVhazsKKworICAgIGNhc2UgMjoKKyAgICAgIG51bV92YWx1ZXMgPSAoIG51bV9kZWx0YXMgKyAzICkgPj4gMjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAzOgorICAgICAgbnVtX3ZhbHVlcyA9ICggbnVtX2RlbHRhcyArIDEgKSA+PiAxOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgZXJyb3IgPSBUVF9FcnJfSW52YWxpZF9GaWxlX0Zvcm1hdDsKKyAgICAgIGdvdG8gRXhpdDsKKyAgICB9CisKKyAgICBpZiAoIEFMTE9DX0FSUkFZKCBkZWx0YXMsIG51bV92YWx1ZXMsIFRUX1VTaG9ydCApICkKKyAgICAgIGdvdG8gRXhpdDsKKworICAgIGlmICggIUFDQ0VTU19GcmFtZSggbnVtX3ZhbHVlcyAqIDJMICkgKQorICAgIHsKKyAgICAgIFRUX1VTaG9ydCAgbjsKKworCisgICAgICBmb3IgKCBuID0gMDsgbiA8IG51bV92YWx1ZXM7IG4rKyApCisgICAgICAgIGRlbHRhc1tuXSA9IEdFVF9VU2hvcnQoKTsKKworICAgICAgRk9SR0VUX0ZyYW1lKCk7CisKKyAgICAgIGRldmljZS0+ZGVsdGFfdmFsdWVzID0gZGVsdGFzOworICAgIH0KKyAgICBlbHNlCisgICAgICBGUkVFKCBkZWx0YXMgKTsKKworICBFeGl0OgorICAgIHJldHVybiBlcnJvcjsKKyAgfQorCisKKy8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3NoYXJlZC9vdGxheW91dC9vdGxvYWQuaCBiL3NyYy9zaGFyZWQvb3RsYXlvdXQvb3Rsb2FkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc3YmJhMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9zaGFyZWQvb3RsYXlvdXQvb3Rsb2FkLmgKQEAgLTAsMCArMSwyOTcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIG90bG9hZC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPcGVuVHlwZSBsYXlvdXQgbG9hZGVyIGZ1bmN0aW9ucyAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMTk5Ni0xOTk5IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQgICAgICAgICovCisvKiAgbW9kaWZpZWQgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICAqLworLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KKy8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCisvKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2lmbmRlZiBPVExPQURfSAorI2RlZmluZSBPVExPQURfSAorCisjaW5jbHVkZSA8b3RsYXlvdXQuaD4KKyNpbmNsdWRlIDxmdHN0cmVhbS5oPgorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgT1RMX0xvYWRfU2NyaXB0X0xpc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgTG9hZHMgYW4gT3BlblR5cGUgU2NyaXB0IExpc3QgZnJvbSBhIGZvbnQgcmVzb3VyY2UuICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbGlzdCAgIDo6IFRoZSB0YXJnZXQgc2NyaXB0IGxpc3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHN0cmVhbSA6OiBUaGUgaW5wdXQgc3RyZWFtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRydWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgTE9DQUxfREVGCisgIFRUX0Vycm9yICBPVExfTG9hZF9TY3JpcHRfTGlzdCggT1RMX1NjcmlwdF9MaXN0KiAgbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gICAgICAgICBzdHJlYW0gKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIE9UTF9Mb2FkX0ZlYXR1cmVfTGlzdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIExvYWRzIGFuIE9wZW5UeXBlIEZlYXR1cmUgTGlzdCBmcm9tIGEgZm9udCByZXNvdXJjZS4gICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGxpc3QgICA6OiBUaGUgdGFyZ2V0IGZlYXR1cmUgbGlzdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzdHJlYW0gOjogVGhlIGlucHV0IHN0cmVhbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUcnVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIExPQ0FMX0RFRgorICBUVF9FcnJvciAgT1RMX0xvYWRfRmVhdHVyZV9MaXN0KCBPVExfRmVhdHVyZV9MaXN0KiAgbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICAgICAgICAgIHN0cmVhbSApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgT1RMX0xvYWRfTG9va3VwX0xpc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgTG9hZHMgYW4gT3BlblR5cGUgTG9va3VwIExpc3QgZnJvbSBhIGZvbnQgcmVzb3VyY2UuICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbGlzdCAgIDo6IFRoZSB0YXJnZXQgbG9va3VwIGxpc3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHN0cmVhbSA6OiBUaGUgaW5wdXQgc3RyZWFtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRydWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoaXMgZnVuY3Rpb24gZG9lcyBOT1QgbG9hZCB0aGUgbG9va3VwIHN1Yi10YWJsZXMuICBJbnN0ZWFkLCBpdCAgICAqLworICAvKiAgICBzdG9yZXMgdGhlIGZpbGUgb2Zmc2V0cyBvZiB0aGUgcGFydGljdWxhciB0YWJsZSBpbiBlYWNoIGxvb2t1cCAgICAgKi8KKyAgLyogICAgZWxlbWVudC4gIEl0IGlzIHVwIHRvIHRoZSBjYWxsZXIgdG8gbG9hZCB0aGVzZSBzdWItdGFibGVzLiAgVGhpcyAgICovCisgIC8qICAgIGNhbiBiZSBkb25lIG1vcmUgZWFzaWx5IHdpdGggT1RMX0l0ZXJhdGVfTG9va3VwX0xpc3QoKS4gICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgTE9DQUxfREVGCisgIFRUX0Vycm9yICBPVExfTG9hZF9Mb29rdXBfTGlzdCggT1RMX0xvb2t1cF9MaXN0KiAgbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gICAgICAgICBzdHJlYW0gKTsKKworCisgIHR5cGVkZWYgaW50ICBPVExfTG9va3VwX0l0ZXJhdG9yKCBPVExfTG9va3VwKiAgbG9va3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICAgIGNsb3N1cmUgKTsKKworCisgIHR5cGVkZWYgdm9pZCAgT1RMX0xvb2t1cF9EZXN0cnVjdG9yKCBPVExfTG9va3VwKiAgbG9va3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3lzdGVtICAgIHN5c3RlbSApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgT1RMX0l0ZXJhdGVfTG9va3VwX0xpc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgU2NhbnMgYW4gT3BlblR5cGUgTG9va3VwIExpc3QuICBUaGlzIGNhbiBiZSB1c2VkIHRvIGxvYWQgdGhlICAgICAgICovCisgIC8qICAgIExvb2t1cCBzdWItdGFibGVzIGluIGEgR1NVQiBvciBHUE9TIGxvYWRlci4gICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGxpc3QgICAgIDo6IFRoZSBzb3VyY2UgbGlzdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBpdGVyYXRvciA6OiBUaGUgaXRlcmF0b3IgLS0gYSBmdW5jdGlvbiB3aGljaCBpcyBjYWxsZWQgb24gZWFjaCAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgZWxlbWVudCBvZiB0aGUgbGlzdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGNsb3N1cmUgIDo6IFVzZXItc3BlY2lmaWVkIGRhdGEgd2hpY2ggaXMgcGFzc2VkIHRvIGVhY2ggaXRlcmF0b3IgICAqLworICAvKiAgICAgICAgICAgICAgICB3aXRoIHRoZSBsb29rdXAgZWxlbWVudCBwb2ludGVyLiAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBJZiBvbmUgaXRlcmF0b3IgY2FsbCByZXR1cm5zIGEgbm9uLXplcm8gYHJlc3VsdCcsIHRoZSBsaXN0IHBhcnNpbmcgKi8KKyAgLyogICAgaXMgYWJvcnRlZCBhbmQgdGhlIHZhbHVlIGlzIHJldHVybmVkIHRvIHRoZSBjYWxsZXIuICBPdGhlcndpc2UsICAgICovCisgIC8qICAgIHRoZSBmdW5jdGlvbiByZXR1cm5zIDAgd2hlbiB0aGUgbGlzdCBoYXMgYmVlbiBwYXJzZWQgY29tcGxldGVseS4gICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgTE9DQUxfREVGCisgIFRUX0Vycm9yICBPVExfSXRlcmF0ZV9Mb29rdXBfTGlzdCggT1RMX0xvb2t1cF9MaXN0KiAgICAgbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPVExfTG9va3VwX0l0ZXJhdG9yICBpdGVyYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgICAgICAgICBjbG9zdXJlICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBPVExfTG9hZF9Db3ZlcmFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBMb2FkcyBhbiBPcGVuVHlwZSBDb3ZlcmFnZSB0YWJsZSBmcm9tIGEgZm9udCByZXNvdXJjZS4gICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBjb3ZlcmFnZSA6OiBUaGUgdGFyZ2V0IGNvdmVyYWdlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgc3RyZWFtICAgOjogVGhlIGlucHV0IHN0cmVhbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVHJ1ZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBMT0NBTF9GVU5DCisgIFRUX0Vycm9yICBPVExfTG9hZF9Db3ZlcmFnZSggT1RMX0NvdmVyYWdlKiAgY292ZXJhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICAgICAgc3RyZWFtICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBPVExfTG9hZF9DbGFzc19EZWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBMb2FkcyBhbiBPcGVuVHlwZSBDbGFzcyBEZWZpbml0aW9uIHRhYmxlIGZyb20gYSByZXNvdXJjZS4gICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBjbGFzc19kZWYgOjogVGhlIHRhcmdldCBjbGFzcyBkZWZpbml0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgc3RyZWFtICAgIDo6IFRoZSBpbnB1dCBzdHJlYW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVHJ1ZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBMT0NBTF9ERUYKKyAgVFRfRXJyb3IgIE9UTF9Mb2FkX0NsYXNzX0RlZiggT1RMX0NsYXNzX0RlZiogIGNsYXNzX2RlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICAgICAgIHN0cmVhbSApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgT1RMX0xvYWRfRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgTG9hZHMgYW4gT3BlblR5cGUgRGV2aWNlIHRhYmxlIGZyb20gYSBmb250IHJlc291cmNlLiAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZGV2aWNlIDo6IFRoZSB0YXJnZXQgZGV2aWNlIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHN0cmVhbSA6OiBUaGUgaW5wdXQgc3RyZWFtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRydWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgTE9DQUxfREVGCisgIFRUX0Vycm9yICBPVExfTG9hZF9EZXZpY2UoIE9UTF9EZXZpY2UqICBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgICBzdHJlYW0gKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIE9UTF9GcmVlX1NjcmlwdF9MaXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFJlbGVhc2VzIGEgZ2l2ZW4gT3BlblR5cGUgU2NyaXB0IGxpc3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGxpc3QgICA6OiBUaGUgdGFyZ2V0IHNjcmlwdCBsaXN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzeXN0ZW0gOjogVGhlIGN1cnJlbnQgc3lzdGVtIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIExPQ0FMX0RFRgorICB2b2lkICBPVExfRnJlZV9TY3JpcHRfTGlzdCggT1RMX1NjcmlwdF9MaXN0KiAgbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1N5c3RlbSAgICAgICAgIHN5c3RlbSApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgT1RMX0ZyZWVfRmVhdHVyZXNfTGlzdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgUmVsZWFzZXMgYSBnaXZlbiBPcGVuVHlwZSBGZWF0dXJlcyBsaXN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbGlzdCAgIDo6IFRoZSB0YXJnZXQgZmVhdHVyZSBsaXN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHN5c3RlbSA6OiBUaGUgY3VycmVudCBzeXN0ZW0gb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgTE9DQUxfREVGCisgIHZvaWQgIE9UTF9GcmVlX0ZlYXR1cmVzX0xpc3QoIE9UTF9GZWF0dXJlX0xpc3QqICBsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TeXN0ZW0gICAgICAgICAgc3lzdGVtICk7CisKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIE9UTF9GcmVlX0xvb2t1cF9MaXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFJlbGVhc2VzIGEgZ2l2ZW4gT3BlblR5cGUgTG9va3VwIGxpc3QuICBVc2VzIGEgZGVzdHJ1Y3RvciBjYWxsZWQgICAqLworICAvKiAgICB0byBkZXN0cm95IHRoZSBMb29rdXAgc3ViLXRhYmxlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBsaXN0ICAgICAgIDo6IFRoZSB0YXJnZXQgbG9va3VwIGxpc3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgc3lzdGVtICAgICA6OiBUaGUgY3VycmVudCBzeXN0ZW0gb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGRlc3RydWN0b3IgOjogQSBkZXN0cnVjdG9yIGZ1bmN0aW9uIGNhbGxlZCBvbiBlYWNoIGxvb2t1cCBlbGVtZW50LiAqLworICAvKiAgICAgICAgICAgICAgICAgIENhbiBiZSB1c2VkIHRvIGRlc3Ryb3kgc3ViLXRhYmxlcy4gIElnbm9yZWQgaWYgTlVMTC4gKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIExPQ0FMX0RFRgorICB2b2lkICBPVExfRnJlZV9Mb29rdXBfTGlzdCggT1RMX0xvb2t1cF9MaXN0KiAgICAgICBsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3lzdGVtICAgICAgICAgICAgICBzeXN0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPVExfTG9va3VwX0Rlc3RydWN0b3IgIGRlc3Ryb3kgKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIE9UTF9GcmVlX0NvdmVyYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFJlbGVhc2VzIGEgZ2l2ZW4gT3BlblR5cGUgQ292ZXJhZ2UgdGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGNvdmVyYWdlIDo6IFRoZSB0YXJnZXQgY292ZXJhZ2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzeXN0ZW0gICA6OiBUaGUgY3VycmVudCBzeXN0ZW0gb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIExPQ0FMX0RFRgorICB2b2lkICBPVExfRnJlZV9Db3ZlcmFnZSggT1RMX0NvdmVyYWdlKiAgY292ZXJhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TeXN0ZW0gICAgICBzeXN0ZW0gKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIE9UTF9GcmVlX0NsYXNzX0RlZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFJlbGVhc2VzIGEgZ2l2ZW4gT3BlblR5cGUgQ2xhc3MgRGVmaW5pdGlvbiB0YWJsZS4gICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGNsYXNzX2RlZiA6OiBUaGUgdGFyZ2V0IGNsYXNzIGRlZmluaXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzeXN0ZW0gICAgOjogVGhlIGN1cnJlbnQgc3lzdGVtIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIExPQ0FMX0RFRgorICB2b2lkICBPVExfRnJlZV9DbGFzc19EZWYoIE9UTF9DbGFzc19EZWYqICBjbGFzc19kZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3lzdGVtICAgICAgIHN5c3RlbSApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgT1RMX0ZyZWVfRGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgUmVsZWFzZXMgYSBnaXZlbiBPcGVuVHlwZSBMYXlvdXQgRGV2aWNlIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZGV2aWNlICA6OiBUaGUgdGFyZ2V0IGRldmljZSB0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHN5c3RlbSAgOjogVGhlIGN1cnJlbnQgc3lzdGVtIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgTE9DQUxfREVGCisgIHZvaWQgIE9UTF9GcmVlX0RldmljZSggT1RMX0RldmljZSogIGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TeXN0ZW0gICAgc3lzdGVtICk7CisKKworI2VuZGlmIC8qIE9UTE9BRF9IICovCisKKworLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvc2hhcmVkL3JlYWRtZS50eHQgYi9zcmMvc2hhcmVkL3JlYWRtZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ4MTYzYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9zaGFyZWQvcmVhZG1lLnR4dApAQCAtMCwwICsxLDYgQEAKK1dBUk5JTkc6CisKK1RoZSBmaWxlcyBpbiB0aGVzZSBzdWJkaXJlY3RvcmllcyBhcmUgc2hhcmVkIGJ5IHNldmVyYWwgZm9udCBkcml2ZXJzLgorCitBbGwgQyBzb3VyY2UgZmlsZXMgYXJlIGluY2x1ZGVkIGJ5IGF0IGxlYXN0IG9uZSBvZiB0aGUgZHJpdmVycywgYW5kCit0aHVzIHNob3VsZCBfbmV2ZXJfIGJlIGNvbXBpbGVkIGRpcmVjdGx5LgpkaWZmIC0tZ2l0IGEvc3JjL3NoYXJlZC9ydWxlcy5tayBiL3NyYy9zaGFyZWQvcnVsZXMubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTgzNDY2YgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9zaGFyZWQvcnVsZXMubWsKQEAgLTAsMCArMSw5NSBAQAorIyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyMqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisjKiAgc2hhcmVkIGZpbGVzIE1ha2VmaWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMqICBDb3B5cmlnaHQgMTk5Ni0xOTk5IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisjKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAgKgorIyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQgICAgICAgICAqCisjKiAgbW9kaWZpZWQgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICAgKgorIyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgICoKKyMqICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICAqCisjKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKworIyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyMqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisjKiAgSU1QT1JUQU5UIE5PVEU6IFRoaXMgTWFrZWZpbGUgaXMgaW50ZW5kZWQgZm9yIEdOVSBNYWtlISAgICAgICAgICAgICAgICAgKgorIyogICAgICAgICAgICAgICAgICBJZiB5b3UgcHJvdmlkZSBNYWtlZmlsZXMgZm9yIG90aGVyIG1ha2UgdXRpbGl0aWVzLCAgICAgICoKKyMqICAgICAgICAgICAgICAgICAgcGxlYXNlIHBsYWNlIHRoZW0gaW4gYGZyZWV0eXBlL2xpYi9hcmNoLzxzeXN0ZW0+Jy4gICAgICAqCisjKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMqICBUaGlzIGZpbGUgaXMgdG8gYmUgaW5jbHVkZWQgYnkgdGhlIEZyZWVUeXBlIE1ha2VmaWxlLmxpYiwgbG9jYXRlZCBpbiAgICAqCisjKiAgdGhlIGBmcmVldHlwZS9saWInIGRpcmVjdG9yeS4gIEhlcmUgaXMgdGhlIGxpc3Qgb2YgdGhlIHZhcmlhYmxlcyB0aGF0ICAgKgorIyogIG11c3QgYmUgZGVmaW5lZCB0byB1c2UgaXQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisjKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIyogICAgIEJBU0VfRElSOiAgICBUaGUgbG9jYXRpb24gb2YgdGhlIGJhc2UgbGF5ZXIncyBkaXJlY3RvcnkuICBUaGlzIGlzICAgICoKKyMqICAgICAgICAgICAgICAgICAgdXN1YWxseSBgZnJlZXR5cGUvbGliL2Jhc2UnLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisjKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIyogICAgIEFSQ0hfRElSOiAgICBUaGUgbG9jYXRpb24gb2YgdGhlIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgZGlyZWN0b3J5LiAgICoKKyMqICAgICAgICAgICAgICAgICAgVGhpcyBpcyB1c3VhbGx5IGBmcmVldHlwZS9saWIvYXJjaC88c3lzdGVtPicuICAgICAgICAgICAqCisjKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIyogICAgIERSSVZFUlNfRElSOiBUaGUgbG9jYXRpb24gb2YgdGhlIGZvbnQgZHJpdmVyIHN1Yi1kaXJzLCB1c3VhbGx5ICAgICAgICoKKyMqICAgICAgICAgICAgICAgICAgYGZyZWV0eXBlL2xpYi9kcml2ZXJzJy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisjKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIyogICAgIE9CSl9ESVI6ICAgICBUaGUgbG9jYXRpb24gd2hlcmUgdGhlIGNvbXBpbGVkIG9iamVjdChzKSBmaWxlIHdpbGwgYmUgICoKKyMqICAgICAgICAgICAgICAgICAgcGxhY2VkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisjKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIyogICAgIEJBU0VfSDogICAgICBBIGxpc3Qgb2YgcGF0aG5hbWVzIHRvIHRoZSBiYXNlIGxheWVyJ3MgaGVhZGVyIGZpbGVzIG9uICoKKyMqICAgICAgICAgICAgICAgICAgd2hpY2ggdGhlIGRyaXZlciBkZXBlbmRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisjKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIyogICAgIEZUX0NGTEFHUzogICBBIHNldCBvZiBmbGFncyB1c2VkIGZvciBjb21waWxhdGlvbiBvZiBvYmplY3QgZmlsZXMuICAgICoKKyMqICAgICAgICAgICAgICAgICAgVGhpcyBjb250YWlucyBhdCBsZWFzdCB0aGUgaW5jbHVkZSBwYXRocyBvZiB0aGUgYXJjaCAgICAqCisjKiAgICAgICAgICAgICAgICAgIGFuZCBiYXNlIGRpcmVjdG9yaWVzICsgb3B0aW1pemF0aW9uICsgd2FybmluZ3MgKyBBTlNJICAgKgorIyogICAgICAgICAgICAgICAgICBjb21wbGlhbmNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisjKiAgICAgRlRfSUZMQUc6ICAgIFRoZSBmbGFnIHVzZWQgdG8gc3BlY2lmeSBhbiBpbmNsdWRlIHBhdGggb24gdGhlICAgICAgICAgKgorIyogICAgICAgICAgICAgICAgICBjb21waWxlciBjb21tYW5kIGxpbmUuICBGb3IgZXhhbXBsZSwgd2l0aCBHQ0MsIHRoaXMgaXMgICoKKyMqICAgICAgICAgICAgICAgICAgYC1JJywgd2hpbGUgc29tZSBvdGhlciBjb21waWxlcnMgdXNlIGAvaT0nIG9yIGAtSicsICAgICAqCisjKiAgICAgICAgICAgICAgICAgIGV0Yy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMqICAgICBGVF9PQko6ICAgICAgVGhlIHN1ZmZpeCBvZiBhbiBvYmplY3QgZmlsZSBmb3IgdGhlIHBsYXRmb3JtOyBjYW4gYmUgICAqCisjKiAgICAgICAgICAgICAgICAgIGBvJywgYG9iaicsIGBjb2ZmJywgYHRjbycsIGV0Yy4gZGVwZW5kaW5nIG9uIHRoZSAgICAgICAgKgorIyogICAgICAgICAgICAgICAgICBwbGF0Zm9ybS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisjKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIyogIEl0IGFsc28gdXBkYXRlcyB0aGUgZm9sbG93aW5nIHZhcmlhYmxlcyBkZWZpbmVkIGFuZCB1c2VkIGluIHRoZSBtYWluICAgICoKKyMqICBNYWtlZmlsZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisjKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIyogICAgIERSVl9PQkpfUzogICAgICAgICAgICBUaGUgbGlzdCBvZiBkcml2ZXIgb2JqZWN0IGZpbGVzIGluICAgICAgICAgICAgICoKKyMqICAgICAgICAgICAgICAgICAgICAgICAgICAgc2luZ2xlLW9iamVjdCBtb2RlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisjKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIyogICAgIERSVl9PQkpfTTogICAgICAgICAgICBUaGUgbGlzdCBvZiBkcml2ZXIgb2JqZWN0IGZpbGVzIGluICAgICAgICAgICAgICoKKyMqICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVsdGlwbGUtb2JqZWN0cyBtb2RlLiAgICAgICAgICAgICAgICAgICAgICAgICAqCisjKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIyogICAgIEZUSU5JVF9EUklWRVJfUEFUSFM6ICBUaGUgbGlzdCBvZiBpbmNsdWRlIHBhdGhzIHVzZWQgdG8gY29tcGlsZSB0aGUgICoKKyMqICAgICAgICAgICAgICAgICAgICAgICAgICAgYGZ0aW5pdCcgY29tcG9uZW50IHdoaWNoIHJlZ2lzdGVycyBhbGwgZm9udCAgICAqCisjKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcml2ZXJzIGluIHRoZSBGVF9Jbml0X0ZyZWVUeXBlKCkgZnVuY3Rpb24uICAgKgorIyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMqICAgICBGVElOSVRfRFJJVkVSX0g6ICAgICAgVGhlIGxpc3Qgb2YgaGVhZGVyIGRlcGVuZGVuY2llcyB1c2VkIHRvICAgICAgICAqCisjKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGUgdGhlIGBmdGluaXQnIGNvbXBvbmVudC4gICAgICAgICAgICAgICAgKgorIyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMqICAgICBGVElOSVRfRFJJVkVSX01BQ1JPUzogVGhlIGxpc3Qgb2YgbWFjcm9zIHRvIGJlIGRlZmluZWQgd2hlbiAgICAgICAgICAqCisjKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGluZyB0aGUgYGZ0aW5pdCcgY29tcG9uZW50LiAgICAgICAgICAgICAgKgorIyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMqICBgU2luZ2xlLW9iamVjdCBjb21waWxhdGlvbicgbWVhbnMgdGhhdCBlYWNoIGZvbnQgZHJpdmVyIGlzIGNvbXBpbGVkICAgICAqCisjKiAgaW50byBhIHNpbmdsZSBvYmplY3QgZmlsZS4gIFRoaXMgaXMgdXNlZnVsIHRvIGdldCByaWQgb2YgYWxsICAgICAgICAgICAgKgorIyogIGRyaXZlci1zcGVjaWZpYyBlbnRyaWVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisjKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCitpZm5kZWYgU0hBUkVEX1JVTEVTCitTSEFSRURfUlVMRVMgOj0gMQorCitTSEFSRUQgIDo9ICQoU1JDXylzaGFyZWQKK1NIQVJFRF8gOj0gJChTSEFSRUQpJChTRVApCisKK1NIQVJFRF9IICAgOj0gJCh3aWxkY2FyZCAkKFNIQVJFRF8pKi5oKQorU0hBUkVEX1NSQyA6PSAkKHdpbGRjYXJkICQoU0hBUkVEXykqLmMpIAorCitlbmRpZgorCisjIEVORApkaWZmIC0tZ2l0IGEvc3JjL3NoYXJlZC9zZm50LmggYi9zcmMvc2hhcmVkL3NmbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTQ5NDc5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3NoYXJlZC9zZm50LmgKQEAgLTAsMCArMSwzNDcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHNmbnQuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBIaWdoLWxldmVsIGBzZm50JyBkcml2ZXIgaW50ZXJmYWNlIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMTk5Ni0xOTk5IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCisvKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLworLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KKy8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCisvKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2lmbmRlZiBTRk5UX0gKKyNkZWZpbmUgU0ZOVF9ICisKKyNpbmNsdWRlIDxmcmVldHlwZS5oPgorI2luY2x1ZGUgPHR0dHlwZXMuaD4KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmNUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX0xvYWRfRGlyZWN0b3J5X0Z1bmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIExvYWRzIHRoZSB0YWJsZSBkaXJlY3RvcnkgaW50byBhIGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZhY2UgICAgICA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzdHJlYW0gICAgOjogVGhlIGlucHV0IHN0cmVhbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZmFjZUluZGV4IDo6IFRoZSBpbmRleCBvZiB0aGUgVHJ1ZVR5cGUgZm9udCwgaWYgd2UncmUgb3BlbmluZyBhICAgICovCisgIC8qICAgICAgICAgICAgICAgICBjb2xsZWN0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRydWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoZSBzdHJlYW0gY3Vyc29yIG11c3QgYmUgYXQgdGhlIGZvbnQgZmlsZSdzIG9yaWdpbiAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZgorICBUVF9FcnJvciAgKCpUVF9Mb2FkX0RpcmVjdG9yeV9GdW5jKSggVFRfRmFjZSAgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9Mb25nICAgIGZhY2VJbmRleCApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY1R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfTG9hZF9BbnlfRnVuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgTG9hZHMgYW55IGZvbnQgdGFibGUgaW50byBjbGllbnQgbWVtb3J5LiAgVXNlZCBieSB0aGUgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX0dldF9Gb250X0RhdGEoKSBBUEkgZnVuY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZhY2UgICA6OiBUaGUgZmFjZSBvYmplY3QgdG8gbG9vayBmb3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgdGFnICAgIDo6IFRoZSB0YWcgb2YgdGFibGUgdG8gbG9hZC4gIFVzZSB0aGUgdmFsdWUgMCBpZiB5b3UgIHdhbnQgICovCisgIC8qICAgICAgICAgICAgICB0byBhY2Nlc3MgdGhlIHdob2xlIGZvbnQgZmlsZSwgZWxzZSBzZXQgdGhpcyBwYXJhbWV0ZXIgICAqLworICAvKiAgICAgICAgICAgICAgdG8gYSB2YWxpZCBUcnVlVHlwZSB0YWJsZSB0YWcgdGhhdCB5b3UgY2FuIGZvcmdlIHdpdGggICAgKi8KKyAgLyogICAgICAgICAgICAgIHRoZSBNQUtFX1RUX1RBRyBtYWNyby4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBvZmZzZXQgOjogVGhlIHN0YXJ0aW5nIG9mZnNldCBpbiB0aGUgdGFibGUgKG9yIHRoZSBmaWxlIGlmICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgIHRhZyA9PSAwKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBsZW5ndGggOjogVGhlIGFkZHJlc3Mgb2YgdGhlIGRlY2lzaW9uIHZhcmlhYmxlOiAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgIElmIGxlbmd0aCA9PSBOVUxMOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgIExvYWRzIHRoZSB3aG9sZSB0YWJsZS4gIFJldHVybnMgYW4gZXJyb3IgaWYgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICBgb2Zmc2V0JyA9PSAwISAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICBJZiAqbGVuZ3RoID09IDA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICBFeGl0cyBpbW1lZGlhdGVseTsgcmV0dXJuaW5nIHRoZSBsZW5ndGggb2YgdGhlIGdpdmVuICovCisgIC8qICAgICAgICAgICAgICAgICAgdGFibGUgb3Igb2YgdGhlIGZvbnQgZmlsZSwgZGVwZW5kaW5nIG9uIHRoZSB2YWx1ZSBvZiAqLworICAvKiAgICAgICAgICAgICAgICAgIGB0YWcnLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgIElmICpsZW5ndGggIT0gMDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgIExvYWRzIHRoZSBuZXh0IGBsZW5ndGgnIGJ5dGVzIG9mIHRhYmxlIG9yIGZvbnQsICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICBzdGFydGluZyBhdCBvZmZzZXQgYG9mZnNldCcgKGluIHRhYmxlIG9yIGZvbnQgdG9vKS4gICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgYnVmZmVyIDo6IFRoZSBhZGRyZXNzIG9mIHRhcmdldCBidWZmZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVHJ1ZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmCisgIFRUX0Vycm9yICAoKlRUX0xvYWRfQW55X0Z1bmMpKCBUVF9GYWNlICAgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX1VMb25nICB0YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9Mb25nICAgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX0xvbmcqICBsZW5ndGggKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmNUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX0xvYWRfU0JpdF9JbWFnZV9GdW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIExvYWRzIGEgZ2l2ZW4gZ2x5cGggc2JpdCBpbWFnZSBmcm9tIHRoZSBmb250IHJlc291cmNlLiAgVGhpcyBhbHNvICAqLworICAvKiAgICByZXR1cm5zIGl0cyBtZXRyaWNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBmYWNlICAgICAgICA6OiBUaGUgdGFyZ2V0IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHhfcHBlbSAgICAgIDo6IFRoZSBob3Jpem9udGFsIHJlc29sdXRpb24gaW4gcG9pbnRzIHBlciBFTS4gICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgeV9wcGVtICAgICAgOjogVGhlIHZlcnRpY2FsIHJlc29sdXRpb24gaW4gcG9pbnRzIHBlciBFTS4gICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBnbHlwaF9pbmRleCA6OiBUaGUgY3VycmVudCBnbHlwaCBpbmRleC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHN0cmVhbSAgICAgIDo6IFRoZSBpbnB1dCBzdHJlYW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG1hcCAgICAgICAgIDo6IFRoZSB0YXJnZXQgcGl4bWFwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBtZXRyaWNzICAgICA6OiBBIGJpZyBzYml0IG1ldHJpY3Mgc3RydWN0dXJlIGZvciB0aGUgZ2x5cGggaW1hZ2UuICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUcnVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgUmV0dXJucyBhbiBlcnJvciBpZiBubyAgICAgKi8KKyAgLyogICAgZ2x5cGggc2JpdCBleGlzdHMgZm9yIHRoZSBpbmRleC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhlIGBtYXAuYnVmZmVyJyBmaWVsZCBpcyBhbHdheXMgZnJlZWQgYmVmb3JlIHRoZSBnbHlwaCBpcyBsb2FkZWQuICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmICAKKyAgVFRfRXJyb3IgICgqVFRfTG9hZF9TQml0X0ltYWdlX0Z1bmMpKCBUVF9GYWNlICAgICAgICAgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX0ludCAgICAgICAgICAgIHhfcHBlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9JbnQgICAgICAgICAgICB5X3BwZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfVUludCAgICAgICAgICAgZ2x5cGhfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICAgICAgICAgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0JpdG1hcCogICAgICAgIG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9TQml0X01ldHJpY3MqICBtZXRyaWNzICk7CisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY1R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfR2V0X1BTX05hbWVfRnVuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgR2V0cyB0aGUgUG9zdFNjcmlwdCBnbHlwaCBuYW1lIG9mIGEgZ2x5cGguICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgaW5kZXggIDo6IFRoZSBnbHlwaCBpbmRleC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBQU25hbWUgOjogVGhlIGFkZHJlc3Mgb2YgYSBzdHJpbmcgcG9pbnRlci4gIFdpbGwgYmUgTlVMTCBpbiBjYXNlICAgKi8KKyAgLyogICAgICAgICAgICAgIG9mIGVycm9yLCBvdGhlcndpc2UgaXQgaXMgYSBwb2ludGVyIHRvIHRoZSBnbHlwaCBuYW1lLiAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgWW91IG11c3Qgbm90IG1vZGlmeSB0aGUgcmV0dXJuZWQgc3RyaW5nISAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUcnVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYKKyAgVFRfRXJyb3IgKCpUVF9HZXRfUFNfTmFtZV9GdW5jKSggVFRfRmFjZSAgICAgIGZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX1VJbnQgICAgICBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfU3RyaW5nKiogIFBTbmFtZSApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY1R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfTG9hZF9NZXRyaWNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgTG9hZHMgdGhlIGhvcml6b250YWwgb3IgdmVydGljYWwgaGVhZGVyIGluIGEgZmFjZSBvYmplY3QuICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZmFjZSAgICAgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHN0cmVhbSAgIDo6IFRoZSBpbnB1dCBzdHJlYW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB2ZXJ0aWNhbCA6OiBBIGJvb2xlYW4gZmxhZy4gIElmIHNldCwgbG9hZCB2ZXJ0aWNhbCBtZXRyaWNzLiAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUcnVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYKKyAgVFRfRXJyb3IgICgqVFRfTG9hZF9NZXRyaWNzX0Z1bmMpKCBUVF9GYWNlICAgIGZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfQm9vbCAgICB2ZXJ0aWNhbCApOworCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUVF9DaGFyTWFwX0xvYWRfRnVuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBMb2FkcyBhIGdpdmVuIFRydWVUeXBlIGNoYXJhY3RlciBtYXAgaW50byBtZW1vcnkuICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBmYWNlICAgOjogQSBoYW5kbGUgdG8gdGhlIHBhcmVudCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgc3RyZWFtIDo6IEEgaGFuZGxlIHRvIHRoZSBjdXJyZW50IHN0cmVhbSBvYmplY3QuICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgY21hcCAgIDo6IEEgcG9pbnRlciB0byBhIGNtYXAgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhlIGZ1bmN0aW9uIGFzc3VtZXMgdGhhdCB0aGUgc3RyZWFtIGlzIGFscmVhZHkgaW4gdXNlIChpLmUuLCAgICAgICovCisgIC8qICAgIG9wZW5lZCkuICBJbiBjYXNlIG9mIGVycm9yLCBhbGwgcGFydGlhbGx5IGFsbG9jYXRlZCB0YWJsZXMgYXJlICAgICAqLworICAvKiAgICByZWxlYXNlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYKKyAgVFRfRXJyb3IgICgqVFRfQ2hhck1hcF9Mb2FkX0Z1bmMpKCBUVF9GYWNlICAgICAgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX0NNYXBUYWJsZSogIGNtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICAgICAgaW5wdXQgKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmNUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX0NoYXJNYXBfRnJlZV9GdW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIERlc3Ryb3lzIGEgY2hhcmFjdGVyIG1hcHBpbmcgdGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZhY2UgOjogQSBoYW5kbGUgdG8gdGhlIHBhcmVudCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBjbWFwIDo6IEEgaGFuZGxlIHRvIGEgY21hcCBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBFcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYKKyAgVFRfRXJyb3IgICgqVFRfQ2hhck1hcF9GcmVlX0Z1bmMpKCBUVF9GYWNlICAgICAgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX0NNYXBUYWJsZSogIGNtYXAgKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmNUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX0xvYWRfVGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIExvYWRzIGEgZ2l2ZW4gVHJ1ZVR5cGUgdGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZhY2UgICA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzdHJlYW0gOjogVGhlIGlucHV0IHN0cmVhbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUcnVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGUgZnVuY3Rpb24gd2lsbCB1c2UgYGZhY2UtPmdvdG9fdGFibGUnIHRvIHNlZWsgdGhlIHN0cmVhbSB0byAgICAgKi8KKyAgLyogICAgdGhlIHN0YXJ0IG9mIHRoZSB0YWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmCisgIFRUX0Vycm9yICAoKlRUX0xvYWRfVGFibGVfRnVuYykoIFRUX0ZhY2UgICAgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICBzdHJlYW0gKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmNUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX0xvYWRfVGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIExvYWRzIGEgZ2l2ZW4gVHJ1ZVR5cGUgdGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZhY2UgICA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzdHJlYW0gOjogVGhlIGlucHV0IHN0cmVhbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUcnVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGUgZnVuY3Rpb24gd2lsbCB1c2UgYGZhY2UtPmdvdG9fdGFibGUnIHRvIHNlZWsgdGhlIHN0cmVhbSB0byAgICAgKi8KKyAgLyogICAgdGhlIHN0YXJ0IG9mIHRoZSB0YWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmCisgIHZvaWQgICgqVFRfRnJlZV9UYWJsZV9GdW5jKSggVFRfRmFjZSAgZmFjZSApOworCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBTRk5UX0ludGVyZmFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB0aGlzIHN0cnVjdHVyZSBob2xkcyBwb2ludGVycyB0byB0aGUgZnVuY3Rpb25zIHVzZWQgdG8gbG9hZCBhbmQgICAgKi8KKyAgLyogICAgZnJlZSB0aGUgYmFzaWMgdGFibGVzIHRoYXQgYXJlIHJlcXVpcmVkIGluIGEgYHNmbnQnIGZvbnQgZmlsZS4gICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHN0cnVjdCAgU0ZOVF9JbnRlcmZhY2VfCisgIHsKKyAgICBUVF9Hb3RvX1RhYmxlX0Z1bmMgICAgICBnb3RvX3RhYmxlOworICAKKyAgICBUVF9Mb2FkX0FueV9GdW5jICAgICAgICBsb2FkX2FueTsKKyAgICBUVF9Mb2FkX0RpcmVjdG9yeV9GdW5jICBsb2FkX2RpcmVjdG9yeTsKKworICAgIFRUX0xvYWRfVGFibGVfRnVuYyAgICAgIGxvYWRfaGVhZGVyOworICAgIFRUX0xvYWRfTWV0cmljc19GdW5jICAgIGxvYWRfbWV0cmljczsKKyAgICBUVF9Mb2FkX1RhYmxlX0Z1bmMgICAgICBsb2FkX2NoYXJtYXBzOworICAgIFRUX0xvYWRfVGFibGVfRnVuYyAgICAgIGxvYWRfbWF4X3Byb2ZpbGU7CisgICAgVFRfTG9hZF9UYWJsZV9GdW5jICAgICAgbG9hZF9vczI7CisgICAgVFRfTG9hZF9UYWJsZV9GdW5jICAgICAgbG9hZF9wc25hbWVzOworCisgICAgVFRfTG9hZF9UYWJsZV9GdW5jICAgICAgbG9hZF9uYW1lczsKKyAgICBUVF9GcmVlX1RhYmxlX0Z1bmMgICAgICBmcmVlX25hbWVzOworCisgICAgLyogb3B0aW9uYWwgdGFibGVzICovCisgICAgVFRfTG9hZF9UYWJsZV9GdW5jICAgICAgbG9hZF9oZG14OworICAgIFRUX0ZyZWVfVGFibGVfRnVuYyAgICAgIGZyZWVfaGRteDsKKworICAgIFRUX0xvYWRfVGFibGVfRnVuYyAgICAgIGxvYWRfa2VybmluZzsKKyAgICBUVF9Mb2FkX1RhYmxlX0Z1bmMgICAgICBsb2FkX2dhc3A7CisKKworICAgIC8qIHNlZSBgdHRzYml0LmgnICovCisgICAgVFRfTG9hZF9UYWJsZV9GdW5jICAgICAgbG9hZF9zYml0czsKKyAgICBUVF9Mb2FkX1NCaXRfSW1hZ2VfRnVuYyBsb2FkX3NiaXRfaW1hZ2U7CisgICAgVFRfRnJlZV9UYWJsZV9GdW5jICAgICAgZnJlZV9zYml0czsKKyAgICAKKyAgICAvKiBzZWUgYHR0cG9zdC5oJyAqLworICAgIFRUX0dldF9QU19OYW1lX0Z1bmMgICAgIGdldF9wc25hbWU7CisgICAgVFRfRnJlZV9UYWJsZV9GdW5jICAgICAgZnJlZV9wc25hbWVzOworCisgICAgLyogc2VlIGB0dGNtYXAuaCcgKi8KKyAgICBUVF9DaGFyTWFwX0xvYWRfRnVuYyAgICBsb2FkX2NoYXJtYXA7CisgICAgVFRfQ2hhck1hcF9GcmVlX0Z1bmMgICAgZnJlZV9jaGFybWFwOworICAgIAorICB9IFNGTlRfSW50ZXJmYWNlOworCisjZW5kaWYgLyogU0ZOVF9IICovCisKKworLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvc2hhcmVkL3NmbnQvcnVsZXMubWsgYi9zcmMvc2hhcmVkL3NmbnQvcnVsZXMubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZThhYjFmNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9zaGFyZWQvc2ZudC9ydWxlcy5tawpAQCAtMCwwICsxLDU4IEBACisjKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMqICBTRk5UL1RydWVUeXBlIE1ha2VmaWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisjKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIyogIENvcHlyaWdodCAxOTk2LTE5OTkgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMqICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICAqCisjKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCAgICAgICAgICoKKyMqICBtb2RpZmllZCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgICAqCisjKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAgKgorIyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgICoKKyMqICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisjKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCisjKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMqICBJTVBPUlRBTlQgTk9URTogVGhpcyBNYWtlZmlsZSBpcyBpbnRlbmRlZCBmb3IgR05VIE1ha2UhICAgICAgICAgICAgICAgICAqCisjKiAgICAgICAgICAgICAgICAgIElmIHlvdSBwcm92aWRlIE1ha2VmaWxlcyBmb3Igb3RoZXIgbWFrZSB1dGlsaXRpZXMsICAgICAgKgorIyogICAgICAgICAgICAgICAgICBwbGVhc2UgcGxhY2UgdGhlbSBpbiBgZnJlZXR5cGUvbGliL2FyY2gvPHN5c3RlbT4nLiAgICAgICoKKyMqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisjKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIyogIFRoaXMgZmlsZSBpcyB0byBiZSBpbmNsdWRlZCBieSB0aGUgTWFrZWZpbGVzIG9mIGVhY2ggZHJpdmVyIHRoYXQgdXNlcyAgICoKKyMqICB0aGUgc2hhcmVkIHNvdXJjZSBjb2RlIGluIGBmcmVldHlwZTIvbGliL2RyaXZlcnMvc2ZudCcuICBUaGlzIGNvZGUgICAgICAqCisjKiAgY29udGFpbnMgdHlwZSBkZWZpbml0aW9ucyBhcyB3ZWxsIGFzIGludGVyZmFjZSB3aGljaCBhcmUgY29tbW9uIHRvIGFsbCAgKgorIyogIGBzZm50JyBmb250IGZvcm1hdHMgKGkuZS4sIFRydWVUeXBlLCBPcGVuVHlwZS1UVEYsIGFuZCBPcGVuVHlwZS1DRkYpLiAgICoKKyMqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisjKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIyogIFRoZSBwdXJwb3NlIG9mIHRoaXMgTWFrZWZpbGUgaXMgdG8gZGVmaW5lIHR3byBtYWtlIHZhcmlhYmxlcyB0aGF0IGFyZSAgICoKKyMqICB1c2VkIGRpcmVjdGx5IGJ5IHRoZSBwYXJlbnQgTWFrZWZpbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisjKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCisjIFNGTlRfRElSIGlzIHRoZSBkaXJlY3RvcnkgdG8gdGhlIGBzZm50JyBzb3VyY2VzCisjCitTRk5UX0RJUiAgOj0gJChTUkMpJChTRVApc2hhcmVkJChTRVApc2ZudAorU0ZOVF9ESVJfIDo9ICQoU0ZOVF9ESVIpJChTRVApCisKKworIyBTRk5UX0ggaXMgdGhlIGxpc3Qgb2YgYWxsIGhlYWRlciBmaWxlcyBvbiB3aGljaCB0aGUgY2xpZW50IGRyaXZlcnMgZGVwZW5kCisjCitTRk5UX0ggOj0gJChTRk5UX0RJUl8pdHR0eXBlcy5oICBcCisgICAgICAgICAgJChTRk5UX0RJUl8pdHRsb2FkLmggICBcCisgICAgICAgICAgJChTRk5UX0RJUl8pdHRzYml0LmggICBcCisgICAgICAgICAgJChTRk5UX0RJUl8pdHRwb3N0LmggICBcCisgICAgICAgICAgJChTRk5UX0RJUl8pc2ZudC5oCisKKyMgU0ZOVF9TUkMgaXMgdGhlIGxpc3Qgb2YgYWxsIHNoYXJlZCBzb3VyY2UgZmlsZXMgdGhhdCBhcmUgaW5jbHVkZWQgYnkgYW55CisjIGNsaWVudCBkcml2ZXIKKyMKK1NGTlRfU1JDIDo9ICQoU0ZOVF9ESVJfKXR0bG9hZC5jICBcCisgICAgICAgICAgICAkKFNGTlRfRElSXyl0dHNiaXQuYyAgXAorICAgICAgICAgICAgJChTRk5UX0RJUl8pdHRwb3N0LmMKKworCisjIEVORApkaWZmIC0tZ2l0IGEvc3JjL3NoYXJlZC9zZm50L3NmbnQuaCBiL3NyYy9zaGFyZWQvc2ZudC9zZm50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFiYzljNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9zaGFyZWQvc2ZudC9zZm50LmgKQEAgLTAsMCArMSw1MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgc2ZudC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIERlZmluZXMgdGhlIGZ1bmN0aW9uIGludGVyZmFjZSB1c2VkIHRvIGFjY2VzcyBTRk5UIGZpbGVzLCBpLmUuLCAgICAgICovCisvKiAgICBUcnVlVHlwZSwgT3BlblR5cGUtVFQsIGFuZCBPcGVuVHlwZS1UMiBmaWxlcyAoc3BlY2lmaWNhdGlvbiBvbmx5KS4gICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMTk5Ni0xOTk5IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQgICAgICAgICovCisvKiAgbW9kaWZpZWQgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICAqLworLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KKy8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCisvKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgU0ZOVF9ICisjZGVmaW5lIFNGTlRfSAorCisjaW5jbHVkZSA8dHR0eXBlcy5oPgorCisKKyAgdHlwZWRlZiBUVF9Mb25nICAoKlNGTlRfTG9va1VwX1RhYmxlKSggVFRfRmFjZSAgIGZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX1VMb25nICB0YWcgKTsKKworCisgIHR5cGVkZWYgVFRfRXJyb3IgICgqU0ZOVF9Mb2FkX1RhYmxlKSggVFRfRmFjZSAgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX1VMb25nICAgdGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX0xvbmcgICAgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX0xvbmcqICAgbGVuZ3RoICk7CisKKyAgdHlwZWRlZiBUVF9FcnJvciAgKCpTRk5UX0dldF9QU19OYW1lKSggVFRfRmFjZSAgICAgIGZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX1VTaG9ydCAgICBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfU3RyaW5nKiAgKnBzX25hbWUgKTsKKworICB0eXBlZGVmIHN0cnVjdCAgU0ZOVF9JbnRlcmZhY2VfCisgIHsKKyAgICBTRk5UX0xvb2tVcF9UYWJsZSAgIGxvb2t1cF90YWJsZTsKKyAgICBTRk5UX0xvYWRfVGFibGUgICAgIGxvYWRfdGFibGU7CisKKyAgfSBTRk5UX0ludGVyZmFjZTsKKworCisjZW5kaWYgLyogU0ZOVF9IICovCisKKworLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvc2hhcmVkL3NmbnQvdHRsb2FkLmMgYi9zcmMvc2hhcmVkL3NmbnQvdHRsb2FkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE4YjUyYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9zaGFyZWQvc2ZudC90dGxvYWQuYwpAQCAtMCwwICsxLDE0ODggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHR0bG9hZC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBUcnVlVHlwZSB0YWJsZXMgbG9hZGVyIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMTk5Ni0xOTk5IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQgICAgICAgICovCisvKiAgbW9kaWZpZWQgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICAqLworLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KKy8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCisvKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgV0FSTklORzogVGhpcyBmaWxlIHNob3VsZCBub3QgYmUgY29tcGlsZWQgZGlyZWN0bHk7IGl0IGlzIG1lYW50IHRvIGJlICAqLworLyogICAgICAgICAgIGluY2x1ZGVkIGluIHRoZSBzb3VyY2Ugb2Ygc2V2ZXJhbCBmb250IGRyaXZlcnMgKGkuZS4sIHRoZSBUVEYgKi8KKy8qICAgICAgICAgICBhbmQgT1RGIGRyaXZlcnMpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjaW5jbHVkZSA8ZnRkZWJ1Zy5oPgorCisjaW5jbHVkZSA8dHRsb2FkLmg+CisjaW5jbHVkZSA8dHR0YWdzLmg+CisjaW5jbHVkZSA8dHRjbWFwLmg+CisKKworLyogcmVxdWlyZWQgYnkgdGhlIHRyYWNpbmcgbW9kZSAqLworI3VuZGVmICBGVF9DT01QT05FTlQKKyNkZWZpbmUgRlRfQ09NUE9ORU5UICAgICAgdHJhY2VfdHRsb2FkCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUVF9Mb29rVXBfVGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBMb29rcyBmb3IgYSBUcnVlVHlwZSB0YWJsZSBieSBuYW1lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBmYWNlIDo6IEEgZmFjZSBvYmplY3QgaGFuZGxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgdGFnICA6OiBUaGUgIHNlYXJjaGVkIHRhZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgSW5kZXggb2YgdGFibGUgaWYgZm91bmQsIC0xIG90aGVyd2lzZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBFWFBPUlRfRlVOQworICBGVF9Mb25nICBUVF9Mb29rVXBfVGFibGUoIFRUX0ZhY2UgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX1VMb25nICB0YWcgICkKKyAgeworICAgIFRUX0xvbmcgIGksIGZvdW5kOworCisKKyAgICBGVF9UUkFDRTQoKCAiVFRfTG9va1VwX1RhYmxlKCAlMDhseCwgJWMlYyVjJWMgKVxuIiwKKyAgICAgICAgICAgICAgICAgIChUVF9Mb25nKWZhY2UsCisgICAgICAgICAgICAgICAgICAoVFRfQ2hhcikodGFnID4+IDI0KSwKKyAgICAgICAgICAgICAgICAgIChUVF9DaGFyKSh0YWcgPj4gMTYpLAorICAgICAgICAgICAgICAgICAgKFRUX0NoYXIpKHRhZyA+PiA4KSwKKyAgICAgICAgICAgICAgICAgIChUVF9DaGFyKSh0YWcpICkpOworCisgICAgZm91bmQgPSAtMTsKKyAgICBmb3IgKCBpID0gMDsgaSA8IGZhY2UtPm51bV90YWJsZXM7IGkrKyApCisgICAgICBpZiAoIGZhY2UtPmRpcl90YWJsZXNbaV0uVGFnID09IHRhZyApCisgICAgICB7CisgICAgICAgIGZvdW5kID0gaTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICBpZiAoIGZvdW5kID09IC0xICkKKyAgICB7CisgICAgICBGVF9UUkFDRTQoKCAiICAgIENvdWxkIG5vdCBmaW5kIHRhYmxlIVxuIiApKTsKKyAgICB9CisKKyAgICByZXR1cm4gZm91bmQ7CisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX0xvYWRfQ29sbGVjdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIExvYWRzIHRoZSBUVEMgdGFibGUgZGlyZWN0b3J5IGludG8gZmFjZSB0YWJsZS4gICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZhY2UgICA6OiBBIGZhY2Ugb2JqZWN0IGhhbmRsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzdHJlYW0gOjogVGhlIGlucHV0IHN0cmVhbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUcnVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0YXRpYworICBUVF9FcnJvciAgVFRfTG9hZF9Db2xsZWN0aW9uKCBUVF9GYWNlICAgIGZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgc3RyZWFtICkKKyAgeworICAgIFRUX0xvbmcgICAgbjsKKyAgICBUVF9FcnJvciAgIGVycm9yOworICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gc3RyZWFtLT5tZW1vcnk7CisKKworICAgIEZUX1RSQUNFMygoICJUVF9Mb2FkX0NvbGxlY3Rpb24oICUwOGx4IClcbiIsIChUVF9Mb25nKWZhY2UgKSk7CisKKyAgICBpZiAoIEZJTEVfU2VlayAgICggMEwgKSAgfHwKKyAgICAgICAgIEFDQ0VTU19GcmFtZSggMTJMICkgKQorICAgICAgZ290byBFeGl0OworCisgICAgZmFjZS0+dHRjX2hlYWRlci5UYWcgICAgICA9IEdFVF9UYWc0KCk7CisgICAgZmFjZS0+dHRjX2hlYWRlci52ZXJzaW9uICA9IEdFVF9Mb25nKCk7CisgICAgZmFjZS0+dHRjX2hlYWRlci5EaXJDb3VudCA9IEdFVF9Mb25nKCk7IC8qIHNlZSBjb21tZW50IGluIHR0dHlwZXMuaCAqLworCisgICAgRk9SR0VUX0ZyYW1lKCk7CisKKyAgICBpZiAoIGZhY2UtPnR0Y19oZWFkZXIuVGFnICE9IFRUQUdfdHRjZiApCisgICAgeworICAgICAgZmFjZS0+dHRjX2hlYWRlci5UYWcgICAgICA9IDA7CisgICAgICBmYWNlLT50dGNfaGVhZGVyLnZlcnNpb24gID0gMDsKKyAgICAgIGZhY2UtPnR0Y19oZWFkZXIuRGlyQ291bnQgPSAwOworCisgICAgICBmYWNlLT50dGNfaGVhZGVyLlRhYmxlRGlyZWN0b3J5ID0gTlVMTDsKKworICAgICAgRlRfVFJBQ0UzKCggInNraXBwZWQuXG4iICkpOworCisgICAgICBlcnJvciA9IFRUX0Vycl9GaWxlX0lzX05vdF9Db2xsZWN0aW9uOworICAgICAgZ290byBFeGl0OworICAgIH0KKworICAgIGlmICggQUxMT0NfQVJSQVkoIGZhY2UtPnR0Y19oZWFkZXIuVGFibGVEaXJlY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgZmFjZS0+dHRjX2hlYWRlci5EaXJDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICBUVF9VTG9uZyApICAgICAgICAgICAgICAgICAgICAgICAgfHwKKyAgICAgICAgIEFDQ0VTU19GcmFtZSggZmFjZS0+dHRjX2hlYWRlci5EaXJDb3VudCAqIDRMICkgKQorICAgICAgZ290byBFeGl0OworCisgICAgZm9yICggbiA9IDA7IG4gPCBmYWNlLT50dGNfaGVhZGVyLkRpckNvdW50OyBuKysgKQorICAgICAgZmFjZS0+dHRjX2hlYWRlci5UYWJsZURpcmVjdG9yeVtuXSA9IEdFVF9VTG9uZygpOworCisgICAgRk9SR0VUX0ZyYW1lKCk7CisKKyAgICBGVF9UUkFDRTMoKCAiY29sbGVjdGlvbnMgZGlyZWN0b3J5IGxvYWRlZC5cbiIgKSk7CisKKyAgRXhpdDoKKyAgICByZXR1cm4gZXJyb3I7CisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX0xvYWRfRGlyZWN0b3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIExvYWRzIHRoZSB0YWJsZSBkaXJlY3RvcnkgaW50byBhIGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZhY2UgICAgICA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzdHJlYW0gICAgOjogVGhlIGlucHV0IHN0cmVhbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZmFjZUluZGV4IDo6IFRoZSBpbmRleCBvZiB0aGUgVHJ1ZVR5cGUgZm9udCwgaWYgd2UncmUgb3BlbmluZyBhICAgICovCisgIC8qICAgICAgICAgICAgICAgICBjb2xsZWN0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRydWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgTE9DQUxfRlVOQworICBUVF9FcnJvciAgVFRfTG9hZF9EaXJlY3RvcnkoIFRUX0ZhY2UgICAgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gIHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9Mb25nICAgIGZhY2VJbmRleCApCisgIHsKKyAgICBUVF9FcnJvciAgIGVycm9yOworICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gc3RyZWFtLT5tZW1vcnk7CisKKyAgICBUVF9VU2hvcnQgICAgbiwgbGltaXQ7CisgICAgVFRfVGFibGVEaXIgIHRhYmxlRGlyOworCisgICAgVFRfVGFibGVEaXJFbnRyeSogIGVudHJ5OworCisKKyAgICBGVF9UUkFDRTIoKCAiVFRfTG9hZF9EaXJlY3RvcnkoICUwOGx4LCAlbGQgKVxuIiwKKyAgICAgICAgICAgICAgKFRUX0xvbmcpZmFjZSwgZmFjZUluZGV4ICkpOworCisgICAgZXJyb3IgPSBUVF9Mb2FkX0NvbGxlY3Rpb24oIGZhY2UsIHN0cmVhbSApOworICAgIGlmICggZXJyb3IgKQorICAgIHsKKyAgICAgIC8qIGlmIHRoaXMgaXMgYSBgdHJhZGl0aW9uYWwnIGVycm9yLCBleGl0IG5vdyAqLworICAgICAgaWYgKCBlcnJvciAhPSBUVF9FcnJfRmlsZV9Jc19Ob3RfQ29sbGVjdGlvbiApCisgICAgICAgIGdvdG8gRXhpdDsKKworICAgICAgLyogdGhlIGZpbGUgaXNuJ3QgYSBjb2xsZWN0aW9uLCBleGl0IGlmIHdlJ3JlIGFza2luZyAqLworICAgICAgLyogZm9yIGEgY29sbGVjdGVkIGZvbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgICAgICAvKiBOb3RlIHRoYXQgd2UgZG9uJ3QgZXhpdCBkdXJpbmcgZm9udCBmb3JtYXQgY2hlY2tpbmcgKGkuZS4sICovCisgICAgICAvKiBmYWNlSW5kZXggaXMgLTEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICBpZiAoIGZhY2VJbmRleCA+IDAgKQorICAgICAgICBnb3RvIEV4aXQ7CisKKyAgICAgIC8qIE5vdyBza2lwIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUgKi8KKyAgICAgIGlmICggRklMRV9TZWVrKCAwICkgKQorICAgICAgICBnb3RvIEV4aXQ7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBUaGUgZmlsZSBpcyBhIGNvbGxlY3Rpb24uIENoZWNrIHRoZSBmb250IGluZGV4ICovCisgICAgICBpZiAoIGZhY2VJbmRleCA+PSBmYWNlLT50dGNfaGVhZGVyLkRpckNvdW50ICkKKyAgICAgIHsKKyAgICAgICAgZXJyb3IgPSBUVF9FcnJfQmFkX0FyZ3VtZW50OworICAgICAgICBnb3RvIEV4aXQ7CisgICAgICB9CisKKyAgICAgIC8qIGlmIHdlJ3JlIGNoZWNraW5nIHRoZSBmb250IGZvcm1hdCwgZXhpdCBpbW1lZGlhdGVseSAqLworICAgICAgaWYgKCBmYWNlSW5kZXggPCAwICkKKyAgICAgICAgZ290byBFeGl0OworCisgICAgICAvKiBzZWxlY3QgYSBUcnVlVHlwZSBmb250IGluIHRoZSB0dGMgZmlsZSAgICovCisgICAgICBpZiAoIEZJTEVfU2VlayggZmFjZS0+dHRjX2hlYWRlci5UYWJsZURpcmVjdG9yeVtmYWNlSW5kZXhdICkgKQorICAgICAgICBnb3RvIEV4aXQ7CisgICAgfQorCisgICAgaWYgKCBBQ0NFU1NfRnJhbWUoIDEyTCApICkKKyAgICAgIGdvdG8gRXhpdDsKKworICAgIHRhYmxlRGlyLnZlcnNpb24gICA9IEdFVF9Mb25nKCk7CisgICAgdGFibGVEaXIubnVtVGFibGVzID0gR0VUX1VTaG9ydCgpOworCisgICAgdGFibGVEaXIuc2VhcmNoUmFuZ2UgICA9IEdFVF9VU2hvcnQoKTsKKyAgICB0YWJsZURpci5lbnRyeVNlbGVjdG9yID0gR0VUX1VTaG9ydCgpOworICAgIHRhYmxlRGlyLnJhbmdlU2hpZnQgICAgPSBHRVRfVVNob3J0KCk7CisKKyAgICBGT1JHRVRfRnJhbWUoKTsKKworICAgIEZUX1RSQUNFMigoICItLSBUYWJsZXMgY291bnQgICA6ICUxMnVcbiIsICB0YWJsZURpci5udW1UYWJsZXMgKSk7CisgICAgRlRfVFJBQ0UyKCggIi0tIEZvcm1hdCB2ZXJzaW9uIDogJTA4bHhcbiIsIHRhYmxlRGlyLnZlcnNpb24gKSk7CisKKyAgICAvKiBDaGVjayB0aGF0IHdlIGhhdmUgYSBgc2ZudCcgZm9ybWF0IHRoZXJlICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiBXZSBtdXN0IGFsc28gYmUgYWJsZSB0byBhY2NlcHQgTWFjL0dYIGZvbnRzLCBhcyB3ZWxsIGFzIE9UIG9uZXMgKi8KKworICAgIGlmICggdGFibGVEaXIudmVyc2lvbiAhPSAweDAwMDEwMDAwICYmCisgICAgICAgICB0YWJsZURpci52ZXJzaW9uICE9IFRUQUdfdHJ1ZSAgJiYKKyAgICAgICAgIHRhYmxlRGlyLnZlcnNpb24gIT0gVFRBR19PVFRPICApCisgICAgeworICAgICAgRlRfVFJBQ0UyKCggIltub3QgYSB2YWxpZCBUVEYgb3IgT1RGIGZvbnRdIiApKTsKKyAgICAgIGVycm9yID0gVFRfRXJyX0ludmFsaWRfRmlsZV9Gb3JtYXQ7CisgICAgICBnb3RvIEV4aXQ7CisgICAgfQorCisgICAgLyogaWYgd2UncmUgcGVyZm9ybWluZyBhIGZvbnQgZm9ybWF0IGNoZWNrLCBleGl0IGltbWVkaWF0ZWx5ICovCisgICAgLyogd2l0aCBzdWNjZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgaWYgKCBmYWNlSW5kZXggPCAwICkKKyAgICAgIGdvdG8gRXhpdDsKKworICAgIGZhY2UtPm51bV90YWJsZXMgPSB0YWJsZURpci5udW1UYWJsZXM7CisKKyAgICBpZiAoIEFMTE9DX0FSUkFZKCBmYWNlLT5kaXJfdGFibGVzLAorICAgICAgICAgICAgICAgICAgICAgIGZhY2UtPm51bV90YWJsZXMsCisgICAgICAgICAgICAgICAgICAgICAgVFRfVGFibGVEaXJFbnRyeSApICkKKyAgICAgIGdvdG8gRXhpdDsKKworICAgIGlmICggQUNDRVNTX0ZyYW1lKCBmYWNlLT5udW1fdGFibGVzICogMTZMICkgKQorICAgICAgZ290byBFeGl0OworCisgICAgbGltaXQgPSBmYWNlLT5udW1fdGFibGVzOworICAgIGVudHJ5ID0gZmFjZS0+ZGlyX3RhYmxlczsKKworICAgIGZvciAoIG4gPSAwOyBuIDwgbGltaXQ7IG4rKyApCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAvKiBsb29wIHRocm91Z2ggdGhlIHRhYmxlcyBhbmQgZ2V0IGFsbCBlbnRyaWVzICovCisgICAgICBlbnRyeS0+VGFnICAgICAgPSBHRVRfVGFnNCgpOworICAgICAgZW50cnktPkNoZWNrU3VtID0gR0VUX1VMb25nKCk7CisgICAgICBlbnRyeS0+T2Zmc2V0ICAgPSBHRVRfTG9uZygpOworICAgICAgZW50cnktPkxlbmd0aCAgID0gR0VUX0xvbmcoKTsKKworICAgICAgRlRfVFJBQ0UyKCggIiAgJWMlYyVjJWMgIC0gICUwOGx4ICAtICAlMDhseFxuIiwKKyAgICAgICAgICAgICAgICAoVFRfQ2hhcikoZW50cnktPlRhZyA+PiAyNCksCisgICAgICAgICAgICAgICAgKFRUX0NoYXIpKGVudHJ5LT5UYWcgPj4gMTYpLAorICAgICAgICAgICAgICAgIChUVF9DaGFyKShlbnRyeS0+VGFnID4+IDggKSwKKyAgICAgICAgICAgICAgICAoVFRfQ2hhcikoZW50cnktPlRhZyksCisgICAgICAgICAgICAgICAgZW50cnktPk9mZnNldCwKKyAgICAgICAgICAgICAgICBlbnRyeS0+TGVuZ3RoICkpOworICAgICAgZW50cnkrKzsKKyAgICB9CisKKyAgICBGT1JHRVRfRnJhbWUoKTsKKworICAgIEZUX1RSQUNFMigoICJEaXJlY3RvcnkgbG9hZGVkXG5cbiIgKSk7CisKKyAgRXhpdDoKKyAgICByZXR1cm4gZXJyb3I7CisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX0xvYWRfQW55ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIExvYWRzIGFueSBmb250IHRhYmxlIGludG8gY2xpZW50IG1lbW9yeS4gIFVzZWQgYnkgdGhlICAgICAgICAgICAgICAqLworICAvKiAgICBUVF9HZXRfRm9udF9EYXRhKCkgQVBJIGZ1bmN0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBmYWNlICAgOjogVGhlIGZhY2Ugb2JqZWN0IHRvIGxvb2sgZm9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHRhZyAgICA6OiBUaGUgdGFnIG9mIHRhYmxlIHRvIGxvYWQuICBVc2UgdGhlIHZhbHVlIDAgaWYgeW91ICB3YW50ICAqLworICAvKiAgICAgICAgICAgICAgdG8gYWNjZXNzIHRoZSB3aG9sZSBmb250IGZpbGUsIGVsc2Ugc2V0IHRoaXMgcGFyYW1ldGVyICAgKi8KKyAgLyogICAgICAgICAgICAgIHRvIGEgdmFsaWQgVHJ1ZVR5cGUgdGFibGUgdGFnIHRoYXQgeW91IGNhbiBmb3JnZSB3aXRoICAgICovCisgIC8qICAgICAgICAgICAgICB0aGUgTUFLRV9UVF9UQUcgbWFjcm8uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgb2Zmc2V0IDo6IFRoZSBzdGFydGluZyBvZmZzZXQgaW4gdGhlIHRhYmxlIChvciB0aGUgZmlsZSBpZiAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICB0YWcgPT0gMCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbGVuZ3RoIDo6IFRoZSBhZGRyZXNzIG9mIHRoZSBkZWNpc2lvbiB2YXJpYWJsZTogICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICBJZiBsZW5ndGggPT0gTlVMTDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICBMb2FkcyB0aGUgd2hvbGUgdGFibGUuICBSZXR1cm5zIGFuIGVycm9yIGlmICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgYG9mZnNldCcgPT0gMCEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgSWYgKmxlbmd0aCA9PSAwOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgRXhpdHMgaW1tZWRpYXRlbHk7IHJldHVybmluZyB0aGUgbGVuZ3RoIG9mIHRoZSBnaXZlbiAqLworICAvKiAgICAgICAgICAgICAgICAgIHRhYmxlIG9yIG9mIHRoZSBmb250IGZpbGUsIGRlcGVuZGluZyBvbiB0aGUgdmFsdWUgb2YgKi8KKyAgLyogICAgICAgICAgICAgICAgICBgdGFnJy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICBJZiAqbGVuZ3RoICE9IDA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICBMb2FkcyB0aGUgbmV4dCBgbGVuZ3RoJyBieXRlcyBvZiB0YWJsZSBvciBmb250LCAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgc3RhcnRpbmcgYXQgb2Zmc2V0IGBvZmZzZXQnIChpbiB0YWJsZSBvciBmb250IHRvbykuICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGJ1ZmZlciA6OiBUaGUgYWRkcmVzcyBvZiB0YXJnZXQgYnVmZmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRydWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgTE9DQUxfRlVOQworICBUVF9FcnJvciAgVFRfTG9hZF9BbnkoIFRUX0ZhY2UgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgIFRUX1VMb25nICB0YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgVFRfTG9uZyAgIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIFRUX0xvbmcqICBsZW5ndGggKQorICB7CisgICAgVFRfRXJyb3IgICBlcnJvcjsKKyAgICBGVF9TdHJlYW0gIHN0cmVhbTsKKyAgICBUVF9Mb25nICAgIHRhYmxlOworICAgIFRUX1VMb25nICAgc2l6ZTsKKworCisgICAgaWYgKCB0YWcgIT0gMCApCisgICAgeworICAgICAgLyogbG9vayBmb3IgdGFnIGluIGZvbnQgZGlyZWN0b3J5ICovCisgICAgICB0YWJsZSA9IFRUX0xvb2tVcF9UYWJsZSggZmFjZSwgdGFnICk7CisgICAgICBpZiAoIHRhYmxlIDwgMCApCisgICAgICB7CisgICAgICAgIGVycm9yID0gVFRfRXJyX1RhYmxlX01pc3Npbmc7CisgICAgICAgIGdvdG8gRXhpdDsKKyAgICAgIH0KKworICAgICAgb2Zmc2V0ICs9IGZhY2UtPmRpcl90YWJsZXNbdGFibGVdLk9mZnNldDsKKyAgICAgIHNpemUgICAgPSBmYWNlLT5kaXJfdGFibGVzW3RhYmxlXS5MZW5ndGg7CisgICAgfQorICAgIGVsc2UKKyAgICAvKiB0YWcgPSAwIC0tIHRoZSB1c2Ugd2FudCB0byBhY2Nlc3MgdGhlIGZvbnQgZmlsZSBkaXJlY3RseSAqLworICAgIHsKKyAgICAgIHNpemUgPSBmYWNlLT5yb290LnN0cmVhbS0+c2l6ZTsKKyAgICB9CisKKyAgICBpZiAoIGxlbmd0aCAmJiAqbGVuZ3RoID09IDAgKQorICAgIHsKKyAgICAgICpsZW5ndGggPSBzaXplOworCisgICAgICByZXR1cm4gVFRfRXJyX09rOworICAgIH0KKworICAgIGlmICggbGVuZ3RoICkKKyAgICAgIHNpemUgPSAqbGVuZ3RoOworCisgICAgc3RyZWFtID0gZmFjZS0+cm9vdC5zdHJlYW07CisgICAgKHZvaWQpRklMRV9SZWFkX0F0KCBvZmZzZXQsIGJ1ZmZlciwgc2l6ZSApOworCisgIEV4aXQ6CisgICAgcmV0dXJuIGVycm9yOworICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUVF9Mb2FkX0hlYWRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBMb2FkcyB0aGUgVHJ1ZVR5cGUgZm9udCBoZWFkZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBmYWNlICAgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgc3RyZWFtIDo6IFRoZSBpbnB1dCBzdHJlYW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVHJ1ZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBMT0NBTF9GVU5DCisgIFRUX0Vycm9yICBUVF9Mb2FkX0hlYWRlciggVFRfRmFjZSAgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgc3RyZWFtICkKKyAgeworICAgIFRUX0Vycm9yICBlcnJvcjsKKworICAgIFRUX0xvbmcgICAgIHRhYmxlOworICAgIFRUX0hlYWRlciogIGhlYWRlcjsKKworCisgICAgRlRfVFJBQ0UyKCggIkxvYWRfVFRfSGVhZGVyKCAlMDhseCApXG4iLCAoVFRfTG9uZylmYWNlICkpOworCisgICAgaWYgKCAoIHRhYmxlID0gVFRfTG9va1VwX1RhYmxlKCBmYWNlLCBUVEFHX2hlYWQgKSApIDwgMCApCisgICAgeworICAgICAgRlRfVFJBQ0UwKCggIkZvbnQgSGVhZGVyIGlzIG1pc3NpbmchXG4iICkpOworICAgICAgZXJyb3IgPSBUVF9FcnJfSGVhZGVyX1RhYmxlX01pc3Npbmc7CisKKyAgICAgIGdvdG8gRXhpdDsKKyAgICB9CisKKyAgICBpZiAoIEZJTEVfU2VlayggZmFjZS0+ZGlyX3RhYmxlc1t0YWJsZV0uT2Zmc2V0ICkgfHwKKyAgICAgICAgIEFDQ0VTU19GcmFtZSggNTRMICkgKQorICAgICAgZ290byBFeGl0OworCisgICAgaGVhZGVyID0gJmZhY2UtPmhlYWRlcjsKKworICAgIGhlYWRlci0+VGFibGVfVmVyc2lvbiA9IEdFVF9VTG9uZygpOworICAgIGhlYWRlci0+Rm9udF9SZXZpc2lvbiA9IEdFVF9VTG9uZygpOworCisgICAgaGVhZGVyLT5DaGVja1N1bV9BZGp1c3QgPSBHRVRfTG9uZygpOworICAgIGhlYWRlci0+TWFnaWNfTnVtYmVyICAgID0gR0VUX0xvbmcoKTsKKworICAgIGhlYWRlci0+RmxhZ3MgICAgICAgID0gR0VUX1VTaG9ydCgpOworICAgIGhlYWRlci0+VW5pdHNfUGVyX0VNID0gR0VUX1VTaG9ydCgpOworCisgICAgaGVhZGVyLT5DcmVhdGVkIFswXSA9IEdFVF9Mb25nKCk7CisgICAgaGVhZGVyLT5DcmVhdGVkIFsxXSA9IEdFVF9Mb25nKCk7CisgICAgaGVhZGVyLT5Nb2RpZmllZFswXSA9IEdFVF9Mb25nKCk7CisgICAgaGVhZGVyLT5Nb2RpZmllZFsxXSA9IEdFVF9Mb25nKCk7CisKKyAgICBoZWFkZXItPnhNaW4gPSBHRVRfU2hvcnQoKTsKKyAgICBoZWFkZXItPnlNaW4gPSBHRVRfU2hvcnQoKTsKKyAgICBoZWFkZXItPnhNYXggPSBHRVRfU2hvcnQoKTsKKyAgICBoZWFkZXItPnlNYXggPSBHRVRfU2hvcnQoKTsKKworICAgIGhlYWRlci0+TWFjX1N0eWxlICAgICAgID0gR0VUX1VTaG9ydCgpOworICAgIGhlYWRlci0+TG93ZXN0X1JlY19QUEVNID0gR0VUX1VTaG9ydCgpOworCisgICAgaGVhZGVyLT5Gb250X0RpcmVjdGlvbiAgICAgID0gR0VUX1Nob3J0KCk7CisgICAgaGVhZGVyLT5JbmRleF9Ub19Mb2NfRm9ybWF0ID0gR0VUX1Nob3J0KCk7CisgICAgaGVhZGVyLT5HbHlwaF9EYXRhX0Zvcm1hdCAgID0gR0VUX1Nob3J0KCk7CisKKyAgICBGT1JHRVRfRnJhbWUoKTsKKworICAgIEZUX1RSQUNFMigoICIgICAgVW5pdHMgcGVyIEVNIDogJTh1XG4iLCBoZWFkZXItPlVuaXRzX1Blcl9FTSApKTsKKyAgICBGVF9UUkFDRTIoKCAiICAgIEluZGV4VG9Mb2MgICA6ICU4ZFxuIiwgaGVhZGVyLT5JbmRleF9Ub19Mb2NfRm9ybWF0ICkpOworICAgIEZUX1RSQUNFMigoICJGb250IEhlYWRlciBMb2FkZWQuXG4iICkpOworCisgIEV4aXQ6CisgICAgcmV0dXJuIGVycm9yOworICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUVF9Mb2FkX01heFByb2ZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBMb2FkcyB0aGUgbWF4aW11bSBwcm9maWxlIGludG8gYSBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBmYWNlICAgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgc3RyZWFtIDo6IFRoZSBpbnB1dCBzdHJlYW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVHJ1ZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBMT0NBTF9GVU5DCisgIFRUX0Vycm9yICBUVF9Mb2FkX01heFByb2ZpbGUoIFRUX0ZhY2UgICAgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICBzdHJlYW0gKQorICB7CisgICAgVFRfRXJyb3IgIGVycm9yOworCisgICAgVFRfTG9uZyAgICAgICAgIGk7CisgICAgVFRfTWF4UHJvZmlsZSogIG1heFByb2ZpbGUgPSAmZmFjZS0+bWF4X3Byb2ZpbGU7CisKKworICAgIEZUX1RSQUNFMigoICJMb2FkX1RUX01heFByb2ZpbGUoICUwOGx4IClcbiIsIChUVF9Mb25nKWZhY2UgKSk7CisKKyAgICBpZiAoICggaSA9IFRUX0xvb2tVcF9UYWJsZSggZmFjZSwgVFRBR19tYXhwICkgKSA8IDAgKQorICAgIHsKKyAgICAgIGVycm9yID0gVFRfRXJyX01heF9Qcm9maWxlX01pc3Npbmc7CisKKyAgICAgIGdvdG8gRXhpdDsKKyAgICB9CisKKyAgICBpZiAoIEZJTEVfU2VlayggZmFjZS0+ZGlyX3RhYmxlc1tpXS5PZmZzZXQgKSB8fAorICAgICAgICAgQUNDRVNTX0ZyYW1lKCAzMkwgKSAgICAgICAgICAgICAgICAgICAgKQorICAgICAgZ290byBFeGl0OworCisgICAgLyogcmVhZCBmcmFtZSBkYXRhIGludG8gZmFjZSB0YWJsZSAqLworICAgIG1heFByb2ZpbGUtPnZlcnNpb24gICAgICAgICAgICAgICA9IEdFVF9VTG9uZygpOworICAgIG1heFByb2ZpbGUtPm51bUdseXBocyAgICAgICAgICAgICA9IEdFVF9VU2hvcnQoKTsKKworICAgIG1heFByb2ZpbGUtPm1heFBvaW50cyAgICAgICAgICAgICA9IEdFVF9VU2hvcnQoKTsKKyAgICBtYXhQcm9maWxlLT5tYXhDb250b3VycyAgICAgICAgICAgPSBHRVRfVVNob3J0KCk7CisgICAgbWF4UHJvZmlsZS0+bWF4Q29tcG9zaXRlUG9pbnRzICAgID0gR0VUX1VTaG9ydCgpOworICAgIG1heFByb2ZpbGUtPm1heENvbXBvc2l0ZUNvbnRvdXJzICA9IEdFVF9VU2hvcnQoKTsKKworICAgIG1heFByb2ZpbGUtPm1heFpvbmVzICAgICAgICAgICAgICA9IEdFVF9VU2hvcnQoKTsKKyAgICBtYXhQcm9maWxlLT5tYXhUd2lsaWdodFBvaW50cyAgICAgPSBHRVRfVVNob3J0KCk7CisKKyAgICBtYXhQcm9maWxlLT5tYXhTdG9yYWdlICAgICAgICAgICAgPSBHRVRfVVNob3J0KCk7CisgICAgbWF4UHJvZmlsZS0+bWF4RnVuY3Rpb25EZWZzICAgICAgID0gR0VUX1VTaG9ydCgpOworICAgIG1heFByb2ZpbGUtPm1heEluc3RydWN0aW9uRGVmcyAgICA9IEdFVF9VU2hvcnQoKTsKKyAgICBtYXhQcm9maWxlLT5tYXhTdGFja0VsZW1lbnRzICAgICAgPSBHRVRfVVNob3J0KCk7CisgICAgbWF4UHJvZmlsZS0+bWF4U2l6ZU9mSW5zdHJ1Y3Rpb25zID0gR0VUX1VTaG9ydCgpOworICAgIG1heFByb2ZpbGUtPm1heENvbXBvbmVudEVsZW1lbnRzICA9IEdFVF9VU2hvcnQoKTsKKyAgICBtYXhQcm9maWxlLT5tYXhDb21wb25lbnREZXB0aCAgICAgPSBHRVRfVVNob3J0KCk7CisKKyAgICBGT1JHRVRfRnJhbWUoKTsKKworICAgIC8qIFhYWDogYW4gYWRqdXN0bWVudCB0aGF0IGlzIG5lY2Vzc2FyeSB0byBsb2FkIGNlcnRhaW4gKi8KKyAgICAvKiAgICAgICBicm9rZW4gZm9udHMgbGlrZSBgS2V5c3Ryb2tlcyBNVCcgOi0oICAgICAgICAgICovCisgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICAgV2UgYWxsb2NhdGUgNjQgZnVuY3Rpb24gZW50cmllcyBieSBkZWZhdWx0IHdoZW4gICAgKi8KKyAgICAvKiAgIHRoZSBtYXhGdW5jdGlvbkRlZnMgZmllbGQgaXMgbnVsbC4gICAgICAgICAgICAgICAgICovCisKKyAgICBpZiAoIG1heFByb2ZpbGUtPm1heEZ1bmN0aW9uRGVmcyA9PSAwICkKKyAgICAgIG1heFByb2ZpbGUtPm1heEZ1bmN0aW9uRGVmcyA9IDY0OworCisgICAgZmFjZS0+cm9vdC5udW1fZ2x5cGhzID0gbWF4UHJvZmlsZS0+bnVtR2x5cGhzOworCisgICAgZmFjZS0+cm9vdC5tYXhfcG9pbnRzID0gTUFYKCBtYXhQcm9maWxlLT5tYXhDb21wb3NpdGVQb2ludHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhQcm9maWxlLT5tYXhQb2ludHMgKTsKKworICAgIGZhY2UtPnJvb3QubWF4X2NvbnRvdXJzID0gTUFYKCBtYXhQcm9maWxlLT5tYXhDb21wb3NpdGVDb250b3VycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4UHJvZmlsZS0+bWF4Q29udG91cnMgKTsKKworICAgIGZhY2UtPm1heF9jb21wb25lbnRzID0gKFRUX1VMb25nKW1heFByb2ZpbGUtPm1heENvbXBvbmVudEVsZW1lbnRzICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFByb2ZpbGUtPm1heENvbXBvbmVudERlcHRoOworCisgICAgRlRfVFJBQ0UyKCggIkdBU1AgbG9hZGVkLlxuIiApKTsKKworICBFeGl0OgorICAgIHJldHVybiBlcnJvcjsKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfTG9hZF9NZXRyaWNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgTG9hZHMgdGhlIGhvcml6b250YWwgb3IgdmVydGljYWwgbWV0cmljcyB0YWJsZSBpbnRvIGEgZmFjZSBvYmplY3QuICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZmFjZSAgICAgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHN0cmVhbSAgIDo6IFRoZSBpbnB1dCBzdHJlYW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB2ZXJ0aWNhbCA6OiBBIGJvb2xlYW4gZmxhZy4gIElmIHNldCwgbG9hZCB2ZXJ0aWNhbCBtZXRyaWNzLiAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUcnVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0YXRpYworICBUVF9FcnJvciAgVFRfTG9hZF9NZXRyaWNzKCBUVF9GYWNlICAgIGZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9Cb29sICAgIHZlcnRpY2FsICkKKyAgeworICAgIFRUX0Vycm9yICAgZXJyb3I7CisgICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBzdHJlYW0tPm1lbW9yeTsKKworICAgIFRUX1VTaG9ydCAgICAgICAgICBuLCBudW1fc2hvcnRzLCBudW1fbG9uZ3M7CisgICAgVFRfTG9uZyAgICAgICAgICAgIHRhYmxlOworCisgICAgVFRfTG9uZ01ldHJpY3MqKiAgIGxvbmdzOworICAgIFRUX1Nob3J0TWV0cmljcyoqICBzaG9ydHM7CisKKyAgICBUVF9Mb25nTWV0cmljcyogICAgbG9uZ19tZXRyaWM7CisKKyAgICBGVF9UUkFDRTIoKCAiVFRfTG9hZF8lc19NZXRyaWNzKCAlMDhseCApXG4iLAorICAgICAgICAgICAgICB2ZXJ0aWNhbCA/ICJWZXJ0aWNhbCIgOiAiSG9yaXpvbnRhbCIsIChUVF9Mb25nKWZhY2UgKSk7CisKKyAgICBpZiAoIHZlcnRpY2FsICkKKyAgICB7CisgICAgICAvKiBUaGUgdGFibGUgaXMgb3B0aW9uYWwsIHF1aXQgc2lsZW50bHkgaWYgaXQgd2Fzbid0IGZvdW5kICAgICAgICovCisgICAgICAvKiBYWFg6IFNvbWUgZm9udHMgaGF2ZSBhIHZhbGlkIHZlcnRpY2FsIGhlYWRlciB3aXRoIGEgbm9uLW51bGwgICovCisgICAgICAvKiAgICAgIGBudW1iZXJfb2ZfVk1ldHJpY3MnIGZpZWxkcywgYnV0IG5vIGNvcnJlc3BvbmRpbmcgYHZtdHgnICovCisgICAgICAvKiAgICAgIHRhYmxlIHRvIGdldCB0aGUgbWV0cmljcyBmcm9tIChlLmcuIG1pbmdsaXUpLiAgICAgICAgICAgICovCisgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAvKiAgICAgIEZvciBzYWZldHksIHdlIHNldCB0aGUgZmllbGQgdG8gMCEgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICB0YWJsZSA9IFRUX0xvb2tVcF9UYWJsZSggZmFjZSwgVFRBR192bXR4ICk7CisgICAgICBpZiAoIHRhYmxlIDwgMCApCisgICAgICB7CisgICAgICAgIC8qIFNldCB0aGUgbnVtYmVyX09mX1ZNZXRyaWNzIHRvIDAhICovCisgICAgICAgIEZUX1RSQUNFMigoICIgIG5vIHZlcnRpY2FsIGhlYWRlciBpbiBmaWxlLlxuIiApKTsKKyAgICAgICAgZmFjZS0+dmVydGljYWwubnVtYmVyX09mX1ZNZXRyaWNzID0gMDsKKyAgICAgICAgZXJyb3IgPSBUVF9FcnJfT2s7CisKKyAgICAgICAgZ290byBFeGl0OworICAgICAgfQorCisgICAgICBudW1fbG9uZ3MgPSBmYWNlLT52ZXJ0aWNhbC5udW1iZXJfT2ZfVk1ldHJpY3M7CisgICAgICBsb25ncyAgICAgPSAoVFRfTG9uZ01ldHJpY3MqKikmZmFjZS0+dmVydGljYWwubG9uZ19tZXRyaWNzOworICAgICAgc2hvcnRzICAgID0gKFRUX1Nob3J0TWV0cmljcyoqKSZmYWNlLT52ZXJ0aWNhbC5zaG9ydF9tZXRyaWNzOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaWYgKCAoIHRhYmxlID0gVFRfTG9va1VwX1RhYmxlKCBmYWNlLCBUVEFHX2htdHggKSApIDwgMCApCisgICAgICB7CisgICAgICAgIEZUX0VSUk9SKCggIiBubyBob3Jpem9udGFsIG1ldHJpY3MgaW4gZmlsZSFcbiIgKSk7CisgICAgICAgIGVycm9yID0gVFRfRXJyX0htdHhfVGFibGVfTWlzc2luZzsKKworICAgICAgICBnb3RvIEV4aXQ7CisgICAgICB9CisKKyAgICAgIG51bV9sb25ncyA9IGZhY2UtPmhvcml6b250YWwubnVtYmVyX09mX0hNZXRyaWNzOworICAgICAgbG9uZ3MgICAgID0gKFRUX0xvbmdNZXRyaWNzKiopJmZhY2UtPmhvcml6b250YWwubG9uZ19tZXRyaWNzOworICAgICAgc2hvcnRzICAgID0gKFRUX1Nob3J0TWV0cmljcyoqKSZmYWNlLT5ob3Jpem9udGFsLnNob3J0X21ldHJpY3M7CisgICAgfQorCisgICAgbnVtX3Nob3J0cyA9IGZhY2UtPm1heF9wcm9maWxlLm51bUdseXBocyAtIG51bV9sb25nczsKKworICAgIGlmICggbnVtX2xvbmdzID4gZmFjZS0+bWF4X3Byb2ZpbGUubnVtR2x5cGhzICkgIC8qIHNhbml0eSBjaGVjayAqLworICAgIHsKKyAgICAgIEZUX0VSUk9SKCggIiBtb3JlIG1ldHJpY3MgdGhhbiBnbHlwaHMhXG4iICkpOworICAgICAgZXJyb3IgPSBUVF9FcnJfSW52YWxpZF9Ib3Jpel9NZXRyaWNzOworCisgICAgICBnb3RvIEV4aXQ7CisgICAgfQorCisgICAgaWYgKCBBTExPQ19BUlJBWSggKmxvbmdzLCAgbnVtX2xvbmdzLCAgVFRfTG9uZ01ldHJpY3MgKSB8fAorICAgICAgICAgQUxMT0NfQVJSQVkoICpzaG9ydHMsIG51bV9zaG9ydHMsIFRUX1Nob3J0TWV0cmljcyApICkKKyAgICAgIGdvdG8gRXhpdDsKKworICAgIGlmICggRklMRV9TZWVrKCBmYWNlLT5kaXJfdGFibGVzW3RhYmxlXS5PZmZzZXQgKSAgIHx8CisgICAgICAgICBBQ0NFU1NfRnJhbWUoIGZhY2UtPmRpcl90YWJsZXNbdGFibGVdLkxlbmd0aCApICkKKyAgICAgIGdvdG8gRXhpdDsKKworICAgIGxvbmdfbWV0cmljID0gKmxvbmdzOworICAgIGZvciAoIG4gPSAwOyBuIDwgbnVtX2xvbmdzOyBuKysgKQorICAgIHsKKyAgICAgIGxvbmdfbWV0cmljLT5hZHZhbmNlID0gR0VUX1VTaG9ydCgpOworICAgICAgbG9uZ19tZXRyaWMtPmJlYXJpbmcgPSBHRVRfU2hvcnQoKTsKKyAgICAgIGxvbmdfbWV0cmljKys7CisgICAgfQorCisgICAgZm9yICggbiA9IDA7IG4gPCBudW1fc2hvcnRzOyBuKysgKQorICAgICAgKCpzaG9ydHMpW25dID0gR0VUX1Nob3J0KCk7CisKKyAgICBGT1JHRVRfRnJhbWUoKTsKKworICAgIEZUX1RSQUNFMigoICJsb2FkZWRcbiIgKSk7CisKKyAgRXhpdDoKKyAgICByZXR1cm4gZXJyb3I7CisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX0xvYWRfTWV0cmljc19IZWFkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIExvYWRzIHRoZSBob3Jpem9udGFsIG9yIHZlcnRpY2FsIGhlYWRlciBpbiBhIGZhY2Ugb2JqZWN0LiAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZhY2UgICAgIDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzdHJlYW0gICA6OiBUaGUgaW5wdXQgc3RyZWFtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgdmVydGljYWwgOjogQSBib29sZWFuIGZsYWcuICBJZiBzZXQsIGxvYWQgdmVydGljYWwgbWV0cmljcy4gICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVHJ1ZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBMT0NBTF9GVU5DCisgIFRUX0Vycm9yICBUVF9Mb2FkX01ldHJpY3NfSGVhZGVyKCBUVF9GYWNlICAgIGZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gIHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX0Jvb2wgICAgdmVydGljYWwgKQorICB7CisgICAgVFRfRXJyb3IgIGVycm9yOworCisgICAgVFRfTG9uZyAgICAgICAgIHRhYmxlOworICAgIFRUX0hvcmlIZWFkZXIqICBoZWFkZXI7CisKKworICAgIEZUX1RSQUNFMigoIHZlcnRpY2FsID8gIlZlcnRpY2FsIGhlYWRlciAiIDogIkhvcml6b250YWwgaGVhZGVyICIgKSk7CisKKyAgICBpZiAoIHZlcnRpY2FsICkKKyAgICB7CisgICAgICBmYWNlLT52ZXJ0aWNhbF9pbmZvID0gMDsKKworICAgICAgLyogVGhlIHZlcnRpY2FsIGhlYWRlciB0YWJsZSBpcyBvcHRpb25hbCwgc28gcmV0dXJuIHF1aWV0bHkgaWYgKi8KKyAgICAgIC8qIHdlIGRvbid0IGZpbmQgaXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICBpZiAoICggdGFibGUgPSBUVF9Mb29rVXBfVGFibGUoIGZhY2UsIFRUQUdfdmhlYSApICkgPCAwICkKKyAgICAgIHsKKyAgICAgICAgZXJyb3IgPSBUVF9FcnJfT2s7CisKKyAgICAgICAgZ290byBFeGl0OworICAgICAgfQorCisgICAgICBmYWNlLT52ZXJ0aWNhbF9pbmZvID0gMTsKKyAgICAgIGhlYWRlciA9IChUVF9Ib3JpSGVhZGVyKikmZmFjZS0+dmVydGljYWw7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBUaGUgaG9yaXpvbnRhbCBoZWFkZXIgaXMgbWFuZGF0b3J5LCByZXR1cm4gYW4gZXJyb3IgaWYgd2UgKi8KKyAgICAgIC8qIGRvbid0IGZpbmQgaXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgaWYgKCAoIHRhYmxlID0gVFRfTG9va1VwX1RhYmxlKCBmYWNlLCBUVEFHX2hoZWEgKSApIDwgMCApCisgICAgICB7CisgICAgICAgIGVycm9yID0gVFRfRXJyX0hvcml6X0hlYWRlcl9NaXNzaW5nOworCisgICAgICAgIGdvdG8gRXhpdDsKKyAgICAgIH0KKworICAgICAgaGVhZGVyID0gJmZhY2UtPmhvcml6b250YWw7CisgICAgfQorCisgICAgaWYgKCBGSUxFX1NlZWsoIGZhY2UtPmRpcl90YWJsZXNbdGFibGVdLk9mZnNldCApIHx8CisgICAgICAgICBBQ0NFU1NfRnJhbWUoIDM2TCApICkKKyAgICAgIGdvdG8gRXhpdDsKKworICAgIGhlYWRlci0+VmVyc2lvbiAgID0gR0VUX1VMb25nKCk7CisgICAgaGVhZGVyLT5Bc2NlbmRlciAgPSBHRVRfU2hvcnQoKTsKKyAgICBoZWFkZXItPkRlc2NlbmRlciA9IEdFVF9TaG9ydCgpOworICAgIGhlYWRlci0+TGluZV9HYXAgID0gR0VUX1Nob3J0KCk7CisKKyAgICBoZWFkZXItPmFkdmFuY2VfV2lkdGhfTWF4ID0gR0VUX1VTaG9ydCgpOworCisgICAgaGVhZGVyLT5taW5fTGVmdF9TaWRlX0JlYXJpbmcgID0gR0VUX1Nob3J0KCk7CisgICAgaGVhZGVyLT5taW5fUmlnaHRfU2lkZV9CZWFyaW5nID0gR0VUX1Nob3J0KCk7CisgICAgaGVhZGVyLT54TWF4X0V4dGVudCAgICAgICAgICAgID0gR0VUX1Nob3J0KCk7CisgICAgaGVhZGVyLT5jYXJldF9TbG9wZV9SaXNlICAgICAgID0gR0VUX1Nob3J0KCk7CisgICAgaGVhZGVyLT5jYXJldF9TbG9wZV9SdW4gICAgICAgID0gR0VUX1Nob3J0KCk7CisKKyAgICBoZWFkZXItPlJlc2VydmVkWzBdID0gR0VUX1Nob3J0KCk7CisgICAgaGVhZGVyLT5SZXNlcnZlZFsxXSA9IEdFVF9TaG9ydCgpOworICAgIGhlYWRlci0+UmVzZXJ2ZWRbMl0gPSBHRVRfU2hvcnQoKTsKKyAgICBoZWFkZXItPlJlc2VydmVkWzNdID0gR0VUX1Nob3J0KCk7CisgICAgaGVhZGVyLT5SZXNlcnZlZFs0XSA9IEdFVF9TaG9ydCgpOworCisgICAgaGVhZGVyLT5tZXRyaWNfRGF0YV9Gb3JtYXQgPSBHRVRfU2hvcnQoKTsKKyAgICBoZWFkZXItPm51bWJlcl9PZl9ITWV0cmljcyA9IEdFVF9VU2hvcnQoKTsKKworICAgIEZPUkdFVF9GcmFtZSgpOworCisgICAgaGVhZGVyLT5sb25nX21ldHJpY3MgID0gTlVMTDsKKyAgICBoZWFkZXItPnNob3J0X21ldHJpY3MgPSBOVUxMOworCisgICAgRlRfVFJBQ0UyKCggImxvYWRlZFxuIiApKTsKKworICAgIC8qIE5vdyB0cnkgdG8gbG9hZCB0aGUgY29ycmVzcG9uZGluZyBtZXRyaWNzICovCisKKyAgICBlcnJvciA9IFRUX0xvYWRfTWV0cmljcyggZmFjZSwgc3RyZWFtLCB2ZXJ0aWNhbCApOworCisgIEV4aXQ6CisgICAgcmV0dXJuIGVycm9yOworICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUVF9Mb2FkX05hbWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBMb2FkcyB0aGUgbmFtZSByZWNvcmRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBmYWNlICAgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgc3RyZWFtIDo6IFRoZSBpbnB1dCBzdHJlYW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVHJ1ZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBMT0NBTF9GVU5DCisgIFRUX0Vycm9yICBUVF9Mb2FkX05hbWVzKCBUVF9GYWNlICBmYWNlLCBGVF9TdHJlYW0gIHN0cmVhbSApCisgIHsKKyAgICBUVF9FcnJvciAgIGVycm9yOworICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gc3RyZWFtLT5tZW1vcnk7CisKKyAgICBUVF9VU2hvcnQgIGk7CisgICAgVFRfTG9uZyAgICB0YWJsZTsKKyAgICBUVF9Mb25nICAgIHN0b3JhZ2VTaXplOworCisgICAgVFRfTmFtZVRhYmxlKiAgbmFtZXM7CisgICAgVFRfTmFtZVJlYyogICAgbmFtZXJlYzsKKworCisgICAgRlRfVFJBQ0UyKCggIk5hbWVzICIgKSk7CisKKyAgICBpZiAoICggdGFibGUgPSBUVF9Mb29rVXBfVGFibGUoIGZhY2UsIFRUQUdfbmFtZSApICkgPCAwICkKKyAgICB7CisgICAgICAvKiBUaGUgbmFtZSB0YWJsZSBpcyByZXF1aXJlZCBzbyBpbmRpY2F0ZSBmYWlsdXJlLiAqLworICAgICAgRlRfVFJBQ0UyKCggImlzIG1pc3NpbmchXG4iICkpOworICAgICAgZXJyb3IgPSBUVF9FcnJfTmFtZV9UYWJsZV9NaXNzaW5nOworCisgICAgICBnb3RvIEV4aXQ7CisgICAgfQorCisgICAgLyogU2VlayB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSB0YWJsZSBhbmQgY2hlY2sgdGhlIGZyYW1lIGFjY2Vzcy4gKi8KKyAgICAvKiBUaGUgbmFtZXMgdGFibGUgaGFzIGEgNiBieXRlIGhlYWRlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGlmICggRklMRV9TZWVrKCBmYWNlLT5kaXJfdGFibGVzW3RhYmxlXS5PZmZzZXQgKSB8fAorICAgICAgICAgQUNDRVNTX0ZyYW1lKCA2TCApICkKKyAgICAgIGdvdG8gRXhpdDsKKworICAgIG5hbWVzID0gJmZhY2UtPm5hbWVfdGFibGU7CisKKyAgICAvKiBMb2FkIHRoZSBpbml0aWFsIG5hbWVzIGRhdGEuICovCisgICAgbmFtZXMtPmZvcm1hdCAgICAgICAgID0gR0VUX1VTaG9ydCgpOworICAgIG5hbWVzLT5udW1OYW1lUmVjb3JkcyA9IEdFVF9VU2hvcnQoKTsKKyAgICBuYW1lcy0+c3RvcmFnZU9mZnNldCAgPSBHRVRfVVNob3J0KCk7CisKKyAgICBGT1JHRVRfRnJhbWUoKTsKKworICAgIC8qIEFsbG9jYXRlIHRoZSBhcnJheSBvZiBuYW1lIHJlY29yZHMuICovCisgICAgaWYgKCBBTExPQ19BUlJBWSggbmFtZXMtPm5hbWVzLAorICAgICAgICAgICAgICAgICAgICAgIG5hbWVzLT5udW1OYW1lUmVjb3JkcywKKyAgICAgICAgICAgICAgICAgICAgICBUVF9OYW1lUmVjICkgICAgICAgICAgICAgICAgICAgfHwKKyAgICAgICAgIEFDQ0VTU19GcmFtZSggbmFtZXMtPm51bU5hbWVSZWNvcmRzICogMTJMICkgKQorICAgICAgZ290byBFeGl0OworCisgICAgLyogTG9hZCB0aGUgbmFtZSByZWNvcmRzIGFuZCBkZXRlcm1pbmUgaG93IG11Y2ggc3RvcmFnZSBpcyBuZWVkZWQgKi8KKyAgICAvKiB0byBob2xkIHRoZSBzdHJpbmdzIHRoZW1zZWx2ZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIG5hbWVyZWMgICAgID0gbmFtZXMtPm5hbWVzOworICAgIHN0b3JhZ2VTaXplID0gMDsKKworICAgIGZvciAoIGkgPSAwOyBpIDwgbmFtZXMtPm51bU5hbWVSZWNvcmRzOyBpKyssIG5hbWVyZWMrKyApCisgICAgeworICAgICAgVFRfTG9uZyAgdXBwZXI7CisKKworICAgICAgbmFtZXJlYy0+cGxhdGZvcm1JRCAgID0gR0VUX1VTaG9ydCgpOworICAgICAgbmFtZXJlYy0+ZW5jb2RpbmdJRCAgID0gR0VUX1VTaG9ydCgpOworICAgICAgbmFtZXJlYy0+bGFuZ3VhZ2VJRCAgID0gR0VUX1VTaG9ydCgpOworICAgICAgbmFtZXJlYy0+bmFtZUlEICAgICAgID0gR0VUX1VTaG9ydCgpOworICAgICAgbmFtZXJlYy0+c3RyaW5nTGVuZ3RoID0gR0VUX1VTaG9ydCgpOworICAgICAgbmFtZXJlYy0+c3RyaW5nT2Zmc2V0ID0gR0VUX1VTaG9ydCgpOworCisgICAgICB1cHBlciA9IG5hbWVyZWMtPnN0cmluZ09mZnNldCArIG5hbWVyZWMtPnN0cmluZ0xlbmd0aDsKKyAgICAgIGlmICggdXBwZXIgPiBzdG9yYWdlU2l6ZSApIHN0b3JhZ2VTaXplID0gdXBwZXI7CisgICAgfQorCisgICAgRk9SR0VUX0ZyYW1lKCk7CisKKyAgICBpZiAoIEFMTE9DKCBuYW1lcy0+c3RvcmFnZSwgc3RvcmFnZVNpemUgKSAgfHwKKyAgICAgICAgIEZJTEVfUmVhZF9BdCggZmFjZS0+ZGlyX3RhYmxlc1t0YWJsZV0uT2Zmc2V0ICsgbmFtZXMtPnN0b3JhZ2VPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluYW1lcy0+c3RvcmFnZSwgc3RvcmFnZVNpemUgKSApCisgICAgICBnb3RvIEV4aXQ7CisKKyAgICAvKiBHbyB0aHJvdWdoIGFuZCBhc3NpZ24gdGhlIHN0cmluZyBwb2ludGVycyB0byB0aGUgbmFtZSByZWNvcmRzLiAqLworICAgIG5hbWVyZWMgPSBuYW1lcy0+bmFtZXM7CisgICAgZm9yICggaSA9IDA7IGkgPCBuYW1lcy0+bnVtTmFtZVJlY29yZHM7IGkrKywgbmFtZXJlYysrICkKKyAgICAgIG5hbWVyZWMtPnN0cmluZyA9IG5hbWVzLT5zdG9yYWdlICsgbmFtZXJlYy0+c3RyaW5nT2Zmc2V0OworCisgICAgLyogUHJpbnQgTmFtZSBSZWNvcmQgVGFibGUgaW4gY2FzZSBvZiBkZWJ1Z2dpbmcgKi8KKyNpZiAwCisgICAgbmFtZXJlYyA9IG5hbWVzLT5uYW1lczsKKyAgICBmb3IgKCBpID0gMDsgaSA8IG5hbWVzLT5udW1OYW1lUmVjb3JkczsgaSsrLCBuYW1lcmVjKysgKQorICAgIHsKKyAgICAgIFRUX1VTaG9ydCAgajsKKworCisgICAgICBGVF9UUkFDRTIoKCAiJWQgJWQgJXggJWQgIiwKKyAgICAgICAgICAgICAgICAgICBuYW1lcmVjLT5wbGF0Zm9ybUlELAorICAgICAgICAgICAgICAgICAgIG5hbWVyZWMtPmVuY29kaW5nSUQsCisgICAgICAgICAgICAgICAgICAgbmFtZXJlYy0+bGFuZ3VhZ2VJRCwKKyAgICAgICAgICAgICAgICAgICBuYW1lcmVjLT5uYW1lSUQgKSk7CisKKyAgICAgIC8qIEkga25vdyB0aGF0IE0kIGVuY29kZWQgc3RyaW5ncyBhcmUgVW5pY29kZSwgICAgICAgICAgICAqLworICAgICAgLyogYnV0IHRoaXMgd29ya3MgcmVhc29uYWJsZSB3ZWxsIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMuICovCisgICAgICBpZiAoIG5hbWVyZWMtPnN0cmluZyApCisgICAgICAgIGZvciAoIGogPSAwOyBqIDwgbmFtZXJlYy0+c3RyaW5nTGVuZ3RoOyBqKysgKQorICAgICAgICB7CisgICAgICAgICAgVFRfQ2hhciAgYyA9ICoobmFtZXJlYy0+c3RyaW5nICsgaik7CisKKyAgICAgICAgICBpZiAoIChUVF9CeXRlKWMgPCAxMjggKQorICAgICAgICAgICAgRlRfVFJBQ0UyKCggIiVjIiwgYyApKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBGVF9UUkFDRTIoKCAiXG4iICkpOworI2VuZGlmCisKKyAgICBGVF9UUkFDRTIoKCAibG9hZGVkXG4iICkpOworCisgIEV4aXQ6CisgICAgcmV0dXJuIGVycm9yOworCisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX0ZyZWVfTmFtZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZyZWVzIHRoZSBuYW1lIHJlY29yZHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZhY2UgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRydWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgTE9DQUxfRlVOQworICBUVF9FcnJvciAgVFRfRnJlZV9OYW1lcyggVFRfRmFjZSAgZmFjZSApCisgIHsKKyAgICBGVF9NZW1vcnkgICAgICBtZW1vcnkgPSBmYWNlLT5yb290LmRyaXZlci0+bWVtb3J5OworICAgIFRUX05hbWVUYWJsZSogIG5hbWVzICA9ICZmYWNlLT5uYW1lX3RhYmxlOworCisKKyAgICAvKiBmcmVlIHN0cmluZ3MgdGFibGUgKi8KKyAgICBGUkVFKCBuYW1lcy0+bmFtZXMgKTsKKworICAgIC8qIGZyZWUgc3RyaW5ncyBzdG9yYWdlICovCisgICAgRlJFRSggbmFtZXMtPnN0b3JhZ2UgKTsKKworICAgIG5hbWVzLT5udW1OYW1lUmVjb3JkcyA9IDA7CisgICAgbmFtZXMtPmZvcm1hdCAgICAgICAgID0gMDsKKyAgICBuYW1lcy0+c3RvcmFnZU9mZnNldCAgPSAwOworCisgICAgcmV0dXJuIFRUX0Vycl9PazsKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfTG9hZF9DTWFwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgTG9hZHMgdGhlIGNtYXAgZGlyZWN0b3J5IGluIGEgZmFjZSBvYmplY3QuICBUaGUgY21hcHMgaXRzZWx2ZXMgYXJlICovCisgIC8qICAgIGxvYWRlZCBvbiBkZW1hbmQgaW4gdGhlIGB0dGNtYXAuYycgbW9kdWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZhY2UgICAgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzdHJlYW0gIDo6IEEgaGFuZGxlIHRvIHRoZSBpbnB1dCBzdHJlYW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgVHJ1ZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIExPQ0FMX0ZVTkMKKyAgVFRfRXJyb3IgIFRUX0xvYWRfQ01hcCggVFRfRmFjZSAgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gIHN0cmVhbSApCisgIHsKKyAgICBUVF9FcnJvciAgZXJyb3I7CisgICAgRlRfTWVtb3J5IG1lbW9yeSA9IHN0cmVhbS0+bWVtb3J5OworCisgICAgVFRfTG9uZyAgICBpLCBvZmYsIGN1cl9vZmYsIHRhYmxlX3N0YXJ0OworICAgIFRUX1VTaG9ydCAgbiwgbGltaXQ7CisKKyAgICBUVF9DTWFwRGlyICAgICAgICBjbWFwX2RpcjsKKyAgICBUVF9DaGFyTWFwICAgICAgICBjaGFybWFwOworICAgIFRUX0NNYXBUYWJsZSogICAgIGNtYXA7CisKKworICAgIEZUX1RSQUNFMigoICJDTWFwcyAiICkpOworCisgICAgaWYgKCAoIGkgPSBUVF9Mb29rVXBfVGFibGUoIGZhY2UsIFRUQUdfY21hcCApICkgPCAwICkKKyAgICB7CisgICAgICBlcnJvciA9IFRUX0Vycl9DTWFwX1RhYmxlX01pc3Npbmc7CisKKyAgICAgIGdvdG8gRXhpdDsKKyAgICB9CisKKyAgICB0YWJsZV9zdGFydCA9IGZhY2UtPmRpcl90YWJsZXNbaV0uT2Zmc2V0OworCisgICAgaWYgKCAoIEZJTEVfU2VlayggdGFibGVfc3RhcnQgKSApIHx8CisgICAgICAgICAoIEFDQ0VTU19GcmFtZSggNEwgKSApICkgICAgICAgICAgIC8qIDQgYnl0ZXMgY21hcCBoZWFkZXIgKi8KKyAgICAgIGdvdG8gRXhpdDsKKworICAgIGNtYXBfZGlyLnRhYmxlVmVyc2lvbk51bWJlciA9IEdFVF9VU2hvcnQoKTsKKyAgICBjbWFwX2Rpci5udW1DTWFwcyAgICAgICAgICAgPSBHRVRfVVNob3J0KCk7CisKKyAgICBGT1JHRVRfRnJhbWUoKTsKKworICAgIG9mZiA9IEZJTEVfUG9zKCk7ICAvKiBzYXZlIG9mZnNldCB0byBjbWFwZGlyW10gd2hpY2ggZm9sbG93cyAqLworCisgICAgLyogc2F2ZSBzcGFjZSBpbiBmYWNlIHRhYmxlIGZvciBjbWFwIHRhYmxlcyAqLworICAgIGlmICggQUxMT0NfQVJSQVkoIGZhY2UtPmNoYXJtYXBzLAorICAgICAgICAgICAgICAgICAgICAgIGNtYXBfZGlyLm51bUNNYXBzLAorICAgICAgICAgICAgICAgICAgICAgIFRUX0NoYXJNYXBSZWMgKSApCisgICAgICBnb3RvIEV4aXQ7CisKKyAgICBmYWNlLT5udW1fY2hhcm1hcHMgPSBjbWFwX2Rpci5udW1DTWFwczsKKworICAgIGxpbWl0ICAgPSBmYWNlLT5udW1fY2hhcm1hcHM7CisgICAgY2hhcm1hcCA9IGZhY2UtPmNoYXJtYXBzOworCisgICAgZm9yICggbiA9IDA7IG4gPCBsaW1pdDsgbisrICkKKyAgICB7CisgICAgICBjaGFybWFwLT5yb290LmZhY2UgPSAoRlRfRmFjZSlmYWNlOworICAgICAgY21hcCAgICAgICAgICAgICAgID0gJmNoYXJtYXAtPmNtYXA7CisKKyAgICAgIGlmICggRklMRV9TZWVrKCBvZmYgKSAgfHwKKyAgICAgICAgICAgQUNDRVNTX0ZyYW1lKCA4TCApICkKKyAgICAgICAgZ290byBFeGl0OworCisgICAgICBjbWFwLT5sb2FkZWQgICAgICAgICAgICAgPSBGQUxTRTsKKyAgICAgIGNtYXAtPnBsYXRmb3JtSUQgICAgICAgICA9IEdFVF9VU2hvcnQoKTsKKyAgICAgIGNtYXAtPnBsYXRmb3JtRW5jb2RpbmdJRCA9IEdFVF9VU2hvcnQoKTsKKworICAgICAgY3VyX29mZiA9IEdFVF9Mb25nKCk7CisKKyAgICAgIEZPUkdFVF9GcmFtZSgpOworCisgICAgICBvZmYgPSBGSUxFX1BvcygpOworCisgICAgICBpZiAoIEZJTEVfU2VlayggdGFibGVfc3RhcnQgKyBjdXJfb2ZmICkgfHwKKyAgICAgICAgICAgQUNDRVNTX0ZyYW1lKCA2TCApICkKKyAgICAgICAgZ290byBFeGl0OworCisgICAgICBjbWFwLT5mb3JtYXQgID0gR0VUX1VTaG9ydCgpOworICAgICAgY21hcC0+bGVuZ3RoICA9IEdFVF9VU2hvcnQoKTsKKyAgICAgIGNtYXAtPnZlcnNpb24gPSBHRVRfVVNob3J0KCk7CisKKyAgICAgIEZPUkdFVF9GcmFtZSgpOworCisgICAgICBjbWFwLT5vZmZzZXQgPSBGSUxFX1BvcygpOworCisgICAgICBjaGFybWFwKys7CisgICAgfQorCisgICAgRlRfVFJBQ0UyKCggImxvYWRlZFxuIiApKTsKKworICBFeGl0OgorICAgIHJldHVybiBlcnJvcjsKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfTG9hZF9PUzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgTG9hZHMgdGhlIE9TMiB0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZmFjZSAgIDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHN0cmVhbSA6OiBBIGhhbmRsZSB0byB0aGUgaW5wdXQgc3RyZWFtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRydWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgTE9DQUxfRlVOQworICBUVF9FcnJvciAgVFRfTG9hZF9PUzIoIFRUX0ZhY2UgICAgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gIHN0cmVhbSApCisgIHsKKyAgICBUVF9FcnJvciAgZXJyb3I7CisKKyAgICBUVF9Mb25nICAgaTsKKyAgICBUVF9JbnQgICAgajsKKyAgICBUVF9PUzIqICAgb3MyOworCisKKyAgICBGVF9UUkFDRTIoKCAiT1MvMiBUYWJsZSAiICkpOworCisgICAgLyogV2Ugbm93IHN1cHBvcnQgb2xkIE1hYyBmb250cyB3aGVyZSB0aGUgT1MvMiB0YWJsZSBkb2Vzbid0ICAqLworICAgIC8qIGV4aXN0LiAgU2ltcGx5IHB1dCwgd2Ugc2V0IHRoZSBgdmVyc2lvbicgZmllbGQgdG8gMHhGRkZGICAgKi8KKyAgICAvKiBhbmQgdGVzdCB0aGlzIHZhbHVlIGVhY2ggdGltZSB3ZSBuZWVkIHRvIGFjY2VzcyB0aGUgdGFibGUuICovCisgICAgaWYgKCAoIGkgPSBUVF9Mb29rVXBfVGFibGUoIGZhY2UsIFRUQUdfT1MyICkgKSA8IDAgKQorICAgIHsKKyAgICAgIEZUX1RSQUNFMigoICJpcyBtaXNzaW5nXG4hIiApKTsKKyAgICAgICAgZmFjZS0+b3MyLnZlcnNpb24gPSAweEZGRkY7CisgICAgICBlcnJvciA9IFRUX0Vycl9PazsKKworICAgICAgZ290byBFeGl0OworICAgIH0KKworICAgIGlmICggRklMRV9TZWVrKCBmYWNlLT5kaXJfdGFibGVzW2ldLk9mZnNldCApIHx8CisgICAgICAgICBBQ0NFU1NfRnJhbWUoIDc4TCApICkKKyAgICAgIGdvdG8gRXhpdDsKKworICAgIG9zMiA9ICZmYWNlLT5vczI7CisKKyAgICBvczItPnZlcnNpb24gICAgICAgICAgICAgPSBHRVRfVVNob3J0KCk7CisgICAgb3MyLT54QXZnQ2hhcldpZHRoICAgICAgID0gR0VUX1Nob3J0KCk7CisgICAgb3MyLT51c1dlaWdodENsYXNzICAgICAgID0gR0VUX1VTaG9ydCgpOworICAgIG9zMi0+dXNXaWR0aENsYXNzICAgICAgICA9IEdFVF9VU2hvcnQoKTsKKyAgICBvczItPmZzVHlwZSAgICAgICAgICAgICAgPSBHRVRfU2hvcnQoKTsKKyAgICBvczItPnlTdWJzY3JpcHRYU2l6ZSAgICAgPSBHRVRfU2hvcnQoKTsKKyAgICBvczItPnlTdWJzY3JpcHRZU2l6ZSAgICAgPSBHRVRfU2hvcnQoKTsKKyAgICBvczItPnlTdWJzY3JpcHRYT2Zmc2V0ICAgPSBHRVRfU2hvcnQoKTsKKyAgICBvczItPnlTdWJzY3JpcHRZT2Zmc2V0ICAgPSBHRVRfU2hvcnQoKTsKKyAgICBvczItPnlTdXBlcnNjcmlwdFhTaXplICAgPSBHRVRfU2hvcnQoKTsKKyAgICBvczItPnlTdXBlcnNjcmlwdFlTaXplICAgPSBHRVRfU2hvcnQoKTsKKyAgICBvczItPnlTdXBlcnNjcmlwdFhPZmZzZXQgPSBHRVRfU2hvcnQoKTsKKyAgICBvczItPnlTdXBlcnNjcmlwdFlPZmZzZXQgPSBHRVRfU2hvcnQoKTsKKyAgICBvczItPnlTdHJpa2VvdXRTaXplICAgICAgPSBHRVRfU2hvcnQoKTsKKyAgICBvczItPnlTdHJpa2VvdXRQb3NpdGlvbiAgPSBHRVRfU2hvcnQoKTsKKyAgICBvczItPnNGYW1pbHlDbGFzcyAgICAgICAgPSBHRVRfU2hvcnQoKTsKKworICAgIGZvciAoIGogPSAwOyBqIDwgMTA7IGorKyApCisgICAgICBvczItPnBhbm9zZVtqXSA9IEdFVF9CeXRlKCk7CisKKyAgICBvczItPnVsVW5pY29kZVJhbmdlMSAgICAgPSBHRVRfVUxvbmcoKTsKKyAgICBvczItPnVsVW5pY29kZVJhbmdlMiAgICAgPSBHRVRfVUxvbmcoKTsKKyAgICBvczItPnVsVW5pY29kZVJhbmdlMyAgICAgPSBHRVRfVUxvbmcoKTsKKyAgICBvczItPnVsVW5pY29kZVJhbmdlNCAgICAgPSBHRVRfVUxvbmcoKTsKKworICAgIGZvciAoIGogPSAwOyBqIDwgNDsgaisrICkKKyAgICAgIG9zMi0+YWNoVmVuZElEW2pdID0gR0VUX0J5dGUoKTsKKworICAgIG9zMi0+ZnNTZWxlY3Rpb24gICAgICAgICA9IEdFVF9VU2hvcnQoKTsKKyAgICBvczItPnVzRmlyc3RDaGFySW5kZXggICAgPSBHRVRfVVNob3J0KCk7CisgICAgb3MyLT51c0xhc3RDaGFySW5kZXggICAgID0gR0VUX1VTaG9ydCgpOworICAgIG9zMi0+c1R5cG9Bc2NlbmRlciAgICAgICA9IEdFVF9TaG9ydCgpOworICAgIG9zMi0+c1R5cG9EZXNjZW5kZXIgICAgICA9IEdFVF9TaG9ydCgpOworICAgIG9zMi0+c1R5cG9MaW5lR2FwICAgICAgICA9IEdFVF9TaG9ydCgpOworICAgIG9zMi0+dXNXaW5Bc2NlbnQgICAgICAgICA9IEdFVF9VU2hvcnQoKTsKKyAgICBvczItPnVzV2luRGVzY2VudCAgICAgICAgPSBHRVRfVVNob3J0KCk7CisKKyAgICBGT1JHRVRfRnJhbWUoKTsKKworICAgIGlmICggb3MyLT52ZXJzaW9uID49IDB4MDAwMSApCisgICAgeworICAgICAgLyogb25seSB2ZXJzaW9uIDEgdGFibGVzICovCisKKyAgICAgIGlmICggQUNDRVNTX0ZyYW1lKCA4TCApICkgIC8qIHJlYWQgaW50byBmcmFtZSAqLworICAgICAgICBnb3RvIEV4aXQ7CisKKyAgICAgIG9zMi0+dWxDb2RlUGFnZVJhbmdlMSA9IEdFVF9VTG9uZygpOworICAgICAgb3MyLT51bENvZGVQYWdlUmFuZ2UyID0gR0VUX1VMb25nKCk7CisKKyAgICAgIEZPUkdFVF9GcmFtZSgpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgb3MyLT51bENvZGVQYWdlUmFuZ2UxID0gMDsKKyAgICAgIG9zMi0+dWxDb2RlUGFnZVJhbmdlMiA9IDA7CisgICAgfQorCisgICAgRlRfVFJBQ0UyKCggImxvYWRlZFxuIiApKTsKKworICBFeGl0OgorICAgIHJldHVybiBlcnJvcjsKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfTG9hZF9Qb3N0c2NyaXB0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgTG9hZHMgdGhlIFBvc3RzY3JpcHQgdGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZmFjZSAgIDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHN0cmVhbSA6OiBBIGhhbmRsZSB0byB0aGUgaW5wdXQgc3RyZWFtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRydWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgTE9DQUxfRlVOQworICBUVF9FcnJvciAgVFRfTG9hZF9Qb3N0U2NyaXB0KCBUVF9GYWNlICAgIGZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgc3RyZWFtICkKKyAgeworICAgIFRUX0Vycm9yICAgICAgICBlcnJvcjsKKyAgICBUVF9Mb25nICAgICAgICAgaTsKKyAgICBUVF9Qb3N0c2NyaXB0KiAgcG9zdCA9ICZmYWNlLT5wb3N0c2NyaXB0OworCisKKyAgICBGVF9UUkFDRTIoKCAiUG9zdFNjcmlwdCAiICkpOworCisgICAgaWYgKCAoIGkgPSBUVF9Mb29rVXBfVGFibGUoIGZhY2UsIFRUQUdfcG9zdCApICkgPCAwICkKKyAgICAgIHJldHVybiBUVF9FcnJfUG9zdF9UYWJsZV9NaXNzaW5nOworCisgICAgaWYgKCBGSUxFX1NlZWsoIGZhY2UtPmRpcl90YWJsZXNbaV0uT2Zmc2V0ICkgfHwKKyAgICAgICAgIEFDQ0VTU19GcmFtZSggMzJMICkgKQorICAgICAgcmV0dXJuIGVycm9yOworCisgICAgLyogcmVhZCBmcmFtZSBkYXRhIGludG8gZmFjZSB0YWJsZSAqLworCisgICAgcG9zdC0+Rm9ybWF0VHlwZSAgICAgICAgID0gR0VUX1VMb25nKCk7CisgICAgcG9zdC0+aXRhbGljQW5nbGUgICAgICAgID0gR0VUX1VMb25nKCk7CisgICAgcG9zdC0+dW5kZXJsaW5lUG9zaXRpb24gID0gR0VUX1Nob3J0KCk7CisgICAgcG9zdC0+dW5kZXJsaW5lVGhpY2tuZXNzID0gR0VUX1Nob3J0KCk7CisgICAgcG9zdC0+aXNGaXhlZFBpdGNoICAgICAgID0gR0VUX1VMb25nKCk7CisgICAgcG9zdC0+bWluTWVtVHlwZTQyICAgICAgID0gR0VUX1VMb25nKCk7CisgICAgcG9zdC0+bWF4TWVtVHlwZTQyICAgICAgID0gR0VUX1VMb25nKCk7CisgICAgcG9zdC0+bWluTWVtVHlwZTEgICAgICAgID0gR0VUX1VMb25nKCk7CisgICAgcG9zdC0+bWF4TWVtVHlwZTEgICAgICAgID0gR0VUX1VMb25nKCk7CisKKyAgICBGT1JHRVRfRnJhbWUoKTsKKworICAgIC8qIHdlIGRvbid0IGxvYWQgdGhlIGdseXBoIG5hbWVzLCB3ZSBkbyB0aGF0IGluIGFub3RoZXIgKi8KKyAgICAvKiBtb2R1bGUgKHR0cG9zdCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICBGVF9UUkFDRTIoKCAibG9hZGVkXG4iICkpOworCisgICAgcmV0dXJuIFRUX0Vycl9PazsKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfTG9hZF9HYXNwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgTG9hZHMgdGhlIGBHQVNQJyB0YWJsZSBpbnRvIGEgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZmFjZSAgIDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHN0cmVhbSA6OiBUaGUgaW5wdXQgc3RyZWFtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRydWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgTE9DQUxfRlVOQworICBUVF9FcnJvciAgVFRfTG9hZF9HYXNwKCBUVF9GYWNlICAgIGZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgc3RyZWFtICkKKyAgeworICAgIFRUX0Vycm9yICAgZXJyb3I7CisgICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBzdHJlYW0tPm1lbW9yeTsKKworICAgIFRUX0xvbmcgICAgICAgIHRhYmxlOworICAgIFRUX1VTaG9ydCAgICAgIG51bV9yYW5nZXM7CisgICAgVFRfVVNob3J0ICAgICAgajsKKyAgICBUVF9HYXNwUmFuZ2UqICBnYXNwcmFuZ2VzOworCisKKyAgICBGVF9UUkFDRTIoKCAiVFRfTG9hZF9HYXNwKCAlMDhseCApXG4iLCAoVFRfTG9uZylmYWNlICkpOworCisgICAgZXJyb3IgPSBUVF9FcnJfT2s7CisKKyAgICAvKiB0aGUgZ2FzcCB0YWJsZSBpcyBvcHRpb25hbCAqLworICAgIGlmICggKCB0YWJsZSA9IFRUX0xvb2tVcF9UYWJsZSggZmFjZSwgVFRBR19nYXNwICkgKSA8IDAgKQorICAgICAgZ290byBFeGl0OworCisgICAgaWYgKCBGSUxFX1NlZWsoIGZhY2UtPmRpcl90YWJsZXNbdGFibGVdLk9mZnNldCApIHx8CisgICAgICAgICBBQ0NFU1NfRnJhbWUoIDRMICkgKQorICAgICAgZ290byBFeGl0OworCisgICAgZmFjZS0+Z2FzcC52ZXJzaW9uICAgPSBHRVRfVVNob3J0KCk7CisgICAgZmFjZS0+Z2FzcC5udW1SYW5nZXMgPSBHRVRfVVNob3J0KCk7CisKKyAgICBGT1JHRVRfRnJhbWUoKTsKKworICAgIG51bV9yYW5nZXMgPSBmYWNlLT5nYXNwLm51bVJhbmdlczsKKyAgICBGVF9UUkFDRTMoKCAibnVtYmVyIG9mIHJhbmdlcyA9ICVkXG4iLCBudW1fcmFuZ2VzICkpOworCisgICAgaWYgKCBBTExPQ19BUlJBWSggZ2FzcHJhbmdlcywgbnVtX3JhbmdlcywgVFRfR2FzcFJhbmdlICkgfHwKKyAgICAgICAgIEFDQ0VTU19GcmFtZSggbnVtX3JhbmdlcyAqIDRMICkgKQorICAgICAgZ290byBFeGl0OworCisgICAgZmFjZS0+Z2FzcC5nYXNwUmFuZ2VzID0gZ2FzcHJhbmdlczsKKworICAgIGZvciAoIGogPSAwOyBqIDwgbnVtX3JhbmdlczsgaisrICkKKyAgICB7CisgICAgICBnYXNwcmFuZ2VzW2pdLm1heFBQRU0gID0gR0VUX1VTaG9ydCgpOworICAgICAgZ2FzcHJhbmdlc1tqXS5nYXNwRmxhZyA9IEdFVF9VU2hvcnQoKTsKKworICAgICAgRlRfVFJBQ0UzKCggIiBbbWF4OiVkIGZsYWc6JWRdIiwKKyAgICAgICAgICAgICAgICBnYXNwcmFuZ2VzW2pdLm1heFBQRU0sCisgICAgICAgICAgICAgICAgZ2FzcHJhbmdlc1tqXS5nYXNwRmxhZyApKTsKKyAgICB9CisgICAgRlRfVFJBQ0UzKCggIlxuIiApKTsKKworICAgIEZPUkdFVF9GcmFtZSgpOworCisgICAgRlRfVFJBQ0UyKCggIkdBU1AgbG9hZGVkXG4iICkpOworCisgIEV4aXQ6CisgICAgcmV0dXJuIGVycm9yOworICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUVF9Mb2FkX0tlcm4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBMb2FkcyB0aGUgZmlyc3Qga2VybmluZyB0YWJsZSB3aXRoIGZvcm1hdCAwIGluIHRoZSBmb250LiAgT25seSAgICAgKi8KKyAgLyogICAgYWNjZXB0cyB0aGUgZmlyc3QgaG9yaXpvbnRhbCBrZXJuaW5nIHRhYmxlLiAgRGV2ZWxvcGVycyBzaG91bGQgdXNlICovCisgIC8qICAgIHRoZSBgZnR4a2VybicgZXh0ZW5zaW9uIHRvIGFjY2VzcyBvdGhlciBrZXJuaW5nIHRhYmxlcyBpbiB0aGUgZm9udCAqLworICAvKiAgICBmaWxlLCBpZiB0aGV5IHJlYWxseSB3YW50IHRvLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBmYWNlICAgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgc3RyZWFtIDo6IFRoZSBpbnB1dCBzdHJlYW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVHJ1ZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBMT0NBTF9GVU5DCisgIFRUX0Vycm9yICBUVF9Mb2FkX0tlcm4oIFRUX0ZhY2UgICAgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICBzdHJlYW0gKQorICB7CisgICAgVFRfRXJyb3IgICBlcnJvcjsKKyAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IHN0cmVhbS0+bWVtb3J5OworCisgICAgVFRfTG9uZyAgICB0YWJsZTsKKyAgICBUVF9VU2hvcnQgIG4sIG51bV90YWJsZXMsIHZlcnNpb247CisKKworICAgIGVycm9yID0gVFRfRXJyX09rOworICAgIHRhYmxlID0gVFRfTG9va1VwX1RhYmxlKCBmYWNlLCBUVEFHX2tlcm4gKTsKKyAgICBpZiAoIHRhYmxlIDwgMCApCisgICAgICBnb3RvIEV4aXQ7CisKKyAgICBpZiAoIEZJTEVfU2VlayggZmFjZS0+ZGlyX3RhYmxlc1t0YWJsZV0uT2Zmc2V0ICkgfHwKKyAgICAgICAgIFJFQURfVVNob3J0KCB2ZXJzaW9uICkgICAgICAgICAgICAgICAgICAgICAgfHwKKyAgICAgICAgIFJFQURfVVNob3J0KCBudW1fdGFibGVzICkgICAgICAgICAgICAgICAgICAgKQorICAgICAgZ290byBFeGl0OworCisgICAgZm9yICggbiA9IDA7IG4gPCBudW1fdGFibGVzOyBuKysgKQorICAgIHsKKyAgICAgIFRUX1VTaG9ydCAgY292ZXJhZ2U7CisKKworICAgICAgaWYgKCBGSUxFX1NraXAoIDRMICkgICAgICAgICB8fAorICAgICAgICAgICBSRUFEX1VTaG9ydCggY292ZXJhZ2UgKSApCisgICAgICAgIGdvdG8gRXhpdDsKKworICAgICAgaWYgKCBjb3ZlcmFnZSA9PSAweDAwMDEgKQorICAgICAgeworICAgICAgICBUVF9VU2hvcnQgICAgICAgIG51bV9wYWlycywgbTsKKyAgICAgICAgVFRfS2Vybl8wX1BhaXIqICBwYWlyOworCisKKyAgICAgICAgLyogZm91bmQgYSBob3Jpem9udGFsIGZvcm1hdCAwIGtlcm5pbmcgdGFibGUgISAqLworICAgICAgICBpZiAoIFJFQURfVVNob3J0KCBudW1fcGFpcnMgKSB8fAorICAgICAgICAgICAgIEZJTEVfU2tpcCggNiApICkKKyAgICAgICAgICBnb3RvIEV4aXQ7CisKKyAgICAgICAgLyogYWxsb2NhdGUgYXJyYXkgb2Yga2VybmluZyBwYWlycyAqLworICAgICAgICBpZiAoIEFMTE9DX0FSUkFZKCBmYWNlLT5rZXJuX3BhaXJzLCBudW1fcGFpcnMsIFRUX0tlcm5fMF9QYWlyICkgKQorICAgICAgICAgIGdvdG8gRXhpdDsKKworICAgICAgICAvKiByZWFkIHRoZSBrZXJuaW5nIHBhaXJzICovCisgICAgICAgIGlmICggQUNDRVNTX0ZyYW1lKCA2TCAqIG51bV9wYWlycyApICkKKyAgICAgICAgICBnb3RvIEV4aXQ7CisKKyAgICAgICAgcGFpciA9IGZhY2UtPmtlcm5fcGFpcnM7CisgICAgICAgIGZvciAoIG0gPSAwOyBtIDwgbnVtX3BhaXJzOyBtKysgKQorICAgICAgICB7CisgICAgICAgICAgcGFpci0+bGVmdCAgPSBHRVRfVVNob3J0KCk7CisgICAgICAgICAgcGFpci0+cmlnaHQgPSBHRVRfVVNob3J0KCk7CisgICAgICAgICAgcGFpci0+dmFsdWUgPSBHRVRfVVNob3J0KCk7CisgICAgICAgICAgcGFpcisrOworICAgICAgICB9CisKKyAgICAgICAgRk9SR0VUX0ZyYW1lKCk7CisKKyAgICAgICAgZmFjZS0+bnVtX2tlcm5fcGFpcnMgICA9IG51bV9wYWlyczsKKyAgICAgICAgZmFjZS0+a2Vybl90YWJsZV9pbmRleCA9IG47CisgICAgICAgIGdvdG8gRXhpdDsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBubyBrZXJuIHRhYmxlIGZvdW5kIC0tIGRvZXNuJ3QgbWF0dGVyICovCisgICAgZmFjZS0+a2Vybl90YWJsZV9pbmRleCA9IC0xOworICAgIGZhY2UtPm51bV9rZXJuX3BhaXJzICAgPSAwOworICAgIGZhY2UtPmtlcm5fcGFpcnMgICAgICAgPSBOVUxMOworCisgIEV4aXQ6CisgICAgcmV0dXJuIGVycm9yOworICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUVF9Mb2FkX0hkbXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBMb2FkcyB0aGUgaG9yaXpvbnRhbCBkZXZpY2UgbWV0cmljcyB0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBmYWNlICAgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgc3RyZWFtIDo6IEEgaGFuZGxlIHRvIHRoZSBpbnB1dCBzdHJlYW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVHJ1ZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBMT0NBTF9GVU5DCisgIFRUX0Vycm9yICBUVF9Mb2FkX0hkbXgoIFRUX0ZhY2UgICAgZmFjZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgc3RyZWFtICkKKyAgeworICAgIFRUX0Vycm9yICBlcnJvcjsKKyAgICBGVF9NZW1vcnkgbWVtb3J5ID0gc3RyZWFtLT5tZW1vcnk7CisKKyAgICBUVF9IZG14UmVjKiAgcmVjOworICAgIFRUX0hkbXggICAgICBoZG14OworICAgIFRUX0xvbmcgICAgICB0YWJsZTsKKyAgICBUVF9VU2hvcnQgICAgbjsKKwlUVF9Mb25nICAgICAgbnVtX2dseXBoczsKKyAgICBUVF9Mb25nICAgICAgcmVjb3JkX3NpemU7CisKKyAgICBoZG14LnZlcnNpb24gICAgID0gMDsKKyAgICBoZG14Lm51bV9yZWNvcmRzID0gMDsKKyAgICBoZG14LnJlY29yZHMgICAgID0gMDsKKworICAgIGZhY2UtPmhkbXggPSBoZG14OworCisgICAgZXJyb3IgPSBUVF9FcnJfT2s7CisKKyAgICAvKiB0aHMgdGFibGUgaXMgb3B0aW9uYWwgKi8KKyAgICBpZiAoICggdGFibGUgPSBUVF9Mb29rVXBfVGFibGUoIGZhY2UsIFRUQUdfaGRteCApICkgPCAwICkKKyAgICAgIHJldHVybiBlcnJvcjsKKworICAgIGlmICggRklMRV9TZWVrKCBmYWNlLT5kaXJfdGFibGVzW3RhYmxlXS5PZmZzZXQgKSAgfHwKKyAgICAgICAgIEFDQ0VTU19GcmFtZSggOEwgKSApCisgICAgICBnb3RvIEV4aXQ7CisKKyAgICBoZG14LnZlcnNpb24gICAgID0gR0VUX1VTaG9ydCgpOworICAgIGhkbXgubnVtX3JlY29yZHMgPSBHRVRfU2hvcnQoKTsKKyAgICByZWNvcmRfc2l6ZSAgICAgID0gR0VUX0xvbmcoKTsKKworICAgIEZPUkdFVF9GcmFtZSgpOworCisgICAgLyogT25seSByZWNvZ25pemUgZm9ybWF0IDAgKi8KKyAgICBpZiAoIGhkbXgudmVyc2lvbiAhPSAwICkKKyAgICAgIGdvdG8gRXhpdDsKKworICAgIGlmICggQUxMT0MoIGhkbXgucmVjb3Jkcywgc2l6ZW9mICggVFRfSGRteFJlYyApICogaGRteC5udW1fcmVjb3JkcyApICkKKyAgICAgIGdvdG8gRXhpdDsKKworICAgIG51bV9nbHlwaHMgICA9IGZhY2UtPnJvb3QubnVtX2dseXBoczsKKyAgICByZWNvcmRfc2l6ZSAtPSBudW1fZ2x5cGhzICsgMjsKKyAgICByZWMgICAgICAgICAgPSBoZG14LnJlY29yZHM7CisKKyAgICBmb3IgKCBuID0gMDsgbiA8IGhkbXgubnVtX3JlY29yZHM7IG4rKyApCisgICAgeworICAgICAgLyogcmVhZCByZWNvcmQgKi8KKyAgICAgIGlmICggUkVBRF9CeXRlKCByZWMtPnBwZW0gICAgICApIHx8CisgICAgICAgICAgIFJFQURfQnl0ZSggcmVjLT5tYXhfd2lkdGggKSApCisgICAgICAgIGdvdG8gRXhpdDsKKworICAgICAgaWYgKCBBTExPQyggcmVjLT53aWR0aHMsIG51bV9nbHlwaHMgKSAgfHwKKyAgICAgICAgICAgRklMRV9SZWFkKCByZWMtPndpZHRocywgbnVtX2dseXBocyApICkKKyAgICAgICAgZ290byBFeGl0OworCisgICAgICAvKiBza2lwIHBhZGRpbmcgYnl0ZXMgKi8KKyAgICAgIGlmICggcmVjb3JkX3NpemUgPiAwICkKKyAgICAgICAgaWYgKCBGSUxFX1NraXAoIHJlY29yZF9zaXplICkgKQorICAgICAgICAgIGdvdG8gRXhpdDsKKworICAgICAgcmVjKys7CisgICAgfQorCisgICAgZmFjZS0+aGRteCA9IGhkbXg7CisKKyAgRXhpdDoKKyAgICByZXR1cm4gZXJyb3I7CisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX0ZyZWVfSGRteCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZyZWVzIHRoZSBob3Jpem9udGFsIGRldmljZSBtZXRyaWNzIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZhY2UgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRydWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgTE9DQUxfRlVOQworICBUVF9FcnJvciAgVFRfRnJlZV9IZG14KCBUVF9GYWNlICBmYWNlICkKKyAgeworICAgIGlmICggZmFjZSApCisgICAgeworICAgICAgVFRfVVNob3J0ICBuOworICAgICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBmYWNlLT5yb290LmRyaXZlci0+bWVtb3J5OworCisKKyAgICAgIGZvciAoIG4gPSAwOyBuIDwgZmFjZS0+aGRteC5udW1fcmVjb3JkczsgbisrICkKKyAgICAgICAgRlJFRSggZmFjZS0+aGRteC5yZWNvcmRzW25dLndpZHRocyApOworCisgICAgICBGUkVFKCBmYWNlLT5oZG14LnJlY29yZHMgKTsKKyAgICAgIGZhY2UtPmhkbXgubnVtX3JlY29yZHMgPSAwOworICAgIH0KKworICAgIHJldHVybiBUVF9FcnJfT2s7CisgIH0KKworCisvKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9zaGFyZWQvc2ZudC90dGxvYWQuaCBiL3NyYy9zaGFyZWQvc2ZudC90dGxvYWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODljOWUwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3NoYXJlZC9zZm50L3R0bG9hZC5oCkBAIC0wLDAgKzEsMzUzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICB0dGxvYWQuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgTG9hZCB0aGUgYmFzaWMgVHJ1ZVR5cGUgdGFibGVzLCBpLmUuLCB0YWJsZXMgdGhhdCBjYW4gYmUgZWl0aGVyIGluICAgKi8KKy8qICAgIFRURiBvciBPVEYgZm9udCAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAxOTk2LTE5OTkgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCAgICAgICAgKi8KKy8qICBtb2RpZmllZCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgICovCisvKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLworLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KKy8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjaWZuZGVmIFRUTE9BRF9ICisjZGVmaW5lIFRUTE9BRF9ICisKKworI2luY2x1ZGUgPGZ0c3RyZWFtLmg+CisjaW5jbHVkZSA8dHRvYmpzLmg+CisKKyNpZmRlZiBfX2NwbHVzcGx1cworICBleHRlcm4gIkMiIHsKKyNlbmRpZgorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfTG9va1VwX1RhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgTG9va3MgZm9yIGEgVHJ1ZVR5cGUgdGFibGUgYnkgbmFtZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZmFjZSA6OiBBIGZhY2Ugb2JqZWN0IGhhbmRsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHRhZyAgOjogVGhlICBzZWFyY2hlZCB0YWcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEluZGV4IG9mIHRhYmxlIGlmIGZvdW5kLCAtMSBvdGhlcndpc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgRVhQT1JUX0RFRgorICBUVF9Mb25nICBUVF9Mb29rVXBfVGFibGUoIFRUX0ZhY2UgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX1VMb25nICB0YWcgKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX0xvYWRfRGlyZWN0b3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIExvYWRzIHRoZSB0YWJsZSBkaXJlY3RvcnkgaW50byBhIGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZhY2UgICAgICA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzdHJlYW0gICAgOjogVGhlIGlucHV0IHN0cmVhbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZmFjZUluZGV4IDo6IFRoZSBpbmRleCBvZiB0aGUgVHJ1ZVR5cGUgZm9udCwgaWYgd2UncmUgb3BlbmluZyBhICAgICovCisgIC8qICAgICAgICAgICAgICAgICBjb2xsZWN0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRydWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgTE9DQUxfREVGCisgIFRUX0Vycm9yICBUVF9Mb2FkX0RpcmVjdG9yeSggVFRfRmFjZSAgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX0xvbmcgICAgZmFjZUluZGV4ICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUVF9Mb2FkX0FueSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBMb2FkcyBhbnkgZm9udCB0YWJsZSBpbnRvIGNsaWVudCBtZW1vcnkuICBVc2VkIGJ5IHRoZSAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfR2V0X0ZvbnRfRGF0YSgpIEFQSSBmdW5jdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZmFjZSAgIDo6IFRoZSBmYWNlIG9iamVjdCB0byBsb29rIGZvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB0YWcgICAgOjogVGhlIHRhZyBvZiB0YWJsZSB0byBsb2FkLiAgVXNlIHRoZSB2YWx1ZSAwIGlmIHlvdSAgd2FudCAgKi8KKyAgLyogICAgICAgICAgICAgIHRvIGFjY2VzcyB0aGUgd2hvbGUgZm9udCBmaWxlLCBlbHNlIHNldCB0aGlzIHBhcmFtZXRlciAgICovCisgIC8qICAgICAgICAgICAgICB0byBhIHZhbGlkIFRydWVUeXBlIHRhYmxlIHRhZyB0aGF0IHlvdSBjYW4gZm9yZ2Ugd2l0aCAgICAqLworICAvKiAgICAgICAgICAgICAgdGhlIE1BS0VfVFRfVEFHIG1hY3JvLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG9mZnNldCA6OiBUaGUgc3RhcnRpbmcgb2Zmc2V0IGluIHRoZSB0YWJsZSAob3IgdGhlIGZpbGUgaWYgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgdGFnID09IDApLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGxlbmd0aCA6OiBUaGUgYWRkcmVzcyBvZiB0aGUgZGVjaXNpb24gdmFyaWFibGU6ICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgSWYgbGVuZ3RoID09IE5VTEw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgTG9hZHMgdGhlIHdob2xlIHRhYmxlLiAgUmV0dXJucyBhbiBlcnJvciBpZiAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgIGBvZmZzZXQnID09IDAhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgIElmICpsZW5ndGggPT0gMDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgIEV4aXRzIGltbWVkaWF0ZWx5OyByZXR1cm5pbmcgdGhlIGxlbmd0aCBvZiB0aGUgZ2l2ZW4gKi8KKyAgLyogICAgICAgICAgICAgICAgICB0YWJsZSBvciBvZiB0aGUgZm9udCBmaWxlLCBkZXBlbmRpbmcgb24gdGhlIHZhbHVlIG9mICovCisgIC8qICAgICAgICAgICAgICAgICAgYHRhZycuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgSWYgKmxlbmd0aCAhPSAwOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgTG9hZHMgdGhlIG5leHQgYGxlbmd0aCcgYnl0ZXMgb2YgdGFibGUgb3IgZm9udCwgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgIHN0YXJ0aW5nIGF0IG9mZnNldCBgb2Zmc2V0JyAoaW4gdGFibGUgb3IgZm9udCB0b28pLiAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBidWZmZXIgOjogVGhlIGFkZHJlc3Mgb2YgdGFyZ2V0IGJ1ZmZlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUcnVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIExPQ0FMX0RFRgorICBUVF9FcnJvciAgVFRfTG9hZF9BbnkoIFRUX0ZhY2UgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgIFRUX1VMb25nICB0YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgVFRfTG9uZyAgIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIFRUX0xvbmcqICBsZW5ndGggKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX0xvYWRfSGVhZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIExvYWRzIHRoZSBUcnVlVHlwZSBmb250IGhlYWRlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZhY2UgICA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzdHJlYW0gOjogVGhlIGlucHV0IHN0cmVhbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUcnVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIExPQ0FMX0RFRgorICBUVF9FcnJvciAgVFRfTG9hZF9IZWFkZXIoIFRUX0ZhY2UgICAgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gIHN0cmVhbSApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfTG9hZF9NZXRyaWNzX0hlYWRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgTG9hZHMgdGhlIGhvcml6b250YWwgb3IgdmVydGljYWwgaGVhZGVyIGluIGEgZmFjZSBvYmplY3QuICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZmFjZSAgICAgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHN0cmVhbSAgIDo6IFRoZSBpbnB1dCBzdHJlYW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB2ZXJ0aWNhbCA6OiBBIGJvb2xlYW4gZmxhZy4gIElmIHNldCwgbG9hZCB2ZXJ0aWNhbCBtZXRyaWNzLiAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUcnVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIExPQ0FMX0RFRgorICBUVF9FcnJvciAgVFRfTG9hZF9NZXRyaWNzX0hlYWRlciggVFRfRmFjZSAgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9Cb29sICAgIHZlcnRpY2FsICk7CisKKworICBMT0NBTF9ERUYKKyAgVFRfRXJyb3IgIFRUX0xvYWRfQ01hcCggVFRfRmFjZSAgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gIHN0cmVhbSApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfTG9hZF9NYXhQcm9maWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgTG9hZHMgdGhlIG1heGltdW0gcHJvZmlsZSBpbnRvIGEgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZmFjZSAgIDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHN0cmVhbSA6OiBUaGUgaW5wdXQgc3RyZWFtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRydWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgTE9DQUxfREVGCisgIFRUX0Vycm9yICBUVF9Mb2FkX01heFByb2ZpbGUoIFRUX0ZhY2UgICAgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICBzdHJlYW0gKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX0xvYWRfTmFtZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIExvYWRzIHRoZSBuYW1lIHJlY29yZHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZhY2UgICA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzdHJlYW0gOjogVGhlIGlucHV0IHN0cmVhbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUcnVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIExPQ0FMX0RFRgorICBUVF9FcnJvciAgVFRfTG9hZF9OYW1lcyggVFRfRmFjZSAgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICBzdHJlYW0gKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX0xvYWRfT1MyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIExvYWRzIHRoZSBPUzIgdGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZhY2UgICA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzdHJlYW0gOjogQSBoYW5kbGUgdG8gdGhlIGlucHV0IHN0cmVhbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUcnVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIExPQ0FMX0RFRgorICBUVF9FcnJvciAgVFRfTG9hZF9PUzIoIFRUX0ZhY2UgICAgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gIHN0cmVhbSApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfTG9hZF9Qb3N0c2NyaXB0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgTG9hZHMgdGhlIFBvc3RzY3JpcHQgdGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZmFjZSAgIDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHN0cmVhbSA6OiBBIGhhbmRsZSB0byB0aGUgaW5wdXQgc3RyZWFtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRydWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgTE9DQUxfREVGCisgIFRUX0Vycm9yICBUVF9Mb2FkX1Bvc3RTY3JpcHQoIFRUX0ZhY2UgICAgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICBzdHJlYW0gKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX0xvYWRfSGRteCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIExvYWRzIHRoZSBob3Jpem9udGFsIGRldmljZSBtZXRyaWNzIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZhY2UgICA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzdHJlYW0gOjogQSBoYW5kbGUgdG8gdGhlIGlucHV0IHN0cmVhbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUcnVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIExPQ0FMX0RFRgorICBUVF9FcnJvciAgVFRfTG9hZF9IZG14KCBUVF9GYWNlICAgIGZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgc3RyZWFtICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUVF9GcmVlX05hbWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGcmVlcyB0aGUgbmFtZSByZWNvcmRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBmYWNlIDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUcnVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIExPQ0FMX0RFRgorICBUVF9FcnJvciAgVFRfRnJlZV9OYW1lcyggVFRfRmFjZSAgZmFjZSApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfRnJlZV9IZG14ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRnJlZXMgdGhlIGhvcml6b250YWwgZGV2aWNlIG1ldHJpY3MgdGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZmFjZSA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVHJ1ZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBMT0NBTF9ERUYKKyAgVFRfRXJyb3IgIFRUX0ZyZWVfSGRteCAoIFRUX0ZhY2UgIGZhY2UgKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX0xvYWRfS2VybiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIExvYWRzIHRoZSBmaXJzdCBrZXJuaW5nIHRhYmxlIHdpdGggZm9ybWF0IDAgaW4gdGhlIGZvbnQuICBPbmx5ICAgICAqLworICAvKiAgICBhY2NlcHRzIHRoZSBmaXJzdCBob3Jpem9udGFsIGtlcm5pbmcgdGFibGUuICBEZXZlbG9wZXJzIHNob3VsZCB1c2UgKi8KKyAgLyogICAgdGhlIGBmdHhrZXJuJyBleHRlbnNpb24gdG8gYWNjZXNzIG90aGVyIGtlcm5pbmcgdGFibGVzIGluIHRoZSBmb250ICovCisgIC8qICAgIGZpbGUsIGlmIHRoZXkgcmVhbGx5IHdhbnQgdG8uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZhY2UgICA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzdHJlYW0gOjogVGhlIGlucHV0IHN0cmVhbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUcnVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIExPQ0FMX0RFRgorICBUVF9FcnJvciAgVFRfTG9hZF9LZXJuKCBUVF9GYWNlICAgIGZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgc3RyZWFtICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUVF9Mb2FkX0dhc3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBMb2FkcyB0aGUgYEdBU1AnIHRhYmxlIGludG8gYSBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBmYWNlICAgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgc3RyZWFtIDo6IFRoZSBpbnB1dCBzdHJlYW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVHJ1ZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBMT0NBTF9ERUYKKyAgVFRfRXJyb3IgIFRUX0xvYWRfR2FzcCggVFRfRmFjZSAgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gIHN0cmVhbSApOworCisKKyNlbmRpZiAvKiBUVExPQURfSCAqLworCisKKy8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3NoYXJlZC9zZm50L3R0cG9zdC5jIGIvc3JjL3NoYXJlZC9zZm50L3R0cG9zdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwYWExOWYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvc2hhcmVkL3NmbnQvdHRwb3N0LmMKQEAgLTAsMCArMSw3MTMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHR0cG9zdC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBQb3N0c2NyaXB0IG5hbWVzIHRhYmxlIHByb2Nlc3NpbmcgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMTk5Ni0xOTk5IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQgICAgICAgICovCisvKiAgbW9kaWZpZWQgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICAqLworLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KKy8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCisvKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFRoZSBwb3N0IHRhYmxlIGlzIG5vdCBjb21wbGV0ZWx5IGxvYWRlZCBieSB0aGUgY29yZSBlbmdpbmUuICBUaGlzICAgICAqLworICAvKiBmaWxlIGxvYWRzIHRoZSBtaXNzaW5nIFBTIGdseXBoIG5hbWVzIGFuZCBpbXBsZW1lbnRzIGFuIEFQSSB0byBhY2Nlc3MgKi8KKyAgLyogdGhlbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjaW5jbHVkZSA8dHRwb3N0Lmg+CisjaW5jbHVkZSA8ZnRzdHJlYW0uaD4KKyNpbmNsdWRlIDx0dGVycm9ycy5oPgorI2luY2x1ZGUgPHR0bG9hZC5oPgorI2luY2x1ZGUgPHR0dGFncy5oPgorCisgIC8qIHRoZSAyNTggZGVmYXVsdCBNYWMgUFMgZ2x5cGggbmFtZXMgKi8KKworICBjb25zdCBUVF9TdHJpbmcqICBUVF9NYWNfUG9zdHNjcmlwdF9OYW1lc1syNThdID0KKyAgeworICAgIC8qICAgMCAqLworICAgICIubm90ZGVmIiwKKyAgICAiLm51bGwiLAorICAgICJDUiIsCisgICAgInNwYWNlIiwKKyAgICAiZXhjbGFtIiwKKyAgICAicXVvdGVkYmwiLAorICAgICJudW1iZXJzaWduIiwKKyAgICAiZG9sbGFyIiwKKyAgICAicGVyY2VudCIsCisgICAgImFtcGVyc2FuZCIsCisKKyAgICAvKiAgMTAgKi8KKyAgICAicXVvdGVzaW5nbGUiLAorICAgICJwYXJlbmxlZnQiLAorICAgICJwYXJlbnJpZ2h0IiwKKyAgICAiYXN0ZXJpc2siLAorICAgICJwbHVzIiwKKyAgICAiY29tbWEiLAorICAgICJoeXBoZW4iLAorICAgICJwZXJpb2QiLAorICAgICJzbGFzaCIsCisgICAgInplcm8iLAorCisgICAgLyogIDIwICovCisgICAgIm9uZSIsCisgICAgInR3byIsCisgICAgInRocmVlIiwKKyAgICAiZm91ciIsCisgICAgImZpdmUiLAorICAgICJzaXgiLAorICAgICJzZXZlbiIsCisgICAgImVpZ2h0IiwKKyAgICAibmluZSIsCisgICAgImNvbG9uIiwKKworICAgIC8qICAzMCAqLworICAgICJzZW1pY29sb24iLAorICAgICJsZXNzIiwKKyAgICAiZXF1YWwiLAorICAgICJncmVhdGVyIiwgInF1ZXN0aW9uIiwKKyAgICAiYXQiLAorICAgICJBIiwKKyAgICAiQiIsCisgICAgIkMiLAorICAgICJEIiwKKworICAgIC8qICA0MCAqLworICAgICJFIiwKKyAgICAiRiIsCisgICAgIkciLAorICAgICJIIiwKKyAgICAiSSIsCisgICAgIkoiLAorICAgICJLIiwKKyAgICAiTCIsCisgICAgIk0iLAorICAgICJOIiwKKworICAgIC8qICA1MCAqLworICAgICJPIiwKKyAgICAiUCIsCisgICAgIlEiLAorICAgICJSIiwKKyAgICAiUyIsCisgICAgIlQiLAorICAgICJVIiwKKyAgICAiViIsCisgICAgIlciLAorICAgICJYIiwKKworICAgIC8qICA2MCAqLworICAgICJZIiwKKyAgICAiWiIsCisgICAgImJyYWNrZXRsZWZ0IiwKKyAgICAiYmFja3NsYXNoIiwKKyAgICAiYnJhY2tldHJpZ2h0IiwKKyAgICAiYXNjaWljaXJjdW0iLAorICAgICJ1bmRlcnNjb3JlIiwKKyAgICAiZ3JhdmUiLAorICAgICJhIiwKKyAgICAiYiIsCisKKyAgICAvKiAgNzAgKi8KKyAgICAiYyIsCisgICAgImQiLAorICAgICJlIiwKKyAgICAiZiIsCisgICAgImciLAorICAgICJoIiwKKyAgICAiaSIsCisgICAgImoiLAorICAgICJrIiwKKyAgICAibCIsCisKKyAgICAvKiAgODAgKi8KKyAgICAibSIsCisgICAgIm4iLAorICAgICJvIiwKKyAgICAicCIsCisgICAgInEiLAorICAgICJyIiwKKyAgICAicyIsCisgICAgInQiLAorICAgICJ1IiwKKyAgICAidiIsCisKKyAgICAvKiAgOTAgKi8KKyAgICAidyIsCisgICAgIngiLAorICAgICJ5IiwKKyAgICAieiIsCisgICAgImJyYWNlbGVmdCIsCisgICAgImJhciIsCisgICAgImJyYWNlcmlnaHQiLAorICAgICJhc2NpaXRpbGRlIiwKKyAgICAiQWRpZXJlc2lzIiwKKyAgICAiQXJpbmciLAorCisgICAgLyogMTAwICovCisgICAgIkNjZWRpbGxhIiwKKyAgICAiRWFjdXRlIiwKKyAgICAiTnRpbGRlIiwKKyAgICAiT2RpZXJlc2lzIiwKKyAgICAiVWRpZXJlc2lzIiwKKyAgICAiYWFjdXRlIiwKKyAgICAiYWdyYXZlIiwKKyAgICAiYWNpcmN1bWZsZXgiLAorICAgICJhZGllcmVzaXMiLAorICAgICJhdGlsZGUiLAorCisgICAgLyogMTEwICovCisgICAgImFyaW5nIiwKKyAgICAiY2NlZGlsbGEiLAorICAgICJlYWN1dGUiLAorICAgICJlZ3JhdmUiLAorICAgICJlY2lyY3VtZmxleCIsCisgICAgImVkaWVyZXNpcyIsCisgICAgImlhY3V0ZSIsCisgICAgImlncmF2ZSIsCisgICAgImljaXJjdW1mbGV4IiwKKyAgICAiaWRpZXJlc2lzIiwKKworICAgIC8qIDEyMCAqLworICAgICJudGlsZGUiLAorICAgICJvYWN1dGUiLAorICAgICJvZ3JhdmUiLAorICAgICJvY2lyY3VtZmxleCIsCisgICAgIm9kaWVyZXNpcyIsCisgICAgIm90aWxkZSIsCisgICAgInVhY3V0ZSIsCisgICAgInVncmF2ZSIsCisgICAgInVjaXJjdW1mbGV4IiwKKyAgICAidWRpZXJlc2lzIiwKKworICAgIC8qIDEzMCAqLworICAgICJkYWdnZXIiLAorICAgICJkZWdyZWUiLAorICAgICJjZW50IiwKKyAgICAic3RlcmxpbmciLAorICAgICJzZWN0aW9uIiwKKyAgICAiYnVsbGV0IiwKKyAgICAicGFyYWdyYXBoIiwKKyAgICAiZ2VybWFuZGJscyIsCisgICAgInJlZ2lzdGVyZWQiLAorICAgICJjb3B5cmlnaHQiLAorCisgICAgLyogMTQwICovCisgICAgInRyYWRlbWFyayIsCisgICAgImFjdXRlIiwKKyAgICAiZGllcmVzaXMiLAorICAgICJub3RlcXVhbCIsCisgICAgIkFFIiwKKyAgICAiT3NsYXNoIiwKKyAgICAiaW5maW5pdHkiLAorICAgICJwbHVzbWludXMiLAorICAgICJsZXNzZXF1YWwiLAorICAgICJncmVhdGVyZXF1YWwiLAorCisgICAgLyogMTUwICovCisgICAgInllbiIsCisgICAgIm11IiwKKyAgICAicGFydGlhbGRpZmYiLAorICAgICJzdW1tYXRpb24iLAorICAgICJwcm9kdWN0IiwKKyAgICAicGkiLAorICAgICJpbnRlZ3JhbCIsCisgICAgIm9yZGZlbWluaW5lIiwKKyAgICAib3JkbWFzY3VsaW5lIiwKKyAgICAiT21lZ2EiLAorCisgICAgLyogMTYwICovCisgICAgImFlIiwKKyAgICAib3NsYXNoIiwKKyAgICAicXVlc3Rpb25kb3duIiwKKyAgICAiZXhjbGFtZG93biIsCisgICAgImxvZ2ljYWxub3QiLAorICAgICJyYWRpY2FsIiwKKyAgICAiZmxvcmluIiwKKyAgICAiYXBwcm94ZXF1YWwiLAorICAgICJEZWx0YSIsCisgICAgImd1aWxsZW1vdGxlZnQiLAorCisgICAgLyogMTcwICovCisgICAgImd1aWxsZW1vdHJpZ2h0IiwKKyAgICAiZWxsaXBzaXMiLAorICAgICJuYnNwYWNlIiwKKyAgICAiQWdyYXZlIiwKKyAgICAiQXRpbGRlIiwKKyAgICAiT3RpbGRlIiwKKyAgICAiT0UiLAorICAgICJvZSIsCisgICAgImVuZGFzaCIsCisgICAgImVtZGFzaCIsCisKKyAgICAvKiAxODAgKi8KKyAgICAicXVvdGVkYmxsZWZ0IiwKKyAgICAicXVvdGVkYmxyaWdodCIsCisgICAgInF1b3RlbGVmdCIsCisgICAgInF1b3RlcmlnaHQiLAorICAgICJkaXZpZGUiLAorICAgICJsb3plbmdlIiwKKyAgICAieWRpZXJlc2lzIiwKKyAgICAiWWRpZXJlc2lzIiwKKyAgICAiZnJhY3Rpb24iLAorICAgICJjdXJyZW5jeSIsCisKKyAgICAvKiAxOTAgKi8KKyAgICAiZ3VpbHNpbmdsbGVmdCIsCisgICAgImd1aWxzaW5nbHJpZ2h0IiwKKyAgICAiZmkiLAorICAgICJmbCIsCisgICAgImRhZ2dlcmRibCIsCisgICAgInBlcmlvZGNlbnRlcmVkIiwKKyAgICAicXVvdGVzaW5nbGJhc2UiLAorICAgICJxdW90ZWRibGJhc2UiLAorICAgICJwZXJ0aG91c2FuZCIsCisgICAgIkFjaXJjdW1mbGV4IiwKKworICAgIC8qIDIwMCAqLworICAgICJFY2lyY3VtZmxleCIsCisgICAgIkFhY3V0ZSIsCisgICAgIkVkaWVyZXNpcyIsCisgICAgIkVncmF2ZSIsCisgICAgIklhY3V0ZSIsCisgICAgIkljaXJjdW1mbGV4IiwKKyAgICAiSWRpZXJlc2lzIiwKKyAgICAiSWdyYXZlIiwKKyAgICAiT2FjdXRlIiwKKyAgICAiT2NpcmN1bWZsZXgiLAorCisgICAgLyogMjEwICovCisgICAgImFwcGxlIiwKKyAgICAiT2dyYXZlIiwKKyAgICAiVWFjdXRlIiwKKyAgICAiVWNpcmN1bWZsZXgiLAorICAgICJVZ3JhdmUiLAorICAgICJkb3RsZXNzaSIsCisgICAgImNpcmN1bWZsZXgiLAorICAgICAidGlsZGUiLAorICAgICAibWFjcm9uIiwKKyAgICAgImJyZXZlIiwKKworICAgIC8qIDIyMCAqLworICAgICJkb3RhY2NlbnQiLAorICAgICJyaW5nIiwKKyAgICAiY2VkaWxsYSIsCisgICAgImh1bmdhcnVtbGF1dCIsCisgICAgIm9nb25layIsCisgICAgImNhcm9uIiwKKyAgICAiTHNsYXNoIiwKKyAgICAibHNsYXNoIiwKKyAgICAiU2Nhcm9uIiwKKyAgICAic2Nhcm9uIiwKKworICAgIC8qIDIzMCAqLworICAgICJaY2Fyb24iLAorICAgICJ6Y2Fyb24iLAorICAgICJicm9rZW5iYXIiLAorICAgICJFdGgiLAorICAgICJldGgiLAorICAgICJZYWN1dGUiLAorICAgICJ5YWN1dGUiLAorICAgICJUaG9ybiIsCisgICAgInRob3JuIiwKKyAgICAibWludXMiLAorCisgICAgLyogMjQwICovCisgICAgIm11bHRpcGx5IiwKKyAgICAib25lc3VwZXJpb3IiLAorICAgICJ0d29zdXBlcmlvciIsCisgICAgInRocmVlc3VwZXJpb3IiLAorICAgICJvbmVoYWxmIiwKKyAgICAib25lcXVhcnRlciIsCisgICAgInRocmVlcXVhcnRlcnMiLAorICAgICJmcmFuYyIsCisgICAgIkdicmV2ZSIsCisgICAgImdicmV2ZSIsCisKKyAgICAvKiAyNTAgKi8KKyAgICAiSWRvdCIsCisgICAgIlNjZWRpbGxhIiwKKyAgICAic2NlZGlsbGEiLAorICAgICJDYWN1dGUiLAorICAgICJjYWN1dGUiLAorICAgICJDY2Fyb24iLAorICAgICJjY2Fyb24iLAorICAgICJkbWFjcm9uIiwKKyAgfTsKKworCisgIHN0YXRpYworICBUVF9FcnJvciAgTG9hZF9Gb3JtYXRfMjAoIFRUX0ZhY2UgICAgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gIHN0cmVhbSApCisgIHsKKyAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IHN0cmVhbS0+bWVtb3J5OworICAgIFRUX0Vycm9yICAgZXJyb3I7CisKKyAgICBUVF9VU2hvcnQgIG51bV9nbHlwaHM7CisgICAgVFRfVVNob3J0ICBudW1fbmFtZXM7CisKKyAgICBUVF9VU2hvcnQqIGdseXBoX2luZGljZXMgPSAwOworICAgIFRUX0NoYXIqKiAgbmFtZV9zdHJpbmdzICA9IDA7CisKKworICAgIGlmICggUkVBRF9VU2hvcnQoIG51bV9nbHlwaHMgKSApCisgICAgICBnb3RvIEV4aXQ7CisKKyAgICAvKiBVTkRPQ1VNRU5URUQhICBUaGUgbnVtYmVyIG9mIGdseXBocyBpbiB0aGlzIHRhYmxlIGNhbiBiZSBzbWFsbGVyICovCisgICAgLyogdGhhbiB0aGUgdmFsdWUgaW4gdGhlIG1heHAgdGFibGUgKGNmLiBjeWJlcmJpdC50dGYpLiAgICAgICAgICAgICAqLworCisgICAgLyogVGhlcmUgYWxyZWFkeSBleGlzdCBmb250cyB3aGljaCBoYXZlIG1vcmUgdGhhbiAzMjc2OCBnbHlwaCBuYW1lcyAqLworICAgIC8qIGluIHRoaXMgdGFibGUsIHNvIHRoZSB0ZXN0IGZvciB0aGlzIHRocmVzaG9sZCBoYXMgYmVlbiBkcm9wcGVkLiAgKi8KKworICAgIGlmICggbnVtX2dseXBocyA+IGZhY2UtPnJvb3QubnVtX2dseXBocyApCisgICAgeworICAgICAgZXJyb3IgPSBUVF9FcnJfSW52YWxpZF9GaWxlX0Zvcm1hdDsKKyAgICAgIGdvdG8gRXhpdDsKKyAgICB9CisKKyAgICAvKiBsb2FkIHRoZSBpbmRpY2VzICovCisgICAgeworICAgICAgVFRfVVNob3J0ICBuOworCisKKyAgICAgIGlmICggQUxMT0NfQVJSQVkgKCBnbHlwaF9pbmRpY2VzLCBudW1fZ2x5cGhzLCBUVF9VU2hvcnQgKSB8fAorICAgICAgICAgICBBQ0NFU1NfRnJhbWUoIG51bV9nbHlwaHMgKiAyTCApICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgZ290byBGYWlsOworCisgICAgICBmb3IgKCBuID0gMDsgbiA8IG51bV9nbHlwaHM7IG4rKyApCisgICAgICAgIGdseXBoX2luZGljZXNbbl0gPSBHRVRfVVNob3J0KCk7CisKKyAgICAgIEZPUkdFVF9GcmFtZSgpOworICAgIH0KKworICAgIC8qIGNvbXB1dGUgbnVtYmVyIG9mIG5hbWVzIHN0b3JlZCBpbiB0YWJsZSAqLworICAgIHsKKyAgICAgIFRUX1VTaG9ydCAgbjsKKworCisgICAgICBudW1fbmFtZXMgPSAwOworCisgICAgICBmb3IgKCBuID0gMDsgbiA8IG51bV9nbHlwaHM7IG4rKyApCisgICAgICB7CisgICAgICAgIFRUX1VTaG9ydCAgaW5kZXg7CisKKworICAgICAgICBpbmRleCA9IGdseXBoX2luZGljZXNbbl07CisgICAgICAgIGlmICggaW5kZXggPj0gMjU4ICkKKyAgICAgICAgeworICAgICAgICAgIGluZGV4IC09IDI1NzsKKyAgICAgICAgICBpZiAoIGluZGV4ID4gbnVtX25hbWVzICkKKyAgICAgICAgICAgIG51bV9uYW1lcyA9IGluZGV4OworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgLyogbm93IGxvYWQgdGhlIG5hbWUgc3RyaW5ncyAqLworICAgIHsKKyAgICAgIFRUX1VTaG9ydCAgbjsKKworCisgICAgICBpZiAoIEFMTE9DX0FSUkFZKCBuYW1lX3N0cmluZ3MsIG51bV9uYW1lcywgVFRfQ2hhciogKSApCisgICAgICAgIGdvdG8gRmFpbDsKKworICAgICAgZm9yICggbiA9IDA7IG4gPCBudW1fbmFtZXM7IG4rKyApCisgICAgICB7CisgICAgICAgIFRUX0J5dGUgICBsZW47CisKKworICAgICAgICBpZiAoIFJFQURfQnl0ZSAgKCBsZW4gKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKKyAgICAgICAgICAgICBBTExPQ19BUlJBWSggbmFtZV9zdHJpbmdzW25dLCBsZW4rMSwgVFRfQ2hhciApIHx8CisgICAgICAgICAgICAgRklMRV9SZWFkICAoIG5hbWVfc3RyaW5nc1tuXSwgbGVuICkgICAgICAgICAgICApCisgICAgICAgICAgZ290byBGYWlsMTsKKworICAgICAgICBuYW1lX3N0cmluZ3Nbbl1bbGVuXSA9ICdcMCc7CisgICAgICB9CisgICAgfQorCisgICAgLyogYWxsIHJpZ2h0LCBzZXQgdGFibGUgZmllbGRzIGFuZCBleGl0IHN1Y2Nlc3NmdWx5ICovCisgICAgeworICAgICAgVFRfUG9zdF8yMCogIHRhYmxlID0gJmZhY2UtPnBvc3RzY3JpcHRfbmFtZXMubmFtZXMuZm9ybWF0XzIwOworCisKKyAgICAgIHRhYmxlLT5udW1fZ2x5cGhzICAgID0gbnVtX2dseXBoczsKKyAgICAgIHRhYmxlLT5udW1fbmFtZXMgICAgID0gbnVtX25hbWVzOworICAgICAgdGFibGUtPmdseXBoX2luZGljZXMgPSBnbHlwaF9pbmRpY2VzOworICAgICAgdGFibGUtPmdseXBoX25hbWVzICAgPSBuYW1lX3N0cmluZ3M7CisgICAgfQorICAgIHJldHVybiBUVF9FcnJfT2s7CisKKworICBGYWlsMToKKyAgICB7CisgICAgICBUVF9VU2hvcnQgIG47CisKKworICAgICAgZm9yICggbiA9IDA7IG4gPCBudW1fbmFtZXM7IG4rKyApCisgICAgICAgIEZSRUUoIG5hbWVfc3RyaW5nc1tuXSApOworICAgIH0KKworICBGYWlsOgorICAgIEZSRUUoIG5hbWVfc3RyaW5ncyApOworICAgIEZSRUUoIGdseXBoX2luZGljZXMgKTsKKworICBFeGl0OgorICAgIHJldHVybiBlcnJvcjsKKyAgfQorCisKKyAgc3RhdGljCisgIFRUX0Vycm9yICBMb2FkX0Zvcm1hdF8yNSggVFRfRmFjZSAgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgc3RyZWFtICkKKyAgeworICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gc3RyZWFtLT5tZW1vcnk7CisgICAgVFRfRXJyb3IgICBlcnJvcjsKKworICAgIFRUX1VTaG9ydCAgbnVtX2dseXBoczsKKyAgICBUVF9DaGFyKiAgIG9mZnNldF90YWJsZSA9IDA7CisKKworICAgIC8qIFVORE9DVU1FTlRFRCEgIFRoaXMgdmFsdWUgYXBwZWFycyBvbmx5IGluIHRoZSBBcHBsZSBUVCBzcGVjcy4gKi8KKyAgICBpZiAoIFJFQURfVVNob3J0KCBudW1fZ2x5cGhzICkgKQorICAgICAgZ290byBFeGl0OworCisgICAgLyogY2hlY2sgdGhlIG51bWJlciBvZiBnbHlwaHMgKi8KKyAgICBpZiAoIG51bV9nbHlwaHMgPiBmYWNlLT5yb290Lm51bV9nbHlwaHMgfHwgbnVtX2dseXBocyA+IDI1OCApCisgICAgeworICAgICAgZXJyb3IgPSBUVF9FcnJfSW52YWxpZF9GaWxlX0Zvcm1hdDsKKyAgICAgIGdvdG8gRXhpdDsKKyAgICB9CisKKyAgICBpZiAoIEFMTE9DICAgICggb2Zmc2V0X3RhYmxlLCBudW1fZ2x5cGhzICkgfHwKKyAgICAgICAgIEZJTEVfUmVhZCggb2Zmc2V0X3RhYmxlLCBudW1fZ2x5cGhzICkgKQorICAgICAgZ290byBGYWlsOworCisgICAgLyogbm93IGNoZWNrIHRoZSBvZmZzZXQgdGFibGUgKi8KKyAgICB7CisgICAgICBUVF9VU2hvcnQgIG47CisKKworICAgICAgZm9yICggbiA9IDA7IG4gPCBudW1fZ2x5cGhzOyBuKysgKQorICAgICAgeworICAgICAgICBUVF9Mb25nICBpbmRleCA9IChUVF9Mb25nKW4gKyBvZmZzZXRfdGFibGVbbl07CisKKworICAgICAgICBpZiAoIGluZGV4IDwgMCB8fCBpbmRleCA+IG51bV9nbHlwaHMgKQorICAgICAgICB7CisgICAgICAgICAgZXJyb3IgPSBUVF9FcnJfSW52YWxpZF9GaWxlX0Zvcm1hdDsKKyAgICAgICAgICBnb3RvIEZhaWw7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBPSywgc2V0IHRhYmxlIGZpZWxkcyBhbmQgZXhpdCBzdWNjZXNzZnVseSAqLworICAgIHsKKyAgICAgIFRUX1Bvc3RfMjUqICB0YWJsZSA9ICZmYWNlLT5wb3N0c2NyaXB0X25hbWVzLm5hbWVzLmZvcm1hdF8yNTsKKworCisgICAgICB0YWJsZS0+bnVtX2dseXBocyA9IG51bV9nbHlwaHM7CisgICAgICB0YWJsZS0+b2Zmc2V0cyAgICA9IG9mZnNldF90YWJsZTsKKyAgICB9CisKKyAgICByZXR1cm4gVFRfRXJyX09rOworCisgIEZhaWw6CisgICAgRlJFRSggb2Zmc2V0X3RhYmxlICk7CisKKyAgRXhpdDoKKyAgICByZXR1cm4gZXJyb3I7CisgIH0KKworCisgIHN0YXRpYworICBUVF9FcnJvciAgTG9hZF9Qb3N0X05hbWVzKCBUVF9GYWNlICBmYWNlICkKKyAgeworICAgIEZUX1N0cmVhbSAgIHN0cmVhbTsKKyAgICBUVF9FcnJvciAgICBlcnJvcjsKKworICAgIC8qIGdldCBhIHN0cmVhbSBmb3IgdGhlIGZhY2UncyByZXNvdXJjZSAqLworICAgIHN0cmVhbSA9IGZhY2UtPnJvb3Quc3RyZWFtOworCisgICAgLyogc2VlayB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBQUyBuYW1lcyB0YWJsZSAqLworICAgIHsKKyAgICAgIFRUX0xvbmcgIHRhYmxlOworCisKKyAgICAgIHRhYmxlID0gVFRfTG9va1VwX1RhYmxlKCBmYWNlLCBUVEFHX3Bvc3QgKTsKKyAgICAgIGlmICggRklMRV9TZWVrKCBmYWNlLT5kaXJfdGFibGVzW3RhYmxlXS5PZmZzZXQgKyAzMkwgKSApCisgICAgICAgIGdvdG8gRXhpdDsKKyAgICB9CisKKyAgICAvKiBub3cgcmVhZCBwb3N0c2NyaXB0IHRhYmxlICovCisgICAgc3dpdGNoICggZmFjZS0+cG9zdHNjcmlwdC5Gb3JtYXRUeXBlICkKKyAgICB7CisgICAgY2FzZSAweDAwMDIwMDAwOgorICAgICAgZXJyb3IgPSBMb2FkX0Zvcm1hdF8yMCggZmFjZSwgc3RyZWFtICk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgMHgwMDAyODAwMDoKKyAgICAgIGVycm9yID0gTG9hZF9Gb3JtYXRfMjUoIGZhY2UsIHN0cmVhbSApOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgZXJyb3IgPSBUVF9FcnJfSW52YWxpZF9GaWxlX0Zvcm1hdDsKKyAgICB9CisKKyAgICBmYWNlLT5wb3N0c2NyaXB0X25hbWVzLmxvYWRlZCA9IDE7CisKKyAgRXhpdDoKKyAgICByZXR1cm4gZXJyb3I7CisgIH0KKworCisgIExPQ0FMX0ZVTkMKKyAgdm9pZCAgVFRfRnJlZV9Qb3N0X05hbWVzKCBUVF9GYWNlICBmYWNlICkKKyAgeworICAgIEZUX01lbW9yeSAgICAgICBtZW1vcnkgPSBmYWNlLT5yb290Lm1lbW9yeTsKKyAgICBUVF9Qb3N0X05hbWVzKiAgbmFtZXMgID0gJmZhY2UtPnBvc3RzY3JpcHRfbmFtZXM7CisKKworICAgIGlmICggbmFtZXMtPmxvYWRlZCApCisgICAgeworICAgICAgc3dpdGNoICggZmFjZS0+cG9zdHNjcmlwdC5Gb3JtYXRUeXBlICkKKyAgICAgIHsKKyAgICAgIGNhc2UgMHgwMDAyMDAwMDoKKyAgICAgICAgeworICAgICAgICAgIFRUX1Bvc3RfMjAqICB0YWJsZSA9ICZuYW1lcy0+bmFtZXMuZm9ybWF0XzIwOworICAgICAgICAgIFRUX1VTaG9ydCAgICBuOworCisKKyAgICAgICAgICBGUkVFKCB0YWJsZS0+Z2x5cGhfaW5kaWNlcyApOworICAgICAgICAgIHRhYmxlLT5udW1fZ2x5cGhzID0gMDsKKworICAgICAgICAgIGZvciAoIG4gPSAwOyBuIDwgdGFibGUtPm51bV9uYW1lczsgbisrICkKKyAgICAgICAgICAgIEZSRUUoIHRhYmxlLT5nbHlwaF9uYW1lc1tuXSApOworCisgICAgICAgICAgRlJFRSggdGFibGUtPmdseXBoX25hbWVzICk7CisgICAgICAgICAgdGFibGUtPm51bV9uYW1lcyA9IDA7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgMHgwMDAyODAwMDoKKyAgICAgICAgeworICAgICAgICAgIFRUX1Bvc3RfMjUqICB0YWJsZSA9ICZuYW1lcy0+bmFtZXMuZm9ybWF0XzI1OworCisKKyAgICAgICAgICBGUkVFKCB0YWJsZS0+b2Zmc2V0cyApOworICAgICAgICAgIHRhYmxlLT5udW1fZ2x5cGhzID0gMDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgbmFtZXMtPmxvYWRlZCA9IDA7CisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX0dldF9QU19OYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEdldHMgdGhlIFBvc3RTY3JpcHQgZ2x5cGggbmFtZSBvZiBhIGdseXBoLiAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGluZGV4ICA6OiBUaGUgZ2x5cGggaW5kZXguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgUFNuYW1lIDo6IFRoZSBhZGRyZXNzIG9mIGEgc3RyaW5nIHBvaW50ZXIuICBXaWxsIGJlIE5VTEwgaW4gY2FzZSAgICovCisgIC8qICAgICAgICAgICAgICBvZiBlcnJvciwgb3RoZXJ3aXNlIGl0IGlzIGEgcG9pbnRlciB0byB0aGUgZ2x5cGggbmFtZS4gICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgIFlvdSBtdXN0IG5vdCBtb2RpZnkgdGhlIHJldHVybmVkIHN0cmluZyEgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVHJ1ZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBFWFBPUlRfRlVOQworICBUVF9FcnJvciAgVFRfR2V0X1BTX05hbWUoIFRUX0ZhY2UgICAgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX1VJbnQgICAgICBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9TdHJpbmcqKiAgUFNuYW1lICkKKyAgeworICAgIFRUX0Vycm9yICAgICAgICBlcnJvcjsKKyAgICBUVF9Qb3N0X05hbWVzKiAgbmFtZXM7CisKKyAgICBpZiAoICFmYWNlICkKKyAgICAgIHJldHVybiBUVF9FcnJfSW52YWxpZF9GYWNlX0hhbmRsZTsKKworICAgIGlmICggaW5kZXggPj0gZmFjZS0+cm9vdC5udW1fZ2x5cGhzICkKKyAgICAgIHJldHVybiBUVF9FcnJfSW52YWxpZF9HbHlwaF9JbmRleDsKKworICAgIG5hbWVzICAgPSAmZmFjZS0+cG9zdHNjcmlwdF9uYW1lczsKKworICAgIC8qIGAubm90ZGVmJyBieSBkZWZhdWx0ICovCisgICAgKlBTbmFtZSA9IChUVF9TdHJpbmcqKVRUX01hY19Qb3N0c2NyaXB0X05hbWVzWzBdOworCisgICAgc3dpdGNoICggZmFjZS0+cG9zdHNjcmlwdC5Gb3JtYXRUeXBlICkKKyAgICB7CisgICAgY2FzZSAweDAwMDEwMDAwOgorICAgICAgaWYgKCBpbmRleCA8IDI1OCApICAgICAgICAgICAgICAgICAgICAvKiBwYXJhbm9pZCBjaGVja2luZyAqLworICAgICAgICAqUFNuYW1lID0gKFRUX1N0cmluZyopVFRfTWFjX1Bvc3RzY3JpcHRfTmFtZXNbaW5kZXhdOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIDB4MDAwMjAwMDA6CisgICAgICB7CisgICAgICAgIFRUX1Bvc3RfMjAqICB0YWJsZSA9ICZuYW1lcy0+bmFtZXMuZm9ybWF0XzIwOworCisKKyAgICAgICAgaWYgKCAhbmFtZXMtPmxvYWRlZCApCisgICAgICAgIHsKKyAgICAgICAgICBlcnJvciA9IExvYWRfUG9zdF9OYW1lcyggZmFjZSApOworICAgICAgICAgIGlmICggZXJyb3IgKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIGluZGV4IDwgdGFibGUtPm51bV9nbHlwaHMgKQorICAgICAgICB7CisgICAgICAgICAgVFRfVVNob3J0ICBuYW1lX2luZGV4ID0gdGFibGUtPmdseXBoX2luZGljZXNbaW5kZXhdOworCisKKyAgICAgICAgICBpZiAoIG5hbWVfaW5kZXggPCAyNTggKQorICAgICAgICAgICAgKlBTbmFtZSA9IChUVF9TdHJpbmcqKVRUX01hY19Qb3N0c2NyaXB0X05hbWVzW25hbWVfaW5kZXhdOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICpQU25hbWUgPSAoVFRfU3RyaW5nKil0YWJsZS0+Z2x5cGhfbmFtZXNbbmFtZV9pbmRleCAtIDI1OF07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAweDAwMDI4MDAwOgorICAgICAgeworICAgICAgICBUVF9Qb3N0XzI1KiAgdGFibGUgPSAmbmFtZXMtPm5hbWVzLmZvcm1hdF8yNTsKKworCisgICAgICAgIGlmICggIW5hbWVzLT5sb2FkZWQgKQorICAgICAgICB7CisgICAgICAgICAgZXJyb3IgPSBMb2FkX1Bvc3RfTmFtZXMoIGZhY2UgKTsKKyAgICAgICAgICBpZiAoIGVycm9yICkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCBpbmRleCA8IHRhYmxlLT5udW1fZ2x5cGhzICkgICAgLyogcGFyYW5vaWQgY2hlY2tpbmcgKi8KKyAgICAgICAgeworICAgICAgICAgIGluZGV4ICArPSB0YWJsZS0+b2Zmc2V0c1tpbmRleF07CisgICAgICAgICAgKlBTbmFtZSA9IChUVF9TdHJpbmcqKVRUX01hY19Qb3N0c2NyaXB0X05hbWVzW2luZGV4XTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIDB4MDAwMzAwMDA6CisgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vdGhpbmcgdG8gZG8gKi8KKyAgICB9CisKKyAgICByZXR1cm4gVFRfRXJyX09rOworICB9CisKKworLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvc2hhcmVkL3NmbnQvdHRwb3N0LmggYi9zcmMvc2hhcmVkL3NmbnQvdHRwb3N0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZmODEzZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9zaGFyZWQvc2ZudC90dHBvc3QuaApAQCAtMCwwICsxLDk1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICB0dHBvc3QuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgUG9zdGNyaXB0IG5hbWUgdGFibGUgcHJvY2Vzc2luZyBmb3IgVHJ1ZVR5cGUgYW5kIE9wZW5UeXBlIGZvbnRzICAgICAgKi8KKy8qICAgIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAxOTk2LTE5OTkgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCAgICAgICAgKi8KKy8qICBtb2RpZmllZCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgICovCisvKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLworLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KKy8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogVGhlIHBvc3QgdGFibGUgaXMgbm90IGNvbXBsZXRlbHkgbG9hZGVkIGJ5IHRoZSBjb3JlIGVuZ2luZS4gIFRoaXMgICAgICovCisgIC8qIGZpbGUgbG9hZHMgdGhlIG1pc3NpbmcgUFMgZ2x5cGggbmFtZXMgYW5kIGltcGxlbWVudHMgYW4gQVBJIHRvIGFjY2VzcyAqLworICAvKiB0aGVtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNpZm5kZWYgVFRQT1NUX0gKKyNkZWZpbmUgVFRQT1NUX0gKKworI2luY2x1ZGUgPGZ0Y29uZmlnLmg+CisjaW5jbHVkZSA8dHR0eXBlcy5oPgorI2luY2x1ZGUgPHR0Y29uZmlnLmg+CisKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisKKyNkZWZpbmUgVFRfRXJyX0ludmFsaWRfUG9zdF9UYWJsZV9Gb3JtYXQgIDB4MEIwMAorI2RlZmluZSBUVF9FcnJfSW52YWxpZF9Qb3N0X1RhYmxlICAgICAgICAgMHgwQjAxCisKKworI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fUE9TVFNDUklQVF9OQU1FUworCisjaWYgMAorICAvKiB0aGUgMjU4IHN0YW5kYXJkIE1hYyBnbHlwaCBuYW1lcywgdXNlZCBmb3IgZm9ybWF0IDEuMCBhbmQgMi41ICovCisgIExPQ0FMX0RFRgorICBjb25zdCBUVF9TdHJpbmcqICBUVF9NYWNfUG9zdHNjcmlwdF9OYW1lc1tdOworI2VuZGlmCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUVF9HZXRfUFNfTmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBHZXRzIHRoZSBQb3N0U2NyaXB0IGdseXBoIG5hbWUgb2YgYSBnbHlwaC4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBpbmRleCAgOjogVGhlIGdseXBoIGluZGV4LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFBTbmFtZSA6OiBUaGUgYWRkcmVzcyBvZiBhIHN0cmluZyBwb2ludGVyLiAgV2lsbCBiZSBOVUxMIGluIGNhc2UgICAqLworICAvKiAgICAgICAgICAgICAgb2YgZXJyb3IsIG90aGVyd2lzZSBpdCBpcyBhIHBvaW50ZXIgdG8gdGhlIGdseXBoIG5hbWUuICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICBZb3UgbXVzdCBub3QgbW9kaWZ5IHRoZSByZXR1cm5lZCBzdHJpbmchICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRydWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgRVhQT1JUX0RFRgorICBUVF9FcnJvciBUVF9HZXRfUFNfTmFtZSggVFRfRmFjZSAgICAgIGZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9VSW50ICAgICAgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9TdHJpbmcqKiAgUFNuYW1lICk7CisKKworICBMT0NBTF9ERUYKKyAgdm9pZCAgVFRfRnJlZV9Qb3N0X05hbWVzKCBUVF9GYWNlICBmYWNlICk7CisKKworI2VuZGlmIC8qIFRUX0NPTkZJR19PUFRJT05fUE9TVFNDUklQVF9OQU1FUyAqLworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKworI2VuZGlmIC8qIFRUUE9TVF9IICovCisKKworLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvc2hhcmVkL3NmbnQvdHRzYml0LmMgYi9zcmMvc2hhcmVkL3NmbnQvdHRzYml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQzZmMyZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9zaGFyZWQvc2ZudC90dHNiaXQuYwpAQCAtMCwwICsxLDE0NDMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHR0c2JpdC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBUcnVlVHlwZSBhbmQgT3BlblR5cGUgZW1iZWRkZWQgYml0bWFwIHN1cHBvcnQgKGJvZHkpLiAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMTk5Ni0xOTk5IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQgICAgICAgICovCisvKiAgbW9kaWZpZWQgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICAqLworLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KKy8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCisvKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgV0FSTklORzogVGhpcyBmaWxlIHNob3VsZCBub3QgYmUgY29tcGlsZWQgZGlyZWN0bHksIGl0IGlzIG1lYW50IHRvIGJlICAqLworLyogICAgICAgICAgIGluY2x1ZGVkIGluIHRoZSBzb3VyY2Ugb2Ygc2V2ZXJhbCBmb250IGRyaXZlcnMgKGkuZS4sIHRoZSBUVEYgKi8KKy8qICAgICAgICAgICBhbmQgT1RGIGRyaXZlcnMpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjaW5jbHVkZSA8ZnRkZWJ1Zy5oPgorCisjaW5jbHVkZSA8dHRzYml0Lmg+CisjaW5jbHVkZSA8dHR0YWdzLmg+CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBibGl0X3NiaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBCbGl0cyBhIGJpdG1hcCBmcm9tIGFuIGlucHV0IHN0cmVhbSBpbnRvIGEgZ2l2ZW4gdGFyZ2V0LiAgU3VwcG9ydHMgKi8KKyAgLyogICAgeCBhbmQgeSBvZmZzZXRzIGFzIHdlbGwgYXMgYnl0ZSBwYWRkZWQgbGluZXMuICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgdGFyZ2V0ICAgICAgOjogVGhlIHRhcmdldCBiaXRtYXAvcGl4bWFwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzb3VyY2UgICAgICA6OiBUaGUgaW5wdXQgcGFja2VkIGJpdG1hcCBkYXRhLiAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGxpbmVfYml0cyAgIDo6IFRoZSBudW1iZXIgb2YgYml0cyBwZXIgbGluZS4gICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgYnl0ZV9wYWRkZWQgOjogQSBmbGFnIHdoaWNoIGlzIHRydWUgaWYgbGluZXMgYXJlIGJ5dGUtcGFkZGVkLiAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB4X29mZnNldCAgICA6OiBUaGUgaG9yaXpvbnRhbCBvZmZzZXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHlfb2Zmc2V0ICAgIDo6IFRoZSB2ZXJ0aWNhbCBvZmZzZXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIElNUE9SVEFOVDogVGhlIHggYW5kIHkgb2Zmc2V0cyBhcmUgcmVsYXRpdmUgdG8gdGhlIHRvcCBjb3JuZXIgb2YgICAqLworICAvKiAgICAgICAgICAgICAgIHRoZSB0YXJnZXQgYml0bWFwICh1bmxpa2UgdGhlIG5vcm1hbCBUcnVlVHlwZSAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICBjb252ZW50aW9uKS4gIEEgcG9zaXRpdmUgeSBvZmZzZXQgaW5kaWNhdGVzIGEgZG93bndhcmRzICovCisgIC8qICAgICAgICAgICAgICAgZGlyZWN0aW9uISAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgc3RhdGljCisgIHZvaWQgIGJsaXRfc2JpdCggRlRfQml0bWFwKiAgdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgIHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICBsaW5lX2JpdHMsCisgICAgICAgICAgICAgICAgICAgRlRfQm9vbCAgICAgYnl0ZV9wYWRkZWQsCisgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgeF9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgeV9vZmZzZXQgKQorICB7CisgICAgRlRfQnl0ZSogICBsaW5lX2J1ZmY7CisgICAgRlRfSW50ICAgICBsaW5lX2luY3I7CisgICAgRlRfSW50ICAgICBoZWlnaHQ7CisKKyAgICBGVF9VU2hvcnQgIGFjYzsKKyAgICBGVF9CeXRlICAgIGxvYWRlZDsKKworCisgICAgLyogZmlyc3Qgb2YgYWxsLCBjb21wdXRlIHN0YXJ0aW5nIHdyaXRlIHBvc2l0aW9uICovCisgICAgbGluZV9pbmNyID0gdGFyZ2V0LT5waXRjaDsKKyAgICBsaW5lX2J1ZmYgPSB0YXJnZXQtPmJ1ZmZlcjsKKyAgICAKKyAgICBpZiAobGluZV9pbmNyIDwgMCkKKyAgICAgIGxpbmVfYnVmZiAtPSBsaW5lX2luY3IqKHRhcmdldC0+cm93cy0xKTsKKworICAgIGxpbmVfYnVmZiArPSAoeF9vZmZzZXQgPj4gMykgKyB5X29mZnNldCAqIGxpbmVfaW5jcjsKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogV2UgdXNlIHRoZSBleHRyYS1jbGFzc2ljIGBhY2N1bXVsYXRvcicgdHJpY2sgdG8gZXh0cmFjdCB0aGUgYml0cyAgICAqLworICAgIC8qIGZyb20gdGhlIHNvdXJjZSBieXRlIHN0cmVhbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogTmFtZWx5LCB0aGUgdmFyaWFibGUgYGFjYycgaXMgYSAxNi1iaXQgYWNjdW11bGF0b3IgY29udGFpbmluZyB0aGUgICAqLworICAgIC8qIGxhc3QgYGxvYWRlZCcgYml0cyBmcm9tIHRoZSBpbnB1dCBzdHJlYW0uICBUaGUgYml0cyBhcmUgc2hpZnRlZCB0byAgKi8KKyAgICAvKiB0aGUgdXBtb3N0IHBvc2l0aW9uIGluIGBhY2MnLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIGFjYyAgICA9IDA7ICAvKiBjbGVhciBhY2N1bXVsYXRvciAgICovCisgICAgbG9hZGVkID0gMDsgIC8qIG5vIGJpdHMgd2VyZSBsb2FkZWQgKi8KKworICAgIGZvciAoIGhlaWdodCA9IHRhcmdldC0+cm93czsgaGVpZ2h0ID4gMDsgaGVpZ2h0LS0gKQorICAgIHsKKyAgICAgIEZUX0J5dGUqICBjdXIgICA9IGxpbmVfYnVmZjsgICAgLyogY3VycmVudCB3cml0ZSBjdXJzb3IgICAgICAgICAgKi8KKyAgICAgIEZUX0ludCAgICBjb3VudCA9IGxpbmVfYml0czsgICAgLyogIyBvZiBiaXRzIHRvIGV4dHJhY3QgcGVyIGxpbmUgKi8KKyAgICAgIEZUX0J5dGUgICBzaGlmdCA9IHhfb2Zmc2V0ICYgNzsgLyogY3VycmVudCB3cml0ZSBzaGlmdCAgICAgICAgICAgKi8KKyAgICAgIEZUX0J5dGUgICBzcGFjZSA9IDggLSBzaGlmdDsKKworCisgICAgICAvKiBmaXJzdCBvZiBhbGwsIHJlYWQgaW5kaXZpZHVhbCBzb3VyY2UgYnl0ZXMgKi8KKyAgICAgIGlmICggY291bnQgPj0gOCApCisgICAgICB7CisgICAgICAgIGNvdW50IC09IDg7CisgICAgICAgIHsKKyAgICAgICAgICBkbworICAgICAgICAgIHsKKyAgICAgICAgICAgIEZUX0J5dGUgIHZhbDsKKworICAgICAgICAgICAgLyogZW5zdXJlIHRoYXQgdGhlcmUgYXJlIGF0IGxlYXN0IDggYml0cyBpbiB0aGUgYWNjdW11bGF0b3IgKi8KKyAgICAgICAgICAgIGlmICggbG9hZGVkIDwgOCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGFjYyAgICB8PSAoKEZUX1VTaG9ydCkqc291cmNlKyspIDw8ICg4IC0gbG9hZGVkKTsKKyAgICAgICAgICAgICAgbG9hZGVkICs9IDg7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIG5vdyB3cml0ZSBvbmUgYnl0ZSAqLworICAgICAgICAgICAgdmFsICAgICA9IChGVF9CeXRlKShhY2MgPj4gOCk7CisgICAgICAgICAgICBpZiAoc2hpZnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGN1clswXSB8PSB2YWwgPj4gc2hpZnQ7CisgICAgICAgICAgICAgIGN1clsxXSB8PSB2YWwgPDwgc3BhY2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIGN1clswXSA9IHZhbDsKKworICAgICAgICAgICAgY3VyKys7CisgICAgICAgICAgICBhY2MgICA8PD0gODsgIC8qIHJlbW92ZSBiaXRzIGZyb20gYWNjdW11bGF0b3IgKi8KKyAgICAgICAgICAgIGxvYWRlZCAtPSA4OworICAgICAgICAgICAgY291bnQgIC09IDg7CisgICAgICAgICAgfQorICAgICAgICAgIHdoaWxlICggY291bnQgPj0gMCApOworICAgICAgICB9CisKKyAgICAgICAgLyogcmVzdG9yZSBgY291bnQnIHRvIGNvcnJlY3QgdmFsdWUgKi8KKyAgICAgICAgY291bnQgKz0gODsKKyAgICAgIH0KKworICAgICAgLyogbm93IHdyaXRlIHJlbWFpbmluZyBiaXRzIChjb3VudCA8IDgpICovCisgICAgICBpZiAoIGNvdW50ID4gMCApCisgICAgICB7CisgICAgICAgIEZUX0J5dGUgIHZhbDsKKworCisgICAgICAgIC8qIGVuc3VyZSB0aGF0IHRoZXJlIGFyZSBhdCBsZWFzdCBgY291bnQnIGJpdHMgaW4gdGhlIGFjY3VtdWxhdG9yICovCisgICAgICAgIGlmICggbG9hZGVkIDwgY291bnQgKQorICAgICAgICB7CisgICAgICAgICAgYWNjICAgIHw9ICgoRlRfVVNob3J0KSpzb3VyY2UrKykgPDwgKDggLSBsb2FkZWQpOworICAgICAgICAgIGxvYWRlZCArPSA4OworICAgICAgICB9CisKKyAgICAgICAgLyogbm93IHdyaXRlIHJlbWFpbmluZyBiaXRzICovCisgICAgICAgIHZhbCAgICAgPSAoKEZUX0J5dGUpKGFjYyA+PiA4KSkgJiB+KDB4RkYgPj4gY291bnQpOworICAgICAgICBjdXJbMF0gfD0gdmFsID4+IHNoaWZ0OworCisgICAgICAgIGlmICggY291bnQgPiBzcGFjZSApCisgICAgICAgICAgY3VyWzFdIHw9IHZhbCA8PCBzcGFjZTsKKworICAgICAgICBhY2MgICA8PD0gY291bnQ7CisgICAgICAgIGxvYWRlZCAtPSBjb3VudDsKKyAgICAgIH0KKworICAgICAgLyogbm93LCBza2lwIHRvIG5leHQgbGluZSAqLworICAgICAgaWYgKCBieXRlX3BhZGRlZCApCisgICAgICAgIGFjYyA9IGxvYWRlZCA9IDA7ICAgLyogY2xlYXIgYWNjdW11bGF0b3Igb24gYnl0ZS1wYWRkZWQgbGluZXMgKi8KKworICAgICAgbGluZV9idWZmICs9IGxpbmVfaW5jcjsKKyAgICB9CisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX0xvYWRfU21hbGxfU0JpdF9NZXRyaWNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIExvYWRzIGEgc21hbGwgYml0bWFwIG1ldHJpY3MgcmVjb3JkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHN0cmVhbSAgOjogVGhlIGlucHV0IHN0cmVhbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG1ldHJpY3MgOjogQSBzbWFsbCBtZXRyaWNzIHN0cnVjdHVyZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgc3RhdGljCisgIHZvaWQgIFRUX0xvYWRfU21hbGxfU0JpdF9NZXRyaWNzKCBUVF9TQml0X1NtYWxsX01ldHJpY3MqICBtZXRyaWNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICAgICAgICAgICAgICAgc3RyZWFtICkKKyAgeworICAgIG1ldHJpY3MtPmhlaWdodCAgID0gR0VUX0J5dGUoKTsKKyAgICBtZXRyaWNzLT53aWR0aCAgICA9IEdFVF9CeXRlKCk7CisgICAgbWV0cmljcy0+YmVhcmluZ1ggPSBHRVRfQ2hhcigpOworICAgIG1ldHJpY3MtPmJlYXJpbmdZID0gR0VUX0NoYXIoKTsKKyAgICBtZXRyaWNzLT5hZHZhbmNlICA9IEdFVF9CeXRlKCk7CisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX0xvYWRfU0JpdF9NZXRyaWNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIExvYWRzIGEgYml0bWFwIG1ldHJpY3MgcmVjb3JkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHN0cmVhbSAgOjogVGhlIGlucHV0IHN0cmVhbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG1ldHJpY3MgOjogQSBtZXRyaWNzIHN0cnVjdHVyZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgc3RhdGljCisgIHZvaWQgIFRUX0xvYWRfU0JpdF9NZXRyaWNzKCBUVF9TQml0X01ldHJpY3MqICBtZXRyaWNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICAgICAgICAgc3RyZWFtICkKKyAgeworICAgIG1ldHJpY3MtPmhlaWdodCAgICAgICA9IEdFVF9CeXRlKCk7CisgICAgbWV0cmljcy0+d2lkdGggICAgICAgID0gR0VUX0J5dGUoKTsKKworICAgIG1ldHJpY3MtPmhvcmlCZWFyaW5nWCA9IEdFVF9DaGFyKCk7CisgICAgbWV0cmljcy0+aG9yaUJlYXJpbmdZID0gR0VUX0NoYXIoKTsKKyAgICBtZXRyaWNzLT5ob3JpQWR2YW5jZSAgPSBHRVRfQnl0ZSgpOworCisgICAgbWV0cmljcy0+dmVydEJlYXJpbmdYID0gR0VUX0NoYXIoKTsKKyAgICBtZXRyaWNzLT52ZXJ0QmVhcmluZ1kgPSBHRVRfQ2hhcigpOworICAgIG1ldHJpY3MtPnZlcnRBZHZhbmNlICA9IEdFVF9CeXRlKCk7CisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX0xvYWRfU0JpdF9MaW5lX01ldHJpY3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIExvYWRzIGEgYml0bWFwIGxpbmUgbWV0cmljcyByZWNvcmQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHN0cmVhbSAgOjogVGhlIGlucHV0IHN0cmVhbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG1ldHJpY3MgOjogQSBsaW5lIG1ldHJpY3Mgc3RydWN0dXJlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgc3RhdGljCisgIHZvaWQgIFRUX0xvYWRfU0JpdF9MaW5lX01ldHJpY3MoIFRUX1NCaXRfTGluZV9NZXRyaWNzKiAgbWV0cmljcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICAgICAgICAgICAgICBzdHJlYW0gKQorICB7CisgICAgbWV0cmljcy0+YXNjZW5kZXIgID0gR0VUX0NoYXIoKTsKKyAgICBtZXRyaWNzLT5kZXNjZW5kZXIgPSBHRVRfQ2hhcigpOworICAgIG1ldHJpY3MtPm1heF93aWR0aCA9IEdFVF9CeXRlKCk7CisKKyAgICBtZXRyaWNzLT5jYXJldF9zbG9wZV9udW1lcmF0b3IgICA9IEdFVF9DaGFyKCk7CisgICAgbWV0cmljcy0+Y2FyZXRfc2xvcGVfZGVub21pbmF0b3IgPSBHRVRfQ2hhcigpOworICAgIG1ldHJpY3MtPmNhcmV0X29mZnNldCAgICAgICAgICAgID0gR0VUX0NoYXIoKTsKKworICAgIG1ldHJpY3MtPm1pbl9vcmlnaW5fU0IgID0gR0VUX0NoYXIoKTsKKyAgICBtZXRyaWNzLT5taW5fYWR2YW5jZV9TQiA9IEdFVF9DaGFyKCk7CisgICAgbWV0cmljcy0+bWF4X2JlZm9yZV9CTCAgPSBHRVRfQ2hhcigpOworICAgIG1ldHJpY3MtPm1pbl9hZnRlcl9CTCAgID0gR0VUX0NoYXIoKTsKKyAgICBtZXRyaWNzLT5wYWRzWzBdICAgICAgICA9IEdFVF9DaGFyKCk7CisgICAgbWV0cmljcy0+cGFkc1sxXSAgICAgICAgPSBHRVRfQ2hhcigpOworICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUVF9Mb2FkX1NCaXRfQ29uc3RfTWV0cmljcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBMb2FkcyB0aGUgbWV0cmljcyBmb3IgYEVCTEMnIGluZGV4IHRhYmxlcyBmb3JtYXQgMiBhbmQgNS4gICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICByYW5nZSAgOjogVGhlIHRhcmdldCByYW5nZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHN0cmVhbSA6OiBUaGUgaW5wdXQgc3RyZWFtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRydWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgc3RhdGljCisgIFRUX0Vycm9yICBMb2FkX1NCaXRfQ29uc3RfTWV0cmljcyggVFRfU0JpdF9SYW5nZSogIHJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgICAgICBzdHJlYW0gKQorICB7CisgICAgVFRfRXJyb3IgIGVycm9yOworCisgICAgaWYgKCAhQUNDRVNTX0ZyYW1lKCAxMkwgKSApCisgICAgeworICAgICAgcmFuZ2UtPmltYWdlX3NpemUgPSBHRVRfVUxvbmcoKTsKKyAgICAgIFRUX0xvYWRfU0JpdF9NZXRyaWNzKCAmcmFuZ2UtPm1ldHJpY3MsIHN0cmVhbSApOworCisgICAgICBGT1JHRVRfRnJhbWUoKTsKKyAgICB9CisKKyAgICByZXR1cm4gZXJyb3I7CisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX0xvYWRfU0JpdF9SYW5nZV9Db2RlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIExvYWRzIHRoZSByYW5nZSBjb2RlcyBmb3IgYEVCTEMnIGluZGV4IHRhYmxlcyBmb3JtYXQgNCBhbmQgNS4gICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHJhbmdlICAgICAgICA6OiBUaGUgdGFyZ2V0IHJhbmdlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgc3RyZWFtICAgICAgIDo6IFRoZSBpbnB1dCBzdHJlYW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBsb2FkX29mZnNldHMgOjogQSBmbGFnIHdoZXRoZXIgdG8gbG9hZCB0aGUgZ2x5cGggb2Zmc2V0IHRhYmxlLiAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUcnVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0YXRpYworICBUVF9FcnJvciAgTG9hZF9TQml0X1JhbmdlX0NvZGVzKCBUVF9TQml0X1JhbmdlKiAgcmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgICAgICBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX0Jvb2wgICAgICAgICBsb2FkX29mZnNldHMgKQorICB7CisgICAgVFRfRXJyb3IgICBlcnJvcjsKKyAgICBUVF9VTG9uZyAgIGNvdW50LCBuLCBzaXplOworICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gc3RyZWFtLT5tZW1vcnk7CisKKworICAgIGlmICggUkVBRF9VTG9uZyggY291bnQgKSApCisgICAgICBnb3RvIEV4aXQ7CisKKyAgICByYW5nZS0+bnVtX2dseXBocyA9IGNvdW50OworCisgICAgLyogQWxsb2NhdGUgZ2x5cGggb2Zmc2V0cyB0YWJsZSBpZiBuZWVkZWQgKi8KKyAgICBpZiAoIGxvYWRfb2Zmc2V0cyApCisgICAgeworICAgICAgaWYgKCBBTExPQ19BUlJBWSggcmFuZ2UtPmdseXBoX29mZnNldHMsIGNvdW50LCBUVF9VTG9uZyApICkKKyAgICAgICAgZ290byBFeGl0OworCisgICAgICBzaXplID0gY291bnQgKiA0TDsKKyAgICB9CisgICAgZWxzZQorICAgICAgc2l6ZSA9IGNvdW50ICogMkw7CisKKyAgICAvKiBBbGxvY2F0ZSBnbHlwaCBjb2RlcyB0YWJsZSBhbmQgYWNjZXNzIGZyYW1lICovCisgICAgaWYgKCBBTExPQ19BUlJBWSAoIHJhbmdlLT5nbHlwaF9jb2RlcywgY291bnQsIFRUX1VTaG9ydCApIHx8CisgICAgICAgICBBQ0NFU1NfRnJhbWUoIHNpemUgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgIGdvdG8gRXhpdDsKKworICAgIGZvciAoIG4gPSAwOyBuIDwgY291bnQ7IG4rKyApCisgICAgeworICAgICAgcmFuZ2UtPmdseXBoX2NvZGVzW25dID0gR0VUX1VTaG9ydCgpOworCisgICAgICBpZiAobG9hZF9vZmZzZXRzKQorICAgICAgICByYW5nZS0+Z2x5cGhfb2Zmc2V0c1tuXSA9IChUVF9VTG9uZylyYW5nZS0+aW1hZ2Vfb2Zmc2V0ICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VUX1VTaG9ydCgpOworICAgIH0KKworICAgIEZPUkdFVF9GcmFtZSgpOworCisgIEV4aXQ6CisgICAgcmV0dXJuIGVycm9yOworICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUVF9Mb2FkX1NCaXRfUmFuZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBMb2FkcyBhIGdpdmVuIGBFQkxDJyBpbmRleC9yYW5nZSB0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICByYW5nZSAgOjogVGhlIHRhcmdldCByYW5nZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgc3RyZWFtIDo6IFRoZSBpbnB1dCBzdHJlYW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVHJ1ZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBzdGF0aWMKKyAgVFRfRXJyb3IgIExvYWRfU0JpdF9SYW5nZSggVFRfU0JpdF9SYW5nZSogIHJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gICAgICAgc3RyZWFtICkKKyAgeworICAgIFRUX0Vycm9yICAgZXJyb3I7CisgICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBzdHJlYW0tPm1lbW9yeTsKKworCisgICAgc3dpdGNoKCByYW5nZS0+aW5kZXhfZm9ybWF0ICkKKyAgICB7CisgICAgY2FzZSAxOiAgIC8qIHZhcmlhYmxlIG1ldHJpY3Mgd2l0aCA0LWJ5dGUgb2Zmc2V0cyAqLworICAgIGNhc2UgMzogICAvKiB2YXJpYWJsZSBtZXRyaWNzIHdpdGggMi1ieXRlIG9mZnNldHMgKi8KKyAgICAgIHsKKyAgICAgICAgVFRfVUxvbmcgIG51bV9nbHlwaHMsIG47CisgICAgICAgIFRUX0ludCAgICBzaXplX2VsZW07CisgICAgICAgIFRUX0Jvb2wgICBsYXJnZSA9IChyYW5nZS0+aW5kZXhfZm9ybWF0ID09IDEpOworCisKKyAgICAgICAgbnVtX2dseXBocyAgICAgICAgPSByYW5nZS0+bGFzdF9nbHlwaCAtIHJhbmdlLT5maXJzdF9nbHlwaCArIDFMOworICAgICAgICByYW5nZS0+bnVtX2dseXBocyA9IG51bV9nbHlwaHM7CisgICAgICAgIG51bV9nbHlwaHMrKzsgICAgLyogWFhYIDogQkVXQVJFIC0gc2VlIHNwZWMgKi8KKworICAgICAgICBzaXplX2VsZW0gID0gKCBsYXJnZSA/IDQgOiAyICk7CisKKyAgICAgICAgaWYgKCBBTExPQ19BUlJBWSggcmFuZ2UtPmdseXBoX29mZnNldHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9nbHlwaHMsIFRUX1VMb25nICkgICAgfHwKKworICAgICAgICAgICAgIEFDQ0VTU19GcmFtZSggbnVtX2dseXBocyAqIHNpemVfZWxlbSApICkKKyAgICAgICAgICBnb3RvIEV4aXQ7CisKKyAgICAgICAgZm9yICggbiA9IDA7IG4gPCBudW1fZ2x5cGhzOyBuKysgKQorICAgICAgICAgIHJhbmdlLT5nbHlwaF9vZmZzZXRzW25dID0gKFRUX1VMb25nKSggcmFuZ2UtPmltYWdlX29mZnNldCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxhcmdlID8gR0VUX1VMb25nKCkgOiBHRVRfVVNob3J0KCkpICk7CisgICAgICAgIEZPUkdFVF9GcmFtZSgpOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIDI6ICAgLyogYWxsIGdseXBocyBoYXZlIGlkZW50aWNhbCBtZXRyaWNzICovCisgICAgICBlcnJvciA9IExvYWRfU0JpdF9Db25zdF9NZXRyaWNzKCByYW5nZSwgc3RyZWFtICk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgNDoKKyAgICAgIGVycm9yID0gTG9hZF9TQml0X1JhbmdlX0NvZGVzKCByYW5nZSwgc3RyZWFtLCAxICk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgNToKKyAgICAgIGVycm9yID0gTG9hZF9TQml0X0NvbnN0X01ldHJpY3MoIHJhbmdlLCBzdHJlYW0gKSB8fAorICAgICAgICAgICAgICBMb2FkX1NCaXRfUmFuZ2VfQ29kZXMoIHJhbmdlLCBzdHJlYW0sIDAgKTsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIGVycm9yID0gVFRfRXJyX0ludmFsaWRfRmlsZV9Gb3JtYXQ7CisgICAgfQorCisgIEV4aXQ6CisgICAgcmV0dXJuIGVycm9yOworICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUVF9Mb2FkX1NCaXRfU3RyaWtlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBMb2FkcyB0aGUgdGFibGUgb2YgZW1iZWRkZWQgYml0bWFwIHNpemVzIGZvciB0aGlzIGZhY2UuICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBmYWNlICAgOjogVGhlIHRhcmdldCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgc3RyZWFtIDo6IFRoZSBpbnB1dCBzdHJlYW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVHJ1ZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBMT0NBTF9GVU5DCisgIFRUX0Vycm9yICBUVF9Mb2FkX1NCaXRfU3RyaWtlcyggVFRfRmFjZSAgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgc3RyZWFtICkKKyAgeworICAgIFRUX0Vycm9yICAgZXJyb3IgID0gMDsKKyAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IHN0cmVhbS0+bWVtb3J5OworICAgIFRUX0ZpeGVkICAgdmVyc2lvbjsKKyAgICBUVF9VTG9uZyAgIG51bV9zdHJpa2VzOworICAgIFRUX1VMb25nICAgdGFibGVfYmFzZTsKKyAgICBUVF9Mb25nICAgIHRhYmxlOworCisKKyAgICAvKiB0aGlzIHRhYmxlIGlzIG9wdGlvbmFsICovCisgICAgaWYgKCAoIHRhYmxlID0gVFRfTG9va1VwX1RhYmxlKCBmYWNlLCBUVEFHX0VCTEMgKSApIDwgMCApCisgICAgICBnb3RvIEV4aXQ7CisKKyAgICB0YWJsZV9iYXNlID0gZmFjZS0+ZGlyX3RhYmxlc1t0YWJsZV0uT2Zmc2V0OworICAgIGlmICggRklMRV9TZWVrKCB0YWJsZV9iYXNlICkgfHwKKyAgICAgICAgIEFDQ0VTU19GcmFtZSggOEwgKSAgICAgICkKKyAgICAgIGdvdG8gRXhpdDsKKworICAgIHZlcnNpb24gICAgID0gR0VUX0xvbmcoKTsKKyAgICBudW1fc3RyaWtlcyA9IEdFVF9VTG9uZygpOworCisgICAgRk9SR0VUX0ZyYW1lKCk7CisKKyAgICAvKiBjaGVjayB2ZXJzaW9uIG51bWJlciBhbmQgc3RyaWtlIGNvdW50ICovCisgICAgaWYgKCB2ZXJzaW9uICAgICAhPSAweDAwMDIwMDAwIHx8CisgICAgICAgICBudW1fc3RyaWtlcyA+PSAweDEwMDAwICAgICkKKyAgICB7CisgICAgICBGVF9FUlJPUigoICJUVF9Mb2FkX1NCaXRfU3RyaWtlczogaW52YWxpZCB0YWJsZSB2ZXJzaW9uIVxuIiApKTsKKyAgICAgIGVycm9yID0gVFRfRXJyX0ludmFsaWRfRmlsZV9Gb3JtYXQ7CisKKyAgICAgIGdvdG8gRXhpdDsKKyAgICB9CisKKyAgICAvKiBhbGxvY2F0ZSB0aGUgc3RyaWtlcyB0YWJsZSAqLworICAgIGlmICggQUxMT0NfQVJSQVkoIGZhY2UtPnNiaXRfc3RyaWtlcywgbnVtX3N0cmlrZXMsIFRUX1NCaXRfU3RyaWtlICkgKQorICAgICAgZ290byBFeGl0OworCisgICAgZmFjZS0+bnVtX3NiaXRfc3RyaWtlcyA9IG51bV9zdHJpa2VzOworCisgICAgLyogbm93IHJlYWQgZWFjaCBzdHJpa2UgdGFibGUgc2VwYXJhdGVseSAqLworICAgIHsKKyAgICAgIFRUX1NCaXRfU3RyaWtlKiAgc3RyaWtlID0gZmFjZS0+c2JpdF9zdHJpa2VzOworICAgICAgVFRfVUxvbmcgICAgICAgICBjb3VudCAgPSBudW1fc3RyaWtlczsKKworICAgICAgaWYgKCBBQ0NFU1NfRnJhbWUoIDQ4TCAqIG51bV9zdHJpa2VzICkgKQorICAgICAgICBnb3RvIEV4aXQ7CisKKyAgICAgIHdoaWxlICggY291bnQgPiAwICkKKyAgICAgIHsKKyAgICAgICAgVFRfVUxvbmcgIGluZGV4VGFibGVzU2l6ZTsKKworCisgICAgICAgIHN0cmlrZS0+cmFuZ2VzX29mZnNldCAgICA9IEdFVF9VTG9uZygpOworICAgICAgICBpbmRleFRhYmxlc1NpemUgICAgICAgICAgPSBHRVRfVUxvbmcoKTsgIC8qIGRvbid0IHNhdmUgKi8KKworICAgICAgICBzdHJpa2UtPm51bV9yYW5nZXMgICAgICAgPSBHRVRfVUxvbmcoKTsKKyAgICAgICAgc3RyaWtlLT5jb2xvcl9yZWYgICAgICAgID0gR0VUX1VMb25nKCk7CisKKyAgICAgICAgVFRfTG9hZF9TQml0X0xpbmVfTWV0cmljcyggJnN0cmlrZS0+aG9yaSwgc3RyZWFtICk7CisgICAgICAgIFRUX0xvYWRfU0JpdF9MaW5lX01ldHJpY3MoICZzdHJpa2UtPnZlcnQsIHN0cmVhbSApOworCisgICAgICAgIHN0cmlrZS0+c3RhcnRfZ2x5cGggICAgICA9IEdFVF9VU2hvcnQoKTsKKyAgICAgICAgc3RyaWtlLT5lbmRfZ2x5cGggICAgICAgID0gR0VUX1VTaG9ydCgpOworICAgICAgICBzdHJpa2UtPnhfcHBlbSAgICAgICAgICAgPSBHRVRfQnl0ZSgpOworICAgICAgICBzdHJpa2UtPnlfcHBlbSAgICAgICAgICAgPSBHRVRfQnl0ZSgpOworICAgICAgICBzdHJpa2UtPmJpdF9kZXB0aCAgICAgICAgPSBHRVRfQnl0ZSgpOworICAgICAgICBzdHJpa2UtPmZsYWdzICAgICAgICAgICAgPSBHRVRfQ2hhcigpOworCisgICAgICAgIGNvdW50LS07CisgICAgICAgIHN0cmlrZSsrOworICAgICAgfQorCisgICAgICBGT1JHRVRfRnJhbWUoKTsKKyAgICB9CisKKyAgICAvKiBhbGxvY2F0ZSB0aGUgaW5kZXggcmFuZ2VzIGZvciBlYWNoIHN0cmlrZSB0YWJsZSAqLworICAgIHsKKyAgICAgIFRUX1NCaXRfU3RyaWtlKiAgc3RyaWtlID0gZmFjZS0+c2JpdF9zdHJpa2VzOworICAgICAgVFRfVUxvbmcgICAgICAgICBjb3VudCAgPSBudW1fc3RyaWtlczsKKworCisgICAgICB3aGlsZSAoIGNvdW50ID4gMCApCisgICAgICB7CisgICAgICAgIFRUX1NCaXRfUmFuZ2UqIHJhbmdlOworICAgICAgICBUVF9VTG9uZyAgICAgICBjb3VudDIgPSBzdHJpa2UtPm51bV9yYW5nZXM7CisKKworICAgICAgICBpZiAoIEFMTE9DX0FSUkFZKCBzdHJpa2UtPnNiaXRfcmFuZ2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpa2UtPm51bV9yYW5nZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX1NCaXRfUmFuZ2UgKSApCisgICAgICAgICAgZ290byBFeGl0OworCisgICAgICAgIC8qIHJlYWQgZWFjaCByYW5nZSAqLworICAgICAgICBpZiAoIEZJTEVfU2VlayggdGFibGVfYmFzZSArIHN0cmlrZS0+cmFuZ2VzX29mZnNldCApIHx8CisgICAgICAgICAgICAgQUNDRVNTX0ZyYW1lKCBzdHJpa2UtPm51bV9yYW5nZXMgKiA4TCApICAgICAgICAgKQorICAgICAgICAgIGdvdG8gRXhpdDsKKworICAgICAgICByYW5nZSA9IHN0cmlrZS0+c2JpdF9yYW5nZXM7CisgICAgICAgIHdoaWxlICggY291bnQyID4gMCApCisgICAgICAgIHsKKyAgICAgICAgICByYW5nZS0+Zmlyc3RfZ2x5cGggID0gR0VUX1VTaG9ydCgpOworICAgICAgICAgIHJhbmdlLT5sYXN0X2dseXBoICAgPSBHRVRfVVNob3J0KCk7CisgICAgICAgICAgcmFuZ2UtPnRhYmxlX29mZnNldCA9IHRhYmxlX2Jhc2UgKyBzdHJpa2UtPnJhbmdlc19vZmZzZXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgR0VUX1VMb25nKCk7CisgICAgICAgICAgY291bnQyLS07CisgICAgICAgICAgcmFuZ2UrKzsKKyAgICAgICAgfQorCisgICAgICAgIEZPUkdFVF9GcmFtZSgpOworCisgICAgICAgIC8qIE5vdywgcmVhZCBlYWNoIGluZGV4IHRhYmxlICovCisgICAgICAgIGNvdW50MiA9IHN0cmlrZS0+bnVtX3JhbmdlczsKKyAgICAgICAgcmFuZ2UgID0gc3RyaWtlLT5zYml0X3JhbmdlczsKKyAgICAgICAgd2hpbGUgKCBjb3VudDIgPiAwICkKKyAgICAgICAgeworICAgICAgICAgIC8qIFJlYWQgdGhlIGhlYWRlciAqLworICAgICAgICAgIGlmICggRklMRV9TZWVrKCByYW5nZS0+dGFibGVfb2Zmc2V0ICkgfHwKKyAgICAgICAgICAgICAgIEFDQ0VTU19GcmFtZSggOEwgKSAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIGdvdG8gRXhpdDsKKworICAgICAgICAgIHJhbmdlLT5pbmRleF9mb3JtYXQgPSBHRVRfVVNob3J0KCk7CisgICAgICAgICAgcmFuZ2UtPmltYWdlX2Zvcm1hdCA9IEdFVF9VU2hvcnQoKTsKKyAgICAgICAgICByYW5nZS0+aW1hZ2Vfb2Zmc2V0ID0gR0VUX1VMb25nKCk7CisKKyAgICAgICAgICBGT1JHRVRfRnJhbWUoKTsKKworICAgICAgICAgIGVycm9yID0gTG9hZF9TQml0X1JhbmdlKCByYW5nZSwgc3RyZWFtICk7CisgICAgICAgICAgaWYgKCBlcnJvciApCisgICAgICAgICAgICBnb3RvIEV4aXQ7CisKKyAgICAgICAgICBjb3VudDItLTsKKyAgICAgICAgICByYW5nZSsrOworICAgICAgICB9CisKKyAgICAgICAgY291bnQtLTsKKyAgICAgICAgc3RyaWtlKys7CisgICAgICB9CisgICAgfQorCisgIEV4aXQ6CisgICAgcmV0dXJuIGVycm9yOworICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUVF9GcmVlX1NCaXRfU3RyaWtlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBSZWxlYXNlcyB0aGUgZW1iZWRkZWQgYml0bWFwIHRhYmxlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBmYWNlIDo6IFRoZSB0YXJnZXQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIExPQ0FMX0ZVTkMKKyAgdm9pZCAgVFRfRnJlZV9TQml0X1N0cmlrZXMoIFRUX0ZhY2UgIGZhY2UgKQorICB7CisgICAgRlRfTWVtb3J5ICAgICAgICBtZW1vcnkgICAgICAgPSBmYWNlLT5yb290Lm1lbW9yeTsKKyAgICBUVF9TQml0X1N0cmlrZSogIHN0cmlrZSAgICAgICA9IGZhY2UtPnNiaXRfc3RyaWtlczsKKyAgICBUVF9TQml0X1N0cmlrZSogIHN0cmlrZV9saW1pdCA9IHN0cmlrZSArIGZhY2UtPm51bV9zYml0X3N0cmlrZXM7CisKKworICAgIGlmICggc3RyaWtlICkKKyAgICB7CisgICAgICBmb3IgKCA7IHN0cmlrZSA8IHN0cmlrZV9saW1pdDsgc3RyaWtlKysgKQorICAgICAgeworICAgICAgICBUVF9TQml0X1JhbmdlKiAgcmFuZ2UgICAgICAgPSBzdHJpa2UtPnNiaXRfcmFuZ2VzOworICAgICAgICBUVF9TQml0X1JhbmdlKiAgcmFuZ2VfbGltaXQgPSByYW5nZSArIHN0cmlrZS0+bnVtX3JhbmdlczsKKworICAgICAgICBpZiAoIHJhbmdlICkKKyAgICAgICAgeworICAgICAgICAgIGZvciAoIDsgcmFuZ2UgPCByYW5nZV9saW1pdDsgcmFuZ2UrKyApCisgICAgICAgICAgeworICAgICAgICAgICAgLyogcmVsZWFzZSB0aGUgZ2x5cGggb2Zmc2V0cyBhbmQgY29kZXMgdGFibGVzICovCisgICAgICAgICAgICAvKiB3aGVyZSBhcHByb3ByaWF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIEZSRUUoIHJhbmdlLT5nbHlwaF9vZmZzZXRzICk7CisgICAgICAgICAgICBGUkVFKCByYW5nZS0+Z2x5cGhfY29kZXMgKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgRlJFRSggc3RyaWtlLT5zYml0X3JhbmdlcyApOworICAgICAgICBzdHJpa2UtPm51bV9yYW5nZXMgPSAwOworICAgICAgfQorICAgICAgRlJFRSggZmFjZS0+c2JpdF9zdHJpa2VzICk7CisgICAgfQorICAgIGZhY2UtPm51bV9zYml0X3N0cmlrZXMgPSAwOworICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGaW5kX1NCaXRfUmFuZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBTY2FucyBhIGdpdmVuIHN0cmlrZSdzIHJhbmdlcyBhbmQgcmV0dXJuLCBmb3IgYSBnaXZlbiBnbHlwaCAgICAgICAgKi8KKyAgLyogICAgaW5kZXgsIHRoZSBjb3JyZXNwb25kaW5nIHNiaXQgcmFuZ2UsIGFuZCBgRUJEVCcgb2Zmc2V0LiAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZ2x5cGhfaW5kZXggICA6OiBUaGUgZ2x5cGggaW5kZXguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHN0cmlrZSAgICAgICAgOjogVGhlIHNvdXJjZS9jdXJyZW50IHNiaXQgc3RyaWtlLiAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGFyYW5nZSAgICAgICAgOjogVGhlIHNiaXQgcmFuZ2UgY29udGFpbmluZyB0aGUgZ2x5cGggaW5kZXguICAgICAgICAqLworICAvKiAgICBhZ2x5cGhfb2Zmc2V0IDo6IFRoZSBvZmZzZXQgb2YgdGhlIGdseXBoIGRhdGEgaW4gYEVCRFQnIHRhYmxlLiAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUcnVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyB0aGUgZ2x5cGggaW5kZXggd2FzIGZvdW5kLiAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0YXRpYworICBUVF9FcnJvciAgRmluZF9TQml0X1JhbmdlKCBUVF9VU2hvcnQgICAgICAgIGdseXBoX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9TQml0X1N0cmlrZSogIHN0cmlrZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfU0JpdF9SYW5nZSoqICBhcmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX1VMb25nKiAgICAgICAgYWdseXBoX29mZnNldCApCisgIHsKKyAgICBUVF9TQml0X1JhbmdlICAqcmFuZ2UsICpyYW5nZV9saW1pdDsKKworCisgICAgLyogY2hlY2sgd2hldGhlciB0aGUgZ2x5cGggaW5kZXggaXMgd2l0aGluIHRoaXMgc3RyaWtlJ3MgKi8KKyAgICAvKiBnbHlwaCByYW5nZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGlmICggZ2x5cGhfaW5kZXggPCBzdHJpa2UtPnN0YXJ0X2dseXBoIHx8CisgICAgICAgICBnbHlwaF9pbmRleCA+IHN0cmlrZS0+ZW5kX2dseXBoICAgKQorICAgICAgZ290byBGYWlsOworCisgICAgLyogc2NhbiBhbGwgcmFuZ2VzIGluIHN0cmlrZSAqLworICAgIHJhbmdlICAgICAgID0gc3RyaWtlLT5zYml0X3JhbmdlczsKKyAgICByYW5nZV9saW1pdCA9IHJhbmdlICsgc3RyaWtlLT5udW1fcmFuZ2VzOworICAgIGlmICggIXJhbmdlICkKKyAgICAgIGdvdG8gRmFpbDsKKworICAgIGZvciAoIDsgcmFuZ2UgPCByYW5nZV9saW1pdDsgcmFuZ2UrKyApCisgICAgeworICAgICAgaWYgKCBnbHlwaF9pbmRleCA+PSByYW5nZS0+Zmlyc3RfZ2x5cGggJiYKKyAgICAgICAgICAgZ2x5cGhfaW5kZXggPD0gcmFuZ2UtPmxhc3RfZ2x5cGggICkKKyAgICAgIHsKKyAgICAgICAgVFRfVVNob3J0ICBkZWx0YSA9IGdseXBoX2luZGV4IC0gcmFuZ2UtPmZpcnN0X2dseXBoOworCisKKyAgICAgICAgc3dpdGNoICggcmFuZ2UtPmluZGV4X2Zvcm1hdCApCisgICAgICAgIHsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICBjYXNlIDM6CisgICAgICAgICAgKmFnbHlwaF9vZmZzZXQgPSByYW5nZS0+Z2x5cGhfb2Zmc2V0c1tkZWx0YV07CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICphZ2x5cGhfb2Zmc2V0ID0gcmFuZ2UtPmltYWdlX29mZnNldCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZS0+aW1hZ2Vfc2l6ZSAqIGRlbHRhOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgNDoKKyAgICAgICAgY2FzZSA1OgorICAgICAgICAgIHsKKyAgICAgICAgICAgIFRUX1VMb25nICBuOworCisKKyAgICAgICAgICAgIGZvciAoIG4gPSAwOyBuIDwgcmFuZ2UtPm51bV9nbHlwaHM7IG4rKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmICggcmFuZ2UtPmdseXBoX2NvZGVzW25dID09IGdseXBoX2luZGV4ICkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICggcmFuZ2UtPmluZGV4X2Zvcm1hdCA9PSA0ICkKKyAgICAgICAgICAgICAgICAgICphZ2x5cGhfb2Zmc2V0ID0gcmFuZ2UtPmdseXBoX29mZnNldHNbbl07CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgKmFnbHlwaF9vZmZzZXQgPSByYW5nZS0+aW1hZ2Vfb2Zmc2V0ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiAqIHJhbmdlLT5pbWFnZV9zaXplOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgLyogZmFsbC10aHJvdWdoICovCisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGdvdG8gRmFpbDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIHJldHVybiBzdWNjZXNzZnVsbHkhICovCisgICAgICAgICphcmFuZ2UgID0gcmFuZ2U7CisKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgfQorCisgIEZhaWw6CisgICAgKmFyYW5nZSAgICAgICAgPSAwOworICAgICphZ2x5cGhfb2Zmc2V0ID0gMDsKKworICAgIHJldHVybiBUVF9FcnJfSW52YWxpZF9Bcmd1bWVudDsKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRmluZF9TQml0X0ltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQ2hlY2tzIHdoZXRoZXIgYW4gZW1iZWRkZWQgYml0bWFwIChhbiBgc2JpdCcpIGV4aXN0cyBmb3IgYSBnaXZlbiAgICovCisgIC8qICAgIGdseXBoLCBhdCBnaXZlbiB4IGFuZCB5IHBwZW1zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZhY2UgICAgICAgICAgOjogVGhlIHRhcmdldCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBnbHlwaF9pbmRleCAgIDo6IFRoZSBnbHlwaCBpbmRleC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgeF9wcGVtICAgICAgICA6OiBUaGUgaG9yaXpvbnRhbCByZXNvbHV0aW9uIGluIHBvaW50cyBwZXIgRU0uICAgICAgICovCisgIC8qICAgIHlfcHBlbSAgICAgICAgOjogVGhlIHZlcnRpY2FsIHJlc29sdXRpb24gaW4gcG9pbnRzIHBlciBFTS4gICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGFyYW5nZSAgICAgICAgOjogVGhlIFNCaXQgcmFuZ2UgY29udGFpbmluZyB0aGUgZ2x5cGggaW5kZXguICAgICAgICAqLworICAvKiAgICBhc3RyaWtlICAgICAgIDo6IFRoZSBTQml0IHN0cmlrZSBjb250YWluaW5nIHRoZSBnbHlwaCBpbmRleC4gICAgICAgKi8KKyAgLyogICAgYWdseXBoX29mZnNldCA6OiBUaGUgb2Zmc2V0IG9mIHRoZSBnbHlwaCBkYXRhIGluIGBFQkRUJyB0YWJsZS4gICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVHJ1ZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gIFJldHVybnMgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX0Vycl9JbnZhbGlkX0FyZ3VtZW50IGlmIG5vIHNiaXQgZXhpc3QgZm9yIHRoZSByZXF1ZXN0ZWQgZ2x5cGguICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgc3RhdGljCisgIFRUX0Vycm9yICBGaW5kX1NCaXRfSW1hZ2UoIFRUX0ZhY2UgICAgICAgICAgIGZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX1VTaG9ydCAgICAgICAgIGdseXBoX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9JbnQgICAgICAgICAgICB4X3BwZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX0ludCAgICAgICAgICAgIHlfcHBlbSwKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9TQml0X1JhbmdlKiogICBhcmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX1NCaXRfU3RyaWtlKiogIGFzdHJpa2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX1VMb25nKiAgICAgICAgIGFnbHlwaF9vZmZzZXQgKQorICB7CisgICAgVFRfU0JpdF9TdHJpa2UqICBzdHJpa2UgPSBmYWNlLT5zYml0X3N0cmlrZXM7CisgICAgVFRfU0JpdF9TdHJpa2UqICBzdHJpa2VfbGltaXQgPSBzdHJpa2UgKyBmYWNlLT5udW1fc2JpdF9zdHJpa2VzOworCisKKyAgICBpZiAoICFzdHJpa2UpCisgICAgICBnb3RvIEZhaWw7CisKKyAgICBmb3IgKCA7IHN0cmlrZSA8IHN0cmlrZV9saW1pdDsgc3RyaWtlKysgKQorICAgIHsKKyAgICAgIGlmICggc3RyaWtlLT54X3BwZW0gPT0geF9wcGVtICYmIHN0cmlrZS0+eV9wcGVtID09IHlfcHBlbSApCisgICAgICB7CisgICAgICAgIFRUX0Vycm9yICBlcnJvcjsKKworCisgICAgICAgIGVycm9yID0gRmluZF9TQml0X1JhbmdlKCBnbHlwaF9pbmRleCwgc3RyaWtlLCBhcmFuZ2UsIGFnbHlwaF9vZmZzZXQgKTsKKyAgICAgICAgaWYgKCBlcnJvciApCisgICAgICAgICAgZ290byBGYWlsOworCisgICAgICAgICphc3RyaWtlID0gc3RyaWtlOworCisgICAgICAgIHJldHVybiBUVF9FcnJfT2s7CisgICAgICB9CisgICAgfQorCisgIEZhaWw6CisgICAgLyogbm8gZW1iZWRkZWQgYml0bWFwIGZvciB0aGlzIGdseXBoIGluIGZhY2UgKi8KKyAgICAqYXJhbmdlICAgICAgICA9IDA7CisgICAgKmFzdHJpa2UgICAgICAgPSAwOworICAgICphZ2x5cGhfb2Zmc2V0ID0gMDsKKworICAgIHJldHVybiBUVF9FcnJfSW52YWxpZF9Bcmd1bWVudDsKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgTG9hZF9TQml0X01ldHJpY3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgR2V0cyB0aGUgYmlnIG1ldHJpY3MgZm9yIGEgZ2l2ZW4gU0JpdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgc3RyZWFtICAgICAgOjogVGhlIGlucHV0IHN0cmVhbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHJhbmdlICAgICAgIDo6IFRoZSBTQml0IHJhbmdlIGNvbnRhaW5pbmcgdGhlIGdseXBoLiAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGJpZ19tZXRyaWNzIDo6IEEgYmlnIFNCaXQgbWV0cmljcyBzdHJ1Y3R1cmUgZm9yIHRoZSBnbHlwaC4gICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRydWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoZSBzdHJlYW0gY3Vyc29yIG11c3QgYmUgcG9zaXRpb25lZCBhdCB0aGUgZ2x5cGgncyBvZmZzZXQgd2l0aGluICAqLworICAvKiAgICB0aGUgYEVCRFQnIHRhYmxlIGJlZm9yZSB0aGUgY2FsbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIElmIHRoZSBpbWFnZSBmb3JtYXQgdXNlcyB2YXJpYWJsZSBtZXRyaWNzLCB0aGUgc3RyZWFtIGN1cnNvciBpcyAgICAqLworICAvKiAgICBwb3NpdGlvbmVkIGp1c3QgYWZ0ZXIgdGhlIG1ldHJpY3MgaGVhZGVyIGluIHRoZSBgRUJEVCcgdGFibGUgb24gICAgKi8KKyAgLyogICAgZnVuY3Rpb24gZXhpdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBzdGF0aWMKKyAgVFRfRXJyb3IgIExvYWRfU0JpdF9NZXRyaWNzKCBGVF9TdHJlYW0gICAgICAgICBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfU0JpdF9SYW5nZSogICAgcmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfU0JpdF9NZXRyaWNzKiAgbWV0cmljcyApCisgIHsKKyAgICBUVF9FcnJvciAgZXJyb3IgPSBUVF9FcnJfT2s7CisKKworICAgIHN3aXRjaCAoIHJhbmdlLT5pbmRleF9mb3JtYXQgKQorICAgIHsKKyAgICBjYXNlIDE6ICAvKiB2YXJpYWJsZSBtZXRyaWNzICovCisgICAgY2FzZSAzOgorICAgIGNhc2UgNDoKKyAgICAgIHsKKyAgICAgICAgc3dpdGNoICggcmFuZ2UtPmltYWdlX2Zvcm1hdCApCisgICAgICAgIHsKKyAgICAgICAgY2FzZSAxOiAgLyogc21hbGwgbWV0cmljcyAqLworICAgICAgICBjYXNlIDI6CisgICAgICAgIGNhc2UgODoKKyAgICAgICAgICB7CisgICAgICAgICAgICBUVF9TQml0X1NtYWxsX01ldHJpY3MgIHNtZXRyaWNzOworCisKKyAgICAgICAgICAgIC8qIHJlYWQgc21hbGwgbWV0cmljcyAqLworICAgICAgICAgICAgaWYgKCBBQ0NFU1NfRnJhbWUoIDVMICkgKQorICAgICAgICAgICAgICBnb3RvIEV4aXQ7CisgICAgICAgICAgICBUVF9Mb2FkX1NtYWxsX1NCaXRfTWV0cmljcyggJnNtZXRyaWNzLCBzdHJlYW0gKTsKKyAgICAgICAgICAgIEZPUkdFVF9GcmFtZSgpOworCisgICAgICAgICAgICAvKiBjb252ZXJ0IGl0IHRvIGEgYmlnIG1ldHJpY3MgKi8KKyAgICAgICAgICAgIG1ldHJpY3MtPmhlaWdodCAgICAgICA9IHNtZXRyaWNzLmhlaWdodDsKKyAgICAgICAgICAgIG1ldHJpY3MtPndpZHRoICAgICAgICA9IHNtZXRyaWNzLndpZHRoOworICAgICAgICAgICAgbWV0cmljcy0+aG9yaUJlYXJpbmdYID0gc21ldHJpY3MuYmVhcmluZ1g7CisgICAgICAgICAgICBtZXRyaWNzLT5ob3JpQmVhcmluZ1kgPSBzbWV0cmljcy5iZWFyaW5nWTsKKyAgICAgICAgICAgIG1ldHJpY3MtPmhvcmlBZHZhbmNlICA9IHNtZXRyaWNzLmFkdmFuY2U7CisKKyAgICAgICAgICAgIC8qIHRoZXNlIG1ldHJpY3MgYXJlIG1hZGUgdXAgYXQgYSBoaWdoZXIgbGV2ZWwgd2hlbiAqLworICAgICAgICAgICAgLyogbmVlZGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICBtZXRyaWNzLT52ZXJ0QmVhcmluZ1ggPSAwOworICAgICAgICAgICAgbWV0cmljcy0+dmVydEJlYXJpbmdZID0gMDsKKyAgICAgICAgICAgIG1ldHJpY3MtPnZlcnRBZHZhbmNlICA9IDA7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6ICAvKiBiaWcgbWV0cmljcyAqLworICAgICAgICAgIGlmICggQUNDRVNTX0ZyYW1lKCA4TCApICkKKyAgICAgICAgICAgIGdvdG8gRXhpdDsKKyAgICAgICAgICBUVF9Mb2FkX1NCaXRfTWV0cmljcyggbWV0cmljcywgc3RyZWFtICk7CisgICAgICAgICAgRk9SR0VUX0ZyYW1lKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDogIC8qIGNvbnN0YW50IG1ldHJpY3MgKi8KKyAgICAgICptZXRyaWNzID0gcmFuZ2UtPm1ldHJpY3M7CisgICAgfQorCisgIEV4aXQ6CisgICAgcmV0dXJuIGVycm9yOworICB9CisKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIENyb3BfQml0bWFwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIENyb3BzIGEgYml0bWFwIHRvIGl0cyB0aWdodGVzdCBib3VuZGluZyBib3gsIGFuZCBhZGp1c3RzIGl0cyAgICAgICAqLworICAvKiAgICBtZXRyaWNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBpbWFnZSAgIDo6IFRoZSBpbnB1dCBnbHlwaCBzbG90LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG1ldHJpY3MgOjogVGhlIGNvcnJlc3BvbmRpbmcgbWV0cmljcyBzdHJ1Y3R1cmUuICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgc3RhdGljCisgIHZvaWQgIENyb3BfQml0bWFwKCBGVF9CaXRtYXAqICAgICAgICBtYXAsCisgICAgICAgICAgICAgICAgICAgICBUVF9TQml0X01ldHJpY3MqICBtZXRyaWNzICkKKyAgeworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogSW4gdGhpcyBzaXR1YXRpb24sIHNvbWUgYm91bmRpbmcgYm94ZXMgb2YgZW1iZWRkZWQgYml0bWFwcyBhcmUgdG9vICAqLworICAgIC8qIGxhcmdlLiAgV2UgbmVlZCB0byBjcm9wIGl0IHRvIGEgcmVhc29uYWJsZSBzaXplLiAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogICAgICAtLS0tLS0tLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICAgICAgfCAgICAgICB8ICAgICAgICAgICAgICAgIC0tLS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgICAgIHwgICoqKiAgfCAgICAgICAgICAgICAgICB8KioqfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogICAgICB8ICAgKiAgIHwgICAgICAgICAgICAgICAgfCAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICAgICAgfCAgICogICB8ICAgIC0tLS0tLT4gICAgIHwgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgICAgIHwgICAqICAgfCAgICAgICAgICAgICAgICB8ICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogICAgICB8ICAgKiAgIHwgICAgICAgICAgICAgICAgfCAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICAgICAgfCAgKioqICB8ICAgICAgICAgICAgICAgIHwqKip8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgICAgIC0tLS0tLS0tLSAgICAgICAgICAgICAgICAtLS0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIFRUX0ludCAgICByb3dzLCBjb3VudDsKKyAgICBUVF9Mb25nICAgbGluZV9sZW47CisgICAgVFRfQnl0ZSogIGxpbmU7CisKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogZmlyc3Qgb2YgYWxsLCBjaGVja3MgdGhlIHRvcC1tb3N0IGxpbmVzIG9mIHRoZSBiaXRtYXAsIGFuZCByZW1vdmVzICAqLworICAgIC8qIHRoZW0gaWYgdGhleSdyZSBlbXB0eS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgeworICAgICAgbGluZSAgICAgPSAoVFRfQnl0ZSopbWFwLT5idWZmZXI7CisgICAgICByb3dzICAgICA9IG1hcC0+cm93czsKKyAgICAgIGxpbmVfbGVuID0gbWFwLT5waXRjaDsKKworCisgICAgICBmb3IgKCBjb3VudCA9IDA7IGNvdW50IDwgcm93czsgY291bnQrKyApCisgICAgICB7CisgICAgICAgIFRUX0J5dGUqICBjdXIgICA9IGxpbmU7CisgICAgICAgIFRUX0J5dGUqICBsaW1pdCA9IGxpbmUgKyBsaW5lX2xlbjsKKworCisgICAgICAgIGZvciAoIDsgY3VyIDwgbGltaXQ7IGN1cisrICkKKyAgICAgICAgICBpZiAoIGN1clswXSApCisgICAgICAgICAgICBnb3RvIEZvdW5kX1RvcDsKKworICAgICAgICAvKiB0aGUgY3VycmVudCBsaW5lIHdhcyBlbXB0eSAtIHNraXAgdG8gbmV4dCBvbmUgKi8KKyAgICAgICAgbGluZSAgPSBsaW1pdDsKKyAgICAgIH0KKworICAgIEZvdW5kX1RvcDoKKyAgICAgIC8qIGNoZWNrIHRoYXQgd2UgaGF2ZSBhdCBsZWFzdCBvbmUgZmlsbGVkIGxpbmUgKi8KKyAgICAgIGlmICggY291bnQgPj0gcm93cyApCisgICAgICAgIGdvdG8gRW1wdHlfQml0bWFwOworCisgICAgICAvKiBub3csIGNyb3AgdGhlIGVtcHR5IHVwcGVyIGxpbmVzICovCisgICAgICBpZiAoIGNvdW50ID4gMCApCisgICAgICB7CisgICAgICAgIGxpbmUgPSAoVFRfQnl0ZSopbWFwLT5idWZmZXI7CisKKyAgICAgICAgTUVNX01vdmUoIGxpbmUsIGxpbmUgKyBjb3VudCAqIGxpbmVfbGVuLCAocm93cyAtIGNvdW50KSAqIGxpbmVfbGVuICk7CisKKyAgICAgICAgbWV0cmljcy0+aGVpZ2h0ICAgICAgIC09IGNvdW50OworICAgICAgICBtZXRyaWNzLT5ob3JpQmVhcmluZ1kgLT0gY291bnQ7CisgICAgICAgIG1ldHJpY3MtPnZlcnRCZWFyaW5nWSAtPSBjb3VudDsKKworICAgICAgICBtYXAtPnJvd3MgLT0gY291bnQ7CisgICAgICAgIHJvd3MgICAgICAtPSBjb3VudDsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qIHNlY29uZCwgY3JvcCB0aGUgbG93ZXIgbGluZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgeworICAgICAgbGluZSA9IChUVF9CeXRlKiltYXAtPmJ1ZmZlciArIChyb3dzIC0gMSkgKiBsaW5lX2xlbjsKKworICAgICAgZm9yICggY291bnQgPSAwOyBjb3VudCA8IHJvd3M7IGNvdW50KysgKQorICAgICAgeworICAgICAgICBUVF9CeXRlKiAgY3VyICAgPSBsaW5lOworICAgICAgICBUVF9CeXRlKiAgbGltaXQgPSBsaW5lICsgbGluZV9sZW47CisKKworICAgICAgICBmb3IgKCA7IGN1ciA8IGxpbWl0OyBjdXIrKyApCisgICAgICAgICAgaWYgKCBjdXJbMF0gKQorICAgICAgICAgICAgZ290byBGb3VuZF9Cb3R0b207CisKKyAgICAgICAgLyogdGhlIGN1cnJlbnQgbGluZSB3YXMgZW1wdHkgLSBza2lwIHRvIHByZXZpb3VzIG9uZSAqLworICAgICAgICBsaW5lIC09IGxpbmVfbGVuOworICAgICAgfQorCisgICAgRm91bmRfQm90dG9tOgorICAgICAgaWYgKCBjb3VudCA+IDAgKQorICAgICAgeworICAgICAgICBtZXRyaWNzLT5oZWlnaHQgLT0gY291bnQ7CisgICAgICAgIHJvd3MgICAgICAgICAgICAtPSBjb3VudDsKKyAgICAgICAgbWFwLT5yb3dzICAgICAgIC09IGNvdW50OworICAgICAgfQorICAgIH0KKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogdGhpcmQsIGdldCByaWQgb2YgdGhlIHNwYWNlIG9uIHRoZSBsZWZ0IHNpZGUgb2YgdGhlIGdseXBoICAgICAgICAgICAqLworICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBkbworICAgIHsKKyAgICAgIFRUX0J5dGUqICBsaW1pdDsKKworCisgICAgICBsaW5lICA9IChUVF9CeXRlKiltYXAtPmJ1ZmZlcjsKKyAgICAgIGxpbWl0ID0gbGluZSArIHJvd3MgKiBsaW5lX2xlbjsKKworICAgICAgZm9yICggOyBsaW5lIDwgbGltaXQ7IGxpbmUgKz0gbGluZV9sZW4gKQorICAgICAgICBpZiAoIGxpbmVbMF0gJiAweDgwICkKKyAgICAgICAgICBnb3RvIEZvdW5kX0xlZnQ7CisKKyAgICAgIC8qIHNoaWZ0IHRoZSB3aG9sZSBnbHlwaCBvbmUgcGl4ZWwgdG8gdGhlIGxlZnQgKi8KKyAgICAgIGxpbmUgID0gKFRUX0J5dGUqKW1hcC0+YnVmZmVyOworICAgICAgbGltaXQgPSBsaW5lICsgcm93cyAqIGxpbmVfbGVuOworCisgICAgICBmb3IgKCA7IGxpbmUgPCBsaW1pdDsgbGluZSArPSBsaW5lX2xlbiApCisgICAgICB7CisgICAgICAgIFRUX0ludCAgICBuLCB3aWR0aCA9IG1hcC0+d2lkdGg7CisgICAgICAgIFRUX0J5dGUgICBvbGQ7CisgICAgICAgIFRUX0J5dGUqICBjdXIgPSBsaW5lOworCisKKyAgICAgICAgb2xkID0gY3VyWzBdIDw8IDE7CisgICAgICAgIGZvciAoIG4gPSA4OyBuIDwgd2lkdGg7IG4gKz0gOCApCisgICAgICAgIHsKKyAgICAgICAgICBUVF9CeXRlICB2YWw7CisKKworICAgICAgICAgIHZhbCAgICA9IGN1clsxXTsKKyAgICAgICAgICBjdXJbMF0gPSBvbGQgfCAodmFsID4+IDcpOworICAgICAgICAgIG9sZCAgICA9IHZhbCA8PCAxOworICAgICAgICAgIGN1cisrOworICAgICAgICB9CisgICAgICAgIGN1clswXSA9IG9sZDsKKyAgICAgIH0KKworICAgICAgbWFwLT53aWR0aC0tOworICAgICAgbWV0cmljcy0+aG9yaUJlYXJpbmdYKys7CisgICAgICBtZXRyaWNzLT52ZXJ0QmVhcmluZ1grKzsKKyAgICAgIG1ldHJpY3MtPndpZHRoLS07CisgICAgfSB3aGlsZSAoIG1hcC0+d2lkdGggPiAwICk7CisKKyAgRm91bmRfTGVmdDoKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogZmluYWxseSwgY3JvcCB0aGUgYml0bWFwIHdpZHRoIHRvIGdldCByaWQgb2YgdGhlIHNwYWNlIG9uIHRoZSByaWdodCAqLworICAgIC8qIHNpZGUgb2YgdGhlIGdseXBoLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgZG8KKyAgICB7CisgICAgICBUVF9JbnQgICAgcmlnaHQgPSBtYXAtPndpZHRoLTE7CisgICAgICBUVF9CeXRlKiAgbGltaXQ7CisgICAgICBUVF9CeXRlICAgbWFzazsKKworCisgICAgICBsaW5lICA9IChUVF9CeXRlKiltYXAtPmJ1ZmZlciArIChyaWdodCA+PiAzKTsKKyAgICAgIGxpbWl0ID0gbGluZSArIHJvd3MqbGluZV9sZW47CisgICAgICBtYXNrICA9IDB4ODAgPj4gKHJpZ2h0ICYgNyk7CisKKyAgICAgIGZvciAoIDsgbGluZSA8IGxpbWl0OyBsaW5lICs9IGxpbmVfbGVuICkKKyAgICAgICAgaWYgKCBsaW5lWzBdICYgbWFzayApCisgICAgICAgICAgZ290byBGb3VuZF9SaWdodDsKKworICAgICAgLyogY3JvcCB0aGUgd2hvbGUgZ2x5cGggdG8gdGhlIHJpZ2h0ICovCisgICAgICBtYXAtPndpZHRoLS07CisgICAgICBtZXRyaWNzLT53aWR0aC0tOworICAgIH0gd2hpbGUgKCBtYXAtPndpZHRoID4gMCApOworCisgIEZvdW5kX1JpZ2h0OgorICAgIC8qIGFsbCByaWdodCwgdGhlIGJpdG1hcCB3YXMgY3JvcHBlZCAqLworICAgIHJldHVybjsKKworICBFbXB0eV9CaXRtYXA6CisgICAgbWFwLT53aWR0aCAgICAgID0gMDsKKyAgICBtYXAtPnJvd3MgICAgICAgPSAwOworICAgIG1hcC0+cGl0Y2ggICAgICA9IDA7CisgICAgbWFwLT5waXhlbF9tb2RlID0gZnRfcGl4ZWxfbW9kZV9tb25vOworICB9CisKKworICBzdGF0aWMKKyAgVFRfRXJyb3IgTG9hZF9TQml0X1NpbmdsZSggRlRfQml0bWFwKiAgICAgICAgbWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9JbnQgICAgICAgICAgICB4X29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfSW50ICAgICAgICAgICAgeV9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX0ludCAgICAgICAgICAgIHBpeF9iaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9VU2hvcnQgICAgICAgICBpbWFnZV9mb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX1NCaXRfTWV0cmljcyogIG1ldHJpY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgICAgICAgIHN0cmVhbSApCisgIHsKKyAgICBUVF9FcnJvciAgZXJyb3I7CisKKworICAgIC8qIGNoZWNrIHRoYXQgdGhlIHNvdXJjZSBiaXRtYXAgZml0cyBpbnRvIHRoZSB0YXJnZXQgcGl4bWFwICovCisgICAgaWYgKCB4X29mZnNldCA8IDAgfHwgeF9vZmZzZXQgKyBtZXRyaWNzLT53aWR0aCAgPiBtYXAtPndpZHRoIHx8CisgICAgICAgICB5X29mZnNldCA8IDAgfHwgeV9vZmZzZXQgKyBtZXRyaWNzLT5oZWlnaHQgPiBtYXAtPnJvd3MgICkKKyAgICB7CisgICAgICBlcnJvciA9IFRUX0Vycl9JbnZhbGlkX0FyZ3VtZW50OworCisgICAgICBnb3RvIEV4aXQ7CisgICAgfQorCisgICAgeworICAgICAgVFRfSW50ICBnbHlwaF93aWR0aCAgPSBtZXRyaWNzLT53aWR0aDsKKyAgICAgIFRUX0ludCAgZ2x5cGhfaGVpZ2h0ID0gbWV0cmljcy0+aGVpZ2h0OworICAgICAgVFRfSW50ICBnbHlwaF9zaXplOworICAgICAgVFRfSW50ICBsaW5lX2JpdHMgICAgPSBwaXhfYml0cyAqIGdseXBoX3dpZHRoOworICAgICAgVFRfQm9vbCBwYWRfYnl0ZXMgICAgPSAwOworCisKKyAgICAgIC8qIGNvbXB1dGUgc2l6ZSBvZiBnbHlwaCBpbWFnZSAqLworICAgICAgc3dpdGNoICggaW1hZ2VfZm9ybWF0ICkKKyAgICAgIHsKKyAgICAgIGNhc2UgMTogIC8qIGJ5dGUtcGFkZGVkIGZvcm1hdHMgKi8KKyAgICAgIGNhc2UgNjoKKyAgICAgICAgeworICAgICAgICAgIFRUX0ludCAgbGluZV9sZW5ndGg7CisKKworICAgICAgICAgIHN3aXRjaCAoIHBpeF9iaXRzICkKKyAgICAgICAgICB7CisgICAgICAgICAgY2FzZSAxOiAgbGluZV9sZW5ndGggPSAoZ2x5cGhfd2lkdGgrNykgPj4gMzsgICBicmVhazsKKyAgICAgICAgICBjYXNlIDI6ICBsaW5lX2xlbmd0aCA9IChnbHlwaF93aWR0aCszKSA+PiAyOyAgIGJyZWFrOworICAgICAgICAgIGNhc2UgNDogIGxpbmVfbGVuZ3RoID0gKGdseXBoX3dpZHRoKzEpID4+IDE7ICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDogbGluZV9sZW5ndGggPSAgZ2x5cGhfd2lkdGg7CisgICAgICAgICAgfQorCisgICAgICAgICAgZ2x5cGhfc2l6ZSA9IGdseXBoX2hlaWdodCAqIGxpbmVfbGVuZ3RoOworICAgICAgICAgIHBhZF9ieXRlcyAgPSAxOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIDI6CisgICAgICBjYXNlIDU6CisgICAgICBjYXNlIDc6CisgICAgICAgIGxpbmVfYml0cyAgPSAgZ2x5cGhfd2lkdGggKiBwaXhfYml0czsKKyAgICAgICAgZ2x5cGhfc2l6ZSA9IChnbHlwaF9oZWlnaHQgKiBsaW5lX2JpdHMgKyA3KSA+PiAzOworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDogIC8qIGludmFsaWQgZm9ybWF0ICovCisgICAgICAgIHJldHVybiBUVF9FcnJfSW52YWxpZF9GaWxlX0Zvcm1hdDsKKyAgICAgIH0KKworICAgICAgLyogTm93IHJlYWQgZGF0YSBhbmQgZHJhdyBnbHlwaCBpbnRvIHRhcmdldCBwaXhtYXAgICAgICAgKi8KKyAgICAgIGlmICggQUNDRVNTX0ZyYW1lKCBnbHlwaF9zaXplICkgKQorICAgICAgICBnb3RvIEV4aXQ7CisKKyAgICAgIC8qIGRvbid0IGZvcmdldCB0byBtdWx0aXBseSBgeF9vZmZzZXQnIGJ5IGBtYXAtPnBpeF9iaXRzJyBhcyAqLworICAgICAgLyogdGhlIHNiaXQgYmxpdHRlciBkb2Vzbid0IG1ha2UgYSBkaWZmZXJlbmNlIGJldHdlZW4gcGl4bWFwICovCisgICAgICAvKiBkZXB0aHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgIGJsaXRfc2JpdCggbWFwLCBzdHJlYW0tPmN1cnNvciwgbGluZV9iaXRzLCBwYWRfYnl0ZXMsCisgICAgICAgICAgICAgICAgIHhfb2Zmc2V0ICogcGl4X2JpdHMsIHlfb2Zmc2V0ICk7CisKKyAgICAgIEZPUkdFVF9GcmFtZSgpOworICAgIH0KKworICBFeGl0OgorICAgIHJldHVybiBlcnJvcjsKKyAgfQorCisKKyAgc3RhdGljCisgIFRUX0Vycm9yIExvYWRfU0JpdF9JbWFnZSggVFRfU0JpdF9TdHJpa2UqICAgc3RyaWtlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX1NCaXRfUmFuZ2UqICAgIHJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX1VMb25nICAgICAgICAgIGViZHRfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX1VMb25nICAgICAgICAgIGdseXBoX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CaXRtYXAqICAgICAgICBtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfSW50ICAgICAgICAgICAgeF9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfSW50ICAgICAgICAgICAgeV9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICAgICAgICAgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX1NCaXRfTWV0cmljcyogIG1ldHJpY3MgKQorICB7CisgICAgRlRfTWVtb3J5ICAgICAgICAgICAgbWVtb3J5ID0gc3RyZWFtLT5tZW1vcnk7CisgICAgVFRfRXJyb3IgICAgICAgICAgICAgZXJyb3I7CisKKworICAgIC8qIHBsYWNlIHN0cmVhbSBhdCBiZWdpbm5pbmcgb2YgZ2x5cGggZGF0YSBhbmQgcmVhZCBtZXRyaWNzICovCisgICAgaWYgKCBGSUxFX1NlZWsoIGViZHRfcG9zICsgZ2x5cGhfb2Zmc2V0ICkgKQorICAgICAgZ290byBFeGl0OworCisgICAgZXJyb3IgPSBMb2FkX1NCaXRfTWV0cmljcyggc3RyZWFtLCByYW5nZSwgbWV0cmljcyApOworICAgIGlmICggZXJyb3IgKQorICAgICAgZ290byBFeGl0OworCisgICAgLyogdGhpcyBmdW5jdGlvbiBpcyByZWN1cnNpdmUuICBBdCB0aGUgdG9wLWxldmVsIGNhbGwsIHRoZSAqLworICAgIC8qIGZpZWxkIG1hcC5idWZmZXIgaXMgTlVMTC4gIFdlIHRodXMgYmVnaW4gYnkgZmluZGluZyB0aGUgKi8KKyAgICAvKiBkaW1lbnNpb25zIG9mIHRoZSBoaWdoZXItbGV2ZWwgZ2x5cGggdG8gYWxsb2NhdGUgdGhlICAgICovCisgICAgLyogZmluYWwgcGl4bWFwIGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGlmICggbWFwLT5idWZmZXIgPT0gMCApCisgICAgeworICAgICAgVFRfTG9uZyAgc2l6ZTsKKworCisgICAgICBtYXAtPndpZHRoICAgID0gbWV0cmljcy0+d2lkdGg7CisgICAgICBtYXAtPnJvd3MgICAgID0gbWV0cmljcy0+aGVpZ2h0OworCisgICAgICBzd2l0Y2ggKCBzdHJpa2UtPmJpdF9kZXB0aCApCisgICAgICB7CisgICAgICBjYXNlIDE6CisgICAgICAgIG1hcC0+cGl4ZWxfbW9kZSA9IGZ0X3BpeGVsX21vZGVfbW9ubzsgCisgICAgICAgIG1hcC0+cGl0Y2ggICAgICA9IChtYXAtPndpZHRoKzcpID4+IDM7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAyOgorICAgICAgICBtYXAtPnBpeGVsX21vZGUgPSBmdF9waXhlbF9tb2RlX3BhbDI7IAorICAgICAgICBtYXAtPnBpdGNoICAgICAgPSAobWFwLT53aWR0aCszKSA+PiAyOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNDoKKyAgICAgICAgbWFwLT5waXhlbF9tb2RlID0gZnRfcGl4ZWxfbW9kZV9wYWw0OyAKKyAgICAgICAgbWFwLT5waXRjaCAgICAgID0gKG1hcC0+d2lkdGgrMSkgPj4gMTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDg6CisgICAgICAgIG1hcC0+cGl4ZWxfbW9kZSA9IGZ0X3BpeGVsX21vZGVfZ3JheXM7IAorICAgICAgICBtYXAtPnBpdGNoICAgICAgPSBtYXAtPndpZHRoOworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIFRUX0Vycl9JbnZhbGlkX0ZpbGVfRm9ybWF0OworICAgICAgfQorCisgICAgICBzaXplID0gbWFwLT5yb3dzICogbWFwLT5waXRjaDsKKworICAgICAgLyogY2hlY2sgdGhhdCB0aGVyZSBpcyBubyBlbXB0eSBpbWFnZSAqLworICAgICAgaWYgKCBzaXplID09IDAgKQorICAgICAgICBnb3RvIEV4aXQ7ICAgICAvKiBleGl0IHN1Y2Nlc3NmdWxseSEgKi8KKworICAgICAgaWYgKCBBTExPQyggbWFwLT5idWZmZXIsIHNpemUgKSApCisgICAgICAgIGdvdG8gRXhpdDsKKyAgICB9CisKKyAgICBzd2l0Y2ggKCByYW5nZS0+aW1hZ2VfZm9ybWF0ICkKKyAgICB7CisgICAgY2FzZSAxOiAgLyogc2luZ2xlIHNiaXQgaW1hZ2UgLSBsb2FkIGl0ICovCisgICAgY2FzZSAyOgorICAgIGNhc2UgNToKKyAgICBjYXNlIDY6CisgICAgY2FzZSA3OgorICAgICAgcmV0dXJuIExvYWRfU0JpdF9TaW5nbGUoIG1hcCwgeF9vZmZzZXQsIHlfb2Zmc2V0LCBzdHJpa2UtPmJpdF9kZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZS0+aW1hZ2VfZm9ybWF0LCBtZXRyaWNzLCBzdHJlYW0gKTsKKworICAgIGNhc2UgODogIC8qIGNvbXBvdW5kIGZvcm1hdCAqLworICAgIGNhc2UgOToKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDogLyogaW52YWxpZCBpbWFnZSBmb3JtYXQgKi8KKyAgICAgIHJldHVybiBUVF9FcnJfSW52YWxpZF9GaWxlX0Zvcm1hdDsKKyAgICB9CisKKyAgICAvKiBBbGwgcmlnaHQsIHdlJ3JlIGluIGEgY29tcG91bmQgZm9ybWF0LiAgRmlyc3Qgb2YgYWxsLCByZWFkICovCisgICAgLyogdGhlIGFycmF5IG9mIGVsZW1lbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIHsKKyAgICAgIFRUX1NCaXRfQ29tcG9uZW50KiAgY29tcG9uZW50czsKKyAgICAgIFRUX1NCaXRfQ29tcG9uZW50KiAgY29tcDsKKyAgICAgIFRUX1VTaG9ydCAgICAgICAgICAgbnVtX2NvbXBvbmVudHMsIGNvdW50OworCisKKyAgICAgIGlmICggUkVBRF9VU2hvcnQoIG51bV9jb21wb25lbnRzICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8CisgICAgICAgICAgIEFMTE9DX0FSUkFZKCBjb21wb25lbnRzLCBudW1fY29tcG9uZW50cywgVFRfU0JpdF9Db21wb25lbnQgKSApCisgICAgICAgIGdvdG8gRXhpdDsKKworICAgICAgY291bnQgPSBudW1fY29tcG9uZW50czsKKworICAgICAgaWYgKCBBQ0NFU1NfRnJhbWUoIDRMICogbnVtX2NvbXBvbmVudHMgKSApCisgICAgICAgIGdvdG8gRmFpbF9NZW1vcnk7CisKKyAgICAgIGZvciAoIGNvbXAgPSBjb21wb25lbnRzOyBjb3VudCA+IDA7IGNvdW50LS0sIGNvbXArKyApCisgICAgICB7CisgICAgICAgIGNvbXAtPmdseXBoX2NvZGUgPSBHRVRfVVNob3J0KCk7CisgICAgICAgIGNvbXAtPnhfb2Zmc2V0ICAgPSBHRVRfQ2hhcigpOworICAgICAgICBjb21wLT55X29mZnNldCAgID0gR0VUX0NoYXIoKTsKKyAgICAgIH0KKworICAgICAgRk9SR0VUX0ZyYW1lKCk7CisKKyAgICAgIC8qIE5vdyByZWN1cnNpdmVseSBsb2FkIGVhY2ggZWxlbWVudCBnbHlwaCAqLworICAgICAgY291bnQgPSBudW1fY29tcG9uZW50czsKKyAgICAgIGNvbXAgID0gY29tcG9uZW50czsKKyAgICAgIGZvciAoIDsgY291bnQgPiAwOyBjb3VudC0tLCBjb21wKysgKQorICAgICAgeworICAgICAgICBUVF9TQml0X1JhbmdlKiAgIGVsZW1fcmFuZ2U7CisgICAgICAgIFRUX1NCaXRfTWV0cmljcyAgZWxlbV9tZXRyaWNzOworICAgICAgICBUVF9VTG9uZyAgICAgICAgIGVsZW1fb2Zmc2V0OworCisKKyAgICAgICAgLyogZmluZCB0aGUgcmFuZ2UgZm9yIHRoaXMgZWxlbWVudCAqLworICAgICAgICBlcnJvciA9IEZpbmRfU0JpdF9SYW5nZSggY29tcC0+Z2x5cGhfY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlrZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlbGVtX3JhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVsZW1fb2Zmc2V0ICk7CisgICAgICAgIGlmICggZXJyb3IgKQorICAgICAgICAgIGdvdG8gRmFpbF9NZW1vcnk7CisKKyAgICAgICAgLyogbm93IGxvYWQgdGhlIGVsZW1lbnQsIHJlY3Vyc2l2ZWx5ICovCisgICAgICAgIGVycm9yID0gTG9hZF9TQml0X0ltYWdlKCBzdHJpa2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtX3JhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWJkdF9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhfb2Zmc2V0ICsgY29tcC0+eF9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5X29mZnNldCArIGNvbXAtPnlfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVsZW1fbWV0cmljcyApOworICAgICAgICBpZiAoIGVycm9yICkKKyAgICAgICAgICBnb3RvIEZhaWxfTWVtb3J5OworICAgICAgfQorCisgICAgRmFpbF9NZW1vcnk6CisgICAgICBGUkVFKCBjb21wb25lbnRzICk7CisgICAgfQorCisgIEV4aXQ6CisgICAgcmV0dXJuIGVycm9yOworICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUVF9Mb2FkX1NCaXRfSW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBMb2FkcyBhIGdpdmVuIGdseXBoIHNiaXQgaW1hZ2UgZnJvbSB0aGUgZm9udCByZXNvdXJjZS4gIFRoaXMgYWxzbyAgKi8KKyAgLyogICAgcmV0dXJucyBpdHMgbWV0cmljcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZmFjZSAgICAgICAgOjogVGhlIHRhcmdldCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB4X3BwZW0gICAgICA6OiBUaGUgaG9yaXpvbnRhbCByZXNvbHV0aW9uIGluIHBvaW50cyBwZXIgRU0uICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHlfcHBlbSAgICAgIDo6IFRoZSB2ZXJ0aWNhbCByZXNvbHV0aW9uIGluIHBvaW50cyBwZXIgRU0uICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZ2x5cGhfaW5kZXggOjogVGhlIGN1cnJlbnQgZ2x5cGggaW5kZXguICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzdHJlYW0gICAgICA6OiBUaGUgaW5wdXQgc3RyZWFtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBtYXAgICAgICAgICA6OiBUaGUgdGFyZ2V0IHBpeG1hcC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbWV0cmljcyAgICAgOjogQSBiaWcgc2JpdCBtZXRyaWNzIHN0cnVjdHVyZSBmb3IgdGhlIGdseXBoIGltYWdlLiAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVHJ1ZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gIFJldHVybnMgYW4gZXJyb3IgaWYgbm8gICAgICovCisgIC8qICAgIGdseXBoIHNiaXQgZXhpc3RzIGZvciB0aGUgaW5kZXguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoZSBgbWFwLmJ1ZmZlcicgZmllbGQgaXMgYWx3YXlzIGZyZWVkIGJlZm9yZSB0aGUgZ2x5cGggaXMgbG9hZGVkLiAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgTE9DQUxfRlVOQworICBUVF9FcnJvciAgVFRfTG9hZF9TQml0X0ltYWdlKCBUVF9GYWNlICAgICAgICAgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9JbnQgICAgICAgICAgICB4X3BwZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX0ludCAgICAgICAgICAgIHlfcHBlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfVUludCAgICAgICAgICAgZ2x5cGhfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgICAgICAgIHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQml0bWFwKiAgICAgICAgbWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9TQml0X01ldHJpY3MqICBtZXRyaWNzICkKKyAgeworICAgIFRUX0Vycm9yICAgICAgICAgZXJyb3I7CisgICAgRlRfTWVtb3J5ICAgICAgICBtZW1vcnkgPSBzdHJlYW0tPm1lbW9yeTsKKyAgICBUVF9VTG9uZyAgICAgICAgIGViZHRfcG9zLCBnbHlwaF9vZmZzZXQ7CisKKyAgICBUVF9TQml0X1N0cmlrZSogIHN0cmlrZTsKKyAgICBUVF9TQml0X1JhbmdlKiAgIHJhbmdlOworCisKKyAgICAvKiBDaGVjayB3aGV0aGVyIHRoZXJlIGlzIGEgZ2x5cGggc2JpdCBmb3IgdGhlIGN1cnJlbnQgaW5kZXggKi8KKyAgICBlcnJvciA9IEZpbmRfU0JpdF9JbWFnZSggZmFjZSwgZ2x5cGhfaW5kZXgsIHhfcHBlbSwgeV9wcGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmFuZ2UsICZzdHJpa2UsICZnbHlwaF9vZmZzZXQgKTsKKyAgICBpZiAoIGVycm9yICkKKyAgICAgIGdvdG8gRXhpdDsKKworICAgIC8qIG5vdywgZmluZCB0aGUgbG9jYXRpb24gb2YgdGhlIGBFQkRUJyB0YWJsZSBpbiAqLworICAgIC8qIHRoZSBmb250IGZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIHsKKyAgICAgIFRUX0xvbmcgIHRhYmxlID0gVFRfTG9va1VwX1RhYmxlKCBmYWNlLCBUVEFHX0VCRFQgKTsKKworCisgICAgICBpZiAoIHRhYmxlIDwgMCApCisgICAgICB7CisgICAgICAgIGVycm9yID0gVFRfRXJyX0ludmFsaWRfRmlsZV9Gb3JtYXQ7CisgICAgICAgIGdvdG8gRXhpdDsKKyAgICAgIH0KKworICAgICAgZWJkdF9wb3MgPSBmYWNlLT5kaXJfdGFibGVzW3RhYmxlXS5PZmZzZXQ7CisgICAgfQorCisgICAgLyogY2xlYXIgdGhlIGJpdG1hcCAmIGxvYWQgdGhlIGJpdG1hcCAqLworICAgIEZSRUUoIG1hcC0+YnVmZmVyICk7CisgICAgbWFwLT5yb3dzID0gbWFwLT5waXRjaCA9IG1hcC0+d2lkdGggPSAwOworCisgICAgZXJyb3IgPSBMb2FkX1NCaXRfSW1hZ2UoIHN0cmlrZSwgcmFuZ2UsIGViZHRfcG9zLCBnbHlwaF9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcCwgMCwgMCwgc3RyZWFtLCBtZXRyaWNzICk7CisgICAgaWYgKCBlcnJvciApCisgICAgICBnb3RvIEV4aXQ7CisKKyAgICAvKiBzZXR1cCB2ZXJ0aWNhbCBtZXRyaWNzIGlmIG5lZWRlZCAqLworICAgIGlmICggc3RyaWtlLT5mbGFncyAmIDEgKQorICAgIHsKKyAgICAgIC8qIGluIGNhc2Ugb2YgYSBob3Jpem9udGFsIHN0cmlrZSBvbmx5ICovCisgICAgICBGVF9JbnQgIGFkdmFuY2U7CisgICAgICBGVF9JbnQgIHRvcDsKKworCisgICAgICBhZHZhbmNlID0gc3RyaWtlLT5ob3JpLmFzY2VuZGVyIC0gc3RyaWtlLT5ob3JpLmRlc2NlbmRlcjsKKyAgICAgIHRvcCAgICAgPSBhZHZhbmNlIC8gMTA7CisKKyAgICAgIG1ldHJpY3MtPnZlcnRCZWFyaW5nWCA9IC1tZXRyaWNzLT53aWR0aCAvIDI7CisgICAgICBtZXRyaWNzLT52ZXJ0QmVhcmluZ1kgPSAgYWR2YW5jZSAvIDEwOworICAgICAgbWV0cmljcy0+dmVydEFkdmFuY2UgID0gIGFkdmFuY2UgKiAxMiAvIDEwOworICAgIH0KKworICAgIC8qIENyb3AgdGhlIGJpdG1hcCBub3cgKi8KKyAgICBDcm9wX0JpdG1hcCggbWFwLCBtZXRyaWNzICk7CisKKyAgRXhpdDoKKyAgICByZXR1cm4gZXJyb3I7CisgIH0KKworCisvKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9zaGFyZWQvc2ZudC90dHNiaXQuaCBiL3NyYy9zaGFyZWQvc2ZudC90dHNiaXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTRjZWFlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3NoYXJlZC9zZm50L3R0c2JpdC5oCkBAIC0wLDAgKzEsMTA0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICB0dHNiaXQuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgVHJ1ZVR5cGUgYW5kIE9wZW5UeXBlIGVtYmVkZGVkIGJpdG1hcCBzdXBwb3J0IChzcGVjaWZpY2F0aW9uKS4gICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDE5OTYtMTk5OSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkICAgICAgICAqLworLyogIG1vZGlmaWVkIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAgKi8KKy8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCisvKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLworLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNpZm5kZWYgVFRTQklUX0gKKyNkZWZpbmUgVFRTQklUX0gKKworI2luY2x1ZGUgPHR0bG9hZC5oPgorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfTG9hZF9TQml0X1N0cmlrZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgTG9hZHMgdGhlIHRhYmxlIG9mIGVtYmVkZGVkIGJpdG1hcCBzaXplcyBmb3IgdGhpcyBmYWNlLiAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZmFjZSAgIDo6IFRoZSB0YXJnZXQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHN0cmVhbSA6OiBUaGUgaW5wdXQgc3RyZWFtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRydWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgTE9DQUxfREVGCisgIFRUX0Vycm9yICBUVF9Mb2FkX1NCaXRfU3RyaWtlcyggVFRfRmFjZSAgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgc3RyZWFtICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUVF9GcmVlX1NCaXRfU3RyaWtlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBSZWxlYXNlcyB0aGUgZW1iZWRkZWQgYml0bWFwIHRhYmxlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBmYWNlIDo6IFRoZSB0YXJnZXQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIExPQ0FMX0RFRgorICB2b2lkICBUVF9GcmVlX1NCaXRfU3RyaWtlcyggVFRfRmFjZSAgZmFjZSApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfTG9hZF9TQml0X0ltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgTG9hZHMgYSBnaXZlbiBnbHlwaCBzYml0IGltYWdlIGZyb20gdGhlIGZvbnQgcmVzb3VyY2UuICBUaGlzIGFsc28gICovCisgIC8qICAgIHJldHVybnMgaXRzIG1ldHJpY3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZhY2UgICAgICAgIDo6IFRoZSB0YXJnZXQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgeF9wcGVtICAgICAgOjogVGhlIGhvcml6b250YWwgcmVzb2x1dGlvbiBpbiBwb2ludHMgcGVyIEVNLiAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB5X3BwZW0gICAgICA6OiBUaGUgdmVydGljYWwgcmVzb2x1dGlvbiBpbiBwb2ludHMgcGVyIEVNLiAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGdseXBoX2luZGV4IDo6IFRoZSBjdXJyZW50IGdseXBoIGluZGV4LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgc3RyZWFtICAgICAgOjogVGhlIGlucHV0IHN0cmVhbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbWFwICAgICAgICAgOjogVGhlIHRhcmdldCBwaXhtYXAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG1ldHJpY3MgICAgIDo6IEEgYmlnIHNiaXQgbWV0cmljcyBzdHJ1Y3R1cmUgZm9yIHRoZSBnbHlwaCBpbWFnZS4gICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRydWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICBSZXR1cm5zIGFuIGVycm9yIGlmIG5vICAgICAqLworICAvKiAgICBnbHlwaCBzYml0IGV4aXN0cyBmb3IgdGhlIGluZGV4LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGUgYG1hcC5idWZmZXInIGZpZWxkIGlzIGFsd2F5cyBmcmVlZCBiZWZvcmUgdGhlIGdseXBoIGlzIGxvYWRlZC4gKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIExPQ0FMX0RFRgorICBUVF9FcnJvciAgVFRfTG9hZF9TQml0X0ltYWdlKCBUVF9GYWNlICAgICAgICAgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9JbnQgICAgICAgICAgICB4X3BwZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX0ludCAgICAgICAgICAgIHlfcHBlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfVUludCAgICAgICAgICAgZ2x5cGhfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgICAgICAgIHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQml0bWFwKiAgICAgICAgbWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9TQml0X01ldHJpY3MqICBtZXRyaWNzICk7CisKKworI2VuZGlmIC8qIFRUU0JJVF9IICovCisKKworLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvc2hhcmVkL3NmbnQvdHR0eXBlcy5oIGIvc3JjL3NoYXJlZC9zZm50L3R0dHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zM2IyNDUzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3NoYXJlZC9zZm50L3R0dHlwZXMuaApAQCAtMCwwICsxLDE4NDggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHR0dHlwZXMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBCYXNpYyBTRk5UL1RydWVUeXBlIHR5cGUgZGVmaW5pdGlvbnMgYW5kIGludGVyZmFjZSAoc3BlY2lmaWNhdGlvbiAgICAqLworLyogICAgb25seSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBjb2RlIGlzIHNoYXJlZCBieSBhbGwgVHJ1ZVR5cGUgYW5kIE9wZW5UeXBlIGRyaXZlcnMuICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDE5OTYtMTk5OSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkICAgICAgICAqLworLyogIG1vZGlmaWVkIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAgKi8KKy8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCisvKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLworLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNpZm5kZWYgVFRUWVBFU19ICisjZGVmaW5lIFRUVFlQRVNfSAorCisKKyNpbmNsdWRlIDxmcmVldHlwZS5oPgorCisKKyNpZmRlZiBfX2NwbHVzcGx1cworICBleHRlcm4gIkMiIHsKKyNlbmRpZgorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiovCisgIC8qKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqLworICAvKioqICAgICAgICAgICAgICAgIERFRklOSVRJT05TIE9GIEJBU0lDIERBVEEgVFlQRVMgICAgICAgICAgICAgICAgICAgICoqKi8KKyAgLyoqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiovCisgIC8qKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBUaGUgUkVERUZJTkUoKSBtYWNybyBpcyB1c2VkIHRvIGNvbnZlcnQgYSBGcmVlVHlwZSBnZW5lcmljIHR5cGUgaW50byAgKi8KKyAgLyogYSBUcnVlVHlwZS1zcGVjaWZpYyBvbmUuICBJdCBzaW1wbHkgcmVwbGFjZXMgdGhlIGBGVF8nIHByZWZpeCBieSAgICAgICovCisgIC8qIGBUVF8nIGluIG9yZGVyIHRvIGRlZmluZSBjb21wYXRpYmxlIHR5cGVzIGxpa2UgVFRfTG9uZywgVFRfRXJyb3IsICAgICAqLworICAvKiBUVF9PdXRsaW5lLCBldGMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjdW5kZWYgIFJFREVGSU5FCisjZGVmaW5lIFJFREVGSU5FKCB0eXBlICkgIHR5cGVkZWYgRlRfIyN0eXBlICBUVF8jI3R5cGUKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX0Jvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgdHlwZWRlZiBvZiB1bnNpZ25lZCBjaGFyLCB1c2VkIGZvciBzaW1wbGUgYm9vbGVhbnMuICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgUkVERUZJTkUoIEJvb2wgKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX0ZXb3JkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgc2lnbmVkIDE2LWJpdCBpbnRlZ2VyIHVzZWQgdG8gc3RvcmUgYSBkaXN0YW5jZSBpbiBvcmlnaW5hbCBmb250ICAqLworICAvKiAgICB1bml0cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIFJFREVGSU5FKCBGV29yZCApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfVUZXb3JkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQW4gdW5zaWduZWQgMTYtYml0IGludGVnZXIgdXNlZCB0byBzdG9yZSBhIGRpc3RhbmNlIGluIG9yaWdpbmFsICAgICovCisgIC8qICAgIGZvbnQgdW5pdHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgUkVERUZJTkUoIFVGV29yZCApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfQ2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSBzaW1wbGUgdHlwZWRlZiBmb3IgdGhlIF9zaWduZWRfIGNoYXIgdHlwZS4gICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBSRURFRklORSggQ2hhciApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfQnl0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSBzaW1wbGUgdHlwZWRlZiBmb3IgdGhlIF91bnNpZ25lZF8gY2hhciB0eXBlLiAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBSRURFRklORSggQnl0ZSApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfU3RyaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSBzaW1wbGUgdHlwZWRlZiBmb3IgdGhlIGNoYXIgdHlwZSwgdXN1YWxseSB1c2VkIGZvciBzdHJpbmdzLiAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBSRURFRklORSggU3RyaW5nICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUVF9TaG9ydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBIHR5cGVkZWYgZm9yIHNpZ25lZCBzaG9ydC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIFJFREVGSU5FKCBTaG9ydCApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfVVNob3J0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSB0eXBlZGVmIGZvciB1bnNpZ25lZCBzaG9ydC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBSRURFRklORSggVVNob3J0ICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUVF9JbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBIHR5cGVkZWYgZm9yIHRoZSBpbnQgdHlwZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIFJFREVGSU5FKCBJbnQgKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX1VJbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgdHlwZWRlZiBmb3IgdGhlIHVuc2lnbmVkIGludCB0eXBlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgUkVERUZJTkUoIFVJbnQgKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX0xvbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgdHlwZWRlZiBmb3Igc2lnbmVkIGxvbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgUkVERUZJTkUoIExvbmcgKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX1VMb25nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgdHlwZWRlZiBmb3IgdW5zaWduZWQgbG9uZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgUkVERUZJTkUoIFVMb25nICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUVF9GMkRvdDE0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBIHNpZ25lZCAyLjE0IGZpeGVkIGZsb2F0IHR5cGUgdXNlZCBmb3IgdW5pdCB2ZWN0b3JzLiAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIFJFREVGSU5FKCBGMkRvdDE0ICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUVF9GMjZEb3Q2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBIHNpZ25lZCAyNi42IGZpeGVkIGZsb2F0IHR5cGUgdXNlZCBmb3IgdmVjdG9yaWFsIHBpeGVsICAgICAgICAgICAgKi8KKyAgLyogICAgY29vcmRpbmF0ZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBSRURFRklORSggRjI2RG90NiApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfRml4ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhpcyB0eXBlIGlzIHVzZWQgdG8gc3RvcmUgMTYuMTYgZml4ZWQgZmxvYXQgdmFsdWVzLCBsaWtlIHNjYWxlcyAgICovCisgIC8qICAgIG9yIG1hdHJpeCBjb2VmZmljaWVudHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgUkVERUZJTkUoIEZpeGVkICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUVF9Qb3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGUgdHlwZSBGVF9Qb3MgaXMgYSAzMi1iaXQgaW50ZWdlciB1c2VkIHRvIHN0b3JlIHZlY3RvcmlhbCAgICAgICAgKi8KKyAgLyogICAgY29vcmRpbmF0ZXMuICBEZXBlbmRpbmcgb24gdGhlIGNvbnRleHQsIHRoZXNlIGNhbiByZXByZXNlbnQgICAgICAgICovCisgIC8qICAgIGRpc3RhbmNlcyBpbiBpbnRlZ2VyIGZvbnQgdW5pdHMsIG9yIDI2LjYgZml4ZWQgZmxvYXQgcGl4ZWwgICAgICAgICAqLworICAvKiAgICBjb29yZGluYXRlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIFJFREVGSU5FKCBQb3MgKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX1ZlY3RvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgc2ltcGxlIHN0cnVjdHVyZSB1c2VkIHRvIHN0b3JlIGEgMmQgdmVjdG9yOyBjb29yZGluYXRlcyBhcmUgb2YgICAqLworICAvKiAgICB0aGUgVFRfUG9zIHR5cGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB4IDo6IFRoZSBob3Jpem9udGFsIGNvb3JkaW5hdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgeSA6OiBUaGUgdmVydGljYWwgY29vcmRpbmF0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBSRURFRklORSggVmVjdG9yICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUVF9Vbml0VmVjdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBIHNpbXBsZSBzdHJ1Y3R1cmUgdXNlZCB0byBzdG9yZSBhIDJkIHZlY3RvciB1bml0IHZlY3Rvci4gIFVzZXMgICAgKi8KKyAgLyogICAgVFRfRjJEb3QxNCB0eXBlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgeCA6OiBIb3Jpem9udGFsIGNvb3JkaW5hdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHkgOjogVmVydGljYWwgY29vcmRpbmF0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgUkVERUZJTkUoIFVuaXRWZWN0b3IgKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX01hdHJpeCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgc2ltcGxlIHN0cnVjdHVyZSB1c2VkIHRvIHN0b3JlIGEgMngyIG1hdHJpeC4gIENvZWZmaWNpZW50cyBhcmUgICAqLworICAvKiAgICBpbiAxNi4xNiBmaXhlZCBmbG9hdCBmb3JtYXQuICBUaGUgY29tcHV0YXRpb24gcGVyZm9ybWVkIGlzOiAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICB4JyA9IHgqeHggKyB5Knh5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgeScgPSB4Knl4ICsgeSp5eSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHh4IDo6IE1hdHJpeCBjb2VmZmljaWVudC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB4eSA6OiBNYXRyaXggY29lZmZpY2llbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgeXggOjogTWF0cml4IGNvZWZmaWNpZW50LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHl5IDo6IE1hdHJpeCBjb2VmZmljaWVudC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgUkVERUZJTkUoIE1hdHJpeCApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfQkJveCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSBzdHJ1Y3R1cmUgdXNlZCB0byBob2xkIGFuIG91dGxpbmUncyBib3VuZGluZyBib3gsIGkuZS4sIHRoZSAgICAgICovCisgIC8qICAgIGNvb3JkaW5hdGVzIG9mIGl0cyBleHRyZW1hIGluIHRoZSBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCAgICAgICAgICAqLworICAvKiAgICBkaXJlY3Rpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB4TWluIDo6IFRoZSBob3Jpem9udGFsIG1pbmltdW0gKGxlZnQtbW9zdCkuICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgeU1pbiA6OiBUaGUgdmVydGljYWwgbWluaW11bSAoYm90dG9tLW1vc3QpLiAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHhNYXggOjogVGhlIGhvcml6b250YWwgbWF4aW11bSAocmlnaHQtbW9zdCkuICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB5TWF4IDo6IFRoZSB2ZXJ0aWNhbCBtYXhpbXVtICh0b3AtbW9zdCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIFJFREVGSU5FKCBCQm94ICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUVF9FcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGUgVHJ1ZVR5cGUgZXJyb3IgY29kZSB0eXBlLiAgQSB2YWx1ZSBvZiAwIGlzIGFsd2F5cyBpbnRlcnByZXRlZCAgKi8KKyAgLyogICAgYXMgYSBzdWNjZXNzZnVsIG9wZXJhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBSRURFRklORSggRXJyb3IgKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqLworICAvKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KKyAgLyoqKiAgICAgICAgICAgICBSRVFVSVJFRCBUUlVFVFlQRS9PUEVOVFlQRSBUQUJMRVMgREVGSU5JVElPTlMgICAgICAgICAqKiovCisgIC8qKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqLworICAvKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUQ19IZWFkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRydWVUeXBlIGNvbGxlY3Rpb24gaGVhZGVyLiAgVGhpcyB0YWJsZSBjb250YWlucyB0aGUgb2Zmc2V0cyBvZiAgICAqLworICAvKiAgICB0aGUgZm9udCBoZWFkZXJzIG9mIGVhY2ggZGlzdGluY3QgVHJ1ZVR5cGUgZmFjZSBpbiB0aGUgZmlsZS4gICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB0YWcgICAgIDo6IE11c3QgYmUgYHR0YyAnIHRvIGluZGljYXRlIGEgVHJ1ZVR5cGUgY29sbGVjdGlvbi4gICAgICAgKi8KKyAgLyogICAgdmVyc2lvbiA6OiBUaGUgdmVyc2lvbiBudW1iZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGNvdW50ICAgOjogVGhlIG51bWJlciBvZiBmYWNlcyBpbiB0aGUgY29sbGVjdGlvbi4gIFRoZSAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgIHNwZWNpZmljYXRpb24gc2F5cyB0aGlzIHNob3VsZCBiZSBhbiB1bnNpZ25lZCBsb25nLCBidXQgKi8KKyAgLyogICAgICAgICAgICAgICB3ZSB1c2UgYSBzaWduZWQgbG9uZyBzaW5jZSB3ZSBuZWVkIHRoZSB2YWx1ZSAtMSBmb3IgICAgICovCisgIC8qICAgICAgICAgICAgICAgc3BlY2lmaWMgcHVycG9zZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBvZmZzZXRzIDo6IFRoZSBvZmZzZXRzIG9mIHRoZSBmb250IGhlYWRlcnMsIG9uZSBwZXIgZmFjZS4gICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgc3RydWN0ICBUVENfSGVhZGVyXworICB7CisgICAgVFRfVUxvbmcgICBUYWc7CisgICAgVFRfRml4ZWQgICB2ZXJzaW9uOworICAgIFRUX0xvbmcgICAgRGlyQ291bnQ7CisgICAgVFRfVUxvbmcqICBUYWJsZURpcmVjdG9yeTsKKworICB9IFRUQ19IZWFkZXI7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUVF9UYWJsZURpciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGlzIHN0cnVjdHVyZSBtb2RlbHMgYSBUcnVlVHlwZSB0YWJsZSBkaXJlY3RvcnkuICBJdCBpcyB1c2VkIHRvICAgKi8KKyAgLyogICAgYWNjZXNzIHRoZSB2YXJpb3VzIHRhYmxlcyBvZiB0aGUgZm9udCBmYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgdmVyc2lvbiAgICAgICA6OiBUaGUgdmVyc2lvbiBudW1iZXI7IHN0YXJ0cyB3aXRoIDB4MDAwMTAwMDAuICAgICAgICovCisgIC8qICAgIG51bVRhYmxlcyAgICAgOjogVGhlIG51bWJlciBvZiB0YWJsZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgc2VhcmNoUmFuZ2UgICA6OiBVbnVzZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGVudHJ5U2VsZWN0b3IgOjogVW51c2VkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICByYW5nZVNoaWZ0ICAgIDo6IFVudXNlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGlzIHN0cnVjdHVyZSBpcyBvbmx5IHVzZWQgZHVyaW5nIGZvbnQgb3BlbmluZy4gICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgc3RydWN0ICBUVF9UYWJsZURpcl8KKyAgeworICAgIFRUX0ZpeGVkICAgdmVyc2lvbjsgICAgICAvKiBzaG91bGQgYmUgMHgxMDAwMCAqLworICAgIFRUX1VTaG9ydCAgbnVtVGFibGVzOyAgICAvKiBudW1iZXIgb2YgdGFibGVzICAqLworCisgICAgVFRfVVNob3J0ICBzZWFyY2hSYW5nZTsgICAgLyogVGhlc2UgcGFyYW1ldGVycyBhcmUgb25seSB1c2VkICAqLworICAgIFRUX1VTaG9ydCAgZW50cnlTZWxlY3RvcjsgIC8qIGZvciBhIGRpY2hvdG9teSBzZWFyY2ggaW4gdGhlICAgKi8KKyAgICBUVF9VU2hvcnQgIHJhbmdlU2hpZnQ7ICAgICAvKiBkaXJlY3RvcnkuICBXZSBpZ25vcmUgdGhlbS4gICAgICovCisKKyAgfSBUVF9UYWJsZURpcjsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX1RhYmxlRGlyRW50cnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoaXMgc3RydWN0dXJlIGRlc2NyaWJlcyBhIGdpdmVuIHRhYmxlIG9mIGEgVHJ1ZVR5cGUgZm9udC4gICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRhZyAgICAgIDo6IEEgZm91ci1ieXRlcyB0YWcgZGVzY3JpYmluZyB0aGUgdGFibGUuICAgICAgICAgICAgICAgICAqLworICAvKiAgICBDaGVja1N1bSA6OiBUaGUgdGFibGUgY2hlY2tzdW0uICBUaGlzIHZhbHVlIGNhbiBiZSBpZ25vcmVkLiAgICAgICAgKi8KKyAgLyogICAgT2Zmc2V0ICAgOjogVGhlIG9mZnNldCBvZiB0aGUgdGFibGUgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIFRydWVUeXBlICovCisgIC8qICAgICAgICAgICAgICAgIGZvbnQgaW4gaXRzIHJlc291cmNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBMZW5ndGggICA6OiBUaGUgdGFibGUgbGVuZ3RoIChpbiBieXRlcykuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgc3RydWN0ICBUVF9UYWJsZURpckVudHJ5XworICB7CisgICAgVFRfVUxvbmcgIFRhZzsgICAgICAgIC8qICAgICAgICB0YWJsZSB0eXBlICovCisgICAgVFRfVUxvbmcgIENoZWNrU3VtOyAgIC8qICAgIHRhYmxlIGNoZWNrc3VtICovCisgICAgVFRfVUxvbmcgIE9mZnNldDsgICAgIC8qIHRhYmxlIGZpbGUgb2Zmc2V0ICovCisgICAgVFRfVUxvbmcgIExlbmd0aDsgICAgIC8qICAgICAgdGFibGUgbGVuZ3RoICovCisKKyAgfSBUVF9UYWJsZURpckVudHJ5OworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfSGVhZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSBzdHJ1Y3R1cmUgdXNlZCB0byBtb2RlbCBhIFRydWVUeXBlIGZvbnQgaGVhZGVyIHRhYmxlLiAgQWxsICAgICAgICovCisgIC8qICAgIGZpZWxkcyBmb2xsb3cgdGhlIFRydWVUeXBlIHNwZWNpZmljYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBzdHJ1Y3QgIFRUX0hlYWRlcl8KKyAgeworICAgIFRUX0ZpeGVkICAgVGFibGVfVmVyc2lvbjsKKyAgICBUVF9GaXhlZCAgIEZvbnRfUmV2aXNpb247CisKKyAgICBUVF9Mb25nICAgIENoZWNrU3VtX0FkanVzdDsKKyAgICBUVF9Mb25nICAgIE1hZ2ljX051bWJlcjsKKworICAgIFRUX1VTaG9ydCAgRmxhZ3M7CisgICAgVFRfVVNob3J0ICBVbml0c19QZXJfRU07CisKKyAgICBUVF9Mb25nICAgIENyZWF0ZWQgWzJdOworICAgIFRUX0xvbmcgICAgTW9kaWZpZWRbMl07CisKKyAgICBUVF9GV29yZCAgIHhNaW47CisgICAgVFRfRldvcmQgICB5TWluOworICAgIFRUX0ZXb3JkICAgeE1heDsKKyAgICBUVF9GV29yZCAgIHlNYXg7CisKKyAgICBUVF9VU2hvcnQgIE1hY19TdHlsZTsKKyAgICBUVF9VU2hvcnQgIExvd2VzdF9SZWNfUFBFTTsKKworICAgIFRUX1Nob3J0ICAgRm9udF9EaXJlY3Rpb247CisgICAgVFRfU2hvcnQgICBJbmRleF9Ub19Mb2NfRm9ybWF0OworICAgIFRUX1Nob3J0ICAgR2x5cGhfRGF0YV9Gb3JtYXQ7CisKKyAgfSBUVF9IZWFkZXI7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUVF9Ib3JpSGVhZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBIHN0cnVjdHVyZSB1c2VkIHRvIG1vZGVsIGEgVHJ1ZVR5cGUgaG9yaXpvbnRhbCBoZWFkZXIsIHRoZSBgaGhlYScgKi8KKyAgLyogICAgdGFibGUsIGFzIHdlbGwgYXMgdGhlIGNvcnJlc3BvbmRpbmcgaG9yaXpvbnRhbCBtZXRyaWNzIHRhYmxlLCAgICAgICovCisgIC8qICAgIGkuZS4sIHRoZSBgaG10eCcgdGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFZlcnNpb24gICAgICAgICAgICAgICAgOjogVGhlIHRhYmxlIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQXNjZW5kZXIgICAgICAgICAgICAgICA6OiBUaGUgZm9udCdzIGFzY2VuZGVyLCBpLmUuLCB0aGUgZGlzdGFuY2UgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSB0aGUgYmFzZWxpbmUgdG8gdGhlIHRvcC1tb3N0IG9mIGFsbCAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBoIHBvaW50cyBmb3VuZCBpbiB0aGUgZm9udC4gICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyB2YWx1ZSBpcyBpbnZhbGlkIGluIG1hbnkgZm9udHMsIGFzICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0IGlzIHVzdWFsbHkgc2V0IGJ5IHRoZSBmb250IGRlc2lnbmVyLCAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgb2Z0ZW4gcmVmbGVjdHMgb25seSBhIHBvcnRpb24gb2YgdGhlICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGhzIGZvdW5kIGluIHRoZSBmb250IChtYXliZSBBU0NJSSkuICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZb3Ugc2hvdWxkIHVzZSB0aGUgYHNUeXBvQXNjZW5kZXInIGZpZWxkICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIE9TLzIgdGFibGUgaW5zdGVhZCBpZiB5b3Ugd2FudCAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjb3JyZWN0IG9uZS4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIERlc2NlbmRlciAgICAgICAgICAgICAgOjogVGhlIGZvbnQncyBkZXNjZW5kZXIsIGkuZS4sIHRoZSBkaXN0YW5jZSAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gdGhlIGJhc2VsaW5lIHRvIHRoZSBib3R0b20tbW9zdCBvZiAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGwgZ2x5cGggcG9pbnRzIGZvdW5kIGluIHRoZSBmb250LiAgSXQgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgbmVnYXRpdmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHZhbHVlIGlzIGludmFsaWQgaW4gbWFueSBmb250cywgYXMgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQgaXMgdXN1YWxseSBzZXQgYnkgdGhlIGZvbnQgZGVzaWduZXIsICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBvZnRlbiByZWZsZWN0cyBvbmx5IGEgcG9ydGlvbiBvZiB0aGUgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaHMgZm91bmQgaW4gdGhlIGZvbnQgKG1heWJlIEFTQ0lJKS4gICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlvdSBzaG91bGQgdXNlIHRoZSBgc1R5cG9EZXNjZW5kZXInICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZCBvZiB0aGUgT1MvMiB0YWJsZSBpbnN0ZWFkIGlmIHlvdSAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FudCB0aGUgY29ycmVjdCBvbmUuICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgTGluZV9HYXAgICAgICAgICAgICAgICA6OiBUaGUgZm9udCdzIGxpbmUgZ2FwLCBpLmUuLCB0aGUgZGlzdGFuY2UgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYWRkIHRvIHRoZSBhc2NlbmRlciBhbmQgZGVzY2VuZGVyIHRvICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldCB0aGUgQlRCLCBpLmUuLCB0aGUgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlbGluZS10by1iYXNlbGluZSBkaXN0YW5jZSBmb3IgdGhlICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgYWR2YW5jZV9XaWR0aF9NYXggICAgICA6OiBUaGlzIGZpZWxkIGlzIHRoZSBtYXhpbXVtIG9mIGFsbCBhZHZhbmNlICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGhzIGZvdW5kIGluIHRoZSBmb250LiAgSXQgY2FuIGJlICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWQgdG8gY29tcHV0ZSB0aGUgbWF4aW11bSB3aWR0aCBvZiBhbiAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmJpdHJhcnkgc3RyaW5nIG9mIHRleHQuICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBtaW5fTGVmdF9TaWRlX0JlYXJpbmcgIDo6IFRoZSBtaW5pbXVtIGxlZnQgc2lkZSBiZWFyaW5nIG9mIGFsbCAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaHMgd2l0aGluIHRoZSBmb250LiAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBtaW5fUmlnaHRfU2lkZV9CZWFyaW5nIDo6IFRoZSBtaW5pbXVtIHJpZ2h0IHNpZGUgYmVhcmluZyBvZiBhbGwgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaHMgd2l0aGluIHRoZSBmb250LiAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB4TWF4X0V4dGVudCAgICAgICAgICAgIDo6IFRoZSBtYXhpbXVtIGhvcml6b250YWwgZXh0ZW50IChpLmUuLCB0aGUgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgd2lkdGgnIG9mIGEgZ2x5cGgncyBib3VuZGluZyBib3gpIGZvciAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsIGdseXBocyBpbiB0aGUgZm9udC4gICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgY2FyZXRfU2xvcGVfUmlzZSAgICAgICA6OiBUaGUgcmlzZSBjb2VmZmljaWVudCBvZiB0aGUgY3Vyc29yJ3MgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xvcGUgb2YgdGhlIGN1cnNvciAoc2xvcGU9cmlzZS9ydW4pLiAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgY2FyZXRfU2xvcGVfUnVuICAgICAgICA6OiBUaGUgcnVuIGNvZWZmaWNpZW50IG9mIHRoZSBjdXJzb3IncyAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xvcGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgUmVzZXJ2ZWQgICAgICAgICAgICAgICA6OiAxMCByZXNlcnZlZCBieXRlcy4gICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBtZXRyaWNfRGF0YV9Gb3JtYXQgICAgIDo6IEFsd2F5cyAwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG51bWJlcl9PZl9ITWV0cmljcyAgICAgOjogTnVtYmVyIG9mIEhNZXRyaWNzIGVudHJpZXMgaW4gdGhlIGBobXR4JyAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlIC0tIHRoaXMgdmFsdWUgY2FuIGJlIHNtYWxsZXIgdGhhbiAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgdG90YWwgbnVtYmVyIG9mIGdseXBocyBpbiB0aGUgZm9udC4gICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBsb25nX21ldHJpY3MgICAgICAgICAgIDo6IEEgcG9pbnRlciBpbnRvIHRoZSBgaG10eCcgdGFibGUuICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHNob3J0X21ldHJpY3MgICAgICAgICAgOjogQSBwb2ludGVyIGludG8gdGhlIGBobXR4JyB0YWJsZS4gICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIElNUE9SVEFOVDogVGhlIFRUX0hvcmlIZWFkZXIgYW5kIFRUX1ZlcnRIZWFkZXIgc3RydWN0dXJlcyBzaG91bGQgICAqLworICAvKiAgICAgICAgICAgICAgIGJlIGlkZW50aWNhbCBleGNlcHQgZm9yIHRoZSBuYW1lcyBvZiB0aGVpciBmaWVsZHMgd2hpY2ggKi8KKyAgLyogICAgICAgICAgICAgICBhcmUgZGlmZmVyZW50LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgIFRoaXMgZW5zdXJlcyB0aGF0IGEgc2luZ2xlIGZ1bmN0aW9uIGluIHRoZSBgdHRsb2FkJyAgICAgKi8KKyAgLyogICAgICAgICAgICAgICBtb2R1bGUgaXMgYWJsZSB0byByZWFkIGJvdGggdGhlIGhvcml6b250YWwgYW5kIHZlcnRpY2FsICovCisgIC8qICAgICAgICAgICAgICAgaGVhZGVycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBzdHJ1Y3QgIFRUX0hvcmlIZWFkZXJfCisgIHsKKyAgICBUVF9GaXhlZCAgIFZlcnNpb247CisgICAgVFRfRldvcmQgICBBc2NlbmRlcjsKKyAgICBUVF9GV29yZCAgIERlc2NlbmRlcjsKKyAgICBUVF9GV29yZCAgIExpbmVfR2FwOworCisgICAgVFRfVUZXb3JkICBhZHZhbmNlX1dpZHRoX01heDsgICAgICAvKiBhZHZhbmNlIHdpZHRoIG1heGltdW0gKi8KKworICAgIFRUX0ZXb3JkICAgbWluX0xlZnRfU2lkZV9CZWFyaW5nOyAgLyogbWluaW11bSBsZWZ0LXNiICAgICAgICovCisgICAgVFRfRldvcmQgICBtaW5fUmlnaHRfU2lkZV9CZWFyaW5nOyAvKiBtaW5pbXVtIHJpZ2h0LXNiICAgICAgKi8KKyAgICBUVF9GV29yZCAgIHhNYXhfRXh0ZW50OyAgICAgICAgICAgIC8qIHhtYXggZXh0ZW50cyAgICAgICAgICAqLworICAgIFRUX0ZXb3JkICAgY2FyZXRfU2xvcGVfUmlzZTsKKyAgICBUVF9GV29yZCAgIGNhcmV0X1Nsb3BlX1J1bjsKKyAgICBUVF9GV29yZCAgIGNhcmV0X09mZnNldDsKKworICAgIFRUX1Nob3J0ICAgUmVzZXJ2ZWRbNF07CisKKyAgICBUVF9TaG9ydCAgIG1ldHJpY19EYXRhX0Zvcm1hdDsKKyAgICBUVF9VU2hvcnQgIG51bWJlcl9PZl9ITWV0cmljczsKKworICAgIC8qIFRoZSBmb2xsb3dpbmcgZmllbGRzIGFyZSBub3QgZGVmaW5lZCBieSB0aGUgVHJ1ZVR5cGUgc3BlY2lmaWNhdGlvbiAqLworICAgIC8qIGJ1dCB0aGV5J3JlIHVzZWQgdG8gY29ubmVjdCB0aGUgbWV0cmljcyBoZWFkZXIgdG8gdGhlIHJlbGV2YW50ICAgICAqLworICAgIC8qIGBITVRYJyB0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgICAgdm9pZCogICAgICBsb25nX21ldHJpY3M7CisgICAgdm9pZCogICAgICBzaG9ydF9tZXRyaWNzOworCisgIH0gVFRfSG9yaUhlYWRlcjsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX1ZlcnRIZWFkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgc3RydWN0dXJlIHVzZWQgdG8gbW9kZWwgYSBUcnVlVHlwZSB2ZXJ0aWNhbCBoZWFkZXIsIHRoZSBgdmhlYScgICAqLworICAvKiAgICB0YWJsZSwgYXMgd2VsbCBhcyB0aGUgY29ycmVzcG9uZGluZyB2ZXJ0aWNhbCBtZXRyaWNzIHRhYmxlLCBpLmUuLCAgKi8KKyAgLyogICAgdGhlIGB2bXR4JyB0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVmVyc2lvbiAgICAgICAgICAgICAgICAgOjogVGhlIHRhYmxlIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBc2NlbmRlciAgICAgICAgICAgICAgICA6OiBUaGUgZm9udCdzIGFzY2VuZGVyLCBpLmUuLCB0aGUgZGlzdGFuY2UgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSB0aGUgYmFzZWxpbmUgdG8gdGhlIHRvcC1tb3N0IG9mICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbCBnbHlwaCBwb2ludHMgZm91bmQgaW4gdGhlIGZvbnQuICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyB2YWx1ZSBpcyBpbnZhbGlkIGluIG1hbnkgZm9udHMsIGFzICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0IGlzIHVzdWFsbHkgc2V0IGJ5IHRoZSBmb250IGRlc2lnbmVyLCAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgb2Z0ZW4gcmVmbGVjdHMgb25seSBhIHBvcnRpb24gb2YgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGdseXBocyBmb3VuZCBpbiB0aGUgZm9udCAobWF5YmUgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTQ0lJKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWW91IHNob3VsZCB1c2UgdGhlIGBzVHlwb0FzY2VuZGVyJyAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkIG9mIHRoZSBPUy8yIHRhYmxlIGluc3RlYWQgaWYgeW91ICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YW50IHRoZSBjb3JyZWN0IG9uZS4gICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIERlc2NlbmRlciAgICAgICAgICAgICAgIDo6IFRoZSBmb250J3MgZGVzY2VuZGVyLCBpLmUuLCB0aGUgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXN0YW5jZSBmcm9tIHRoZSBiYXNlbGluZSB0byB0aGUgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm90dG9tLW1vc3Qgb2YgYWxsIGdseXBoIHBvaW50cyBmb3VuZCAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBmb250LiAgSXQgaXMgbmVnYXRpdmUuICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyB2YWx1ZSBpcyBpbnZhbGlkIGluIG1hbnkgZm9udHMsIGFzICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0IGlzIHVzdWFsbHkgc2V0IGJ5IHRoZSBmb250IGRlc2lnbmVyLCAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgb2Z0ZW4gcmVmbGVjdHMgb25seSBhIHBvcnRpb24gb2YgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGdseXBocyBmb3VuZCBpbiB0aGUgZm9udCAobWF5YmUgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTQ0lJKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWW91IHNob3VsZCB1c2UgdGhlIGBzVHlwb0Rlc2NlbmRlcicgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkIG9mIHRoZSBPUy8yIHRhYmxlIGluc3RlYWQgaWYgeW91ICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YW50IHRoZSBjb3JyZWN0IG9uZS4gICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIExpbmVfR2FwICAgICAgICAgICAgICAgIDo6IFRoZSBmb250J3MgbGluZSBnYXAsIGkuZS4sIHRoZSBkaXN0YW5jZSAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBhZGQgdG8gdGhlIGFzY2VuZGVyIGFuZCBkZXNjZW5kZXIgdG8gKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0IHRoZSBCVEIsIGkuZS4sIHRoZSAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VsaW5lLXRvLWJhc2VsaW5lIGRpc3RhbmNlIGZvciB0aGUgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGFkdmFuY2VfSGVpZ2h0X01heCAgICAgIDo6IFRoaXMgZmllbGQgaXMgdGhlIG1heGltdW0gb2YgYWxsICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZHZhbmNlIGhlaWdodHMgZm91bmQgaW4gdGhlIGZvbnQuICBJdCAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuIGJlIHVzZWQgdG8gY29tcHV0ZSB0aGUgbWF4aW11bSAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCBvZiBhbiBhcmJpdHJhcnkgc3RyaW5nIG9mIHRleHQuICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbWluX1RvcF9TaWRlX0JlYXJpbmcgICAgOjogVGhlIG1pbmltdW0gdG9wIHNpZGUgYmVhcmluZyBvZiBhbGwgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBocyB3aXRoaW4gdGhlIGZvbnQuICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbWluX0JvdHRvbV9TaWRlX0JlYXJpbmcgOjogVGhlIG1pbmltdW0gYm90dG9tIHNpZGUgYmVhcmluZyBvZiBhbGwgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBocyB3aXRoaW4gdGhlIGZvbnQuICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgeU1heF9FeHRlbnQgICAgICAgICAgICAgOjogVGhlIG1heGltdW0gdmVydGljYWwgZXh0ZW50IChpLmUuLCB0aGUgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBoZWlnaHQnIG9mIGEgZ2x5cGgncyBib3VuZGluZyBib3gpIGZvciAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGwgZ2x5cGhzIGluIHRoZSBmb250LiAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGNhcmV0X1Nsb3BlX1Jpc2UgICAgICAgIDo6IFRoZSByaXNlIGNvZWZmaWNpZW50IG9mIHRoZSBjdXJzb3IncyAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbG9wZSBvZiB0aGUgY3Vyc29yIChzbG9wZT1yaXNlL3J1bikuICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGNhcmV0X1Nsb3BlX1J1biAgICAgICAgIDo6IFRoZSBydW4gY29lZmZpY2llbnQgb2YgdGhlIGN1cnNvcidzICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbG9wZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFJlc2VydmVkICAgICAgICAgICAgICAgIDo6IDEwIHJlc2VydmVkIGJ5dGVzLiAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbWV0cmljX0RhdGFfRm9ybWF0ICAgICAgOjogQWx3YXlzIDAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBudW1iZXJfT2ZfSE1ldHJpY3MgICAgICA6OiBOdW1iZXIgb2YgVk1ldHJpY3MgZW50cmllcyBpbiB0aGUgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYHZtdHgnIHRhYmxlIC0tIHRoaXMgdmFsdWUgY2FuIGJlICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtYWxsZXIgdGhhbiB0aGUgdG90YWwgbnVtYmVyIG9mIGdseXBocyAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgZm9udC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGxvbmdfbWV0cmljcyAgICAgICAgICAgOjogQSBwb2ludGVyIGludG8gdGhlIGB2bXR4JyB0YWJsZS4gICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgc2hvcnRfbWV0cmljcyAgICAgICAgICA6OiBBIHBvaW50ZXIgaW50byB0aGUgYHZtdHgnIHRhYmxlLiAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgSU1QT1JUQU5UOiBUaGUgVFRfSG9yaUhlYWRlciBhbmQgVFRfVmVydEhlYWRlciBzdHJ1Y3R1cmVzIHNob3VsZCAgICovCisgIC8qICAgICAgICAgICAgICAgYmUgaWRlbnRpY2FsIGV4Y2VwdCBmb3IgdGhlIG5hbWVzIG9mIHRoZWlyIGZpZWxkcyB3aGljaCAqLworICAvKiAgICAgICAgICAgICAgIGFyZSBkaWZmZXJlbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgVGhpcyBlbnN1cmVzIHRoYXQgYSBzaW5nbGUgZnVuY3Rpb24gaW4gdGhlIGB0dGxvYWQnICAgICAqLworICAvKiAgICAgICAgICAgICAgIG1vZHVsZSBpcyBhYmxlIHRvIHJlYWQgYm90aCB0aGUgaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgKi8KKyAgLyogICAgICAgICAgICAgICBoZWFkZXJzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHN0cnVjdCBUVF9WZXJ0SGVhZGVyXworICB7CisgICAgVFRfRml4ZWQgICBWZXJzaW9uOworICAgIFRUX0ZXb3JkICAgQXNjZW5kZXI7CisgICAgVFRfRldvcmQgICBEZXNjZW5kZXI7CisgICAgVFRfRldvcmQgICBMaW5lX0dhcDsKKworICAgIFRUX1VGV29yZCAgYWR2YW5jZV9IZWlnaHRfTWF4OyAgICAgIC8qIGFkdmFuY2UgaGVpZ2h0IG1heGltdW0gKi8KKworICAgIFRUX0ZXb3JkICAgbWluX1RvcF9TaWRlX0JlYXJpbmc7ICAgIC8qIG1pbmltdW0gbGVmdC1zYiBvciB0b3Atc2IgICAgICAgKi8KKyAgICBUVF9GV29yZCAgIG1pbl9Cb3R0b21fU2lkZV9CZWFyaW5nOyAvKiBtaW5pbXVtIHJpZ2h0LXNiIG9yIGJvdHRvbS1zYiAgICovCisgICAgVFRfRldvcmQgICB5TWF4X0V4dGVudDsgICAgICAgICAgICAgLyogeG1heCBvciB5bWF4IGV4dGVudHMgICAgICAgICAgICAqLworICAgIFRUX0ZXb3JkICAgY2FyZXRfU2xvcGVfUmlzZTsKKyAgICBUVF9GV29yZCAgIGNhcmV0X1Nsb3BlX1J1bjsKKyAgICBUVF9GV29yZCAgIGNhcmV0X09mZnNldDsKKworICAgIFRUX1Nob3J0ICAgUmVzZXJ2ZWRbNF07CisKKyAgICBUVF9TaG9ydCAgIG1ldHJpY19EYXRhX0Zvcm1hdDsKKyAgICBUVF9VU2hvcnQgIG51bWJlcl9PZl9WTWV0cmljczsKKworICAgIC8qIFRoZSBmb2xsb3dpbmcgZmllbGRzIGFyZSBub3QgZGVmaW5lZCBieSB0aGUgVHJ1ZVR5cGUgc3BlY2lmaWNhdGlvbiAqLworICAgIC8qIGJ1dCB0aGV5J3JlIHVzZWQgdG8gY29ubmVjdCB0aGUgbWV0cmljcyBoZWFkZXIgdG8gdGhlIHJlbGV2YW50ICAgICAqLworICAgIC8qIGBITVRYJyBvciBgVk1UWCcgdGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgICAgdm9pZCogICAgICBsb25nX21ldHJpY3M7CisgICAgdm9pZCogICAgICBzaG9ydF9tZXRyaWNzOworCisgIH0gVFRfVmVydEhlYWRlcjsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX09TMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgc3RydWN0dXJlIHVzZWQgdG8gbW9kZWwgYSBUcnVlVHlwZSBPUy8yIHRhYmxlLiBUaGlzIGlzIHRoZSBsb25nICAqLworICAvKiAgICB0YWJsZSB2ZXJzaW9uLiAgQWxsIGZpZWxkcyBjb21wbHkgdG8gdGhlIFRydWVUeXBlIHNwZWNpZmljYXRpb24uICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIE5vdGUgdGhhdCB3ZSBub3cgc3VwcG9ydCBvbGQgTWFjIGZvbnRzIHdoaWNoIGRvIG5vdCBpbmNsdWRlIGFuICAgICAqLworICAvKiAgICBPUy8yIHRhYmxlLiAgSW4gdGhpcyBjYXNlLCB0aGUgYHZlcnNpb24nIGZpZWxkIGlzIGFsd2F5cyBzZXQgdG8gICAgKi8KKyAgLyogICAgMHhGRkZGLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHN0cnVjdCAgVFRfT1MyXworICB7CisgICAgVFRfVVNob3J0ICB2ZXJzaW9uOyAgICAgICAgICAgICAgICAvKiAweDAwMDEgLSBtb3JlIG9yIDB4RkZGRiAqLworICAgIFRUX0ZXb3JkICAgeEF2Z0NoYXJXaWR0aDsKKyAgICBUVF9VU2hvcnQgIHVzV2VpZ2h0Q2xhc3M7CisgICAgVFRfVVNob3J0ICB1c1dpZHRoQ2xhc3M7CisgICAgVFRfU2hvcnQgICBmc1R5cGU7CisgICAgVFRfRldvcmQgICB5U3Vic2NyaXB0WFNpemU7CisgICAgVFRfRldvcmQgICB5U3Vic2NyaXB0WVNpemU7CisgICAgVFRfRldvcmQgICB5U3Vic2NyaXB0WE9mZnNldDsKKyAgICBUVF9GV29yZCAgIHlTdWJzY3JpcHRZT2Zmc2V0OworICAgIFRUX0ZXb3JkICAgeVN1cGVyc2NyaXB0WFNpemU7CisgICAgVFRfRldvcmQgICB5U3VwZXJzY3JpcHRZU2l6ZTsKKyAgICBUVF9GV29yZCAgIHlTdXBlcnNjcmlwdFhPZmZzZXQ7CisgICAgVFRfRldvcmQgICB5U3VwZXJzY3JpcHRZT2Zmc2V0OworICAgIFRUX0ZXb3JkICAgeVN0cmlrZW91dFNpemU7CisgICAgVFRfRldvcmQgICB5U3RyaWtlb3V0UG9zaXRpb247CisgICAgVFRfU2hvcnQgICBzRmFtaWx5Q2xhc3M7CisKKyAgICBUVF9CeXRlICAgIHBhbm9zZVsxMF07CisKKyAgICBUVF9VTG9uZyAgIHVsVW5pY29kZVJhbmdlMTsgICAgICAgIC8qIEJpdHMgMC0zMSAgICovCisgICAgVFRfVUxvbmcgICB1bFVuaWNvZGVSYW5nZTI7ICAgICAgICAvKiBCaXRzIDMyLTYzICAqLworICAgIFRUX1VMb25nICAgdWxVbmljb2RlUmFuZ2UzOyAgICAgICAgLyogQml0cyA2NC05NSAgKi8KKyAgICBUVF9VTG9uZyAgIHVsVW5pY29kZVJhbmdlNDsgICAgICAgIC8qIEJpdHMgOTYtMTI3ICovCisKKyAgICBUVF9DaGFyICAgIGFjaFZlbmRJRFs0XTsKKworICAgIFRUX1VTaG9ydCAgZnNTZWxlY3Rpb247CisgICAgVFRfVVNob3J0ICB1c0ZpcnN0Q2hhckluZGV4OworICAgIFRUX1VTaG9ydCAgdXNMYXN0Q2hhckluZGV4OworICAgIFRUX1Nob3J0ICAgc1R5cG9Bc2NlbmRlcjsKKyAgICBUVF9TaG9ydCAgIHNUeXBvRGVzY2VuZGVyOworICAgIFRUX1Nob3J0ICAgc1R5cG9MaW5lR2FwOworICAgIFRUX1VTaG9ydCAgdXNXaW5Bc2NlbnQ7CisgICAgVFRfVVNob3J0ICB1c1dpbkRlc2NlbnQ7CisKKyAgICAvKiBvbmx5IHZlcnNpb24gMSB0YWJsZXM6ICovCisKKyAgICBUVF9VTG9uZyAgIHVsQ29kZVBhZ2VSYW5nZTE7ICAgICAgIC8qIEJpdHMgMC0zMSAgICovCisgICAgVFRfVUxvbmcgICB1bENvZGVQYWdlUmFuZ2UyOyAgICAgICAvKiBCaXRzIDMyLTYzICAqLworCisgIH0gVFRfT1MyOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfUG9zdHNjcmlwdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSBzdHJ1Y3R1cmUgdXNlZCB0byBtb2RlbCBhIFRydWVUeXBlIFBvc3RzY3JpcHQgdGFibGUuICBBbGwgZmllbGRzICovCisgIC8qICAgIGNvbXBseSB0byB0aGUgVHJ1ZVR5cGUgdGFibGUuICBUaGlzIHN0cnVjdHVyZSBkb2VzIG5vdCByZWZlcmVuY2UgICAqLworICAvKiAgICB0aGUgUG9zdHNjcmlwdCBnbHlwaCBuYW1lcywgd2hpY2ggY2FuIGJlIG5ldmVydGhlbGVzcyBhY2Nlc3NlZCAgICAgKi8KKyAgLyogICAgd2l0aCB0aGUgYHR0cG9zdCcgbW9kdWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHN0cnVjdCAgVFRfUG9zdHNjcmlwdF8KKyAgeworICAgIFRUX0ZpeGVkICBGb3JtYXRUeXBlOworICAgIFRUX0ZpeGVkICBpdGFsaWNBbmdsZTsKKyAgICBUVF9GV29yZCAgdW5kZXJsaW5lUG9zaXRpb247CisgICAgVFRfRldvcmQgIHVuZGVybGluZVRoaWNrbmVzczsKKyAgICBUVF9VTG9uZyAgaXNGaXhlZFBpdGNoOworICAgIFRUX1VMb25nICBtaW5NZW1UeXBlNDI7CisgICAgVFRfVUxvbmcgIG1heE1lbVR5cGU0MjsKKyAgICBUVF9VTG9uZyAgbWluTWVtVHlwZTE7CisgICAgVFRfVUxvbmcgIG1heE1lbVR5cGUxOworCisgICAgLyogR2x5cGggbmFtZXMgZm9sbG93IGluIHRoZSBmaWxlLCBidXQgd2UgZG9uJ3QgICAqLworICAgIC8qIGxvYWQgdGhlbSBieSBkZWZhdWx0LiAgU2VlIHRoZSB0dHBvc3QuYyBmaWxlLiAgKi8KKworICB9IFRUX1Bvc3RzY3JpcHQ7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUVF9DTWFwRGlyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGlzIHN0cnVjdHVyZSBkZXNjcmliZXMgdGhlIGRpcmVjdG9yeSBvZiB0aGUgYGNtYXAnIHRhYmxlLCAgICAgICAgKi8KKyAgLyogICAgY29udGFpbmluZyB0aGUgZm9udCdzIGNoYXJhY3RlciBtYXBwaW5ncyB0YWJsZS4gICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgdGFibGVWZXJzaW9uTnVtYmVyIDo6IFRoZSB2ZXJzaW9uIG51bWJlci4gICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG51bUNNYXBzICAgICAgICAgICA6OiBUaGUgbnVtYmVyIG9mIGNoYXJtYXBzIGluIHRoZSBmb250LiAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoaXMgc3RydWN0dXJlIGlzIG9ubHkgdXNlZCBkdXJpbmcgZm9udCBsb2FkaW5nLiAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBzdHJ1Y3QgIFRUX0NNYXBEaXJfCisgIHsKKyAgICBUVF9VU2hvcnQgIHRhYmxlVmVyc2lvbk51bWJlcjsKKyAgICBUVF9VU2hvcnQgIG51bUNNYXBzOworCisgIH0gVFRfQ01hcERpcjsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX0NNYXBEaXJFbnRyeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoaXMgc3RydWN0dXJlIGRlc2NyaWJlcyBhIGNoYXJtYXAgaW4gYSBUcnVlVHlwZSBmb250LiAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHBsYXRmb3JtSUQgOjogQW4gSUQgdXNlZCB0byBzcGVjaWZ5IGZvciB3aGljaCBwbGF0Zm9ybSB0aGlzICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgIGNoYXJtYXAgaXMgZGVmaW5lZCAoRnJlZVR5cGUgbWFuYWdlcyBhbGwgcGxhdGZvcm1zKS4gKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGVuY29kaW5nSUQgOjogQSBwbGF0Zm9ybS1zcGVjaWZpYyBJRCB1c2VkIHRvIGluZGljYXRlIHdoaWNoIHNvdXJjZSAqLworICAvKiAgICAgICAgICAgICAgICAgIGVuY29kaW5nIGlzIHVzZWQgaW4gdGhpcyBjaGFybWFwLiAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG9mZnNldCA6OiAgICAgVGhlIG9mZnNldCBvZiB0aGUgY2hhcm1hcCByZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgICAqLworICAvKiAgICAgICAgICAgICAgICAgIHRoZSBgY21hcCcgdGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGlzIHN0cnVjdHVyZSBpcyBvbmx5IHVzZWQgZHVyaW5nIGZvbnQgbG9hZGluZy4gICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgc3RydWN0ICBUVF9DTWFwRGlyRW50cnlfCisgIHsKKyAgICBUVF9VU2hvcnQgIHBsYXRmb3JtSUQ7CisgICAgVFRfVVNob3J0ICBwbGF0Zm9ybUVuY29kaW5nSUQ7CisgICAgVFRfTG9uZyAgICBvZmZzZXQ7CisKKyAgfSBUVF9DTWFwRGlyRW50cnk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUVF9NYXhQcm9maWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGUgbWF4aW11bSBwcm9maWxlIGlzIGEgdGFibGUgY29udGFpbmluZyBtYW55IG1heCB2YWx1ZXMgd2hpY2ggICAgKi8KKyAgLyogICAgY2FuIGJlIHVzZWQgdG8gcHJlLWFsbG9jYXRlIGFycmF5cy4gIFRoaXMgZW5zdXJlcyB0aGF0IG5vIG1lbW9yeSAgICovCisgIC8qICAgIGFsbG9jYXRpb24gb2NjdXJzIGR1cmluZyBhIGdseXBoIGxvYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHZlcnNpb24gICAgICAgICAgICAgICA6OiBUaGUgdmVyc2lvbiBudW1iZXIuICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbnVtR2x5cGhzICAgICAgICAgICAgIDo6IFRoZSBudW1iZXIgb2YgZ2x5cGhzIGluIHRoaXMgVHJ1ZVR5cGUgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbWF4UG9pbnRzICAgICAgICAgICAgIDo6IFRoZSBtYXhpbXVtIG51bWJlciBvZiBwb2ludHMgaW4gYSAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub24tY29tcG9zaXRlIFRydWVUeXBlIGdseXBoLiAgU2VlIGFsc28gICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHN0cnVjdHVyZSBlbGVtZW50ICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBtYXhDb21wb3NpdGVQb2ludHMnLiAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBtYXhDb250b3VycyAgICAgICAgICAgOjogVGhlIG1heGltdW0gbnVtYmVyIG9mIGNvbnRvdXJzIGluIGEgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbi1jb21wb3NpdGUgVHJ1ZVR5cGUgZ2x5cGguICBTZWUgYWxzbyAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgc3RydWN0dXJlIGVsZW1lbnQgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYG1heENvbXBvc2l0ZUNvbnRvdXJzJy4gICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG1heENvbXBvc2l0ZVBvaW50cyAgICA6OiBUaGUgbWF4aW11bSBudW1iZXIgb2YgcG9pbnRzIGluIGEgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9zaXRlIFRydWVUeXBlIGdseXBoLiAgU2VlIGFsc28gdGhlICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdHVyZSBlbGVtZW50IGBtYXhQb2ludHMnLiAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBtYXhDb21wb3NpdGVDb250b3VycyAgOjogVGhlIG1heGltdW0gbnVtYmVyIG9mIGNvbnRvdXJzIGluIGEgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvc2l0ZSBUcnVlVHlwZSBnbHlwaC4gIFNlZSBhbHNvIHRoZSAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3R1cmUgZWxlbWVudCBgbWF4Q29udG91cnMnLiAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbWF4Wm9uZXMgICAgICAgICAgICAgIDo6IFRoZSBtYXhpbXVtIG51bWJlciBvZiB6b25lcyB1c2VkIGZvciAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaCBoaW50aW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbWF4VHdpbGlnaHRQb2ludHMgICAgIDo6IFRoZSBtYXhpbXVtIG51bWJlciBvZiBwb2ludHMgaW4gdGhlICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0d2lsaWdodCB6b25lIHVzZWQgZm9yIGdseXBoIGhpbnRpbmcuICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbWF4U3RvcmFnZSAgICAgICAgICAgIDo6IFRoZSBtYXhpbXVtIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yYWdlIGFyZWEgdXNlZCBmb3IgZ2x5cGggaGludGluZy4gICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbWF4RnVuY3Rpb25EZWZzICAgICAgIDo6IFRoZSBtYXhpbXVtIG51bWJlciBvZiBmdW5jdGlvbiAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZpbml0aW9ucyBpbiB0aGUgVHJ1ZVR5cGUgYnl0ZWNvZGUgZm9yICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBmb250LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG1heEluc3RydWN0aW9uRGVmcyAgICA6OiBUaGUgbWF4aW11bSBudW1iZXIgb2YgaW5zdHJ1Y3Rpb24gICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbnMgaW4gdGhlIFRydWVUeXBlIGJ5dGVjb2RlIGZvciAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgZm9udC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBtYXhTdGFja0VsZW1lbnRzICAgICAgOjogVGhlIG1heGltdW0gbnVtYmVyIG9mIHN0YWNrIGVsZW1lbnRzIHVzZWQgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmluZyBieXRlY29kZSBpbnRlcnByZXRhdGlvbi4gICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBtYXhTaXplT2ZJbnN0cnVjdGlvbnMgOjogVGhlIG1heGltdW0gbnVtYmVyIG9mIFRydWVUeXBlIG9wY29kZXMgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWQgZm9yIGdseXBoIGhpbnRpbmcuICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBtYXhDb21wb25lbnRFbGVtZW50cyAgOjogQW4gb2JzY3VyZSB2YWx1ZSByZWxhdGVkIHRvIGNvbXBvc2l0ZSAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBocyBkZWZpbml0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBtYXhDb21wb25lbnREZXB0aCAgICAgOjogQW4gb2JzY3VyZSB2YWx1ZSByZWxhdGVkIHRvIGNvbXBvc2l0ZSAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBocyBkZWZpbml0aW9ucy4gIFByb2JhYmx5IHRoZSBtYXhpbXVtICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1iZXIgb2Ygc2ltcGxlIGdseXBocyBpbiBhIGNvbXBvc2l0ZS4gICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoaXMgc3RydWN0dXJlIGlzIG9ubHkgdXNlZCBkdXJpbmcgZm9udCBsb2FkaW5nLiAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBzdHJ1Y3QgIFRUX01heFByb2ZpbGVfCisgIHsKKyAgICBUVF9GaXhlZCAgIHZlcnNpb247CisgICAgVFRfVVNob3J0ICBudW1HbHlwaHM7CisgICAgVFRfVVNob3J0ICBtYXhQb2ludHM7CisgICAgVFRfVVNob3J0ICBtYXhDb250b3VyczsKKyAgICBUVF9VU2hvcnQgIG1heENvbXBvc2l0ZVBvaW50czsKKyAgICBUVF9VU2hvcnQgIG1heENvbXBvc2l0ZUNvbnRvdXJzOworICAgIFRUX1VTaG9ydCAgbWF4Wm9uZXM7CisgICAgVFRfVVNob3J0ICBtYXhUd2lsaWdodFBvaW50czsKKyAgICBUVF9VU2hvcnQgIG1heFN0b3JhZ2U7CisgICAgVFRfVVNob3J0ICBtYXhGdW5jdGlvbkRlZnM7CisgICAgVFRfVVNob3J0ICBtYXhJbnN0cnVjdGlvbkRlZnM7CisgICAgVFRfVVNob3J0ICBtYXhTdGFja0VsZW1lbnRzOworICAgIFRUX1VTaG9ydCAgbWF4U2l6ZU9mSW5zdHJ1Y3Rpb25zOworICAgIFRUX1VTaG9ydCAgbWF4Q29tcG9uZW50RWxlbWVudHM7CisgICAgVFRfVVNob3J0ICBtYXhDb21wb25lbnREZXB0aDsKKworICB9IFRUX01heFByb2ZpbGU7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUVF9Mb25nTWV0cmljcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBIHN0cnVjdHVyZSBtb2RlbGluZyB0aGUgbG9uZyBtZXRyaWNzIG9mIHRoZSBgaG10eCcgYW5kIGB2bXR4JyAgICAgKi8KKyAgLyogICAgVHJ1ZVR5cGUgdGFibGVzLiAgVGhlIHZhbHVlcyBhcmUgZXhwcmVzc2VkIGluIGZvbnQgdW5pdHMuICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgYWR2YW5jZSA6OiBUaGUgYWR2YW5jZSB3aWR0aCBvciBoZWlnaHQgZm9yIHRoZSBnbHlwaC4gICAgICAgICAgICAgICovCisgIC8qICAgIGJlYXJpbmcgOjogVGhlIGxlZnQtc2lkZSBvciB0b3Atc2lkZSBiZWFyaW5nIGZvciB0aGUgZ2x5cGguICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBzdHJ1Y3QgIFRUX0xvbmdNZXRyaWNzXworICB7CisgICAgVFRfVVNob3J0ICBhZHZhbmNlOworICAgIFRUX1Nob3J0ICAgYmVhcmluZzsKKworICB9IFRUX0xvbmdNZXRyaWNzOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8VHlwZT4gVFRfU2hvcnRNZXRyaWNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBIHNpbXBsZSB0eXBlIHRvIG1vZGVsIHRoZSBzaG9ydCBtZXRyaWNzIG9mIHRoZSBgaG10eCcgYW5kIGB2bXR4JyAgKi8KKyAgLyogICAgdGFibGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIFRUX1Nob3J0ICBUVF9TaG9ydE1ldHJpY3M7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUVF9OYW1lUmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBIHN0cnVjdHVyZSBtb2RlbGluZyBUcnVlVHlwZSBuYW1lIHJlY29yZHMuICBOYW1lIHJlY29yZHMgYXJlIHVzZWQgKi8KKyAgLyogICAgdG8gc3RvcmUgaW1wb3J0YW50IHN0cmluZ3MgbGlrZSBmYW1pbHkgbmFtZSwgc3R5bGUgbmFtZSwgICAgICAgICAgICovCisgIC8qICAgIGNvcHlyaWdodCwgZXRjLiBpbiBfbG9jYWxpemVkXyB2ZXJzaW9ucyAoaS5lLiwgbGFuZ3VhZ2UsIGVuY29kaW5nLCAqLworICAvKiAgICBldGMpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBwbGF0Zm9ybUlEICAgOjogVGhlIElEIG9mIHRoZSBuYW1lJ3MgZW5jb2RpbmcgcGxhdGZvcm0uICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGVuY29kaW5nSUQgICA6OiBUaGUgcGxhdGZvcm0tc3BlY2lmaWMgSUQgZm9yIHRoZSBuYW1lJ3MgZW5jb2RpbmcuICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbGFuZ3VhZ2VJRCAgIDo6IFRoZSBwbGF0Zm9ybS1zcGVjaWZpYyBJRCBmb3IgdGhlIG5hbWUncyBsYW5ndWFnZS4gICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBuYW1lSUQgICAgICAgOjogVGhlIElEIHNwZWNpZnlpbmcgd2hhdCBraW5kIG9mIG5hbWUgdGhpcyBpcy4gICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHN0cmluZ0xlbmd0aCA6OiBUaGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgaW4gYnl0ZXMuICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgc3RyaW5nT2Zmc2V0IDo6IFRoZSBvZmZzZXQgdG8gdGhlIHN0cmluZyBpbiB0aGUgYG5hbWUnIHRhYmxlLiAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzdHJpbmcgICAgICAgOjogQSBwb2ludGVyIHRvIHRoZSBzdHJpbmcncyBieXRlcy4gIE5vdGUgdGhhdCB0aGVzZSAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgIGFyZSB1c3VhbGx5IFVURi0xNiBlbmNvZGVkIGNoYXJhY3RlcnMuICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHN0cnVjdCAgVFRfTmFtZVJlY18KKyAgeworICAgIFRUX1VTaG9ydCAgcGxhdGZvcm1JRDsKKyAgICBUVF9VU2hvcnQgIGVuY29kaW5nSUQ7CisgICAgVFRfVVNob3J0ICBsYW5ndWFnZUlEOworICAgIFRUX1VTaG9ydCAgbmFtZUlEOworICAgIFRUX1VTaG9ydCAgc3RyaW5nTGVuZ3RoOworICAgIFRUX1VTaG9ydCAgc3RyaW5nT2Zmc2V0OworCisgICAgLyogdGhpcyBsYXN0IGZpZWxkIGlzIG5vdCBkZWZpbmVkIGluIHRoZSBzcGVjICovCisgICAgLyogYnV0IHVzZWQgYnkgdGhlIEZyZWVUeXBlIGVuZ2luZSAgICAgICAgICAgICovCisKKyAgICBUVF9CeXRlKiAgIHN0cmluZzsKKworICB9IFRUX05hbWVSZWM7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUVF9OYW1lVGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBIHN0cnVjdHVyZSBtb2RlbGluZyB0aGUgVHJ1ZVR5cGUgbmFtZSB0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBmb3JtYXQgICAgICAgICA6OiBUaGUgZm9ybWF0IG9mIHRoZSBuYW1lIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG51bU5hbWVSZWNvcmRzIDo6IFRoZSBudW1iZXIgb2YgbmFtZXMgaW4gdGFibGUuICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgc3RvcmFnZU9mZnNldCAgOjogVGhlIG9mZnNldCBvZiB0aGUgbmFtZSB0YWJsZSBpbiB0aGUgYG5hbWUnICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgIFRydWVUeXBlIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbmFtZXMgICAgICAgICAgOjogQW4gYXJyYXkgb2YgbmFtZSByZWNvcmRzLiAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzdG9yYWdlICAgICAgICA6OiBUaGUgbmFtZXMgc3RvcmFnZSBhcmVhLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgc3RydWN0ICBUVF9OYW1lVGFibGVfCisgIHsKKyAgICBUVF9VU2hvcnQgICAgZm9ybWF0OworICAgIFRUX1VTaG9ydCAgICBudW1OYW1lUmVjb3JkczsKKyAgICBUVF9VU2hvcnQgICAgc3RvcmFnZU9mZnNldDsKKyAgICBUVF9OYW1lUmVjKiAgbmFtZXM7CisgICAgVFRfQnl0ZSogICAgIHN0b3JhZ2U7CisKKyAgfSBUVF9OYW1lVGFibGU7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KKyAgLyoqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiovCisgIC8qKiogICAgICAgICAgICAgT1BUSU9OQUwgVFJVRVRZUEUvT1BFTlRZUEUgVEFCTEVTIERFRklOSVRJT05TICAgICAgICAgKioqLworICAvKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KKyAgLyoqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUVF9HYXNwUmFuZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBIHRpbnkgc3RydWN0dXJlIHVzZWQgdG8gbW9kZWwgYSBnYXNwIHJhbmdlIGFjY29yZGluZyB0byB0aGUgICAgICAgKi8KKyAgLyogICAgVHJ1ZVR5cGUgc3BlY2lmaWNhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbWF4UFBFTSAgOjogVGhlIG1heGltdW0gcHBlbSB2YWx1ZSB0byB3aGljaCBgZ2FzcEZsYWcnIGFwcGxpZXMuICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBnYXNwRmxhZyA6OiBBIGZsYWcgZGVzY3JpYmluZyB0aGUgZ3JpZC1maXR0aW5nIGFuZCBhbnRpLWFsaWFzaW5nICAgKi8KKyAgLyogICAgICAgICAgICAgICAgbW9kZXMgdG8gYmUgdXNlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHN0cnVjdCAgVFRfR2FzcFJhbmdlXworICB7CisgICAgVFRfVVNob3J0ICBtYXhQUEVNOworICAgIFRUX1VTaG9ydCAgZ2FzcEZsYWc7CisKKyAgfSBUVF9HYXNwUmFuZ2U7CisKKworI2RlZmluZSBUVF9HQVNQX0dSSURGSVQgIDB4MDEKKyNkZWZpbmUgVFRfR0FTUF9ET0dSQVkgICAweDAyCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUVF9HYXNwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBIHN0cnVjdHVyZSBtb2RlbGluZyB0aGUgVHJ1ZVR5cGUgYGdhc3AnIHRhYmxlIHVzZWQgdG8gc3BlY2lmeSAgICAgKi8KKyAgLyogICAgZ3JpZC1maXR0aW5nIGFuZCBhbnRpLWFsaWFzaW5nIGJlaGF2aW91ci4gICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgdmVyc2lvbiAgICA6OiBUaGUgdmVyc2lvbiBudW1iZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG51bVJhbmdlcyAgOjogVGhlIG51bWJlciBvZiBnYXNwIHJhbmdlcyBpbiB0YWJsZS4gICAgICAgICAgICAgICAgICAqLworICAvKiAgICBnYXNwUmFuZ2VzIDo6IEFuIGFycmF5IG9mIGdhc3AgcmFuZ2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgc3RydWN0ICBUVF9HYXNwXworICB7CisgICAgVFRfVVNob3J0ICAgICAgdmVyc2lvbjsKKyAgICBUVF9VU2hvcnQgICAgICBudW1SYW5nZXM7CisgICAgVFRfR2FzcFJhbmdlKiAgZ2FzcFJhbmdlczsKKworICB9IFRUX0dhc3A7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUVF9IZG14UmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBIHNtYWxsIHN0cnVjdHVyZSB1c2VkIHRvIG1vZGVsIHRoZSBwcmUtY29tcHV0ZWQgd2lkdGhzIG9mIGEgZ2l2ZW4gKi8KKyAgLyogICAgc2l6ZS4gIFRoZXkncmUgZm91bmQgaW4gdGhlIGBoZG14JyB0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgcHBlbSAgICAgIDo6IFRoZSBwaXhlbHMgcGVyIEVNIHZhbHVlIGF0IHdoaWNoIHRoZXNlIG1ldHJpY3MgYXBwbHkuICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBtYXhfd2lkdGggOjogVGhlIG1heGltdW0gYWR2YW5jZSB3aWR0aCBmb3IgdGhpcyBtZXRyaWMuICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHdpZHRocyAgICA6OiBBbiBhcnJheSBvZiB3aWR0aHMuICBOb3RlOiBUaGVzZSBhcmUgOC1iaXQgYnl0ZXMuICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBzdHJ1Y3QgIFRUX0hkbXhSZWNfCisgIHsKKyAgICBUVF9CeXRlICAgcHBlbTsKKyAgICBUVF9CeXRlICAgbWF4X3dpZHRoOworICAgIFRUX0J5dGUqICB3aWR0aHM7CisKKyAgfSBUVF9IZG14UmVjOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfSGRteFJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSBzdHJ1Y3R1cmUgdXNlZCB0byBtb2RlbCB0aGUgYGhkbXgnIHRhYmxlLCB3aGljaCBjb250YWlucyAgICAgICAgICovCisgIC8qICAgIHByZS1jb21wdXRlZCB3aWR0aHMgZm9yIGEgc2V0IG9mIGdpdmVuIHNpemVzL2RpbWVuc2lvbnMuICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHZlcnNpb24gICAgIDo6IFRoZSB2ZXJzaW9uIG51bWJlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBudW1fcmVjb3JkcyA6OiBUaGUgbnVtYmVyIG9mIGhkbXggcmVjb3Jkcy4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgcmVjb3JkcyAgICAgOjogQW4gYXJyYXkgb2YgaGRteCByZWNvcmRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHN0cnVjdCAgVFRfSGRteF8KKyAgeworICAgIFRUX1VTaG9ydCAgICB2ZXJzaW9uOworICAgIFRUX1Nob3J0ICAgICBudW1fcmVjb3JkczsKKyAgICBUVF9IZG14UmVjKiAgcmVjb3JkczsKKworICB9IFRUX0hkbXg7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUVF9LZXJuXzBfUGFpciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBIHN0cnVjdHVyZSB1c2VkIHRvIG1vZGVsIGEga2VybmluZyBwYWlyIGZvciB0aGUga2VybmluZyB0YWJsZSAgICAgKi8KKyAgLyogICAgZm9ybWF0IDAuICBUaGUgZW5naW5lIG5vdyBsb2FkcyB0aGlzIHRhYmxlIGlmIGl0IGZpbmRzIG9uZSBpbiB0aGUgICovCisgIC8qICAgIGZvbnQgZmlsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGxlZnQgIDo6IFRoZSBpbmRleCBvZiB0aGUgbGVmdCBnbHlwaCBpbiBwYWlyLiAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICByaWdodCA6OiBUaGUgaW5kZXggb2YgdGhlIHJpZ2h0IGdseXBoIGluIHBhaXIuICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgdmFsdWUgOjogVGhlIGtlcm5pbmcgZGlzdGFuY2UuICBBIHBvc2l0aXZlIHZhbHVlIHNwYWNlcyB0aGUgICAgICAgICovCisgIC8qICAgICAgICAgICAgIGdseXBocywgYSBuZWdhdGl2ZSBvbmUgbWFrZXMgdGhlbSBjbG9zZXIuICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBzdHJ1Y3QgIFRUX0tlcm5fMF9QYWlyXworICB7CisgICAgVFRfVVNob3J0ICBsZWZ0OyAgIC8qIGluZGV4IG9mIGxlZnQgIGdseXBoIGluIHBhaXIgKi8KKyAgICBUVF9VU2hvcnQgIHJpZ2h0OyAgLyogaW5kZXggb2YgcmlnaHQgZ2x5cGggaW4gcGFpciAqLworICAgIFRUX0ZXb3JkICAgdmFsdWU7ICAvKiBrZXJuaW5nIHZhbHVlICAgICAgICAgICAgICAgICovCisKKyAgfSBUVF9LZXJuXzBfUGFpcjsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX1NCaXRfTWV0cmljcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgc3RydWN0dXJlIHVzZWQgdG8gaG9sZCB0aGUgYmlnIG1ldHJpY3Mgb2YgYSBnaXZlbiBnbHlwaCBiaXRtYXAgICAqLworICAvKiAgICBpbiBhIFRydWVUeXBlIG9yIE9wZW5UeXBlIGZvbnQuICBUaGVzZSBhcmUgdXN1YWxseSBmb3VuZCBpbiB0aGUgICAgKi8KKyAgLyogICAgYEVCRFQnIChNaWNyb3NvZnQpIG9yIGBiZGF0JyAoQXBwbGUpIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgaGVpZ2h0ICAgICAgIDo6IFRoZSBnbHlwaCBoZWlnaHQgaW4gcGl4ZWxzLiAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB3aWR0aCAgICAgICAgOjogVGhlIGdseXBoIHdpZHRoIGluIHBpeGVscy4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGhvcmlCZWFyaW5nWCA6OiBUaGUgaG9yaXpvbnRhbCBsZWZ0IGJlYXJpbmcuICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgaG9yaUJlYXJpbmdZIDo6IFRoZSBob3Jpem9udGFsIHRvcCBiZWFyaW5nLiAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBob3JpQWR2YW5jZSAgOjogVGhlIGhvcml6b250YWwgYWR2YW5jZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHZlcnRCZWFyaW5nWCA6OiBUaGUgdmVydGljYWwgbGVmdCBiZWFyaW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgdmVydEJlYXJpbmdZIDo6IFRoZSB2ZXJ0aWNhbCB0b3AgYmVhcmluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB2ZXJ0QWR2YW5jZSAgOjogVGhlIHZlcnRpY2FsIGFkdmFuY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgc3RydWN0ICBUVF9TQml0X01ldHJpY3NfCisgIHsKKyAgICBUVF9CeXRlICBoZWlnaHQ7CisgICAgVFRfQnl0ZSAgd2lkdGg7CisKKyAgICBUVF9DaGFyICBob3JpQmVhcmluZ1g7CisgICAgVFRfQ2hhciAgaG9yaUJlYXJpbmdZOworICAgIFRUX0J5dGUgIGhvcmlBZHZhbmNlOworCisgICAgVFRfQ2hhciAgdmVydEJlYXJpbmdYOworICAgIFRUX0NoYXIgIHZlcnRCZWFyaW5nWTsKKyAgICBUVF9CeXRlICB2ZXJ0QWR2YW5jZTsKKworICB9IFRUX1NCaXRfTWV0cmljczsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX1NCaXRfU21hbGxfTWV0cmljcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgc3RydWN0dXJlIHVzZWQgdG8gaG9sZCB0aGUgc21hbGwgbWV0cmljcyBvZiBhIGdpdmVuIGdseXBoIGJpdG1hcCAqLworICAvKiAgICBpbiBhIFRydWVUeXBlIG9yIE9wZW5UeXBlIGZvbnQuICBUaGVzZSBhcmUgdXN1YWxseSBmb3VuZCBpbiB0aGUgICAgKi8KKyAgLyogICAgYEVCRFQnIChNaWNyb3NvZnQpIG9yIHRoZSBgYmRhdCcgKEFwcGxlKSB0YWJsZS4gICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgaGVpZ2h0ICAgIDo6IFRoZSBnbHlwaCBoZWlnaHQgaW4gcGl4ZWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB3aWR0aCAgICAgOjogVGhlIGdseXBoIHdpZHRoIGluIHBpeGVscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGJlYXJpbmdYICA6OiBUaGUgbGVmdC1zaWRlIGJlYXJpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgYmVhcmluZ1kgIDo6IFRoZSB0b3Atc2lkZSBiZWFyaW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBhZHZhbmNlICAgOjogVGhlIGFkdmFuY2Ugd2lkdGggb3IgaGVpZ2h0LiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgc3RydWN0ICBUVF9TQml0X1NtYWxsX01ldHJpY3NfCisgIHsKKyAgICBUVF9CeXRlICBoZWlnaHQ7CisgICAgVFRfQnl0ZSAgd2lkdGg7CisKKyAgICBUVF9DaGFyICBiZWFyaW5nWDsKKyAgICBUVF9DaGFyICBiZWFyaW5nWTsKKyAgICBUVF9CeXRlICBhZHZhbmNlOworCisgIH0gVFRfU0JpdF9TbWFsbF9NZXRyaWNzOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfU0JpdF9MaW5lX01ldHJpY3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSBzdHJ1Y3R1cmUgdXNlZCB0byBkZXNjcmliZSB0aGUgdGV4dCBsaW5lIG1ldHJpY3Mgb2YgYSBnaXZlbiAgICAgICovCisgIC8qICAgIGJpdG1hcCBzdHJpa2UsIGZvciBlaXRoZXIgYSBob3Jpem9udGFsIG9yIHZlcnRpY2FsIGxheW91dC4gICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGFzY2VuZGVyICAgICAgICAgICAgICAgIDo6IFRoZSBhc2NlbmRlciBpbiBwaXhlbHMuICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZGVzY2VuZGVyICAgICAgICAgICAgICAgOjogVGhlIGRlc2NlbmRlciBpbiBwaXhlbHMuICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBtYXhfd2lkdGggICAgICAgICAgICAgICA6OiBUaGUgbWF4aW11bSBnbHlwaCB3aWR0aCBpbiBwaXhlbHMuICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGNhcmV0X3Nsb3BlX2VudW1lcmF0b3IgIDo6IFJpc2Ugb2YgdGhlIGNhcmV0IHNsb3BlLCB0eXBpY2FsbHkgc2V0ICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byAxIGZvciBub24taXRhbGljIGZvbnRzLiAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGNhcmV0X3Nsb3BlX2Rlbm9taW5hdG9yIDo6IFJpc2Ugb2YgdGhlIGNhcmV0IHNsb3BlLCB0eXBpY2FsbHkgc2V0ICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byAwIGZvciBub24taXRhbGljIGZvbnRzLiAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGNhcmV0X29mZnNldCAgICAgICAgICAgIDo6IE9mZnNldCBpbiBwaXhlbHMgdG8gbW92ZSB0aGUgY2FyZXQgZm9yICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXIgcG9zaXRpb25pbmcuICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG1pbl9vcmlnaW5fU0IgICAgICAgICAgIDo6IE1pbmltdW0gb2YgaG9yaUJlYXJpbmdYIChyZXNwLiAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0QmVhcmluZ1kpLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbWluX2FkdmFuY2VfU0IgICAgICAgICAgOjogTWluaW11bSBvZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvcml6b250YWwgYWR2YW5jZSAtICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggaG9yaUJlYXJpbmdYICsgd2lkdGggKSAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVydGljYWwgYWR2YW5jZSAtICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCB2ZXJ0QmVhcmluZ1kgKyBoZWlnaHQgKSAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG1heF9iZWZvcmVfQkwgICAgICAgICAgIDo6IE1heGltdW0gb2YgaG9yaUJlYXJpbmdZIChyZXNwLiAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0QmVhcmluZ1kpLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG1pbl9hZnRlcl9CTCAgICAgICAgICAgIDo6IE1pbmltdW0gb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3JpQmVhcmluZ1kgLSBoZWlnaHQgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVydEJlYXJpbmdYIC0gd2lkdGggICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBzdHJ1Y3QgIFRUX1NCaXRfTGluZV9NZXRyaWNzXworICB7CisgICAgVFRfQ2hhciAgYXNjZW5kZXI7CisgICAgVFRfQ2hhciAgZGVzY2VuZGVyOworICAgIFRUX0J5dGUgIG1heF93aWR0aDsKKyAgICBUVF9DaGFyICBjYXJldF9zbG9wZV9udW1lcmF0b3I7CisgICAgVFRfQ2hhciAgY2FyZXRfc2xvcGVfZGVub21pbmF0b3I7CisgICAgVFRfQ2hhciAgY2FyZXRfb2Zmc2V0OworICAgIFRUX0NoYXIgIG1pbl9vcmlnaW5fU0I7CisgICAgVFRfQ2hhciAgbWluX2FkdmFuY2VfU0I7CisgICAgVFRfQ2hhciAgbWF4X2JlZm9yZV9CTDsKKyAgICBUVF9DaGFyICBtaW5fYWZ0ZXJfQkw7CisgICAgVFRfQ2hhciAgcGFkc1syXTsKKworICB9IFRUX1NCaXRfTGluZV9NZXRyaWNzOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfU0JpdF9SYW5nZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSBUcnVlVHlwZS9PcGVuVHlwZSBzdWJJbmRleFRhYmxlIGFzIGRlZmluZWQgaW4gdGhlIGBFQkxDJyAgICAgICAgICovCisgIC8qICAgIChNaWNyb3NvZnQpIG9yIGBibG9jJyAoQXBwbGUpIHRhYmxlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZpcnN0X2dseXBoICAgOjogVGhlIGZpcnN0IGdseXBoIGluZGV4IGluIHRoZSByYW5nZS4gICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbGFzdF9nbHlwaCAgICA6OiBUaGUgbGFzdCBnbHlwaCBpbmRleCBpbiB0aGUgcmFuZ2UuICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBpbmRleF9mb3JtYXQgIDo6IFRoZSBmb3JtYXQgb2YgaW5kZXggdGFibGUuICBWYWxpZCB2YWx1ZXMgYXJlIDEgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICB0byA1LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBpbWFnZV9mb3JtYXQgIDo6IFRoZSBmb3JtYXQgb2YgYEVCRFQnIGltYWdlIGRhdGEuICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGltYWdlX29mZnNldCAgOjogVGhlIG9mZnNldCB0byBpbWFnZSBkYXRhIGluIGBFQkRUJy4gICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgaW1hZ2Vfc2l6ZSAgICA6OiBGb3IgaW5kZXggZm9ybWF0cyAyIGFuZCA1LiAgVGhpcyBpcyB0aGUgc2l6ZSBpbiAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgYnl0ZXMgb2YgZWFjaCBnbHlwaCBiaXRtYXAuICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgYmlnX21ldHJpY3MgICA6OiBGb3IgaW5kZXggZm9ybWF0cyAyIGFuZCA1LiAgVGhpcyBpcyB0aGUgYmlnICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgbWV0cmljcyBmb3IgZWFjaCBnbHlwaCBiaXRtYXAuICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbnVtX2dseXBocyAgICA6OiBGb3IgaW5kZXggZm9ybWF0cyA0IGFuZCA1LiAgVGhpcyBpcyB0aGUgbnVtYmVyIG9mICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgZ2x5cGhzIGluIHRoZSBjb2RlIGFycmF5LiAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZ2x5cGhfb2Zmc2V0cyA6OiBGb3IgaW5kZXggZm9ybWF0cyAxIGFuZCAzLiAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBnbHlwaF9jb2RlcyAgIDo6IEZvciBpbmRleCBmb3JtYXRzIDQgYW5kIDUuICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHRhYmxlX29mZnNldCAgOjogVGhlIG9mZnNldCBvZiB0aGUgaW5kZXggdGFibGUgaW4gdGhlIGBFQkxDJyAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgIHRhYmxlLiAgT25seSB1c2VkIGR1cmluZyBzdHJpa2UgbG9hZGluZy4gICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgc3RydWN0ICBUVF9TQml0X1JhbmdlCisgIHsKKyAgICBUVF9VU2hvcnQgICAgICAgIGZpcnN0X2dseXBoOworICAgIFRUX1VTaG9ydCAgICAgICAgbGFzdF9nbHlwaDsKKworICAgIFRUX1VTaG9ydCAgICAgICAgaW5kZXhfZm9ybWF0OworICAgIFRUX1VTaG9ydCAgICAgICAgaW1hZ2VfZm9ybWF0OworICAgIFRUX1VMb25nICAgICAgICAgaW1hZ2Vfb2Zmc2V0OworCisgICAgVFRfVUxvbmcgICAgICAgICBpbWFnZV9zaXplOworICAgIFRUX1NCaXRfTWV0cmljcyAgbWV0cmljczsKKyAgICBUVF9VTG9uZyAgICAgICAgIG51bV9nbHlwaHM7CisKKyAgICBUVF9VTG9uZyogICAgICAgIGdseXBoX29mZnNldHM7CisgICAgVFRfVVNob3J0KiAgICAgICBnbHlwaF9jb2RlczsKKworICAgIFRUX1VMb25nICAgICAgICAgdGFibGVfb2Zmc2V0OworCisgIH0gVFRfU0JpdF9SYW5nZTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX1NCaXRfU3RyaWtlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgc3RydWN0dXJlIHVzZWQgZGVzY3JpYmUgYSBnaXZlbiBiaXRtYXAgc3RyaWtlIGluIHRoZSBgRUJMQycgICAgICAqLworICAvKiAgICAoTWljcm9zb2Z0KSBvciBgYmxvYycgKEFwcGxlKSB0YWJsZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIG51bV9pbmRleF9yYW5nZXMgOjogVGhlIG51bWJlciBvZiBpbmRleCByYW5nZXMuICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgaW5kZXhfcmFuZ2VzICAgICA6OiBBbiBhcnJheSBvZiBnbHlwaCBpbmRleCByYW5nZXMuICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICBjb2xvcl9yZWYgICAgICAgIDo6IFVudXNlZC4gIEEgY29sb3IgcmVmZXJlbmNlPyAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIGhvcmkgICAgICAgICAgICAgOjogVGhlIGxpbmUgbWV0cmljcyBmb3IgaG9yaXpvbnRhbCBsYXlvdXRzLiAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgdmVydCAgICAgICAgICAgICA6OiBUaGUgbGluZSBtZXRyaWNzIGZvciB2ZXJ0aWNhbCBsYXlvdXRzLiAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICBzdGFydF9nbHlwaCAgICAgIDo6IFRoZSBsb3dlc3QgZ2x5cGggaW5kZXggZm9yIHRoaXMgc3RyaWtlLiAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIGVuZF9nbHlwaCAgICAgICAgOjogVGhlIGhpZ2hlc3QgZ2x5cGggaW5kZXggZm9yIHRoaXMgc3RyaWtlLiAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgeF9wcGVtICAgICAgICAgICA6OiBUaGUgbnVtYmVyIG9mIGhvcml6b250YWwgcGl4ZWxzIHBlciBFTS4gICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICB5X3BwZW0gICAgICAgICAgIDo6IFRoZSBudW1iZXIgb2YgdmVydGljYWwgcGl4ZWxzIHBlciBFTS4gICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIGJpdF9kZXB0aCAgICAgICAgOjogVGhlIGJpdCBkZXB0aC4gIFZhbGlkIHZhbHVlcyBhcmUgMSwgMiwgNCwgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgIGFuZCA4LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIGZsYWdzICAgICAgICAgICAgOjogSXMgdGhpcyBhIHZlcnRpY2FsIG9yIGhvcml6b250YWwgc3RyaWtlPyAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgc3RydWN0ICBUVF9TQml0X1N0cmlrZV8KKyAgeworICAgIFRUX0ludCAgICAgICAgICAgICAgICAgbnVtX3JhbmdlczsKKyAgICBUVF9TQml0X1JhbmdlKiAgICAgICAgIHNiaXRfcmFuZ2VzOworICAgIFRUX1VMb25nICAgICAgICAgICAgICAgcmFuZ2VzX29mZnNldDsKKworICAgIFRUX1VMb25nICAgICAgICAgICAgICAgY29sb3JfcmVmOworCisgICAgVFRfU0JpdF9MaW5lX01ldHJpY3MgICBob3JpOworICAgIFRUX1NCaXRfTGluZV9NZXRyaWNzICAgdmVydDsKKworICAgIFRUX1VTaG9ydCAgICAgICAgICAgICAgc3RhcnRfZ2x5cGg7CisgICAgVFRfVVNob3J0ICAgICAgICAgICAgICBlbmRfZ2x5cGg7CisKKyAgICBUVF9CeXRlICAgICAgICAgICAgICAgIHhfcHBlbTsKKyAgICBUVF9CeXRlICAgICAgICAgICAgICAgIHlfcHBlbTsKKworICAgIFRUX0J5dGUgICAgICAgICAgICAgICAgYml0X2RlcHRoOworICAgIFRUX0NoYXIgICAgICAgICAgICAgICAgZmxhZ3M7CisKKyAgfSBUVF9TQml0X1N0cmlrZTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX1NCaXRfQ29tcG9uZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgc2ltcGxlIHN0cnVjdHVyZSB0byBkZXNjcmliZSBhIGNvbXBvdW5kIHNiaXQgZWxlbWVudC4gICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGdseXBoX2NvZGUgOjogVGhlIGVsZW1lbnQncyBnbHlwaCBpbmRleC4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB4X29mZnNldCAgIDo6IFRoZSBlbGVtZW50J3MgbGVmdCBiZWFyaW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgeV9vZmZzZXQgICA6OiBUaGUgZWxlbWVudCdzIHRvcCBiZWFyaW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHN0cnVjdCAgVFRfU0JpdF9Db21wb25lbnRfCisgIHsKKyAgICBUVF9VU2hvcnQgIGdseXBoX2NvZGU7CisKKyAgICBUVF9DaGFyICAgIHhfb2Zmc2V0OworICAgIFRUX0NoYXIgICAgeV9vZmZzZXQ7CisKKyAgfSBUVF9TQml0X0NvbXBvbmVudDsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX1NCaXRfU2NhbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgc3RydWN0dXJlIHVzZWQgZGVzY3JpYmUgYSBnaXZlbiBiaXRtYXAgc2NhbGluZyB0YWJsZSwgYXMgZGVmaW5lZCAqLworICAvKiAgICBpbiB0aGUgYEVCU0MnIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBob3JpICAgICAgICAgICAgICA6OiBUaGUgaG9yaXpvbnRhbCBsaW5lIG1ldHJpY3MuICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHZlcnQgICAgICAgICAgICAgIDo6IFRoZSB2ZXJ0aWNhbCBsaW5lIG1ldHJpY3MuICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgeF9wcGVtICAgICAgICAgICAgOjogVGhlIG51bWJlciBvZiBob3Jpem9udGFsIHBpeGVscyBwZXIgRU0uICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB5X3BwZW0gICAgICAgICAgICA6OiBUaGUgbnVtYmVyIG9mIHZlcnRpY2FsIHBpeGVscyBwZXIgRU0uICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHhfcHBlbV9zdWJzdGl0dXRlIDo6IFN1YnN0aXR1dGlvbiB4X3BwZW0gdmFsdWUuICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgeV9wcGVtX3N1YnN0aXR1dGUgOjogU3Vic3RpdHV0aW9uIHlfcHBlbSB2YWx1ZS4gICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHN0cnVjdCAgVFRfU0JpdF9TY2FsZV8KKyAgeworICAgIFRUX1NCaXRfTGluZV9NZXRyaWNzICBob3JpOworICAgIFRUX1NCaXRfTGluZV9NZXRyaWNzICB2ZXJ0OworCisgICAgVFRfQnl0ZSAgICAgICAgICAgICAgIHhfcHBlbTsKKyAgICBUVF9CeXRlICAgICAgICAgICAgICAgeV9wcGVtOworCisgICAgVFRfQnl0ZSAgICAgICAgICAgICAgIHhfcHBlbV9zdWJzdGl0dXRlOworICAgIFRUX0J5dGUgICAgICAgICAgICAgICB5X3BwZW1fc3Vic3RpdHV0ZTsKKworICB9IFRUX1NCaXRfU2NhbGU7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUVF9Qb3N0XzIwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBQb3N0c2NyaXB0IG5hbWVzIHN1Yi10YWJsZSwgZm9ybWF0IDIuMC4gIFN0b3JlcyB0aGUgUFMgbmFtZSBvZiAgICAgKi8KKyAgLyogICAgZWFjaCBnbHlwaCBpbiB0aGUgZm9udCBmYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbnVtX2dseXBocyAgICA6OiBUaGUgbnVtYmVyIG9mIG5hbWVkIGdseXBocyBpbiB0aGUgdGFibGUuICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBudW1fbmFtZXMgICAgIDo6IFRoZSBudW1iZXIgb2YgUFMgbmFtZXMgc3RvcmVkIGluIHRoZSB0YWJsZS4gICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGdseXBoX2luZGljZXMgOjogVGhlIGluZGljZXMgb2YgdGhlIGdseXBocyBpbiB0aGUgbmFtZXMgYXJyYXlzLiAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZ2x5cGhfbmFtZXMgICA6OiBUaGUgUFMgbmFtZXMgbm90IGluIE1hYyBFbmNvZGluZy4gICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHN0cnVjdCAgVFRfUG9zdF8yMF8KKyAgeworICAgIFRUX1VTaG9ydCAgIG51bV9nbHlwaHM7CisgICAgVFRfVVNob3J0ICAgbnVtX25hbWVzOworICAgIFRUX1VTaG9ydCogIGdseXBoX2luZGljZXM7CisgICAgVFRfQ2hhcioqICAgZ2x5cGhfbmFtZXM7CisKKyAgfSBUVF9Qb3N0XzIwOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfUG9zdF8yNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgUG9zdHNjcmlwdCBuYW1lcyBzdWItdGFibGUsIGZvcm1hdCAyLjUuICBTdG9yZXMgdGhlIFBTIG5hbWUgb2YgICAgICovCisgIC8qICAgIGVhY2ggZ2x5cGggaW4gdGhlIGZvbnQgZmFjZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG51bV9nbHlwaHMgOjogVGhlIG51bWJlciBvZiBnbHlwaHMgaW4gdGhlIHRhYmxlLiAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgb2Zmc2V0cyAgICA6OiBBbiBhcnJheSBvZiBzaWduZWQgb2Zmc2V0cyBpbiBhIG5vcm1hbCBNYWMgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgUG9zdHNjcmlwdCBuYW1lIGVuY29kaW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBzdHJ1Y3QgIFRUX1Bvc3RfMjVfCisgIHsKKyAgICBUVF9VU2hvcnQgIG51bV9nbHlwaHM7CisgICAgVFRfQ2hhciogICBvZmZzZXRzOworCisgIH0gVFRfUG9zdF8yNTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX1Bvc3RfTmFtZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFBvc3RzY3JpcHQgbmFtZXMgdGFibGUsIGVpdGhlciBmb3JtYXQgMi4wIG9yIDIuNS4gICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGxvYWRlZCAgICA6OiBBIGZsYWcgdG8gaW5kaWNhdGUgd2hldGhlciB0aGUgUFMgbmFtZXMgYXJlIGxvYWRlZC4gICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gCisgIC8qICAgIGZvcm1hdF8yMCA6OiBUaGUgc3ViLXRhYmxlIHVzZWQgZm9yIGZvcm1hdCAyLjAuICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZm9ybWF0XzI1IDo6IFRoZSBzdWItdGFibGUgdXNlZCBmb3IgZm9ybWF0IDIuNS4gICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHN0cnVjdCAgVFRfUG9zdF9OYW1lc18KKyAgeworICAgIFRUX0Jvb2wgICAgICAgbG9hZGVkOworCisgICAgdW5pb24KKyAgICB7CisgICAgICBUVF9Qb3N0XzIwICBmb3JtYXRfMjA7CisgICAgICBUVF9Qb3N0XzI1ICBmb3JtYXRfMjU7CisKKyAgICB9IG5hbWVzOworCisgIH0gVFRfUG9zdF9OYW1lczsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqLworICAvKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KKyAgLyoqKiAgICAgICAgICAgICAgICAgIE9SSUdJTkFMIFRUX0ZBQ0UgQ0xBU1MgREVGSU5JVElPTiAgICAgICAgICAgICAgICAqKiovCisgIC8qKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqLworICAvKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogVGhpcyBzdHJ1Y3R1cmUvY2xhc3MgaXMgZGVmaW5lZCBoZXJlIGJlY2F1c2UgaXQgaXMgY29tbW9uIHRvIHRoZSAgICAgICovCisgIC8qIGZvbGxvd2luZyBmb3JtYXRzOiBUVEYsIE9wZW5UeXBlLVRULCBhbmQgT3BlblR5cGUtQ0ZGLiAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogTm90ZSBob3dldmVyIHRoYXQgdGhlIGNsYXNzZXMgVFRfU2l6ZSwgVFRfR2x5cGhTbG90LCBhbmQgVFRfQ2hhck1hcCAgICovCisgIC8qIGFyZSBub3Qgc2hhcmVkIGJldHdlZW4gZm9udCBkcml2ZXJzLCBhbmQgYXJlIHRodXMgZGVmaW5lZCBub3JtYWxseSBpbiAqLworICAvKiBgZHJpdmVycy90cnVldHlwZS90dG9ianMuaCcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfRmFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSBoYW5kbGUgdG8gYSBUcnVlVHlwZSBmYWNlL2ZvbnQgb2JqZWN0LiAgQSBUVF9GYWNlIGVuY2Fwc3VsYXRlcyAgICovCisgIC8qICAgIHRoZSByZXNvbHV0aW9uIGFuZCBzY2FsaW5nIGluZGVwZW5kZW50IHBhcnRzIG9mIGEgVHJ1ZVR5cGUgZm9udCAgICAqLworICAvKiAgICByZXNvdXJjZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGUgVFRfRmFjZSBzdHJ1Y3R1cmUgaXMgYWxzbyB1c2VkIGFzIGEgYHBhcmVudCBjbGFzcycgZm9yIHRoZSAgICAgKi8KKyAgLyogICAgT3BlblR5cGUtQ0ZGIGNsYXNzIChUMl9GYWNlKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHN0cnVjdCBUVF9GYWNlUmVjXyogICBUVF9GYWNlOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBUcnVlVHlwZSBGYWNlIFR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUVF9GYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGUgVHJ1ZVR5cGUgZmFjZSBjbGFzcy4gIFRoZXNlIG9iamVjdHMgbW9kZWwgdGhlIHJlc29sdXRpb24gYW5kICAgKi8KKyAgLyogICAgcG9pbnQtc2l6ZSBpbmRlcGVuZGVudCBkYXRhIGZvdW5kIGluIGEgVHJ1ZVR5cGUgZm9udCBmaWxlLiAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgcm9vdCAgICAgICAgICAgICAgOjogVGhlIGJhc2UgRlRfRmFjZSBzdHJ1Y3R1cmUsIG1hbmFnZWQgYnkgdGhlICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UgbGF5ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgdHRjSGVhZGVyICAgICAgICAgOjogVGhlIFRydWVUeXBlIGNvbGxlY3Rpb24gaGVhZGVyLCB1c2VkIHdoZW4gdGhlICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUgaXMgYSBgdHRjJyByYXRoZXIgdGhhbiBhIGB0dGYnLiAgRm9yICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBvcmRpbmFyeSBmb250IGZpbGVzLCB0aGUgZmllbGQgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgYHR0Y0hlYWRlci5EaXJDb3VudCcgaXMgc2V0IHRvIDAuICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBudW1fdGFibGVzICAgICAgICA6OiBUaGUgbnVtYmVyIG9mIFRydWVUeXBlIHRhYmxlcyBpbiB0aGlzIGZvbnQgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgZmlsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBkaXJfdGFibGVzICAgICAgICA6OiBUaGUgZGlyZWN0b3J5IG9mIFRydWVUeXBlIHRhYmxlcyBmb3IgdGhpcyAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgZm9udCBmaWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBoZWFkZXIgICAgICAgICAgICA6OiBUaGUgZm9udCdzIGZvbnQgaGVhZGVyIChgaGVhZCcgdGFibGUpLiAgUmVhZCAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgb24gZm9udCBvcGVuaW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBob3Jpem9udGFsICAgICAgICA6OiBUaGUgZm9udCdzIGhvcml6b250YWwgaGVhZGVyIChgaGhlYScgdGFibGUpLiAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmaWVsZCBhbHNvIGNvbnRhaW5zIHRoZSBhc3NvY2lhdGVkICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgIGhvcml6b250YWwgbWV0cmljcyB0YWJsZSAoYGhtdHgnKS4gICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbWF4X3Byb2ZpbGUgICAgICAgOjogVGhlIGZvbnQncyBtYXhpbXVtIHByb2ZpbGUgdGFibGUuICBSZWFkIG9uICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQgb3BlbmluZy4gIE5vdGUgdGhhdCBzb21lIG1heGltdW0gdmFsdWVzICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBjYW5ub3QgYmUgdGFrZW4gZGlyZWN0bHkgZnJvbSB0aGlzIHRhYmxlLiAgV2UgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgdGh1cyBkZWZpbmUgYWRkaXRpb25hbCBmaWVsZHMgYmVsb3cgdG8gaG9sZCAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjb21wdXRlZCBtYXhpbWEuICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbWF4X2NvbXBvbmVudHMgICAgOjogVGhlIG1heGltdW0gbnVtYmVyIG9mIGdseXBoIGNvbXBvbmVudHMgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkIHRvIGxvYWQgYW55IGNvbXBvc2l0ZSBnbHlwaCBmcm9tICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGZvbnQuICBVc2VkIHRvIHNpemUgdGhlIGxvYWQgc3RhY2suICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHZlcnRpY2FsX2luZm8gICAgIDo6IEEgYm9vbGVhbiB3aGljaCBpcyBzZXQgd2hlbiB0aGUgZm9udCBmaWxlICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWlucyB2ZXJ0aWNhbCBtZXRyaWNzLiAgSWYgbm90LCB0aGUgdmFsdWUgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIGB2ZXJ0aWNhbCcgZmllbGQgaXMgdW5kZWZpbmVkLiAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB2ZXJ0aWNhbCAgICAgICAgICA6OiBUaGUgZm9udCdzIHZlcnRpY2FsIGhlYWRlciAoYHZoZWEnIHRhYmxlKS4gICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmaWVsZCBhbHNvIGNvbnRhaW5zIHRoZSBhc3NvY2lhdGVkICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnRpY2FsIG1ldHJpY3MgdGFibGUgKGB2bXR4JyksIGlmIGZvdW5kLiAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBJTVBPUlRBTlQ6IFRoZSBjb250ZW50cyBvZiB0aGlzIGZpZWxkIGlzICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWZpbmVkIGlmIHRoZSBgdmVydGljYWxJbmZvJyBmaWVsZCBpcyAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2V0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbnVtX25hbWVzICAgICAgICAgOjogVGhlIG51bWJlciBvZiBuYW1lIHJlY29yZHMgd2l0aGluIHRoaXMgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgIFRydWVUeXBlIGZvbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbmFtZV90YWJsZSAgICAgICAgOjogVGhlIHRhYmxlIG9mIG5hbWUgcmVjb3JkcyAoYG5hbWUnKS4gICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBvczIgICAgICAgICAgICAgICA6OiBUaGUgZm9udCdzIE9TLzIgdGFibGUgKGBPUy8yJykuICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHBvc3RzY3JpcHQgICAgICAgIDo6IFRoZSBmb250J3MgUG9zdFNjcmlwdCB0YWJsZSAoYHBvc3QnIHRhYmxlKS4gICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgUG9zdFNjcmlwdCBnbHlwaCBuYW1lcyBhcmUgbm90IGxvYWRlZCBieSAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGRyaXZlciBvbiBmYWNlIG9wZW5pbmcuICBTZWUgdGhlIGB0dHBvc3QnICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbnVtX2NoYXJtYXBzICAgICAgOjogVGhlIG51bWJlciBvZiBjaGFyYWN0ZXIgbWFwcGluZ3MgaW4gdGhlIGZvbnQuICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBjaGFybWFwcyAgICAgICAgICA6OiBUaGUgYXJyYXkgb2YgY2hhcm1hcCBvYmplY3RzIGZvciB0aGlzIGZvbnQgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgZmlsZS4gIE5vdGUgdGhhdCB0aGlzIGZpZWxkIGlzIGEgdHlwZWxlc3MgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXIuICBUaGUgUmVhc29uIGlzIHRoYXQgdGhlIGZvcm1hdCBvZiAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBjaGFybWFwcyB2YXJpZXMgd2l0aCB0aGUgdW5kZXJseWluZyBmb250ICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0IGFuZCBjYW5ub3QgYmUgZGV0ZXJtaW5lZCBoZXJlLiAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBoZG14ICAgICAgICAgICAgICA6OiBUaGUgZmFjZSdzIGhvcml6b250YWwgZGV2aWNlIG1ldHJpY3MgKGBoZG14JyAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUpLiAgVGhpcyB0YWJsZSBpcyBvcHRpb25hbCBpbiAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgIFRydWVUeXBlL09wZW5UeXBlIGZvbnRzLiAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZ2FzcCAgICAgICAgICAgICAgOjogVGhlIGdyaWQtZml0dGluZyBhbmQgc2NhbGluZyBwcm9wZXJ0aWVzIHRhYmxlICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgIChgZ2FzcCcpLiAgVGhpcyB0YWJsZSBpcyBvcHRpb25hbCBpbiAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBUcnVlVHlwZS9PcGVuVHlwZSBmb250cy4gICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG51bV9zYml0X3N0cmlrZXMgIDo6IFRoZSBudW1iZXIgb2Ygc2JpdCBzdHJpa2VzLCBpLmUuLCBiaXRtYXAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBzaXplcywgZW1iZWRkZWQgaW4gdGhpcyBmb250LiAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHNiaXRfc3RyaWtlcyAgICAgIDo6IEFuIGFycmF5IG9mIHNiaXQgc3RyaWtlcyBlbWJlZGRlZCBpbiB0aGlzICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBmb250LiAgVGhpcyB0YWJsZSBpcyBvcHRpb25hbCBpbiBhICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgVHJ1ZVR5cGUvT3BlblR5cGUgZm9udC4gICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBudW1fc2JpdF9zY2FsZXMgICA6OiBUaGUgbnVtYmVyIG9mIHNiaXQgc2NhbGVzIGZvciB0aGlzIGZvbnQuICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHNiaXRfc2NhbGVzICAgICAgIDo6IEFycmF5IG9mIHNiaXQgc2NhbGVzIGVtYmVkZGVkIGluIHRoaXMgZm9udC4gICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHRhYmxlIGlzIG9wdGlvbmFsIGluIGEgVHJ1ZVR5cGUvT3BlblR5cGUgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgZm9udC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBwb3N0c2NyaXB0X25hbWVzICA6OiBBIHRhYmxlIHVzZWQgdG8gc3RvcmUgdGhlIFBvc3RzY3JpcHQgbmFtZXMgb2YgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGdseXBocyBmb3IgdGhpcyBmb250LiAgU2VlIHRoZSBmaWxlICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgIGB0dGNvbmZpZy5oJyBmb3IgY29tbWVudHMgb24gdGhlICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBUVF9DT05GSUdfT1BUSU9OX1BPU1RTQ1JJUFRfTkFNRVMgb3B0aW9uLiAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG51bV9sb2NhdGlvbnMgICAgIDo6IFRoZSBudW1iZXIgb2YgZ2x5cGggbG9jYXRpb25zIGluIHRoaXMgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBUcnVlVHlwZSBmaWxlLiAgVGhpcyBzaG91bGQgYmUgaWRlbnRpY2FsIHRvICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG51bWJlciBvZiBnbHlwaHMuICBJZ25vcmVkIGZvciBUeXBlIDIgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZ2x5cGhfbG9jYXRpb25zICAgOjogQW4gYXJyYXkgb2YgbG9uZ3MuICBUaGVzZSBhcmUgb2Zmc2V0cyB0byAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBoIGRhdGEgd2l0aGluIHRoZSBgZ2x5ZicgdGFibGUuICBJZ25vcmVkICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgVHlwZSAyIGZvbnQgZmFjZXMuICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZvbnRfcHJvZ3JhbV9zaXplIDo6IFNpemUgaW4gYnl0ZWNvZGVzIG9mIHRoZSBmYWNlJ3MgZm9udCBwcm9ncmFtLiAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAwIGlmIG5vbmUgZGVmaW5lZC4gIElnbm9yZWQgZm9yIFR5cGUgMiBmb250cy4gKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZvbnRfcHJvZ3JhbSAgICAgIDo6IFRoZSBmYWNlJ3MgZm9udCBwcm9ncmFtIChieXRlY29kZSBzdHJlYW0pICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlZCBhdCBsb2FkIHRpbWUsIGFsc28gdXNlZCBkdXJpbmcgZ2x5cGggKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgcmVuZGVyaW5nLiAgQ29tZXMgZnJvbSB0aGUgYGZwZ20nIHRhYmxlLiAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgIElnbm9yZWQgZm9yIFR5cGUgMiBmb250IGZvbnRzLiAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgY3Z0X3Byb2dyYW1fc2l6ZSAgOjogU2l6ZSBpbiBieXRlY29kZXMgb2YgdGhlIGZhY2UncyBjdnQgcHJvZ3JhbS4gICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgIElnbm9yZWQgZm9yIFR5cGUgMiBmb250cy4gICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgY3Z0X3Byb2dyYW0gICAgICAgOjogVGhlIGZhY2UncyBjdnQgcHJvZ3JhbSAoYnl0ZWNvZGUgc3RyZWFtKSAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVkIGVhY2ggdGltZSBhbiBpbnN0YW5jZS9zaXplIGlzICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkL3Jlc2V0LiAgQ29tZXMgZnJvbSB0aGUgYHByZXAnIHRhYmxlLiAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgSWdub3JlZCBmb3IgVHlwZSAyIGZvbnRzLiAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBjdnRfc2l6ZSAgICAgICAgICA6OiBTaXplIG9mIHRoZSBjb250cm9sIHZhbHVlIHRhYmxlIChpbiBlbnRyaWVzKS4gKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgSWdub3JlZCBmb3IgVHlwZSAyIGZvbnRzLiAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBjdnQgICAgICAgICAgICAgICA6OiBUaGUgZmFjZSdzIG9yaWdpbmFsIGNvbnRyb2wgdmFsdWUgdGFibGUuICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgQ29vcmRpbmF0ZXMgYXJlIGV4cHJlc3NlZCBpbiB1bnNjYWxlZCBmb250ICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXRzLiAgQ29tZXMgZnJvbSB0aGUgYGN2dCBgIHRhYmxlLiAgSWdub3JlZCAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgVHlwZSAyIGZvbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG51bV9rZXJuX3BhaXJzICAgIDo6IFRoZSBudW1iZXIgb2Yga2VybmluZyBwYWlycyBwcmVzZW50IGluIHRoZSAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBmb250IGZpbGUuICBUaGUgZW5naW5lIG9ubHkgbG9hZHMgdGhlIGZpcnN0ICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgaG9yaXpvbnRhbCBmb3JtYXQgMCBrZXJuIHRhYmxlIGl0IGZpbmRzIGluICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBmb250IGZpbGUuICBZb3Ugc2hvdWxkIHVzZSB0aGUgYHR0eGtlcm4nICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3R1cmVzIGlmIHlvdSB3YW50IHRvIGFjY2VzcyBvdGhlciAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAga2VybmluZyB0YWJsZXMuICBJZ25vcmVkIGZvciBUeXBlIDIgZm9udHMuICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBrZXJuX3RhYmxlX2luZGV4ICA6OiBUaGUgaW5kZXggb2YgdGhlIGtlcm5pbmcgdGFibGUgaW4gdGhlIGZvbnQgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAga2VybmluZyBkaXJlY3RvcnkuICBPbmx5IHVzZWQgYnkgdGhlIHR0eGtlcm4gICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbiB0byBhdm9pZCBkYXRhIGR1cGxpY2F0aW9uLiAgSWdub3JlZCAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgVHlwZSAyIGZvbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGtlcm5fcGFpcnMgICAgICAgIDo6IEFycmF5IG9mIGtlcm5pbmcgcGFpcnMsIGlmIGFueS4gIElnbm9yZWQgZm9yICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlIDIgZm9udHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgc3RydWN0ICBUVF9GYWNlUmVjXworICB7CisgICAgRlRfRmFjZVJlYyAgICAgICAgIHJvb3Q7CisKKyAgICBUVENfSGVhZGVyICAgICAgICAgdHRjX2hlYWRlcjsKKworICAgIFRUX1VTaG9ydCAgICAgICAgICBudW1fdGFibGVzOworICAgIFRUX1RhYmxlRGlyRW50cnkqICBkaXJfdGFibGVzOworCisgICAgVFRfSGVhZGVyICAgICAgICAgIGhlYWRlcjsgICAgICAgLyogVHJ1ZVR5cGUgaGVhZGVyIHRhYmxlICAgICAgICAgICovCisgICAgVFRfSG9yaUhlYWRlciAgICAgIGhvcml6b250YWw7ICAgLyogVHJ1ZVR5cGUgaG9yaXpvbnRhbCBoZWFkZXIgICAgICovCisKKyAgICBUVF9NYXhQcm9maWxlICAgICAgbWF4X3Byb2ZpbGU7CisgICAgVFRfVUxvbmcgICAgICAgICAgIG1heF9jb21wb25lbnRzOworCisgICAgVFRfQm9vbCAgICAgICAgICAgIHZlcnRpY2FsX2luZm87CisgICAgVFRfVmVydEhlYWRlciAgICAgIHZlcnRpY2FsOyAgICAgLyogVFQgVmVydGljYWwgaGVhZGVyLCBpZiBwcmVzZW50ICovCisKKyAgICBUVF9JbnQgICAgICAgICAgICAgbnVtX25hbWVzOyAgICAvKiBudW1iZXIgb2YgbmFtZSByZWNvcmRzICAqLworICAgIFRUX05hbWVUYWJsZSAgICAgICBuYW1lX3RhYmxlOyAgIC8qIG5hbWUgdGFibGUgICAgICAgICAgICAgICovCisKKyAgICBUVF9PUzIgICAgICAgICAgICAgb3MyOyAgICAgICAgICAvKiBUcnVlVHlwZSBPUy8yIHRhYmxlICAgICAgICAgICAgKi8KKyAgICBUVF9Qb3N0c2NyaXB0ICAgICAgcG9zdHNjcmlwdDsgICAvKiBUcnVlVHlwZSBQb3N0c2NyaXB0IHRhYmxlICAgICAgKi8KKworICAgIFRUX0ludCAgICAgICAgICAgICBudW1fY2hhcm1hcHM7CisgICAgdm9pZCogICAgICAgICAgICAgIGNoYXJtYXBzOyAgICAgLyogYXJyYXkgb2YgVFRfQ2hhck1hcFJlYyAqLworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiBPcHRpb25hbCBUcnVlVHlwZS9PcGVuVHlwZSB0YWJsZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIC8qIGhvcml6b250YWwgZGV2aWNlIG1ldHJpY3MgKi8KKyAgICBUVF9IZG14ICAgICAgICAgICAgaGRteDsKKworICAgIC8qIGdyaWQtZml0dGluZyBhbmQgc2NhbGluZyB0YWJsZSAqLworICAgIFRUX0dhc3AgICAgICAgICAgICBnYXNwOyAgICAgICAgICAgICAgICAgLyogdGhlIGBnYXNwJyB0YWJsZSAqLworCisgICAgLyogZW1iZWRkZWQgYml0bWFwcyBzdXBwb3J0ICovCisgICAgVFRfSW50ICAgICAgICAgICAgIG51bV9zYml0X3N0cmlrZXM7CisgICAgVFRfU0JpdF9TdHJpa2UqICAgIHNiaXRfc3RyaWtlczsKKworICAgIFRUX0ludCAgICAgICAgICAgICBudW1fc2JpdF9zY2FsZXM7CisgICAgVFRfU0JpdF9TY2FsZSogICAgIHNiaXRfc2NhbGVzOworCisgICAgLyogcG9zdHNjcmlwdCBuYW1lcyB0YWJsZSAqLworICAgIFRUX1Bvc3RfTmFtZXMgICAgICBwb3N0c2NyaXB0X25hbWVzOworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiBUcnVlVHlwZS1zcGVjaWZpYyBmaWVsZHMgKGlnbm9yZWQgYnkgdGhlIE9URi1UeXBlMiBkcml2ZXIpICAgICAgICAgICovCisgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIC8qIHRoZSBnbHlwaCBsb2NhdGlvbnMgKi8KKyAgICBUVF9VU2hvcnQgICAgICAgICAgbnVtX2xvY2F0aW9uczsKKyAgICBUVF9Mb25nKiAgICAgICAgICAgZ2x5cGhfbG9jYXRpb25zOworCisgICAgLyogdGhlIGZvbnQgcHJvZ3JhbSwgaWYgYW55ICovCisgICAgVFRfVUxvbmcgICAgICAgICAgIGZvbnRfcHJvZ3JhbV9zaXplOworICAgIFRUX0J5dGUqICAgICAgICAgICBmb250X3Byb2dyYW07CisKKyAgICAvKiB0aGUgY3Z0IHByb2dyYW0sIGlmIGFueSAqLworICAgIFRUX1VMb25nICAgICAgICAgICBjdnRfcHJvZ3JhbV9zaXplOworICAgIFRUX0J5dGUqICAgICAgICAgICBjdnRfcHJvZ3JhbTsKKworICAgIC8qIHRoZSBvcmlnaW5hbCwgdW5zY2FsZWQsIGNvbnRyb2wgdmFsdWUgdGFibGUgKi8KKyAgICBUVF9VTG9uZyAgICAgICAgICAgY3Z0X3NpemU7CisgICAgVFRfU2hvcnQqICAgICAgICAgIGN2dDsKKworICAgIC8qIHRoZSBmb3JtYXQgMCBrZXJuaW5nIHRhYmxlLCBpZiBhbnkgKi8KKyAgICBUVF9JbnQgICAgICAgICAgICAgbnVtX2tlcm5fcGFpcnM7CisgICAgVFRfSW50ICAgICAgICAgICAgIGtlcm5fdGFibGVfaW5kZXg7CisgICAgVFRfS2Vybl8wX1BhaXIqICAgIGtlcm5fcGFpcnM7CisKKyAgfSBUVF9GYWNlUmVjOworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworICB9CisjZW5kaWYKKworCisjZW5kaWYgLyogVFRUWVBFU19IICovCisKKworLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvc2hhcmVkL3QxdHlwZXMuaCBiL3NyYy9zaGFyZWQvdDF0eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1M2I3NDMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvc2hhcmVkL3QxdHlwZXMuaApAQCAtMCwwICsxLDQ4NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgdDF0eXBlcy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4wCisgKgorICogICAgQmFzaWMgVHlwZTEvVHlwZTIgdHlwZSBkZWZpbml0aW9ucyBhbmQgaW50ZXJmYWNlLgorICoKKyAqICBUaGlzIGNvZGUgaXMgc2hhcmVkIGJ5IHRoZSBUeXBlMSBhbmQgVHlwZTIgZHJpdmVycworICoKKyAqCisgKiAgQ29weXJpZ2h0IDE5OTYtMTk5OSBieQorICogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkCisgKiAgbW9kaWZpZWQgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIFQxVFlQRVNfSAorI2RlZmluZSBUMVRZUEVTX0gKKworI2luY2x1ZGUgPGZyZWV0eXBlLmg+CisKKworI2lmZGVmIF9fY3BsdXNwbHVzCisgIGV4dGVybiAiQyIgeworI2VuZGlmCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KKy8qKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqLworLyoqKiAgICAgICAgICAgICAgICBERUZJTklUSU9OUyBPRiBCQVNJQyBEQVRBIFRZUEVTICAgICAgICAgICAgICAgICAgICAqKiovCisvKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KKy8qKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qIFRoZSBSRURFRklORSBtYWNybyBpcyB1c2VkIHRvIGNvbnZlcnQgYSBGcmVlVHlwZSBnZW5lcmljIHR5cGUgaW50byAgICAqLworLyogYSBUcnVlVHlwZS1zcGVjaWZpYyBvbmUuIEl0IHNpbXBseSByZXBsYWNlcyB0aGUgIkZUXyIgcHJlZml4IGJ5ICJUMV8iICovCisvKiBpbiBvcmRlciB0byBkZWZpbmUgY29tcGF0aWJsZSBUMV9Mb25nLCBUMV9FcnJvciwgVDFfT3V0bGluZSwgZXRjLi4gICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI3VuZGVmICBSRURFRklORQorI2RlZmluZSBSRURFRklORSggdHlwZSApICAgdHlwZWRlZiBGVF8jI3R5cGUgIFQxXyMjdHlwZQorCisKKyAgLyogPFR5cGU+IFQxX0Jvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSBzaW1wbGUgdHlwZWRlZiBvZiB1bnNpZ25lZCBjaGFyLCB1c2VkIGZvciBzaW1wbGUgYm9vbGVhbnMuICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgUkVERUZJTkUoIEJvb2wgKTsKKworCisgIC8qIDxUeXBlPiBUMV9GV29yZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGEgc2lnbmVkIDE2LWJpdCBpbnRlZ2VyIHVzZWQgdG8gc3RvcmUgYSBkaXN0YW5jZSBpbiBvcmlnaW5hbCAgICAgICovCisgIC8qICAgIGZvbnQgdW5pdHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIFJFREVGSU5FKCBGV29yZCApOworCisKKyAgLyogPFR5cGU+IFQxX1VGV29yZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgYW4gdW5zaWduZWQgMTYtYml0IGludGVnZXIgdXNlZCB0byBzdG9yZSBhIGRpc3RhbmNlIGluIG9yaWdpbmFsICAgKi8KKyAgLyogICAgZm9udCB1bml0cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgUkVERUZJTkUoIFVGV29yZCApOworCisKKyAgLyogPFR5cGU+IFQxX0NoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgYSBzaW1wbGUgdHlwZWRlZiBmb3IgdGhlIF9zaWduZWRfIGNoYXIgdHlwZS4gICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgUkVERUZJTkUoIENoYXIgKTsKKworCisgIC8qIDxUeXBlPiBUMV9CeXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGEgc2ltcGxlIHR5cGVkZWYgZm9yIHRoZSBfdW5zaWduZWRfIGNoYXIgdHlwZS4gICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIFJFREVGSU5FKCBCeXRlICk7CisKKworICAvKiA8VHlwZT4gVDFfU3RyaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBhIHNpbXBsZSB0eXBlZGVmIGZvciB0aGUgY2hhciB0eXBlLCB1c2VkIGZvciBzdHJpbmdzIHVzdWFsbHkuICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBSRURFRklORSggU3RyaW5nICk7CisKKworICAvKiA8VHlwZT4gVDFfU2hvcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBhIHR5cGVkZWYgZm9yIHNpZ25lZCBzaG9ydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBSRURFRklORSggU2hvcnQgKTsKKworCisgIC8qIDxUeXBlPiBUMV9VU2hvcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGEgdHlwZWRlZiBmb3IgdW5zaWduZWQgc2hvcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIFJFREVGSU5FKCBVU2hvcnQgKTsKKworCisgIC8qIDxUeXBlPiBGVF9JbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGEgdHlwZWRlZiBmb3IgdGhlIGludCB0eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIFJFREVGSU5FKCBJbnQgKTsKKworCisgIC8qIDxUeXBlPiBGVF9VSW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGEgdHlwZWRlZiBmb3IgdGhlIHVuc2lnbmVkIGludCB0eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIFJFREVGSU5FKCBVSW50ICk7CisKKworICAvKiA8VHlwZT4gVDFfTG9uZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBhIHR5cGVkZWYgZm9yIHNpZ25lZCBsb25nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBSRURFRklORSggTG9uZyApOworCisKKyAgLyogPFR5cGU+IFQxX1VMb25nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgYSB0eXBlZGVmIGZvciB1bnNpZ25lZCBsb25nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgUkVERUZJTkUoIFVMb25nICk7CisKKworICAvKiA8VHlwZT4gVDFfRjJEb3QxNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBhIHNpZ25lZCAyLjE0IGZpeGVkIGZsb2F0IHVzZWQgZm9yIHVuaXQgdmVjdG9ycyAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIFJFREVGSU5FKCBGMkRvdDE0ICk7CisKKworICAvKiA8VHlwZT4gVDFfRjI2RG90NiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBhIHNpZ25lZCAyNi42IGZpeGVkIGZsb2F0IHVzZWQgZm9yIHZlY3RvcmlhbCBwaXhlbCBjb29yZGluYXRlcyAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIFJFREVGSU5FKCBGMjZEb3Q2ICk7CisKKworICAvKiA8VHlwZT4gVDFfRml4ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgVGhpcyB0eXBlIGlzIHVzZWQgdG8gc3RvcmUgMTYuMTYgZml4ZWQgZmxvYXQgdmFsdWVzLCBsaWtlICAgICAgICAgKi8KKyAgLyogICAgIHNjYWxlcyBvciBtYXRyaXggY29lZmZpY2llbnRzLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBSRURFRklORSggRml4ZWQgKTsKKworCisgIC8qIDxUeXBlPiBUMV9Qb3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICBUaGUgdHlwZSBUMV9Qb3MgaXMgYSAzMi1iaXRzIGludGVnZXIgdXNlZCB0byBzdG9yZSB2ZWN0b3JpYWwgICAqLworICAvKiAgICAgY29vcmRpbmF0ZXMuIERlcGVuZGluZyBvbiB0aGUgY29udGV4dCwgdGhlc2UgY2FuIHJlcHJlc2VudCAgICAgKi8KKyAgLyogICAgIGRpc3RhbmNlcyBpbiBpbnRlZ2VyIGZvbnQgdW5pdHMsIG9yIDI2LjYgZml4ZWQgZmxvYXQgcGl4ZWwgICAgICovCisgIC8qICAgICBjb29yZGluYXRlcy4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgUkVERUZJTkUoIFBvcyApOworCisKKyAgLyogPFN0cnVjdD4gVDFfVmVjdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgIEEgc2ltcGxlIHN0cnVjdHVyZSB1c2VkIHRvIHN0b3JlIGEgMmQgdmVjdG9yLCBjb29yZGluYXRlcyAgICAgICovCisgIC8qICAgICBhcmUgb2YgdGhlIFQxX1BvcyB0eXBlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHggIDo6ICBob3Jpem9udGFsIGNvb3JkaW5hdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB5ICA6OiAgdmVydGljYWwgY29vcmRpbmF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIFJFREVGSU5FKCBWZWN0b3IgKTsKKworICAvKiA8U3RydWN0PiBUMV9Vbml0VmVjdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgQSBzaW1wbGUgc3RydWN0dXJlIHVzZWQgdG8gc3RvcmUgYSAyZCB2ZWN0b3IgdW5pdCB2ZWN0b3IuICAgICAgKi8KKyAgLyogICAgIHVzZXMgVDFfRjJEb3QxNCB0eXBlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgeCAgOjogIGhvcml6b250YWwgY29vcmRpbmF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHkgIDo6ICB2ZXJ0aWNhbCBjb29yZGluYXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgUkVERUZJTkUoIFVuaXRWZWN0b3IgKTsKKworCisgIC8qIDxTdHJ1Y3Q+IFQxX01hdHJpeCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICBBIHNpbXBsZSBzdHJ1Y3R1cmUgdXNlZCB0byBzdG9yZSBhIDJ4MiBtYXRyaXguIENvZWZmaWNpZW50cyAgICAqLworICAvKiAgICAgYXJlIGluIDE2LjE2IGZpeGVkIGZsb2F0IGZvcm1hdC4gVGhlIGNvbXB1dGF0aW9uIHBlcmZvcm1lZCAgICAgKi8KKyAgLyogICAgIGlzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgIHgnID0geCp4eCArIHkqeHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICB5JyA9IHgqeXggKyB5Knl5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICB4eCAgOjogbWF0cml4IGNvZWZmaWNpZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgeHkgIDo6IG1hdHJpeCBjb2VmZmljaWVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgIHl4ICA6OiBtYXRyaXggY29lZmZpY2llbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICB5eSAgOjogbWF0cml4IGNvZWZmaWNpZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgUkVERUZJTkUoIE1hdHJpeCApOworCisKKyAgLyogPFN0cnVjdD4gVDFfQkJveCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgIEEgc3RydWN0dXJlIHVzZWQgdG8gaG9sZCBhbiBvdXRsaW5lJ3MgYm91bmRpbmcgYm94LCBpLmUuICAgICAgICovCisgIC8qICAgICB0aGUgY29vcmRpbmF0ZXMgb2YgaXRzIGV4dHJlbWEgaW4gdGhlIGhvcml6b250YWwgYW5kIHZlcnRpY2FsICAqLworICAvKiAgICAgZGlyZWN0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgeE1pbiAgIDo6ICB0aGUgaG9yaXpvbnRhbCBtaW5pbXVtICAobGVmdC1tb3N0KSAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgIHlNaW4gICA6OiAgdGhlIHZlcnRpY2FsIG1pbmltdW0gICAgKGJvdHRvbS1tb3N0KSAgICAgICAgICAgICAgICovCisgIC8qICAgICB4TWF4ICAgOjogIHRoZSBob3Jpem9udGFsIG1heGltdW0gIChyaWdodC1tb3N0KSAgICAgICAgICAgICAgICAqLworICAvKiAgICAgeU1heCAgIDo6ICB0aGUgdmVydGljYWwgbWF4aW11bSAgICAodG9wLW1vc3QpICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIFJFREVGSU5FKCBCQm94ICk7CisKKworICAvKiA8VHlwZT4gVDFfRXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGUgRnJlZVR5cGUgZXJyb3IgY29kZSB0eXBlLiBBIHZhbHVlIG9mIDAgaXMgYWx3YXlzICAgICAgICAgICAgKi8KKyAgLyogICAgaW50ZXJwcmV0ZWQgYXMgYSBzdWNjZXNmdWwgb3BlcmF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBSRURFRklORSggRXJyb3IgKTsKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqLworLyoqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiovCisvKioqICAgICAgICAgICAgICAgIFJFUVVJUkVEIFRZUEUxL1RZUEUyIFRBQkxFUyBERUZJTklUSU9OUyAgICAgICAgICAgICoqKi8KKy8qKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqLworLyoqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxTdHJ1Y3Q+IFQxX0ZvbnRJbmZvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoZSBGb250SW5mbyBkaWN0aW9uYXJ5IHN0cnVjdHVyZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHZlcnNpb24gICAgICAgICAgICAgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbm90aWNlICAgICAgICAgICAgICA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBmdWxsX25hbWUgICAgICAgICAgIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZhbWlseV9uYW1lICAgICAgICAgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgd2VpZ2h0ICAgICAgICAgICAgICA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBpdGFsaWNfYW5nbGUgICAgICAgIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGlzX2ZpeGVkX3BpdGNoICAgICAgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgdW5kZXJsaW5lX3Bvc2l0aW9uICA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB1bmRlcmxpbmVfdGhpY2tuZXNzIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBzdHJ1Y3QgVDFfRm9udEluZm9fCisgIHsKKyAgICBUMV9TdHJpbmcqICAgICB2ZXJzaW9uOworICAgIFQxX1N0cmluZyogICAgIG5vdGljZTsKKyAgICBUMV9TdHJpbmcqICAgICBmdWxsX25hbWU7CisgICAgVDFfU3RyaW5nKiAgICAgZmFtaWx5X25hbWU7CisgICAgVDFfU3RyaW5nKiAgICAgd2VpZ2h0OworICAgIFQxX0xvbmcgICAgICAgIGl0YWxpY19hbmdsZTsKKyAgICBUMV9Cb29sICAgICAgICBpc19maXhlZF9waXRjaDsKKyAgICBUMV9TaG9ydCAgICAgICB1bmRlcmxpbmVfcG9zaXRpb247CisgICAgVDFfVVNob3J0ICAgICAgdW5kZXJsaW5lX3RoaWNrbmVzczsKKworICB9IFQxX0ZvbnRJbmZvOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxTdHJ1Y3Q+IFQxX1ByaXZhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoZSBQcml2YXRlIGRpY3Rpb25hcnkgc3RydWN0dXJlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHVuaXF1ZV9pZCA6OiB0aGUgZm9udCdzIHVuaXF1ZSBpZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbGVuSVYgICAgIDo6IGxlbmd0aCBvZiBkZWNyeXB0IHBhZGRpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG51bV9ibHVlcyAgICAgICAgICAgICAgOjogbnVtYmVyIG9mIGJsdWUgdmFsdWVzICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbnVtX290aGVyX2JsdWVzICAgICAgICA6OiBudW1iZXIgb2Ygb3RoZXIgYmx1ZSB2YWx1ZXMgICAgICAgICAgICAqLworICAvKiAgICBudW1fZmFtaWx5X2JsdWVzICAgICAgIDo6IG51bWJlciBvZiBmYW1pbHkgYmx1ZSB2YWx1ZXMgICAgICAgICAgICovCisgIC8qICAgIG51bV9mYW1pbHlfb3RoZXJfYmx1ZXMgOjogbnVtYmVyIG9mIGZhbWlseSBvdGhlciBibHVlIHZhbHVlcyAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBibHVlX3ZhbHVlcyAgICAgICAgOjogYXJyYXkgb2YgYmx1ZSB2YWx1ZXMgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG90aGVyX2JsdWVzICAgICAgICA6OiBhcnJheSBvZiBvdGhlciBibHVlIHZhbHVlcyAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZmFtaWx5X2JsdWVzICAgICAgIDo6IGFycmF5IG9mIGZhbWlseSBibHVlIHZhbHVlcyAgICAgICAgICAgICAgICAqLworICAvKiAgICBmYW1pbHlfb3RoZXJfYmx1ZXMgOjogYXJyYXkgb2YgZmFtaWx5IG90aGVyIGJsdWUgdmFsdWVzICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgYmx1ZV9zY2FsZSAgICAgICAgIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBibHVlX3NoaWZ0ICAgICAgICAgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGJsdWVfc2NhbGUgICAgICAgICA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzdGFuZGFyZF93aWR0aCAgICAgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHN0YW5kYXJkX2hlaWdodCAgICA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBudW1fc25hcF93aWR0aHMgICAgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG51bV9zbmFwX2hlaWdodHMgICA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZm9yY2VfYm9sZCAgICAgICAgIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICByb3VuZF9zdGVtX3VwICAgICAgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgc3RlbV9zbmFwX3dpZHRocyAgIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzdGVtX3NuYXBfaGVpZ2h0cyAgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbGFuZ3VhZ2VfZ3JvdXAgICAgIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBwYXNzd29yZCAgICAgICAgICAgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbWluX2ZlYXR1cmUgICAgICAgIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBzdHJ1Y3QgVDFfUHJpdmF0ZV8KKyAgeworICAgIFQxX0ludCAgICAgICB1bmlxdWVfaWQ7CisgICAgVDFfSW50ICAgICAgIGxlbklWOworCisgICAgVDFfQnl0ZSAgICAgIG51bV9ibHVlczsKKyAgICBUMV9CeXRlICAgICAgbnVtX290aGVyX2JsdWVzOworICAgIFQxX0J5dGUgICAgICBudW1fZmFtaWx5X2JsdWVzOworICAgIFQxX0J5dGUgICAgICBudW1fZmFtaWx5X290aGVyX2JsdWVzOworCisgICAgVDFfU2hvcnQgICAgIGJsdWVfdmFsdWVzWzE0XTsKKyAgICBUMV9TaG9ydCAgICAgb3RoZXJfYmx1ZXNbMTBdOworCisgICAgVDFfU2hvcnQgICAgIGZhbWlseV9ibHVlcyAgICAgIFsxNF07CisgICAgVDFfU2hvcnQgICAgIGZhbWlseV9vdGhlcl9ibHVlc1sxMF07CisKKyAgICBUMV9GaXhlZCAgICAgYmx1ZV9zY2FsZTsKKyAgICBUMV9JbnQgICAgICAgYmx1ZV9zaGlmdDsKKyAgICBUMV9JbnQgICAgICAgYmx1ZV9mdXp6OworCisgICAgVDFfVVNob3J0ICAgIHN0YW5kYXJkX3dpZHRoOworICAgIFQxX1VTaG9ydCAgICBzdGFuZGFyZF9oZWlnaHQ7CisKKyAgICBUMV9CeXRlICAgICAgbnVtX3NuYXBfd2lkdGhzOworICAgIFQxX0J5dGUgICAgICBudW1fc25hcF9oZWlnaHRzOworICAgIFQxX0Jvb2wgICAgICBmb3JjZV9ib2xkOworICAgIFQxX0Jvb2wgICAgICByb3VuZF9zdGVtX3VwOworCisgICAgVDFfU2hvcnQgICAgIHN0ZW1fc25hcF93aWR0aHMgWzEzXTsgIC8qIHJlc2VydmUgb25lIHBsYWNlIGZvciB0aGUgc3RkICovCisgICAgVDFfU2hvcnQgICAgIHN0ZW1fc25hcF9oZWlnaHRzWzEzXTsgIC8qIHJlc2VydmUgb25lIHBsYWNlIGZvciB0aGUgc3RkICovCisKKyAgICBUMV9Mb25nICAgICAgbGFuZ3VhZ2VfZ3JvdXA7CisgICAgVDFfTG9uZyAgICAgIHBhc3N3b3JkOworCisgICAgVDFfU2hvcnQgICAgIG1pbl9mZWF0dXJlWzJdOworCisgIH0gVDFfUHJpdmF0ZTsKKworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxTdHJ1Y3Q+IFQxX1ByaXZhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoZSBQcml2YXRlIGRpY3Rpb25hcnkgc3RydWN0dXJlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG51bV9jaGFycyAgIDo6IG51bWJlciBvZiBjaGFyIGNvZGVzIGluIGVuY29kaW5nLiBVc3VhbGx5IDI1NiAgICAgKi8KKyAgLyogICAgY29kZV9maXJzdCAgOjogbG93ZXIgY2hhciBjb2RlIGluIGVuY29kaW5nICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBjb2RlX2xhc3QgICA6OiBoaWdoZXIgY2hhciBjb2RlIGluIGVuY29kaW5nICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgY2hhcl9jb2RlICAgOjogYXJyYXkgb2YgY2hhcmFjdGVyIGNvZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBjaGFyX2luZGV4ICA6OiBhcnJheSBvZiBjb3JyZXBzb25kaW5nIGdseXBoIGluZGljZXMgICAgICAgICAgICAgICovCisgIC8qICAgIGNoYXJfbmFtZSAgIDo6IGFycmF5IG9mIGNvcnJlcHNvbmRpbmcgZ2x5cGggbmFtZXMgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHN0cnVjdCBUMV9FbmNvZGluZ18KKyAgeworICAgIFQxX0ludCAgICAgIG51bV9jaGFyczsKKyAgICBUMV9JbnQgICAgICBjb2RlX2ZpcnN0OworICAgIFQxX0ludCAgICAgIGNvZGVfbGFzdDsKKworICAgIFQxX1Nob3J0KiAgIGNoYXJfaW5kZXg7CisgICAgVDFfU3RyaW5nKiogY2hhcl9uYW1lOworCisgIH0gVDFfRW5jb2Rpbmc7CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KKy8qKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqLworLyoqKiAgICAgICAgICAgICAgICAgIE9SSUdJTkFMIFRUX0ZBQ0UgQ0xBU1MgREVGSU5JVElPTiAgICAgICAgICAgICAgICAqKiovCisvKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KKy8qKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiovCisvKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KKy8qKiogICAgVGhpcyBzdHJ1Y3R1cmUvY2xhc3MgaXMgZGVmaW5lZCBoZXJlIGJlY2F1c2UgaXQgaXMgY29tbW9uICAgICAgKioqLworLyoqKiAgICB0byB0aGUgZm9sbG93aW5nIGZvcm1hdHMgOiBUVEYsIE9wZW5UeXBlLVRUIGFuZCBPcGVuVHlwZS1DRkYgICAqKiovCisvKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KKy8qKiogICAgTm90ZSBob3dldmVyIHRoYXQgdGhlIGNsYXNzZXMgVFRfU2l6ZSwgVFRfR2x5cGhTbG90IGFuZCAgICAgICAgKioqLworLyoqKiAgICBUVF9DaGFyTWFwIGFyZSBub3Qgc2hhcmVkIGJldHdlZW4gZm9udCBkcml2ZXJzLCBhbmQgYXJlICAgICAgICAqKiovCisvKioqICAgIHRodXMgZGVmaW5lZCBub3JtYWxseSBpbiAiZHJpdmVycy90cnVldHlwZS90dG9ianMuaCIgICAgICAgICAgICoqKi8KKy8qKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqLworLyoqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworICB0eXBlZGVmIHN0cnVjdCBUMV9GYWNlUmVjXyogICBUMV9GYWNlOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogIFQxX0ZhY2UgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVHlwZTEgZmFjZSByZWNvcmQuLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICB0eXBlZGVmIHN0cnVjdCBUMV9GYWNlUmVjXworICB7CisgICAgRlRfRmFjZVJlYyAgICAgIHJvb3Q7CisKKyAgICBUMV9Gb250SW5mbyAgICAgZm9udF9pbmZvOworICAgIEZUX1N0cmluZyogICAgICBmb250X25hbWU7CisKKyAgICBUMV9FbmNvZGluZyAgICAgZW5jb2Rpbmc7CisKKyAgICBUMV9CeXRlKiAgICAgICAgc3VicnNfYmxvY2s7CisgICAgVDFfQnl0ZSogICAgICAgIGNoYXJzdHJpbmdzX2Jsb2NrOworCisgICAgVDFfSW50ICAgICAgICAgIG51bV9zdWJyczsKKyAgICBUMV9CeXRlKiogICAgICAgc3VicnM7CisgICAgVDFfSW50KiAgICAgICAgIHN1YnJzX2xlbjsKKworICAgIFQxX0ludCAgICAgICAgICBudW1fZ2x5cGhzOworICAgIFQxX1N0cmluZyoqICAgICBnbHlwaF9uYW1lczsgICAgICAgLyogYXJyYXkgb2YgZ2x5cGggbmFtZXMgICAgICAgKi8KKyAgICBUMV9CeXRlKiogICAgICAgY2hhcnN0cmluZ3M7ICAgICAgIC8qIGFycmF5IG9mIGdseXBoIGNoYXJzdHJpbmdzICovCisgICAgVDFfSW50KiAgICAgICAgIGNoYXJzdHJpbmdzX2xlbjsKKworICAgIFQxX0J5dGUgICAgICAgICBwYWludF90eXBlOworICAgIFQxX0J5dGUgICAgICAgICBmb250X3R5cGU7CisgICAgVDFfTWF0cml4ICAgICAgIGZvbnRfbWF0cml4OworICAgIFQxX0JCb3ggICAgICAgICBmb250X2Jib3g7CisgICAgVDFfTG9uZyAgICAgICAgIHVuaXF1ZV9pZDsKKyAgICBUMV9Mb25nICAgICAgICAgZm9udF9pZDsKKworICAgIFQxX0ludCAgICAgICAgICBzdHJva2Vfd2lkdGg7CisgICAgVDFfUHJpdmF0ZSAgICAgIHByaXZhdGVfZGljdDsKKworICB9IFQxX0ZhY2VSZWM7CisKKworI2VuZGlmIC8qIFQxVFlQRVNfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3NoYXJlZC90dGVycm9ycy5oIGIvc3JjL3NoYXJlZC90dGVycm9ycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4YzZiNWYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvc2hhcmVkL3R0ZXJyb3JzLmgKQEAgLTAsMCArMSwxMjYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHR0ZXJyb3JzLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBUcnVlVHlwZSBlcnJvciBJRCBkZWZpbml0aW9ucyAoc3BlY2lmaWNhdGlvbiBvbmx5KS4gICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMTk5Ni0xOTk5IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQgICAgICAgICovCisvKiAgbW9kaWZpZWQgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICAqLworLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KKy8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCisvKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2lmbmRlZiBUVEVSUk9SU19ICisjZGVmaW5lIFRURVJST1JTX0gKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogRXJyb3IgY29kZXMgZGVjbGFyYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBUaGUgZXJyb3IgY29kZXMgYXJlIGdyb3VwZWQgaW4gYGNsYXNzZXMnIHVzZWQgdG8gaW5kaWNhdGUgdGhlIGBsZXZlbCcgKi8KKyAgLyogYXQgd2hpY2ggdGhlIGVycm9yIGhhcHBlbmVkLiAgVGhlIGNsYXNzIGlzIGdpdmVuIGJ5IGFuIGVycm9yIGNvZGUncyAgICovCisgIC8qIGhpZ2ggYnl0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworICAvKiBTdWNjZXNzIGlzIGFsd2F5cyAwLiAqLworCisjZGVmaW5lICBUVF9FcnJfT2sgICAgICAgICAgICAgICAgICAgICAgIEZUX0Vycl9PaworCisgIC8qIEhpZ2ggbGV2ZWwgQVBJIGVycm9ycy4gKi8KKworI2RlZmluZSAgVFRfRXJyX0ludmFsaWRfRmlsZV9Gb3JtYXQgICAgICBGVF9FcnJfSW52YWxpZF9GaWxlX0Zvcm1hdAorI2RlZmluZSAgVFRfRXJyX0ludmFsaWRfQXJndW1lbnQgICAgICAgICBGVF9FcnJfSW52YWxpZF9Bcmd1bWVudAorI2RlZmluZSAgVFRfRXJyX0ludmFsaWRfRHJpdmVyX0hhbmRsZSAgICBGVF9FcnJfSW52YWxpZF9Ecml2ZXJfSGFuZGxlCisjZGVmaW5lICBUVF9FcnJfSW52YWxpZF9GYWNlX0hhbmRsZSAgICAgIEZUX0Vycl9JbnZhbGlkX0ZhY2VfSGFuZGxlCisjZGVmaW5lICBUVF9FcnJfSW52YWxpZF9JbnN0YW5jZV9IYW5kbGUgIEZUX0Vycl9JbnZhbGlkX1NpemVfSGFuZGxlCisjZGVmaW5lICBUVF9FcnJfSW52YWxpZF9HbHlwaF9IYW5kbGUgICAgIEZUX0Vycl9JbnZhbGlkX1Nsb3RfSGFuZGxlCisjZGVmaW5lICBUVF9FcnJfSW52YWxpZF9DaGFyTWFwX0hhbmRsZSAgIEZUX0Vycl9JbnZhbGlkX0NoYXJNYXBfSGFuZGxlCisjZGVmaW5lICBUVF9FcnJfSW52YWxpZF9HbHlwaF9JbmRleCAgICAgIEZUX0Vycl9JbnZhbGlkX0dseXBoX0luZGV4CisKKyNkZWZpbmUgIFRUX0Vycl9VbmltcGxlbWVudGVkX0ZlYXR1cmUgICAgRlRfRXJyX1VuaW1wbGVtZW50ZWRfRmVhdHVyZQorI2RlZmluZSAgVFRfRXJyX1VuYXZhaWxhYmxlX091dGxpbmUgICAgICBGVF9FcnJfVW5hdmFpbGFibGVfT3V0bGluZQorI2RlZmluZSAgVFRfRXJyX1VuYXZhaWxhYmxlX0JpdG1hcCAgICAgICBGVF9FcnJfVW5hdmFpbGFibGVfQml0bWFwCisjZGVmaW5lICBUVF9FcnJfVW5hdmFpbGFibGVfUGl4bWFwICAgICAgIEZUX0Vycl9VbmF2YWlsYWJsZV9QaXhtYXAKKyNkZWZpbmUgIFRUX0Vycl9GaWxlX0lzX05vdF9Db2xsZWN0aW9uICAgRlRfRXJyX0ZpbGVfSXNfTm90X0NvbGxlY3Rpb24KKworI2RlZmluZSAgVFRfRXJyX0ludmFsaWRfRW5naW5lICAgICAgICAgICBGVF9FcnJfSW52YWxpZF9Ecml2ZXJfSGFuZGxlCisKKyAgLyogSW50ZXJuYWwgZXJyb3JzLiAqLworCisjZGVmaW5lICBUVF9FcnJfT3V0X09mX01lbW9yeSAgICAgICAgICAgIEZUX0Vycl9PdXRfT2ZfTWVtb3J5CisjZGVmaW5lICBUVF9FcnJfVW5saXN0ZWRfT2JqZWN0ICAgICAgICAgIEZUX0Vycl9Vbmxpc3RlZF9PYmplY3QKKworICAvKiBHZW5lcmFsIGdseXBoIG91dGxpbmUgZXJyb3JzLiAqLworCisjZGVmaW5lICBUVF9FcnJfVG9vX01hbnlfUG9pbnRzICAgICAgICAgIEZUX0Vycl9Ub29fTWFueV9Qb2ludHMKKyNkZWZpbmUgIFRUX0Vycl9Ub29fTWFueV9Db250b3VycyAgICAgICAgRlRfRXJyX1Rvb19NYW55X0NvbnRvdXJzCisjZGVmaW5lICBUVF9FcnJfVG9vX01hbnlfSW5zICAgICAgICAgICAgIEZUX0Vycl9Ub29fTWFueV9IaW50cworI2RlZmluZSAgVFRfRXJyX0ludmFsaWRfQ29tcG9zaXRlICAgICAgICBGVF9FcnJfSW52YWxpZF9Db21wb3NpdGUKKworICAvKiBCeXRlY29kZSBpbnRlcnByZXRlciBlcnJvciBjb2Rlcy4gKi8KKworICAvKiBUaGVzZSBlcnJvciBjb2RlcyBhcmUgcHJvZHVjZWQgYnkgdGhlIFRydWVUeXBlICovCisgIC8qIGJ5dGVjb2RlIGludGVycHJldGVyLiAgVGhleSB1c3VhbGx5IGluZGljYXRlIGEgKi8KKyAgLyogYnJva2VuIGZvbnQgZmlsZSwgYSBicm9rZW4gZ2x5cGggd2l0aGluIGEgZm9udCAqLworICAvKiBmaWxlLCBvciBhIGJ1ZyBpbiB0aGUgaW50ZXJwcmV0ZXIhICAgICAgICAgICAgICovCisKKyNkZWZpbmUgVFRfRXJyX0ludmFsaWRfT3Bjb2RlICAgICAgICAgICAgIDB4NDAwCisjZGVmaW5lIFRUX0Vycl9Ub29fRmV3X0FyZ3VtZW50cyAgICAgICAgICAweDQwMQorI2RlZmluZSBUVF9FcnJfU3RhY2tfT3ZlcmZsb3cgICAgICAgICAgICAgMHg0MDIKKyNkZWZpbmUgVFRfRXJyX0NvZGVfT3ZlcmZsb3cgICAgICAgICAgICAgIDB4NDAzCisjZGVmaW5lIFRUX0Vycl9CYWRfQXJndW1lbnQgICAgICAgICAgICAgICAweDQwNAorI2RlZmluZSBUVF9FcnJfRGl2aWRlX0J5X1plcm8gICAgICAgICAgICAgMHg0MDUKKyNkZWZpbmUgVFRfRXJyX1N0b3JhZ2VfT3ZlcmZsb3cgICAgICAgICAgIDB4NDA2CisjZGVmaW5lIFRUX0Vycl9DdnRfT3ZlcmZsb3cgICAgICAgICAgICAgICAweDQwNworI2RlZmluZSBUVF9FcnJfSW52YWxpZF9SZWZlcmVuY2UgICAgICAgICAgMHg0MDgKKyNkZWZpbmUgVFRfRXJyX0ludmFsaWRfRGlzdGFuY2UgICAgICAgICAgIDB4NDA5CisjZGVmaW5lIFRUX0Vycl9JbnRlcnBvbGF0ZV9Ud2lsaWdodCAgICAgICAweDQwQQorI2RlZmluZSBUVF9FcnJfRGVidWdfT3BDb2RlICAgICAgICAgICAgICAgMHg0MEIKKyNkZWZpbmUgVFRfRXJyX0VOREZfSW5fRXhlY19TdHJlYW0gICAgICAgIDB4NDBDCisjZGVmaW5lIFRUX0Vycl9PdXRfT2ZfQ29kZVJhbmdlcyAgICAgICAgICAweDQwRAorI2RlZmluZSBUVF9FcnJfTmVzdGVkX0RFRlMgICAgICAgICAgICAgICAgMHg0MEUKKyNkZWZpbmUgVFRfRXJyX0ludmFsaWRfQ29kZVJhbmdlICAgICAgICAgIDB4NDBGCisjZGVmaW5lIFRUX0Vycl9JbnZhbGlkX0Rpc3BsYWNlbWVudCAgICAgICAweDQxMAorI2RlZmluZSBUVF9FcnJfRXhlY3V0aW9uX1Rvb19Mb25nICAgICAgICAgMHg0MTEKKyNkZWZpbmUgVFRfRXJyX1Rvb19NYW55X0Z1bmN0aW9uX0RlZnMgICAgIDB4NDEyCisjZGVmaW5lIFRUX0Vycl9Ub29fTWFueV9JbnN0cnVjdGlvbl9EZWZzICAweDQxMworCisgIC8qIE90aGVyIFRydWVUeXBlIHNwZWNpZmljIGVycm9yIGNvZGVzLiAqLworCisjZGVmaW5lIFRUX0Vycl9UYWJsZV9NaXNzaW5nICAgICAgICAgICAgMHg0MjAKKyNkZWZpbmUgVFRfRXJyX1Rvb19NYW55X0V4dGVuc2lvbnMgICAgICAweDQyMQorI2RlZmluZSBUVF9FcnJfRXh0ZW5zaW9uc19VbnN1cHBvcnRlZCAgIDB4NDIyCisjZGVmaW5lIFRUX0Vycl9JbnZhbGlkX0V4dGVuc2lvbl9JZCAgICAgMHg0MjMKKworI2RlZmluZSBUVF9FcnJfTm9fVmVydGljYWxfRGF0YSAgICAgICAgIDB4NDI0CisKKyNkZWZpbmUgVFRfRXJyX01heF9Qcm9maWxlX01pc3NpbmcgICAgICAweDQzMAorI2RlZmluZSBUVF9FcnJfSGVhZGVyX1RhYmxlX01pc3NpbmcgICAgIDB4NDMxCisjZGVmaW5lIFRUX0Vycl9Ib3Jpel9IZWFkZXJfTWlzc2luZyAgICAgMHg0MzIKKyNkZWZpbmUgVFRfRXJyX0xvY2F0aW9uc19NaXNzaW5nICAgICAgICAweDQzMworI2RlZmluZSBUVF9FcnJfTmFtZV9UYWJsZV9NaXNzaW5nICAgICAgIDB4NDM0CisjZGVmaW5lIFRUX0Vycl9DTWFwX1RhYmxlX01pc3NpbmcgICAgICAgMHg0MzUKKyNkZWZpbmUgVFRfRXJyX0htdHhfVGFibGVfTWlzc2luZyAgICAgICAweDQzNgorI2RlZmluZSBUVF9FcnJfT1MyX1RhYmxlX01pc3NpbmcgICAgICAgIDB4NDM3CisjZGVmaW5lIFRUX0Vycl9Qb3N0X1RhYmxlX01pc3NpbmcgICAgICAgMHg0MzgKKworI2RlZmluZSBUVF9FcnJfSW52YWxpZF9Ib3Jpel9NZXRyaWNzICAgIDB4NDQwCisjZGVmaW5lIFRUX0Vycl9JbnZhbGlkX0NoYXJNYXBfRm9ybWF0ICAgMHg0NDEKKyNkZWZpbmUgVFRfRXJyX0ludmFsaWRfUFBlbSAgICAgICAgICAgICAweDQ0MgorI2RlZmluZSBUVF9FcnJfSW52YWxpZF9WZXJ0X01ldHJpY3MgICAgIDB4NDQzCisKKyNkZWZpbmUgVFRfRXJyX0NvdWxkX05vdF9GaW5kX0NvbnRleHQgICAweDQ1MAorCisjZW5kaWYgLyogRlRFUlJJRF9IICovCisKKworLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvc2hhcmVkL3R0bmFtZWlkLmggYi9zcmMvc2hhcmVkL3R0bmFtZWlkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThiMTlhYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9zaGFyZWQvdHRuYW1laWQuaApAQCAtMCwwICsxLDYwMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgdHRuYW1laWQuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIFRydWVUeXBlIG5hbWUgSUQgZGVmaW5pdGlvbnMgKHNwZWNpZmljYXRpb24gb25seSkuICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAxOTk2LTE5OTkgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCAgICAgICAgKi8KKy8qICBtb2RpZmllZCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgICovCisvKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLworLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KKy8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjaWZuZGVmIEZSRUVUWVBFX0gKKyNlcnJvciAiRG9uJ3QgaW5jbHVkZSB0aGlzIGZpbGUhIFVzZSBmcmVldHlwZS5oIGluc3RlYWQuIgorI2VuZGlmCisKKworI2lmbmRlZiBUVE5BTUVJRF9ICisjZGVmaW5lIFRUTkFNRUlEX0gKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogUG9zc2libGUgdmFsdWVzIGZvciB0aGUgYFBsYXRmb3JtJyBpZGVudGlmaWVyIGNvZGUgaW4gdGhlIG5hbWUgICAgICAgICovCisgIC8qIHJlY29yZHMgb2YgdGhlIFRURiBgbmFtZScgdGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVFRfUExBVEZPUk1fQVBQTEVfVU5JQ09ERSAgMAorI2RlZmluZSBUVF9QTEFURk9STV9NQUNJTlRPU0ggICAgICAxCisjZGVmaW5lIFRUX1BMQVRGT1JNX0lTTyAgICAgICAgICAgIDIKKyNkZWZpbmUgVFRfUExBVEZPUk1fTUlDUk9TT0ZUICAgICAgMworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBQb3NzaWJsZSB2YWx1ZXMgb2YgdGhlIHBsYXRmb3JtIHNwZWNpZmljIGVuY29kaW5nIGlkZW50aWZpZXIgZmllbGQgaW4gKi8KKyAgLyogdGhlIG5hbWUgcmVjb3JkcyBvZiB0aGUgVFRGIGBuYW1lJyB0YWJsZSB3aGVuIHRoZSBgUGxhdGZvcm0nICAgICAgICAgICovCisgIC8qIGlkZW50aWZpZXIgY29kZSBpcyBUVF9QTEFURk9STV9BUFBMRV9VTklDT0RFLiAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVFRfQVBQTEVfSURfREVGQVVMVCAgICAgIDAKKyNkZWZpbmUgVFRfQVBQTEVfSURfVU5JQ09ERV8xXzEgIDEKKyNkZWZpbmUgVFRfQVBQTEVfSURfSVNPXzEwNjQ2ICAgIDIKKyNkZWZpbmUgVFRfQVBQTEVfSURfVU5JQ09ERV8yXzAgIDMKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogUG9zc2libGUgdmFsdWVzIG9mIHRoZSBwbGF0Zm9ybSBzcGVjaWZpYyBlbmNvZGluZyBpZGVudGlmaWVyIGZpZWxkIGluICovCisgIC8qIHRoZSBuYW1lIHJlY29yZHMgb2YgdGhlIFRURiBgbmFtZScgdGFibGUgd2hlbiB0aGUgYFBsYXRmb3JtJyAgICAgICAgICAqLworICAvKiBpZGVudGlmaWVyIGNvZGUgaXMgVFRfUExBVEZPUk1fTUFDSU5UT1NILiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRUX01BQ19JRF9ST01BTiAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBUVF9NQUNfSURfSkFQQU5FU0UgICAgICAgICAgICAgIDEKKyNkZWZpbmUgVFRfTUFDX0lEX1RSQURJVElPTkFMX0NISU5FU0UgICAyCisjZGVmaW5lIFRUX01BQ19JRF9LT1JFQU4gICAgICAgICAgICAgICAgMworI2RlZmluZSBUVF9NQUNfSURfQVJBQklDICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgVFRfTUFDX0lEX0hFQlJFVyAgICAgICAgICAgICAgICA1CisjZGVmaW5lIFRUX01BQ19JRF9HUkVFSyAgICAgICAgICAgICAgICAgNgorI2RlZmluZSBUVF9NQUNfSURfUlVTU0lBTiAgICAgICAgICAgICAgIDcKKyNkZWZpbmUgVFRfTUFDX0lEX1JTWU1CT0wgICAgICAgICAgICAgICA4CisjZGVmaW5lIFRUX01BQ19JRF9ERVZBTkFHQVJJICAgICAgICAgICAgOQorI2RlZmluZSBUVF9NQUNfSURfR1VSTVVLSEkgICAgICAgICAgICAgMTAKKyNkZWZpbmUgVFRfTUFDX0lEX0dVSkFSQVRJICAgICAgICAgICAgIDExCisjZGVmaW5lIFRUX01BQ19JRF9PUklZQSAgICAgICAgICAgICAgICAxMgorI2RlZmluZSBUVF9NQUNfSURfQkVOR0FMSSAgICAgICAgICAgICAgMTMKKyNkZWZpbmUgVFRfTUFDX0lEX1RBTUlMICAgICAgICAgICAgICAgIDE0CisjZGVmaW5lIFRUX01BQ19JRF9URUxVR1UgICAgICAgICAgICAgICAxNQorI2RlZmluZSBUVF9NQUNfSURfS0FOTkFEQSAgICAgICAgICAgICAgMTYKKyNkZWZpbmUgVFRfTUFDX0lEX01BTEFZQUxBTSAgICAgICAgICAgIDE3CisjZGVmaW5lIFRUX01BQ19JRF9TSU5IQUxFU0UgICAgICAgICAgICAxOAorI2RlZmluZSBUVF9NQUNfSURfQlVSTUVTRSAgICAgICAgICAgICAgMTkKKyNkZWZpbmUgVFRfTUFDX0lEX0tITUVSICAgICAgICAgICAgICAgIDIwCisjZGVmaW5lIFRUX01BQ19JRF9USEFJICAgICAgICAgICAgICAgICAyMQorI2RlZmluZSBUVF9NQUNfSURfTEFPVElBTiAgICAgICAgICAgICAgMjIKKyNkZWZpbmUgVFRfTUFDX0lEX0dFT1JHSUFOICAgICAgICAgICAgIDIzCisjZGVmaW5lIFRUX01BQ19JRF9BUk1FTklBTiAgICAgICAgICAgICAyNAorI2RlZmluZSBUVF9NQUNfSURfTUFMRElWSUFOICAgICAgICAgICAgMjUKKyNkZWZpbmUgVFRfTUFDX0lEX1NJTVBMSUZJRURfQ0hJTkVTRSAgIDI1CisjZGVmaW5lIFRUX01BQ19JRF9USUJFVEFOICAgICAgICAgICAgICAyNgorI2RlZmluZSBUVF9NQUNfSURfTU9OR09MSUFOICAgICAgICAgICAgMjcKKyNkZWZpbmUgVFRfTUFDX0lEX0dFRVogICAgICAgICAgICAgICAgIDI4CisjZGVmaW5lIFRUX01BQ19JRF9TTEFWSUMgICAgICAgICAgICAgICAyOQorI2RlZmluZSBUVF9NQUNfSURfVklFVE5BTUVTRSAgICAgICAgICAgMzAKKyNkZWZpbmUgVFRfTUFDX0lEX1NJTkRISSAgICAgICAgICAgICAgIDMxCisjZGVmaW5lIFRUX01BQ19JRF9VTklOVEVSUCAgICAgICAgICAgICAzMgorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBQb3NzaWJsZSB2YWx1ZXMgb2YgdGhlIHBsYXRmb3JtIHNwZWNpZmljIGVuY29kaW5nIGlkZW50aWZpZXIgZmllbGQgaW4gKi8KKyAgLyogdGhlIG5hbWUgcmVjb3JkcyBvZiB0aGUgVFRGIGBuYW1lJyB0YWJsZSB3aGVuIHRoZSBgUGxhdGZvcm0nICAgICAgICAgICovCisgIC8qIGlkZW50aWZpZXIgY29kZSBpcyBUVF9QTEFURk9STV9JU08uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVFRfSVNPX0lEXzdCSVRfQVNDSUkgIDAKKyNkZWZpbmUgVFRfSVNPX0lEXzEwNjQ2ICAgICAgIDEKKyNkZWZpbmUgVFRfSVNPX0lEXzg4NTlfMSAgICAgIDIKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogUG9zc2libGUgdmFsdWVzIG9mIHRoZSBwbGF0Zm9ybSBzcGVjaWZpYyBlbmNvZGluZyBpZGVudGlmaWVyIGZpZWxkIGluICovCisgIC8qIHRoZSBuYW1lIHJlY29yZHMgb2YgdGhlIFRURiBgbmFtZScgdGFibGUgd2hlbiB0aGUgYFBsYXRmb3JtJyAgICAgICAgICAqLworICAvKiBpZGVudGlmaWVyIGNvZGUgaXMgVFRfUExBVEZPUk1fTUlDUk9TT0ZULiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRUX01TX0lEX1NZTUJPTF9DUyAgIDAKKyNkZWZpbmUgVFRfTVNfSURfVU5JQ09ERV9DUyAgMQorI2RlZmluZSBUVF9NU19JRF9TSklTICAgICAgICAyCisjZGVmaW5lIFRUX01TX0lEX0dCMjMxMiAgICAgIDMKKyNkZWZpbmUgVFRfTVNfSURfQklHXzUgICAgICAgNAorI2RlZmluZSBUVF9NU19JRF9XQU5TVU5HICAgICA1CisjZGVmaW5lIFRUX01TX0lEX0pPSEFCICAgICAgIDYKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogUG9zc2libGUgdmFsdWVzIG9mIHRoZSBsYW5ndWFnZSBpZGVudGlmaWVyIGZpZWxkIGluIHRoZSBuYW1lIHJlY29yZHMgICovCisgIC8qIG9mIHRoZSBUVEYgYG5hbWUnIHRhYmxlIHdoZW4gdGhlIGBQbGF0Zm9ybScgaWRlbnRpZmllciBjb2RlIGlzICAgICAgICAqLworICAvKiBUVF9QTEFURk9STV9NQUNJTlRPU0guICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFRoZSBjYW5vbmljYWwgc291cmNlIGZvciB0aGUgQXBwbGUgYXNzaWduZWQgTGFuZ3VhZ2UgSUQncyBpcyBhdCAgICAgICAqLworICAvKiBodHRwOi8vZm9udHMuYXBwbGUuY29tL1RUUmVmTWFuL1JNMDYvQ2hhcDZuYW1lLmh0bWwuICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRUX01BQ19MQU5HSURfRU5HTElTSCAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFRUX01BQ19MQU5HSURfRlJFTkNIICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFRUX01BQ19MQU5HSURfR0VSTUFOICAgICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFRUX01BQ19MQU5HSURfSVRBTElBTiAgICAgICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIFRUX01BQ19MQU5HSURfRFVUQ0ggICAgICAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIFRUX01BQ19MQU5HSURfU1dFRElTSCAgICAgICAgICAgICAgICAgICAgICA1CisjZGVmaW5lIFRUX01BQ19MQU5HSURfU1BBTklTSCAgICAgICAgICAgICAgICAgICAgICA2CisjZGVmaW5lIFRUX01BQ19MQU5HSURfREFOSVNIICAgICAgICAgICAgICAgICAgICAgICA3CisjZGVmaW5lIFRUX01BQ19MQU5HSURfUE9SVFVHVUVTRSAgICAgICAgICAgICAgICAgICA4CisjZGVmaW5lIFRUX01BQ19MQU5HSURfTk9SV0VHSUFOICAgICAgICAgICAgICAgICAgICA5CisjZGVmaW5lIFRUX01BQ19MQU5HSURfSEVCUkVXICAgICAgICAgICAgICAgICAgICAgIDEwCisjZGVmaW5lIFRUX01BQ19MQU5HSURfSkFQQU5FU0UgICAgICAgICAgICAgICAgICAgIDExCisjZGVmaW5lIFRUX01BQ19MQU5HSURfQVJBQklDICAgICAgICAgICAgICAgICAgICAgIDEyCisjZGVmaW5lIFRUX01BQ19MQU5HSURfRklOTklTSCAgICAgICAgICAgICAgICAgICAgIDEzCisjZGVmaW5lIFRUX01BQ19MQU5HSURfR1JFRUsgICAgICAgICAgICAgICAgICAgICAgIDE0CisjZGVmaW5lIFRUX01BQ19MQU5HSURfSUNFTEFORElDICAgICAgICAgICAgICAgICAgIDE1CisjZGVmaW5lIFRUX01BQ19MQU5HSURfTUFMVEVTRSAgICAgICAgICAgICAgICAgICAgIDE2CisjZGVmaW5lIFRUX01BQ19MQU5HSURfVFVSS0lTSCAgICAgICAgICAgICAgICAgICAgIDE3CisjZGVmaW5lIFRUX01BQ19MQU5HSURfQ1JPQVRJQU4gICAgICAgICAgICAgICAgICAgIDE4CisjZGVmaW5lIFRUX01BQ19MQU5HSURfQ0hJTkVTRV9UUkFESVRJT05BTCAgICAgICAgIDE5CisjZGVmaW5lIFRUX01BQ19MQU5HSURfVVJEVSAgICAgICAgICAgICAgICAgICAgICAgIDIwCisjZGVmaW5lIFRUX01BQ19MQU5HSURfSElOREkgICAgICAgICAgICAgICAgICAgICAgIDIxCisjZGVmaW5lIFRUX01BQ19MQU5HSURfVEhBSSAgICAgICAgICAgICAgICAgICAgICAgIDIyCisjZGVmaW5lIFRUX01BQ19MQU5HSURfS09SRUFOICAgICAgICAgICAgICAgICAgICAgIDIzCisjZGVmaW5lIFRUX01BQ19MQU5HSURfTElUSFVBTklBTiAgICAgICAgICAgICAgICAgIDI0CisjZGVmaW5lIFRUX01BQ19MQU5HSURfUE9MSVNIICAgICAgICAgICAgICAgICAgICAgIDI1CisjZGVmaW5lIFRUX01BQ19MQU5HSURfSFVOR0FSSUFOICAgICAgICAgICAgICAgICAgIDI2CisjZGVmaW5lIFRUX01BQ19MQU5HSURfRVNUT05JQU4gICAgICAgICAgICAgICAgICAgIDI3CisjZGVmaW5lIFRUX01BQ19MQU5HSURfTEVUVElTSCAgICAgICAgICAgICAgICAgICAgIDI4CisjZGVmaW5lIFRUX01BQ19MQU5HSURfU0FBTUlTSyAgICAgICAgICAgICAgICAgICAgIDI5CisjZGVmaW5lIFRUX01BQ19MQU5HSURfRkFFUk9FU0UgICAgICAgICAgICAgICAgICAgIDMwCisjZGVmaW5lIFRUX01BQ19MQU5HSURfRkFSU0kgICAgICAgICAgICAgICAgICAgICAgIDMxCisjZGVmaW5lIFRUX01BQ19MQU5HSURfUlVTU0lBTiAgICAgICAgICAgICAgICAgICAgIDMyCisjZGVmaW5lIFRUX01BQ19MQU5HSURfQ0hJTkVTRV9TSU1QTElGSUVEICAgICAgICAgIDMzCisjZGVmaW5lIFRUX01BQ19MQU5HSURfRkxFTUlTSCAgICAgICAgICAgICAgICAgICAgIDM0CisjZGVmaW5lIFRUX01BQ19MQU5HSURfSVJJU0ggICAgICAgICAgICAgICAgICAgICAgIDM1CisjZGVmaW5lIFRUX01BQ19MQU5HSURfQUxCQU5JQU4gICAgICAgICAgICAgICAgICAgIDM2CisjZGVmaW5lIFRUX01BQ19MQU5HSURfUk9NQU5JQU4gICAgICAgICAgICAgICAgICAgIDM3CisjZGVmaW5lIFRUX01BQ19MQU5HSURfQ1pFQ0ggICAgICAgICAgICAgICAgICAgICAgIDM4CisjZGVmaW5lIFRUX01BQ19MQU5HSURfU0xPVkFLICAgICAgICAgICAgICAgICAgICAgIDM5CisjZGVmaW5lIFRUX01BQ19MQU5HSURfU0xPVkVOSUFOICAgICAgICAgICAgICAgICAgIDQwCisjZGVmaW5lIFRUX01BQ19MQU5HSURfWUlERElTSCAgICAgICAgICAgICAgICAgICAgIDQxCisjZGVmaW5lIFRUX01BQ19MQU5HSURfU0VSQklBTiAgICAgICAgICAgICAgICAgICAgIDQyCisjZGVmaW5lIFRUX01BQ19MQU5HSURfTUFDRURPTklBTiAgICAgICAgICAgICAgICAgIDQzCisjZGVmaW5lIFRUX01BQ19MQU5HSURfQlVMR0FSSUFOICAgICAgICAgICAgICAgICAgIDQ0CisjZGVmaW5lIFRUX01BQ19MQU5HSURfVUtSQUlOSUFOICAgICAgICAgICAgICAgICAgIDQ1CisjZGVmaW5lIFRUX01BQ19MQU5HSURfQllFTE9SVVNTSUFOICAgICAgICAgICAgICAgIDQ2CisjZGVmaW5lIFRUX01BQ19MQU5HSURfVVpCRUsgICAgICAgICAgICAgICAgICAgICAgIDQ3CisjZGVmaW5lIFRUX01BQ19MQU5HSURfS0FaQUtIICAgICAgICAgICAgICAgICAgICAgIDQ4CisjZGVmaW5lIFRUX01BQ19MQU5HSURfQVpFUkJBSUpBTkkgICAgICAgICAgICAgICAgIDQ5CisjZGVmaW5lIFRUX01BQ19MQU5HSURfQVpFUkJBSUpBTklfQVJBQklDX1NDUklQVCAgIDUwCisjZGVmaW5lIFRUX01BQ19MQU5HSURfQVJNRU5JQU4gICAgICAgICAgICAgICAgICAgIDUxCisjZGVmaW5lIFRUX01BQ19MQU5HSURfR0VPUkdJQU4gICAgICAgICAgICAgICAgICAgIDUyCisjZGVmaW5lIFRUX01BQ19MQU5HSURfTU9MREFWSUFOICAgICAgICAgICAgICAgICAgIDUzCisjZGVmaW5lIFRUX01BQ19MQU5HSURfS0lSR0hJWiAgICAgICAgICAgICAgICAgICAgIDU0CisjZGVmaW5lIFRUX01BQ19MQU5HSURfVEFKSUtJICAgICAgICAgICAgICAgICAgICAgIDU1CisjZGVmaW5lIFRUX01BQ19MQU5HSURfVFVSS01FTiAgICAgICAgICAgICAgICAgICAgIDU2CisjZGVmaW5lIFRUX01BQ19MQU5HSURfTU9OR09MSUFOICAgICAgICAgICAgICAgICAgIDU3CisjZGVmaW5lIFRUX01BQ19MQU5HSURfTU9OR09MSUFOX0NZUklMTElDX1NDUklQVCAgIDU4CisjZGVmaW5lIFRUX01BQ19MQU5HSURfUEFTSFRPICAgICAgICAgICAgICAgICAgICAgIDU5CisjZGVmaW5lIFRUX01BQ19MQU5HSURfS1VSRElTSCAgICAgICAgICAgICAgICAgICAgIDYwCisjZGVmaW5lIFRUX01BQ19MQU5HSURfS0FTSE1JUkkgICAgICAgICAgICAgICAgICAgIDYxCisjZGVmaW5lIFRUX01BQ19MQU5HSURfU0lOREhJICAgICAgICAgICAgICAgICAgICAgIDYyCisjZGVmaW5lIFRUX01BQ19MQU5HSURfVElCRVRBTiAgICAgICAgICAgICAgICAgICAgIDYzCisjZGVmaW5lIFRUX01BQ19MQU5HSURfTkVQQUxJICAgICAgICAgICAgICAgICAgICAgIDY0CisjZGVmaW5lIFRUX01BQ19MQU5HSURfU0FOU0tSSVQgICAgICAgICAgICAgICAgICAgIDY1CisjZGVmaW5lIFRUX01BQ19MQU5HSURfTUFSQVRISSAgICAgICAgICAgICAgICAgICAgIDY2CisjZGVmaW5lIFRUX01BQ19MQU5HSURfQkVOR0FMSSAgICAgICAgICAgICAgICAgICAgIDY3CisjZGVmaW5lIFRUX01BQ19MQU5HSURfQVNTQU1FU0UgICAgICAgICAgICAgICAgICAgIDY4CisjZGVmaW5lIFRUX01BQ19MQU5HSURfR1VKQVJBVEkgICAgICAgICAgICAgICAgICAgIDY5CisjZGVmaW5lIFRUX01BQ19MQU5HSURfUFVOSkFCSSAgICAgICAgICAgICAgICAgICAgIDcwCisjZGVmaW5lIFRUX01BQ19MQU5HSURfT1JJWUEgICAgICAgICAgICAgICAgICAgICAgIDcxCisjZGVmaW5lIFRUX01BQ19MQU5HSURfTUFMQVlBTEFNICAgICAgICAgICAgICAgICAgIDcyCisjZGVmaW5lIFRUX01BQ19MQU5HSURfS0FOTkFEQSAgICAgICAgICAgICAgICAgICAgIDczCisjZGVmaW5lIFRUX01BQ19MQU5HSURfVEFNSUwgICAgICAgICAgICAgICAgICAgICAgIDc0CisjZGVmaW5lIFRUX01BQ19MQU5HSURfVEVMVUdVICAgICAgICAgICAgICAgICAgICAgIDc1CisjZGVmaW5lIFRUX01BQ19MQU5HSURfU0lOSEFMRVNFICAgICAgICAgICAgICAgICAgIDc2CisjZGVmaW5lIFRUX01BQ19MQU5HSURfQlVSTUVTRSAgICAgICAgICAgICAgICAgICAgIDc3CisjZGVmaW5lIFRUX01BQ19MQU5HSURfS0hNRVIgICAgICAgICAgICAgICAgICAgICAgIDc4CisjZGVmaW5lIFRUX01BQ19MQU5HSURfTEFPICAgICAgICAgICAgICAgICAgICAgICAgIDc5CisjZGVmaW5lIFRUX01BQ19MQU5HSURfVklFVE5BTUVTRSAgICAgICAgICAgICAgICAgIDgwCisjZGVmaW5lIFRUX01BQ19MQU5HSURfSU5ET05FU0lBTiAgICAgICAgICAgICAgICAgIDgxCisjZGVmaW5lIFRUX01BQ19MQU5HSURfVEFHQUxPRyAgICAgICAgICAgICAgICAgICAgIDgyCisjZGVmaW5lIFRUX01BQ19MQU5HSURfTUFMQVlfUk9NQU5fU0NSSVBUICAgICAgICAgIDgzCisjZGVmaW5lIFRUX01BQ19MQU5HSURfTUFMQVlfQVJBQklDX1NDUklQVCAgICAgICAgIDg0CisjZGVmaW5lIFRUX01BQ19MQU5HSURfQU1IQVJJQyAgICAgICAgICAgICAgICAgICAgIDg1CisjZGVmaW5lIFRUX01BQ19MQU5HSURfVElHUklOWUEgICAgICAgICAgICAgICAgICAgIDg2CisjZGVmaW5lIFRUX01BQ19MQU5HSURfR0FMTEEgICAgICAgICAgICAgICAgICAgICAgIDg3CisjZGVmaW5lIFRUX01BQ19MQU5HSURfU09NQUxJICAgICAgICAgICAgICAgICAgICAgIDg4CisjZGVmaW5lIFRUX01BQ19MQU5HSURfU1dBSElMSSAgICAgICAgICAgICAgICAgICAgIDg5CisjZGVmaW5lIFRUX01BQ19MQU5HSURfUlVBTkRBICAgICAgICAgICAgICAgICAgICAgIDkwCisjZGVmaW5lIFRUX01BQ19MQU5HSURfUlVOREkgICAgICAgICAgICAgICAgICAgICAgIDkxCisjZGVmaW5lIFRUX01BQ19MQU5HSURfQ0hFV0EgICAgICAgICAgICAgICAgICAgICAgIDkyCisjZGVmaW5lIFRUX01BQ19MQU5HSURfTUFMQUdBU1kgICAgICAgICAgICAgICAgICAgIDkzCisjZGVmaW5lIFRUX01BQ19MQU5HSURfRVNQRVJBTlRPICAgICAgICAgICAgICAgICAgIDk0CisjZGVmaW5lIFRUX01BQ19MQU5HSURfV0VMU0ggICAgICAgICAgICAgICAgICAgICAgMTI4CisjZGVmaW5lIFRUX01BQ19MQU5HSURfQkFTUVVFICAgICAgICAgICAgICAgICAgICAgMTI5CisjZGVmaW5lIFRUX01BQ19MQU5HSURfQ0FUQUxBTiAgICAgICAgICAgICAgICAgICAgMTMwCisjZGVmaW5lIFRUX01BQ19MQU5HSURfTEFUSU4gICAgICAgICAgICAgICAgICAgICAgMTMxCisjZGVmaW5lIFRUX01BQ19MQU5HSURfUVVFQ0hVQSAgICAgICAgICAgICAgICAgICAgMTMyCisjZGVmaW5lIFRUX01BQ19MQU5HSURfR1VBUkFOSSAgICAgICAgICAgICAgICAgICAgMTMzCisjZGVmaW5lIFRUX01BQ19MQU5HSURfQVlNQVJBICAgICAgICAgICAgICAgICAgICAgMTM0CisjZGVmaW5lIFRUX01BQ19MQU5HSURfVEFUQVIgICAgICAgICAgICAgICAgICAgICAgMTM1CisjZGVmaW5lIFRUX01BQ19MQU5HSURfVUlHSFVSICAgICAgICAgICAgICAgICAgICAgMTM2CisjZGVmaW5lIFRUX01BQ19MQU5HSURfRFpPTkdLSEEgICAgICAgICAgICAgICAgICAgMTM3CisjZGVmaW5lIFRUX01BQ19MQU5HSURfSkFWQU5FU0UgICAgICAgICAgICAgICAgICAgMTM4CisjZGVmaW5lIFRUX01BQ19MQU5HSURfU1VOREFORVNFICAgICAgICAgICAgICAgICAgMTM5CisjZGVmaW5lIFRUX01BQ19MQU5HSURfU0NPVFRJU0hfR0FFTElDICAgICAgICAgICAgMTQwCisjZGVmaW5lIFRUX01BQ19MQU5HSURfSVJJU0hfR0FFTElDICAgICAgICAgICAgICAgMTQxCisjZGVmaW5lIFRUX01BQ19MQU5HSURfQlJFVE9OICAgICAgICAgICAgICAgICAgICAgMTQyCisjZGVmaW5lIFRUX01BQ19MQU5HSURfSU5VS1RJVFVUICAgICAgICAgICAgICAgICAgMTQzCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFBvc3NpYmxlIHZhbHVlcyBvZiB0aGUgbGFuZ3VhZ2UgaWRlbnRpZmllciBmaWVsZCBpbiB0aGUgbmFtZSByZWNvcmRzICAqLworICAvKiBvZiB0aGUgVFRGIGBuYW1lJyB0YWJsZSB3aGVuIHRoZSBgUGxhdGZvcm0nIGlkZW50aWZpZXIgY29kZSBpcyAgICAgICAgKi8KKyAgLyogVFRfUExBVEZPUk1fTUlDUk9TT0ZULiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBUaGUgY2Fub25pY2FsIHNvdXJjZSBmb3IgdGhlIE1TIGFzc2lnbmVkIExDSUQncyBpcyBhdCAgICAgICAgICAgICAgICAgKi8KKyAgLyogaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3R5cG9ncmFwaHkvT1RTUEVDL2xjaWQtY3AudHh0LiAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUVF9NU19MQU5HSURfQVJBQklDX1NBVURJX0FSQUJJQSAgICAgICAgICAgICAgIDB4MDQwMQorI2RlZmluZSBUVF9NU19MQU5HSURfQVJBQklDX0lSQVEgICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMQorI2RlZmluZSBUVF9NU19MQU5HSURfQVJBQklDX0VHWVBUICAgICAgICAgICAgICAgICAgICAgIDB4MGMwMQorI2RlZmluZSBUVF9NU19MQU5HSURfQVJBQklDX0xJQllBICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMQorI2RlZmluZSBUVF9NU19MQU5HSURfQVJBQklDX0FMR0VSSUEgICAgICAgICAgICAgICAgICAgIDB4MTQwMQorI2RlZmluZSBUVF9NU19MQU5HSURfQVJBQklDX01PUk9DQ08gICAgICAgICAgICAgICAgICAgIDB4MTgwMQorI2RlZmluZSBUVF9NU19MQU5HSURfQVJBQklDX1RVTklTSUEgICAgICAgICAgICAgICAgICAgIDB4MWMwMQorI2RlZmluZSBUVF9NU19MQU5HSURfQVJBQklDX09NQU4gICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMQorI2RlZmluZSBUVF9NU19MQU5HSURfQVJBQklDX1lFTUVOICAgICAgICAgICAgICAgICAgICAgIDB4MjQwMQorI2RlZmluZSBUVF9NU19MQU5HSURfQVJBQklDX1NZUklBICAgICAgICAgICAgICAgICAgICAgIDB4MjgwMQorI2RlZmluZSBUVF9NU19MQU5HSURfQVJBQklDX0pPUkRBTiAgICAgICAgICAgICAgICAgICAgIDB4MmMwMQorI2RlZmluZSBUVF9NU19MQU5HSURfQVJBQklDX0xFQkFOT04gICAgICAgICAgICAgICAgICAgIDB4MzAwMQorI2RlZmluZSBUVF9NU19MQU5HSURfQVJBQklDX0tVV0FJVCAgICAgICAgICAgICAgICAgICAgIDB4MzQwMQorI2RlZmluZSBUVF9NU19MQU5HSURfQVJBQklDX1VBRSAgICAgICAgICAgICAgICAgICAgICAgIDB4MzgwMQorI2RlZmluZSBUVF9NU19MQU5HSURfQVJBQklDX0JBSFJBSU4gICAgICAgICAgICAgICAgICAgIDB4M2MwMQorI2RlZmluZSBUVF9NU19MQU5HSURfQVJBQklDX1FBVEFSICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMQorI2RlZmluZSBUVF9NU19MQU5HSURfQlVMR0FSSUFOX0JVTEdBUklBICAgICAgICAgICAgICAgIDB4MDQwMgorI2RlZmluZSBUVF9NU19MQU5HSURfQ0FUQUxBTl9TUEFJTiAgICAgICAgICAgICAgICAgICAgIDB4MDQwMworI2RlZmluZSBUVF9NU19MQU5HSURfQ0hJTkVTRV9UQUlXQU4gICAgICAgICAgICAgICAgICAgIDB4MDQwNAorI2RlZmluZSBUVF9NU19MQU5HSURfQ0hJTkVTRV9QUkMgICAgICAgICAgICAgICAgICAgICAgIDB4MDgwNAorI2RlZmluZSBUVF9NU19MQU5HSURfQ0hJTkVTRV9IT05HX0tPTkcgICAgICAgICAgICAgICAgIDB4MGMwNAorI2RlZmluZSBUVF9NU19MQU5HSURfQ0hJTkVTRV9TSU5HQVBPUkUgICAgICAgICAgICAgICAgIDB4MTAwNAorI2RlZmluZSBUVF9NU19MQU5HSURfQ0hJTkVTRV9NQUNBVSAgICAgICAgICAgICAgICAgICAgIDB4MTQwNAorI2RlZmluZSBUVF9NU19MQU5HSURfQ1pFQ0hfQ1pFQ0hfUkVQVUJMSUMgICAgICAgICAgICAgIDB4MDQwNQorI2RlZmluZSBUVF9NU19MQU5HSURfREFOSVNIX0RFTk1BUksgICAgICAgICAgICAgICAgICAgIDB4MDQwNgorI2RlZmluZSBUVF9NU19MQU5HSURfR0VSTUFOX0dFUk1BTlkgICAgICAgICAgICAgICAgICAgIDB4MDQwNworI2RlZmluZSBUVF9NU19MQU5HSURfR0VSTUFOX1NXSVRaRVJMQU5EICAgICAgICAgICAgICAgIDB4MDgwNworI2RlZmluZSBUVF9NU19MQU5HSURfR0VSTUFOX0FVU1RSSUEgICAgICAgICAgICAgICAgICAgIDB4MGMwNworI2RlZmluZSBUVF9NU19MQU5HSURfR0VSTUFOX0xVWEVNQk9VUkcgICAgICAgICAgICAgICAgIDB4MTAwNworI2RlZmluZSBUVF9NU19MQU5HSURfR0VSTUFOX0xJRUNIVEVOU1RFSSAgICAgICAgICAgICAgIDB4MTQwNworI2RlZmluZSBUVF9NU19MQU5HSURfR1JFRUtfR1JFRUNFICAgICAgICAgICAgICAgICAgICAgIDB4MDQwOAorI2RlZmluZSBUVF9NU19MQU5HSURfRU5HTElTSF9VTklURURfU1RBVEVTICAgICAgICAgICAgIDB4MDQwOQorI2RlZmluZSBUVF9NU19MQU5HSURfRU5HTElTSF9VTklURURfS0lOR0RPTSAgICAgICAgICAgIDB4MDgwOQorI2RlZmluZSBUVF9NU19MQU5HSURfRU5HTElTSF9BVVNUUkFMSUEgICAgICAgICAgICAgICAgIDB4MGMwOQorI2RlZmluZSBUVF9NU19MQU5HSURfRU5HTElTSF9DQU5BREEgICAgICAgICAgICAgICAgICAgIDB4MTAwOQorI2RlZmluZSBUVF9NU19MQU5HSURfRU5HTElTSF9ORVdfWkVBTEFORCAgICAgICAgICAgICAgIDB4MTQwOQorI2RlZmluZSBUVF9NU19MQU5HSURfRU5HTElTSF9JUkVMQU5EICAgICAgICAgICAgICAgICAgIDB4MTgwOQorI2RlZmluZSBUVF9NU19MQU5HSURfRU5HTElTSF9TT1VUSF9BRlJJQ0EgICAgICAgICAgICAgIDB4MWMwOQorI2RlZmluZSBUVF9NU19MQU5HSURfRU5HTElTSF9KQU1BSUNBICAgICAgICAgICAgICAgICAgIDB4MjAwOQorI2RlZmluZSBUVF9NU19MQU5HSURfRU5HTElTSF9DQVJJQkJFQU4gICAgICAgICAgICAgICAgIDB4MjQwOQorI2RlZmluZSBUVF9NU19MQU5HSURfRU5HTElTSF9CRUxJWkUgICAgICAgICAgICAgICAgICAgIDB4MjgwOQorI2RlZmluZSBUVF9NU19MQU5HSURfRU5HTElTSF9UUklOSURBRCAgICAgICAgICAgICAgICAgIDB4MmMwOQorI2RlZmluZSBUVF9NU19MQU5HSURfRU5HTElTSF9aSU1CQUJXRSAgICAgICAgICAgICAgICAgIDB4MzAwOQorI2RlZmluZSBUVF9NU19MQU5HSURfRU5HTElTSF9QSElMSVBQSU5FUyAgICAgICAgICAgICAgIDB4MzQwOQorI2RlZmluZSBUVF9NU19MQU5HSURfU1BBTklTSF9TUEFJTl9UUkFESVRJT05BTF9TT1JUICAgIDB4MDQwYQorI2RlZmluZSBUVF9NU19MQU5HSURfU1BBTklTSF9NRVhJQ08gICAgICAgICAgICAgICAgICAgIDB4MDgwYQorI2RlZmluZSBUVF9NU19MQU5HSURfU1BBTklTSF9TUEFJTl9JTlRFUk5BVElPTkFMX1NPUlQgIDB4MGMwYQorI2RlZmluZSBUVF9NU19MQU5HSURfU1BBTklTSF9HVUFURU1BTEEgICAgICAgICAgICAgICAgIDB4MTAwYQorI2RlZmluZSBUVF9NU19MQU5HSURfU1BBTklTSF9DT1NUQV9SSUNBICAgICAgICAgICAgICAgIDB4MTQwYQorI2RlZmluZSBUVF9NU19MQU5HSURfU1BBTklTSF9QQU5BTUEgICAgICAgICAgICAgICAgICAgIDB4MTgwYQorI2RlZmluZSBUVF9NU19MQU5HSURfU1BBTklTSF9ET01JTklDQU5fUkVQVUJMSUMgICAgICAgIDB4MWMwYQorI2RlZmluZSBUVF9NU19MQU5HSURfU1BBTklTSF9WRU5FWlVFTEEgICAgICAgICAgICAgICAgIDB4MjAwYQorI2RlZmluZSBUVF9NU19MQU5HSURfU1BBTklTSF9DT0xPTUJJQSAgICAgICAgICAgICAgICAgIDB4MjQwYQorI2RlZmluZSBUVF9NU19MQU5HSURfU1BBTklTSF9QRVJVICAgICAgICAgICAgICAgICAgICAgIDB4MjgwYQorI2RlZmluZSBUVF9NU19MQU5HSURfU1BBTklTSF9BUkdFTlRJTkEgICAgICAgICAgICAgICAgIDB4MmMwYQorI2RlZmluZSBUVF9NU19MQU5HSURfU1BBTklTSF9FQ1VBRE9SICAgICAgICAgICAgICAgICAgIDB4MzAwYQorI2RlZmluZSBUVF9NU19MQU5HSURfU1BBTklTSF9DSElMRSAgICAgICAgICAgICAgICAgICAgIDB4MzQwYQorI2RlZmluZSBUVF9NU19MQU5HSURfU1BBTklTSF9VUlVHVUFZICAgICAgICAgICAgICAgICAgIDB4MzgwYQorI2RlZmluZSBUVF9NU19MQU5HSURfU1BBTklTSF9QQVJBR1VBWSAgICAgICAgICAgICAgICAgIDB4M2MwYQorI2RlZmluZSBUVF9NU19MQU5HSURfU1BBTklTSF9CT0xJVklBICAgICAgICAgICAgICAgICAgIDB4NDAwYQorI2RlZmluZSBUVF9NU19MQU5HSURfU1BBTklTSF9FTF9TQUxWQURPUiAgICAgICAgICAgICAgIDB4NDQwYQorI2RlZmluZSBUVF9NU19MQU5HSURfU1BBTklTSF9IT05EVVJBUyAgICAgICAgICAgICAgICAgIDB4NDgwYQorI2RlZmluZSBUVF9NU19MQU5HSURfU1BBTklTSF9OSUNBUkFHVUEgICAgICAgICAgICAgICAgIDB4NGMwYQorI2RlZmluZSBUVF9NU19MQU5HSURfU1BBTklTSF9QVUVSVE9fUklDTyAgICAgICAgICAgICAgIDB4NTAwYQorI2RlZmluZSBUVF9NU19MQU5HSURfRklOTklTSF9GSU5MQU5EICAgICAgICAgICAgICAgICAgIDB4MDQwYgorI2RlZmluZSBUVF9NU19MQU5HSURfRlJFTkNIX0ZSQU5DRSAgICAgICAgICAgICAgICAgICAgIDB4MDQwYworI2RlZmluZSBUVF9NU19MQU5HSURfRlJFTkNIX0JFTEdJVU0gICAgICAgICAgICAgICAgICAgIDB4MDgwYworI2RlZmluZSBUVF9NU19MQU5HSURfRlJFTkNIX0NBTkFEQSAgICAgICAgICAgICAgICAgICAgIDB4MGMwYworI2RlZmluZSBUVF9NU19MQU5HSURfRlJFTkNIX1NXSVRaRVJMQU5EICAgICAgICAgICAgICAgIDB4MTAwYworI2RlZmluZSBUVF9NU19MQU5HSURfRlJFTkNIX0xVWEVNQk9VUkcgICAgICAgICAgICAgICAgIDB4MTQwYworI2RlZmluZSBUVF9NU19MQU5HSURfRlJFTkNIX01PTkFDTyAgICAgICAgICAgICAgICAgICAgIDB4MTgwYworI2RlZmluZSBUVF9NU19MQU5HSURfSEVCUkVXX0lTUkFFTCAgICAgICAgICAgICAgICAgICAgIDB4MDQwZAorI2RlZmluZSBUVF9NU19MQU5HSURfSFVOR0FSSUFOX0hVTkdBUlkgICAgICAgICAgICAgICAgIDB4MDQwZQorI2RlZmluZSBUVF9NU19MQU5HSURfSUNFTEFORElDX0lDRUxBTkQgICAgICAgICAgICAgICAgIDB4MDQwZgorI2RlZmluZSBUVF9NU19MQU5HSURfSVRBTElBTl9JVEFMWSAgICAgICAgICAgICAgICAgICAgIDB4MDQxMAorI2RlZmluZSBUVF9NU19MQU5HSURfSVRBTElBTl9TV0lUWkVSTEFORCAgICAgICAgICAgICAgIDB4MDgxMAorI2RlZmluZSBUVF9NU19MQU5HSURfSkFQQU5FU0VfSkFQQU4gICAgICAgICAgICAgICAgICAgIDB4MDQxMQorI2RlZmluZSBUVF9NU19MQU5HSURfS09SRUFOX0VYVEVOREVEX1dBTlNVTkdfS09SRUEgICAgIDB4MDQxMgorI2RlZmluZSBUVF9NU19MQU5HSURfS09SRUFOX0pPSEFCX0tPUkVBICAgICAgICAgICAgICAgIDB4MDgxMgorI2RlZmluZSBUVF9NU19MQU5HSURfRFVUQ0hfTkVUSEVSTEFORFMgICAgICAgICAgICAgICAgIDB4MDQxMworI2RlZmluZSBUVF9NU19MQU5HSURfRFVUQ0hfQkVMR0lVTSAgICAgICAgICAgICAgICAgICAgIDB4MDgxMworI2RlZmluZSBUVF9NU19MQU5HSURfTk9SV0VHSUFOX05PUldBWV9CT0tNQUwgICAgICAgICAgIDB4MDQxNAorI2RlZmluZSBUVF9NU19MQU5HSURfTk9SV0VHSUFOX05PUldBWV9OWU5PUlNLICAgICAgICAgIDB4MDgxNAorI2RlZmluZSBUVF9NU19MQU5HSURfUE9MSVNIX1BPTEFORCAgICAgICAgICAgICAgICAgICAgIDB4MDQxNQorI2RlZmluZSBUVF9NU19MQU5HSURfUE9SVFVHVUVTRV9CUkFaSUwgICAgICAgICAgICAgICAgIDB4MDQxNgorI2RlZmluZSBUVF9NU19MQU5HSURfUE9SVFVHVUVTRV9QT1JUVUdBTCAgICAgICAgICAgICAgIDB4MDgxNgorI2RlZmluZSBUVF9NU19MQU5HSURfUkhBRVRPX1JPTUFOSUNfU1dJVFpFUkxBTkQgICAgICAgIDB4MDQxNworI2RlZmluZSBUVF9NU19MQU5HSURfUk9NQU5JQU5fUk9NQU5JQSAgICAgICAgICAgICAgICAgIDB4MDQxOAorI2RlZmluZSBUVF9NU19MQU5HSURfTU9MREFWSUFOX01PTERBVklBICAgICAgICAgICAgICAgIDB4MDgxOAorI2RlZmluZSBUVF9NU19MQU5HSURfUlVTU0lBTl9SVVNTSUEgICAgICAgICAgICAgICAgICAgIDB4MDQxOQorI2RlZmluZSBUVF9NU19MQU5HSURfUlVTU0lBTl9NT0xEQVZJQSAgICAgICAgICAgICAgICAgIDB4MDgxOQorI2RlZmluZSBUVF9NU19MQU5HSURfQ1JPQVRJQU5fQ1JPQVRJQSAgICAgICAgICAgICAgICAgIDB4MDQxYQorI2RlZmluZSBUVF9NU19MQU5HSURfU0VSQklBTl9TRVJCSUFfTEFUSU4gICAgICAgICAgICAgIDB4MDgxYQorI2RlZmluZSBUVF9NU19MQU5HSURfU0VSQklBTl9TRVJCSUFfQ1lSSUxMSUMgICAgICAgICAgIDB4MGMxYQorI2RlZmluZSBUVF9NU19MQU5HSURfU0xPVkFLX1NMT1ZBS0lBICAgICAgICAgICAgICAgICAgIDB4MDQxYgorI2RlZmluZSBUVF9NU19MQU5HSURfQUxCQU5JQU5fQUxCQU5JQSAgICAgICAgICAgICAgICAgIDB4MDQxYworI2RlZmluZSBUVF9NU19MQU5HSURfU1dFRElTSF9TV0VERU4gICAgICAgICAgICAgICAgICAgIDB4MDQxZAorI2RlZmluZSBUVF9NU19MQU5HSURfU1dFRElTSF9GSU5MQU5EICAgICAgICAgICAgICAgICAgIDB4MDgxZAorI2RlZmluZSBUVF9NU19MQU5HSURfVEhBSV9USEFJTEFORCAgICAgICAgICAgICAgICAgICAgIDB4MDQxZQorI2RlZmluZSBUVF9NU19MQU5HSURfVFVSS0lTSF9UVVJLRVkgICAgICAgICAgICAgICAgICAgIDB4MDQxZgorI2RlZmluZSBUVF9NU19MQU5HSURfVVJEVV9QQUtJU1RBTiAgICAgICAgICAgICAgICAgICAgIDB4MDQyMAorI2RlZmluZSBUVF9NU19MQU5HSURfSU5ET05FU0lBTl9JTkRPTkVTSUEgICAgICAgICAgICAgIDB4MDQyMQorI2RlZmluZSBUVF9NU19MQU5HSURfVUtSQUlOSUFOX1VLUkFJTkUgICAgICAgICAgICAgICAgIDB4MDQyMgorI2RlZmluZSBUVF9NU19MQU5HSURfQkVMQVJVU0lBTl9CRUxBUlVTICAgICAgICAgICAgICAgIDB4MDQyMworI2RlZmluZSBUVF9NU19MQU5HSURfU0xPVkVORV9TTE9WRU5JQSAgICAgICAgICAgICAgICAgIDB4MDQyNAorI2RlZmluZSBUVF9NU19MQU5HSURfRVNUT05JQU5fRVNUT05JQSAgICAgICAgICAgICAgICAgIDB4MDQyNQorI2RlZmluZSBUVF9NU19MQU5HSURfTEFUVklBTl9MQVRWSUEgICAgICAgICAgICAgICAgICAgIDB4MDQyNgorI2RlZmluZSBUVF9NU19MQU5HSURfTElUSFVBTklBTl9MSVRIVUFOSUEgICAgICAgICAgICAgIDB4MDQyNworI2RlZmluZSBUVF9NU19MQU5HSURfQ0xBU1NJQ19MSVRIVUFOSUFOX0xJVEhVQU5JQSAgICAgIDB4MDgyNworI2RlZmluZSBUVF9NU19MQU5HSURfTUFPUklfTkVXX1pFQUxBTkQgICAgICAgICAgICAgICAgIDB4MDQyOAorI2RlZmluZSBUVF9NU19MQU5HSURfRkFSU0lfSVJBTiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQyOQorI2RlZmluZSBUVF9NU19MQU5HSURfVklFVE5BTUVTRV9WSUVUX05BTSAgICAgICAgICAgICAgIDB4MDQyYQorI2RlZmluZSBUVF9NU19MQU5HSURfQVJNRU5JQU5fQVJNRU5JQSAgICAgICAgICAgICAgICAgIDB4MDQyYgorI2RlZmluZSBUVF9NU19MQU5HSURfQVpFUklfQVpFUkJBSUpBTl9MQVRJTiAgICAgICAgICAgIDB4MDQyYworI2RlZmluZSBUVF9NU19MQU5HSURfQVpFUklfQVpFUkJBSUpBTl9DWVJJTExJQyAgICAgICAgIDB4MDgyYworI2RlZmluZSBUVF9NU19MQU5HSURfQkFTUVVFX1NQQUlOICAgICAgICAgICAgICAgICAgICAgIDB4MDQyZAorI2RlZmluZSBUVF9NU19MQU5HSURfU09SQklBTl9HRVJNQU5ZICAgICAgICAgICAgICAgICAgIDB4MDQyZQorI2RlZmluZSBUVF9NU19MQU5HSURfTUFDRURPTklBTl9NQUNFRE9OSUEgICAgICAgICAgICAgIDB4MDQyZgorI2RlZmluZSBUVF9NU19MQU5HSURfU1VUVV9TT1VUSF9BRlJJQ0EgICAgICAgICAgICAgICAgIDB4MDQzMAorI2RlZmluZSBUVF9NU19MQU5HSURfVFNPTkdBX1NPVVRIX0FGUklDQSAgICAgICAgICAgICAgIDB4MDQzMQorI2RlZmluZSBUVF9NU19MQU5HSURfVFNXQU5BX1NPVVRIX0FGUklDQSAgICAgICAgICAgICAgIDB4MDQzMgorI2RlZmluZSBUVF9NU19MQU5HSURfVkVOREFfU09VVEhfQUZSSUNBICAgICAgICAgICAgICAgIDB4MDQzMworI2RlZmluZSBUVF9NU19MQU5HSURfWEhPU0FfU09VVEhfQUZSSUNBICAgICAgICAgICAgICAgIDB4MDQzNAorI2RlZmluZSBUVF9NU19MQU5HSURfWlVMVV9TT1VUSF9BRlJJQ0EgICAgICAgICAgICAgICAgIDB4MDQzNQorI2RlZmluZSBUVF9NU19MQU5HSURfQUZSSUtBQU5TX1NPVVRIX0FGUklDQSAgICAgICAgICAgIDB4MDQzNgorI2RlZmluZSBUVF9NU19MQU5HSURfR0VPUkdJQU5fR0VPUkdJQSAgICAgICAgICAgICAgICAgIDB4MDQzNworI2RlZmluZSBUVF9NU19MQU5HSURfRkFFUk9FU0VfRkFFUk9FX0lTTEFORFMgICAgICAgICAgIDB4MDQzOAorI2RlZmluZSBUVF9NU19MQU5HSURfSElORElfSU5ESUEgICAgICAgICAgICAgICAgICAgICAgIDB4MDQzOQorI2RlZmluZSBUVF9NU19MQU5HSURfTUFMVEVTRV9NQUxUQSAgICAgICAgICAgICAgICAgICAgIDB4MDQzYQorI2RlZmluZSBUVF9NU19MQU5HSURfU0FBTUlfTEFQT05JQSAgICAgICAgICAgICAgICAgICAgIDB4MDQzYgorI2RlZmluZSBUVF9NU19MQU5HSURfSVJJU0hfR0FFTElDX0lSRUxBTkQgICAgICAgICAgICAgIDB4MDQzYworI2RlZmluZSBUVF9NU19MQU5HSURfU0NPVFRJU0hfR0FFTElDX1VOSVRFRF9LSU5HRE9NICAgIDB4MDgzYworI2RlZmluZSBUVF9NU19MQU5HSURfTUFMQVlfTUFMQVlTSUEgICAgICAgICAgICAgICAgICAgIDB4MDQzZQorI2RlZmluZSBUVF9NU19MQU5HSURfTUFMQVlfQlJVTkVJX0RBUlVTU0FMQU0gICAgICAgICAgIDB4MDgzZQorI2RlZmluZSBUVF9NU19MQU5HSURfS0FaQUtfS0FaQUtTVEFOICAgICAgICAgICAgICAgICAgIDB4MDQzZgorI2RlZmluZSBUVF9NU19MQU5HSURfU1dBSElMSV9LRU5ZQSAgICAgICAgICAgICAgICAgICAgIDB4MDQ0MQorI2RlZmluZSBUVF9NU19MQU5HSURfVVpCRUtfVVpCRUtJU1RBTl9MQVRJTiAgICAgICAgICAgIDB4MDQ0MworI2RlZmluZSBUVF9NU19MQU5HSURfVVpCRUtfVVpCRUtJU1RBTl9DWVJJTExJQyAgICAgICAgIDB4MDg0MworI2RlZmluZSBUVF9NU19MQU5HSURfVEFUQVJfVEFUQVJTVEFOICAgICAgICAgICAgICAgICAgIDB4MDQ0NAorI2RlZmluZSBUVF9NU19MQU5HSURfQkVOR0FMSV9JTkRJQSAgICAgICAgICAgICAgICAgICAgIDB4MDQ0NQorI2RlZmluZSBUVF9NU19MQU5HSURfUFVOSkFCSV9JTkRJQSAgICAgICAgICAgICAgICAgICAgIDB4MDQ0NgorI2RlZmluZSBUVF9NU19MQU5HSURfR1VKQVJBVElfSU5ESUEgICAgICAgICAgICAgICAgICAgIDB4MDQ0NworI2RlZmluZSBUVF9NU19MQU5HSURfT1JJWUFfSU5ESUEgICAgICAgICAgICAgICAgICAgICAgIDB4MDQ0OAorI2RlZmluZSBUVF9NU19MQU5HSURfVEFNSUxfSU5ESUEgICAgICAgICAgICAgICAgICAgICAgIDB4MDQ0OQorI2RlZmluZSBUVF9NU19MQU5HSURfVEVMVUdVX0lORElBICAgICAgICAgICAgICAgICAgICAgIDB4MDQ0YQorI2RlZmluZSBUVF9NU19MQU5HSURfS0FOTkFEQV9JTkRJQSAgICAgICAgICAgICAgICAgICAgIDB4MDQ0YgorI2RlZmluZSBUVF9NU19MQU5HSURfTUFMQVlBTEFNX0lORElBICAgICAgICAgICAgICAgICAgIDB4MDQ0YworI2RlZmluZSBUVF9NU19MQU5HSURfQVNTQU1FU0VfSU5ESUEgICAgICAgICAgICAgICAgICAgIDB4MDQ0ZAorI2RlZmluZSBUVF9NU19MQU5HSURfTUFSQVRISV9JTkRJQSAgICAgICAgICAgICAgICAgICAgIDB4MDQ0ZQorI2RlZmluZSBUVF9NU19MQU5HSURfU0FOU0tSSVRfSU5ESUEgICAgICAgICAgICAgICAgICAgIDB4MDQ0ZgorI2RlZmluZSBUVF9NU19MQU5HSURfS09OS0FOSV9JTkRJQSAgICAgICAgICAgICAgICAgICAgIDB4MDQ1NworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBwb3NzaWJsZSB2YWx1ZXMgb2YgdGhlIGBOYW1lJyBpZGVudGlmaWVyIGZpZWxkIGluIHRoZSBuYW1lIHJlY29yZHMgb2YgKi8KKyAgLyogdGhlIFRURiBgbmFtZScgdGFibGUuICBUaGVzZSB2YWx1ZXMgYXJlIHBsYXRmb3JtIGluZGVwZW5kZW50LiAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUVF9OQU1FX0lEX0NPUFlSSUdIVCAgICAgICAgICAgICAwCisjZGVmaW5lIFRUX05BTUVfSURfRk9OVF9GQU1JTFkgICAgICAgICAgIDEKKyNkZWZpbmUgVFRfTkFNRV9JRF9GT05UX1NVQkZBTUlMWSAgICAgICAgMgorI2RlZmluZSBUVF9OQU1FX0lEX1VOSVFVRV9JRCAgICAgICAgICAgICAzCisjZGVmaW5lIFRUX05BTUVfSURfRlVMTF9OQU1FICAgICAgICAgICAgIDQKKyNkZWZpbmUgVFRfTkFNRV9JRF9WRVJTSU9OX1NUUklORyAgICAgICAgNQorI2RlZmluZSBUVF9OQU1FX0lEX1BTX05BTUUgICAgICAgICAgICAgICA2CisjZGVmaW5lIFRUX05BTUVfSURfVFJBREVNQVJLICAgICAgICAgICAgIDcKKy8qIHRoZSBmb2xsb3dpbmcgdmFsdWVzIGFyZSBmcm9tIHRoZSBPcGVuVHlwZSBzcGVjICovCisjZGVmaW5lIFRUX05BTUVfSURfTUFOVUZBQ1RVUkVSICAgICAgICAgIDgKKyNkZWZpbmUgVFRfTkFNRV9JRF9ERVNJR05FUiAgICAgICAgICAgICAgOQorI2RlZmluZSBUVF9OQU1FX0lEX0RFU0NSSVBUSU9OICAgICAgICAgIDEwCisjZGVmaW5lIFRUX05BTUVfSURfVkVORE9SX1VSTCAgICAgICAgICAgMTEKKyNkZWZpbmUgVFRfTkFNRV9JRF9ERVNJR05FUl9VUkwgICAgICAgICAxMgorI2RlZmluZSBUVF9OQU1FX0lEX0xJQ0VOU0UgICAgICAgICAgICAgIDEzCisjZGVmaW5lIFRUX05BTUVfSURfTElDRU5TRV9VUkwgICAgICAgICAgMTQKKy8qIG51bWJlciAxNSBpcyByZXNlcnZlZCAqLworI2RlZmluZSBUVF9OQU1FX0lEX1BSRUZFUlJFRF9GQU1JTFkgICAgIDE2CisjZGVmaW5lIFRUX05BTUVfSURfUFJFRkVSUkVEX1NVQkZBTUlMWSAgMTcKKyNkZWZpbmUgVFRfTkFNRV9JRF9NQUNfRlVMTF9OQU1FICAgICAgICAxOAorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBCaXQgbWFzayB2YWx1ZXMgZm9yIHRoZSBVbmljb2RlIHJhbmdlcyBmcm9tIHRoZSBUVEYgYE9TMiAnIHRhYmxlLiAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qIEdlbmVyYWwgU2NyaXB0cyBBcmVhICovCisKKy8qIEJpdCAgMCAgIEMwIENvbnRyb2xzIGFuZCBCYXNpYyBMYXRpbiAqLworI2RlZmluZSBUVF9VQ1JfQkFTSUNfTEFUSU4gICAgICAgICAgICAgICAgICAgICAgKDEgPDwgIDApIC8qIFUrMDAwMC1VKzAwN0YgKi8KKy8qIEJpdCAgMSAgIEMxIENvbnRyb2xzIGFuZCBMYXRpbi0xIFN1cHBsZW1lbnQgKi8KKyNkZWZpbmUgVFRfVUNSX0xBVElOMV9TVVBQTEVNRU5UICAgICAgICAgICAgICAgICgxIDw8ICAxKSAvKiBVKzAwODAtVSswMEZGICovCisvKiBCaXQgIDIgICBMYXRpbiBFeHRlbmRlZC1BICovCisjZGVmaW5lIFRUX1VDUl9MQVRJTl9FWFRFTkRFRF9BICAgICAgICAgICAgICAgICAoMSA8PCAgMikgLyogVSswMTAwLVUrMDE3RiAqLworLyogQml0ICAzICAgTGF0aW4gRXh0ZW5kZWQtQiAqLworI2RlZmluZSBUVF9VQ1JfTEFUSU5fRVhURU5ERURfQiAgICAgICAgICAgICAgICAgKDEgPDwgIDMpIC8qIFUrMDE4MC1VKzAyNEYgKi8KKy8qIEJpdCAgNCAgIElQQSBFeHRlbnNpb25zICovCisjZGVmaW5lIFRUX1VDUl9JUEFfRVhURU5TSU9OUyAgICAgICAgICAgICAgICAgICAoMSA8PCAgNCkgLyogVSswMjUwLVUrMDJBRiAqLworLyogQml0ICA1ICAgU3BhY2luZyBNb2RpZmllciBMZXR0ZXJzICovCisjZGVmaW5lIFRUX1VDUl9TUEFDSU5HX01PRElGSUVSICAgICAgICAgICAgICAgICAoMSA8PCAgNSkgLyogVSswMkIwLVUrMDJGRiAqLworLyogQml0ICA2ICAgQ29tYmluaW5nIERpYWNyaXRpY2FsIE1hcmtzICovCisjZGVmaW5lIFRUX1VDUl9DT01CSU5JTkdfRElBQ1JJVElDQUxfTUFSS1MgICAgICAoMSA8PCAgNikgLyogVSswMzAwLVUrMDM2RiAqLworLyogQml0ICA3ICAgR3JlZWsgKi8KKyNkZWZpbmUgVFRfVUNSX0dSRUVLICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8ICA3KSAvKiBVKzAzNzAtVSswM0ZGICovCisvKiBCaXQgOCBpcyByZXNlcnZlZCAod2FzOiBHcmVlayBTeW1ib2xzIGFuZCBDb3B0aWMpICovCisvKiBCaXQgIDkgICBDeXJpbGxpYyAqLworI2RlZmluZSBUVF9VQ1JfQ1lSSUxMSUMgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgIDkpIC8qIFUrMDQwMC1VKzA0RkYgKi8KKy8qIEJpdCAxMCAgIEFybWVuaWFuICovCisjZGVmaW5lIFRUX1VDUl9BUk1FTklBTiAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAxMCkgLyogVSswNTMwLVUrMDU4RiAqLworLyogQml0IDExICAgSGVicmV3ICovCisjZGVmaW5lIFRUX1VDUl9IRUJSRVcgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAxMSkgLyogVSswNTkwLVUrMDVGRiAqLworLyogQml0IDEyIGlzIHJlc2VydmVkICh3YXM6IEhlYnJldyBFeHRlbmRlZCkgKi8KKy8qIEJpdCAxMyAgIEFyYWJpYyAqLworI2RlZmluZSBUVF9VQ1JfQVJBQklDICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMTMpIC8qIFUrMDYwMC1VKzA2RkYgKi8KKy8qIEJpdCAxNCBpcyByZXNlcnZlZCAod2FzOiBBcmFiaWMgRXh0ZW5kZWQpICovCisvKiBCaXQgMTUgICBEZXZhbmFnYXJpICovCisjZGVmaW5lIFRUX1VDUl9ERVZBTkFHQVJJICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAxNSkgLyogVSswOTAwLVUrMDk3RiAqLworLyogQml0IDE2ICAgQmVuZ2FsaSAqLworI2RlZmluZSBUVF9VQ1JfQkVOR0FMSSAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMTYpIC8qIFUrMDk4MC1VKzA5RkYgKi8KKy8qIEJpdCAxNyAgIEd1cm11a2hpICovCisjZGVmaW5lIFRUX1VDUl9HVVJNVUtISSAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAxNykgLyogVSswQTAwLVUrMEE3RiAqLworLyogQml0IDE4ICAgR3VqYXJhdGkgKi8KKyNkZWZpbmUgVFRfVUNSX0dVSkFSQVRJICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDE4KSAvKiBVKzBBODAtVSswQUZGICovCisvKiBCaXQgMTkgICBPcml5YSAqLworI2RlZmluZSBUVF9VQ1JfT1JJWUEgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMTkpIC8qIFUrMEIwMC1VKzBCN0YgKi8KKy8qIEJpdCAyMCAgIFRhbWlsICovCisjZGVmaW5lIFRUX1VDUl9UQU1JTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAyMCkgLyogVSswQjgwLVUrMEJGRiAqLworLyogQml0IDIxICAgVGVsdWd1ICovCisjZGVmaW5lIFRUX1VDUl9URUxVR1UgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAyMSkgLyogVSswQzAwLVUrMEM3RiAqLworLyogQml0IDIyICAgS2FubmFkYSAqLworI2RlZmluZSBUVF9VQ1JfS0FOTkFEQSAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMjIpIC8qIFUrMEM4MC1VKzBDRkYgKi8KKy8qIEJpdCAyMyAgIE1hbGF5YWxhbSAqLworI2RlZmluZSBUVF9VQ1JfTUFMQVlBTEFNICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMjMpIC8qIFUrMEQwMC1VKzBEN0YgKi8KKy8qIEJpdCAyNCAgIFRoYWkgKi8KKyNkZWZpbmUgVFRfVUNSX1RIQUkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDI0KSAvKiBVKzBFMDAtVSswRTdGICovCisvKiBCaXQgMjUgICBMYW8gKi8KKyNkZWZpbmUgVFRfVUNSX0xBTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDI1KSAvKiBVKzBFODAtVSswRUZGICovCisvKiBCaXQgMjYgICBHZW9yZ2lhbiAqLworI2RlZmluZSBUVF9VQ1JfR0VPUkdJQU4gICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMjYpIC8qIFUrMTBBMC1VKzEwRkYgKi8KKy8qIEJpdCAyNyBpcyByZXNlcnZlZCAod2FzIEdlb3JnaWFuIEV4dGVuZGVkKSAqLworLyogQml0IDI4ICAgSGFuZ3VsIEphbW8gKi8KKyNkZWZpbmUgVFRfVUNSX0hBTkdVTF9KQU1PICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDI4KSAvKiBVKzExMDAtVSsxMUZGICovCisvKiBCaXQgMjkgICBMYXRpbiBFeHRlbmRlZCBBZGRpdGlvbmFsICovCisjZGVmaW5lIFRUX1VDUl9MQVRJTl9FWFRFTkRFRF9BRERJVElPTkFMICAgICAgICAoMSA8PCAyOSkgLyogVSsxRTAwLVUrMUVGRiAqLworLyogQml0IDMwICAgR3JlZWsgRXh0ZW5kZWQgKi8KKyNkZWZpbmUgVFRfVUNSX0dSRUVLX0VYVEVOREVEICAgICAgICAgICAgICAgICAgICgxIDw8IDMwKSAvKiBVKzFGMDAtVSsxRkZGICovCisKKy8qIFN5bWJvbHMgQXJlYSAqLworCisvKiBCaXQgMzEgICBHZW5lcmFsIFB1bmN0dWF0aW9uICovCisjZGVmaW5lIFRUX1VDUl9HRU5FUkFMX1BVTkNUVUFUSU9OICAgICAgICAgICAgICAoMSA8PCAzMSkgLyogVSsyMDAwLVUrMjA2RiAqLworLyogQml0IDMyICAgU3VwZXJzY3JpcHRzIEFuZCBTdWJzY3JpcHRzICovCisjZGVmaW5lIFRUX1VDUl9TVVBFUlNDUklQVFNfU1VCU0NSSVBUUyAgICAgICAgICAoMSA8PCAgMCkgLyogVSsyMDcwLVUrMjA5RiAqLworLyogQml0IDMzICAgQ3VycmVuY3kgU3ltYm9scyAqLworI2RlZmluZSBUVF9VQ1JfQ1VSUkVOQ1lfU1lNQk9MUyAgICAgICAgICAgICAgICAgKDEgPDwgIDEpIC8qIFUrMjBBMC1VKzIwQ0YgKi8KKy8qIEJpdCAzNCAgIENvbWJpbmluZyBEaWFjcml0aWNhbCBNYXJrcyBGb3IgU3ltYm9scyAqLworI2RlZmluZSBUVF9VQ1JfQ09NQklOSU5HX0RJQUNSSVRJQ0FMX01BUktTX1NZTUIgKDEgPDwgIDIpIC8qIFUrMjBEMC1VKzIwRkYgKi8KKy8qIEJpdCAzNSAgIExldHRlcmxpa2UgU3ltYm9scyAqLworI2RlZmluZSBUVF9VQ1JfTEVUVEVSTElLRV9TWU1CT0xTICAgICAgICAgICAgICAgKDEgPDwgIDMpIC8qIFUrMjEwMC1VKzIxNEYgKi8KKy8qIEJpdCAzNiAgIE51bWJlciBGb3JtcyAqLworI2RlZmluZSBUVF9VQ1JfTlVNQkVSX0ZPUk1TICAgICAgICAgICAgICAgICAgICAgKDEgPDwgIDQpIC8qIFUrMjE1MC1VKzIxOEYgKi8KKy8qIEJpdCAzNyAgIEFycm93cyAqLworI2RlZmluZSBUVF9VQ1JfQVJST1dTICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgIDUpIC8qIFUrMjE5MC1VKzIxRkYgKi8KKy8qIEJpdCAzOCAgIE1hdGhlbWF0aWNhbCBPcGVyYXRvcnMgKi8KKyNkZWZpbmUgVFRfVUNSX01BVEhFTUFUSUNBTF9PUEVSQVRPUlMgICAgICAgICAgICgxIDw8ICA2KSAvKiBVKzIyMDAtVSsyMkZGICovCisvKiBCaXQgMzkgTWlzY2VsbGFuZW91cyBUZWNobmljYWwgKi8KKyNkZWZpbmUgVFRfVUNSX01JU0NFTExBTkVPVVNfVEVDSE5JQ0FMICAgICAgICAgICgxIDw8ICA3KSAvKiBVKzIzMDAtVSsyM0ZGICovCisvKiBCaXQgNDAgICBDb250cm9sIFBpY3R1cmVzICovCisjZGVmaW5lIFRUX1VDUl9DT05UUk9MX1BJQ1RVUkVTICAgICAgICAgICAgICAgICAoMSA8PCAgOCkgLyogVSsyNDAwLVUrMjQzRiAqLworLyogQml0IDQxICAgT3B0aWNhbCBDaGFyYWN0ZXIgUmVjb2duaXRpb24gKi8KKyNkZWZpbmUgVFRfVUNSX09DUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8ICA5KSAvKiBVKzI0NDAtVSsyNDVGICovCisvKiBCaXQgNDIgICBFbmNsb3NlZCBBbHBoYW51bWVyaWNzICovCisjZGVmaW5lIFRUX1VDUl9FTkNMT1NFRF9BTFBIQU5VTUVSSUNTICAgICAgICAgICAoMSA8PCAxMCkgLyogVSsyNDYwLVUrMjRGRiAqLworLyogQml0IDQzICAgQm94IERyYXdpbmcgKi8KKyNkZWZpbmUgVFRfVUNSX0JPWF9EUkFXSU5HICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDExKSAvKiBVKzI1MDAtVSsyNTdGICovCisvKiBCaXQgNDQgICBCbG9jayBFbGVtZW50cyAqLworI2RlZmluZSBUVF9VQ1JfQkxPQ0tfRUxFTUVOVFMgICAgICAgICAgICAgICAgICAgKDEgPDwgMTIpIC8qIFUrMjU4MC1VKzI1OUYgKi8KKy8qIEJpdCA0NSAgIEdlb21ldHJpYyBTaGFwZXMgKi8KKyNkZWZpbmUgVFRfVUNSX0dFT01FVFJJQ19TSEFQRVMgICAgICAgICAgICAgICAgICgxIDw8IDEzKSAvKiBVKzI1QTAtVSsyNUZGICovCisvKiBCaXQgNDYgICBNaXNjZWxsYW5lb3VzIFN5bWJvbHMgKi8KKyNkZWZpbmUgVFRfVUNSX01JU0NFTExBTkVPVVNfU1lNQk9MUyAgICAgICAgICAgICgxIDw8IDE0KSAvKiBVKzI2MDAtVSsyNkZGICovCisvKiBCaXQgNDcgICBEaW5nYmF0cyAqLworI2RlZmluZSBUVF9VQ1JfRElOR0JBVFMgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMTUpIC8qIFUrMjcwMC1VKzI3QkYgKi8KKworLyogQ0pLIFBob25ldGljcyBhbmQgU3ltYm9scyBBcmVhICovCisKKy8qIEJpdCA0OCAgIENKSyBTeW1ib2xzIEFuZCBQdW5jdHVhdGlvbiAqLworI2RlZmluZSBUVF9VQ1JfQ0pLX1NZTUJPTFMgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMTYpIC8qIFUrMzAwMC1VKzMwM0YgKi8KKy8qIEJpdCA0OSAgIEhpcmFnYW5hICovCisjZGVmaW5lIFRUX1VDUl9ISVJBR0FOQSAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAxNykgLyogVSszMDQwLVUrMzA5RiAqLworLyogQml0IDUwICAgS2F0YWthbmEgKi8KKyNkZWZpbmUgVFRfVUNSX0tBVEFLQU5BICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDE4KSAvKiBVKzMwQTAtVSszMEZGICovCisvKiBCaXQgNTEgICBCb3BvbW9mbyAqLworI2RlZmluZSBUVF9VQ1JfQk9QT01PRk8gICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMTkpIC8qIFUrMzEwMC1VKzMxMkYgKi8KKy8qIEJpdCA1MiAgIEhhbmd1bCBDb21wYXRpYmlsaXR5IEphbW8gKi8KKyNkZWZpbmUgVFRfVUNSX0hBTkdVTF9DT01QQVRJQklMSVRZX0pBTU8gICAgICAgICgxIDw8IDIwKSAvKiBVKzMxMzAtVSszMThGICovCisvKiBCaXQgNTMgICBDSksgTWlzY2VsbGFuZW91cyAqLworI2RlZmluZSBUVF9VQ1JfQ0pLX01JU0MgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMjEpIC8qIFUrMzE5MC1VKzMxOUYgKi8KKy8qIEJpdCA1NCAgIEVuY2xvc2VkIENKSyBMZXR0ZXJzIEFuZCBNb250aHMgKi8KKyNkZWZpbmUgVFRfVUNSX0VOQ0xPU0VEX0NKS19MRVRURVJTX01PTlRIUyAgICAgICgxIDw8IDIyKSAvKiBVKzMyMDAtVSszMkZGICovCisvKiBCaXQgNTUgICBDSksgQ29tcGF0aWJpbGl0eSAqLworI2RlZmluZSBUVF9VQ1JfQ0pLX0NPTVBBVElCSUxJVFkgICAgICAgICAgICAgICAgKDEgPDwgMjMpIC8qIFUrMzMwMC1VKzMzRkYgKi8KKworLyogSGFuZ3VsIFN5bGxhYmxlcyBBcmVhICovCisKKy8qIEJpdCA1NiAgIEhhbmd1bCAqLworI2RlZmluZSBUVF9VQ1JfSEFOR1VMICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMjQpIC8qIFUrQUMwMC1VK0Q3QTMgKi8KKworLyogU3Vycm9nYXRlcyBBcmVhICovCisKKy8qIEJpdCA1NyAgIFN1cnJvZ2F0ZXMgKi8KKyNkZWZpbmUgVFRfVUNSX1NVUlJPR0FURVMgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDI1KSAvKiBVK0Q4MDAtVStERkZGICovCisvKiBCaXQgNTggaXMgcmVzZXJ2ZWQgZm9yIFVuaWNvZGUgU3ViUmFuZ2VzICovCisKKy8qIENKSyBJZGVvZ3JhcGhzIEFyZWEgKi8KKworLyogQml0IDU5ICAgQ0pLIFVuaWZpZWQgSWRlb2dyYXBocyAqLworI2RlZmluZSBUVF9VQ1JfQ0pLX1VOSUZJRURfSURFT0dSQVBIUyAgICAgICAgICAgKDEgPDwgMjcpIC8qIFUrNEUwMC1VKzlGRkYgKi8KKworLyogUHJpdmF0ZSBVc2UgQXJlYSAqLworCisvKiBCaXQgNjAgICBQcml2YXRlIFVzZSAqLworI2RlZmluZSBUVF9VQ1JfUFJJVkFURV9VU0UgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMjgpIC8qIFUrRTAwMC1VK0Y4RkYgKi8KKworLyogQ29tcGF0aWJpbGl0eSBBcmVhIGFuZCBTcGVjaWFscyAqLworCisvKiBCaXQgNjEgICBDSksgQ29tcGF0aWJpbGl0eSBJZGVvZ3JhcGhzICovCisjZGVmaW5lIFRUX1VDUl9DSktfQ09NUEFUSUJJTElUWV9JREVPR1JBUEhTICAgICAoMSA8PCAyOSkgLyogVStGOTAwLVUrRkFGRiAqLworLyogQml0IDYyICAgQWxwaGFiZXRpYyBQcmVzZW50YXRpb24gRm9ybXMgKi8KKyNkZWZpbmUgVFRfVUNSX0FMUEhBQkVUSUNfUFJFU0VOVEFUSU9OX0ZPUk1TICAgICgxIDw8IDMwKSAvKiBVK0ZCMDAtVStGQjRGICovCisvKiBCaXQgNjMgICBBcmFiaWMgUHJlc2VudGF0aW9uIEZvcm1zLUEgKi8KKyNkZWZpbmUgVFRfVUNSX0FSQUJJQ19QUkVTRU5UQVRJT05fRk9STVNfQSAgICAgICgxIDw8IDMxKSAvKiBVK0ZCNTAtVStGU0ZGICovCisvKiBCaXQgNjQgICBDb21iaW5pbmcgSGFsZiBNYXJrcyAqLworI2RlZmluZSBUVF9VQ1JfQ09NQklOSU5HX0hBTEZfTUFSS1MgICAgICAgICAgICAgKDEgPDwgIDApIC8qIFUrRkUyMC1VK0ZFMkYgKi8KKy8qIEJpdCA2NSAgIENKSyBDb21wYXRpYmlsaXR5IEZvcm1zICovCisjZGVmaW5lIFRUX1VDUl9DSktfQ09NUEFUSUJJTElUWV9GT1JNUyAgICAgICAgICAoMSA8PCAgMSkgLyogVStGRTMwLVUrRkU0RiAqLworLyogQml0IDY2ICAgU21hbGwgRm9ybSBWYXJpYW50cyAqLworI2RlZmluZSBUVF9VQ1JfU01BTExfRk9STV9WQVJJQU5UUyAgICAgICAgICAgICAgKDEgPDwgIDIpIC8qIFUrRkU1MC1VK0ZFNkYgKi8KKy8qIEJpdCA2NyAgIEFyYWJpYyBQcmVzZW50YXRpb24gRm9ybXMtQiAqLworI2RlZmluZSBUVF9VQ1JfQVJBQklDX1BSRVNFTlRBVElPTl9GT1JNU19CICAgICAgKDEgPDwgIDMpIC8qIFUrRkU3MC1VK0ZFRkYgKi8KKy8qIEJpdCA2OCAgIEhhbGZ3aWR0aCBBbmQgRnVsbHdpZHRoIEZvcm1zICovCisjZGVmaW5lIFRUX1VDUl9IQUxGV0lEVEhfRlVMTFdJRFRIX0ZPUk1TICAgICAgICAoMSA8PCAgNCkgLyogVStGRjAwLVUrRkZFRiAqLworLyogQml0IDY5ICAgU3BlY2lhbHMgKi8KKyNkZWZpbmUgVFRfVUNSX1NQRUNJQUxTICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8ICA1KSAvKiBVK0ZFRkYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVStGRkYwLVUrRkZGRiAqLworLyogQml0IDcwICAgVGliZXRhbiAqLworI2RlZmluZSBUVF9VQ1JfVElCRVRBTiAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgIDYpIC8qIFUrMEYwMC1VKzBGQkYgKi8KKworCisjZW5kaWYgLyogVFROQU1FSURfSCAqLworCisKKy8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3NoYXJlZC90dHRhZ3MuaCBiL3NyYy9zaGFyZWQvdHR0YWdzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNiYmZjMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9zaGFyZWQvdHR0YWdzLmgKQEAgLTAsMCArMSw2MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgdHR0YWdzLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIFRhZ3MgZm9yIFRydWVUeXBlIHRhYmxlcyAoc3BlY2lmaWNhdGlvbiBvbmx5KS4gICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAxOTk2LTE5OTkgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCAgICAgICAgKi8KKy8qICBtb2RpZmllZCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgICovCisvKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICAqLworLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KKy8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjaWZuZGVmIFRUQUdTX0gKKyNkZWZpbmUgVFRBR1NfSAorCisKKyNpbmNsdWRlIDxmcmVldHlwZS5oPiAgIC8qIGZvciBNQUtFX1RUX1RBRygpICovCisKKworI2RlZmluZSBUVEFHX2NtYXAgIEZUX01BS0VfVEFHKCAnYycsICdtJywgJ2EnLCAncCcgKQorI2RlZmluZSBUVEFHX2N2dCAgIEZUX01BS0VfVEFHKCAnYycsICd2JywgJ3QnLCAnICcgKQorI2RlZmluZSBUVEFHX0VCRFQgIEZUX01BS0VfVEFHKCAnRScsICdCJywgJ0QnLCAnVCcgKQorI2RlZmluZSBUVEFHX0VCTEMgIEZUX01BS0VfVEFHKCAnRScsICdCJywgJ0wnLCAnQycgKQorI2RlZmluZSBUVEFHX0VCU0MgIEZUX01BS0VfVEFHKCAnRScsICdCJywgJ1MnLCAnQycgKQorI2RlZmluZSBUVEFHX2ZwZ20gIEZUX01BS0VfVEFHKCAnZicsICdwJywgJ2cnLCAnbScgKQorI2RlZmluZSBUVEFHX2dhc3AgIEZUX01BS0VfVEFHKCAnZycsICdhJywgJ3MnLCAncCcgKQorI2RlZmluZSBUVEFHX2dseWYgIEZUX01BS0VfVEFHKCAnZycsICdsJywgJ3knLCAnZicgKQorI2RlZmluZSBUVEFHX0dTVUIgIEZUX01BS0VfVEFHKCAnRycsICdTJywgJ1UnLCAnQicgKQorI2RlZmluZSBUVEFHX2hkbXggIEZUX01BS0VfVEFHKCAnaCcsICdkJywgJ20nLCAneCcgKQorI2RlZmluZSBUVEFHX2hlYWQgIEZUX01BS0VfVEFHKCAnaCcsICdlJywgJ2EnLCAnZCcgKQorI2RlZmluZSBUVEFHX2hoZWEgIEZUX01BS0VfVEFHKCAnaCcsICdoJywgJ2UnLCAnYScgKQorI2RlZmluZSBUVEFHX2htdHggIEZUX01BS0VfVEFHKCAnaCcsICdtJywgJ3QnLCAneCcgKQorI2RlZmluZSBUVEFHX2tlcm4gIEZUX01BS0VfVEFHKCAnaycsICdlJywgJ3InLCAnbicgKQorI2RlZmluZSBUVEFHX2xvY2EgIEZUX01BS0VfVEFHKCAnbCcsICdvJywgJ2MnLCAnYScgKQorI2RlZmluZSBUVEFHX0xUU0ggIEZUX01BS0VfVEFHKCAnTCcsICdUJywgJ1MnLCAnSCcgKQorI2RlZmluZSBUVEFHX21heHAgIEZUX01BS0VfVEFHKCAnbScsICdhJywgJ3gnLCAncCcgKQorI2RlZmluZSBUVEFHX25hbWUgIEZUX01BS0VfVEFHKCAnbicsICdhJywgJ20nLCAnZScgKQorI2RlZmluZSBUVEFHX09TMiAgIEZUX01BS0VfVEFHKCAnTycsICdTJywgJy8nLCAnMicgKQorI2RlZmluZSBUVEFHX09UVE8gIEZUX01BS0VfVEFHKCAnTycsICdUJywgJ1QnLCAnTycgKQorI2RlZmluZSBUVEFHX1BDTFQgIEZUX01BS0VfVEFHKCAnUCcsICdDJywgJ0wnLCAnVCcgKQorI2RlZmluZSBUVEFHX3Bvc3QgIEZUX01BS0VfVEFHKCAncCcsICdvJywgJ3MnLCAndCcgKQorI2RlZmluZSBUVEFHX3ByZXAgIEZUX01BS0VfVEFHKCAncCcsICdyJywgJ2UnLCAncCcgKQorI2RlZmluZSBUVEFHX3RydWUgIEZUX01BS0VfVEFHKCAndCcsICdyJywgJ3UnLCAnZScgKQorI2RlZmluZSBUVEFHX3R0YyAgIEZUX01BS0VfVEFHKCAndCcsICd0JywgJ2MnLCAnICcgKQorI2RlZmluZSBUVEFHX3R0Y2YgIEZUX01BS0VfVEFHKCAndCcsICd0JywgJ2MnLCAnZicgKQorI2RlZmluZSBUVEFHX1ZETVggIEZUX01BS0VfVEFHKCAnVicsICdEJywgJ00nLCAnWCcgKQorI2RlZmluZSBUVEFHX3ZoZWEgIEZUX01BS0VfVEFHKCAndicsICdoJywgJ2UnLCAnYScgKQorI2RlZmluZSBUVEFHX3ZtdHggIEZUX01BS0VfVEFHKCAndicsICdtJywgJ3QnLCAneCcgKQorCisKKyNlbmRpZiAvKiBUVEFHU19IICovCisKKworLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvc2hhcmVkL3R0dHlwZXMuaCBiL3NyYy9zaGFyZWQvdHR0eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1MTQwZTkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvc2hhcmVkL3R0dHlwZXMuaApAQCAtMCwwICsxLDIwNjYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHR0dHlwZXMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBCYXNpYyBTRk5UL1RydWVUeXBlIHR5cGUgZGVmaW5pdGlvbnMgYW5kIGludGVyZmFjZSAoc3BlY2lmaWNhdGlvbiAgICAqLworLyogICAgb25seSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBjb2RlIGlzIHNoYXJlZCBieSBhbGwgVHJ1ZVR5cGUgYW5kIE9wZW5UeXBlIGRyaXZlcnMuICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDE5OTYtMTk5OSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkICAgICAgICAqLworLyogIG1vZGlmaWVkIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAgKi8KKy8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCisvKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLworLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNpZm5kZWYgVFRUWVBFU19ICisjZGVmaW5lIFRUVFlQRVNfSAorCisKKyNpbmNsdWRlIDxmcmVldHlwZS5oPgorCisKKyNpZmRlZiBfX2NwbHVzcGx1cworICBleHRlcm4gIkMiIHsKKyNlbmRpZgorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiovCisgIC8qKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqLworICAvKioqICAgICAgICAgICAgICAgIERFRklOSVRJT05TIE9GIEJBU0lDIERBVEEgVFlQRVMgICAgICAgICAgICAgICAgICAgICoqKi8KKyAgLyoqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiovCisgIC8qKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBUaGUgUkVERUZJTkUoKSBtYWNybyBpcyB1c2VkIHRvIGNvbnZlcnQgYSBGcmVlVHlwZSBnZW5lcmljIHR5cGUgaW50byAgKi8KKyAgLyogYSBUcnVlVHlwZS1zcGVjaWZpYyBvbmUuICBJdCBzaW1wbHkgcmVwbGFjZXMgdGhlIGBGVF8nIHByZWZpeCBieSAgICAgICovCisgIC8qIGBUVF8nIGluIG9yZGVyIHRvIGRlZmluZSBjb21wYXRpYmxlIHR5cGVzIGxpa2UgVFRfTG9uZywgVFRfRXJyb3IsICAgICAqLworICAvKiBUVF9PdXRsaW5lLCBldGMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjdW5kZWYgIFJFREVGSU5FCisjZGVmaW5lIFJFREVGSU5FKCB0eXBlICkgIHR5cGVkZWYgRlRfIyN0eXBlICBUVF8jI3R5cGUKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX0Jvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgdHlwZWRlZiBvZiB1bnNpZ25lZCBjaGFyLCB1c2VkIGZvciBzaW1wbGUgYm9vbGVhbnMuICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgUkVERUZJTkUoIEJvb2wgKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX0ZXb3JkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgc2lnbmVkIDE2LWJpdCBpbnRlZ2VyIHVzZWQgdG8gc3RvcmUgYSBkaXN0YW5jZSBpbiBvcmlnaW5hbCBmb250ICAqLworICAvKiAgICB1bml0cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIFJFREVGSU5FKCBGV29yZCApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfVUZXb3JkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQW4gdW5zaWduZWQgMTYtYml0IGludGVnZXIgdXNlZCB0byBzdG9yZSBhIGRpc3RhbmNlIGluIG9yaWdpbmFsICAgICovCisgIC8qICAgIGZvbnQgdW5pdHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgUkVERUZJTkUoIFVGV29yZCApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfQ2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSBzaW1wbGUgdHlwZWRlZiBmb3IgdGhlIF9zaWduZWRfIGNoYXIgdHlwZS4gICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBSRURFRklORSggQ2hhciApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfQnl0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSBzaW1wbGUgdHlwZWRlZiBmb3IgdGhlIF91bnNpZ25lZF8gY2hhciB0eXBlLiAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBSRURFRklORSggQnl0ZSApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfU3RyaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSBzaW1wbGUgdHlwZWRlZiBmb3IgdGhlIGNoYXIgdHlwZSwgdXN1YWxseSB1c2VkIGZvciBzdHJpbmdzLiAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBSRURFRklORSggU3RyaW5nICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUVF9TaG9ydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBIHR5cGVkZWYgZm9yIHNpZ25lZCBzaG9ydC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIFJFREVGSU5FKCBTaG9ydCApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfVVNob3J0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSB0eXBlZGVmIGZvciB1bnNpZ25lZCBzaG9ydC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBSRURFRklORSggVVNob3J0ICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUVF9JbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBIHR5cGVkZWYgZm9yIHRoZSBpbnQgdHlwZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIFJFREVGSU5FKCBJbnQgKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX1VJbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgdHlwZWRlZiBmb3IgdGhlIHVuc2lnbmVkIGludCB0eXBlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgUkVERUZJTkUoIFVJbnQgKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX0xvbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgdHlwZWRlZiBmb3Igc2lnbmVkIGxvbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgUkVERUZJTkUoIExvbmcgKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX1VMb25nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgdHlwZWRlZiBmb3IgdW5zaWduZWQgbG9uZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgUkVERUZJTkUoIFVMb25nICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUVF9GMkRvdDE0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBIHNpZ25lZCAyLjE0IGZpeGVkIGZsb2F0IHR5cGUgdXNlZCBmb3IgdW5pdCB2ZWN0b3JzLiAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIFJFREVGSU5FKCBGMkRvdDE0ICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUVF9GMjZEb3Q2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBIHNpZ25lZCAyNi42IGZpeGVkIGZsb2F0IHR5cGUgdXNlZCBmb3IgdmVjdG9yaWFsIHBpeGVsICAgICAgICAgICAgKi8KKyAgLyogICAgY29vcmRpbmF0ZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBSRURFRklORSggRjI2RG90NiApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfRml4ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhpcyB0eXBlIGlzIHVzZWQgdG8gc3RvcmUgMTYuMTYgZml4ZWQgZmxvYXQgdmFsdWVzLCBsaWtlIHNjYWxlcyAgICovCisgIC8qICAgIG9yIG1hdHJpeCBjb2VmZmljaWVudHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgUkVERUZJTkUoIEZpeGVkICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUVF9Qb3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGUgdHlwZSBGVF9Qb3MgaXMgYSAzMi1iaXQgaW50ZWdlciB1c2VkIHRvIHN0b3JlIHZlY3RvcmlhbCAgICAgICAgKi8KKyAgLyogICAgY29vcmRpbmF0ZXMuICBEZXBlbmRpbmcgb24gdGhlIGNvbnRleHQsIHRoZXNlIGNhbiByZXByZXNlbnQgICAgICAgICovCisgIC8qICAgIGRpc3RhbmNlcyBpbiBpbnRlZ2VyIGZvbnQgdW5pdHMsIG9yIDI2LjYgZml4ZWQgZmxvYXQgcGl4ZWwgICAgICAgICAqLworICAvKiAgICBjb29yZGluYXRlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIFJFREVGSU5FKCBQb3MgKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX1ZlY3RvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgc2ltcGxlIHN0cnVjdHVyZSB1c2VkIHRvIHN0b3JlIGEgMmQgdmVjdG9yOyBjb29yZGluYXRlcyBhcmUgb2YgICAqLworICAvKiAgICB0aGUgVFRfUG9zIHR5cGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB4IDo6IFRoZSBob3Jpem9udGFsIGNvb3JkaW5hdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgeSA6OiBUaGUgdmVydGljYWwgY29vcmRpbmF0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBSRURFRklORSggVmVjdG9yICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUVF9Vbml0VmVjdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBIHNpbXBsZSBzdHJ1Y3R1cmUgdXNlZCB0byBzdG9yZSBhIDJkIHZlY3RvciB1bml0IHZlY3Rvci4gIFVzZXMgICAgKi8KKyAgLyogICAgVFRfRjJEb3QxNCB0eXBlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgeCA6OiBIb3Jpem9udGFsIGNvb3JkaW5hdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHkgOjogVmVydGljYWwgY29vcmRpbmF0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgUkVERUZJTkUoIFVuaXRWZWN0b3IgKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX01hdHJpeCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgc2ltcGxlIHN0cnVjdHVyZSB1c2VkIHRvIHN0b3JlIGEgMngyIG1hdHJpeC4gIENvZWZmaWNpZW50cyBhcmUgICAqLworICAvKiAgICBpbiAxNi4xNiBmaXhlZCBmbG9hdCBmb3JtYXQuICBUaGUgY29tcHV0YXRpb24gcGVyZm9ybWVkIGlzOiAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICB4JyA9IHgqeHggKyB5Knh5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgeScgPSB4Knl4ICsgeSp5eSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHh4IDo6IE1hdHJpeCBjb2VmZmljaWVudC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB4eSA6OiBNYXRyaXggY29lZmZpY2llbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgeXggOjogTWF0cml4IGNvZWZmaWNpZW50LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHl5IDo6IE1hdHJpeCBjb2VmZmljaWVudC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgUkVERUZJTkUoIE1hdHJpeCApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfQkJveCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSBzdHJ1Y3R1cmUgdXNlZCB0byBob2xkIGFuIG91dGxpbmUncyBib3VuZGluZyBib3gsIGkuZS4sIHRoZSAgICAgICovCisgIC8qICAgIGNvb3JkaW5hdGVzIG9mIGl0cyBleHRyZW1hIGluIHRoZSBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCAgICAgICAgICAqLworICAvKiAgICBkaXJlY3Rpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB4TWluIDo6IFRoZSBob3Jpem9udGFsIG1pbmltdW0gKGxlZnQtbW9zdCkuICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgeU1pbiA6OiBUaGUgdmVydGljYWwgbWluaW11bSAoYm90dG9tLW1vc3QpLiAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHhNYXggOjogVGhlIGhvcml6b250YWwgbWF4aW11bSAocmlnaHQtbW9zdCkuICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB5TWF4IDo6IFRoZSB2ZXJ0aWNhbCBtYXhpbXVtICh0b3AtbW9zdCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIFJFREVGSU5FKCBCQm94ICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUVF9FcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGUgVHJ1ZVR5cGUgZXJyb3IgY29kZSB0eXBlLiAgQSB2YWx1ZSBvZiAwIGlzIGFsd2F5cyBpbnRlcnByZXRlZCAgKi8KKyAgLyogICAgYXMgYSBzdWNjZXNzZnVsIG9wZXJhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBSRURFRklORSggRXJyb3IgKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqLworICAvKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KKyAgLyoqKiAgICAgICAgICAgICBSRVFVSVJFRCBUUlVFVFlQRS9PUEVOVFlQRSBUQUJMRVMgREVGSU5JVElPTlMgICAgICAgICAqKiovCisgIC8qKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqLworICAvKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUQ19IZWFkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRydWVUeXBlIGNvbGxlY3Rpb24gaGVhZGVyLiAgVGhpcyB0YWJsZSBjb250YWlucyB0aGUgb2Zmc2V0cyBvZiAgICAqLworICAvKiAgICB0aGUgZm9udCBoZWFkZXJzIG9mIGVhY2ggZGlzdGluY3QgVHJ1ZVR5cGUgZmFjZSBpbiB0aGUgZmlsZS4gICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB0YWcgICAgIDo6IE11c3QgYmUgYHR0YyAnIHRvIGluZGljYXRlIGEgVHJ1ZVR5cGUgY29sbGVjdGlvbi4gICAgICAgKi8KKyAgLyogICAgdmVyc2lvbiA6OiBUaGUgdmVyc2lvbiBudW1iZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGNvdW50ICAgOjogVGhlIG51bWJlciBvZiBmYWNlcyBpbiB0aGUgY29sbGVjdGlvbi4gIFRoZSAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgIHNwZWNpZmljYXRpb24gc2F5cyB0aGlzIHNob3VsZCBiZSBhbiB1bnNpZ25lZCBsb25nLCBidXQgKi8KKyAgLyogICAgICAgICAgICAgICB3ZSB1c2UgYSBzaWduZWQgbG9uZyBzaW5jZSB3ZSBuZWVkIHRoZSB2YWx1ZSAtMSBmb3IgICAgICovCisgIC8qICAgICAgICAgICAgICAgc3BlY2lmaWMgcHVycG9zZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBvZmZzZXRzIDo6IFRoZSBvZmZzZXRzIG9mIHRoZSBmb250IGhlYWRlcnMsIG9uZSBwZXIgZmFjZS4gICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgc3RydWN0ICBUVENfSGVhZGVyXworICB7CisgICAgVFRfVUxvbmcgICBUYWc7CisgICAgVFRfRml4ZWQgICB2ZXJzaW9uOworICAgIFRUX0xvbmcgICAgRGlyQ291bnQ7CisgICAgVFRfVUxvbmcqICBUYWJsZURpcmVjdG9yeTsKKworICB9IFRUQ19IZWFkZXI7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUVF9UYWJsZURpciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGlzIHN0cnVjdHVyZSBtb2RlbHMgYSBUcnVlVHlwZSB0YWJsZSBkaXJlY3RvcnkuICBJdCBpcyB1c2VkIHRvICAgKi8KKyAgLyogICAgYWNjZXNzIHRoZSB2YXJpb3VzIHRhYmxlcyBvZiB0aGUgZm9udCBmYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgdmVyc2lvbiAgICAgICA6OiBUaGUgdmVyc2lvbiBudW1iZXI7IHN0YXJ0cyB3aXRoIDB4MDAwMTAwMDAuICAgICAgICovCisgIC8qICAgIG51bVRhYmxlcyAgICAgOjogVGhlIG51bWJlciBvZiB0YWJsZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgc2VhcmNoUmFuZ2UgICA6OiBVbnVzZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGVudHJ5U2VsZWN0b3IgOjogVW51c2VkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICByYW5nZVNoaWZ0ICAgIDo6IFVudXNlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGlzIHN0cnVjdHVyZSBpcyBvbmx5IHVzZWQgZHVyaW5nIGZvbnQgb3BlbmluZy4gICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgc3RydWN0ICBUVF9UYWJsZURpcl8KKyAgeworICAgIFRUX0ZpeGVkICAgdmVyc2lvbjsgICAgICAvKiBzaG91bGQgYmUgMHgxMDAwMCAqLworICAgIFRUX1VTaG9ydCAgbnVtVGFibGVzOyAgICAvKiBudW1iZXIgb2YgdGFibGVzICAqLworCisgICAgVFRfVVNob3J0ICBzZWFyY2hSYW5nZTsgICAgLyogVGhlc2UgcGFyYW1ldGVycyBhcmUgb25seSB1c2VkICAqLworICAgIFRUX1VTaG9ydCAgZW50cnlTZWxlY3RvcjsgIC8qIGZvciBhIGRpY2hvdG9teSBzZWFyY2ggaW4gdGhlICAgKi8KKyAgICBUVF9VU2hvcnQgIHJhbmdlU2hpZnQ7ICAgICAvKiBkaXJlY3RvcnkuICBXZSBpZ25vcmUgdGhlbS4gICAgICovCisKKyAgfSBUVF9UYWJsZURpcjsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX1RhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoaXMgc3RydWN0dXJlIGRlc2NyaWJlcyBhIGdpdmVuIHRhYmxlIG9mIGEgVHJ1ZVR5cGUgZm9udC4gICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRhZyAgICAgIDo6IEEgZm91ci1ieXRlcyB0YWcgZGVzY3JpYmluZyB0aGUgdGFibGUuICAgICAgICAgICAgICAgICAqLworICAvKiAgICBDaGVja1N1bSA6OiBUaGUgdGFibGUgY2hlY2tzdW0uICBUaGlzIHZhbHVlIGNhbiBiZSBpZ25vcmVkLiAgICAgICAgKi8KKyAgLyogICAgT2Zmc2V0ICAgOjogVGhlIG9mZnNldCBvZiB0aGUgdGFibGUgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIFRydWVUeXBlICovCisgIC8qICAgICAgICAgICAgICAgIGZvbnQgaW4gaXRzIHJlc291cmNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBMZW5ndGggICA6OiBUaGUgdGFibGUgbGVuZ3RoIChpbiBieXRlcykuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgc3RydWN0ICBUVF9UYWJsZV8KKyAgeworICAgIFRUX1VMb25nICBUYWc7ICAgICAgICAvKiAgICAgICAgdGFibGUgdHlwZSAqLworICAgIFRUX1VMb25nICBDaGVja1N1bTsgICAvKiAgICB0YWJsZSBjaGVja3N1bSAqLworICAgIFRUX1VMb25nICBPZmZzZXQ7ICAgICAvKiB0YWJsZSBmaWxlIG9mZnNldCAqLworICAgIFRUX1VMb25nICBMZW5ndGg7ICAgICAvKiAgICAgIHRhYmxlIGxlbmd0aCAqLworCisgIH0gVFRfVGFibGU7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUVF9IZWFkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBIHN0cnVjdHVyZSB1c2VkIHRvIG1vZGVsIGEgVHJ1ZVR5cGUgZm9udCBoZWFkZXIgdGFibGUuICBBbGwgICAgICAgKi8KKyAgLyogICAgZmllbGRzIGZvbGxvdyB0aGUgVHJ1ZVR5cGUgc3BlY2lmaWNhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHN0cnVjdCAgVFRfSGVhZGVyXworICB7CisgICAgVFRfRml4ZWQgICBUYWJsZV9WZXJzaW9uOworICAgIFRUX0ZpeGVkICAgRm9udF9SZXZpc2lvbjsKKworICAgIFRUX0xvbmcgICAgQ2hlY2tTdW1fQWRqdXN0OworICAgIFRUX0xvbmcgICAgTWFnaWNfTnVtYmVyOworCisgICAgVFRfVVNob3J0ICBGbGFnczsKKyAgICBUVF9VU2hvcnQgIFVuaXRzX1Blcl9FTTsKKworICAgIFRUX0xvbmcgICAgQ3JlYXRlZCBbMl07CisgICAgVFRfTG9uZyAgICBNb2RpZmllZFsyXTsKKworICAgIFRUX0ZXb3JkICAgeE1pbjsKKyAgICBUVF9GV29yZCAgIHlNaW47CisgICAgVFRfRldvcmQgICB4TWF4OworICAgIFRUX0ZXb3JkICAgeU1heDsKKworICAgIFRUX1VTaG9ydCAgTWFjX1N0eWxlOworICAgIFRUX1VTaG9ydCAgTG93ZXN0X1JlY19QUEVNOworCisgICAgVFRfU2hvcnQgICBGb250X0RpcmVjdGlvbjsKKyAgICBUVF9TaG9ydCAgIEluZGV4X1RvX0xvY19Gb3JtYXQ7CisgICAgVFRfU2hvcnQgICBHbHlwaF9EYXRhX0Zvcm1hdDsKKworICB9IFRUX0hlYWRlcjsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX0hvcmlIZWFkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgc3RydWN0dXJlIHVzZWQgdG8gbW9kZWwgYSBUcnVlVHlwZSBob3Jpem9udGFsIGhlYWRlciwgdGhlIGBoaGVhJyAqLworICAvKiAgICB0YWJsZSwgYXMgd2VsbCBhcyB0aGUgY29ycmVzcG9uZGluZyBob3Jpem9udGFsIG1ldHJpY3MgdGFibGUsICAgICAgKi8KKyAgLyogICAgaS5lLiwgdGhlIGBobXR4JyB0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVmVyc2lvbiAgICAgICAgICAgICAgICA6OiBUaGUgdGFibGUgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBc2NlbmRlciAgICAgICAgICAgICAgIDo6IFRoZSBmb250J3MgYXNjZW5kZXIsIGkuZS4sIHRoZSBkaXN0YW5jZSAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIHRoZSBiYXNlbGluZSB0byB0aGUgdG9wLW1vc3Qgb2YgYWxsICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGggcG9pbnRzIGZvdW5kIGluIHRoZSBmb250LiAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHZhbHVlIGlzIGludmFsaWQgaW4gbWFueSBmb250cywgYXMgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQgaXMgdXN1YWxseSBzZXQgYnkgdGhlIGZvbnQgZGVzaWduZXIsICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBvZnRlbiByZWZsZWN0cyBvbmx5IGEgcG9ydGlvbiBvZiB0aGUgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaHMgZm91bmQgaW4gdGhlIGZvbnQgKG1heWJlIEFTQ0lJKS4gICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlvdSBzaG91bGQgdXNlIHRoZSBgc1R5cG9Bc2NlbmRlcicgZmllbGQgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgT1MvMiB0YWJsZSBpbnN0ZWFkIGlmIHlvdSB3YW50ICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGNvcnJlY3Qgb25lLiAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRGVzY2VuZGVyICAgICAgICAgICAgICA6OiBUaGUgZm9udCdzIGRlc2NlbmRlciwgaS5lLiwgdGhlIGRpc3RhbmNlICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSB0aGUgYmFzZWxpbmUgdG8gdGhlIGJvdHRvbS1tb3N0IG9mICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbCBnbHlwaCBwb2ludHMgZm91bmQgaW4gdGhlIGZvbnQuICBJdCAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBuZWdhdGl2ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgdmFsdWUgaXMgaW52YWxpZCBpbiBtYW55IGZvbnRzLCBhcyAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdCBpcyB1c3VhbGx5IHNldCBieSB0aGUgZm9udCBkZXNpZ25lciwgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIG9mdGVuIHJlZmxlY3RzIG9ubHkgYSBwb3J0aW9uIG9mIHRoZSAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBocyBmb3VuZCBpbiB0aGUgZm9udCAobWF5YmUgQVNDSUkpLiAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWW91IHNob3VsZCB1c2UgdGhlIGBzVHlwb0Rlc2NlbmRlcicgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkIG9mIHRoZSBPUy8yIHRhYmxlIGluc3RlYWQgaWYgeW91ICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YW50IHRoZSBjb3JyZWN0IG9uZS4gICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBMaW5lX0dhcCAgICAgICAgICAgICAgIDo6IFRoZSBmb250J3MgbGluZSBnYXAsIGkuZS4sIHRoZSBkaXN0YW5jZSAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBhZGQgdG8gdGhlIGFzY2VuZGVyIGFuZCBkZXNjZW5kZXIgdG8gICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0IHRoZSBCVEIsIGkuZS4sIHRoZSAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VsaW5lLXRvLWJhc2VsaW5lIGRpc3RhbmNlIGZvciB0aGUgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBhZHZhbmNlX1dpZHRoX01heCAgICAgIDo6IFRoaXMgZmllbGQgaXMgdGhlIG1heGltdW0gb2YgYWxsIGFkdmFuY2UgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aHMgZm91bmQgaW4gdGhlIGZvbnQuICBJdCBjYW4gYmUgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlZCB0byBjb21wdXRlIHRoZSBtYXhpbXVtIHdpZHRoIG9mIGFuICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyYml0cmFyeSBzdHJpbmcgb2YgdGV4dC4gICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG1pbl9MZWZ0X1NpZGVfQmVhcmluZyAgOjogVGhlIG1pbmltdW0gbGVmdCBzaWRlIGJlYXJpbmcgb2YgYWxsICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBocyB3aXRoaW4gdGhlIGZvbnQuICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG1pbl9SaWdodF9TaWRlX0JlYXJpbmcgOjogVGhlIG1pbmltdW0gcmlnaHQgc2lkZSBiZWFyaW5nIG9mIGFsbCAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBocyB3aXRoaW4gdGhlIGZvbnQuICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHhNYXhfRXh0ZW50ICAgICAgICAgICAgOjogVGhlIG1heGltdW0gaG9yaXpvbnRhbCBleHRlbnQgKGkuZS4sIHRoZSAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGB3aWR0aCcgb2YgYSBnbHlwaCdzIGJvdW5kaW5nIGJveCkgZm9yICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGwgZ2x5cGhzIGluIHRoZSBmb250LiAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBjYXJldF9TbG9wZV9SaXNlICAgICAgIDo6IFRoZSByaXNlIGNvZWZmaWNpZW50IG9mIHRoZSBjdXJzb3IncyAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbG9wZSBvZiB0aGUgY3Vyc29yIChzbG9wZT1yaXNlL3J1bikuICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBjYXJldF9TbG9wZV9SdW4gICAgICAgIDo6IFRoZSBydW4gY29lZmZpY2llbnQgb2YgdGhlIGN1cnNvcidzICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbG9wZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBSZXNlcnZlZCAgICAgICAgICAgICAgIDo6IDEwIHJlc2VydmVkIGJ5dGVzLiAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG1ldHJpY19EYXRhX0Zvcm1hdCAgICAgOjogQWx3YXlzIDAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbnVtYmVyX09mX0hNZXRyaWNzICAgICA6OiBOdW1iZXIgb2YgSE1ldHJpY3MgZW50cmllcyBpbiB0aGUgYGhtdHgnICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUgLS0gdGhpcyB2YWx1ZSBjYW4gYmUgc21hbGxlciB0aGFuICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSB0b3RhbCBudW1iZXIgb2YgZ2x5cGhzIGluIHRoZSBmb250LiAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGxvbmdfbWV0cmljcyAgICAgICAgICAgOjogQSBwb2ludGVyIGludG8gdGhlIGBobXR4JyB0YWJsZS4gICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgc2hvcnRfbWV0cmljcyAgICAgICAgICA6OiBBIHBvaW50ZXIgaW50byB0aGUgYGhtdHgnIHRhYmxlLiAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgSU1QT1JUQU5UOiBUaGUgVFRfSG9yaUhlYWRlciBhbmQgVFRfVmVydEhlYWRlciBzdHJ1Y3R1cmVzIHNob3VsZCAgICovCisgIC8qICAgICAgICAgICAgICAgYmUgaWRlbnRpY2FsIGV4Y2VwdCBmb3IgdGhlIG5hbWVzIG9mIHRoZWlyIGZpZWxkcyB3aGljaCAqLworICAvKiAgICAgICAgICAgICAgIGFyZSBkaWZmZXJlbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgVGhpcyBlbnN1cmVzIHRoYXQgYSBzaW5nbGUgZnVuY3Rpb24gaW4gdGhlIGB0dGxvYWQnICAgICAqLworICAvKiAgICAgICAgICAgICAgIG1vZHVsZSBpcyBhYmxlIHRvIHJlYWQgYm90aCB0aGUgaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgKi8KKyAgLyogICAgICAgICAgICAgICBoZWFkZXJzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHN0cnVjdCAgVFRfSG9yaUhlYWRlcl8KKyAgeworICAgIFRUX0ZpeGVkICAgVmVyc2lvbjsKKyAgICBUVF9GV29yZCAgIEFzY2VuZGVyOworICAgIFRUX0ZXb3JkICAgRGVzY2VuZGVyOworICAgIFRUX0ZXb3JkICAgTGluZV9HYXA7CisKKyAgICBUVF9VRldvcmQgIGFkdmFuY2VfV2lkdGhfTWF4OyAgICAgIC8qIGFkdmFuY2Ugd2lkdGggbWF4aW11bSAqLworCisgICAgVFRfRldvcmQgICBtaW5fTGVmdF9TaWRlX0JlYXJpbmc7ICAvKiBtaW5pbXVtIGxlZnQtc2IgICAgICAgKi8KKyAgICBUVF9GV29yZCAgIG1pbl9SaWdodF9TaWRlX0JlYXJpbmc7IC8qIG1pbmltdW0gcmlnaHQtc2IgICAgICAqLworICAgIFRUX0ZXb3JkICAgeE1heF9FeHRlbnQ7ICAgICAgICAgICAgLyogeG1heCBleHRlbnRzICAgICAgICAgICovCisgICAgVFRfRldvcmQgICBjYXJldF9TbG9wZV9SaXNlOworICAgIFRUX0ZXb3JkICAgY2FyZXRfU2xvcGVfUnVuOworICAgIFRUX0ZXb3JkICAgY2FyZXRfT2Zmc2V0OworCisgICAgVFRfU2hvcnQgICBSZXNlcnZlZFs0XTsKKworICAgIFRUX1Nob3J0ICAgbWV0cmljX0RhdGFfRm9ybWF0OworICAgIFRUX1VTaG9ydCAgbnVtYmVyX09mX0hNZXRyaWNzOworCisgICAgLyogVGhlIGZvbGxvd2luZyBmaWVsZHMgYXJlIG5vdCBkZWZpbmVkIGJ5IHRoZSBUcnVlVHlwZSBzcGVjaWZpY2F0aW9uICovCisgICAgLyogYnV0IHRoZXkncmUgdXNlZCB0byBjb25uZWN0IHRoZSBtZXRyaWNzIGhlYWRlciB0byB0aGUgcmVsZXZhbnQgICAgICovCisgICAgLyogYEhNVFgnIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICB2b2lkKiAgICAgIGxvbmdfbWV0cmljczsKKyAgICB2b2lkKiAgICAgIHNob3J0X21ldHJpY3M7CisKKyAgfSBUVF9Ib3JpSGVhZGVyOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfVmVydEhlYWRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSBzdHJ1Y3R1cmUgdXNlZCB0byBtb2RlbCBhIFRydWVUeXBlIHZlcnRpY2FsIGhlYWRlciwgdGhlIGB2aGVhJyAgICovCisgIC8qICAgIHRhYmxlLCBhcyB3ZWxsIGFzIHRoZSBjb3JyZXNwb25kaW5nIHZlcnRpY2FsIG1ldHJpY3MgdGFibGUsIGkuZS4sICAqLworICAvKiAgICB0aGUgYHZtdHgnIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBWZXJzaW9uICAgICAgICAgICAgICAgICA6OiBUaGUgdGFibGUgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEFzY2VuZGVyICAgICAgICAgICAgICAgIDo6IFRoZSBmb250J3MgYXNjZW5kZXIsIGkuZS4sIHRoZSBkaXN0YW5jZSAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIHRoZSBiYXNlbGluZSB0byB0aGUgdG9wLW1vc3Qgb2YgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsIGdseXBoIHBvaW50cyBmb3VuZCBpbiB0aGUgZm9udC4gICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHZhbHVlIGlzIGludmFsaWQgaW4gbWFueSBmb250cywgYXMgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQgaXMgdXN1YWxseSBzZXQgYnkgdGhlIGZvbnQgZGVzaWduZXIsICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBvZnRlbiByZWZsZWN0cyBvbmx5IGEgcG9ydGlvbiBvZiAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgZ2x5cGhzIGZvdW5kIGluIHRoZSBmb250IChtYXliZSAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNDSUkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZb3Ugc2hvdWxkIHVzZSB0aGUgYHNUeXBvQXNjZW5kZXInICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQgb2YgdGhlIE9TLzIgdGFibGUgaW5zdGVhZCBpZiB5b3UgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhbnQgdGhlIGNvcnJlY3Qgb25lLiAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRGVzY2VuZGVyICAgICAgICAgICAgICAgOjogVGhlIGZvbnQncyBkZXNjZW5kZXIsIGkuZS4sIHRoZSAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3RhbmNlIGZyb20gdGhlIGJhc2VsaW5lIHRvIHRoZSAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3R0b20tbW9zdCBvZiBhbGwgZ2x5cGggcG9pbnRzIGZvdW5kICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIGZvbnQuICBJdCBpcyBuZWdhdGl2ZS4gICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHZhbHVlIGlzIGludmFsaWQgaW4gbWFueSBmb250cywgYXMgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQgaXMgdXN1YWxseSBzZXQgYnkgdGhlIGZvbnQgZGVzaWduZXIsICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBvZnRlbiByZWZsZWN0cyBvbmx5IGEgcG9ydGlvbiBvZiAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgZ2x5cGhzIGZvdW5kIGluIHRoZSBmb250IChtYXliZSAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNDSUkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZb3Ugc2hvdWxkIHVzZSB0aGUgYHNUeXBvRGVzY2VuZGVyJyAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQgb2YgdGhlIE9TLzIgdGFibGUgaW5zdGVhZCBpZiB5b3UgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhbnQgdGhlIGNvcnJlY3Qgb25lLiAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgTGluZV9HYXAgICAgICAgICAgICAgICAgOjogVGhlIGZvbnQncyBsaW5lIGdhcCwgaS5lLiwgdGhlIGRpc3RhbmNlICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGFkZCB0byB0aGUgYXNjZW5kZXIgYW5kIGRlc2NlbmRlciB0byAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQgdGhlIEJUQiwgaS5lLiwgdGhlICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZWxpbmUtdG8tYmFzZWxpbmUgZGlzdGFuY2UgZm9yIHRoZSAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgYWR2YW5jZV9IZWlnaHRfTWF4ICAgICAgOjogVGhpcyBmaWVsZCBpcyB0aGUgbWF4aW11bSBvZiBhbGwgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkdmFuY2UgaGVpZ2h0cyBmb3VuZCBpbiB0aGUgZm9udC4gIEl0ICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW4gYmUgdXNlZCB0byBjb21wdXRlIHRoZSBtYXhpbXVtICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0IG9mIGFuIGFyYml0cmFyeSBzdHJpbmcgb2YgdGV4dC4gICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBtaW5fVG9wX1NpZGVfQmVhcmluZyAgICA6OiBUaGUgbWluaW11bSB0b3Agc2lkZSBiZWFyaW5nIG9mIGFsbCAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGhzIHdpdGhpbiB0aGUgZm9udC4gICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBtaW5fQm90dG9tX1NpZGVfQmVhcmluZyA6OiBUaGUgbWluaW11bSBib3R0b20gc2lkZSBiZWFyaW5nIG9mIGFsbCAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGhzIHdpdGhpbiB0aGUgZm9udC4gICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB5TWF4X0V4dGVudCAgICAgICAgICAgICA6OiBUaGUgbWF4aW11bSB2ZXJ0aWNhbCBleHRlbnQgKGkuZS4sIHRoZSAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYGhlaWdodCcgb2YgYSBnbHlwaCdzIGJvdW5kaW5nIGJveCkgZm9yICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbCBnbHlwaHMgaW4gdGhlIGZvbnQuICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgY2FyZXRfU2xvcGVfUmlzZSAgICAgICAgOjogVGhlIHJpc2UgY29lZmZpY2llbnQgb2YgdGhlIGN1cnNvcidzICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsb3BlIG9mIHRoZSBjdXJzb3IgKHNsb3BlPXJpc2UvcnVuKS4gICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgY2FyZXRfU2xvcGVfUnVuICAgICAgICAgOjogVGhlIHJ1biBjb2VmZmljaWVudCBvZiB0aGUgY3Vyc29yJ3MgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsb3BlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgUmVzZXJ2ZWQgICAgICAgICAgICAgICAgOjogMTAgcmVzZXJ2ZWQgYnl0ZXMuICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBtZXRyaWNfRGF0YV9Gb3JtYXQgICAgICA6OiBBbHdheXMgMC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG51bWJlcl9PZl9ITWV0cmljcyAgICAgIDo6IE51bWJlciBvZiBWTWV0cmljcyBlbnRyaWVzIGluIHRoZSAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgdm10eCcgdGFibGUgLS0gdGhpcyB2YWx1ZSBjYW4gYmUgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc21hbGxlciB0aGFuIHRoZSB0b3RhbCBudW1iZXIgb2YgZ2x5cGhzICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBmb250LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbG9uZ19tZXRyaWNzICAgICAgICAgICA6OiBBIHBvaW50ZXIgaW50byB0aGUgYHZtdHgnIHRhYmxlLiAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzaG9ydF9tZXRyaWNzICAgICAgICAgIDo6IEEgcG9pbnRlciBpbnRvIHRoZSBgdm10eCcgdGFibGUuICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBJTVBPUlRBTlQ6IFRoZSBUVF9Ib3JpSGVhZGVyIGFuZCBUVF9WZXJ0SGVhZGVyIHN0cnVjdHVyZXMgc2hvdWxkICAgKi8KKyAgLyogICAgICAgICAgICAgICBiZSBpZGVudGljYWwgZXhjZXB0IGZvciB0aGUgbmFtZXMgb2YgdGhlaXIgZmllbGRzIHdoaWNoICovCisgIC8qICAgICAgICAgICAgICAgYXJlIGRpZmZlcmVudC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICBUaGlzIGVuc3VyZXMgdGhhdCBhIHNpbmdsZSBmdW5jdGlvbiBpbiB0aGUgYHR0bG9hZCcgICAgICovCisgIC8qICAgICAgICAgICAgICAgbW9kdWxlIGlzIGFibGUgdG8gcmVhZCBib3RoIHRoZSBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCAqLworICAvKiAgICAgICAgICAgICAgIGhlYWRlcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgc3RydWN0IFRUX1ZlcnRIZWFkZXJfCisgIHsKKyAgICBUVF9GaXhlZCAgIFZlcnNpb247CisgICAgVFRfRldvcmQgICBBc2NlbmRlcjsKKyAgICBUVF9GV29yZCAgIERlc2NlbmRlcjsKKyAgICBUVF9GV29yZCAgIExpbmVfR2FwOworCisgICAgVFRfVUZXb3JkICBhZHZhbmNlX0hlaWdodF9NYXg7ICAgICAgLyogYWR2YW5jZSBoZWlnaHQgbWF4aW11bSAqLworCisgICAgVFRfRldvcmQgICBtaW5fVG9wX1NpZGVfQmVhcmluZzsgICAgLyogbWluaW11bSBsZWZ0LXNiIG9yIHRvcC1zYiAgICAgICAqLworICAgIFRUX0ZXb3JkICAgbWluX0JvdHRvbV9TaWRlX0JlYXJpbmc7IC8qIG1pbmltdW0gcmlnaHQtc2Igb3IgYm90dG9tLXNiICAgKi8KKyAgICBUVF9GV29yZCAgIHlNYXhfRXh0ZW50OyAgICAgICAgICAgICAvKiB4bWF4IG9yIHltYXggZXh0ZW50cyAgICAgICAgICAgICovCisgICAgVFRfRldvcmQgICBjYXJldF9TbG9wZV9SaXNlOworICAgIFRUX0ZXb3JkICAgY2FyZXRfU2xvcGVfUnVuOworICAgIFRUX0ZXb3JkICAgY2FyZXRfT2Zmc2V0OworCisgICAgVFRfU2hvcnQgICBSZXNlcnZlZFs0XTsKKworICAgIFRUX1Nob3J0ICAgbWV0cmljX0RhdGFfRm9ybWF0OworICAgIFRUX1VTaG9ydCAgbnVtYmVyX09mX1ZNZXRyaWNzOworCisgICAgLyogVGhlIGZvbGxvd2luZyBmaWVsZHMgYXJlIG5vdCBkZWZpbmVkIGJ5IHRoZSBUcnVlVHlwZSBzcGVjaWZpY2F0aW9uICovCisgICAgLyogYnV0IHRoZXkncmUgdXNlZCB0byBjb25uZWN0IHRoZSBtZXRyaWNzIGhlYWRlciB0byB0aGUgcmVsZXZhbnQgICAgICovCisgICAgLyogYEhNVFgnIG9yIGBWTVRYJyB0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICB2b2lkKiAgICAgIGxvbmdfbWV0cmljczsKKyAgICB2b2lkKiAgICAgIHNob3J0X21ldHJpY3M7CisKKyAgfSBUVF9WZXJ0SGVhZGVyOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfT1MyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSBzdHJ1Y3R1cmUgdXNlZCB0byBtb2RlbCBhIFRydWVUeXBlIE9TLzIgdGFibGUuIFRoaXMgaXMgdGhlIGxvbmcgICovCisgIC8qICAgIHRhYmxlIHZlcnNpb24uICBBbGwgZmllbGRzIGNvbXBseSB0byB0aGUgVHJ1ZVR5cGUgc3BlY2lmaWNhdGlvbi4gICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgTm90ZSB0aGF0IHdlIG5vdyBzdXBwb3J0IG9sZCBNYWMgZm9udHMgd2hpY2ggZG8gbm90IGluY2x1ZGUgYW4gICAgICovCisgIC8qICAgIE9TLzIgdGFibGUuICBJbiB0aGlzIGNhc2UsIHRoZSBgdmVyc2lvbicgZmllbGQgaXMgYWx3YXlzIHNldCB0byAgICAqLworICAvKiAgICAweEZGRkYuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgc3RydWN0ICBUVF9PUzJfCisgIHsKKyAgICBUVF9VU2hvcnQgIHZlcnNpb247ICAgICAgICAgICAgICAgIC8qIDB4MDAwMSAtIG1vcmUgb3IgMHhGRkZGICovCisgICAgVFRfRldvcmQgICB4QXZnQ2hhcldpZHRoOworICAgIFRUX1VTaG9ydCAgdXNXZWlnaHRDbGFzczsKKyAgICBUVF9VU2hvcnQgIHVzV2lkdGhDbGFzczsKKyAgICBUVF9TaG9ydCAgIGZzVHlwZTsKKyAgICBUVF9GV29yZCAgIHlTdWJzY3JpcHRYU2l6ZTsKKyAgICBUVF9GV29yZCAgIHlTdWJzY3JpcHRZU2l6ZTsKKyAgICBUVF9GV29yZCAgIHlTdWJzY3JpcHRYT2Zmc2V0OworICAgIFRUX0ZXb3JkICAgeVN1YnNjcmlwdFlPZmZzZXQ7CisgICAgVFRfRldvcmQgICB5U3VwZXJzY3JpcHRYU2l6ZTsKKyAgICBUVF9GV29yZCAgIHlTdXBlcnNjcmlwdFlTaXplOworICAgIFRUX0ZXb3JkICAgeVN1cGVyc2NyaXB0WE9mZnNldDsKKyAgICBUVF9GV29yZCAgIHlTdXBlcnNjcmlwdFlPZmZzZXQ7CisgICAgVFRfRldvcmQgICB5U3RyaWtlb3V0U2l6ZTsKKyAgICBUVF9GV29yZCAgIHlTdHJpa2VvdXRQb3NpdGlvbjsKKyAgICBUVF9TaG9ydCAgIHNGYW1pbHlDbGFzczsKKworICAgIFRUX0J5dGUgICAgcGFub3NlWzEwXTsKKworICAgIFRUX1VMb25nICAgdWxVbmljb2RlUmFuZ2UxOyAgICAgICAgLyogQml0cyAwLTMxICAgKi8KKyAgICBUVF9VTG9uZyAgIHVsVW5pY29kZVJhbmdlMjsgICAgICAgIC8qIEJpdHMgMzItNjMgICovCisgICAgVFRfVUxvbmcgICB1bFVuaWNvZGVSYW5nZTM7ICAgICAgICAvKiBCaXRzIDY0LTk1ICAqLworICAgIFRUX1VMb25nICAgdWxVbmljb2RlUmFuZ2U0OyAgICAgICAgLyogQml0cyA5Ni0xMjcgKi8KKworICAgIFRUX0NoYXIgICAgYWNoVmVuZElEWzRdOworCisgICAgVFRfVVNob3J0ICBmc1NlbGVjdGlvbjsKKyAgICBUVF9VU2hvcnQgIHVzRmlyc3RDaGFySW5kZXg7CisgICAgVFRfVVNob3J0ICB1c0xhc3RDaGFySW5kZXg7CisgICAgVFRfU2hvcnQgICBzVHlwb0FzY2VuZGVyOworICAgIFRUX1Nob3J0ICAgc1R5cG9EZXNjZW5kZXI7CisgICAgVFRfU2hvcnQgICBzVHlwb0xpbmVHYXA7CisgICAgVFRfVVNob3J0ICB1c1dpbkFzY2VudDsKKyAgICBUVF9VU2hvcnQgIHVzV2luRGVzY2VudDsKKworICAgIC8qIG9ubHkgdmVyc2lvbiAxIHRhYmxlczogKi8KKworICAgIFRUX1VMb25nICAgdWxDb2RlUGFnZVJhbmdlMTsgICAgICAgLyogQml0cyAwLTMxICAgKi8KKyAgICBUVF9VTG9uZyAgIHVsQ29kZVBhZ2VSYW5nZTI7ICAgICAgIC8qIEJpdHMgMzItNjMgICovCisKKyAgfSBUVF9PUzI7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUVF9Qb3N0c2NyaXB0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBIHN0cnVjdHVyZSB1c2VkIHRvIG1vZGVsIGEgVHJ1ZVR5cGUgUG9zdHNjcmlwdCB0YWJsZS4gIEFsbCBmaWVsZHMgKi8KKyAgLyogICAgY29tcGx5IHRvIHRoZSBUcnVlVHlwZSB0YWJsZS4gIFRoaXMgc3RydWN0dXJlIGRvZXMgbm90IHJlZmVyZW5jZSAgICovCisgIC8qICAgIHRoZSBQb3N0c2NyaXB0IGdseXBoIG5hbWVzLCB3aGljaCBjYW4gYmUgbmV2ZXJ0aGVsZXNzIGFjY2Vzc2VkICAgICAqLworICAvKiAgICB3aXRoIHRoZSBgdHRwb3N0JyBtb2R1bGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgc3RydWN0ICBUVF9Qb3N0c2NyaXB0XworICB7CisgICAgVFRfRml4ZWQgIEZvcm1hdFR5cGU7CisgICAgVFRfRml4ZWQgIGl0YWxpY0FuZ2xlOworICAgIFRUX0ZXb3JkICB1bmRlcmxpbmVQb3NpdGlvbjsKKyAgICBUVF9GV29yZCAgdW5kZXJsaW5lVGhpY2tuZXNzOworICAgIFRUX1VMb25nICBpc0ZpeGVkUGl0Y2g7CisgICAgVFRfVUxvbmcgIG1pbk1lbVR5cGU0MjsKKyAgICBUVF9VTG9uZyAgbWF4TWVtVHlwZTQyOworICAgIFRUX1VMb25nICBtaW5NZW1UeXBlMTsKKyAgICBUVF9VTG9uZyAgbWF4TWVtVHlwZTE7CisKKyAgICAvKiBHbHlwaCBuYW1lcyBmb2xsb3cgaW4gdGhlIGZpbGUsIGJ1dCB3ZSBkb24ndCAgICovCisgICAgLyogbG9hZCB0aGVtIGJ5IGRlZmF1bHQuICBTZWUgdGhlIHR0cG9zdC5jIGZpbGUuICAqLworCisgIH0gVFRfUG9zdHNjcmlwdDsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX0NNYXBEaXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoaXMgc3RydWN0dXJlIGRlc2NyaWJlcyB0aGUgZGlyZWN0b3J5IG9mIHRoZSBgY21hcCcgdGFibGUsICAgICAgICAqLworICAvKiAgICBjb250YWluaW5nIHRoZSBmb250J3MgY2hhcmFjdGVyIG1hcHBpbmdzIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB0YWJsZVZlcnNpb25OdW1iZXIgOjogVGhlIHZlcnNpb24gbnVtYmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbnVtQ01hcHMgICAgICAgICAgIDo6IFRoZSBudW1iZXIgb2YgY2hhcm1hcHMgaW4gdGhlIGZvbnQuICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhpcyBzdHJ1Y3R1cmUgaXMgb25seSB1c2VkIGR1cmluZyBmb250IGxvYWRpbmcuICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHN0cnVjdCAgVFRfQ01hcERpcl8KKyAgeworICAgIFRUX1VTaG9ydCAgdGFibGVWZXJzaW9uTnVtYmVyOworICAgIFRUX1VTaG9ydCAgbnVtQ01hcHM7CisKKyAgfSBUVF9DTWFwRGlyOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfQ01hcERpckVudHJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhpcyBzdHJ1Y3R1cmUgZGVzY3JpYmVzIGEgY2hhcm1hcCBpbiBhIFRydWVUeXBlIGZvbnQuICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgcGxhdGZvcm1JRCA6OiBBbiBJRCB1c2VkIHRvIHNwZWNpZnkgZm9yIHdoaWNoIHBsYXRmb3JtIHRoaXMgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgY2hhcm1hcCBpcyBkZWZpbmVkIChGcmVlVHlwZSBtYW5hZ2VzIGFsbCBwbGF0Zm9ybXMpLiAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZW5jb2RpbmdJRCA6OiBBIHBsYXRmb3JtLXNwZWNpZmljIElEIHVzZWQgdG8gaW5kaWNhdGUgd2hpY2ggc291cmNlICovCisgIC8qICAgICAgICAgICAgICAgICAgZW5jb2RpbmcgaXMgdXNlZCBpbiB0aGlzIGNoYXJtYXAuICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgb2Zmc2V0IDo6ICAgICBUaGUgb2Zmc2V0IG9mIHRoZSBjaGFybWFwIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiAgICovCisgIC8qICAgICAgICAgICAgICAgICAgdGhlIGBjbWFwJyB0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoaXMgc3RydWN0dXJlIGlzIG9ubHkgdXNlZCBkdXJpbmcgZm9udCBsb2FkaW5nLiAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBzdHJ1Y3QgIFRUX0NNYXBEaXJFbnRyeV8KKyAgeworICAgIFRUX1VTaG9ydCAgcGxhdGZvcm1JRDsKKyAgICBUVF9VU2hvcnQgIHBsYXRmb3JtRW5jb2RpbmdJRDsKKyAgICBUVF9Mb25nICAgIG9mZnNldDsKKworICB9IFRUX0NNYXBEaXJFbnRyeTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX01heFByb2ZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoZSBtYXhpbXVtIHByb2ZpbGUgaXMgYSB0YWJsZSBjb250YWluaW5nIG1hbnkgbWF4IHZhbHVlcyB3aGljaCAgICAqLworICAvKiAgICBjYW4gYmUgdXNlZCB0byBwcmUtYWxsb2NhdGUgYXJyYXlzLiAgVGhpcyBlbnN1cmVzIHRoYXQgbm8gbWVtb3J5ICAgKi8KKyAgLyogICAgYWxsb2NhdGlvbiBvY2N1cnMgZHVyaW5nIGEgZ2x5cGggbG9hZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgdmVyc2lvbiAgICAgICAgICAgICAgIDo6IFRoZSB2ZXJzaW9uIG51bWJlci4gICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBudW1HbHlwaHMgICAgICAgICAgICAgOjogVGhlIG51bWJlciBvZiBnbHlwaHMgaW4gdGhpcyBUcnVlVHlwZSAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBtYXhQb2ludHMgICAgICAgICAgICAgOjogVGhlIG1heGltdW0gbnVtYmVyIG9mIHBvaW50cyBpbiBhICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbi1jb21wb3NpdGUgVHJ1ZVR5cGUgZ2x5cGguICBTZWUgYWxzbyAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgc3RydWN0dXJlIGVsZW1lbnQgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYG1heENvbXBvc2l0ZVBvaW50cycuICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG1heENvbnRvdXJzICAgICAgICAgICA6OiBUaGUgbWF4aW11bSBudW1iZXIgb2YgY29udG91cnMgaW4gYSAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uLWNvbXBvc2l0ZSBUcnVlVHlwZSBnbHlwaC4gIFNlZSBhbHNvICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBzdHJ1Y3R1cmUgZWxlbWVudCAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgbWF4Q29tcG9zaXRlQ29udG91cnMnLiAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbWF4Q29tcG9zaXRlUG9pbnRzICAgIDo6IFRoZSBtYXhpbXVtIG51bWJlciBvZiBwb2ludHMgaW4gYSAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb3NpdGUgVHJ1ZVR5cGUgZ2x5cGguICBTZWUgYWxzbyB0aGUgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0dXJlIGVsZW1lbnQgYG1heFBvaW50cycuICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG1heENvbXBvc2l0ZUNvbnRvdXJzICA6OiBUaGUgbWF4aW11bSBudW1iZXIgb2YgY29udG91cnMgaW4gYSAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9zaXRlIFRydWVUeXBlIGdseXBoLiAgU2VlIGFsc28gdGhlICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdHVyZSBlbGVtZW50IGBtYXhDb250b3VycycuICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBtYXhab25lcyAgICAgICAgICAgICAgOjogVGhlIG1heGltdW0gbnVtYmVyIG9mIHpvbmVzIHVzZWQgZm9yICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBoIGhpbnRpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBtYXhUd2lsaWdodFBvaW50cyAgICAgOjogVGhlIG1heGltdW0gbnVtYmVyIG9mIHBvaW50cyBpbiB0aGUgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR3aWxpZ2h0IHpvbmUgdXNlZCBmb3IgZ2x5cGggaGludGluZy4gICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBtYXhTdG9yYWdlICAgICAgICAgICAgOjogVGhlIG1heGltdW0gbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JhZ2UgYXJlYSB1c2VkIGZvciBnbHlwaCBoaW50aW5nLiAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBtYXhGdW5jdGlvbkRlZnMgICAgICAgOjogVGhlIG1heGltdW0gbnVtYmVyIG9mIGZ1bmN0aW9uICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmluaXRpb25zIGluIHRoZSBUcnVlVHlwZSBieXRlY29kZSBmb3IgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGZvbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbWF4SW5zdHJ1Y3Rpb25EZWZzICAgIDo6IFRoZSBtYXhpbXVtIG51bWJlciBvZiBpbnN0cnVjdGlvbiAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZpbml0aW9ucyBpbiB0aGUgVHJ1ZVR5cGUgYnl0ZWNvZGUgZm9yICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBmb250LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG1heFN0YWNrRWxlbWVudHMgICAgICA6OiBUaGUgbWF4aW11bSBudW1iZXIgb2Ygc3RhY2sgZWxlbWVudHMgdXNlZCAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyaW5nIGJ5dGVjb2RlIGludGVycHJldGF0aW9uLiAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG1heFNpemVPZkluc3RydWN0aW9ucyA6OiBUaGUgbWF4aW11bSBudW1iZXIgb2YgVHJ1ZVR5cGUgb3Bjb2RlcyAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlZCBmb3IgZ2x5cGggaGludGluZy4gICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG1heENvbXBvbmVudEVsZW1lbnRzICA6OiBBbiBvYnNjdXJlIHZhbHVlIHJlbGF0ZWQgdG8gY29tcG9zaXRlICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGhzIGRlZmluaXRpb25zLiAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG1heENvbXBvbmVudERlcHRoICAgICA6OiBBbiBvYnNjdXJlIHZhbHVlIHJlbGF0ZWQgdG8gY29tcG9zaXRlICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGhzIGRlZmluaXRpb25zLiAgUHJvYmFibHkgdGhlIG1heGltdW0gKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlciBvZiBzaW1wbGUgZ2x5cGhzIGluIGEgY29tcG9zaXRlLiAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhpcyBzdHJ1Y3R1cmUgaXMgb25seSB1c2VkIGR1cmluZyBmb250IGxvYWRpbmcuICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHN0cnVjdCAgVFRfTWF4UHJvZmlsZV8KKyAgeworICAgIFRUX0ZpeGVkICAgdmVyc2lvbjsKKyAgICBUVF9VU2hvcnQgIG51bUdseXBoczsKKyAgICBUVF9VU2hvcnQgIG1heFBvaW50czsKKyAgICBUVF9VU2hvcnQgIG1heENvbnRvdXJzOworICAgIFRUX1VTaG9ydCAgbWF4Q29tcG9zaXRlUG9pbnRzOworICAgIFRUX1VTaG9ydCAgbWF4Q29tcG9zaXRlQ29udG91cnM7CisgICAgVFRfVVNob3J0ICBtYXhab25lczsKKyAgICBUVF9VU2hvcnQgIG1heFR3aWxpZ2h0UG9pbnRzOworICAgIFRUX1VTaG9ydCAgbWF4U3RvcmFnZTsKKyAgICBUVF9VU2hvcnQgIG1heEZ1bmN0aW9uRGVmczsKKyAgICBUVF9VU2hvcnQgIG1heEluc3RydWN0aW9uRGVmczsKKyAgICBUVF9VU2hvcnQgIG1heFN0YWNrRWxlbWVudHM7CisgICAgVFRfVVNob3J0ICBtYXhTaXplT2ZJbnN0cnVjdGlvbnM7CisgICAgVFRfVVNob3J0ICBtYXhDb21wb25lbnRFbGVtZW50czsKKyAgICBUVF9VU2hvcnQgIG1heENvbXBvbmVudERlcHRoOworCisgIH0gVFRfTWF4UHJvZmlsZTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX0xvbmdNZXRyaWNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgc3RydWN0dXJlIG1vZGVsaW5nIHRoZSBsb25nIG1ldHJpY3Mgb2YgdGhlIGBobXR4JyBhbmQgYHZtdHgnICAgICAqLworICAvKiAgICBUcnVlVHlwZSB0YWJsZXMuICBUaGUgdmFsdWVzIGFyZSBleHByZXNzZWQgaW4gZm9udCB1bml0cy4gICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBhZHZhbmNlIDo6IFRoZSBhZHZhbmNlIHdpZHRoIG9yIGhlaWdodCBmb3IgdGhlIGdseXBoLiAgICAgICAgICAgICAgKi8KKyAgLyogICAgYmVhcmluZyA6OiBUaGUgbGVmdC1zaWRlIG9yIHRvcC1zaWRlIGJlYXJpbmcgZm9yIHRoZSBnbHlwaC4gICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHN0cnVjdCAgVFRfTG9uZ01ldHJpY3NfCisgIHsKKyAgICBUVF9VU2hvcnQgIGFkdmFuY2U7CisgICAgVFRfU2hvcnQgICBiZWFyaW5nOworCisgIH0gVFRfTG9uZ01ldHJpY3M7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxUeXBlPiBUVF9TaG9ydE1ldHJpY3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgc2ltcGxlIHR5cGUgdG8gbW9kZWwgdGhlIHNob3J0IG1ldHJpY3Mgb2YgdGhlIGBobXR4JyBhbmQgYHZtdHgnICAqLworICAvKiAgICB0YWJsZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgVFRfU2hvcnQgIFRUX1Nob3J0TWV0cmljczsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX05hbWVSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgc3RydWN0dXJlIG1vZGVsaW5nIFRydWVUeXBlIG5hbWUgcmVjb3Jkcy4gIE5hbWUgcmVjb3JkcyBhcmUgdXNlZCAqLworICAvKiAgICB0byBzdG9yZSBpbXBvcnRhbnQgc3RyaW5ncyBsaWtlIGZhbWlseSBuYW1lLCBzdHlsZSBuYW1lLCAgICAgICAgICAgKi8KKyAgLyogICAgY29weXJpZ2h0LCBldGMuIGluIF9sb2NhbGl6ZWRfIHZlcnNpb25zIChpLmUuLCBsYW5ndWFnZSwgZW5jb2RpbmcsICovCisgIC8qICAgIGV0YykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHBsYXRmb3JtSUQgICA6OiBUaGUgSUQgb2YgdGhlIG5hbWUncyBlbmNvZGluZyBwbGF0Zm9ybS4gICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZW5jb2RpbmdJRCAgIDo6IFRoZSBwbGF0Zm9ybS1zcGVjaWZpYyBJRCBmb3IgdGhlIG5hbWUncyBlbmNvZGluZy4gICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBsYW5ndWFnZUlEICAgOjogVGhlIHBsYXRmb3JtLXNwZWNpZmljIElEIGZvciB0aGUgbmFtZSdzIGxhbmd1YWdlLiAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG5hbWVJRCAgICAgICA6OiBUaGUgSUQgc3BlY2lmeWluZyB3aGF0IGtpbmQgb2YgbmFtZSB0aGlzIGlzLiAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgc3RyaW5nTGVuZ3RoIDo6IFRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyBpbiBieXRlcy4gICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzdHJpbmdPZmZzZXQgOjogVGhlIG9mZnNldCB0byB0aGUgc3RyaW5nIGluIHRoZSBgbmFtZScgdGFibGUuICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHN0cmluZyAgICAgICA6OiBBIHBvaW50ZXIgdG8gdGhlIHN0cmluZydzIGJ5dGVzLiAgTm90ZSB0aGF0IHRoZXNlICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgYXJlIHVzdWFsbHkgVVRGLTE2IGVuY29kZWQgY2hhcmFjdGVycy4gICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgc3RydWN0ICBUVF9OYW1lUmVjXworICB7CisgICAgVFRfVVNob3J0ICBwbGF0Zm9ybUlEOworICAgIFRUX1VTaG9ydCAgZW5jb2RpbmdJRDsKKyAgICBUVF9VU2hvcnQgIGxhbmd1YWdlSUQ7CisgICAgVFRfVVNob3J0ICBuYW1lSUQ7CisgICAgVFRfVVNob3J0ICBzdHJpbmdMZW5ndGg7CisgICAgVFRfVVNob3J0ICBzdHJpbmdPZmZzZXQ7CisKKyAgICAvKiB0aGlzIGxhc3QgZmllbGQgaXMgbm90IGRlZmluZWQgaW4gdGhlIHNwZWMgKi8KKyAgICAvKiBidXQgdXNlZCBieSB0aGUgRnJlZVR5cGUgZW5naW5lICAgICAgICAgICAgKi8KKworICAgIFRUX0J5dGUqICAgc3RyaW5nOworCisgIH0gVFRfTmFtZVJlYzsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX05hbWVUYWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgc3RydWN0dXJlIG1vZGVsaW5nIHRoZSBUcnVlVHlwZSBuYW1lIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZvcm1hdCAgICAgICAgIDo6IFRoZSBmb3JtYXQgb2YgdGhlIG5hbWUgdGFibGUuICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbnVtTmFtZVJlY29yZHMgOjogVGhlIG51bWJlciBvZiBuYW1lcyBpbiB0YWJsZS4gICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzdG9yYWdlT2Zmc2V0ICA6OiBUaGUgb2Zmc2V0IG9mIHRoZSBuYW1lIHRhYmxlIGluIHRoZSBgbmFtZScgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgVHJ1ZVR5cGUgdGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBuYW1lcyAgICAgICAgICA6OiBBbiBhcnJheSBvZiBuYW1lIHJlY29yZHMuICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHN0b3JhZ2UgICAgICAgIDo6IFRoZSBuYW1lcyBzdG9yYWdlIGFyZWEuICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBzdHJ1Y3QgIFRUX05hbWVUYWJsZV8KKyAgeworICAgIFRUX1VTaG9ydCAgICBmb3JtYXQ7CisgICAgVFRfVVNob3J0ICAgIG51bU5hbWVSZWNvcmRzOworICAgIFRUX1VTaG9ydCAgICBzdG9yYWdlT2Zmc2V0OworICAgIFRUX05hbWVSZWMqICBuYW1lczsKKyAgICBUVF9CeXRlKiAgICAgc3RvcmFnZTsKKworICB9IFRUX05hbWVUYWJsZTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqLworICAvKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KKyAgLyoqKiAgICAgICAgICAgICBPUFRJT05BTCBUUlVFVFlQRS9PUEVOVFlQRSBUQUJMRVMgREVGSU5JVElPTlMgICAgICAgICAqKiovCisgIC8qKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqLworICAvKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX0dhc3BSYW5nZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgdGlueSBzdHJ1Y3R1cmUgdXNlZCB0byBtb2RlbCBhIGdhc3AgcmFuZ2UgYWNjb3JkaW5nIHRvIHRoZSAgICAgICAqLworICAvKiAgICBUcnVlVHlwZSBzcGVjaWZpY2F0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBtYXhQUEVNICA6OiBUaGUgbWF4aW11bSBwcGVtIHZhbHVlIHRvIHdoaWNoIGBnYXNwRmxhZycgYXBwbGllcy4gICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGdhc3BGbGFnIDo6IEEgZmxhZyBkZXNjcmliaW5nIHRoZSBncmlkLWZpdHRpbmcgYW5kIGFudGktYWxpYXNpbmcgICAqLworICAvKiAgICAgICAgICAgICAgICBtb2RlcyB0byBiZSB1c2VkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgc3RydWN0ICBUVF9HYXNwUmFuZ2VfCisgIHsKKyAgICBUVF9VU2hvcnQgIG1heFBQRU07CisgICAgVFRfVVNob3J0ICBnYXNwRmxhZzsKKworICB9IFRUX0dhc3BSYW5nZTsKKworCisjZGVmaW5lIFRUX0dBU1BfR1JJREZJVCAgMHgwMQorI2RlZmluZSBUVF9HQVNQX0RPR1JBWSAgIDB4MDIKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX0dhc3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgc3RydWN0dXJlIG1vZGVsaW5nIHRoZSBUcnVlVHlwZSBgZ2FzcCcgdGFibGUgdXNlZCB0byBzcGVjaWZ5ICAgICAqLworICAvKiAgICBncmlkLWZpdHRpbmcgYW5kIGFudGktYWxpYXNpbmcgYmVoYXZpb3VyLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB2ZXJzaW9uICAgIDo6IFRoZSB2ZXJzaW9uIG51bWJlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbnVtUmFuZ2VzICA6OiBUaGUgbnVtYmVyIG9mIGdhc3AgcmFuZ2VzIGluIHRhYmxlLiAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGdhc3BSYW5nZXMgOjogQW4gYXJyYXkgb2YgZ2FzcCByYW5nZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBzdHJ1Y3QgIFRUX0dhc3BfCisgIHsKKyAgICBUVF9VU2hvcnQgICAgICB2ZXJzaW9uOworICAgIFRUX1VTaG9ydCAgICAgIG51bVJhbmdlczsKKyAgICBUVF9HYXNwUmFuZ2UqICBnYXNwUmFuZ2VzOworCisgIH0gVFRfR2FzcDsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX0hkbXhSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgc21hbGwgc3RydWN0dXJlIHVzZWQgdG8gbW9kZWwgdGhlIHByZS1jb21wdXRlZCB3aWR0aHMgb2YgYSBnaXZlbiAqLworICAvKiAgICBzaXplLiAgVGhleSdyZSBmb3VuZCBpbiB0aGUgYGhkbXgnIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBwcGVtICAgICAgOjogVGhlIHBpeGVscyBwZXIgRU0gdmFsdWUgYXQgd2hpY2ggdGhlc2UgbWV0cmljcyBhcHBseS4gKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG1heF93aWR0aCA6OiBUaGUgbWF4aW11bSBhZHZhbmNlIHdpZHRoIGZvciB0aGlzIG1ldHJpYy4gICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgd2lkdGhzICAgIDo6IEFuIGFycmF5IG9mIHdpZHRocy4gIE5vdGU6IFRoZXNlIGFyZSA4LWJpdCBieXRlcy4gICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHN0cnVjdCAgVFRfSGRteFJlY18KKyAgeworICAgIFRUX0J5dGUgICBwcGVtOworICAgIFRUX0J5dGUgICBtYXhfd2lkdGg7CisgICAgVFRfQnl0ZSogIHdpZHRoczsKKworICB9IFRUX0hkbXhSZWM7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUVF9IZG14UmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBIHN0cnVjdHVyZSB1c2VkIHRvIG1vZGVsIHRoZSBgaGRteCcgdGFibGUsIHdoaWNoIGNvbnRhaW5zICAgICAgICAgKi8KKyAgLyogICAgcHJlLWNvbXB1dGVkIHdpZHRocyBmb3IgYSBzZXQgb2YgZ2l2ZW4gc2l6ZXMvZGltZW5zaW9ucy4gICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgdmVyc2lvbiAgICAgOjogVGhlIHZlcnNpb24gbnVtYmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG51bV9yZWNvcmRzIDo6IFRoZSBudW1iZXIgb2YgaGRteCByZWNvcmRzLiAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICByZWNvcmRzICAgICA6OiBBbiBhcnJheSBvZiBoZG14IHJlY29yZHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgc3RydWN0ICBUVF9IZG14XworICB7CisgICAgVFRfVVNob3J0ICAgIHZlcnNpb247CisgICAgVFRfU2hvcnQgICAgIG51bV9yZWNvcmRzOworICAgIFRUX0hkbXhSZWMqICByZWNvcmRzOworCisgIH0gVFRfSGRteDsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX0tlcm5fMF9QYWlyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgc3RydWN0dXJlIHVzZWQgdG8gbW9kZWwgYSBrZXJuaW5nIHBhaXIgZm9yIHRoZSBrZXJuaW5nIHRhYmxlICAgICAqLworICAvKiAgICBmb3JtYXQgMC4gIFRoZSBlbmdpbmUgbm93IGxvYWRzIHRoaXMgdGFibGUgaWYgaXQgZmluZHMgb25lIGluIHRoZSAgKi8KKyAgLyogICAgZm9udCBmaWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbGVmdCAgOjogVGhlIGluZGV4IG9mIHRoZSBsZWZ0IGdseXBoIGluIHBhaXIuICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHJpZ2h0IDo6IFRoZSBpbmRleCBvZiB0aGUgcmlnaHQgZ2x5cGggaW4gcGFpci4gICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB2YWx1ZSA6OiBUaGUga2VybmluZyBkaXN0YW5jZS4gIEEgcG9zaXRpdmUgdmFsdWUgc3BhY2VzIHRoZSAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgZ2x5cGhzLCBhIG5lZ2F0aXZlIG9uZSBtYWtlcyB0aGVtIGNsb3Nlci4gICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHN0cnVjdCAgVFRfS2Vybl8wX1BhaXJfCisgIHsKKyAgICBUVF9VU2hvcnQgIGxlZnQ7ICAgLyogaW5kZXggb2YgbGVmdCAgZ2x5cGggaW4gcGFpciAqLworICAgIFRUX1VTaG9ydCAgcmlnaHQ7ICAvKiBpbmRleCBvZiByaWdodCBnbHlwaCBpbiBwYWlyICovCisgICAgVFRfRldvcmQgICB2YWx1ZTsgIC8qIGtlcm5pbmcgdmFsdWUgICAgICAgICAgICAgICAgKi8KKworICB9IFRUX0tlcm5fMF9QYWlyOworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqLworICAvKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KKyAgLyoqKiAgICAgICAgICAgICAgICAgIEVNQkVEREVEIEJJVE1BUFMgU1VQUE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAqKiovCisgIC8qKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqLworICAvKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUVF9TQml0X01ldHJpY3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBIHN0cnVjdHVyZSB1c2VkIHRvIGhvbGQgdGhlIGJpZyBtZXRyaWNzIG9mIGEgZ2l2ZW4gZ2x5cGggYml0bWFwICAgKi8KKyAgLyogICAgaW4gYSBUcnVlVHlwZSBvciBPcGVuVHlwZSBmb250LiAgVGhlc2UgYXJlIHVzdWFsbHkgZm91bmQgaW4gdGhlICAgICovCisgIC8qICAgIGBFQkRUJyAoTWljcm9zb2Z0KSBvciBgYmRhdCcgKEFwcGxlKSB0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGhlaWdodCAgICAgICA6OiBUaGUgZ2x5cGggaGVpZ2h0IGluIHBpeGVscy4gICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgd2lkdGggICAgICAgIDo6IFRoZSBnbHlwaCB3aWR0aCBpbiBwaXhlbHMuICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBob3JpQmVhcmluZ1ggOjogVGhlIGhvcml6b250YWwgbGVmdCBiZWFyaW5nLiAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGhvcmlCZWFyaW5nWSA6OiBUaGUgaG9yaXpvbnRhbCB0b3AgYmVhcmluZy4gICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgaG9yaUFkdmFuY2UgIDo6IFRoZSBob3Jpem9udGFsIGFkdmFuY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB2ZXJ0QmVhcmluZ1ggOjogVGhlIHZlcnRpY2FsIGxlZnQgYmVhcmluZy4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHZlcnRCZWFyaW5nWSA6OiBUaGUgdmVydGljYWwgdG9wIGJlYXJpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgdmVydEFkdmFuY2UgIDo6IFRoZSB2ZXJ0aWNhbCBhZHZhbmNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHN0cnVjdCAgVFRfU0JpdF9NZXRyaWNzXworICB7CisgICAgVFRfQnl0ZSAgaGVpZ2h0OworICAgIFRUX0J5dGUgIHdpZHRoOworCisgICAgVFRfQ2hhciAgaG9yaUJlYXJpbmdYOworICAgIFRUX0NoYXIgIGhvcmlCZWFyaW5nWTsKKyAgICBUVF9CeXRlICBob3JpQWR2YW5jZTsKKworICAgIFRUX0NoYXIgIHZlcnRCZWFyaW5nWDsKKyAgICBUVF9DaGFyICB2ZXJ0QmVhcmluZ1k7CisgICAgVFRfQnl0ZSAgdmVydEFkdmFuY2U7CisKKyAgfSBUVF9TQml0X01ldHJpY3M7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUVF9TQml0X1NtYWxsX01ldHJpY3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBIHN0cnVjdHVyZSB1c2VkIHRvIGhvbGQgdGhlIHNtYWxsIG1ldHJpY3Mgb2YgYSBnaXZlbiBnbHlwaCBiaXRtYXAgKi8KKyAgLyogICAgaW4gYSBUcnVlVHlwZSBvciBPcGVuVHlwZSBmb250LiAgVGhlc2UgYXJlIHVzdWFsbHkgZm91bmQgaW4gdGhlICAgICovCisgIC8qICAgIGBFQkRUJyAoTWljcm9zb2Z0KSBvciB0aGUgYGJkYXQnIChBcHBsZSkgdGFibGUuICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGhlaWdodCAgICA6OiBUaGUgZ2x5cGggaGVpZ2h0IGluIHBpeGVscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgd2lkdGggICAgIDo6IFRoZSBnbHlwaCB3aWR0aCBpbiBwaXhlbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBiZWFyaW5nWCAgOjogVGhlIGxlZnQtc2lkZSBiZWFyaW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGJlYXJpbmdZICA6OiBUaGUgdG9wLXNpZGUgYmVhcmluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgYWR2YW5jZSAgIDo6IFRoZSBhZHZhbmNlIHdpZHRoIG9yIGhlaWdodC4gICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHN0cnVjdCAgVFRfU0JpdF9TbWFsbF9NZXRyaWNzXworICB7CisgICAgVFRfQnl0ZSAgaGVpZ2h0OworICAgIFRUX0J5dGUgIHdpZHRoOworCisgICAgVFRfQ2hhciAgYmVhcmluZ1g7CisgICAgVFRfQ2hhciAgYmVhcmluZ1k7CisgICAgVFRfQnl0ZSAgYWR2YW5jZTsKKworICB9IFRUX1NCaXRfU21hbGxfTWV0cmljczsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX1NCaXRfTGluZV9NZXRyaWNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgc3RydWN0dXJlIHVzZWQgdG8gZGVzY3JpYmUgdGhlIHRleHQgbGluZSBtZXRyaWNzIG9mIGEgZ2l2ZW4gICAgICAqLworICAvKiAgICBiaXRtYXAgc3RyaWtlLCBmb3IgZWl0aGVyIGEgaG9yaXpvbnRhbCBvciB2ZXJ0aWNhbCBsYXlvdXQuICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBhc2NlbmRlciAgICAgICAgICAgICAgICA6OiBUaGUgYXNjZW5kZXIgaW4gcGl4ZWxzLiAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGRlc2NlbmRlciAgICAgICAgICAgICAgIDo6IFRoZSBkZXNjZW5kZXIgaW4gcGl4ZWxzLiAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbWF4X3dpZHRoICAgICAgICAgICAgICAgOjogVGhlIG1heGltdW0gZ2x5cGggd2lkdGggaW4gcGl4ZWxzLiAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBjYXJldF9zbG9wZV9lbnVtZXJhdG9yICA6OiBSaXNlIG9mIHRoZSBjYXJldCBzbG9wZSwgdHlwaWNhbGx5IHNldCAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gMSBmb3Igbm9uLWl0YWxpYyBmb250cy4gICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBjYXJldF9zbG9wZV9kZW5vbWluYXRvciA6OiBSaXNlIG9mIHRoZSBjYXJldCBzbG9wZSwgdHlwaWNhbGx5IHNldCAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gMCBmb3Igbm9uLWl0YWxpYyBmb250cy4gICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBjYXJldF9vZmZzZXQgICAgICAgICAgICA6OiBPZmZzZXQgaW4gcGl4ZWxzIHRvIG1vdmUgdGhlIGNhcmV0IGZvciAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVyIHBvc2l0aW9uaW5nLiAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBtaW5fb3JpZ2luX1NCICAgICAgICAgICA6OiBNaW5pbXVtIG9mIGhvcmlCZWFyaW5nWCAocmVzcC4gICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVydEJlYXJpbmdZKS4gICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG1pbl9hZHZhbmNlX1NCICAgICAgICAgIDo6IE1pbmltdW0gb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3Jpem9udGFsIGFkdmFuY2UgLSAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIGhvcmlCZWFyaW5nWCArIHdpZHRoICkgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnRpY2FsIGFkdmFuY2UgLSAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggdmVydEJlYXJpbmdZICsgaGVpZ2h0ICkgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBtYXhfYmVmb3JlX0JMICAgICAgICAgICA6OiBNYXhpbXVtIG9mIGhvcmlCZWFyaW5nWSAocmVzcC4gICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVydEJlYXJpbmdZKS4gICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBtaW5fYWZ0ZXJfQkwgICAgICAgICAgICA6OiBNaW5pbXVtIG9mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9yaUJlYXJpbmdZIC0gaGVpZ2h0ICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnRCZWFyaW5nWCAtIHdpZHRoICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgc3RydWN0ICBUVF9TQml0X0xpbmVfTWV0cmljc18KKyAgeworICAgIFRUX0NoYXIgIGFzY2VuZGVyOworICAgIFRUX0NoYXIgIGRlc2NlbmRlcjsKKyAgICBUVF9CeXRlICBtYXhfd2lkdGg7CisgICAgVFRfQ2hhciAgY2FyZXRfc2xvcGVfbnVtZXJhdG9yOworICAgIFRUX0NoYXIgIGNhcmV0X3Nsb3BlX2Rlbm9taW5hdG9yOworICAgIFRUX0NoYXIgIGNhcmV0X29mZnNldDsKKyAgICBUVF9DaGFyICBtaW5fb3JpZ2luX1NCOworICAgIFRUX0NoYXIgIG1pbl9hZHZhbmNlX1NCOworICAgIFRUX0NoYXIgIG1heF9iZWZvcmVfQkw7CisgICAgVFRfQ2hhciAgbWluX2FmdGVyX0JMOworICAgIFRUX0NoYXIgIHBhZHNbMl07CisKKyAgfSBUVF9TQml0X0xpbmVfTWV0cmljczsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX1NCaXRfUmFuZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgVHJ1ZVR5cGUvT3BlblR5cGUgc3ViSW5kZXhUYWJsZSBhcyBkZWZpbmVkIGluIHRoZSBgRUJMQycgICAgICAgICAqLworICAvKiAgICAoTWljcm9zb2Z0KSBvciBgYmxvYycgKEFwcGxlKSB0YWJsZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBmaXJzdF9nbHlwaCAgIDo6IFRoZSBmaXJzdCBnbHlwaCBpbmRleCBpbiB0aGUgcmFuZ2UuICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGxhc3RfZ2x5cGggICAgOjogVGhlIGxhc3QgZ2x5cGggaW5kZXggaW4gdGhlIHJhbmdlLiAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgaW5kZXhfZm9ybWF0ICA6OiBUaGUgZm9ybWF0IG9mIGluZGV4IHRhYmxlLiAgVmFsaWQgdmFsdWVzIGFyZSAxICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgdG8gNS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgaW1hZ2VfZm9ybWF0ICA6OiBUaGUgZm9ybWF0IG9mIGBFQkRUJyBpbWFnZSBkYXRhLiAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBpbWFnZV9vZmZzZXQgIDo6IFRoZSBvZmZzZXQgdG8gaW1hZ2UgZGF0YSBpbiBgRUJEVCcuICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGltYWdlX3NpemUgICAgOjogRm9yIGluZGV4IGZvcm1hdHMgMiBhbmQgNS4gIFRoaXMgaXMgdGhlIHNpemUgaW4gICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgIGJ5dGVzIG9mIGVhY2ggZ2x5cGggYml0bWFwLiAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGJpZ19tZXRyaWNzICAgOjogRm9yIGluZGV4IGZvcm1hdHMgMiBhbmQgNS4gIFRoaXMgaXMgdGhlIGJpZyAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgIG1ldHJpY3MgZm9yIGVhY2ggZ2x5cGggYml0bWFwLiAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG51bV9nbHlwaHMgICAgOjogRm9yIGluZGV4IGZvcm1hdHMgNCBhbmQgNS4gIFRoaXMgaXMgdGhlIG51bWJlciBvZiAqLworICAvKiAgICAgICAgICAgICAgICAgICAgIGdseXBocyBpbiB0aGUgY29kZSBhcnJheS4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGdseXBoX29mZnNldHMgOjogRm9yIGluZGV4IGZvcm1hdHMgMSBhbmQgMy4gICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZ2x5cGhfY29kZXMgICA6OiBGb3IgaW5kZXggZm9ybWF0cyA0IGFuZCA1LiAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB0YWJsZV9vZmZzZXQgIDo6IFRoZSBvZmZzZXQgb2YgdGhlIGluZGV4IHRhYmxlIGluIHRoZSBgRUJMQycgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICB0YWJsZS4gIE9ubHkgdXNlZCBkdXJpbmcgc3RyaWtlIGxvYWRpbmcuICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHN0cnVjdCAgVFRfU0JpdF9SYW5nZQorICB7CisgICAgVFRfVVNob3J0ICAgICAgICBmaXJzdF9nbHlwaDsKKyAgICBUVF9VU2hvcnQgICAgICAgIGxhc3RfZ2x5cGg7CisKKyAgICBUVF9VU2hvcnQgICAgICAgIGluZGV4X2Zvcm1hdDsKKyAgICBUVF9VU2hvcnQgICAgICAgIGltYWdlX2Zvcm1hdDsKKyAgICBUVF9VTG9uZyAgICAgICAgIGltYWdlX29mZnNldDsKKworICAgIFRUX1VMb25nICAgICAgICAgaW1hZ2Vfc2l6ZTsKKyAgICBUVF9TQml0X01ldHJpY3MgIG1ldHJpY3M7CisgICAgVFRfVUxvbmcgICAgICAgICBudW1fZ2x5cGhzOworCisgICAgVFRfVUxvbmcqICAgICAgICBnbHlwaF9vZmZzZXRzOworICAgIFRUX1VTaG9ydCogICAgICAgZ2x5cGhfY29kZXM7CisKKyAgICBUVF9VTG9uZyAgICAgICAgIHRhYmxlX29mZnNldDsKKworICB9IFRUX1NCaXRfUmFuZ2U7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUVF9TQml0X1N0cmlrZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBIHN0cnVjdHVyZSB1c2VkIGRlc2NyaWJlIGEgZ2l2ZW4gYml0bWFwIHN0cmlrZSBpbiB0aGUgYEVCTEMnICAgICAgKi8KKyAgLyogICAgKE1pY3Jvc29mdCkgb3IgYGJsb2MnIChBcHBsZSkgdGFibGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICBudW1faW5kZXhfcmFuZ2VzIDo6IFRoZSBudW1iZXIgb2YgaW5kZXggcmFuZ2VzLiAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIGluZGV4X3JhbmdlcyAgICAgOjogQW4gYXJyYXkgb2YgZ2x5cGggaW5kZXggcmFuZ2VzLiAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgY29sb3JfcmVmICAgICAgICA6OiBVbnVzZWQuICBBIGNvbG9yIHJlZmVyZW5jZT8gICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICBob3JpICAgICAgICAgICAgIDo6IFRoZSBsaW5lIG1ldHJpY3MgZm9yIGhvcml6b250YWwgbGF5b3V0cy4gICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIHZlcnQgICAgICAgICAgICAgOjogVGhlIGxpbmUgbWV0cmljcyBmb3IgdmVydGljYWwgbGF5b3V0cy4gICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgc3RhcnRfZ2x5cGggICAgICA6OiBUaGUgbG93ZXN0IGdseXBoIGluZGV4IGZvciB0aGlzIHN0cmlrZS4gICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICBlbmRfZ2x5cGggICAgICAgIDo6IFRoZSBoaWdoZXN0IGdseXBoIGluZGV4IGZvciB0aGlzIHN0cmlrZS4gICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIHhfcHBlbSAgICAgICAgICAgOjogVGhlIG51bWJlciBvZiBob3Jpem9udGFsIHBpeGVscyBwZXIgRU0uICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgeV9wcGVtICAgICAgICAgICA6OiBUaGUgbnVtYmVyIG9mIHZlcnRpY2FsIHBpeGVscyBwZXIgRU0uICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICBiaXRfZGVwdGggICAgICAgIDo6IFRoZSBiaXQgZGVwdGguICBWYWxpZCB2YWx1ZXMgYXJlIDEsIDIsIDQsICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICBhbmQgOC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICBmbGFncyAgICAgICAgICAgIDo6IElzIHRoaXMgYSB2ZXJ0aWNhbCBvciBob3Jpem9udGFsIHN0cmlrZT8gICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHN0cnVjdCAgVFRfU0JpdF9TdHJpa2VfCisgIHsKKyAgICBUVF9JbnQgICAgICAgICAgICAgICAgIG51bV9yYW5nZXM7CisgICAgVFRfU0JpdF9SYW5nZSogICAgICAgICBzYml0X3JhbmdlczsKKyAgICBUVF9VTG9uZyAgICAgICAgICAgICAgIHJhbmdlc19vZmZzZXQ7CisKKyAgICBUVF9VTG9uZyAgICAgICAgICAgICAgIGNvbG9yX3JlZjsKKworICAgIFRUX1NCaXRfTGluZV9NZXRyaWNzICAgaG9yaTsKKyAgICBUVF9TQml0X0xpbmVfTWV0cmljcyAgIHZlcnQ7CisKKyAgICBUVF9VU2hvcnQgICAgICAgICAgICAgIHN0YXJ0X2dseXBoOworICAgIFRUX1VTaG9ydCAgICAgICAgICAgICAgZW5kX2dseXBoOworCisgICAgVFRfQnl0ZSAgICAgICAgICAgICAgICB4X3BwZW07CisgICAgVFRfQnl0ZSAgICAgICAgICAgICAgICB5X3BwZW07CisKKyAgICBUVF9CeXRlICAgICAgICAgICAgICAgIGJpdF9kZXB0aDsKKyAgICBUVF9DaGFyICAgICAgICAgICAgICAgIGZsYWdzOworCisgIH0gVFRfU0JpdF9TdHJpa2U7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUVF9TQml0X0NvbXBvbmVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBIHNpbXBsZSBzdHJ1Y3R1cmUgdG8gZGVzY3JpYmUgYSBjb21wb3VuZCBzYml0IGVsZW1lbnQuICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBnbHlwaF9jb2RlIDo6IFRoZSBlbGVtZW50J3MgZ2x5cGggaW5kZXguICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgeF9vZmZzZXQgICA6OiBUaGUgZWxlbWVudCdzIGxlZnQgYmVhcmluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHlfb2Zmc2V0ICAgOjogVGhlIGVsZW1lbnQncyB0b3AgYmVhcmluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBzdHJ1Y3QgIFRUX1NCaXRfQ29tcG9uZW50XworICB7CisgICAgVFRfVVNob3J0ICBnbHlwaF9jb2RlOworCisgICAgVFRfQ2hhciAgICB4X29mZnNldDsKKyAgICBUVF9DaGFyICAgIHlfb2Zmc2V0OworCisgIH0gVFRfU0JpdF9Db21wb25lbnQ7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUVF9TQml0X1NjYWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBIHN0cnVjdHVyZSB1c2VkIGRlc2NyaWJlIGEgZ2l2ZW4gYml0bWFwIHNjYWxpbmcgdGFibGUsIGFzIGRlZmluZWQgKi8KKyAgLyogICAgaW4gdGhlIGBFQlNDJyB0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgaG9yaSAgICAgICAgICAgICAgOjogVGhlIGhvcml6b250YWwgbGluZSBtZXRyaWNzLiAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB2ZXJ0ICAgICAgICAgICAgICA6OiBUaGUgdmVydGljYWwgbGluZSBtZXRyaWNzLiAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHhfcHBlbSAgICAgICAgICAgIDo6IFRoZSBudW1iZXIgb2YgaG9yaXpvbnRhbCBwaXhlbHMgcGVyIEVNLiAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgeV9wcGVtICAgICAgICAgICAgOjogVGhlIG51bWJlciBvZiB2ZXJ0aWNhbCBwaXhlbHMgcGVyIEVNLiAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB4X3BwZW1fc3Vic3RpdHV0ZSA6OiBTdWJzdGl0dXRpb24geF9wcGVtIHZhbHVlLiAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHlfcHBlbV9zdWJzdGl0dXRlIDo6IFN1YnN0aXR1dGlvbiB5X3BwZW0gdmFsdWUuICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBzdHJ1Y3QgIFRUX1NCaXRfU2NhbGVfCisgIHsKKyAgICBUVF9TQml0X0xpbmVfTWV0cmljcyAgaG9yaTsKKyAgICBUVF9TQml0X0xpbmVfTWV0cmljcyAgdmVydDsKKworICAgIFRUX0J5dGUgICAgICAgICAgICAgICB4X3BwZW07CisgICAgVFRfQnl0ZSAgICAgICAgICAgICAgIHlfcHBlbTsKKworICAgIFRUX0J5dGUgICAgICAgICAgICAgICB4X3BwZW1fc3Vic3RpdHV0ZTsKKyAgICBUVF9CeXRlICAgICAgICAgICAgICAgeV9wcGVtX3N1YnN0aXR1dGU7CisKKyAgfSBUVF9TQml0X1NjYWxlOworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqLworICAvKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KKyAgLyoqKiAgICAgICAgICAgICAgICAgIFBPU1RTQ1JJUFQgR0xZUEggTkFNRVMgU1VQUE9SVCAgICAgICAgICAgICAgICAgICAqKiovCisgIC8qKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqLworICAvKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUVF9Qb3N0XzIwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBQb3N0c2NyaXB0IG5hbWVzIHN1Yi10YWJsZSwgZm9ybWF0IDIuMC4gIFN0b3JlcyB0aGUgUFMgbmFtZSBvZiAgICAgKi8KKyAgLyogICAgZWFjaCBnbHlwaCBpbiB0aGUgZm9udCBmYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbnVtX2dseXBocyAgICA6OiBUaGUgbnVtYmVyIG9mIG5hbWVkIGdseXBocyBpbiB0aGUgdGFibGUuICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBudW1fbmFtZXMgICAgIDo6IFRoZSBudW1iZXIgb2YgUFMgbmFtZXMgc3RvcmVkIGluIHRoZSB0YWJsZS4gICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGdseXBoX2luZGljZXMgOjogVGhlIGluZGljZXMgb2YgdGhlIGdseXBocyBpbiB0aGUgbmFtZXMgYXJyYXlzLiAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZ2x5cGhfbmFtZXMgICA6OiBUaGUgUFMgbmFtZXMgbm90IGluIE1hYyBFbmNvZGluZy4gICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHN0cnVjdCAgVFRfUG9zdF8yMF8KKyAgeworICAgIFRUX1VTaG9ydCAgIG51bV9nbHlwaHM7CisgICAgVFRfVVNob3J0ICAgbnVtX25hbWVzOworICAgIFRUX1VTaG9ydCogIGdseXBoX2luZGljZXM7CisgICAgVFRfQ2hhcioqICAgZ2x5cGhfbmFtZXM7CisKKyAgfSBUVF9Qb3N0XzIwOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfUG9zdF8yNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgUG9zdHNjcmlwdCBuYW1lcyBzdWItdGFibGUsIGZvcm1hdCAyLjUuICBTdG9yZXMgdGhlIFBTIG5hbWUgb2YgICAgICovCisgIC8qICAgIGVhY2ggZ2x5cGggaW4gdGhlIGZvbnQgZmFjZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG51bV9nbHlwaHMgOjogVGhlIG51bWJlciBvZiBnbHlwaHMgaW4gdGhlIHRhYmxlLiAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgb2Zmc2V0cyAgICA6OiBBbiBhcnJheSBvZiBzaWduZWQgb2Zmc2V0cyBpbiBhIG5vcm1hbCBNYWMgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgUG9zdHNjcmlwdCBuYW1lIGVuY29kaW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBzdHJ1Y3QgIFRUX1Bvc3RfMjVfCisgIHsKKyAgICBUVF9VU2hvcnQgIG51bV9nbHlwaHM7CisgICAgVFRfQ2hhciogICBvZmZzZXRzOworCisgIH0gVFRfUG9zdF8yNTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX1Bvc3RfTmFtZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFBvc3RzY3JpcHQgbmFtZXMgdGFibGUsIGVpdGhlciBmb3JtYXQgMi4wIG9yIDIuNS4gICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGxvYWRlZCAgICA6OiBBIGZsYWcgdG8gaW5kaWNhdGUgd2hldGhlciB0aGUgUFMgbmFtZXMgYXJlIGxvYWRlZC4gICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gCisgIC8qICAgIGZvcm1hdF8yMCA6OiBUaGUgc3ViLXRhYmxlIHVzZWQgZm9yIGZvcm1hdCAyLjAuICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZm9ybWF0XzI1IDo6IFRoZSBzdWItdGFibGUgdXNlZCBmb3IgZm9ybWF0IDIuNS4gICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHN0cnVjdCAgVFRfUG9zdF9OYW1lc18KKyAgeworICAgIFRUX0Jvb2wgICAgICAgbG9hZGVkOworCisgICAgdW5pb24KKyAgICB7CisgICAgICBUVF9Qb3N0XzIwICBmb3JtYXRfMjA7CisgICAgICBUVF9Qb3N0XzI1ICBmb3JtYXRfMjU7CisKKyAgICB9IG5hbWVzOworCisgIH0gVFRfUG9zdF9OYW1lczsKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KKyAgLyoqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiovCisgIC8qKiogICAgICAgICAgICAgICAgICBUUlVFVFlQRSBDSEFSTUFQUyBTVVBQT1JUICAgICAgICAgICAgICAgICAgICAgICAgKioqLworICAvKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KKyAgLyoqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgLyogZm9ybWF0IDAgKi8KKyAgdHlwZWRlZiBzdHJ1Y3QgIFRUX0NNYXAwXworICB7CisgICAgVFRfQnl0ZSogIGdseXBoSWRBcnJheTsKKworICB9IFRUX0NNYXAwOworCisKKyAgLyogZm9ybWF0IDIgKi8KKyAgdHlwZWRlZiBzdHJ1Y3QgIFRUX0NNYXAyU3ViSGVhZGVyXworICB7CisgICAgVFRfVVNob3J0ICBmaXJzdENvZGU7ICAgICAgLyogZmlyc3QgdmFsaWQgbG93IGJ5dGUgICAgICAgICAqLworICAgIFRUX1VTaG9ydCAgZW50cnlDb3VudDsgICAgIC8qIG51bWJlciBvZiB2YWxpZCBsb3cgYnl0ZXMgICAgKi8KKyAgICBUVF9TaG9ydCAgIGlkRGVsdGE7ICAgICAgICAvKiBkZWx0YSB2YWx1ZSB0byBnbHlwaEluZGV4ICAgICovCisgICAgVFRfVVNob3J0ICBpZFJhbmdlT2Zmc2V0OyAgLyogb2Zmc2V0IGZyb20gaGVyZSB0byAxc3QgY29kZSAqLworCisgIH0gVFRfQ01hcDJTdWJIZWFkZXI7CisKKworICB0eXBlZGVmIHN0cnVjdCAgVFRfQ01hcDJfCisgIHsKKyAgICBUVF9VU2hvcnQqICBzdWJIZWFkZXJLZXlzOworICAgIC8qIGhpZ2ggYnl0ZSBtYXBwaW5nIHRhYmxlICAgICAgICAgICAgKi8KKyAgICAvKiB2YWx1ZSA9IHN1YkhlYWRlciBpbmRleCAqIDggICAgICAgICovCisKKyAgICBUVF9DTWFwMlN1YkhlYWRlciogIHN1YkhlYWRlcnM7CisgICAgVFRfVVNob3J0KiAgICAgICAgICBnbHlwaElkQXJyYXk7CisgICAgVFRfVVNob3J0ICAgICAgICAgICBudW1HbHlwaElkOyAgIC8qIGNvbnRyb2wgdmFsdWUgKi8KKworICB9IFRUX0NNYXAyOworCisKKyAgLyogZm9ybWF0IDQgKi8KKyAgdHlwZWRlZiBzdHJ1Y3QgIFRUX0NNYXA0U2VnbWVudF8KKyAgeworICAgIFRUX1VTaG9ydCAgZW5kQ291bnQ7CisgICAgVFRfVVNob3J0ICBzdGFydENvdW50OworICAgIFRUX1Nob3J0ICAgaWREZWx0YTsKKyAgICBUVF9VU2hvcnQgIGlkUmFuZ2VPZmZzZXQ7CisKKyAgfSBUVF9DTWFwNFNlZ21lbnQ7CisKKworICB0eXBlZGVmIHN0cnVjdCAgVFRfQ01hcDRfCisgIHsKKyAgICBUVF9VU2hvcnQgIHNlZ0NvdW50WDI7ICAgICAvKiBudW1iZXIgb2Ygc2VnbWVudHMgKiAyICAgICAgICovCisgICAgVFRfVVNob3J0ICBzZWFyY2hSYW5nZTsgICAgLyogdGhlc2UgcGFyYW1ldGVycyBjYW4gYmUgdXNlZCAqLworICAgIFRUX1VTaG9ydCAgZW50cnlTZWxlY3RvcjsgIC8qIGZvciBhIGJpbmFyeSBzZWFyY2ggICAgICAgICAgKi8KKyAgICBUVF9VU2hvcnQgIHJhbmdlU2hpZnQ7CisKKyAgICBUVF9DTWFwNFNlZ21lbnQqICBzZWdtZW50czsKKyAgICBUVF9VU2hvcnQqICAgICAgICBnbHlwaElkQXJyYXk7CisgICAgVFRfVVNob3J0ICAgICAgICAgbnVtR2x5cGhJZDsgICAvKiBjb250cm9sIHZhbHVlICovCisKKyAgfSBUVF9DTWFwNDsKKworCisgIC8qIGZvcm1hdCA2ICovCisgIHR5cGVkZWYgc3RydWN0ICBUVF9DTWFwNl8KKyAgeworICAgIFRUX1VTaG9ydCAgIGZpcnN0Q29kZTsgICAgICAvKiBmaXJzdCBjaGFyYWN0ZXIgY29kZSBvZiBzdWJyYW5nZSAgICAgICovCisgICAgVFRfVVNob3J0ICAgZW50cnlDb3VudDsgICAgIC8qIG51bWJlciBvZiBjaGFyYWN0ZXIgY29kZXMgaW4gc3VicmFuZ2UgKi8KKworICAgIFRUX1VTaG9ydCogIGdseXBoSWRBcnJheTsKKworICB9IFRUX0NNYXA2OworCisgIHR5cGVkZWYgc3RydWN0IFRUX0NNYXBUYWJsZV8gIFRUX0NNYXBUYWJsZTsKKworICB0eXBlZGVmCisgIFRUX1VJbnQgICgqVFRfQ2hhck1hcF9GdW5jKSggVFRfQ01hcFRhYmxlKiAgY2hhcm1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9VTG9uZyAgICAgICBjaGFyX2NvZGUgKTsKKworICAvKiBjaGFybWFwIHRhYmxlICovCisgIHN0cnVjdCAgVFRfQ01hcFRhYmxlXworICB7CisgICAgVFRfVVNob3J0ICBwbGF0Zm9ybUlEOworICAgIFRUX1VTaG9ydCAgcGxhdGZvcm1FbmNvZGluZ0lEOworICAgIFRUX1VTaG9ydCAgZm9ybWF0OworICAgIFRUX1VTaG9ydCAgbGVuZ3RoOworICAgIFRUX1VTaG9ydCAgdmVyc2lvbjsKKworICAgIFRUX0Jvb2wgICAgbG9hZGVkOworICAgIFRUX1VMb25nICAgb2Zmc2V0OworCisgICAgdW5pb24KKyAgICB7CisgICAgICBUVF9DTWFwMCAgY21hcDA7CisgICAgICBUVF9DTWFwMiAgY21hcDI7CisgICAgICBUVF9DTWFwNCAgY21hcDQ7CisgICAgICBUVF9DTWFwNiAgY21hcDY7CisgICAgfSBjOworCisgICAgVFRfQ2hhck1hcF9GdW5jICBnZXRfaW5kZXg7CisgIH07CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUVF9DaGFyTWFwUmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIFRoZSBUcnVlVHlwZSBjaGFyYWN0ZXIgbWFwIG9iamVjdCB0eXBlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICByb290IDo6IFRoZSBwYXJlbnQgY2hhcmFjdGVyIG1hcCBzdHJ1Y3R1cmUuICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgY21hcCA6OiBUaGUgdXNlZCBjaGFyYWN0ZXIgbWFwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHN0cnVjdCAgVFRfQ2hhck1hcFJlY18KKyAgeworICAgIEZUX0NoYXJNYXBSZWMgICByb290OworICAgIFRUX0NNYXBUYWJsZSAgICBjbWFwOworICAgIAorICB9IFRUX0NoYXJNYXBSZWM7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KKyAgLyoqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiovCisgIC8qKiogICAgICAgICAgICAgICAgICBPUklHSU5BTCBUVF9GQUNFIENMQVNTIERFRklOSVRJT04gICAgICAgICAgICAgICAgKioqLworICAvKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KKyAgLyoqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFRoaXMgc3RydWN0dXJlL2NsYXNzIGlzIGRlZmluZWQgaGVyZSBiZWNhdXNlIGl0IGlzIGNvbW1vbiB0byB0aGUgICAgICAqLworICAvKiBmb2xsb3dpbmcgZm9ybWF0czogVFRGLCBPcGVuVHlwZS1UVCwgYW5kIE9wZW5UeXBlLUNGRi4gICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIE5vdGUgaG93ZXZlciB0aGF0IHRoZSBjbGFzc2VzIFRUX1NpemUsIFRUX0dseXBoU2xvdCwgYW5kIFRUX0NoYXJNYXAgICAqLworICAvKiBhcmUgbm90IHNoYXJlZCBiZXR3ZWVuIGZvbnQgZHJpdmVycywgYW5kIGFyZSB0aHVzIGRlZmluZWQgbm9ybWFsbHkgaW4gKi8KKyAgLyogYGRyaXZlcnMvdHJ1ZXR5cGUvdHRvYmpzLmgnLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUVF9GYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBIGhhbmRsZSB0byBhIFRydWVUeXBlIGZhY2UvZm9udCBvYmplY3QuICBBIFRUX0ZhY2UgZW5jYXBzdWxhdGVzICAgKi8KKyAgLyogICAgdGhlIHJlc29sdXRpb24gYW5kIHNjYWxpbmcgaW5kZXBlbmRlbnQgcGFydHMgb2YgYSBUcnVlVHlwZSBmb250ICAgICovCisgIC8qICAgIHJlc291cmNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoZSBUVF9GYWNlIHN0cnVjdHVyZSBpcyBhbHNvIHVzZWQgYXMgYSBgcGFyZW50IGNsYXNzJyBmb3IgdGhlICAgICAqLworICAvKiAgICBPcGVuVHlwZS1DRkYgY2xhc3MgKFQyX0ZhY2UpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgc3RydWN0IFRUX0ZhY2VSZWNfKiAgIFRUX0ZhY2U7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUVF9DaGFyTWFwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBIGhhbmRsZSB0byBhIFRydWVUeXBlIGNoYXJhY3RlciBtYXBwaW5nIG9iamVjdC4gICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgc3RydWN0IFRUX0NoYXJNYXBSZWNfKiAgVFRfQ2hhck1hcDsKKworCisgIC8qIGEgZnVuY3Rpb24gdHlwZSB1c2VkIGZvciB0aGUgdHJ1ZXR5cGUgYnl0ZWNvZGUgaW50ZXJwcmV0ZXIgaG9va3MgKi8KKyAgdHlwZWRlZiBUVF9FcnJvciAgKCpUVF9JbnRlcnByZXRlcikoIHZvaWQqICBleGVjX2NvbnRleHQgKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmNUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX0dvdG9fVGFibGVfRnVuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFNlZWtzIGEgc3RyZWFtIHRvIHRoZSBzdGFydCBvZiBhIGdpdmVuIFRydWVUeXBlIHRhYmxlLiAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZhY2UgICAgICA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB0YWcgICAgICAgOjogYSA0LWJ5dGUgdGFnIHVzZWQgdG8gbmFtZSB0aGUgdGFibGUgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgc3RyZWFtICAgIDo6IFRoZSBpbnB1dCBzdHJlYW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbGVuZ3RoICAgIDo6IGxlbmd0aCBvZiB0YWJsZSBpbiBieXRlcy4gU2V0IHRvIDAgd2hlbiBub3QgbmVlZGVkICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVHJ1ZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhlIHN0cmVhbSBjdXJzb3IgbXVzdCBiZSBhdCB0aGUgZm9udCBmaWxlJ3Mgb3JpZ2luICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmCisgIFRUX0Vycm9yICAoKlRUX0dvdG9fVGFibGVfRnVuYykoIFRUX0ZhY2UgICAgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfVUxvbmcgICB0YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9VTG9uZyAgKmxlbmd0aCApOworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgVHJ1ZVR5cGUgRmFjZSBUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfRmFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhlIFRydWVUeXBlIGZhY2UgY2xhc3MuICBUaGVzZSBvYmplY3RzIG1vZGVsIHRoZSByZXNvbHV0aW9uIGFuZCAgICovCisgIC8qICAgIHBvaW50LXNpemUgaW5kZXBlbmRlbnQgZGF0YSBmb3VuZCBpbiBhIFRydWVUeXBlIGZvbnQgZmlsZS4gICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHJvb3QgICAgICAgICAgICAgIDo6IFRoZSBiYXNlIEZUX0ZhY2Ugc3RydWN0dXJlLCBtYW5hZ2VkIGJ5IHRoZSAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlIGxheWVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHR0Y0hlYWRlciAgICAgICAgIDo6IFRoZSBUcnVlVHlwZSBjb2xsZWN0aW9uIGhlYWRlciwgdXNlZCB3aGVuIHRoZSAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlIGlzIGEgYHR0YycgcmF0aGVyIHRoYW4gYSBgdHRmJy4gIEZvciAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgb3JkaW5hcnkgZm9udCBmaWxlcywgdGhlIGZpZWxkICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgIGB0dGNIZWFkZXIuRGlyQ291bnQnIGlzIHNldCB0byAwLiAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbnVtX3RhYmxlcyAgICAgICAgOjogVGhlIG51bWJlciBvZiBUcnVlVHlwZSB0YWJsZXMgaW4gdGhpcyBmb250ICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZGlyX3RhYmxlcyAgICAgICAgOjogVGhlIGRpcmVjdG9yeSBvZiBUcnVlVHlwZSB0YWJsZXMgZm9yIHRoaXMgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQgZmlsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgaGVhZGVyICAgICAgICAgICAgOjogVGhlIGZvbnQncyBmb250IGhlYWRlciAoYGhlYWQnIHRhYmxlKS4gIFJlYWQgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgIG9uIGZvbnQgb3BlbmluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgaG9yaXpvbnRhbCAgICAgICAgOjogVGhlIGZvbnQncyBob3Jpem9udGFsIGhlYWRlciAoYGhoZWEnIHRhYmxlKS4gICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmllbGQgYWxzbyBjb250YWlucyB0aGUgYXNzb2NpYXRlZCAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBob3Jpem9udGFsIG1ldHJpY3MgdGFibGUgKGBobXR4JykuICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG1heF9wcm9maWxlICAgICAgIDo6IFRoZSBmb250J3MgbWF4aW11bSBwcm9maWxlIHRhYmxlLiAgUmVhZCBvbiAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBmb250IG9wZW5pbmcuICBOb3RlIHRoYXQgc29tZSBtYXhpbXVtIHZhbHVlcyAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgY2Fubm90IGJlIHRha2VuIGRpcmVjdGx5IGZyb20gdGhpcyB0YWJsZS4gIFdlICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgIHRodXMgZGVmaW5lIGFkZGl0aW9uYWwgZmllbGRzIGJlbG93IHRvIGhvbGQgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgY29tcHV0ZWQgbWF4aW1hLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG1heF9jb21wb25lbnRzICAgIDo6IFRoZSBtYXhpbXVtIG51bWJlciBvZiBnbHlwaCBjb21wb25lbnRzICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZCB0byBsb2FkIGFueSBjb21wb3NpdGUgZ2x5cGggZnJvbSAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBmb250LiAgVXNlZCB0byBzaXplIHRoZSBsb2FkIHN0YWNrLiAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB2ZXJ0aWNhbF9pbmZvICAgICA6OiBBIGJvb2xlYW4gd2hpY2ggaXMgc2V0IHdoZW4gdGhlIGZvbnQgZmlsZSAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbnMgdmVydGljYWwgbWV0cmljcy4gIElmIG5vdCwgdGhlIHZhbHVlICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBgdmVydGljYWwnIGZpZWxkIGlzIHVuZGVmaW5lZC4gICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgdmVydGljYWwgICAgICAgICAgOjogVGhlIGZvbnQncyB2ZXJ0aWNhbCBoZWFkZXIgKGB2aGVhJyB0YWJsZSkuICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmllbGQgYWxzbyBjb250YWlucyB0aGUgYXNzb2NpYXRlZCAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0aWNhbCBtZXRyaWNzIHRhYmxlIChgdm10eCcpLCBpZiBmb3VuZC4gICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgSU1QT1JUQU5UOiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWVsZCBpcyAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmaW5lZCBpZiB0aGUgYHZlcnRpY2FsSW5mbycgZmllbGQgaXMgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICB1bnNldC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG51bV9uYW1lcyAgICAgICAgIDo6IFRoZSBudW1iZXIgb2YgbmFtZSByZWNvcmRzIHdpdGhpbiB0aGlzICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBUcnVlVHlwZSBmb250LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG5hbWVfdGFibGUgICAgICAgIDo6IFRoZSB0YWJsZSBvZiBuYW1lIHJlY29yZHMgKGBuYW1lJykuICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgb3MyICAgICAgICAgICAgICAgOjogVGhlIGZvbnQncyBPUy8yIHRhYmxlIChgT1MvMicpLiAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBwb3N0c2NyaXB0ICAgICAgICA6OiBUaGUgZm9udCdzIFBvc3RTY3JpcHQgdGFibGUgKGBwb3N0JyB0YWJsZSkuICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgVGhlIFBvc3RTY3JpcHQgZ2x5cGggbmFtZXMgYXJlIG5vdCBsb2FkZWQgYnkgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBkcml2ZXIgb24gZmFjZSBvcGVuaW5nLiAgU2VlIHRoZSBgdHRwb3N0JyAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGUgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG51bV9jaGFybWFwcyAgICAgIDo6IFRoZSBudW1iZXIgb2YgY2hhcmFjdGVyIG1hcHBpbmdzIGluIHRoZSBmb250LiAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgY2hhcm1hcHMgICAgICAgICAgOjogVGhlIGFycmF5IG9mIGNoYXJtYXAgb2JqZWN0cyBmb3IgdGhpcyBmb250ICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUuICBOb3RlIHRoYXQgdGhpcyBmaWVsZCBpcyBhIHR5cGVsZXNzICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyLiAgVGhlIFJlYXNvbiBpcyB0aGF0IHRoZSBmb3JtYXQgb2YgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgY2hhcm1hcHMgdmFyaWVzIHdpdGggdGhlIHVuZGVybHlpbmcgZm9udCAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCBhbmQgY2Fubm90IGJlIGRldGVybWluZWQgaGVyZS4gICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZ290b19mYWNlICAgICAgICAgOjogYSBmdW5jdGlvbiBjYWxsZWQgYnkgZWFjaCBUcnVlVHlwZSB0YWJsZSAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlciB0byBwb3NpdGlvbiBhIHN0cmVhbSdzIGN1cnNvciB0byB0aGUgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCBvZiBhIGdpdmVuIHRhYmxlIGFjY29yZGluZyB0byBpdHMgdGFnLiAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgaXQgZGVmYXVsdHMgdG8gVFRfR290b19GYWNlIGJ1dCBjYW4gYmUgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZlcmVudCBmb3Igc3RyYW5nZSBmb3JtYXRzIChlLmcuIFR5cGUgNDIpICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgc2ZudCAgICAgICAgICAgICAgOjogYSBwb2ludGVyIHRvIHRoZSBTRk5UIGBkcml2ZXInIGludGVyZmFjZS4gICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBoZG14ICAgICAgICAgICAgICA6OiBUaGUgZmFjZSdzIGhvcml6b250YWwgZGV2aWNlIG1ldHJpY3MgKGBoZG14JyAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUpLiAgVGhpcyB0YWJsZSBpcyBvcHRpb25hbCBpbiAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgIFRydWVUeXBlL09wZW5UeXBlIGZvbnRzLiAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZ2FzcCAgICAgICAgICAgICAgOjogVGhlIGdyaWQtZml0dGluZyBhbmQgc2NhbGluZyBwcm9wZXJ0aWVzIHRhYmxlICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgIChgZ2FzcCcpLiAgVGhpcyB0YWJsZSBpcyBvcHRpb25hbCBpbiAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBUcnVlVHlwZS9PcGVuVHlwZSBmb250cy4gICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG51bV9zYml0X3N0cmlrZXMgIDo6IFRoZSBudW1iZXIgb2Ygc2JpdCBzdHJpa2VzLCBpLmUuLCBiaXRtYXAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBzaXplcywgZW1iZWRkZWQgaW4gdGhpcyBmb250LiAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHNiaXRfc3RyaWtlcyAgICAgIDo6IEFuIGFycmF5IG9mIHNiaXQgc3RyaWtlcyBlbWJlZGRlZCBpbiB0aGlzICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBmb250LiAgVGhpcyB0YWJsZSBpcyBvcHRpb25hbCBpbiBhICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgVHJ1ZVR5cGUvT3BlblR5cGUgZm9udC4gICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBudW1fc2JpdF9zY2FsZXMgICA6OiBUaGUgbnVtYmVyIG9mIHNiaXQgc2NhbGVzIGZvciB0aGlzIGZvbnQuICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHNiaXRfc2NhbGVzICAgICAgIDo6IEFycmF5IG9mIHNiaXQgc2NhbGVzIGVtYmVkZGVkIGluIHRoaXMgZm9udC4gICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHRhYmxlIGlzIG9wdGlvbmFsIGluIGEgVHJ1ZVR5cGUvT3BlblR5cGUgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgZm9udC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBwb3N0c2NyaXB0X25hbWVzICA6OiBBIHRhYmxlIHVzZWQgdG8gc3RvcmUgdGhlIFBvc3RzY3JpcHQgbmFtZXMgb2YgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGdseXBocyBmb3IgdGhpcyBmb250LiAgU2VlIHRoZSBmaWxlICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgIGB0dGNvbmZpZy5oJyBmb3IgY29tbWVudHMgb24gdGhlICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBUVF9DT05GSUdfT1BUSU9OX1BPU1RTQ1JJUFRfTkFNRVMgb3B0aW9uLiAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG51bV9sb2NhdGlvbnMgICAgIDo6IFRoZSBudW1iZXIgb2YgZ2x5cGggbG9jYXRpb25zIGluIHRoaXMgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBUcnVlVHlwZSBmaWxlLiAgVGhpcyBzaG91bGQgYmUgaWRlbnRpY2FsIHRvICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG51bWJlciBvZiBnbHlwaHMuICBJZ25vcmVkIGZvciBUeXBlIDIgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZ2x5cGhfbG9jYXRpb25zICAgOjogQW4gYXJyYXkgb2YgbG9uZ3MuICBUaGVzZSBhcmUgb2Zmc2V0cyB0byAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBoIGRhdGEgd2l0aGluIHRoZSBgZ2x5ZicgdGFibGUuICBJZ25vcmVkICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgVHlwZSAyIGZvbnQgZmFjZXMuICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZvbnRfcHJvZ3JhbV9zaXplIDo6IFNpemUgaW4gYnl0ZWNvZGVzIG9mIHRoZSBmYWNlJ3MgZm9udCBwcm9ncmFtLiAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAwIGlmIG5vbmUgZGVmaW5lZC4gIElnbm9yZWQgZm9yIFR5cGUgMiBmb250cy4gKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZvbnRfcHJvZ3JhbSAgICAgIDo6IFRoZSBmYWNlJ3MgZm9udCBwcm9ncmFtIChieXRlY29kZSBzdHJlYW0pICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlZCBhdCBsb2FkIHRpbWUsIGFsc28gdXNlZCBkdXJpbmcgZ2x5cGggKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgcmVuZGVyaW5nLiAgQ29tZXMgZnJvbSB0aGUgYGZwZ20nIHRhYmxlLiAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgIElnbm9yZWQgZm9yIFR5cGUgMiBmb250IGZvbnRzLiAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgY3Z0X3Byb2dyYW1fc2l6ZSAgOjogU2l6ZSBpbiBieXRlY29kZXMgb2YgdGhlIGZhY2UncyBjdnQgcHJvZ3JhbS4gICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgIElnbm9yZWQgZm9yIFR5cGUgMiBmb250cy4gICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgY3Z0X3Byb2dyYW0gICAgICAgOjogVGhlIGZhY2UncyBjdnQgcHJvZ3JhbSAoYnl0ZWNvZGUgc3RyZWFtKSAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVkIGVhY2ggdGltZSBhbiBpbnN0YW5jZS9zaXplIGlzICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkL3Jlc2V0LiAgQ29tZXMgZnJvbSB0aGUgYHByZXAnIHRhYmxlLiAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgSWdub3JlZCBmb3IgVHlwZSAyIGZvbnRzLiAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBjdnRfc2l6ZSAgICAgICAgICA6OiBTaXplIG9mIHRoZSBjb250cm9sIHZhbHVlIHRhYmxlIChpbiBlbnRyaWVzKS4gKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgSWdub3JlZCBmb3IgVHlwZSAyIGZvbnRzLiAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBjdnQgICAgICAgICAgICAgICA6OiBUaGUgZmFjZSdzIG9yaWdpbmFsIGNvbnRyb2wgdmFsdWUgdGFibGUuICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgQ29vcmRpbmF0ZXMgYXJlIGV4cHJlc3NlZCBpbiB1bnNjYWxlZCBmb250ICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXRzLiAgQ29tZXMgZnJvbSB0aGUgYGN2dCBgIHRhYmxlLiAgSWdub3JlZCAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgVHlwZSAyIGZvbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG51bV9rZXJuX3BhaXJzICAgIDo6IFRoZSBudW1iZXIgb2Yga2VybmluZyBwYWlycyBwcmVzZW50IGluIHRoZSAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBmb250IGZpbGUuICBUaGUgZW5naW5lIG9ubHkgbG9hZHMgdGhlIGZpcnN0ICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgaG9yaXpvbnRhbCBmb3JtYXQgMCBrZXJuIHRhYmxlIGl0IGZpbmRzIGluICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBmb250IGZpbGUuICBZb3Ugc2hvdWxkIHVzZSB0aGUgYHR0eGtlcm4nICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3R1cmVzIGlmIHlvdSB3YW50IHRvIGFjY2VzcyBvdGhlciAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAga2VybmluZyB0YWJsZXMuICBJZ25vcmVkIGZvciBUeXBlIDIgZm9udHMuICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBrZXJuX3RhYmxlX2luZGV4ICA6OiBUaGUgaW5kZXggb2YgdGhlIGtlcm5pbmcgdGFibGUgaW4gdGhlIGZvbnQgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAga2VybmluZyBkaXJlY3RvcnkuICBPbmx5IHVzZWQgYnkgdGhlIHR0eGtlcm4gICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbiB0byBhdm9pZCBkYXRhIGR1cGxpY2F0aW9uLiAgSWdub3JlZCAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgVHlwZSAyIGZvbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGtlcm5fcGFpcnMgICAgICAgIDo6IEFycmF5IG9mIGtlcm5pbmcgcGFpcnMsIGlmIGFueS4gIElnbm9yZWQgZm9yICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlIDIgZm9udHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGludGVycHJldGVyICAgICAgIDo6IFBvaW50ZXIgdG8gdGhlIFRydWVUeXBlIGJ5dGVjb2RlIGludGVycHJldGVyICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGZpZWxkIGlzIGFsc28gdXNlZCB0byBob29rIHRoZSBkZWJ1Z2dlciAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgaW4gYHR0ZGVidWcnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHN0cnVjdCAgVFRfRmFjZVJlY18KKyAgeworICAgIEZUX0ZhY2VSZWMgICAgICAgICByb290OworCisgICAgVFRDX0hlYWRlciAgICAgICAgIHR0Y19oZWFkZXI7CisKKyAgICBUVF9VU2hvcnQgICAgICAgICAgbnVtX3RhYmxlczsKKyAgICBUVF9UYWJsZSogICAgICAgICAgZGlyX3RhYmxlczsKKworICAgIFRUX0hlYWRlciAgICAgICAgICBoZWFkZXI7ICAgICAgIC8qIFRydWVUeXBlIGhlYWRlciB0YWJsZSAgICAgICAgICAqLworICAgIFRUX0hvcmlIZWFkZXIgICAgICBob3Jpem9udGFsOyAgIC8qIFRydWVUeXBlIGhvcml6b250YWwgaGVhZGVyICAgICAqLworCisgICAgVFRfTWF4UHJvZmlsZSAgICAgIG1heF9wcm9maWxlOworICAgIFRUX1VMb25nICAgICAgICAgICBtYXhfY29tcG9uZW50czsKKworICAgIFRUX0Jvb2wgICAgICAgICAgICB2ZXJ0aWNhbF9pbmZvOworICAgIFRUX1ZlcnRIZWFkZXIgICAgICB2ZXJ0aWNhbDsgICAgIC8qIFRUIFZlcnRpY2FsIGhlYWRlciwgaWYgcHJlc2VudCAqLworCisgICAgVFRfSW50ICAgICAgICAgICAgIG51bV9uYW1lczsgICAgLyogbnVtYmVyIG9mIG5hbWUgcmVjb3JkcyAgKi8KKyAgICBUVF9OYW1lVGFibGUgICAgICAgbmFtZV90YWJsZTsgICAvKiBuYW1lIHRhYmxlICAgICAgICAgICAgICAqLworCisgICAgVFRfT1MyICAgICAgICAgICAgIG9zMjsgICAgICAgICAgLyogVHJ1ZVR5cGUgT1MvMiB0YWJsZSAgICAgICAgICAgICovCisgICAgVFRfUG9zdHNjcmlwdCAgICAgIHBvc3RzY3JpcHQ7ICAgLyogVHJ1ZVR5cGUgUG9zdHNjcmlwdCB0YWJsZSAgICAgICovCisKKyAgICBUVF9JbnQgICAgICAgICAgICAgbnVtX2NoYXJtYXBzOworICAgIFRUX0NoYXJNYXAgICAgICAgICBjaGFybWFwczsgICAgIC8qIGFycmF5IG9mIFRUX0NoYXJNYXBSZWMgKi8KKworICAgIC8qIGEgcG9pbnRlciB0byB0aGUgZnVuY3Rpb24gdXNlZCB0byBzZWVrIGEgc3RyZWFtIHRvIHRoZSBzdGFydCBvZiAqLworICAgIC8qIGEgZ2l2ZW4gVHJ1ZVR5cGUgdGFibGUuIFRoaXMgc2hvdWxkIGRlZmF1bHQgdG8gdGhlIGZ1bmN0aW9uICAgICAqLworICAgIC8qIFRUX0dvdG9fVGFibGUgZGVmaW5lZCBpbiBgdHRsb2FkLmgnLCBidXQgc29tZSBmb250IGRyaXZlcnMgICAgICAqLworICAgIC8qIG1pZ2h0IG5lZWQgc29tZXRoaW5nIGRpZmZlcmVudCwgZS5nLiBUeXBlIDQyIGZvbnRzICAgICAgICAgICAgICAqLworICAgIFRUX0dvdG9fVGFibGVfRnVuYyAgICAgICBnb3RvX3RhYmxlOworICAgIAorICAgIC8qIGEgdHlwZWxlc3MgcG9pbnRlciB0byB0aGUgU0ZOVF9JbnRlcmZhY2UgdGFibGUgdXNlZCB0byBsb2FkICAgICAqLworICAgIC8qIHRoZSBiYXNpYyBUcnVlVHlwZSB0YWJsZXMgaW4gdGhlIGZhY2Ugb2JqZWN0ICAgICAgICAgICAgICAgICAgICAqLworICAgIHZvaWQqICAgICAgICAgICAgICBzZm50OworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiBPcHRpb25hbCBUcnVlVHlwZS9PcGVuVHlwZSB0YWJsZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIC8qIGhvcml6b250YWwgZGV2aWNlIG1ldHJpY3MgKi8KKyAgICBUVF9IZG14ICAgICAgICAgICAgaGRteDsKKworICAgIC8qIGdyaWQtZml0dGluZyBhbmQgc2NhbGluZyB0YWJsZSAqLworICAgIFRUX0dhc3AgICAgICAgICAgICBnYXNwOyAgICAgICAgICAgICAgICAgLyogdGhlIGBnYXNwJyB0YWJsZSAqLworCisgICAgLyogZW1iZWRkZWQgYml0bWFwcyBzdXBwb3J0ICovCisgICAgVFRfSW50ICAgICAgICAgICAgIG51bV9zYml0X3N0cmlrZXM7CisgICAgVFRfU0JpdF9TdHJpa2UqICAgIHNiaXRfc3RyaWtlczsKKworICAgIFRUX0ludCAgICAgICAgICAgICBudW1fc2JpdF9zY2FsZXM7CisgICAgVFRfU0JpdF9TY2FsZSogICAgIHNiaXRfc2NhbGVzOworCisgICAgLyogcG9zdHNjcmlwdCBuYW1lcyB0YWJsZSAqLworICAgIFRUX1Bvc3RfTmFtZXMgICAgICBwb3N0c2NyaXB0X25hbWVzOworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiBUcnVlVHlwZS1zcGVjaWZpYyBmaWVsZHMgKGlnbm9yZWQgYnkgdGhlIE9URi1UeXBlMiBkcml2ZXIpICAgICAgICAgICovCisgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIC8qIHRoZSBnbHlwaCBsb2NhdGlvbnMgKi8KKyAgICBUVF9VU2hvcnQgICAgICAgICAgbnVtX2xvY2F0aW9uczsKKyAgICBUVF9Mb25nKiAgICAgICAgICAgZ2x5cGhfbG9jYXRpb25zOworCisgICAgLyogdGhlIGZvbnQgcHJvZ3JhbSwgaWYgYW55ICovCisgICAgVFRfVUxvbmcgICAgICAgICAgIGZvbnRfcHJvZ3JhbV9zaXplOworICAgIFRUX0J5dGUqICAgICAgICAgICBmb250X3Byb2dyYW07CisKKyAgICAvKiB0aGUgY3Z0IHByb2dyYW0sIGlmIGFueSAqLworICAgIFRUX1VMb25nICAgICAgICAgICBjdnRfcHJvZ3JhbV9zaXplOworICAgIFRUX0J5dGUqICAgICAgICAgICBjdnRfcHJvZ3JhbTsKKworICAgIC8qIHRoZSBvcmlnaW5hbCwgdW5zY2FsZWQsIGNvbnRyb2wgdmFsdWUgdGFibGUgKi8KKyAgICBUVF9VTG9uZyAgICAgICAgICAgY3Z0X3NpemU7CisgICAgVFRfU2hvcnQqICAgICAgICAgIGN2dDsKKworICAgIC8qIHRoZSBmb3JtYXQgMCBrZXJuaW5nIHRhYmxlLCBpZiBhbnkgKi8KKyAgICBUVF9JbnQgICAgICAgICAgICAgbnVtX2tlcm5fcGFpcnM7CisgICAgVFRfSW50ICAgICAgICAgICAgIGtlcm5fdGFibGVfaW5kZXg7CisgICAgVFRfS2Vybl8wX1BhaXIqICAgIGtlcm5fcGFpcnM7CisKKyAgICAvKiBhIHBvaW50ZXIgdG8gdGhlIGJ5dGVjb2RlIGludGVycHJldGVyIHRvIHVzZS4gVGhpcyBpcyBhbHNvICovCisgICAgLyogdXNlZCB0byBob29rIHRoZSBkZWJ1Z2dlciBmb3IgdGhlIGB0dGRlYnVnJyB1dGlsaXR5Li4gICAgICAqLworICAgIFRUX0ludGVycHJldGVyICAgICBpbnRlcnByZXRlcjsKKworICB9IFRUX0ZhY2VSZWM7CisKKworI2lmZGVmIF9fY3BsdXNwbHVzCisgIH0KKyNlbmRpZgorCisKKyNlbmRpZiAvKiBUVFRZUEVTX0ggKi8KKworCisvKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9zaGFyZWQvdHlwZTEvcnVsZXMubWsgYi9zcmMvc2hhcmVkL3R5cGUxL3J1bGVzLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5Yzk1MGUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvc2hhcmVkL3R5cGUxL3J1bGVzLm1rCkBAIC0wLDAgKzEsNTQgQEAKKyMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIyogIFNoYXJlZC9UeXBlMSBNYWtlZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisjKiAgQ29weXJpZ2h0IDE5OTYtMTk5OSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgICoKKyMqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisjKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkICAgICAgICAgKgorIyogIG1vZGlmaWVkIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAgICoKKyMqICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICAqCisjKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAgKgorIyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisjKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisKKyMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIyogIElNUE9SVEFOVCBOT1RFOiBUaGlzIE1ha2VmaWxlIGlzIGludGVuZGVkIGZvciBHTlUgTWFrZSEgICAgICAgICAgICAgICAgICoKKyMqICAgICAgICAgICAgICAgICAgSWYgeW91IHByb3ZpZGUgTWFrZWZpbGVzIGZvciBvdGhlciBtYWtlIHV0aWxpdGllcywgICAgICAqCisjKiAgICAgICAgICAgICAgICAgIHBsZWFzZSBwbGFjZSB0aGVtIGluIGBmcmVldHlwZS9saWIvYXJjaC88c3lzdGVtPicuICAgICAgKgorIyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisjKiAgVGhpcyBmaWxlIGlzIHRvIGJlIGluY2x1ZGVkIGJ5IHRoZSBNYWtlZmlsZXMgb2YgZWFjaCBkcml2ZXIgdGhhdCB1c2VzICAgKgorIyogIHRoZSBzaGFyZWQgc291cmNlIGNvZGUgaW4gYGZyZWV0eXBlMi9saWIvZHJpdmVycy90eXBlMScuICBUaGlzIGNvZGUgICAgICoKKyMqICBjb250YWlucyB0eXBlIGRlZmluaXRpb25zIGFzIHdlbGwgYXMgaW50ZXJmYWNlIHdoaWNoIGFyZSBjb21tb24gdG8gYWxsICAqCisjKiAgc3VwcG9ydGVkIFBvc3RzY3JpcHQgZm9udCBmb3JtYXRzIChpLmUuIFR5cGUxIGFuZCBUeXBlMikuICAgICAgICAgICAgICAgKgorIyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisjKiAgVGhlIHB1cnBvc2Ugb2YgdGhpcyBNYWtlZmlsZSBpcyB0byBkZWZpbmUgbWFrZSB2YXJpYWJsZXMgdGhhdCBhcmUgdXNlZCAgKgorIyogIGRpcmVjdGx5IGJ5IHRoZSBwYXJlbnQgTWFrZWZpbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisjKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisKKyMgVDFTSEFSRURfRElSIGlzIHRoZSBkaXJlY3RvcnkgdG8gdGhlIGBzaGFyZWQvdHlwZTEnIHNvdXJjZXMKKyMKK1QxU0hBUkVEX0RJUiAgOj0gJChTUkMpL3NoYXJlZC90eXBlMQorVDFTSEFSRURfRElSXyA6PSAkKFQxU0hBUkVEX0RJUikkKFNFUCkKKworCisjIFQxU0hBUkVEX0ggaXMgdGhlIGxpc3Qgb2YgYWxsIGhlYWRlciBmaWxlcyBvbiB3aGljaCB0aGUgY2xpZW50IGRyaXZlcnMKKyMgZGVwZW5kCisjCitUMVNIQVJFRF9IIDo9ICQoVDFTSEFSRURfRElSXyl0MXR5cGVzLmggIFwKKyAgICAgICAgICAgICAgJChUMVNIQVJFRF9ESVJfKXQxZW5jb2RlLmgKKworIyBUMVNIQVJFRF9TUkMgaXMgdGhlIGxpc3Qgb2YgYWxsIHNoYXJlZCBzb3VyY2UgZmlsZXMgdGhhdCBhcmUgaW5jbHVkZWQKKyMgYnkgYW55IGNsaWVudCBkcml2ZXIKKyMKK1QxU0hBUkVEX1NSQyA6PSAkKFQxU0hBUkVEX0RJUl8pdDFlbmNvZGUuYworCisKKyMgRU5ECmRpZmYgLS1naXQgYS9zcmMvc2hhcmVkL3R5cGUxL3QxZW5jb2RlLmMgYi9zcmMvc2hhcmVkL3R5cGUxL3QxZW5jb2RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTFiZjczZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9zaGFyZWQvdHlwZTEvdDFlbmNvZGUuYwpAQCAtMCwwICsxLDMzMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgdDFlbmNvZGUuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIFR5cGUgMSBzdGFuZGFyZCBlbmNvZGluZyB0YWJsZXMgZGVmaW5pdGlvbnMgKGJvZHkpLiAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAxOTk2LTE5OTkgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCAgICAgICAgKi8KKy8qICBtb2RpZmllZCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgICovCisvKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLworLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KKy8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZpbGUgaXMgaW5jbHVkZWQgYnkgYm90aCB0aGUgVHlwZTEgYW5kIFR5cGUyIGRyaXZlci4gICAgICAgICAgICAgICovCisvKiAgSXQgc2hvdWxkIG5ldmVyIGJlIGNvbXBpbGVkIGRpcmVjdGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICB0MV9zdGFuZGFyZF9zdHJpbmdzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgIFRoaXMgYXJyYXkgY29udGFpbnMgdGhlIEFkb2JlIFN0YW5kYXJkIEdseXBoIE5hbWVzIG9yZGVyZWQgYnkgICAgICovCisgIC8qICAgICBTSUQuICBJdCB3YXMgdGFrZW4gZnJvbSB0aGUgQ0ZGIHNwZWNpZmljYXRpb24uICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgTE9DQUxfRlVOQworICBjb25zdCBUMV9TdHJpbmcqICB0MV9zdGFuZGFyZF9zdHJpbmdzW10gPQorICB7CisgIC8qICAgMCAqLworICAgICIubm90ZGVmIiwgInNwYWNlIiwgImV4Y2xhbSIsICJxdW90ZWRibCIsICJudW1iZXJzaWduIiwKKyAgICAiZG9sbGFyIiwgInBlcmNlbnQiLCAiYW1wZXJzYW5kIiwgInF1b3RlcmlnaHQiLCAicGFyZW5sZWZ0IiwKKyAgLyogIDEwICovCisgICAgInBhcmVucmlnaHQiLCAiYXN0ZXJpc2siLCAicGx1cyIsICJjb21tYSIsICJoeXBoZW4iLAorICAgICJwZXJpb2QiLCAic2xhc2giLCAiemVybyIsICJvbmUiLCAidHdvIiwKKyAgLyogIDIwICovCisgICAgInRocmVlIiwgImZvdXIiLCAiZml2ZSIsICJzaXgiLCAic2V2ZW4iLAorICAgICJoZWlnaHQiLCAibmluZSIsICJjb2xvbiIsICJzZW1pY29sb24iLCAibGVzcyIsCisgIC8qICAzMCAqLworICAgICJlcXVhbCIsICJncmVhdGVyIiwgInF1ZXN0aW9uIiwgImF0IiwgIkEiLAorICAgICJCIiwgIkMiLCAiRCIsICJFIiwgIkYiLAorICAvKiAgNDAgKi8KKyAgICAiRyIsICJIIiwgIkkiLCAiSiIsICJLIiwKKyAgICAiTCIsICJNIiwgIk4iLCAiTyIsICJQIiwKKyAgLyogIDUwICovCisgICAgIlEiLCAiUiIsICJTIiwgIlQiLCAiVSIsCisgICAgIlYiLCAiVyIsICJYIiwgIlkiLCAiWiIsCisgIC8qICA2MCAqLworICAgICJicmFja2V0bGVmdCIsICJiYWNrc2xhc2giLCAiYnJhY2tldHJpZ2h0IiwgImFzY2lpY2lyY3VtIiwgInVuZGVyc2NvcmUiLAorICAgICJxdW90ZWxlZnQiLCAiYSIsICJiIiwgImMiLCAiZCIsCisgIC8qICA3MCAqLworICAgICJlIiwgImYiLCAiZyIsICJoIiwgImkiLAorICAgICJqIiwgImsiLCAibCIsICJtIiwgIm4iLAorICAvKiAgODAgKi8KKyAgICAibyIsICJwIiwgInEiLCAiciIsICJzIiwKKyAgICAidCIsICJ1IiwgInYiLCAidyIsICJ4IiwKKyAgLyogIDkwICovCisgICAgInkiLCAieiIsICJicmFjZWxlZnQiLCAiYmFyIiwgImJyYWNlcmlnaHQiLAorICAgICJhc2NpaXRpbGRlIiwgImV4Y2xhbWRvd24iLCAiY2VudCIsICJzdGVybGluZyIsICJmcmFjdGlvbiIsCisgIC8qIDEwMCAqLworICAgICJ5ZW4iLCAiZmxvcmluIiwgInNlY3Rpb24iLCAiY3VycmVuY3kiLCAicXVvdGVzaW5nbGUiLAorICAgICJxdW90ZWRibGxlZnQiLCAicXVpbGxlbW90bGVmdCIsICJndWlsc2luZ2xsZWZ0IiwgImd1aWxzaW5nbHJpZ2h0IiwgImZpIiwKKyAgLyogMTEwICovCisgICAgImZsIiwgImVuZGFzaCIsICJkYWdnZXIiLCAiZGFnZ2VyZGJsIiwgInBlcmlvZGNlbnRlciIsCisgICAgInBhcmFncmFwaCIsICJidWxsZXQiLCAicXVvdGVzaW5nbGJhc2UiLCAicXVvdGVkYmxiYXNlIiwgInF1b3RlZGJscmlnaHQiLAorICAvKiAxMjAgKi8KKyAgICAicXVpbGxlbW90cmlnaHQiLCAiZWxsaXBzaXMiLCAicGVydGhvdXNhbmQiLCAicXVlc3Rpb25kb3duIiwgImdyYXZlIiwKKyAgICAiYWN1dGUiLCAiY2lyY3VtZmxleCIsICJ0aWxkZSIsICJtYWNyb24iLCAiYnJldmUiLAorICAvKiAxMzAgKi8KKyAgICAiZG90YWNjZW50IiwgImRpZXJlc2lzIiwgInJpbmciLCAiY2VkaWxsYSIsICJodW5nYXJ1bWxhdXQiLAorICAgICJvZ29uZWsiLCAiY2Fyb24iLCAiZW1kYXNoIiwgIkFFIiwgIm9yZGZlbWluaW5lIiwKKyAgLyogMTQwICovCisgICAgIkxzbGFzaCIsICJPc2xhc2giLCAiT0UiLCAib3JkbWFzY3VsaW5lIiwgImFlIiwKKyAgICJkb3RsZXNzaSIsICJJc2xhc2giLCAib3NsYXNoIiwgIm9lIiwgImdlcm1hbmRibHMiLAorICAvKiAxNTAgKi8KKyAgICAib25lc3VwZXJpb3IiLCAibG9naWNhbG5vdCIsICJtdSIsICJ0cmFkZW1hcmsiLCAiRXRoIiwKKyAgICAib25laGFsZiIsICJwbHVzbWludXMiLCAiVGhvcm4iLCAib25lcXVhcnRlciIsICJkaXZpZGUiLAorICAvKiAxNjAgKi8KKyAgICAiYnJva2VuYmFyIiwgImRlZ3JlZSIsICJ0aG9ybiIsICJ0aHJlZXF1YXJ0ZXJzIiwgInR3b3N1cGVyaW9yIiwKKyAgICAicmVnaXRlcmVkIiwgIm1pbnVzIiwgImV0aCIsICJtdWx0aXBseSIsICJ0aHJlZXN1cGVyaW9yIiwKKyAgLyogMTcwICovCisgICAgImNvcHlyaWdodCIsICJBYWN1dGUiLCAiQWNpcmN1bWZsZXgiLCAiQWRpZXJlc2lzIiwgIkFncmF2ZSIsCisgICAgIkFyaW5nIiwgIkF0aWxkZSIsICJDY2VkaWxsYSIsICJFYWN1dGUiLCAiRWNpcmN1bWZsZXgiLAorICAvKiAxODAgKi8KKyAgICAiRWRpZXJlc2lzIiwgIkVncmF2ZSIsICJJYWN1dGUiLCAiSWNpcmN1bWZsZXgiLCAiSWRpZXJlc2lzIiwKKyAgICAiSWdyYXZlIiwgIk50aWxkZSIsICJPYWN1dGUiLCAiT2NpcmN1bWZsZXgiLCAiT2RpZXJlc2lzIiwKKyAgLyogMTkwICovCisgICAgIk9ncmF2ZSIsICJPdGlsZGUiLCAiU2Nhcm9uIiwgIlVhY3V0ZSIsICJVY2lyY3VtZmxleCIsCisgICAgIlVkaWVyZXNpcyIsICJVZ3JhdmUiLCAiWWFjdXRlIiwgIllkaWVyZXNpcyIsICJaY2Fyb24iLAorICAvKiAyMDAgKi8KKyAgICAiYWFjdXRlIiwgImFjaXJjdW1mbGV4IiwgImFkaWVyZXNpcyIsICJhZ3JhdmUiLCAiYXJpbmciLAorICAgICJhdGlsZGUiLCAiY2NlZGlsbGEiLCAiZWFjdXRlIiwgImVjaXJjdW1mbGV4IiwgImVkaWVyZXNpcyIsCisgIC8qIDIxMCAqLworICAgICJlZ3JhdmUiLCAiaWFjdXRlIiwgImljaXJjdW1mbGV4IiwgImlkaWVyZXNpcyIsICJpZ3JhdmUiLAorICAgICJudGlsZGUiLCAib2FjdXRlIiwgIm9jaXJjdW1mbGV4IiwgIm9kaWVyZXNpcyIsICJvZ3JhdmUiLAorICAvKiAyMjAgKi8KKyAgICAib3RpbGRlIiwgInNjYXJvbiIsICJ1YWN1dGUiLCAidWNpcmN1bWZsZXgiLCAidWRpZXJlc2lzIiwKKyAgICAidWdyYXZlIiwgInlhY3V0ZSIsICJ5ZGllcmVzaXMiLCAiemNhcm9uIiwgImV4Y2xhbXNtYWxsIiwKKyAgLyogMjMwICovCisgICAgIkh1bmdhcnVtbGF1dHNtYWxsIiwgImRvbGxhcm9sZHN0eWxlIiwgImRvbGxhcnN1cGVyaW9yIiwgImFtcGVyc2FuZHNtYWxsIiwKKyAgICAgICJBY3V0ZXNtYWxsIiwKKyAgICAicGFyZW5sZWZ0c3VwZXJpb3IiLCAicGFyZW5yaWdodHN1cGVyaW9yIiwgInR3b2RvdGVubGVhZGVyIiwKKyAgICAgICJvbmVkb3RlbmxlYWRlciIsICJ6ZXJvb2xkc3R5bGUiLAorICAvKiAyNDAgKi8KKyAgICAib25lb2xkc3R5bGUiLCAidHdvb2xkc3R5bGUiLCAidGhyZWVvbGRzdHlsZSIsICJmb3Vyb2xkc3R5bGUiLAorICAgICAgImZpdmVvbGRzdHlsZSIsCisgICAgInNpeG9sZHN0eWxlIiwgInNldmVub2xkc3R5bGUiLCAiZWlnaHRvbGRzdHlsZSIsICJuaW5lb2xkc3R5bGUiLAorICAgICAgImNvbW1hc3VwZXJpb3IiLAorICAvKiAyNTAgKi8KKyAgICAidGhyZWVxdWFydGVyc2VtZGFzaCIsICJwZXJpb2RzdXBlcmlvciIsICJxdWVzdGlvbnNtYWxsIiwgImFzdXBlcmlvciIsCisgICAgICAiYnN1cGVyaW9yIiwKKyAgICAiY2VudHN1cGVyaW9yIiwgImRzdXBlcmlvciIsICJlc3VwZXJpb3IiLCAiaXN1cGVyaW9yIiwgImxzdXBlcmlvciIsCisgIC8qIDI2MCAqLworICAgICJtc3VwZXJpb3IiLCAibnN1cGVyaW9yIiwgIm9zdXBlcmlvciIsICJyc3VwZXJpb3IiLCAic3N1cGVyaW9yIiwKKyAgICAidHN1cGVyaW9yIiwgImZmIiwgImZmaSIsICJmZmwiLCAicGFyZW5sZWZ0aW5mZXJpb3IiLAorICAvKiAyNzAgKi8KKyAgICAicGFyZW5yaWdodGluZmVyaW9yIiwgIkNpcmN1bWZsZXhzbWFsbCIsICJoeXBoZW5zdXBlcmlvciIsICJHcmF2ZXNtYWxsIiwKKyAgICAgICJBc21hbGwiLAorICAgICJCc21hbGwiLCAiQ3NtYWxsIiwgIkRzbWFsbCIsICJFc21hbGwiLCAiRnNtYWxsIiwKKyAgLyogMjgwICovCisgICAgIkdzbWFsbCIsICJIc21hbGwiLCAiSXNtYWxsIiwgIkpzbWFsbCIsICJLc21hbGwiLAorICAgICJMc21hbGwiLCAiTXNtYWxsIiwgIk5zbWFsbCIsICJPc21hbGwiLCAiUHNtYWxsIiwKKyAgLyogMjkwICovCisgICAgIlFzbWFsbCIsICJSc21hbGwiLCAiU3NtYWxsIiwgIlRzbWFsbCIsICJVc21hbGwiLAorICAgICJWc21hbGwiLCAiV3NtYWxsIiwgIlhzbWFsbCIsICJZc21hbGwiLCAiWnNtYWxsIiwKKyAgLyogMzAwICovCisgICAgImNvbG9ubW9uZXRhcnkiLCAib25lZml0dGVkIiwgInJ1cGlhaCIsICJUaWxkZXNtYWxsIiwgImV4Y2xhbWRvd25zbWFsbCIsCisgICAgImNlbnRvbGRzdHlsZSIsICJMc2xhc2hzbWFsbCIsICJTY2Fyb25zbWFsbCIsICJaY2Fyb25zbWFsbCIsCisgICAgICAiRGllcmVzaXNzbWFsbCIsCisgIC8qIDMxMCAqLworICAgICJCcmV2ZXNtYWxsIiwgIkNhcm9uc21hbGwiLCAiRG90YWNjZW50c21hbGwiLCAiTWFjcm9uc21hbGwiLCAiZmlndXJlZGFzaCIsCisgICAgImh5cGhlbmluZmVyaW9yIiwgIk9nb25la3NtYWxsIiwgIlJpbmdzbWFsbCIsICJDZWRpbGxhc21hbGwiLAorICAgICAgInF1ZXN0aW9uZG93bnNtYWxsIiwKKyAgLyogMzIwICovCisgICAgIm9uZWVpZ2h0aCIsICJ0aHJlZWVpZ2h0aHMiLCAiZml2ZWVpZ2h0aHMiLCAic2V2ZW5laWdodGhzIiwgIm9uZXRoaXJkIiwKKyAgICAidHdvdGhpcmRzIiwgInplcm9zdXBlcmlvciIsICJmb3Vyc3VwZXJpb3IiLCAiZml2ZXN1cGVyaW9yIiwKKyAgICAgICJzaXhzdXBlcmlvciIsCisgIC8qIDMzMCAqLworICAgICJzZXZlbnN1cGVyaW9yIiwgImVpZ2h0c3VwZXJpb3IiLCAibmluZXN1cGVyaW9yIiwgInplcm9pbmZlcmlvciIsCisgICAgICAib25laW5mZXJpb3IiLAorICAgICJ0d29pbmZlcmlvciIsICJ0aHJlZWluZmVyaW9yIiwgImZvdXJpbmZlcmlvciIsICJmaXZlaW5mZXJpb3IiLAorICAgICAgInNpeGluZmVyaW9yIiwKKyAgLyogMzQwICovCisgICAgInNldmVuaW5mZXJpb3IiLCAiZWlnaHRpbmZlcmlvciIsICJuaW5laW5mZXJpb3IiLCAiY2VudGluZmVyaW9yIiwKKyAgICAgICJkb2xsYXJpbmZlcmlvciIsCisgICAgInBlcmlvZGluZmVyaW9yIiwgImNvbW1haW5mZXJpb3IiLCAiQWdyYXZlc21hbGwiLCAiQWFjdXRlc21hbGwiLAorICAgICAgIkFjaXJjdW1mbGV4c21hbGwiLAorICAvKiAzNTAgKi8KKyAgICAiQXRpbGRlc21hbGwiLCAiQWRpZXJlc2lzc21hbGwiLCAiQXJpbmdzbWFsbCIsICJBRXNtYWxsIiwgIkNjZWRpbGxhc21hbGwiLAorICAgICJFZ3JhdmVzbWFsbCIsICJFYWN1dGVzbWFsbCIsICJFY2lyY3VtZmxleHNtYWxsIiwgIkVkaWVyZXNpc3NtYWxsIiwKKyAgICAgICJJZ3JhdmVzbWFsbCIsCisgIC8qIDM2MCAqLworICAgICJJYWN1dGVzbWFsbCIsICJJY2lyY3VtZmxleHNtYWxsIiwgIklkaWVyZXNpc3NtYWxsIiwgIkV0aHNtYWxsIiwKKyAgICAgICJOdGlsZGVzbWFsbCIsCisgICAgIk9ncmF2ZXNtYWxsIiwgIk9hY3V0ZXNtYWxsIiwgIk9jaXJjdW1mbGV4c21hbGwiLCAiT3RpbGRlc21hbGwiLAorICAgICAgIk9kaWVyZXNpc3NtYWxsIiwKKyAgLyogMzcwICovCisgICAgIk9Fc21hbGwiLCAiT3NsYXNoc21hbGwiLCAiVWdyYXZlc21hbGwiLCAiVWFjYXV0ZXNtYWxsIiwKKyAgICAgICJVY2lyY3VtZmxleHNtYWxsIiwKKyAgICAiVWRpZXJlc2lzc21hbGwiLCAiWWFjdXRlc21hbGwiLCAiVGhvcm5zbWFsbCIsICJZZGllcmVzaXNzbWFsbCIsCisgICAgICAiMDAxLjAwMCIsCisgIC8qIDM4MCAqLworICAgICIwMDEuMDAxIiwgIjAwMS4wMDIiLCAiMDAxLjAwMyIsICJCbGFjayIsICJCb2xkIiwKKyAgICAiQm9vayIsICJMaWdodCIsICJNZWRpdW0iLCAiUmVndWxhciIsICJSb21hbiIsCisgIC8qIDM5MCAqLworICAgICJTZW1pYm9sZCIKKyAgfTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogIHQxX3N0YW5kYXJkX2VuY29kaW5nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgQSBzaW1wbGUgdGFibGUgdXNlZCB0byBlbmNvZGUgdGhlIEFkb2JlIFN0YW5kYXJkRW5jb2RpbmcuICBUaGUgICAgKi8KKyAgLyogICAgIHRhYmxlIHZhbHVlcyBhcmUgdGhlIFNJRCBvZiB0aGUgc3RhbmRhcmQgZ2x5cGhzOyB0aGUgdGFibGUgaW5kZXggICovCisgIC8qICAgICBpcyB0aGUgY2hhcmFjdGVyIGNvZGUgZm9yIHRoZSBlbmNvZGluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgIEV4YW1wbGU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICB0MV9zdGFuZGFyZF9lbmNvZGluZ1szM10gPT0gMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICB3aGljaCBtZWFucyB0aGF0IHRoZSBnbHlwaCBuYW1lIGZvciBjaGFyYWN0ZXIgY29kZSAzMiBpcyAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgdDFfc3RhbmRhcmRfc3RyaW5nc1syXSA9PSAiZXhjbGFtIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgKHRoaXMgY29ycmVzcG9uZCB0byB0aGUgZXhjbGFtYXRpb24gbWFyayBgIScpLiAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIExPQ0FMX0ZVTkMKKyAgVDFfU2hvcnQgIHQxX3N0YW5kYXJkX2VuY29kaW5nWzI1Nl0gPQorICB7CisgIC8qICAgMCAqLyAKKyAgICAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCisgICAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLAorICAgICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKKyAgICAgIDAsICAgMCwgICAxLCAgIDIsICAgMywgICA0LCAgIDUsICAgNiwgICA3LCAgIDgsCisgICAgICA5LCAgMTAsICAxMSwgIDEyLCAgMTMsICAxNCwgIDE1LCAgMTYsICAxNywgIDE4LAorICAvKiAgNTAgKi8KKyAgICAgMTksICAyMCwgIDIxLCAgMjIsICAyMywgIDI0LCAgMjUsICAyNiwgIDI3LCAgMjgsCisgICAgIDI5LCAgMzAsICAzMSwgIDMyLCAgMzMsICAzNCwgIDM1LCAgMzYsICAzNywgIDM4LAorICAgICAzOSwgIDQwLCAgNDEsICA0MiwgIDQzLCAgNDQsICA0NSwgIDQ2LCAgNDcsICA0OCwKKyAgICAgNDksICA1MCwgIDUxLCAgNTIsICA1MywgIDU0LCAgNTUsICA1NiwgIDU3LCAgNTgsCisgICAgIDU5LCAgNjAsICA2MSwgIDYyLCAgNjMsICA2NCwgIDY1LCAgNjYsICA2NywgIDY4LAorICAvKiAxMDAgKi8KKyAgICAgNjksICA3MCwgIDcxLCAgNzIsICA3MywgIDc0LCAgNzUsICA3NiwgIDc3LCAgNzgsCisgICAgIDc5LCAgODAsICA4MSwgIDgyLCAgODMsICA4NCwgIDg1LCAgODYsICA4NywgIDg4LAorICAgICA4OSwgIDkwLCAgOTEsICA5MiwgIDkzLCAgOTQsICA5NSwgICAwLCAgIDAsICAgMCwKKyAgICAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCisgICAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLAorICAvKiAxNTAgKi8KKyAgICAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCisgICAgICAwLCAgOTYsICA5NywgIDk4LCAgOTksIDEwMCwgMTAxLCAxMDIsIDEwMywgMTA0LAorICAgIDEwNSwgMTA2LCAxMDcsIDEwOCwgMTA5LCAxMTAsICAgMCwgMTExLCAxMTIsIDExMywKKyAgICAxMTQsICAgMCwgMTE1LCAxMTYsIDExNywgMTE4LCAxMTksIDEyMCwgMTIxLCAxMjIsCisgICAgICAwLCAxMjMsICAgMCwgMTI0LCAxMjUsIDEyNiwgMTI3LCAxMjgsIDEyOSwgMTMwLAorICAvKiAyMDAgKi8KKyAgICAxMzEsICAgMCwgMTMyLCAxMzMsICAgMCwgMTM0LCAxMzUsIDEzNiwgMTM3LCAgIDAsCisgICAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLAorICAgICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAxMzgsICAgMCwgMTM5LCAgIDAsICAgMCwKKyAgICAgIDAsICAgMCwgMTQwLCAxNDEsIDE0MiwgMTQzLCAgIDAsICAgMCwgICAwLCAgIDAsCisgICAgICAwLCAxNDQsICAgMCwgICAwLCAgIDAsIDE0NSwgICAwLCAgIDAsIDE0NiwgMTQ3LAorICAvKiAyNTAgKi8KKyAgICAxNDgsIDE0OSwgICAwLCAgIDAsICAgMCwgICAwCisgIH07CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICB0MV9leHBlcnRfZW5jb2Rpbmc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgIEEgc2ltcGxlIHRhYmxlIHVzZWQgdG8gZW5jb2RlIHRoZSBBZG9iZSBFeHBlcnRFbmNvZGluZy4gIFRoZSAgICAgICovCisgIC8qICAgICB0YWJsZSB2YWx1ZXMgYXJlIHRoZSBTSUQgb2YgdGhlIHN0YW5kYXJkIGdseXBoczsgdGhlIHRhYmxlIGluZGV4ICAqLworICAvKiAgICAgaXMgdGhlIGNoYXJhY3RlciBjb2RlIGZvciB0aGUgZW5jb2RpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICBFeGFtcGxlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgdDFfZXhwZXJ0X2VuY29kaW5nWzMzXSA9PSAyMjkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgd2hpY2ggbWVhbnMgdGhhdCB0aGUgZ2x5cGggbmFtZSBmb3IgY2hhcmFjdGVyIGNvZGUgMzIgaXMgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgIHQxX3N0YW5kYXJkX3N0cmluZ3NbMjI5XSA9PSAiZXhjbGFtc21hbGwiICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgTE9DQUxfRlVOQworICBUMV9TaG9ydCAgdDFfZXhwZXJ0X2VuY29kaW5nWzI1Nl0gPQorICB7CisgIC8qICAgMCAqLworICAgICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKKyAgICAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCisgICAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLAorICAgICAgMCwgICAwLCAgIDEsIDIyOSwgMjMwLCAgIDAsIDIzMSwgMjMyLCAyMzMsIDIzNCwKKyAgICAyMzUsIDIzNiwgMjM3LCAyMzgsICAxMywgIDE0LCAgMTUsICA5OSwgMjM5LCAyNDAsCisgIC8qICA1MCAqLworICAgIDI0MSwgMjQyLCAyNDMsIDI0NCwgMjQ1LCAyNDYsIDI0NywgMjQ4LCAgMjcsICAyOCwKKyAgICAyNDksIDI1MCwgMjUxLCAyNTIsICAgMCwgMjUzLCAyNTQsIDI1NSwgMjU2LCAyNTcsCisgICAgICAwLCAgIDAsICAgMCwgMjU4LCAgIDAsICAgMCwgMjU5LCAyNjAsIDI2MSwgMjYyLAorICAgICAgMCwgICAwLCAyNjMsIDI2NCwgMjY1LCAgIDAsIDI2NiwgMTA5LCAxMTAsIDI2NywKKyAgICAyNjgsIDI2OSwgICAwLCAyNzAsIDI3MSwgMjcyLCAyNzMsIDI3NCwgMjc1LCAyNzYsCisgIC8qIDEwMCAqLworICAgIDI3NywgMjc4LCAyNzksIDI4MCwgMjgxLCAyODIsIDI4MywgMjg0LCAyODUsIDI4NiwKKyAgICAyODcsIDI4OCwgMjg5LCAyOTAsIDI5MSwgMjkyLCAyOTMsIDI5NCwgMjk1LCAyOTYsCisgICAgMjk3LCAyOTgsIDI5OSwgMzAwLCAzMDEsIDMwMiwgMzAzLCAgIDAsICAgMCwgICAwLAorICAgICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKKyAgICAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCisgIC8qIDE1MCAqLworICAgICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKKyAgICAgIDAsIDMwNCwgMzA1LCAzMDYsICAgMCwgICAwLCAzMDcsIDMwOCwgMzA5LCAzMTAsCisgICAgMzExLCAgIDAsIDMxMiwgICAwLCAgIDAsIDMxMiwgICAwLCAgIDAsIDMxNCwgMzE1LAorICAgICAgMCwgICAwLCAzMTYsIDMxNywgMzE4LCAgIDAsICAgMCwgICAwLCAxNTgsIDE1NSwKKyAgICAxNjMsIDMxOSwgMzIwLCAzMjEsIDMyMiwgMzIzLCAzMjQsIDMyNSwgICAwLCAgIDAsCisgIC8qIDIwMCAqLworICAgIDMyNiwgMTUwLCAxNjQsIDE2OSwgMzI3LCAzMjgsIDMyOSwgMzMwLCAzMzEsIDMzMiwKKyAgICAzMzMsIDMzNCwgMzM1LCAzMzYsIDMzNywgMzM4LCAzMzksIDM0MCwgMzQxLCAzNDIsCisgICAgMzQzLCAzNDQsIDM0NSwgMzQ2LCAzNDcsIDM0OCwgMzQ5LCAzNTAsIDM1MSwgMzUyLAorICAgIDM1MywgMzU0LCAzNTUsIDM1NiwgMzU3LCAzNTgsIDM1OSwgMzYwLCAzNjEsIDM2MiwKKyAgICAzNjMsIDM2NCwgMzY1LCAzNjYsIDM2NywgMzY4LCAzNjksIDM3MCwgMzcxLCAzNzIsCisgIC8qIDI1MCAqLworICAgIDM3MywgMzc0LCAzNzUsIDM3NiwgMzc3LCAzNzgKKyAgfTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogIHQxX2V4cGVydF9zdWJzZXRfZW5jb2Rpbmc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgQSBzaW1wbGUgdGFibGUgdXNlZCB0byBlbmNvZGUgdGhlIEFkb2JlIEV4cGVydEVuY29kaW5nIHN1YnNldCAgICAgKi8KKyAgLyogICAgIGRlZmluZWQgaW4gdGhlIENGRiBzcGVjaWZpY2F0aW9uLiAgSXQgd2lsbCBwcm9iYWJseSBldm9sdmUgaW50byAgICovCisgIC8qICAgICBhbm90aGVyIGZvcm0gc29vbmVyIG9yIGxhdGVyLCBhcyB3ZSBkZWFsIHdpdGggY2hhcnNldHMgICAgICAgICAgICAqLworICAvKiAgICAgZGlmZmVyZW50bHkgdGhhbiB3aXRoIGVuY29kaW5ncy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIExPQ0FMX0ZVTkMKKyAgRlRfU2hvcnQgIHQxX2V4cGVydF9zdWJzZXRfZW5jb2RpbmdbMjU2XSA9CisgIHsKKyAgLyogICAwICovCisgICAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLAorICAgICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKKyAgICAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCisgICAgICAwLCAgIDAsICAgMSwgICAwLCAgIDAsICAgMCwgMjMxLCAyMzIsICAgMCwgICAwLAorICAgIDIzNSwgMjM2LCAyMzcsIDIzOCwgIDEzLCAgMTQsICAxNSwgIDk5LCAyMzksIDI0MCwKKyAgLyogIDUwICovCisgICAgMjQxLCAyNDIsIDI0MywgMjQ0LCAyNDUsIDI0NiwgMjQ3LCAyNDgsICAyNywgIDI4LAorICAgIDI0OSwgMjUwLCAyNTEsIDI1MiwgICAwLCAyNTMsIDI1NCwgMjU1LCAyNTYsIDI1NywKKyAgICAgIDAsICAgMCwgICAwLCAyNTgsICAgMCwgICAwLCAyNTksIDI2MCwgMjYxLCAyNjIsCisgICAgICAwLCAgIDAsIDI2MywgMjY0LCAyNjUsICAgMCwgMjY2LCAxMDksIDExMCwgMjY3LAorICAgIDI2OCwgMjY5LCAgIDAsIDI3MCwgICAwLCAyNzIsICAgMCwgICAwLCAgIDAsICAgMCwKKyAgLyogMTAwICovCisgICAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLAorICAgICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKKyAgICAgIDAsICAgMCwgICAwLCAzMDAsIDMwMSwgMzAyLCAzMDMsICAgMCwgICAwLCAgIDAsCisgICAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLAorICAgICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKKyAgLyogMTUwICovCisgICAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLAorICAgICAgMCwgMzA0LCAzMDUsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKKyAgICAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgMzE0LCAzMTUsCisgICAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsIDE1OCwgMTU1LAorICAgIDE2MywgICAwLCAzMjAsIDMyMSwgMzIyLCAzMjMsIDMyNCwgMzI1LCAgIDAsICAgMCwKKyAgLyogMjAwICovCisgICAgMzI2LCAxNTAsIDE2NCwgMTY5LCAzMjcsIDMyOCwgMzI5LCAzMzAsIDMzMSwgMzMyLAorICAgIDMzMywgMzM0LCAzMzUsIDMzNiwgMzM3LCAzMzgsIDMzOSwgMzQwLCAzNDEsIDM0MiwKKyAgICAzNDMsIDM0NCwgMzQ1LCAzNDYsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCisgICAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLAorICAgICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKKyAgLyogMjUwICovCisgICAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMAorICB9OworCisKKy8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3NoYXJlZC90eXBlMS90MWVuY29kZS5oIGIvc3JjL3NoYXJlZC90eXBlMS90MWVuY29kZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhNTVhY2QKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvc2hhcmVkL3R5cGUxL3QxZW5jb2RlLmgKQEAgLTAsMCArMSw5OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgdDFlbmNvZGUuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIFR5cGUgMSBzdGFuZGFyZCBlbmNvZGluZyB0YWJsZXMgZGVmaW5pdGlvbnMgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAxOTk2LTE5OTkgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCAgICAgICAgKi8KKy8qICBtb2RpZmllZCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgICovCisvKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLworLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KKy8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZpbGUgaXMgaW5jbHVkZWQgYnkgYm90aCB0aGUgVHlwZTEgYW5kIFR5cGUyIGRyaXZlci4gICAgICAgICAgICAgICovCisvKiAgSXQgc2hvdWxkIG5ldmVyIGJlIGNvbXBpbGVkIGRpcmVjdGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2lmbmRlZiBUMUVOQ09ERV9ICisjZGVmaW5lIFQxRU5DT0RFX0gKKworI2luY2x1ZGUgPHQxdHlwZXMuaD4KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogIHQxX3N0YW5kYXJkX3N0cmluZ3M6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgVGhpcyBhcnJheSBjb250YWlucyB0aGUgQWRvYmUgU3RhbmRhcmQgR2x5cGggTmFtZXMgb3JkZXJlZCBieSAgICAgKi8KKyAgLyogICAgIFNJRC4gIEl0IHdhcyB0YWtlbiBmcm9tIHRoZSBDRkYgc3BlY2lmaWNhdGlvbi4gICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBMT0NBTF9ERUYKKyAgY29uc3QgVDFfU3RyaW5nKiAgdDFfc3RhbmRhcmRfc3RyaW5nc1tdOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgdDFfc3RhbmRhcmRfZW5jb2Rpbmc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICBBIHNpbXBsZSB0YWJsZSB1c2VkIHRvIGVuY29kZSB0aGUgQWRvYmUgU3RhbmRhcmRFbmNvZGluZy4gIFRoZSAgICAqLworICAvKiAgICAgdGFibGUgdmFsdWVzIGFyZSB0aGUgU0lEIG9mIHRoZSBzdGFuZGFyZCBnbHlwaHM7IHRoZSB0YWJsZSBpbmRleCAgKi8KKyAgLyogICAgIGlzIHRoZSBjaGFyYWN0ZXIgY29kZSBmb3IgdGhlIGVuY29kaW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgRXhhbXBsZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgIHQxX3N0YW5kYXJkX2VuY29kaW5nWzMzXSA9PSAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgIHdoaWNoIG1lYW5zIHRoYXQgdGhlIGdseXBoIG5hbWUgZm9yIGNoYXJhY3RlciBjb2RlIDMyIGlzICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICB0MV9zdGFuZGFyZF9zdHJpbmdzWzJdID09ICJleGNsYW0iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAodGhpcyBjb3JyZXNwb25kIHRvIHRoZSBleGNsYW1hdGlvbiBtYXJrIGAhJykuICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgTE9DQUxfREVGCisgIFQxX1Nob3J0ICB0MV9zdGFuZGFyZF9lbmNvZGluZ1syNTZdOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgdDFfZXhwZXJ0X2VuY29kaW5nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICBBIHNpbXBsZSB0YWJsZSB1c2VkIHRvIGVuY29kZSB0aGUgQWRvYmUgRXhwZXJ0RW5jb2RpbmcuICBUaGUgICAgICAqLworICAvKiAgICAgdGFibGUgdmFsdWVzIGFyZSB0aGUgU0lEIG9mIHRoZSBzdGFuZGFyZCBnbHlwaHM7IHRoZSB0YWJsZSBpbmRleCAgKi8KKyAgLyogICAgIGlzIHRoZSBjaGFyYWN0ZXIgY29kZSBmb3IgdGhlIGVuY29kaW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgRXhhbXBsZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgIHQxX2V4cGVydF9lbmNvZGluZ1szM10gPT0gMjI5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgIHdoaWNoIG1lYW5zIHRoYXQgdGhlIGdseXBoIG5hbWUgZm9yIGNoYXJhY3RlciBjb2RlIDMyIGlzICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICB0MV9zdGFuZGFyZF9zdHJpbmdzWzIyOV0gPT0gImV4Y2xhbXNtYWxsIiAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIExPQ0FMX0RFRgorICBUMV9TaG9ydCAgdDFfZXhwZXJ0X2VuY29kaW5nWzI1Nl07CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICB0MV9leHBlcnRfc3Vic2V0X2VuY29kaW5nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgIEEgc2ltcGxlIHRhYmxlIHVzZWQgdG8gZW5jb2RlIHRoZSBBZG9iZSBFeHBlcnRFbmNvZGluZyBzdWJzZXQgICAgICovCisgIC8qICAgICBkZWZpbmVkIGluIHRoZSBDRkYgc3BlY2lmaWNhdGlvbi4gIEl0IHdpbGwgcHJvYmFibHkgZXZvbHZlIGludG8gICAqLworICAvKiAgICAgYW5vdGhlciBmb3JtIHNvb25lciBvciBsYXRlciwgYXMgd2UgZGVhbCB3aXRoIGNoYXJzZXRzICAgICAgICAgICAgKi8KKyAgLyogICAgIGRpZmZlcmVudGx5IHRoYW4gd2l0aCBlbmNvZGluZ3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBMT0NBTF9ERUYKKyAgVDFfU2hvcnQgIHQxX2V4cGVydF9zdWJzZXRfZW5jb2RpbmdbMjU2XTsKKworCisjZW5kaWYgLyogVDFFTkNPREVfSCAqLworCisKKy8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3NoYXJlZC90eXBlMS90MXR5cGVzLmggYi9zcmMvc2hhcmVkL3R5cGUxL3QxdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTNiNzQzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3NoYXJlZC90eXBlMS90MXR5cGVzLmgKQEAgLTAsMCArMSw0ODUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIHQxdHlwZXMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMAorICoKKyAqICAgIEJhc2ljIFR5cGUxL1R5cGUyIHR5cGUgZGVmaW5pdGlvbnMgYW5kIGludGVyZmFjZS4KKyAqCisgKiAgVGhpcyBjb2RlIGlzIHNoYXJlZCBieSB0aGUgVHlwZTEgYW5kIFR5cGUyIGRyaXZlcnMKKyAqCisgKgorICogIENvcHlyaWdodCAxOTk2LTE5OTkgYnkKKyAqICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZAorICogIG1vZGlmaWVkIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBUMVRZUEVTX0gKKyNkZWZpbmUgVDFUWVBFU19ICisKKyNpbmNsdWRlIDxmcmVldHlwZS5oPgorCisKKyNpZmRlZiBfX2NwbHVzcGx1cworICBleHRlcm4gIkMiIHsKKyNlbmRpZgorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiovCisvKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KKy8qKiogICAgICAgICAgICAgICAgREVGSU5JVElPTlMgT0YgQkFTSUMgREFUQSBUWVBFUyAgICAgICAgICAgICAgICAgICAgKioqLworLyoqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiovCisvKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvKiBUaGUgUkVERUZJTkUgbWFjcm8gaXMgdXNlZCB0byBjb252ZXJ0IGEgRnJlZVR5cGUgZ2VuZXJpYyB0eXBlIGludG8gICAgKi8KKy8qIGEgVHJ1ZVR5cGUtc3BlY2lmaWMgb25lLiBJdCBzaW1wbHkgcmVwbGFjZXMgdGhlICJGVF8iIHByZWZpeCBieSAiVDFfIiAqLworLyogaW4gb3JkZXIgdG8gZGVmaW5lIGNvbXBhdGlibGUgVDFfTG9uZywgVDFfRXJyb3IsIFQxX091dGxpbmUsIGV0Yy4uICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyN1bmRlZiAgUkVERUZJTkUKKyNkZWZpbmUgUkVERUZJTkUoIHR5cGUgKSAgIHR5cGVkZWYgRlRfIyN0eXBlICBUMV8jI3R5cGUKKworCisgIC8qIDxUeXBlPiBUMV9Cb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgc2ltcGxlIHR5cGVkZWYgb2YgdW5zaWduZWQgY2hhciwgdXNlZCBmb3Igc2ltcGxlIGJvb2xlYW5zLiAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIFJFREVGSU5FKCBCb29sICk7CisKKworICAvKiA8VHlwZT4gVDFfRldvcmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBhIHNpZ25lZCAxNi1iaXQgaW50ZWdlciB1c2VkIHRvIHN0b3JlIGEgZGlzdGFuY2UgaW4gb3JpZ2luYWwgICAgICAqLworICAvKiAgICBmb250IHVuaXRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBSRURFRklORSggRldvcmQgKTsKKworCisgIC8qIDxUeXBlPiBUMV9VRldvcmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGFuIHVuc2lnbmVkIDE2LWJpdCBpbnRlZ2VyIHVzZWQgdG8gc3RvcmUgYSBkaXN0YW5jZSBpbiBvcmlnaW5hbCAgICovCisgIC8qICAgIGZvbnQgdW5pdHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIFJFREVGSU5FKCBVRldvcmQgKTsKKworCisgIC8qIDxUeXBlPiBUMV9DaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGEgc2ltcGxlIHR5cGVkZWYgZm9yIHRoZSBfc2lnbmVkXyBjaGFyIHR5cGUuICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIFJFREVGSU5FKCBDaGFyICk7CisKKworICAvKiA8VHlwZT4gVDFfQnl0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBhIHNpbXBsZSB0eXBlZGVmIGZvciB0aGUgX3Vuc2lnbmVkXyBjaGFyIHR5cGUuICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBSRURFRklORSggQnl0ZSApOworCisKKyAgLyogPFR5cGU+IFQxX1N0cmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgYSBzaW1wbGUgdHlwZWRlZiBmb3IgdGhlIGNoYXIgdHlwZSwgdXNlZCBmb3Igc3RyaW5ncyB1c3VhbGx5LiAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgUkVERUZJTkUoIFN0cmluZyApOworCisKKyAgLyogPFR5cGU+IFQxX1Nob3J0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgYSB0eXBlZGVmIGZvciBzaWduZWQgc2hvcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgUkVERUZJTkUoIFNob3J0ICk7CisKKworICAvKiA8VHlwZT4gVDFfVVNob3J0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBhIHR5cGVkZWYgZm9yIHVuc2lnbmVkIHNob3J0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBSRURFRklORSggVVNob3J0ICk7CisKKworICAvKiA8VHlwZT4gRlRfSW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBhIHR5cGVkZWYgZm9yIHRoZSBpbnQgdHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBSRURFRklORSggSW50ICk7CisKKworICAvKiA8VHlwZT4gRlRfVUludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBhIHR5cGVkZWYgZm9yIHRoZSB1bnNpZ25lZCBpbnQgdHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBSRURFRklORSggVUludCApOworCisKKyAgLyogPFR5cGU+IFQxX0xvbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgYSB0eXBlZGVmIGZvciBzaWduZWQgbG9uZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgUkVERUZJTkUoIExvbmcgKTsKKworCisgIC8qIDxUeXBlPiBUMV9VTG9uZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGEgdHlwZWRlZiBmb3IgdW5zaWduZWQgbG9uZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIFJFREVGSU5FKCBVTG9uZyApOworCisKKyAgLyogPFR5cGU+IFQxX0YyRG90MTQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgYSBzaWduZWQgMi4xNCBmaXhlZCBmbG9hdCB1c2VkIGZvciB1bml0IHZlY3RvcnMgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBSRURFRklORSggRjJEb3QxNCApOworCisKKyAgLyogPFR5cGU+IFQxX0YyNkRvdDYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgYSBzaWduZWQgMjYuNiBmaXhlZCBmbG9hdCB1c2VkIGZvciB2ZWN0b3JpYWwgcGl4ZWwgY29vcmRpbmF0ZXMgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBSRURFRklORSggRjI2RG90NiApOworCisKKyAgLyogPFR5cGU+IFQxX0ZpeGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgIFRoaXMgdHlwZSBpcyB1c2VkIHRvIHN0b3JlIDE2LjE2IGZpeGVkIGZsb2F0IHZhbHVlcywgbGlrZSAgICAgICAgICovCisgIC8qICAgICBzY2FsZXMgb3IgbWF0cml4IGNvZWZmaWNpZW50cy4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgUkVERUZJTkUoIEZpeGVkICk7CisKKworICAvKiA8VHlwZT4gVDFfUG9zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgVGhlIHR5cGUgVDFfUG9zIGlzIGEgMzItYml0cyBpbnRlZ2VyIHVzZWQgdG8gc3RvcmUgdmVjdG9yaWFsICAgKi8KKyAgLyogICAgIGNvb3JkaW5hdGVzLiBEZXBlbmRpbmcgb24gdGhlIGNvbnRleHQsIHRoZXNlIGNhbiByZXByZXNlbnQgICAgICovCisgIC8qICAgICBkaXN0YW5jZXMgaW4gaW50ZWdlciBmb250IHVuaXRzLCBvciAyNi42IGZpeGVkIGZsb2F0IHBpeGVsICAgICAqLworICAvKiAgICAgY29vcmRpbmF0ZXMuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIFJFREVGSU5FKCBQb3MgKTsKKworCisgIC8qIDxTdHJ1Y3Q+IFQxX1ZlY3RvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICBBIHNpbXBsZSBzdHJ1Y3R1cmUgdXNlZCB0byBzdG9yZSBhIDJkIHZlY3RvciwgY29vcmRpbmF0ZXMgICAgICAqLworICAvKiAgICAgYXJlIG9mIHRoZSBUMV9Qb3MgdHlwZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB4ICA6OiAgaG9yaXpvbnRhbCBjb29yZGluYXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgeSAgOjogIHZlcnRpY2FsIGNvb3JkaW5hdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBSRURFRklORSggVmVjdG9yICk7CisKKyAgLyogPFN0cnVjdD4gVDFfVW5pdFZlY3RvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgIEEgc2ltcGxlIHN0cnVjdHVyZSB1c2VkIHRvIHN0b3JlIGEgMmQgdmVjdG9yIHVuaXQgdmVjdG9yLiAgICAgICovCisgIC8qICAgICB1c2VzIFQxX0YyRG90MTQgdHlwZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHggIDo6ICBob3Jpem9udGFsIGNvb3JkaW5hdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB5ICA6OiAgdmVydGljYWwgY29vcmRpbmF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIFJFREVGSU5FKCBVbml0VmVjdG9yICk7CisKKworICAvKiA8U3RydWN0PiBUMV9NYXRyaXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgQSBzaW1wbGUgc3RydWN0dXJlIHVzZWQgdG8gc3RvcmUgYSAyeDIgbWF0cml4LiBDb2VmZmljaWVudHMgICAgKi8KKyAgLyogICAgIGFyZSBpbiAxNi4xNiBmaXhlZCBmbG9hdCBmb3JtYXQuIFRoZSBjb21wdXRhdGlvbiBwZXJmb3JtZWQgICAgICovCisgIC8qICAgICBpcyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICB4JyA9IHgqeHggKyB5Knh5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgeScgPSB4Knl4ICsgeSp5eSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgeHggIDo6IG1hdHJpeCBjb2VmZmljaWVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgIHh5ICA6OiBtYXRyaXggY29lZmZpY2llbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICB5eCAgOjogbWF0cml4IGNvZWZmaWNpZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgeXkgIDo6IG1hdHJpeCBjb2VmZmljaWVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIFJFREVGSU5FKCBNYXRyaXggKTsKKworCisgIC8qIDxTdHJ1Y3Q+IFQxX0JCb3ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICBBIHN0cnVjdHVyZSB1c2VkIHRvIGhvbGQgYW4gb3V0bGluZSdzIGJvdW5kaW5nIGJveCwgaS5lLiAgICAgICAqLworICAvKiAgICAgdGhlIGNvb3JkaW5hdGVzIG9mIGl0cyBleHRyZW1hIGluIHRoZSBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCAgKi8KKyAgLyogICAgIGRpcmVjdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgIHhNaW4gICA6OiAgdGhlIGhvcml6b250YWwgbWluaW11bSAgKGxlZnQtbW9zdCkgICAgICAgICAgICAgICAgICovCisgIC8qICAgICB5TWluICAgOjogIHRoZSB2ZXJ0aWNhbCBtaW5pbXVtICAgIChib3R0b20tbW9zdCkgICAgICAgICAgICAgICAqLworICAvKiAgICAgeE1heCAgIDo6ICB0aGUgaG9yaXpvbnRhbCBtYXhpbXVtICAocmlnaHQtbW9zdCkgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgIHlNYXggICA6OiAgdGhlIHZlcnRpY2FsIG1heGltdW0gICAgKHRvcC1tb3N0KSAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBSRURFRklORSggQkJveCApOworCisKKyAgLyogPFR5cGU+IFQxX0Vycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhlIEZyZWVUeXBlIGVycm9yIGNvZGUgdHlwZS4gQSB2YWx1ZSBvZiAwIGlzIGFsd2F5cyAgICAgICAgICAgICovCisgIC8qICAgIGludGVycHJldGVkIGFzIGEgc3VjY2VzZnVsIG9wZXJhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgUkVERUZJTkUoIEVycm9yICk7CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KKy8qKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqLworLyoqKiAgICAgICAgICAgICAgICBSRVFVSVJFRCBUWVBFMS9UWVBFMiBUQUJMRVMgREVGSU5JVElPTlMgICAgICAgICAgICAqKiovCisvKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KKy8qKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8U3RydWN0PiBUMV9Gb250SW5mbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGUgRm9udEluZm8gZGljdGlvbmFyeSBzdHJ1Y3R1cmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB2ZXJzaW9uICAgICAgICAgICAgIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG5vdGljZSAgICAgICAgICAgICAgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZnVsbF9uYW1lICAgICAgICAgICA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBmYW1pbHlfbmFtZSAgICAgICAgIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHdlaWdodCAgICAgICAgICAgICAgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgaXRhbGljX2FuZ2xlICAgICAgICA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBpc19maXhlZF9waXRjaCAgICAgIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHVuZGVybGluZV9wb3NpdGlvbiAgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgdW5kZXJsaW5lX3RoaWNrbmVzcyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgc3RydWN0IFQxX0ZvbnRJbmZvXworICB7CisgICAgVDFfU3RyaW5nKiAgICAgdmVyc2lvbjsKKyAgICBUMV9TdHJpbmcqICAgICBub3RpY2U7CisgICAgVDFfU3RyaW5nKiAgICAgZnVsbF9uYW1lOworICAgIFQxX1N0cmluZyogICAgIGZhbWlseV9uYW1lOworICAgIFQxX1N0cmluZyogICAgIHdlaWdodDsKKyAgICBUMV9Mb25nICAgICAgICBpdGFsaWNfYW5nbGU7CisgICAgVDFfQm9vbCAgICAgICAgaXNfZml4ZWRfcGl0Y2g7CisgICAgVDFfU2hvcnQgICAgICAgdW5kZXJsaW5lX3Bvc2l0aW9uOworICAgIFQxX1VTaG9ydCAgICAgIHVuZGVybGluZV90aGlja25lc3M7CisKKyAgfSBUMV9Gb250SW5mbzsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8U3RydWN0PiBUMV9Qcml2YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGUgUHJpdmF0ZSBkaWN0aW9uYXJ5IHN0cnVjdHVyZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB1bmlxdWVfaWQgOjogdGhlIGZvbnQncyB1bmlxdWUgaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGxlbklWICAgICA6OiBsZW5ndGggb2YgZGVjcnlwdCBwYWRkaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBudW1fYmx1ZXMgICAgICAgICAgICAgIDo6IG51bWJlciBvZiBibHVlIHZhbHVlcyAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG51bV9vdGhlcl9ibHVlcyAgICAgICAgOjogbnVtYmVyIG9mIG90aGVyIGJsdWUgdmFsdWVzICAgICAgICAgICAgKi8KKyAgLyogICAgbnVtX2ZhbWlseV9ibHVlcyAgICAgICA6OiBudW1iZXIgb2YgZmFtaWx5IGJsdWUgdmFsdWVzICAgICAgICAgICAqLworICAvKiAgICBudW1fZmFtaWx5X290aGVyX2JsdWVzIDo6IG51bWJlciBvZiBmYW1pbHkgb3RoZXIgYmx1ZSB2YWx1ZXMgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgYmx1ZV92YWx1ZXMgICAgICAgIDo6IGFycmF5IG9mIGJsdWUgdmFsdWVzICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBvdGhlcl9ibHVlcyAgICAgICAgOjogYXJyYXkgb2Ygb3RoZXIgYmx1ZSB2YWx1ZXMgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZhbWlseV9ibHVlcyAgICAgICA6OiBhcnJheSBvZiBmYW1pbHkgYmx1ZSB2YWx1ZXMgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZmFtaWx5X290aGVyX2JsdWVzIDo6IGFycmF5IG9mIGZhbWlseSBvdGhlciBibHVlIHZhbHVlcyAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGJsdWVfc2NhbGUgICAgICAgICA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgYmx1ZV9zaGlmdCAgICAgICAgIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBibHVlX3NjYWxlICAgICAgICAgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgc3RhbmRhcmRfd2lkdGggICAgIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzdGFuZGFyZF9oZWlnaHQgICAgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbnVtX3NuYXBfd2lkdGhzICAgIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBudW1fc25hcF9oZWlnaHRzICAgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZvcmNlX2JvbGQgICAgICAgICA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgcm91bmRfc3RlbV91cCAgICAgIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHN0ZW1fc25hcF93aWR0aHMgICA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgc3RlbV9zbmFwX2hlaWdodHMgIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGxhbmd1YWdlX2dyb3VwICAgICA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgcGFzc3dvcmQgICAgICAgICAgIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG1pbl9mZWF0dXJlICAgICAgICA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgc3RydWN0IFQxX1ByaXZhdGVfCisgIHsKKyAgICBUMV9JbnQgICAgICAgdW5pcXVlX2lkOworICAgIFQxX0ludCAgICAgICBsZW5JVjsKKworICAgIFQxX0J5dGUgICAgICBudW1fYmx1ZXM7CisgICAgVDFfQnl0ZSAgICAgIG51bV9vdGhlcl9ibHVlczsKKyAgICBUMV9CeXRlICAgICAgbnVtX2ZhbWlseV9ibHVlczsKKyAgICBUMV9CeXRlICAgICAgbnVtX2ZhbWlseV9vdGhlcl9ibHVlczsKKworICAgIFQxX1Nob3J0ICAgICBibHVlX3ZhbHVlc1sxNF07CisgICAgVDFfU2hvcnQgICAgIG90aGVyX2JsdWVzWzEwXTsKKworICAgIFQxX1Nob3J0ICAgICBmYW1pbHlfYmx1ZXMgICAgICBbMTRdOworICAgIFQxX1Nob3J0ICAgICBmYW1pbHlfb3RoZXJfYmx1ZXNbMTBdOworCisgICAgVDFfRml4ZWQgICAgIGJsdWVfc2NhbGU7CisgICAgVDFfSW50ICAgICAgIGJsdWVfc2hpZnQ7CisgICAgVDFfSW50ICAgICAgIGJsdWVfZnV6ejsKKworICAgIFQxX1VTaG9ydCAgICBzdGFuZGFyZF93aWR0aDsKKyAgICBUMV9VU2hvcnQgICAgc3RhbmRhcmRfaGVpZ2h0OworCisgICAgVDFfQnl0ZSAgICAgIG51bV9zbmFwX3dpZHRoczsKKyAgICBUMV9CeXRlICAgICAgbnVtX3NuYXBfaGVpZ2h0czsKKyAgICBUMV9Cb29sICAgICAgZm9yY2VfYm9sZDsKKyAgICBUMV9Cb29sICAgICAgcm91bmRfc3RlbV91cDsKKworICAgIFQxX1Nob3J0ICAgICBzdGVtX3NuYXBfd2lkdGhzIFsxM107ICAvKiByZXNlcnZlIG9uZSBwbGFjZSBmb3IgdGhlIHN0ZCAqLworICAgIFQxX1Nob3J0ICAgICBzdGVtX3NuYXBfaGVpZ2h0c1sxM107ICAvKiByZXNlcnZlIG9uZSBwbGFjZSBmb3IgdGhlIHN0ZCAqLworCisgICAgVDFfTG9uZyAgICAgIGxhbmd1YWdlX2dyb3VwOworICAgIFQxX0xvbmcgICAgICBwYXNzd29yZDsKKworICAgIFQxX1Nob3J0ICAgICBtaW5fZmVhdHVyZVsyXTsKKworICB9IFQxX1ByaXZhdGU7CisKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8U3RydWN0PiBUMV9Qcml2YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGUgUHJpdmF0ZSBkaWN0aW9uYXJ5IHN0cnVjdHVyZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBudW1fY2hhcnMgICA6OiBudW1iZXIgb2YgY2hhciBjb2RlcyBpbiBlbmNvZGluZy4gVXN1YWxseSAyNTYgICAgICovCisgIC8qICAgIGNvZGVfZmlyc3QgIDo6IGxvd2VyIGNoYXIgY29kZSBpbiBlbmNvZGluZyAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgY29kZV9sYXN0ICAgOjogaGlnaGVyIGNoYXIgY29kZSBpbiBlbmNvZGluZyAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGNoYXJfY29kZSAgIDo6IGFycmF5IG9mIGNoYXJhY3RlciBjb2RlcyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgY2hhcl9pbmRleCAgOjogYXJyYXkgb2YgY29ycmVwc29uZGluZyBnbHlwaCBpbmRpY2VzICAgICAgICAgICAgICAqLworICAvKiAgICBjaGFyX25hbWUgICA6OiBhcnJheSBvZiBjb3JyZXBzb25kaW5nIGdseXBoIG5hbWVzICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBzdHJ1Y3QgVDFfRW5jb2RpbmdfCisgIHsKKyAgICBUMV9JbnQgICAgICBudW1fY2hhcnM7CisgICAgVDFfSW50ICAgICAgY29kZV9maXJzdDsKKyAgICBUMV9JbnQgICAgICBjb2RlX2xhc3Q7CisKKyAgICBUMV9TaG9ydCogICBjaGFyX2luZGV4OworICAgIFQxX1N0cmluZyoqIGNoYXJfbmFtZTsKKworICB9IFQxX0VuY29kaW5nOworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiovCisvKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KKy8qKiogICAgICAgICAgICAgICAgICBPUklHSU5BTCBUVF9GQUNFIENMQVNTIERFRklOSVRJT04gICAgICAgICAgICAgICAgKioqLworLyoqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiovCisvKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqLworLyoqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiovCisvKioqICAgIFRoaXMgc3RydWN0dXJlL2NsYXNzIGlzIGRlZmluZWQgaGVyZSBiZWNhdXNlIGl0IGlzIGNvbW1vbiAgICAgICoqKi8KKy8qKiogICAgdG8gdGhlIGZvbGxvd2luZyBmb3JtYXRzIDogVFRGLCBPcGVuVHlwZS1UVCBhbmQgT3BlblR5cGUtQ0ZGICAgKioqLworLyoqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiovCisvKioqICAgIE5vdGUgaG93ZXZlciB0aGF0IHRoZSBjbGFzc2VzIFRUX1NpemUsIFRUX0dseXBoU2xvdCBhbmQgICAgICAgICoqKi8KKy8qKiogICAgVFRfQ2hhck1hcCBhcmUgbm90IHNoYXJlZCBiZXR3ZWVuIGZvbnQgZHJpdmVycywgYW5kIGFyZSAgICAgICAgKioqLworLyoqKiAgICB0aHVzIGRlZmluZWQgbm9ybWFsbHkgaW4gImRyaXZlcnMvdHJ1ZXR5cGUvdHRvYmpzLmgiICAgICAgICAgICAqKiovCisvKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KKy8qKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyAgdHlwZWRlZiBzdHJ1Y3QgVDFfRmFjZVJlY18qICAgVDFfRmFjZTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICBUMV9GYWNlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFR5cGUxIGZhY2UgcmVjb3JkLi4gICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgdHlwZWRlZiBzdHJ1Y3QgVDFfRmFjZVJlY18KKyAgeworICAgIEZUX0ZhY2VSZWMgICAgICByb290OworCisgICAgVDFfRm9udEluZm8gICAgIGZvbnRfaW5mbzsKKyAgICBGVF9TdHJpbmcqICAgICAgZm9udF9uYW1lOworCisgICAgVDFfRW5jb2RpbmcgICAgIGVuY29kaW5nOworCisgICAgVDFfQnl0ZSogICAgICAgIHN1YnJzX2Jsb2NrOworICAgIFQxX0J5dGUqICAgICAgICBjaGFyc3RyaW5nc19ibG9jazsKKworICAgIFQxX0ludCAgICAgICAgICBudW1fc3VicnM7CisgICAgVDFfQnl0ZSoqICAgICAgIHN1YnJzOworICAgIFQxX0ludCogICAgICAgICBzdWJyc19sZW47CisKKyAgICBUMV9JbnQgICAgICAgICAgbnVtX2dseXBoczsKKyAgICBUMV9TdHJpbmcqKiAgICAgZ2x5cGhfbmFtZXM7ICAgICAgIC8qIGFycmF5IG9mIGdseXBoIG5hbWVzICAgICAgICovCisgICAgVDFfQnl0ZSoqICAgICAgIGNoYXJzdHJpbmdzOyAgICAgICAvKiBhcnJheSBvZiBnbHlwaCBjaGFyc3RyaW5ncyAqLworICAgIFQxX0ludCogICAgICAgICBjaGFyc3RyaW5nc19sZW47CisKKyAgICBUMV9CeXRlICAgICAgICAgcGFpbnRfdHlwZTsKKyAgICBUMV9CeXRlICAgICAgICAgZm9udF90eXBlOworICAgIFQxX01hdHJpeCAgICAgICBmb250X21hdHJpeDsKKyAgICBUMV9CQm94ICAgICAgICAgZm9udF9iYm94OworICAgIFQxX0xvbmcgICAgICAgICB1bmlxdWVfaWQ7CisgICAgVDFfTG9uZyAgICAgICAgIGZvbnRfaWQ7CisKKyAgICBUMV9JbnQgICAgICAgICAgc3Ryb2tlX3dpZHRoOworICAgIFQxX1ByaXZhdGUgICAgICBwcml2YXRlX2RpY3Q7CisKKyAgfSBUMV9GYWNlUmVjOworCisKKyNlbmRpZiAvKiBUMVRZUEVTX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy90cnVldHlwZS9ydWxlcy5tayBiL3NyYy90cnVldHlwZS9ydWxlcy5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYmE3YWMxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RydWV0eXBlL3J1bGVzLm1rCkBAIC0wLDAgKzEsMjA1IEBACisjKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMqICBUcnVlVHlwZSBkcml2ZXIgTWFrZWZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisjKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIyogIENvcHlyaWdodCAxOTk2LTE5OTkgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMqICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICAqCisjKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCAgICAgICAgICoKKyMqICBtb2RpZmllZCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgICAqCisjKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAgKgorIyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgICoKKyMqICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisjKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCisjKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMqICBJTVBPUlRBTlQgTk9URTogVGhpcyBNYWtlZmlsZSBpcyBpbnRlbmRlZCBmb3IgR05VIE1ha2UhICAgICAgICAgICAgICAgICAqCisjKiAgICAgICAgICAgICAgICAgIElmIHlvdSBwcm92aWRlIE1ha2VmaWxlcyBmb3Igb3RoZXIgbWFrZSB1dGlsaXRpZXMsICAgICAgKgorIyogICAgICAgICAgICAgICAgICBwbGVhc2UgcGxhY2UgdGhlbSBpbiBgZnJlZXR5cGUvbGliL2FyY2gvPHN5c3RlbT4nLiAgICAgICoKKyMqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisjKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIyogIFRoaXMgZmlsZSBpcyB0byBiZSBpbmNsdWRlZCBieSB0aGUgRnJlZVR5cGUgTWFrZWZpbGUubGliLCBsb2NhdGVkIGluICAgICoKKyMqICB0aGUgYGZyZWV0eXBlL2xpYicgZGlyZWN0b3J5LiAgSGVyZSBpcyB0aGUgbGlzdCBvZiB0aGUgdmFyaWFibGVzIHRoYXQgICAqCisjKiAgbXVzdCBiZSBkZWZpbmVkIHRvIHVzZSBpdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisjKiAgICAgQkFTRV9ESVI6ICAgIFRoZSBsb2NhdGlvbiBvZiB0aGUgYmFzZSBsYXllcidzIGRpcmVjdG9yeS4gIFRoaXMgaXMgICAgKgorIyogICAgICAgICAgICAgICAgICB1c3VhbGx5IGBmcmVldHlwZS9saWIvYmFzZScuICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisjKiAgICAgQVJDSF9ESVI6ICAgIFRoZSBsb2NhdGlvbiBvZiB0aGUgYXJjaGl0ZWN0dXJlLWRlcGVuZGVudCBkaXJlY3RvcnkuICAgKgorIyogICAgICAgICAgICAgICAgICBUaGlzIGlzIHVzdWFsbHkgYGZyZWV0eXBlL2xpYi9hcmNoLzxzeXN0ZW0+Jy4gICAgICAgICAgICoKKyMqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisjKiAgICAgRFJJVkVSU19ESVI6IFRoZSBsb2NhdGlvbiBvZiB0aGUgZm9udCBkcml2ZXIgc3ViLWRpcnMsIHVzdWFsbHkgICAgICAgKgorIyogICAgICAgICAgICAgICAgICBgZnJlZXR5cGUvbGliL2RyaXZlcnMnLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisjKiAgICAgT0JKX0RJUjogICAgIFRoZSBsb2NhdGlvbiB3aGVyZSB0aGUgY29tcGlsZWQgb2JqZWN0KHMpIGZpbGUgd2lsbCBiZSAgKgorIyogICAgICAgICAgICAgICAgICBwbGFjZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisjKiAgICAgQkFTRV9IOiAgICAgIEEgbGlzdCBvZiBwYXRobmFtZXMgdG8gdGhlIGJhc2UgbGF5ZXIncyBoZWFkZXIgZmlsZXMgb24gKgorIyogICAgICAgICAgICAgICAgICB3aGljaCB0aGUgZHJpdmVyIGRlcGVuZHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisjKiAgICAgRlRfQ0ZMQUdTOiAgIEEgc2V0IG9mIGZsYWdzIHVzZWQgZm9yIGNvbXBpbGF0aW9uIG9mIG9iamVjdCBmaWxlcy4gICAgKgorIyogICAgICAgICAgICAgICAgICBUaGlzIGNvbnRhaW5zIGF0IGxlYXN0IHRoZSBpbmNsdWRlIHBhdGhzIG9mIHRoZSBhcmNoICAgICoKKyMqICAgICAgICAgICAgICAgICAgYW5kIGJhc2UgZGlyZWN0b3JpZXMgKyBvcHRpbWl6YXRpb24gKyB3YXJuaW5ncyArIEFOU0kgICAqCisjKiAgICAgICAgICAgICAgICAgIGNvbXBsaWFuY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMqICAgICBGVF9JRkxBRzogICAgVGhlIGZsYWcgdXNlZCB0byBzcGVjaWZ5IGFuIGluY2x1ZGUgcGF0aCBvbiB0aGUgICAgICAgICAqCisjKiAgICAgICAgICAgICAgICAgIGNvbXBpbGVyIGNvbW1hbmQgbGluZS4gIEZvciBleGFtcGxlLCB3aXRoIEdDQywgdGhpcyBpcyAgKgorIyogICAgICAgICAgICAgICAgICBgLUknLCB3aGlsZSBzb21lIG90aGVyIGNvbXBpbGVycyB1c2UgYC9pPScgb3IgYC1KJywgICAgICoKKyMqICAgICAgICAgICAgICAgICAgZXRjLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisjKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIyogICAgIEZUX09CSjogICAgICBUaGUgc3VmZml4IG9mIGFuIG9iamVjdCBmaWxlIGZvciB0aGUgcGxhdGZvcm07IGNhbiBiZSAgICoKKyMqICAgICAgICAgICAgICAgICAgYG8nLCBgb2JqJywgYGNvZmYnLCBgdGNvJywgZXRjLiBkZXBlbmRpbmcgb24gdGhlICAgICAgICAqCisjKiAgICAgICAgICAgICAgICAgIHBsYXRmb3JtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisjKiAgSXQgYWxzbyB1cGRhdGVzIHRoZSBmb2xsb3dpbmcgdmFyaWFibGVzIGRlZmluZWQgYW5kIHVzZWQgaW4gdGhlIG1haW4gICAgKgorIyogIE1ha2VmaWxlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisjKiAgICAgRFJWX09CSl9TOiAgICAgICAgICAgIFRoZSBsaXN0IG9mIGRyaXZlciBvYmplY3QgZmlsZXMgaW4gICAgICAgICAgICAgKgorIyogICAgICAgICAgICAgICAgICAgICAgICAgICBzaW5nbGUtb2JqZWN0IG1vZGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisjKiAgICAgRFJWX09CSl9NOiAgICAgICAgICAgIFRoZSBsaXN0IG9mIGRyaXZlciBvYmplY3QgZmlsZXMgaW4gICAgICAgICAgICAgKgorIyogICAgICAgICAgICAgICAgICAgICAgICAgICBtdWx0aXBsZS1vYmplY3RzIG1vZGUuICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisjKiAgICAgRlRJTklUX0RSSVZFUl9QQVRIUzogIFRoZSBsaXN0IG9mIGluY2x1ZGUgcGF0aHMgdXNlZCB0byBjb21waWxlIHRoZSAgKgorIyogICAgICAgICAgICAgICAgICAgICAgICAgICBgZnRpbml0JyBjb21wb25lbnQgd2hpY2ggcmVnaXN0ZXJzIGFsbCBmb250ICAgICoKKyMqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyaXZlcnMgaW4gdGhlIEZUX0luaXRfRnJlZVR5cGUoKSBmdW5jdGlvbi4gICAqCisjKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIyogICAgIEZUSU5JVF9EUklWRVJfSDogICAgICBUaGUgbGlzdCBvZiBoZWFkZXIgZGVwZW5kZW5jaWVzIHVzZWQgdG8gICAgICAgICoKKyMqICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGlsZSB0aGUgYGZ0aW5pdCcgY29tcG9uZW50LiAgICAgICAgICAgICAgICAqCisjKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIyogICAgIEZUSU5JVF9EUklWRVJfTUFDUk9TOiBUaGUgbGlzdCBvZiBtYWNyb3MgdG8gYmUgZGVmaW5lZCB3aGVuICAgICAgICAgICoKKyMqICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGlsaW5nIHRoZSBgZnRpbml0JyBjb21wb25lbnQuICAgICAgICAgICAgICAqCisjKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIyogIGBTaW5nbGUtb2JqZWN0IGNvbXBpbGF0aW9uJyBtZWFucyB0aGF0IGVhY2ggZm9udCBkcml2ZXIgaXMgY29tcGlsZWQgICAgICoKKyMqICBpbnRvIGEgc2luZ2xlIG9iamVjdCBmaWxlLiAgVGhpcyBpcyB1c2VmdWwgdG8gZ2V0IHJpZCBvZiBhbGwgICAgICAgICAgICAqCisjKiAgZHJpdmVyLXNwZWNpZmljIGVudHJpZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyMgaW5jbHVkZSB0aGUgcnVsZXMgZGVmaW5lZCBmb3IgdGhlIFNGTlQgZHJpdmVyLCB3aGljaCBpcyBoZWF2aWx5IHVzZWQKKyMgYnkgdGhlIFRydWVUeXBlIG9uZS4uCisjCitpbmNsdWRlICQoU1JDXylzZm50L3J1bGVzLm1rCisKKworIyBUcnVlVHlwZSBkcml2ZXIgZGlyZWN0b3J5CisjCitUVF9ESVIgIDo9ICQoU1JDXyl0cnVldHlwZQorVFRfRElSXyA6PSAkKFRUX0RJUikkKFNFUCkKKworCisjIGxvY2F0aW9uIG9mIGFsbCBleHRlbnNpb25zIHRvIHRoZSBkcml2ZXIsIGlmIGFueQorIworVFRfRVhUX0RJUiAgOj0gJChUVF9ESVJfKWV4dGVuZAorVFRfRVhUX0RJUl8gOj0gJChUVF9FWFRfRElSKSQoU0VQKQorCisjIGFkZGl0aW9uYWwgaW5jbHVkZSBmbGFncyB1c2VkIHdoZW4gY29tcGlsaW5nIHRoZSBkcml2ZXIKKyMKK1RUX0lOQ0xVREUgOj0gJChTRk5UX0lOQ0xVREUpICQoVFRfRElSKSAkKFRUX0VYVF9ESVIpCisKKworIyBjb21waWxhdGlvbiBmbGFncyBmb3IgdGhlIGRyaXZlcgorIworVFRfQ0ZMQUdTICA6PSAkKFRUX0lOQ0xVREU6JT0kSSUpCitUVF9DT01QSUxFIDo9ICQoRlRfQ0MpICQoVFRfQ0ZMQUdTKSAKKworCisjIFRydWVUeXBlIGRyaXZlciBzb3VyY2VzIChpLmUuLCBDIGZpbGVzKQorIworVFRfRFJWX1NSQyA6PSAkKFRUX0RJUl8pdHRvYmpzLmMgICAgXAorICAgICAgICAgICAgICAkKFRUX0RJUl8pdHRwbG9hZC5jICAgXAorICAgICAgICAgICAgICAkKFRUX0RJUl8pdHRnbG9hZC5jICAgXAorICAgICAgICAgICAgICAkKFRUX0RJUl8pdHRpbnRlcnAuYyAgXAorICAgICAgICAgICAgICAkKFRUX0RJUl8pdHRkcml2ZXIuYworCisKKyMgVHJ1ZVR5cGUgZHJpdmVyIGhlYWRlcnMKKyMKK1RUX0RSVl9IIDo9ICQoU0ZOVF9IKSAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICQoVFRfRElSXyl0dGNvbmZpZy5oICAgIFwKKyAgICAgICAgICAgICQoVFRfRFJWX1NSQzolLmM9JS5oKQorCisKKyMgZGVmYXVsdCBUcnVlVHlwZSBleHRlbnNpb25zIHNvdXJjZXMKKyMKK1RUX0VYVF9TUkMgOj0gJChUVF9FWFRfRElSXyl0dHhrZXJuLmMgIFwKKyAgICAgICAgICAgICAgJChUVF9FWFRfRElSXyl0dHhnYXNwLmMgIFwKKyAgICAgICAgICAgICAgJChUVF9FWFRfRElSXyl0dHhwb3N0LmMgIFwKKyAgICAgICAgICAgICAgJChUVF9FWFRfRElSXyl0dHhjbWFwLmMgIFwKKyAgICAgICAgICAgICAgJChUVF9FWFRfRElSXyl0dHh3aWR0aC5jCisKKworIyBkZWZhdWx0IFRydWVUeXBlIGV4dGVuc2lvbnMgaGVhZGVycworIworVFRfRVhUX0ggOj0gJChUVF9FWFRfU1JDOi5jPS5oKQorCisKKyMgZHJpdmVyIG9iamVjdChzKQorIworIyAgIFRUX0RSVl9PQkpfTSBpcyB1c2VkIGR1cmluZyBgZGVidWcnIGJ1aWxkcworIyAgIFRUX0RSVl9PQkpfUyBpcyB1c2VkIGR1cmluZyBgcmVsZWFzZScgYnVpbGRzCisjCitUVF9EUlZfT0JKX00gOj0gJChUVF9EUlZfU1JDOiQoVFRfRElSXyklLmM9JChPQkpfKSUuJE8pCitUVF9EUlZfT0JKX1MgOj0gJChPQkpfKXRydWV0eXBlLiRPCisKKworIyBkZWZhdWx0IGV4dGVuc2lvbnMgb2JqZWN0cworIworVFRfRVhUX09CSiA6PSAkKFRUX0VYVF9TUkM6JChUVF9FWFRfRElSXyklLmM9JChPQkpfKSUuJE8pCisKKworCisjIGRyaXZlciByb290IHNvdXJjZSBmaWxlKHMpCisjCitUVF9EUlZfU1JDX00gOj0gJChUVF9EUlZfU1JDKSAkKFNGTlRfU1JDKQorVFRfRFJWX1NSQ19TIDo9ICQoVFRfRElSXyl0cnVldHlwZS5jCisKKworIyBkcml2ZXIgLSBzaW5nbGUgb2JqZWN0CisjCisjICB0aGUgZHJpdmVyIGlzIHJlY29tcGlsZWQgaWYgYW55IG9mIHRoZSBoZWFkZXIgb3Igc291cmNlIGZpbGVzIGlzIGNoYW5nZWQKKyMgIGFzIHdlbGwgYXMgYW55IG9mIHRoZSBzaGFyZWQgc291cmNlIGZpbGVzIGZvdW5kIGluIGBzaGFyZWQvc2ZudCcKKyMKKyQoVFRfRFJWX09CSl9TKTogJChCQVNFX0gpICQoVFRfRFJWX0gpICQoVFRfRFJWX1NSQykgJChUVF9EUlZfU1JDX1MpCisJJChUVF9DT01QSUxFKSAkVCRAICQoVFRfRFJWX1NSQ19TKQorCisKKworIyBkcml2ZXIgLSBtdWx0aXBsZSBvYmplY3RzCisjCisjICAgQWxsIG9iamVjdHMgYXJlIHJlY29tcGlsZWQgaWYgYW55IG9mIHRoZSBoZWFkZXIgZmlsZXMgaXMgY2hhbmdlZAorIworJChPQkpfKXR0JS4kTzogJChUVF9ESVJfKXR0JS5jICQoQkFTRV9IKSAkKFRUX0RSVl9IKQorCSQoVFRfQ09NUElMRSkgJFQkQCAkPAorCiskKE9CSl8pdHR4JS4kTzogJChUVF9FWFRfRElSXyl0dHglLmMgJChCQVNFX0gpICQoU0ZOVF9IKSAkKFRUX0VYVF9IKQorCSQoVFRfQ09NUElMRSkgJFQkQCAkPAorCiskKE9CSl8pdHQlLiRPOiAkKFNGTlRfRElSXyl0dCUuYyAkKEJBU0VfSCkgJChTRk5UX0gpCisJJChUVF9DT01QSUxFKSAkVCRAICQ8CisKKworIyB0cmVhdCBgdHRwbG9hZCcgYXMgYSBzcGVjaWFsIGNhc2UsIGFzIGl0IGluY2x1ZGVzIEMgZmlsZXMKKyMKKyQoT0JKXyl0dHBsb2FkLiRPOiAkKFRUX0RJUl8pdHRwbG9hZC5jICQoQkFTRV9IKSAkKFNGTlRfU1JDKSAkKFRUX0RSVl9IKQorCSQoVFRfQ09NUElMRSkgJFQkQCAkPAorCisKKyMgdXBkYXRlIG1haW4gZHJpdmVyIG9iamVjdCBsaXN0cworIworRFJWX09CSlNfUyArPSAkKFRUX0RSVl9PQkpfUykKK0RSVl9PQkpTX00gKz0gJChUVF9EUlZfT0JKX00pCisKKworIyB1cGRhdGUgYGZ0aW5pdCcgdmFyaWFibGVzCisjCitGVElOSVRfRFJJVkVSX1BBVEhTICArPSAkKFNGTlRfRElSKSAkKFRUX0RJUikgJChUVF9FWFRfRElSKQorRlRJTklUX0RSSVZFUl9IICAgICAgKz0gJChTRk5UX0gpICQoVFRfRFJWX0gpCitGVElOSVRfRFJJVkVSX01BQ1JPUyArPSBGVF9TVVBQT1JUX1RSVUVUWVBFCisKKyMgRU5ECmRpZmYgLS1naXQgYS9zcmMvdHJ1ZXR5cGUvdHJ1ZXR5cGUuYyBiL3NyYy90cnVldHlwZS90cnVldHlwZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1ZmU4ODQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdHJ1ZXR5cGUvdHJ1ZXR5cGUuYwpAQCAtMCwwICsxLDUwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICB0cnVldHlwZS5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRnJlZVR5cGUgVHJ1ZVR5cGUgZHJpdmVyIGNvbXBvbmVudCAoYm9keSBvbmx5KS4gICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDE5OTYtMTk5OSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkICAgICAgICAqLworLyogIG1vZGlmaWVkIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAgKi8KKy8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCisvKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLworLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgVGhpcyBmaWxlIGlzIHVzZWQgdG8gY29tcGlsZSB0aGUgRnJlZVR5cGUgVHJ1ZVR5cGUgZm9udCBkcml2ZXIuICBJdCAgKi8KKyAgLyogIHJlbGllcyBvbiBhbGwgY29tcG9uZW50cyBpbmNsdWRlZCBpbiB0aGUgYGJhc2UnIGxheWVyIChzZWUgdGhlIGZpbGUgICovCisgIC8qICBgZnRiYXNlLmMnKS4gIFRoZSBzb3VyY2UgY29kZSBpcyBsb2NhdGVkIGluIGBmcmVldHlwZS90dGxpYicgYW5kICAgICAqLworICAvKiAgY29udGFpbnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAtIGEgZHJpdmVyIGludGVyZmFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgLSBhbiBvYmplY3QgbWFuYWdlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogIC0gYSB0YWJsZSBsb2FkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAtIGEgZ2x5cGggbG9hZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgLSBhIGdseXBoIGhpbnRlci9ieXRlY29kZSBpbnRlcnByZXRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogIC0gYSBjaGFybWFwIHByb2Nlc3NvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAtIGFuIGV4dGVuc2lvbiBtYW5hZ2VyIChvbmx5IHVzZWQgZm9yIHNvbWUgdG9vbHMpICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogIE5vdGUgdGhhdCB0aGUgZW5naW5lIGV4dGVuc2lvbnMgZm91bmQgaW4gYGZyZWV0eXBlL3R0bGliL2V4dGVuZCcgYXJlICovCisgIC8qICByZXNlcnZlZCB0byBzcGVjaWZpYyB0b29scyBhbmQvb3IgZm9udCBzZXJ2ZXJzOyB0aGV5J3JlIG5vdCBwYXJ0IG9mICAqLworICAvKiAgdGhlIGBjb3JlJyBUcnVlVHlwZSBkcml2ZXIsIGV2ZW4gdGhvdWdoIHRoZXkgYXJlIHNlcGFyYXRlbHkgbGlua2FibGUgKi8KKyAgLyogIHRvIGl0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjZGVmaW5lIEZUX01BS0VfT1BUSU9OX1NJTkdMRV9PQkpFQ1QKKworI2luY2x1ZGUgPHR0ZHJpdmVyLmM+ICAgIC8qIGRyaXZlciBpbnRlcmZhY2UgICAgICovCisjaW5jbHVkZSA8dHRwbG9hZC5jPiAgICAgLyogdGFibGVzIGxvYWRlciAgICAgICAgKi8KKyNpbmNsdWRlIDx0dGdsb2FkLmM+ICAgICAvKiBnbHlwaCBsb2FkZXIgICAgICAgICAqLworI2luY2x1ZGUgPHR0aW50ZXJwLmM+ICAgIC8qIGJ5dGVjb2RlIGludGVycHJldGVyICovCisjaW5jbHVkZSA8dHRvYmpzLmM+ICAgICAgLyogb2JqZWN0IG1hbmFnZXIgICAgICAgKi8KKworLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvdHJ1ZXR5cGUvdHRjb25maWcuaCBiL3NyYy90cnVldHlwZS90dGNvbmZpZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkYjRmNmUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdHJ1ZXR5cGUvdHRjb25maWcuaApAQCAtMCwwICsxLDY2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICB0dGNvbmZpZy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgVHJ1ZVR5cGUgY29uZmlndXJhdGlvbiBmaWxlIChzcGVjaWZpY2F0aW9uIG9ubHkpLiAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDE5OTYtMTk5OSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkICAgICAgICAqLworLyogIG1vZGlmaWVkIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAgKi8KKy8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCisvKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLworLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBUaGlzIGZpbGUgaXMgdXNlZCB0byBjb25maWd1cmUgdmFyaW91cyBhc3BlY3RzIG9mIHRoZSBUcnVlVHlwZSAgICAgICAgKi8KKyAgLyogZHJpdmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjaWZuZGVmIFRUQ09ORklHX0gKKyNkZWZpbmUgVFRDT05GSUdfSAorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBEZWZpbmUgVFRfQ09ORklHX09QVElPTl9JTlRFUlBSRVRFUl9TV0lUQ0ggdG8gY29tcGlsZSB0aGUgVHJ1ZVR5cGUgICAgKi8KKyAgLyogYnl0ZWNvZGUgaW50ZXJwcmV0ZXIgd2l0aCBhIGh1Z2Ugc3dpdGNoIHN0YXRlbWVudCwgcmF0aGVyIHRoYW4gYSAgICAgICovCisgIC8qIGNhbGwgdGFibGUuICBUaGlzIHJlc3VsdHMgaW4gc21hbGxlciBhbmQgZmFzdGVyIGNvZGUgZm9yIGEgbnVtYmVyIG9mICAqLworICAvKiBhcmNoaXRlY3R1cmVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIE5vdGUgaG93ZXZlciB0aGF0IG9uIHNvbWUgY29tcGlsZXIvcHJvY2Vzc29yIGNvbWJpbmF0aW9ucywgdW5kZWZpbmluZyAqLworICAvKiB0aGlzIG1hY3JvIHdpbGwgZ2VuZXJhdGUgYSBmYXN0ZXIsIHRob3VnaCBsYXJnZXIsIGNvZGUuICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRUX0NPTkZJR19PUFRJT05fSU5URVJQUkVURVJfU1dJVENICisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIERlZmluZSBUVF9DT05GSUdfT1BUSU9OX0VNQkVEREVEX0JJVE1BUFMgaWYgeW91IHdhbnQgdG8gc3VwcG9ydCAgICAgICAqLworICAvKiBlbWJlZGRlZCBiaXRtYXBzIGluIHRoZSBUcnVlVHlwZS9PcGVuVHlwZSBkcml2ZXIuICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRUX0NPTkZJR19PUFRJT05fRU1CRURERURfQklUTUFQUworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBEZWZpbmUgVFRfQ09ORklHX09QVElPTl9QT1NUU0NSSVBUX05BTUVTIGlmIHlvdSB3YW50IHRvIGJlIGFibGUgdG8gICAgKi8KKyAgLyogbG9hZCBhbmQgZW51bWVyYXRlIHRoZSBnbHlwaCBQb3N0c2NyaXB0IG5hbWVzIGluIGEgVHJ1ZVR5cGUgb3IgICAgICAgICovCisgIC8qIE9wZW5UeXBlIGZpbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVFRfQ09ORklHX09QVElPTl9QT1NUU0NSSVBUX05BTUVTCisKKworI2RlZmluZSAgVFRfVVNFX0ZJWEVECisKKyNlbmRpZiAvKiBUVENPTkZJR19IICovCisKKworLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvdHJ1ZXR5cGUvdHRkcml2ZXIuYyBiL3NyYy90cnVldHlwZS90dGRyaXZlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkYWZiODgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdHJ1ZXR5cGUvdHRkcml2ZXIuYwpAQCAtMCwwICsxLDc4MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgdHRkcml2ZXIuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIFRydWVUeXBlIGZvbnQgZHJpdmVyIGltcGxlbWVudGF0aW9uIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAxOTk2LTE5OTkgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KKy8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCisvKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLworLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KKy8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjaW5jbHVkZSA8ZnRkZWJ1Zy5oPgorI2luY2x1ZGUgPGZ0c3RyZWFtLmg+CisjaW5jbHVkZSA8dHRuYW1laWQuaD4KKyNpbmNsdWRlIDxzZm50Lmg+CisKKyNpbmNsdWRlIDx0dGRyaXZlci5oPgorI2luY2x1ZGUgPHR0Z2xvYWQuaD4KKworCisjdW5kZWYgIEZUX0NPTVBPTkVOVAorI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX3R0ZHJpdmVyCisKKworICBzdGF0aWMKKyAgVFRfQm9vbCAgc3RyaW5nX2NvbXBhcmUoIGNvbnN0IFRUX1N0cmluZyogIHMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFRfU3RyaW5nKiAgczIgKQorICB7CisgICAgaW50ICB0cmllczsKKworCisgICAgZm9yICggdHJpZXMgPSAxMjg7IHRyaWVzID4gMDsgdHJpZXMtLSApCisgICAgeworICAgICAgaWYgKCAhKnMxICkKKyAgICAgICAgcmV0dXJuICEqczI7CisKKyAgICAgIGlmICggKnMxICE9ICpzMiApCisgICAgICAgIHJldHVybiAwOworCisgICAgICBzMSsrOworICAgICAgczIrKzsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgR2V0X0ludGVyZmFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgU29tZSBkcml2ZXJzIGNhbiBiZSBjb21waWxlZCB3aXRoIGV4dGVuc2lvbnMsIHNwZWNpYWwgY29kZSB1c2VkICAgICovCisgIC8qICAgIG9ubHkgZm9yIHNwZWNpZmljIHB1cnBvc2VzICh1c3VhbGx5IGZvciBzeXN0ZW0tc3BlY2lmaWMgdXNlcykuICAgICAqLworICAvKiAgICBFYWNoIGV4dGVuc2lvbiBpcyByZWdpc3RlcmVkIHRocm91Z2ggYSBzaW1wbGUgbmFtZSAoZS5nLiBgc2ZudCcsICAgKi8KKyAgLyogICAgYHBvc3RfbmFtZXMnLCBldGMpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcmV0dXJuIGFuIGV4dGVuc2lvbidzIGludGVyZmFjZSAoaS5lLiwgICAgKi8KKyAgLyogICAgYSB0YWJsZSBvZiBwb2ludGVycykgd2hlbiBpdCBpcyBwcmVzZW50IGluIHRoZSBkcml2ZXIuICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBJZiB0aGUgZHJpdmVyIHdhc24ndCBjb21waWxlZCB3aXRoIHRoZSByZXF1ZXN0ZWQgZXh0ZW5zaW9uLCBpdCAgICAgKi8KKyAgLyogICAgc2hvdWxkIHJldHVybiBOVUxMLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZHJpdmVyICAgIDo6IEEgaGFuZGxlIHRvIHRoZSBkcml2ZXIgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBpbnRlcmZhY2UgOjogVGhlIGludGVyZmFjZSdzIG5hbWUgc3RyaW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBIHR5cGVsZXNzIHBvaW50ZXIgdG8gdGhlIGV4dGVuc2lvbidzIGludGVyZmFjZSAobm9ybWFsbHkgYSB0YWJsZSAgKi8KKyAgLyogICAgb2YgZnVuY3Rpb24gcG9pbnRlcnMpLiAgUmV0dXJucyBOVUxMIHdoZW4gdGhlIHJlcXVlc3RlZCBleHRlbnNpb24gICovCisgIC8qICAgIGlzbid0IGF2YWlsYWJsZSAoaS5lLiwgd2Fzbid0IGNvbXBpbGVkIGluIHRoZSBkcml2ZXIgYXQgYnVpbGQgICAgICAqLworICAvKiAgICB0aW1lKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBOb3RlIHRoYXQgdW5saWtlIGZvcm1hdC1zcGVjaWZpYyBtZXRob2RzIHJldHVybmVkIGJ5ICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZ2V0Rm9ybWF0SW50ZXJmYWNlKCksIGV4dGVuc2lvbnMgY2FuIGJlIGZvcm1hdC1pbmRlcGVuZGVudC4gICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBzdGF0aWMKKyAgdm9pZCogIEdldF9JbnRlcmZhY2UoIFRUX0RyaXZlciAgICAgICAgIGRyaXZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUX1N0cmluZyogIGludGVyZmFjZSApCisgIHsKKyAgICAvKiBgc2ZudCcgcmV0dXJucyBhIHZ0YWJsZSBvZiBmdW5jdGlvbnMgdXNlZCB0byBhY2Nlc3MgdGhlIHRhYmxlcyAqLworICAgIC8qIG9mIGEgVHJ1ZVR5cGUgb3IgT3BlblR5cGUgZm9udCByZXNvdXJjZS4gICAgICAgICAgICAgICAgICAgICAgICovCisgICAgaWYgKCBzdHJpbmdfY29tcGFyZSggaW50ZXJmYWNlLCAic2ZudCIgKSApCisgICAgICByZXR1cm4gKHZvaWQqKU5VTEw7CisKKyAgICAvKiBYWFhYIDogRm9yIG5vdywgdGhlcmUgaXMgbm8gZXh0ZW5zaW9uIHN1cHBvcnQgdGhlcmUgKi8KKyAgICBVTlVTRUQoIGRyaXZlciApOworICAgIFVOVVNFRCggaW50ZXJmYWNlICk7CisKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCisgIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLworICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgRiBBIEMgRSBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KKyAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCisgIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICoKKyAgKiA8RnVuY3Rpb24+CisgICogICAgZmluZF9lbmNvZGluZworICAqCisgICogPERlc2NyaXB0aW9uPgorICAqICAgIHJldHVybiB0aGUgRlRfRW5jb2RpbmcgY29ycmVzcG9uZGluZyB0byBhIGdpdmVuIAorICAqICAgIChwbGF0Zm9ybV9pZCxlbmNvZGluZ19pZCkgcGFpciwgYXMgZm91bmQgaW4gVHJ1ZVR5cGUgY2hhcm1hcHMKKyAgKgorICAqIDxJbnB1dD4KKyAgKiAgIHBsYXRmb3JtX2lkIDo6CisgICogICBlbmNvZGluZ19pZCA6OgorICAqCisgICogPFJldHVybj4KKyAgKiAgIHRoZSBjb3JyZXNwb25kaW5nIEZUX0VuY29kaW5nIHRhZy4gZnRfZW5jb2Rpbmdfbm9uZSBieSBkZWZhdWx0CisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIAorICBzdGF0aWMKKyAgRlRfRW5jb2RpbmcgICBmaW5kX2VuY29kaW5nKCBpbnQgIHBsYXRmb3JtX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgZW5jb2RpbmdfaWQgKQorICB7CisgICAgdHlwZWRlZiBzdHJ1Y3QgIFRFbmNvZGluZworICAgIHsKKyAgICAgIGludCAgICAgICAgICBwbGF0Zm9ybV9pZDsKKyAgICAgIGludCAgICAgICAgICBlbmNvZGluZ19pZDsKKyAgICAgIEZUX0VuY29kaW5nICBlbmNvZGluZzsKKyAgCisgICAgfSBURW5jb2Rpbmc7CisKKyAgICBzdGF0aWMKKyAgICBjb25zdCBURW5jb2RpbmcgICB0dF9lbmNvZGluZ3NbXSA9CisgICAgeworICAgICAgeyBUVF9QTEFURk9STV9JU08sICAgICAgICAgICAgICAgICAgICAgICAgIC0xLCBmdF9lbmNvZGluZ191bmljb2RlIH0sCisgICAgICAgIAorICAgICAgeyBUVF9QTEFURk9STV9BUFBMRV9VTklDT0RFLCAgICAgICAgICAgICAgIC0xLCBmdF9lbmNvZGluZ191bmljb2RlIH0sCisgICAgICAKKyAgICAgIHsgVFRfUExBVEZPUk1fTUFDSU5UT1NILCAgICAgIFRUX01BQ19JRF9ST01BTiwgZnRfZW5jb2RpbmdfYXBwbGVfcm9tYW4gfSwKKyAgICAgIAorICAgICAgeyBUVF9QTEFURk9STV9NSUNST1NPRlQsICBUVF9NU19JRF9VTklDT0RFX0NTLCBmdF9lbmNvZGluZ191bmljb2RlIH0sCisgICAgICB7IFRUX1BMQVRGT1JNX01JQ1JPU09GVCwgIFRUX01TX0lEX1NKSVMsICAgICAgIGZ0X2VuY29kaW5nX3NqaXMgfSwKKyAgICAgIHsgVFRfUExBVEZPUk1fTUlDUk9TT0ZULCAgVFRfTVNfSURfQklHXzUsICAgICAgZnRfZW5jb2RpbmdfYmlnNSB9CisgICAgfTsKKyAgICAKKyAgICBjb25zdCBURW5jb2RpbmcgICpjdXIsICpsaW1pdDsKKyAgIAorICAgIGN1ciAgID0gdHRfZW5jb2RpbmdzOworICAgIGxpbWl0ID0gY3VyICsgc2l6ZW9mKHR0X2VuY29kaW5ncykvc2l6ZW9mKHR0X2VuY29kaW5nc1swXSk7CisgICAgCisgICAgZm9yICggOyBjdXIgPCBsaW1pdDsgY3VyKysgKQorICAgIHsKKyAgICAgIGlmIChjdXItPnBsYXRmb3JtX2lkID09IHBsYXRmb3JtX2lkKQorICAgICAgeworICAgICAgICBpZiAoY3VyLT5lbmNvZGluZ19pZCA9PSBlbmNvZGluZ19pZCB8fAorICAgICAgICAgICAgY3VyLT5lbmNvZGluZ19pZCA9PSAtMSAgICAgICAgICApCisgICAgICAgICAgcmV0dXJuIGN1ci0+ZW5jb2Rpbmc7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBmdF9lbmNvZGluZ19ub25lOworICB9CisKKworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgSW5pdF9GYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSBkcml2ZXIgbWV0aG9kIHVzZWQgdG8gaW5pdGlhbGl6ZSBhIG5ldyBUcnVlVHlwZSBmYWNlIG9iamVjdC4gICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgcmVzb3VyY2UgICAgICAgOjogQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSByZXNvdXJjZS4gICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB0eXBlZmFjZV9pbmRleCA6OiBBbiBpbmRleCBvZiB0aGUgZmFjZSBpbiB0aGUgZm9udCByZXNvdXJjZS4gIFVzZWQgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgdG8gYWNjZXNzIGluZGl2aWR1YWwgZmFjZXMgaW4gZm9udCBjb2xsZWN0aW9ucy4gICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZmFjZSAgICAgICAgICAgOjogQSBoYW5kbGUgdG8gdGhlIGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhlIGB0eXBlZmFjZV9pbmRleCcgcGFyYW1ldGVyIGZpZWxkIHdpbGwgYmUgc2V0IHRvIC0xIGlmIHRoZSAgICAgICovCisgIC8qICAgIGVuZ2luZSBvbmx5IHdhbnRzIHRvIHRlc3QgdGhlIGZvcm1hdCBvZiB0aGUgcmVzb3VyY2UuICBUaGlzIG1lYW5zICAqLworICAvKiAgICB0aGF0IGZvbnQgZHJpdmVycyBzaG91bGQgc2ltcGx5IGNoZWNrIHRoZSBmb250IGZvcm1hdCwgdGhlbiByZXR1cm4gKi8KKyAgLyogICAgaW1tZWRpYXRlbHkgd2l0aCBhbiBlcnJvciBjb2RlIG9mIDAgKG1lYW5pbmcgc3VjY2VzcykuICBUaGUgZmllbGQgICovCisgIC8qICAgIGBudW1fZmFjZXMnIHNob3VsZCBiZSBzZXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRG9uZV9GYWNlKCkgd2lsbCBiZSBjYWxsZWQgc3Vic2VxdWVudGx5LCB3aGF0ZXZlciB0aGUgcmVzdWx0IHdhcy4gICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBzdGF0aWMKKyAgVFRfRXJyb3IgIEluaXRfRmFjZSggRlRfU3RyZWFtICBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgIFRUX0xvbmcgICAgdHlwZWZhY2VfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgIFRUX0ZhY2UgICAgZmFjZSApCisgIHsKKyAgICBUVF9FcnJvciAgICAgZXJyb3I7CisKKyAgICAvKiBpbml0aWFsaXplIHRoZSBUcnVlVHlwZSBmYWNlIG9iamVjdCAqLworICAgIGVycm9yID0gVFRfSW5pdF9GYWNlKCBzdHJlYW0sIHR5cGVmYWNlX2luZGV4LCBmYWNlICk7CisKKyAgICAvKiBub3cgc2V0IHVwIHJvb3QgZmllbGRzICovCisgICAgaWYgKCAhZXJyb3IgJiYgdHlwZWZhY2VfaW5kZXggPj0gMCApCisgICAgeworICAgICAgRlRfRmFjZSAgICAgcm9vdCA9ICZmYWNlLT5yb290OworICAgICAgRlRfSW50ICAgICAgZmxhZ3M7CisgICAgICBUVF9DaGFyTWFwICBjaGFybWFwOworICAgICAgVFRfSW50ICAgICAgbjsKKyAgICAgIEZUX01lbW9yeSAgIG1lbW9yeTsKKworICAgICAgbWVtb3J5ID0gcm9vdC0+bWVtb3J5OworCisgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAvKiBDb21wdXRlIGZhY2UgZmxhZ3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICBmbGFncyA9IEZUX0ZBQ0VfRkxBR19TQ0FMQUJMRSAgfCAgICAvKiBzY2FsYWJsZSBvdXRsaW5lcyAqLworICAgICAgICAgICAgICBGVF9GQUNFX0ZMQUdfU0ZOVCAgICAgIHwgICAgLyogU0ZOVCBmaWxlIGZvcm1hdCAgKi8KKyAgICAgICAgICAgICAgRlRfRkFDRV9GTEFHX0hPUklaT05UQUw7ICAgIC8qIGhvcml6b250YWwgZGF0YSAgICovCisKKyAgICAgIC8qIGZpeGVkIHdpZHRoIGZvbnQgPyAqLworICAgICAgaWYgKCBmYWNlLT5wb3N0c2NyaXB0LmlzRml4ZWRQaXRjaCApCisgICAgICAgIGZsYWdzIHw9IEZUX0ZBQ0VfRkxBR19GSVhFRF9XSURUSDsKKworICAgICAgLyogdmVydGljYWwgaW5mb3JtYXRpb24gPyAqLworICAgICAgaWYgKCBmYWNlLT52ZXJ0aWNhbF9pbmZvICkKKyAgICAgICAgZmxhZ3MgfD0gRlRfRkFDRV9GTEFHX1ZFUlRJQ0FMOworCisgICAgICAvKiBrZXJuaW5nIGF2YWlsYWJsZSA/ICovCisgICAgICBpZiAoIGZhY2UtPmtlcm5fcGFpcnMgKQorICAgICAgICBmbGFncyB8PSBGVF9GQUNFX0ZMQUdfS0VSTklORzsKKworICAgICAgcm9vdC0+ZmFjZV9mbGFncyA9IGZsYWdzOworCisgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAvKiBDb21wdXRlIHN0eWxlIGZsYWdzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICBmbGFncyA9IDA7CisKKyAgICAgIGlmICggZmFjZS0+b3MyLnZlcnNpb24gIT0gMHhGRkZGICkKKyAgICAgIHsKKyAgICAgICAgLyogV2UgaGF2ZSBhbiBPUy8yIHRhYmxlLCB1c2UgdGhlIGBmc1NlbGVjdGlvbicgZmllbGQgKi8KKyAgICAgICAgaWYgKCBmYWNlLT5vczIuZnNTZWxlY3Rpb24gJiAxICkKKyAgICAgICAgICBmbGFncyB8PSBGVF9TVFlMRV9GTEFHX0lUQUxJQzsKKworICAgICAgICBpZiAoIGZhY2UtPm9zMi5mc1NlbGVjdGlvbiAmIDMyICkKKyAgICAgICAgICBmbGFncyB8PSBGVF9TVFlMRV9GTEFHX0JPTEQ7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIFRoaXMgaXMgYW4gb2xkIE1hYyBmb250LCB1c2UgdGhlIGhlYWRlciBmaWVsZCAqLworICAgICAgICBpZiAoIGZhY2UtPmhlYWRlci5NYWNfU3R5bGUgJiAxICkKKyAgICAgICAgICBmbGFncyB8PSBGVF9TVFlMRV9GTEFHX0JPTEQ7CisKKyAgICAgICAgaWYgKCBmYWNlLT5oZWFkZXIuTWFjX1N0eWxlICYgMiApCisgICAgICAgICAgZmxhZ3MgfD0gRlRfU1RZTEVfRkxBR19JVEFMSUM7CisgICAgICB9CisKKyAgICAgIGZhY2UtPnJvb3Quc3R5bGVfZmxhZ3MgPSBmbGFnczsKKworICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgLyogUG9saXNoIHRoZSBjaGFybWFwcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgLyogICBUcnkgdG8gc2V0IHRoZSBjaGFybWFwIGVuY29kaW5nIGFjY29yZGluZyB0byB0aGUgcGxhdGZvcm0gJiAqLworICAgICAgLyogICBlbmNvZGluZyBJRCBvZiBlYWNoIGNoYXJtYXAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgY2hhcm1hcCAgICAgICAgICAgID0gZmFjZS0+Y2hhcm1hcHM7CisgICAgICByb290LT5udW1fY2hhcm1hcHMgPSBmYWNlLT5udW1fY2hhcm1hcHM7CisKKyAgICAgIC8qIGFsbG9jYXRlIHRhYmxlIG9mIHBvaW50ZXJzICovCisgICAgICBpZiAoIEFMTE9DX0FSUkFZKCByb290LT5jaGFybWFwcywgcm9vdC0+bnVtX2NoYXJtYXBzLCBGVF9DaGFyTWFwICkgKQorICAgICAgICByZXR1cm4gZXJyb3I7CisKKyAgICAgIGZvciAoIG4gPSAwOyBuIDwgcm9vdC0+bnVtX2NoYXJtYXBzOyBuKyssIGNoYXJtYXArKyApCisgICAgICB7CisgICAgICAgIEZUX0ludCAgcGxhdGZvcm0gPSBjaGFybWFwLT5jbWFwLnBsYXRmb3JtSUQ7CisgICAgICAgIEZUX0ludCAgZW5jb2RpbmcgPSBjaGFybWFwLT5jbWFwLnBsYXRmb3JtRW5jb2RpbmdJRDsKKworICAgICAgICBjaGFybWFwLT5yb290LmZhY2UgICAgICAgID0gKEZUX0ZhY2UpZmFjZTsKKyAgICAgICAgY2hhcm1hcC0+cm9vdC5wbGF0Zm9ybV9pZCA9IHBsYXRmb3JtOworICAgICAgICBjaGFybWFwLT5yb290LmVuY29kaW5nX2lkID0gZW5jb2Rpbmc7CisgICAgICAgIGNoYXJtYXAtPnJvb3QuZW5jb2RpbmcgICAgPSBmaW5kX2VuY29kaW5nKHBsYXRmb3JtLGVuY29kaW5nKTsKKworICAgICAgICAvKiBub3csIHNldCByb290LT5jaGFybWFwIHdpdGggYSB1bmljb2RlIGNoYXJtYXAgd2hlcmV2ZXIgYXZhaWxhYmxlICovCisgICAgICAgIGlmICghcm9vdC0+Y2hhcm1hcCAmJiBjaGFybWFwLT5yb290LmVuY29kaW5nID09IGZ0X2VuY29kaW5nX3VuaWNvZGUpCisgICAgICAgICAgcm9vdC0+Y2hhcm1hcCA9IChGVF9DaGFyTWFwKWNoYXJtYXA7CisgICAgICAgIAorICAgICAgICByb290LT5jaGFybWFwc1tuXSA9IChGVF9DaGFyTWFwKWNoYXJtYXA7CisgICAgICB9CisKKyAgICAgIHJvb3QtPm51bV9maXhlZF9zaXplcyA9IDA7CisgICAgICByb290LT5hdmFpbGFibGVfc2l6ZXMgPSAwOworCisgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAvKiAgU2V0IHVwIG1ldHJpY3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICByb290LT5iYm94LnhNaW4gICAgPSBmYWNlLT5oZWFkZXIueE1pbjsKKyAgICAgIHJvb3QtPmJib3gueU1pbiAgICA9IGZhY2UtPmhlYWRlci55TWluOworICAgICAgcm9vdC0+YmJveC54TWF4ICAgID0gZmFjZS0+aGVhZGVyLnhNYXg7CisgICAgICByb290LT5iYm94LnlNYXggICAgPSBmYWNlLT5oZWFkZXIueU1heDsKKyAgICAgIHJvb3QtPnVuaXRzX3Blcl9FTSA9IGZhY2UtPmhlYWRlci5Vbml0c19QZXJfRU07CisKKyAgICAgIC8qIFRoZSBhc2NlbmRlci9kZXNjZW5kZXIvaGVpZ2h0IGFyZSBjb21wdXRlZCBmcm9tIHRoZSBPUy8yIHRhYmxlICAgKi8KKyAgICAgIC8qIHdoZW4gZm91bmQuICBPdGhlcndpc2UsIHRoZXkncmUgdGFrZW4gZnJvbSB0aGUgaG9yaXpvbnRhbCBoZWFkZXIgKi8KKyAgICAgIGlmICggZmFjZS0+b3MyLnZlcnNpb24gIT0gMHhGRkZGICkKKyAgICAgIHsKKyAgICAgICAgcm9vdC0+YXNjZW5kZXIgID0gIGZhY2UtPm9zMi5zVHlwb0FzY2VuZGVyOworICAgICAgICByb290LT5kZXNjZW5kZXIgPSAtZmFjZS0+b3MyLnNUeXBvRGVzY2VuZGVyOworICAgICAgICByb290LT5oZWlnaHQgICAgPSAgcm9vdC0+YXNjZW5kZXIgKyByb290LT5kZXNjZW5kZXIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZS0+b3MyLnNUeXBvTGluZUdhcDsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgcm9vdC0+YXNjZW5kZXIgID0gZmFjZS0+aG9yaXpvbnRhbC5Bc2NlbmRlcjsKKyAgICAgICAgcm9vdC0+ZGVzY2VuZGVyID0gZmFjZS0+aG9yaXpvbnRhbC5EZXNjZW5kZXI7CisgICAgICAgIHJvb3QtPmhlaWdodCAgICA9IHJvb3QtPmFzY2VuZGVyICsgcm9vdC0+ZGVzY2VuZGVyICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZS0+aG9yaXpvbnRhbC5MaW5lX0dhcDsKKyAgICAgIH0KKworICAgICAgcm9vdC0+bWF4X2FkdmFuY2Vfd2lkdGggID0gZmFjZS0+aG9yaXpvbnRhbC5hZHZhbmNlX1dpZHRoX01heDsKKworICAgICAgcm9vdC0+bWF4X2FkdmFuY2VfaGVpZ2h0ID0gcm9vdC0+aGVpZ2h0OworICAgICAgaWYgKCBmYWNlLT52ZXJ0aWNhbF9pbmZvICkKKyAgICAgICAgcm9vdC0+bWF4X2FkdmFuY2VfaGVpZ2h0ID0gZmFjZS0+dmVydGljYWwuYWR2YW5jZV9IZWlnaHRfTWF4OworCisgICAgICByb290LT51bmRlcmxpbmVfcG9zaXRpb24gID0gZmFjZS0+cG9zdHNjcmlwdC51bmRlcmxpbmVQb3NpdGlvbjsKKyAgICAgIHJvb3QtPnVuZGVybGluZV90aGlja25lc3MgPSBmYWNlLT5wb3N0c2NyaXB0LnVuZGVybGluZVRoaWNrbmVzczsKKworICAgICAgLyogcm9vdC0+bWF4X3BvaW50cyAgICAgIC0gYWxyZWFkeSBzZXQgdXAgKi8KKyAgICAgIC8qIHJvb3QtPm1heF9jb250b3VycyAgICAtIGFscmVhZHkgc2V0IHVwICovCisKKyAgICB9CisgICAgcmV0dXJuIGVycm9yOworICB9CisKKworI3VuZGVmICBQQUlSX1RBRworI2RlZmluZSBQQUlSX1RBRyggbGVmdCwgcmlnaHQgKSAgKCAoKFRUX1VMb25nKWxlZnQgPDwgMTYpIHwgKFRUX1VMb25nKXJpZ2h0ICkKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEdldF9LZXJuaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgZHJpdmVyIG1ldGhvZCB1c2VkIHRvIHJldHVybiB0aGUga2VybmluZyB2ZWN0b3IgYmV0d2VlbiB0d28gICAgICAqLworICAvKiAgICBnbHlwaHMgb2YgdGhlIHNhbWUgZmFjZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBmYWNlICAgICAgICA6OiBBIGhhbmRsZSB0byB0aGUgc291cmNlIGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGxlZnRfZ2x5cGggIDo6IFRoZSBpbmRleCBvZiB0aGUgbGVmdCBnbHlwaCBpbiB0aGUga2VybiBwYWlyLiAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgcmlnaHRfZ2x5cGggOjogVGhlIGluZGV4IG9mIHRoZSByaWdodCBnbHlwaCBpbiB0aGUga2VybiBwYWlyLiAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAga2VybmluZyAgICAgOjogVGhlIGtlcm5pbmcgdmVjdG9yLiAgVGhpcyBpcyBpbiBmb250IHVuaXRzIGZvciAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgIHNjYWxhYmxlIGZvcm1hdHMsIGFuZCBpbiBwaXhlbHMgZm9yIGZpeGVkLXNpemVzICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICBmb3JtYXRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBPbmx5IGhvcml6b250YWwgbGF5b3V0cyAobGVmdC10by1yaWdodCAmIHJpZ2h0LXRvLWxlZnQpIGFyZSAgICAgICAgKi8KKyAgLyogICAgc3VwcG9ydGVkIGJ5IHRoaXMgZnVuY3Rpb24uICBPdGhlciBsYXlvdXRzLCBvciBtb3JlIHNvcGhpc3RpY2F0ZWQgICovCisgIC8qICAgIGtlcm5pbmdzIGFyZSBvdXQgb2Ygc2NvcGUgb2YgdGhpcyBtZXRob2QgKHRoZSBiYXNpYyBkcml2ZXIgICAgICAgICAqLworICAvKiAgICBpbnRlcmZhY2UgaXMgbWVhbnQgdG8gYmUgc2ltcGxlKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoZXkgY2FuIGJlIGltcGxlbWVudGVkIGJ5IGZvcm1hdC1zcGVjaWZpYyBpbnRlcmZhY2VzLiAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgc3RhdGljCisgIFRUX0Vycm9yICBHZXRfS2VybmluZyggVFRfRmFjZSAgICAgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBUVF9VU2hvcnQgICBsZWZ0X2dseXBoLAorICAgICAgICAgICAgICAgICAgICAgICAgIFRUX1VTaG9ydCAgIHJpZ2h0X2dseXBoLAorICAgICAgICAgICAgICAgICAgICAgICAgIFRUX1ZlY3RvciogIGtlcm5pbmcgKQorICB7CisgICAgVFRfS2Vybl8wX1BhaXIqICBwYWlyOworCisKKyAgICBpZiAoICFmYWNlICkKKyAgICAgIHJldHVybiBUVF9FcnJfSW52YWxpZF9GYWNlX0hhbmRsZTsKKworICAgIGtlcm5pbmctPnggPSAwOworICAgIGtlcm5pbmctPnkgPSAwOworCisgICAgaWYgKCBmYWNlLT5rZXJuX3BhaXJzICkKKyAgICB7CisgICAgICAvKiB0aGVyZSBhcmUgc29tZSBrZXJuaW5nIHBhaXJzIGluIHRoaXMgZm9udCBmaWxlISAqLworICAgICAgVFRfVUxvbmcgIHNlYXJjaF90YWcgPSBQQUlSX1RBRyggbGVmdF9nbHlwaCwgcmlnaHRfZ2x5cGggKTsKKyAgICAgIFRUX0xvbmcgICBsZWZ0LCByaWdodDsKKworCisgICAgICBsZWZ0ICA9IDA7CisgICAgICByaWdodCA9IGZhY2UtPm51bV9rZXJuX3BhaXJzIC0gMTsKKworICAgICAgd2hpbGUgKCBsZWZ0ICsgMSA8IHJpZ2h0ICkKKyAgICAgIHsKKyAgICAgICAgVFRfSW50ICAgIG1pZGRsZSAgID0gKGxlZnQgKyByaWdodCkgPj4gMTsKKyAgICAgICAgVFRfVUxvbmcgIGN1cl9wYWlyOworCisKKyAgICAgICAgcGFpciAgICAgPSBmYWNlLT5rZXJuX3BhaXJzICsgbWlkZGxlOworICAgICAgICBjdXJfcGFpciA9IFBBSVJfVEFHKCBwYWlyLT5sZWZ0LCBwYWlyLT5yaWdodCApOworCisgICAgICAgIGlmICggY3VyX3BhaXIgPT0gc2VhcmNoX3RhZyApCisgICAgICAgICAgZ290byBGb3VuZDsKKworICAgICAgICBpZiAoIGN1cl9wYWlyIDwgc2VhcmNoX3RhZyApCisgICAgICAgICAgbGVmdCA9IG1pZGRsZTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHJpZ2h0ID0gbWlkZGxlOworICAgICAgfQorCisgICAgICBwYWlyID0gZmFjZS0+a2Vybl9wYWlycyArIGxlZnQ7CisgICAgICBpZiAoIFBBSVJfVEFHKCBwYWlyLT5sZWZ0LCBwYWlyLT5yaWdodCApID09IHNlYXJjaF90YWcgKQorICAgICAgICBnb3RvIEZvdW5kOworCisgICAgICBwYWlyID0gZmFjZS0+a2Vybl9wYWlycyArIHJpZ2h0OworICAgICAgaWYgKCBQQUlSX1RBRyggcGFpci0+bGVmdCwgcGFpci0+cmlnaHQgKSA9PSBzZWFyY2hfdGFnICkKKyAgICAgICAgZ290byBGb3VuZDsKKyAgICB9CisKKyAgRXhpdDoKKyAgICByZXR1cm4gVFRfRXJyX09rOworCisgIEZvdW5kOgorICAgIGtlcm5pbmctPnggPSBwYWlyLT52YWx1ZTsKKyAgICBnb3RvIEV4aXQ7CisgIH0KKworCisjdW5kZWYgUEFJUl9UQUcKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLworICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KKyAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICBTIEkgWiBFIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCisgIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLworICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFNldF9DaGFyX1NpemVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgZHJpdmVyIG1ldGhvZCB1c2VkIHRvIHJlc2V0IGEgc2l6ZSdzIGNoYXJhY3RlciBzaXplcyAoaG9yaXpvbnRhbCAqLworICAvKiAgICBhbmQgdmVydGljYWwpIGV4cHJlc3NlZCBpbiBmcmFjdGlvbmFsIHBvaW50cy4gICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBjaGFyX3dpZHRoICA6OiBUaGUgY2hhcmFjdGVyIHdpZHRoIGV4cHJlc3NlZCBpbiAyNi42IGZyYWN0aW9uYWwgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgcG9pbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGNoYXJfaGVpZ2h0IDo6IFRoZSBjaGFyYWN0ZXIgaGVpZ2h0IGV4cHJlc3NlZCBpbiAyNi42IGZyYWN0aW9uYWwgICAqLworICAvKiAgICAgICAgICAgICAgICAgICBwb2ludHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzaXplICAgICAgICA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IHNpemUgb2JqZWN0LiAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0YXRpYworICBUVF9FcnJvciAgU2V0X0NoYXJfU2l6ZXMoIFRUX1NpemUgICAgIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfRjI2RG90NiAgY2hhcl93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9GMjZEb3Q2ICBjaGFyX2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9VSW50ICAgICBob3J6X3Jlc29sdXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfVUludCAgICAgdmVydF9yZXNvbHV0aW9uICkKKyAgeworICAgIEZUX1NpemVfTWV0cmljcyogIG1ldHJpY3MgPSAmc2l6ZS0+cm9vdC5tZXRyaWNzOworICAgIFRUX0ZhY2UgICAgICAgICAgIGZhY2UgICAgPSAoVFRfRmFjZSlzaXplLT5yb290LmZhY2U7CisgICAgVFRfTG9uZyAgICAgICAgICAgZGltX3gsIGRpbV95OworCisKKyAgICBpZiAoIGNoYXJfd2lkdGggIDwgMSo2NCApIGNoYXJfd2lkdGggPSAxKjY0OworICAgIGlmICggY2hhcl9oZWlnaHQgPCAxKjY0ICkgY2hhcl9oZWlnaHQgPSAxKjY0OworCisgICAgLyogQ29tcHV0ZSBwaXhlbCBzaXplcyBpbiAyNi42IHVuaXRzICovCisgICAgZGltX3ggPSAoY2hhcl93aWR0aCAqIGhvcnpfcmVzb2x1dGlvbikgLyA3MjsKKyAgICBkaW1feSA9IChjaGFyX2hlaWdodCAqIHZlcnRfcmVzb2x1dGlvbikgLyA3MjsKKworICAgIC8qIFRydW5jYXRlIHRvIGludGVnZXIgcGl4ZWxzIGlmIHJlcXVpcmVkIGJ5IGZvbnQgLSBuZWFybHkgYWxsICAqLworICAgIC8qIFRydWVUeXBlIGZvbnRzIGhhdmUgdGhpcyBiaXQgc2V0LCBhcyBoaW50aW5nIGNhbiByZWFsbHkgd29yayAqLworICAgIC8qIHdpdGggaW50ZWdlciBwaXhlbCBzaXplcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGlmICggZmFjZS0+aGVhZGVyLkZsYWdzICYgOCApCisgICAgeworICAgICAgZGltX3ggPSAoZGltX3ggKyAzMikgJiAtNjQ7CisgICAgICBkaW1feSA9IChkaW1feSArIDMyKSAmIC02NDsKKyAgICB9CisKKyAgICBtZXRyaWNzLT54X3NjYWxlID0gRlRfTXVsRGl2KCBkaW1feCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMDAwTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlLT5yb290LnVuaXRzX3Blcl9FTSApOworCisgICAgbWV0cmljcy0+eV9zY2FsZSA9IEZUX011bERpdiggZGltX3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwMEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZS0+cm9vdC51bml0c19wZXJfRU0gKTsKKworICAgIG1ldHJpY3MtPnhfcHBlbSAgICA9IChUVF9VU2hvcnQpKGRpbV94ID4+IDYpOworICAgIG1ldHJpY3MtPnlfcHBlbSAgICA9IChUVF9VU2hvcnQpKGRpbV95ID4+IDYpOworCisgICAgc2l6ZS0+dHRtZXRyaWNzLnZhbGlkID0gRkFMU0U7CisKKyAgICByZXR1cm4gVFRfUmVzZXRfU2l6ZSggc2l6ZSApOworICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBTZXRfUGl4ZWxfU2l6ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBIGRyaXZlciBtZXRob2QgdXNlZCB0byByZXNldCBhIHNpemUncyBjaGFyYWN0ZXIgc2l6ZXMgKGhvcml6b250YWwgKi8KKyAgLyogICAgYW5kIHZlcnRpY2FsKSBleHByZXNzZWQgaW4gaW50ZWdlciBwaXhlbHMuICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgcGl4ZWxfd2lkdGggIDo6IFRoZSBjaGFyYWN0ZXIgd2lkdGggZXhwcmVzc2VkIGluIGludGVnZXIgcGl4ZWxzLiAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBwaXhlbF9oZWlnaHQgOjogVGhlIGNoYXJhY3RlciBoZWlnaHQgZXhwcmVzc2VkIGluIGludGVnZXIgcGl4ZWxzLiAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzaXplICAgICAgICAgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBzaXplIG9iamVjdC4gICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAwIG1lYW5zIHN1Y2Nlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0YXRpYworICBUVF9FcnJvciAgU2V0X1BpeGVsX1NpemVzKCBUVF9TaXplICBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9VSW50ICBwaXhlbF93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfVUludCAgcGl4ZWxfaGVpZ2h0ICkKKyAgeworICAgIEZUX1NpemVfTWV0cmljcyogIG1ldHJpY3MgPSAmc2l6ZS0+cm9vdC5tZXRyaWNzOworICAgIFRUX0ZhY2UgICAgICAgICAgIGZhY2UgICAgPSAoVFRfRmFjZSlzaXplLT5yb290LmZhY2U7CisKKworICAgIGlmICggcGl4ZWxfd2lkdGggIDwgMSApIHBpeGVsX3dpZHRoICA9IDE7CisgICAgaWYgKCBwaXhlbF9oZWlnaHQgPCAxICkgcGl4ZWxfaGVpZ2h0ID0gMTsKKworICAgIG1ldHJpY3MtPnhfcHBlbSA9IHBpeGVsX3dpZHRoOworICAgIG1ldHJpY3MtPnlfcHBlbSA9IHBpeGVsX2hlaWdodDsKKworICAgIG1ldHJpY3MtPnhfc2NhbGUgPSBGVF9NdWxEaXYoIG1ldHJpY3MtPnhfcHBlbSA8PCA2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMDBMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2UtPnJvb3QudW5pdHNfcGVyX0VNICk7CisKKyAgICBtZXRyaWNzLT55X3NjYWxlID0gRlRfTXVsRGl2KCBtZXRyaWNzLT55X3BwZW0gPDwgNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMDAwTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlLT5yb290LnVuaXRzX3Blcl9FTSApOworCisgICAgc2l6ZS0+dHRtZXRyaWNzLnZhbGlkID0gRkFMU0U7CisKKyAgICByZXR1cm4gVFRfUmVzZXRfU2l6ZSggc2l6ZSApOworICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBMb2FkX0dseXBoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBIGRyaXZlciBtZXRob2QgdXNlZCB0byBsb2FkIGEgZ2x5cGggd2l0aGluIGEgZ2l2ZW4gZ2x5cGggc2xvdC4gICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzbG90ICAgICAgICA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IHNsb3Qgb2JqZWN0IHdoZXJlIHRoZSBnbHlwaCAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgd2lsbCBiZSBsb2FkZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzaXplICAgICAgICA6OiBBIGhhbmRsZSB0byB0aGUgc291cmNlIGZhY2Ugc2l6ZSBhdCB3aGljaCB0aGUgZ2x5cGggKi8KKyAgLyogICAgICAgICAgICAgICAgICAgbXVzdCBiZSBzY2FsZWQvbG9hZGVkL2V0Yy4gICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBnbHlwaF9pbmRleCA6OiBUaGUgaW5kZXggb2YgdGhlIGdseXBoIGluIHRoZSBmb250IGZpbGUuICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGxvYWRfZmxhZ3MgIDo6IEEgZmxhZyBpbmRpY2F0aW5nIHdoYXQgdG8gbG9hZCBmb3IgdGhpcyBnbHlwaC4gIFRoZSAqLworICAvKiAgICAgICAgICAgICAgICAgICBGVExPQURfPz8/IGNvbnN0YW50cyBjYW4gYmUgdXNlZCB0byBjb250cm9sIHRoZSAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgZ2x5cGggbG9hZGluZyBwcm9jZXNzIChlLmcuLCB3aGV0aGVyIHRoZSBvdXRsaW5lICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgIHNob3VsZCBiZSBzY2FsZWQsIHdoZXRoZXIgdG8gbG9hZCBiaXRtYXBzIG9yIG5vdCwgICAqLworICAvKiAgICAgICAgICAgICAgICAgICB3aGV0aGVyIHRvIGhpbnQgdGhlIG91dGxpbmUsIGV0YykuICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHJlc3VsdCAgICAgIDo6IEEgc2V0IG9mIGJpdCBmbGFncyBpbmRpY2F0aW5nIHRoZSB0eXBlIG9mIGRhdGEgdGhhdCAqLworICAvKiAgICAgICAgICAgICAgICAgICB3YXMgbG9hZGVkIGluIHRoZSBnbHlwaCBzbG90IChvdXRsaW5lLCBiaXRtYXAsICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgcGl4bWFwLCBldGMpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBzdGF0aWMKKyAgVFRfRXJyb3IgIExvYWRfR2x5cGgoIFRUX0dseXBoU2xvdCAgc2xvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRUX1NpemUgICAgICAgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRUX1VTaG9ydCAgICAgZ2x5cGhfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICBUVF9VSW50ICAgICAgIGxvYWRfZmxhZ3MgKQorICB7CisgICAgVFRfRXJyb3IgIGVycm9yOworCisKKyAgICBpZiAoICFzbG90ICkKKyAgICAgIHJldHVybiBUVF9FcnJfSW52YWxpZF9HbHlwaF9IYW5kbGU7CisKKyAgICAvKiBjaGVjayB0aGF0IHdlIHdhbnQgYSBzY2FsZWQgb3V0bGluZSBvciBiaXRtYXAgKi8KKyAgICBpZiAoICFzaXplICkKKyAgICAgIGxvYWRfZmxhZ3MgfD0gRlRfTE9BRF9OT19TQ0FMRSB8IEZUX0xPQURfTk9fSElOVElORzsKKworICAgIGlmICggbG9hZF9mbGFncyAmIEZUX0xPQURfTk9fU0NBTEUgKQorICAgICAgc2l6ZSA9IE5VTEw7CisKKyAgICAvKiByZXNldCB0aGUgc2l6ZSBvYmplY3QgaWYgbmVjZXNzYXJ5ICovCisgICAgaWYgKCBzaXplICkKKyAgICB7CisgICAgICAvKiB0aGVzZSB0d28gb2JqZWN0IG11c3QgaGF2ZSB0aGUgc2FtZSBwYXJlbnQgKi8KKyAgICAgIGlmICggc2l6ZS0+cm9vdC5mYWNlICE9IHNsb3QtPmZhY2UgKQorICAgICAgICByZXR1cm4gVFRfRXJyX0ludmFsaWRfRmFjZV9IYW5kbGU7CisKKyAgICAgIGlmICggIXNpemUtPnR0bWV0cmljcy52YWxpZCApCisgICAgICB7CisgICAgICAgIGlmICggRlRfU0VUX0VSUk9SKCBUVF9SZXNldF9TaXplKCBzaXplICkgKSApCisgICAgICAgICAgcmV0dXJuIGVycm9yOworICAgICAgfQorICAgIH0KKworICAgIC8qIG5vdyBsb2FkIHRoZSBnbHlwaCBvdXRsaW5lIGlmIG5lY2Vzc2FyeSAqLworICAgIGVycm9yID0gVFRfTG9hZF9HbHlwaCggc2l6ZSwgc2xvdCwgZ2x5cGhfaW5kZXgsIGxvYWRfZmxhZ3MgKTsKKworICAgIC8qIGZvcmNlIGRyb3Atb3V0IG1vZGUgdG8gMiAqLworICAgIHNsb3QtPm91dGxpbmUuZHJvcG91dF9tb2RlID0gMjsKKworICAgIHJldHVybiBlcnJvcjsKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCisgIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLworICAvKioqKiAgICAgICAgICAgICBDIEggQSBSIEEgQyBUIEUgUiAgIE0gQSBQIFAgSSBOIEcgUyAgICAgICAgICAgICAgICAgKioqKi8KKyAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCisgIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEdldF9DaGFyX0luZGV4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFVzZXMgYSBjaGFybWFwIHRvIHJldHVybiBhIGdpdmVuIGNoYXJhY3RlciBjb2RlJ3MgZ2x5cGggaW5kZXguICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGNoYXJtYXAgIDo6IEEgaGFuZGxlIHRvIHRoZSBzb3VyY2UgY2hhcm1hcCBvYmplY3QuICAgICAgICAgICAgICAgICAqLworICAvKiAgICBjaGFyY29kZSA6OiBUaGUgY2hhcmFjdGVyIGNvZGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBHbHlwaCBpbmRleC4gIDAgbWVhbnMgYHVuZGVmaW5lZCBjaGFyYWN0ZXIgY29kZScuICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0YXRpYworICBGVF9VSW50ICBHZXRfQ2hhcl9JbmRleCggVFRfQ2hhck1hcCAgY2hhcm1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX0xvbmcgICAgIGNoYXJjb2RlICkKKyAgeworICAgIFRUX0Vycm9yICAgICAgIGVycm9yOworICAgIFRUX0ZhY2UgICAgICAgIGZhY2U7CisgICAgVFRfQ01hcFRhYmxlKiAgY21hcDsKKyAgICAKKyAgICBjbWFwID0gJmNoYXJtYXAtPmNtYXA7CisgICAgZmFjZSA9IChUVF9GYWNlKWNoYXJtYXAtPnJvb3QuZmFjZTsKKworICAgIC8qIExvYWQgdGFibGUgaWYgbmVlZGVkICovCisgICAgaWYgKCAhY21hcC0+bG9hZGVkICkKKyAgICB7CisgICAgICBTRk5UX0ludGVyZmFjZSogIHNmbnQgPSAoU0ZOVF9JbnRlcmZhY2UqKWZhY2UtPnNmbnQ7CisgICAgICAKKyAgICAgIGVycm9yID0gc2ZudC0+bG9hZF9jaGFybWFwKCBmYWNlLCBjbWFwLCBmYWNlLT5yb290LnN0cmVhbSApOworICAgICAgaWYgKGVycm9yKQorICAgICAgICByZXR1cm4gZXJyb3I7CisKKyAgICAgIGNtYXAtPmxvYWRlZCA9IFRSVUU7CisgICAgfQorCisgICAgaWYgKCBjbWFwLT5nZXRfaW5kZXggKQorICAgICAgcmV0dXJuIGNtYXAtPmdldF9pbmRleCggY21hcCwgY2hhcmNvZGUgKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4gMDsKKyAgfQorCisKKyAgLyogVGhlIEZUX0RyaXZlckludGVyZmFjZSBzdHJ1Y3R1cmUgaXMgZGVmaW5lZCBpbiBmdGRyaXZlci5oLiAqLworCisgIGNvbnN0IEZUX0RyaXZlckludGVyZmFjZSAgdHRfZHJpdmVyX2ludGVyZmFjZSA9CisgIHsKKyAgICBzaXplb2YgKCBUVF9Ecml2ZXJSZWMgKSwKKyAgICBzaXplb2YgKCBUVF9GYWNlUmVjICksCisgICAgc2l6ZW9mICggVFRfU2l6ZVJlYyApLAorICAgIHNpemVvZiAoIEZUX0dseXBoU2xvdFJlYyApLAorCisgICAgInRydWV0eXBlIiwgICAgIC8qIGRyaXZlciBuYW1lICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgMSwgICAgICAgICAgICAgIC8qIGRyaXZlciB2ZXJzaW9uICAgICAgICAgICAgICAgICAgICAgICovCisgICAgMiwgICAgICAgICAgICAgIC8qIGRyaXZlciByZXF1aXJlcyBGcmVlVHlwZSAyIG9yIGFib3ZlICovCisKKyAgICAodm9pZCopMCwKKworICAgIChGVERyaXZlcl9pbml0RHJpdmVyKSAgICAgICAgVFRfSW5pdF9Ecml2ZXIsCisgICAgKEZURHJpdmVyX2RvbmVEcml2ZXIpICAgICAgICBUVF9Eb25lX0RyaXZlciwKKyAgICAoRlREcml2ZXJfZ2V0SW50ZXJmYWNlKSAgICAgIEdldF9JbnRlcmZhY2UsCisKKyAgICAoRlREcml2ZXJfaW5pdEZhY2UpICAgICAgICAgIEluaXRfRmFjZSwKKyAgICAoRlREcml2ZXJfZG9uZUZhY2UpICAgICAgICAgIFRUX0RvbmVfRmFjZSwKKyAgICAoRlREcml2ZXJfZ2V0S2VybmluZykgICAgICAgIEdldF9LZXJuaW5nLAorCisgICAgKEZURHJpdmVyX2luaXRTaXplKSAgICAgICAgICBUVF9Jbml0X1NpemUsCisgICAgKEZURHJpdmVyX2RvbmVTaXplKSAgICAgICAgICBUVF9Eb25lX1NpemUsCisgICAgKEZURHJpdmVyX3NldENoYXJTaXplcykgICAgICBTZXRfQ2hhcl9TaXplcywKKyAgICAoRlREcml2ZXJfc2V0UGl4ZWxTaXplcykgICAgIFNldF9QaXhlbF9TaXplcywKKworICAgIChGVERyaXZlcl9pbml0R2x5cGhTbG90KSAgICAgVFRfSW5pdF9HbHlwaFNsb3QsCisgICAgKEZURHJpdmVyX2RvbmVHbHlwaFNsb3QpICAgICBUVF9Eb25lX0dseXBoU2xvdCwKKyAgICAoRlREcml2ZXJfbG9hZEdseXBoKSAgICAgICAgIExvYWRfR2x5cGgsCisKKyAgICAoRlREcml2ZXJfZ2V0Q2hhckluZGV4KSAgICAgIEdldF9DaGFyX0luZGV4LAorICB9OworCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBnZXREcml2ZXJJbnRlcmZhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgd2hlbiBjb21waWxpbmcgdGhlIFRydWVUeXBlIGRyaXZlciBhcyBhICAgICAgKi8KKyAgLyogICAgc2hhcmVkIGxpYnJhcnkgKGAuRExMJyBvciBgLnNvJykuICBJdCB3aWxsIGJlIHVzZWQgYnkgdGhlICAgICAgICAgICovCisgIC8qICAgIGhpZ2gtbGV2ZWwgbGlicmFyeSBvZiBGcmVlVHlwZSB0byByZXRyaWV2ZSB0aGUgYWRkcmVzcyBvZiB0aGUgICAgICAqLworICAvKiAgICBkcml2ZXIncyBnZW5lcmljIGludGVyZmFjZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEl0IHNob3VsZG4ndCBiZSBpbXBsZW1lbnRlZCBpbiBhIHN0YXRpYyBidWlsZCwgYXMgZWFjaCBkcml2ZXIgbXVzdCAqLworICAvKiAgICBoYXZlIHRoZSBzYW1lIGZ1bmN0aW9uIGFzIGFuIGV4cG9ydGVkIGVudHJ5IHBvaW50LiAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGUgYWRkcmVzcyBvZiB0aGUgVHJ1ZVR5cGUncyBkcml2ZXIgZ2VuZXJpYyBpbnRlcmZhY2UuICBUaGUgICAgICAgKi8KKyAgLyogICAgZm9ybWF0LXNwZWNpZmljIGludGVyZmFjZSBjYW4gdGhlbiBiZSByZXRyaWV2ZWQgdGhyb3VnaCB0aGUgbWV0aG9kICovCisgIC8qICAgIGludGVyZmFjZS0+Z2V0X2Zvcm1hdF9pbnRlcmZhY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX0RZTkFNSUNfRFJJVkVSUworCisgIEVYUE9SVF9GVU5DCisgIEZUX0RyaXZlckludGVyZmFjZSogIGdldERyaXZlckludGVyZmFjZSggdm9pZCApCisgIHsKKyAgICByZXR1cm4gJnRydWV0eXBlX2RyaXZlcl9pbnRlcmZhY2U7CisgIH0KKworI2VuZGlmIC8qIENPTkZJR19PUFRJT05fRFlOQU1JQ19EUklWRVJTICovCisKKworLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvdHJ1ZXR5cGUvdHRkcml2ZXIuaCBiL3NyYy90cnVldHlwZS90dGRyaXZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViYTY3YjYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdHJ1ZXR5cGUvdHRkcml2ZXIuaApAQCAtMCwwICsxLDE5MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgdHRkcml2ZXIuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEhpZ2gtbGV2ZWwgVHJ1ZVR5cGUgZHJpdmVyIGludGVyZmFjZSAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAxOTk2LTE5OTkgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KKy8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCisvKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLworLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KKy8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjaWZuZGVmIFRURFJJVkVSX0gKKyNkZWZpbmUgVFREUklWRVJfSAorCisjaW5jbHVkZSA8ZnJlZXR5cGUuaD4KKyNpbmNsdWRlIDxmdGRyaXZlci5oPgorI2luY2x1ZGUgPHR0b2Jqcy5oPgorI2luY2x1ZGUgPHR0ZXJyb3JzLmg+CisjaW5jbHVkZSA8dHRuYW1laWQuaD4KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmNUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRURHJpdmVyX2dldEZvbnREYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFJldHVybnMgZWl0aGVyIGEgc2luZ2xlIGZvbnQgdGFibGUgb3IgdGhlIHdob2xlIGZvbnQgZmlsZSBpbnRvICAgICAqLworICAvKiAgICBjYWxsZXIncyBtZW1vcnkuICBUaGlzIGZ1bmN0aW9uIG1pbWljcyB0aGUgR2V0Rm9udERhdGEoKSBBUEkgICAgICAgKi8KKyAgLyogICAgZnVuY3Rpb24gZm91bmQgaW4gV2luZG93cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZmFjZSAgIDo6IEEgaGFuZGxlIHRvIHRoZSBzb3VyY2UgVHJ1ZVR5cGUgZmFjZSBvYmplY3QuICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB0YWcgICAgOjogQSAzMi1iaXQgaW50ZWdlciB1c2VkIHRvIG5hbWUgdGhlIHRhYmxlIHlvdSB3YW50IHRvICAgICAgKi8KKyAgLyogICAgICAgICAgICAgIHJlYWQuICBVc2UgdGhlIG1hY3JvIE1BS0VfVFRfVEFHIChkZWZpbmVkIGluIGZyZWV0eXBlLmgpICovCisgIC8qICAgICAgICAgICAgICB0byBjcmVhdGUgb25lLiAgVXNlIHRoZSB2YWx1ZSAwIGlmIHlvdSB3YW50IHRvIGFjY2VzcyAgICAqLworICAvKiAgICAgICAgICAgICAgdGhlIHdob2xlIGZpbGUgaW5zdGVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG9mZnNldCA6OiBUaGUgb2Zmc2V0IGZyb20gdGhlIHN0YXJ0IG9mIHRoZSB0YWJsZSBvciBmaWxlIGZyb20gICAgICAqLworICAvKiAgICAgICAgICAgICAgd2hpY2ggeW91IHdhbnQgdG8gcmVhZCBieXRlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGJ1ZmZlciA6OiBUaGUgYWRkcmVzcyBvZiB0aGUgdGFyZ2V0L3JlYWQgYnVmZmVyIHdoZXJlIGRhdGEgd2lsbCBiZSAqLworICAvKiAgICAgICAgICAgICAgY29waWVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBsZW5ndGggOjogVGhlIGxlbmd0aCBpbiBieXRlcyBvZiB0aGUgZGF0YSB0byByZWFkLiAgSWYgaXQgaXMgc2V0ICAgKi8KKyAgLyogICAgICAgICAgICAgIHRvIDAgd2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCwgaXQgd2lsbCByZXR1cm4gICAgICAgICovCisgIC8qICAgICAgICAgICAgICBpbW1lZGlhdGVseSwgc2V0dGluZyB0aGUgdmFsdWUgb2YgYGxlbmd0aCcgdG8gdGhlICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgcmVxdWVzdGVkIHRhYmxlJ3Mgc2l6ZSAob3IgdGhlIHdob2xlIGZvbnQgZmlsZSBpZiB0aGUgICAgKi8KKyAgLyogICAgICAgICAgICAgIHRhZyBpcyAwKS4gIEl0IGlzIHRodXMgcG9zc2libGUgdG8gYWxsb2NhdGUgYW5kIHJlYWQgYW4gICovCisgIC8qICAgICAgICAgICAgICBhcmJpdHJhcnkgdGFibGUgaW4gdHdvIHN1Y2Nlc3NpdmUgY2FsbHMuICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVHJ1ZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIFRUX0Vycm9yICAoKlRURHJpdmVyX2dldEZvbnREYXRhKSggVFRfRmFjZSAgIGZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9VTG9uZyAgdGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfVUxvbmcgIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9Mb25nKiAgbGVuZ3RoICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUVERyaXZlcl9nZXRGYWNlV2lkdGhzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBSZXR1cm5zIHRoZSB3aWR0aHMgYW5kL29yIGhlaWdodHMgb2YgYSBnaXZlbiByYW5nZSBvZiBnbHlwaCBmcm9tICAgKi8KKyAgLyogICAgYSBmYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZmFjZSAgICAgICAgOjogQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBGcmVlVHlwZSBmYWNlIG9iamVjdC4gICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBmaXJzdF9nbHlwaCA6OiBUaGUgZmlyc3QgZ2x5cGggaW4gdGhlIHJhbmdlLiAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGxhc3RfZ2x5cGggIDo6IFRoZSBsYXN0IGdseXBoIGluIHRoZSByYW5nZS4gICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHdpZHRocyAgICAgIDo6IFRoZSBhZGRyZXNzIG9mIHRoZSB0YWJsZSByZWNlaXZpbmcgdGhlIHdpZHRocyAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICBleHByZXNzZWQgaW4gZm9udCB1bml0cyAoVVNob3J0cykuICBTZXQgdGhpcyAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyIHRvIE5VTEwgaWYgeW91J3JlIG5vdCBpbnRlcmVzdGVkIGluIHRoZXNlICovCisgIC8qICAgICAgICAgICAgICAgICAgIHZhbHVlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgaGVpZ2h0cyAgICAgOjogVGhlIGFkZHJlc3Mgb2YgdGhlIHRhYmxlIHJlY2VpdmluZyB0aGUgaGVpZ2h0cyAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgIGV4cHJlc3NlZCBpbiBmb250IHVuaXRzIChVU2hvcnRzKS4gIFNldCB0aGlzICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXIgdG8gTlVMTCBpZiB5b3UncmUgbm90IGludGVyZXN0ZWQgaW4gdGhlc2UgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgdmFsdWVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIFRUX0Vycm9yICAoKlRURHJpdmVyX2dldEZhY2VXaWR0aHMpKCBUVF9GYWNlICAgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9VU2hvcnQgICBmaXJzdF9nbHlwaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfVVNob3J0ICAgbGFzdF9nbHlwaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfVVNob3J0KiAgd2lkdGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9VU2hvcnQqICBoZWlnaHRzICk7CisKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX0RyaXZlckludGVyZmFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoZSBUcnVlVHlwZS1zcGVjaWZpYyBpbnRlcmZhY2Ugb2YgdGhpcyBkcml2ZXIuICBOb3RlIHRoYXQgc29tZSBvZiAqLworICAvKiAgICB0aGUgbWV0aG9kcyBkZWZpbmVkIGhlcmUgYXJlIG9wdGlvbmFsLCBhcyB0aGV5J3JlIG9ubHkgdXNlZCBmb3IgICAgKi8KKyAgLyogICAgZm9yIHNwZWNpZmljIHRhc2tzIG9mIHRoZSBkcml2ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZ2V0X2ZvbnRfZGF0YSAgIDo6IFNlZSB0aGUgZGVjbGFyYXRpb24gb2YgVFREcml2ZXJfZ2V0Rm9udERhdGEoKS4gICovCisgIC8qICAgIGdldF9mYWNlX3dpZHRocyA6OiBTZWUgdGhlIGRlY2xhcmF0aW9uIG9mICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgVFREcml2ZXJfZ2V0RmFjZVdpZHRocygpLiAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgc3RydWN0ICBUVF9Ecml2ZXJJbnRlcmZhY2VfCisgIHsKKyAgICBUVERyaXZlcl9nZXRGb250RGF0YSAgICBnZXRfZm9udF9kYXRhOworICAgIFRURHJpdmVyX2dldEZhY2VXaWR0aHMgIGdldF9mYWNlX3dpZHRoczsKKworICB9IFRUX0RyaXZlckludGVyZmFjZTsKKworCisgIEVYUE9SVF9ERUYKKyAgY29uc3QgRlRfRHJpdmVySW50ZXJmYWNlICB0dF9kcml2ZXJfaW50ZXJmYWNlOworCisKKyAgRVhQT1JUX0RFRgorICBjb25zdCBUVF9Ecml2ZXJJbnRlcmZhY2UgIHR0X2Zvcm1hdF9pbnRlcmZhY2U7CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBIZXJlIGlzIGEgdGVtcGxhdGUgb2YgdGhlIGNvZGUgdGhhdCBzaG91bGQgYXBwZWFyIGluIGVhY2gKKyAqICBmb250IGRyaXZlcidzIF9pbnRlcmZhY2VfIGZpbGUgKHRoZSBvbmUgaW5jbHVkZWQgYnkgImZ0aW5pdC5jIikuCisgKgorICogIEl0IGlzIHVzZWQgdG8gYnVpbGQsIGF0IGNvbXBpbGUgdGltZSwgYSBzaW1wbGUgbGlua2VkIGxpc3Qgb2YKKyAqICB0aGUgaW50ZXJmYWNlcyBvZiB0aGUgZHJpdmVycyB3aGljaCBoYXZlIGJlZW4gI2luY2x1ZGVkIGluIAorICogICJmdGluaXQuYyIuIFNlZSB0aGUgc291cmNlIGNvZGUgb2YgdGhlIGxhdHRlciBmaWxlIGZvciBkZXRhaWxzCisgKgorICogIChOb3RlIHRoYXQgdGhpcyBpcyBvbmx5IHJlcXVpcmVkIHdoZW4geW91IHdhbnQgeW91ciBkcml2ZXIgaW5jbHVkZWQKKyAqICAgaW4gdGhlIHNldCBvZiBkZWZhdWx0IGRyaXZlcnMgbG9hZGVkIGJ5IEZUX0luaXRfRnJlZVR5cGUuIE90aGVyCisgKiAgIGRyaXZlcnMgY2FuIHN0aWxsIGJlIGFkZGVkIG1hbnVhbGx5IGF0IHJ1bnRpbWUgd2l0aCBGVF9BZGRfRHJpdmVyLgorICoKKyAqIHsKKyAqICAgI2lmZGVmIEZUSU5JVF9EUklWRVJfQ0hBSU4KKyAqCisgKiAgIHN0YXRpYworICogICBjb25zdCBGVF9Ecml2ZXJDaGFpbiAgZnRpbml0XzxGT1JNQVQ+X2RyaXZlcl9jaGFpbiA9CisgKiAgIHsKKyAqICAgICBGVF9JTklUX0xBU1RfRFJJVkVSX0NIQUlOLAorICogICAgICY8Rk9STUFUPl9kcml2ZXJfaW50ZXJmYWNlCisgKiAgIH07CisgKiAKKyAqICAgI3VuZGVmICBGVF9JTklUX0xBU1RfRFJJVkVSX0NIQUlOCisgKiAgICNkZWZpbmUgRlRfSU5JVF9MQVNUX0RSSVZFUl9DSEFJTiAgICZmdGluaXRfPEZPUk1BVD5fZHJpdmVyX2NoYWluCisgKgorICogICAjZW5kaWYgCisgKiB9CisgKgorICogIHJlcGxhY2UgPEZPUk1BVD4gd2l0aCB5b3VyIGRyaXZlcidzIHByZWZpeAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNpZmRlZiBGVElOSVRfRFJJVkVSX0NIQUlOCisKKyAgc3RhdGljCisgIGNvbnN0IEZUX0RyaXZlckNoYWluICBmdGluaXRfdHRfZHJpdmVyX2NoYWluID0KKyAgeworICAgIEZUX0lOSVRfTEFTVF9EUklWRVJfQ0hBSU4sCisgICAgJnR0X2RyaXZlcl9pbnRlcmZhY2UKKyAgfTsKKworI3VuZGVmICBGVF9JTklUX0xBU1RfRFJJVkVSX0NIQUlOCisjZGVmaW5lIEZUX0lOSVRfTEFTVF9EUklWRVJfQ0hBSU4gICAmZnRpbml0X3R0X2RyaXZlcl9jaGFpbgorCisjZW5kaWYgLyogRlRJTklUX0RSSVZFUl9DSEFJTiAqLyAKKworCisKKyNlbmRpZiAvKiBUVERSSVZFUl9IICovCisKKworLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvdHJ1ZXR5cGUvdHRlcnJvcnMuaCBiL3NyYy90cnVldHlwZS90dGVycm9ycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwMjg2ZTMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdHJ1ZXR5cGUvdHRlcnJvcnMuaApAQCAtMCwwICsxLDEyNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgdHRlcnJvcnMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIFRydWVUeXBlIGVycm9yIElEIGRlZmluaXRpb25zIChzcGVjaWZpY2F0aW9uIG9ubHkpLiAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAxOTk2LTE5OTkgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCAgICAgICAgKi8KKy8qICBtb2RpZmllZCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgICovCisvKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLworLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KKy8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjaWZuZGVmIFRURVJST1JTX0gKKyNkZWZpbmUgVFRFUlJPUlNfSAorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBFcnJvciBjb2RlcyBkZWNsYXJhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFRoZSBlcnJvciBjb2RlcyBhcmUgZ3JvdXBlZCBpbiBgY2xhc3NlcycgdXNlZCB0byBpbmRpY2F0ZSB0aGUgYGxldmVsJyAqLworICAvKiBhdCB3aGljaCB0aGUgZXJyb3IgaGFwcGVuZWQuICBUaGUgY2xhc3MgaXMgZ2l2ZW4gYnkgYW4gZXJyb3IgY29kZSdzICAgKi8KKyAgLyogaGlnaCBieXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisgIC8qIFN1Y2Nlc3MgaXMgYWx3YXlzIDAuICovCisKKyNkZWZpbmUgIFRUX0Vycl9PayAgICAgICAgICAgICAgICAgICAgICAgRlRfRXJyX09rCisKKyAgLyogSGlnaCBsZXZlbCBBUEkgZXJyb3JzLiAqLworCisjZGVmaW5lICBUVF9FcnJfSW52YWxpZF9GaWxlX0Zvcm1hdCAgICAgIEZUX0Vycl9JbnZhbGlkX0ZpbGVfRm9ybWF0CisjZGVmaW5lICBUVF9FcnJfSW52YWxpZF9Bcmd1bWVudCAgICAgICAgIEZUX0Vycl9JbnZhbGlkX0FyZ3VtZW50CisjZGVmaW5lICBUVF9FcnJfSW52YWxpZF9Ecml2ZXJfSGFuZGxlICAgIEZUX0Vycl9JbnZhbGlkX0RyaXZlcl9IYW5kbGUKKyNkZWZpbmUgIFRUX0Vycl9JbnZhbGlkX0ZhY2VfSGFuZGxlICAgICAgRlRfRXJyX0ludmFsaWRfRmFjZV9IYW5kbGUKKyNkZWZpbmUgIFRUX0Vycl9JbnZhbGlkX0luc3RhbmNlX0hhbmRsZSAgRlRfRXJyX0ludmFsaWRfU2l6ZV9IYW5kbGUKKyNkZWZpbmUgIFRUX0Vycl9JbnZhbGlkX0dseXBoX0hhbmRsZSAgICAgRlRfRXJyX0ludmFsaWRfU2xvdF9IYW5kbGUKKyNkZWZpbmUgIFRUX0Vycl9JbnZhbGlkX0NoYXJNYXBfSGFuZGxlICAgRlRfRXJyX0ludmFsaWRfQ2hhck1hcF9IYW5kbGUKKyNkZWZpbmUgIFRUX0Vycl9JbnZhbGlkX0dseXBoX0luZGV4ICAgICAgRlRfRXJyX0ludmFsaWRfR2x5cGhfSW5kZXgKKworI2RlZmluZSAgVFRfRXJyX1VuaW1wbGVtZW50ZWRfRmVhdHVyZSAgICBGVF9FcnJfVW5pbXBsZW1lbnRlZF9GZWF0dXJlCisjZGVmaW5lICBUVF9FcnJfVW5hdmFpbGFibGVfT3V0bGluZSAgICAgIEZUX0Vycl9VbmF2YWlsYWJsZV9PdXRsaW5lCisjZGVmaW5lICBUVF9FcnJfVW5hdmFpbGFibGVfQml0bWFwICAgICAgIEZUX0Vycl9VbmF2YWlsYWJsZV9CaXRtYXAKKyNkZWZpbmUgIFRUX0Vycl9VbmF2YWlsYWJsZV9QaXhtYXAgICAgICAgRlRfRXJyX1VuYXZhaWxhYmxlX1BpeG1hcAorI2RlZmluZSAgVFRfRXJyX0ZpbGVfSXNfTm90X0NvbGxlY3Rpb24gICBGVF9FcnJfRmlsZV9Jc19Ob3RfQ29sbGVjdGlvbgorCisjZGVmaW5lICBUVF9FcnJfSW52YWxpZF9FbmdpbmUgICAgICAgICAgIEZUX0Vycl9JbnZhbGlkX0RyaXZlcl9IYW5kbGUKKworICAvKiBJbnRlcm5hbCBlcnJvcnMuICovCisKKyNkZWZpbmUgIFRUX0Vycl9PdXRfT2ZfTWVtb3J5ICAgICAgICAgICAgRlRfRXJyX091dF9PZl9NZW1vcnkKKyNkZWZpbmUgIFRUX0Vycl9Vbmxpc3RlZF9PYmplY3QgICAgICAgICAgRlRfRXJyX1VubGlzdGVkX09iamVjdAorCisgIC8qIEdlbmVyYWwgZ2x5cGggb3V0bGluZSBlcnJvcnMuICovCisKKyNkZWZpbmUgIFRUX0Vycl9Ub29fTWFueV9Qb2ludHMgICAgICAgICAgRlRfRXJyX1Rvb19NYW55X1BvaW50cworI2RlZmluZSAgVFRfRXJyX1Rvb19NYW55X0NvbnRvdXJzICAgICAgICBGVF9FcnJfVG9vX01hbnlfQ29udG91cnMKKyNkZWZpbmUgIFRUX0Vycl9Ub29fTWFueV9JbnMgICAgICAgICAgICAgRlRfRXJyX1Rvb19NYW55X0hpbnRzCisjZGVmaW5lICBUVF9FcnJfSW52YWxpZF9Db21wb3NpdGUgICAgICAgIEZUX0Vycl9JbnZhbGlkX0NvbXBvc2l0ZQorCisgIC8qIEJ5dGVjb2RlIGludGVycHJldGVyIGVycm9yIGNvZGVzLiAqLworCisgIC8qIFRoZXNlIGVycm9yIGNvZGVzIGFyZSBwcm9kdWNlZCBieSB0aGUgVHJ1ZVR5cGUgKi8KKyAgLyogYnl0ZWNvZGUgaW50ZXJwcmV0ZXIuICBUaGV5IHVzdWFsbHkgaW5kaWNhdGUgYSAqLworICAvKiBicm9rZW4gZm9udCBmaWxlLCBhIGJyb2tlbiBnbHlwaCB3aXRoaW4gYSBmb250ICovCisgIC8qIGZpbGUsIG9yIGEgYnVnIGluIHRoZSBpbnRlcnByZXRlciEgICAgICAgICAgICAgKi8KKworI2RlZmluZSBUVF9FcnJfSW52YWxpZF9PcGNvZGUgICAgICAgICAgIDB4NDAwCisjZGVmaW5lIFRUX0Vycl9Ub29fRmV3X0FyZ3VtZW50cyAgICAgICAgMHg0MDEKKyNkZWZpbmUgVFRfRXJyX1N0YWNrX092ZXJmbG93ICAgICAgICAgICAweDQwMgorI2RlZmluZSBUVF9FcnJfQ29kZV9PdmVyZmxvdyAgICAgICAgICAgIDB4NDAzCisjZGVmaW5lIFRUX0Vycl9CYWRfQXJndW1lbnQgICAgICAgICAgICAgMHg0MDQKKyNkZWZpbmUgVFRfRXJyX0RpdmlkZV9CeV9aZXJvICAgICAgICAgICAweDQwNQorI2RlZmluZSBUVF9FcnJfU3RvcmFnZV9PdmVyZmxvdyAgICAgICAgIDB4NDA2CisjZGVmaW5lIFRUX0Vycl9DdnRfT3ZlcmZsb3cgICAgICAgICAgICAgMHg0MDcKKyNkZWZpbmUgVFRfRXJyX0ludmFsaWRfUmVmZXJlbmNlICAgICAgICAweDQwOAorI2RlZmluZSBUVF9FcnJfSW52YWxpZF9EaXN0YW5jZSAgICAgICAgIDB4NDA5CisjZGVmaW5lIFRUX0Vycl9JbnRlcnBvbGF0ZV9Ud2lsaWdodCAgICAgMHg0MEEKKyNkZWZpbmUgVFRfRXJyX0RlYnVnX09wQ29kZSAgICAgICAgICAgICAweDQwQgorI2RlZmluZSBUVF9FcnJfRU5ERl9Jbl9FeGVjX1N0cmVhbSAgICAgIDB4NDBDCisjZGVmaW5lIFRUX0Vycl9PdXRfT2ZfQ29kZVJhbmdlcyAgICAgICAgMHg0MEQKKyNkZWZpbmUgVFRfRXJyX05lc3RlZF9ERUZTICAgICAgICAgICAgICAweDQwRQorI2RlZmluZSBUVF9FcnJfSW52YWxpZF9Db2RlUmFuZ2UgICAgICAgIDB4NDBGCisjZGVmaW5lIFRUX0Vycl9JbnZhbGlkX0Rpc3BsYWNlbWVudCAgICAgMHg0MTAKKyNkZWZpbmUgVFRfRXJyX0V4ZWN1dGlvbl9Ub29fTG9uZyAgICAgICAweDQxMQorCisgIC8qIE90aGVyIFRydWVUeXBlIHNwZWNpZmljIGVycm9yIGNvZGVzLiAqLworCisjZGVmaW5lIFRUX0Vycl9UYWJsZV9NaXNzaW5nICAgICAgICAgICAgMHg0MjAKKyNkZWZpbmUgVFRfRXJyX1Rvb19NYW55X0V4dGVuc2lvbnMgICAgICAweDQyMQorI2RlZmluZSBUVF9FcnJfRXh0ZW5zaW9uc19VbnN1cHBvcnRlZCAgIDB4NDIyCisjZGVmaW5lIFRUX0Vycl9JbnZhbGlkX0V4dGVuc2lvbl9JZCAgICAgMHg0MjMKKworI2RlZmluZSBUVF9FcnJfTm9fVmVydGljYWxfRGF0YSAgICAgICAgIDB4NDI0CisKKyNkZWZpbmUgVFRfRXJyX01heF9Qcm9maWxlX01pc3NpbmcgICAgICAweDQzMAorI2RlZmluZSBUVF9FcnJfSGVhZGVyX1RhYmxlX01pc3NpbmcgICAgIDB4NDMxCisjZGVmaW5lIFRUX0Vycl9Ib3Jpel9IZWFkZXJfTWlzc2luZyAgICAgMHg0MzIKKyNkZWZpbmUgVFRfRXJyX0xvY2F0aW9uc19NaXNzaW5nICAgICAgICAweDQzMworI2RlZmluZSBUVF9FcnJfTmFtZV9UYWJsZV9NaXNzaW5nICAgICAgIDB4NDM0CisjZGVmaW5lIFRUX0Vycl9DTWFwX1RhYmxlX01pc3NpbmcgICAgICAgMHg0MzUKKyNkZWZpbmUgVFRfRXJyX0htdHhfVGFibGVfTWlzc2luZyAgICAgICAweDQzNgorI2RlZmluZSBUVF9FcnJfT1MyX1RhYmxlX01pc3NpbmcgICAgICAgIDB4NDM3CisjZGVmaW5lIFRUX0Vycl9Qb3N0X1RhYmxlX01pc3NpbmcgICAgICAgMHg0MzgKKworI2RlZmluZSBUVF9FcnJfSW52YWxpZF9Ib3Jpel9NZXRyaWNzICAgIDB4NDQwCisjZGVmaW5lIFRUX0Vycl9JbnZhbGlkX0NoYXJNYXBfRm9ybWF0ICAgMHg0NDEKKyNkZWZpbmUgVFRfRXJyX0ludmFsaWRfUFBlbSAgICAgICAgICAgICAweDQ0MgorI2RlZmluZSBUVF9FcnJfSW52YWxpZF9WZXJ0X01ldHJpY3MgICAgIDB4NDQzCisKKyNkZWZpbmUgVFRfRXJyX0NvdWxkX05vdF9GaW5kX0NvbnRleHQgICAweDQ1MAorCisjZW5kaWYgLyogRlRFUlJJRF9IICovCisKKworLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvdHJ1ZXR5cGUvdHRnbG9hZC5jIGIvc3JjL3RydWV0eXBlL3R0Z2xvYWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTc4MzE1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RydWV0eXBlL3R0Z2xvYWQuYwpAQCAtMCwwICsxLDE0OTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHR0Z2xvYWQuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBUcnVlVHlwZSBHbHlwaCBMb2FkZXIgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMTk5Ni0xOTk5IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQgICAgICAgICovCisvKiAgbW9kaWZpZWQgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICAqLworLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KKy8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCisvKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2luY2x1ZGUgPGZyZWV0eXBlLmg+CisjaW5jbHVkZSA8ZnRkZWJ1Zy5oPgorI2luY2x1ZGUgPGZ0Y2FsYy5oPgorI2luY2x1ZGUgPGZ0c3RyZWFtLmg+CisKKyNpbmNsdWRlIDxzZm50Lmg+CisjaW5jbHVkZSA8dHRnbG9hZC5oPgorCisjaW5jbHVkZSA8dHR0YWdzLmg+CisjaW5jbHVkZSA8dHRpbnRlcnAuaD4KKworCisgIC8qIHJlcXVpcmVkIGZvciB0aGUgdHJhY2luZyBtb2RlICovCisjdW5kZWYgIEZUX0NPTVBPTkVOVAorI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX3R0Z2xvYWQKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogQ29tcG9zaXRlIGZvbnQgZmxhZ3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBBUkdTX0FSRV9XT1JEUyAgICAgICAweDAwMQorI2RlZmluZSBBUkdTX0FSRV9YWV9WQUxVRVMgICAweDAwMgorI2RlZmluZSBST1VORF9YWV9UT19HUklEICAgICAweDAwNAorI2RlZmluZSBXRV9IQVZFX0FfU0NBTEUgICAgICAweDAwOAorLyogcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAweDAxMCAqLworI2RlZmluZSBNT1JFX0NPTVBPTkVOVFMgICAgICAweDAyMAorI2RlZmluZSBXRV9IQVZFX0FOX1hZX1NDQUxFICAweDA0MAorI2RlZmluZSBXRV9IQVZFX0FfMlgyICAgICAgICAweDA4MAorI2RlZmluZSBXRV9IQVZFX0lOU1RSICAgICAgICAweDEwMAorI2RlZmluZSBVU0VfTVlfTUVUUklDUyAgICAgICAweDIwMAorCisKKyN1bmRlZiAgU0NBTEVfWAorI2RlZmluZSBTQ0FMRV9YKCBkaXN0YW5jZSApICBGVF9NdWxGaXgoIGRpc3RhbmNlLCBleGVjLT5tZXRyaWNzLnhfc2NhbGUgKQorCisjdW5kZWYgIFNDQUxFX1kKKyNkZWZpbmUgU0NBTEVfWSggZGlzdGFuY2UgKSAgRlRfTXVsRml4KCBkaXN0YW5jZSwgZXhlYy0+bWV0cmljcy55X3NjYWxlICkKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX0dldF9NZXRyaWNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFJldHVybnMgdGhlIGhvcml6b250YWwgb3IgdmVydGljYWwgbWV0cmljcyBpbiBmb250IHVuaXRzIGZvciBhICAgICAqLworICAvKiAgICBnaXZlbiBnbHlwaC4gIFRoZSBtZXRyaWNzIGFyZSB0aGUgbGVmdCBzaWRlIGJlYXJpbmcgKHJlc3AuIHRvcCAgICAgKi8KKyAgLyogICAgc2lkZSBiZWFyaW5nKSBhbmQgYWR2YW5jZSB3aWR0aCAocmVzcC4gYWR2YW5jZSBoZWlnaHQpLiAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgaGVhZGVyICA6OiBBIHBvaW50ZXIgdG8gZWl0aGVyIHRoZSBob3Jpem9udGFsIG9yIHZlcnRpY2FsIG1ldHJpY3MgICovCisgIC8qICAgICAgICAgICAgICAgc3RydWN0dXJlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgaW5kZXggICA6OiBUaGUgZ2x5cGggaW5kZXguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgYmVhcmluZyA6OiBUaGUgYmVhcmluZywgZWl0aGVyIGxlZnQgc2lkZSBvciB0b3Agc2lkZS4gICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBhZHZhbmNlIDo6IFRoZSBhZHZhbmNlIHdpZHRoIHJlc3AuIGFkdmFuY2UgaGVpZ2h0LiAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGlzIGZ1bmN0aW9uIHdpbGwgbXVjaCBwcm9iYWJseSBtb3ZlIHRvIGFub3RoZXIgY29tcG9uZW50IGluIHRoZSAgKi8KKyAgLyogICAgbmVhciBmdXR1cmUsIGJ1dCBJIGhhdmVuJ3QgZGVjaWRlZCB3aGljaCB5ZXQuICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBMT0NBTF9GVU5DCisgIHZvaWQgIFRUX0dldF9NZXRyaWNzKCBUVF9Ib3JpSGVhZGVyKiAgaGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgVFRfVVNob3J0ICAgICAgIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgVFRfU2hvcnQqICAgICAgIGJlYXJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICBUVF9VU2hvcnQqICAgICAgYWR2YW5jZSApCisgIHsKKyAgICBUVF9Mb25nTWV0cmljcyogIGxvbmdzX207CisgICAgVFRfVVNob3J0ICAgICAgICBrID0gaGVhZGVyLT5udW1iZXJfT2ZfSE1ldHJpY3M7CisKKworICAgIGlmICggaW5kZXggPCBrICkKKyAgICB7CisgICAgICBsb25nc19tICA9IChUVF9Mb25nTWV0cmljcyopaGVhZGVyLT5sb25nX21ldHJpY3MgKyBpbmRleDsKKyAgICAgICpiZWFyaW5nID0gbG9uZ3NfbS0+YmVhcmluZzsKKyAgICAgICphZHZhbmNlID0gbG9uZ3NfbS0+YWR2YW5jZTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICpiZWFyaW5nID0gKChUVF9TaG9ydE1ldHJpY3MqKWhlYWRlci0+c2hvcnRfbWV0cmljcylbaW5kZXggLSBrXTsKKyAgICAgICphZHZhbmNlID0gKChUVF9Mb25nTWV0cmljcyopaGVhZGVyLT5sb25nX21ldHJpY3MpW2sgLSAxXS5hZHZhbmNlOworICAgIH0KKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgR2V0X0hNZXRyaWNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgUmV0dXJucyB0aGUgaG9yaXpvbnRhbCBtZXRyaWNzIGluIGZvbnQgdW5pdHMgZm9yIGEgZ2l2ZW4gZ2x5cGguICAgICovCisgIC8qICAgIElmIGBjaGVjaycgaXMgdHJ1ZSwgdGFrZSBjYXJlIG9mIG1vbm9zcGFjZWQgZm9udHMgYnkgcmV0dXJuaW5nIHRoZSAqLworICAvKiAgICBhZHZhbmNlIHdpZHRoIG1heGltdW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBmYWNlICA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IHNvdXJjZSBmYWNlLiAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGluZGV4IDo6IFRoZSBnbHlwaCBpbmRleC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgY2hlY2sgOjogSWYgc2V0LCBoYW5kbGUgbW9ub3NwYWNlZCBmb250cy4gICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbHNiICAgOjogVGhlIGxlZnQgc2lkZSBiZWFyaW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBhdyAgICA6OiBUaGUgYWR2YW5jZSB3aWR0aC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0YXRpYworICB2b2lkIEdldF9ITWV0cmljcyggVFRfRmFjZSAgICAgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgIFRUX1VTaG9ydCAgIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgVFRfQm9vbCAgICAgY2hlY2ssCisgICAgICAgICAgICAgICAgICAgICBUVF9TaG9ydCogICBsc2IsCisgICAgICAgICAgICAgICAgICAgICBUVF9VU2hvcnQqICBhdyApCisgIHsKKyAgICBUVF9HZXRfTWV0cmljcyggJmZhY2UtPmhvcml6b250YWwsIGluZGV4LCBsc2IsIGF3ICk7CisKKyAgICBpZiAoIGNoZWNrICYmIGZhY2UtPnBvc3RzY3JpcHQuaXNGaXhlZFBpdGNoICkKKyAgICAgICphdyA9IGZhY2UtPmhvcml6b250YWwuYWR2YW5jZV9XaWR0aF9NYXg7CisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEdldF9BZHZhbmNlX1dpZHRocyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFJldHVybnMgdGhlIGFkdmFuY2Ugd2lkdGggdGFibGUgZm9yIGEgZ2l2ZW4gcGl4ZWwgc2l6ZSBpZiBpdCBpcyAgICAqLworICAvKiAgICBmb3VuZCBpbiB0aGUgZm9udCdzIGBoZG14JyB0YWJsZSAoaWYgYW55KS4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBmYWNlIDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgc291cmNlIGZhY2UuICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHBwZW0gOjogVGhlIHBpeGVsIHNpemUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgQSBwb2ludGVyIHRvIHRoZSBhZHZhbmNlIHdpdGggdGFibGUuICBOVUxMIGlmIGl0IGRvZXNuJ3QgZXhpc3QuICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgc3RhdGljCisgIFRUX0J5dGUqICBHZXRfQWR2YW5jZV9XaWR0aHMoIFRUX0ZhY2UgICAgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfVVNob3J0ICBwcGVtICkKKyAgeworICAgIFRUX1VTaG9ydCAgbjsKKworCisgICAgZm9yICggbiA9IDA7IG4gPCBmYWNlLT5oZG14Lm51bV9yZWNvcmRzOyBuKysgKQorICAgICAgaWYgKCBmYWNlLT5oZG14LnJlY29yZHNbbl0ucHBlbSA9PSBwcGVtICkKKyAgICAgICAgcmV0dXJuIGZhY2UtPmhkbXgucmVjb3Jkc1tuXS53aWR0aHM7CisKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisKKyNkZWZpbmUgY3VyX3RvX29yZyggbiwgem9uZSApICBcCisgICAgICAgICAgTUVNX0NvcHkoICh6b25lKS0+b3JnLCAoem9uZSktPmN1ciwgbiAqIHNpemVvZiAoIFRUX1ZlY3RvciApICkKKworI2RlZmluZSBvcmdfdG9fY3VyKCBuLCB6b25lICkgIFwKKyAgICAgICAgICBNRU1fQ29weSggKHpvbmUpLT5jdXIsICh6b25lKS0+b3JnLCBuICogc2l6ZW9mICggVFRfVmVjdG9yICkgKQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgdHJhbnNsYXRlX2FycmF5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVHJhbnNsYXRlcyBhbiBhcnJheSBvZiBjb29yZGluYXRlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbiAgICAgICA6OiBUaGUgbnVtYmVyIG9mIHBvaW50cyB0byB0cmFuc2xhdGUuICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBkZWx0YV94IDo6IFRoZSBob3Jpem9udGFsIGNvb3JkaW5hdGUgb2YgdGhlIHNoaWZ0IHZlY3Rvci4gICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGRlbHRhX3kgOjogVGhlIHZlcnRpY2FsIGNvb3JkaW5hdGUgb2YgdGhlIHNoaWZ0IHZlY3Rvci4gICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGNvb3JkcyAgOjogVGhlIHZlY3RvciBhcnJheSB0byB0cmFuc2xhdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgc3RhdGljCisgIHZvaWQgIHRyYW5zbGF0ZV9hcnJheSggVFRfVVNob3J0ICAgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBUVF9WZWN0b3IqICBjb29yZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgVFRfUG9zICAgICAgZGVsdGFfeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBUVF9Qb3MgICAgICBkZWx0YV95ICkKKyAgeworICAgIFRUX1VTaG9ydCAgazsKKworCisgICAgaWYgKCBkZWx0YV94ICkKKyAgICAgIGZvciAoIGsgPSAwOyBrIDwgbjsgaysrICkKKyAgICAgICAgY29vcmRzW2tdLnggKz0gZGVsdGFfeDsKKworICAgIGlmICggZGVsdGFfeSApCisgICAgICBmb3IgKCBrID0gMDsgayA8IG47IGsrKyApCisgICAgICAgIGNvb3Jkc1trXS55ICs9IGRlbHRhX3k7CisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG1vdW50X3pvbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIE1vdW50cyBvbmUgZ2x5cGggem9uZSBvbiB0b3Agb2YgYW5vdGhlci4gIFRoaXMgaXMgbmVlZGVkIHRvICAgICAgICAqLworICAvKiAgICBhc3NlbWJsZSBjb21wb3NpdGUgZ2x5cGhzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzb3VyY2UgOjogVGhlIHNvdXJjZSBnbHlwaCB6b25lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB0YXJnZXQgOjogVGhlIHRhcmdldCBnbHlwaCB6b25lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0YXRpYworICB2b2lkICBtb3VudF96b25lKCBUVF9HbHlwaFpvbmUqICBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgIFRUX0dseXBoWm9uZSogIHRhcmdldCApCisgIHsKKyAgICBUVF9VU2hvcnQgIG5wOworICAgIFRUX1Nob3J0ICAgbmM7CisKKworICAgIG5wID0gc291cmNlLT5uX3BvaW50czsKKyAgICBuYyA9IHNvdXJjZS0+bl9jb250b3VyczsKKworICAgIHRhcmdldC0+b3JnICAgPSBzb3VyY2UtPm9yZyArIG5wOworICAgIHRhcmdldC0+Y3VyICAgPSBzb3VyY2UtPmN1ciArIG5wOworICAgIHRhcmdldC0+dG91Y2ggPSBzb3VyY2UtPnRvdWNoICsgbnA7CisKKyAgICB0YXJnZXQtPmNvbnRvdXJzID0gc291cmNlLT5jb250b3VycyArIG5jOworCisgICAgdGFyZ2V0LT5uX3BvaW50cyAgID0gMDsKKyAgICB0YXJnZXQtPm5fY29udG91cnMgPSAwOworICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBMb2FkX1NpbXBsZV9HbHlwaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBMb2FkcyBhIHNpbXBsZSAoaS5lLCBub24tY29tcG9zaXRlKSBnbHlwaC4gIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCAgKi8KKyAgLyogICAgZm9yIHRoZSBgTG9hZF9TaW1wbGUnIHN0YXRlIG9mIFRUX0xvYWRfR2x5cGgoKS4gIEFsbCBjb21wb3NpdGUgICAgICovCisgIC8qICAgIGdseXBocyBlbGVtZW50cyB3aWxsIGJlIGxvYWRlZCB3aXRoIHJvdXRpbmUuICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgc3RhdGljCisgIFRUX0Vycm9yICBMb2FkX1NpbXBsZV9HbHlwaCggVFRfRXhlY0NvbnRleHQgICBleGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgICAgICAgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX1VMb25nICAgICAgICAgYnl0ZV9jb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9TaG9ydCAgICAgICAgIG5fY29udG91cnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfU2hvcnQgICAgICAgICBsZWZ0X2NvbnRvdXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX1VTaG9ydCAgICAgICAgbGVmdF9wb2ludHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfVUludCAgICAgICAgICBsb2FkX2ZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX1N1YkdseXBoUmVjKiAgc3ViZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9Cb29sICAgICAgICAgIGRlYnVnICkKKyAgeworICAgIFRUX0Vycm9yICAgICAgIGVycm9yOworICAgIFRUX0dseXBoWm9uZSogIHB0czsKKyAgICBUVF9TaG9ydCAgICAgICBrOworICAgIFRUX1VTaG9ydCAgICAgIGo7CisgICAgVFRfVVNob3J0ICAgICAgbl9wb2ludHMsIG5faW5zOworICAgIFRUX0ZhY2UgICAgICAgIGZhY2U7CisgICAgVFRfQnl0ZSogICAgICAgZmxhZzsKKyAgICBUVF9WZWN0b3IqICAgICB2ZWM7CisgICAgVFRfRjI2RG90NiAgICAgeCwgeTsKKworICAgIFRUX1ZlY3RvciAgICAgICpwcDEsICpwcDI7CisgICAgICAgIAorCisgICAgZmFjZSA9IGV4ZWMtPmZhY2U7CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qIHNpbXBsZSBjaGVjayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgCisgICAgaWYgKCBuX2NvbnRvdXJzID4gbGVmdF9jb250b3VycyApCisgICAgeworICAgICAgRlRfVFJBQ0UwKCggIkVSUk9SOiBHbHlwaCBpbmRleCAlbGQgaGFzICVkIGNvbnRvdXJzID4gbGVmdCAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICBzdWJnbHlwaC5pbmRleCwKKyAgICAgICAgICAgICAgICAgICBuX2NvbnRvdXJzLAorICAgICAgICAgICAgICAgICAgIGxlZnRfY29udG91cnMgKSk7CisgICAgICByZXR1cm4gVFRfRXJyX1Rvb19NYW55X0NvbnRvdXJzOworICAgIH0KKworICAgIC8qIHByZXBhcmluZyB0aGUgZXhlY3V0aW9uIGNvbnRleHQgKi8KKyAgICBtb3VudF96b25lKCAmc3ViZy0+em9uZSwgJmV4ZWMtPnB0cyApOworCisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qIHJlYWRpbmcgdGhlIGNvbnRvdXJzIGVuZHBvaW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgCisgICAgaWYgKCBBQ0NFU1NfRnJhbWUoIGJ5dGVfY291bnQgKSApCisgICAgICByZXR1cm4gZXJyb3I7CisKKyAgICBmb3IgKCBrID0gMDsgayA8IG5fY29udG91cnM7IGsrKyApCisgICAgICBleGVjLT5wdHMuY29udG91cnNba10gPSBHRVRfVVNob3J0KCk7CisKKyAgICBuX3BvaW50cyA9IDA7CisgICAgaWYgKCBuX2NvbnRvdXJzID4gMCApCisgICAgICBuX3BvaW50cyA9IGV4ZWMtPnB0cy5jb250b3Vyc1tuX2NvbnRvdXJzIC0gMV0gKyAxOworCisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qIHJlYWRpbmcgdGhlIGJ5dGVjb2RlIGluc3RydWN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgCisgICAgbl9pbnMgPSBHRVRfVVNob3J0KCk7CisKKyAgICBpZiAoIG5fcG9pbnRzID4gbGVmdF9wb2ludHMgKQorICAgIHsKKyAgICAgIEZUX1RSQUNFMCgoICJFUlJPUjogVG9vIG1hbnkgcG9pbnRzIGluIGdseXBoICVsZFxuIiwgc3ViZy0+aW5kZXggKSk7CisgICAgICBlcnJvciA9IFRUX0Vycl9Ub29fTWFueV9Qb2ludHM7CisgICAgICBnb3RvIEZhaWw7CisgICAgfQorCisgICAgRlRfVFJBQ0U0KCggIkluc3RydWN0aW9ucyBzaXplIDogJWRcbiIsIG5faW5zICkpOworCisgICAgaWYgKCBuX2lucyA+IGZhY2UtPm1heF9wcm9maWxlLm1heFNpemVPZkluc3RydWN0aW9ucyApCisgICAgeworICAgICAgRlRfVFJBQ0UwKCggIkVSUk9SOiBUb28gbWFueSBpbnN0cnVjdGlvbnMhXG4iICkpOworICAgICAgZXJyb3IgPSBUVF9FcnJfVG9vX01hbnlfSW5zOworICAgICAgZ290byBGYWlsOworICAgIH0KKworICAgIGlmIChzdHJlYW0tPmN1cnNvciArIG5faW5zID4gc3RyZWFtLT5saW1pdCkKKyAgICB7CisgICAgICBGVF9UUkFDRTAoKCAiRVJST1I6IEluc3RydWN0aW9uIGNvdW50IG1pc21hdGNoIVxuIiApKTsKKyAgICAgIGVycm9yID0gVFRfRXJyX1Rvb19NYW55X0luczsKKyAgICAgIGdvdG8gRmFpbDsKKyAgICB9CisgICAgTUVNX0NvcHkoIGV4ZWMtPmdseXBoSW5zLCBzdHJlYW0tPmN1cnNvciwgbl9pbnMgKTsKKyAgICBzdHJlYW0tPmN1cnNvciArPSBuX2luczsKKworICAgIGVycm9yID0gVFRfU2V0X0NvZGVSYW5nZSggZXhlYywgdHRfY29kZXJhbmdlX2dseXBoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlYy0+Z2x5cGhJbnMsIG5faW5zICk7CisgICAgaWYgKGVycm9yKSBnb3RvIEZhaWw7CisKKyAgICAKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qIHJlYWRpbmcgdGhlIHBvaW50IGZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgCisgICAgaiAgICA9IDA7CisgICAgZmxhZyA9IGV4ZWMtPnB0cy50b3VjaDsKKworICAgIHdoaWxlICggaiA8IG5fcG9pbnRzICkKKyAgICB7CisgICAgICBUVF9CeXRlICBjLCBjbnQ7CisKKyAgICAgIGZsYWdbal0gPSBjID0gR0VUX0J5dGUoKTsKKyAgICAgIGorKzsKKworICAgICAgaWYgKCBjICYgOCApCisgICAgICB7CisgICAgICAgIGNudCA9IEdFVF9CeXRlKCk7CisKKyAgICAgICAgd2hpbGUoIGNudCA+IDAgKQorICAgICAgICB7CisgICAgICAgICAgZmxhZ1tqKytdID0gYzsKKyAgICAgICAgICBjbnQtLTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogcmVhZGluZyB0aGUgWCBjb29yZGluYXRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAKKyAgICB4ICAgID0gMDsKKyAgICB2ZWMgID0gZXhlYy0+cHRzLm9yZzsKKworICAgIGZvciAoIGogPSAwOyBqIDwgbl9wb2ludHM7IGorKyApCisgICAgeworICAgICAgaWYgKCBmbGFnW2pdICYgMiApCisgICAgICB7CisgICAgICAgIGlmICggZmxhZ1tqXSAmIDE2ICkKKyAgICAgICAgICB4ICs9IEdFVF9CeXRlKCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICB4IC09IEdFVF9CeXRlKCk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGlmICggKGZsYWdbal0gJiAxNikgPT0gMCApCisgICAgICAgICAgeCArPSBHRVRfU2hvcnQoKTsKKyAgICAgIH0KKworICAgICAgdmVjW2pdLnggPSB4OworICAgIH0KKworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiByZWFkaW5nIHRoZSBZWCBjb29yZGluYXRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAKKyAgICB5ID0gMDsKKworICAgIGZvciAoIGogPSAwOyBqIDwgbl9wb2ludHM7IGorKyApCisgICAgeworICAgICAgaWYgKCBmbGFnW2pdICYgNCApCisgICAgICB7CisgICAgICAgIGlmICggZmxhZ1tqXSAmIDMyICkKKyAgICAgICAgICB5ICs9IEdFVF9CeXRlKCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICB5IC09IEdFVF9CeXRlKCk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGlmICggKGZsYWdbal0gJiAzMikgPT0gMCApCisgICAgICAgICAgeSArPSBHRVRfU2hvcnQoKTsKKyAgICAgIH0KKworICAgICAgdmVjW2pdLnkgPSB5OworICAgIH0KKworICAgIEZPUkdFVF9GcmFtZSgpOworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiBBZGQgc2hhZG93IHBvaW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAKKyAgICAvKiBOb3cgYWRkIHRoZSB0d28gc2hhZG93IHBvaW50cyBhdCBuIGFuZCBuICsgMS4gICAgKi8KKyAgICAvKiBXZSBuZWVkIHRoZSBsZWZ0IHNpZGUgYmVhcmluZyBhbmQgYWR2YW5jZSB3aWR0aC4gKi8KKworICAgIC8qIHBwMSA9IHhNaW4gLSBsc2IgKi8KKyAgICBwcDEgICAgPSB2ZWMgKyBuX3BvaW50czsKKyAgICBwcDEtPnggPSBzdWJnLT5iYm94LnhNaW4gLSBzdWJnLT5sZWZ0X2JlYXJpbmc7CisgICAgcHAxLT55ID0gMDsKKworICAgIC8qIHBwMiA9IHBwMSArIGF3ICovCisgICAgcHAyICAgID0gcHAxICsgMTsKKyAgICBwcDItPnggPSBwcDEtPnggKyBzdWJnLT5hZHZhbmNlOworICAgIHBwMi0+eSA9IDA7CisgICAgICAgIAorICAgIC8qIGNsZWFyIHRoZSB0b3VjaCBmbGFncyAqLworICAgIGZvciAoIGogPSAwOyBqIDwgbl9wb2ludHM7IGorKyApCisgICAgICBleGVjLT5wdHMudG91Y2hbal0gJj0gRlRfQ3VydmVfVGFnX09uOworCisgICAgZXhlYy0+cHRzLnRvdWNoW25fcG9pbnRzICAgIF0gPSAwOworICAgIGV4ZWMtPnB0cy50b3VjaFtuX3BvaW50cyArIDFdID0gMDsKKworICAgIC8qIE5vdGUgdGhhdCB3ZSByZXR1cm4gdHdvIG1vcmUgcG9pbnRzIHRoYXQgYXJlIG5vdCAqLworICAgIC8qIHBhcnQgb2YgdGhlIGdseXBoIG91dGxpbmUuICAgICAgICAgICAgICAgICAgICAgICAqLworCisgICAgbl9wb2ludHMgKz0gMjsKKworICAgIC8qIG5vdyBldmVudHVhbGx5IHNjYWxlIGFuZCBoaW50IHRoZSBnbHlwaCAqLworCisgICAgcHRzID0gJmV4ZWMtPnB0czsKKyAgICBwdHMtPm5fcG9pbnRzICAgPSBuX3BvaW50czsKKyAgICBwdHMtPm5fY29udG91cnMgPSBuX2NvbnRvdXJzOworCisgICAgaWYgKGxvYWRfZmxhZ3MgJiBGVF9MT0FEX05PX1NDQUxFKQorICAgIHsKKyAgICAgIC8qIG5vIHNjYWxpbmcsIGp1c3QgY29weSB0aGUgb3JpZyBhcnJheXMgaW50byB0aGUgY3VyIG9uZXMgKi8KKyAgICAgIG9yZ190b19jdXIoIG5fcG9pbnRzLCBwdHMgKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIGZpcnN0IHNjYWxlIHRoZSBnbHlwaCBwb2ludHMgKi8KKyAgICAgIGZvciAoIGogPSAwOyBqIDwgbl9wb2ludHM7IGorKyApCisgICAgICB7CisgICAgICAgIHB0cy0+b3JnW2pdLnggPSBTQ0FMRV9YKCBwdHMtPm9yZ1tqXS54ICk7CisgICAgICAgIHB0cy0+b3JnW2pdLnkgPSBTQ0FMRV9ZKCBwdHMtPm9yZ1tqXS55ICk7CisgICAgICB9CisKKyAgICAgIC8qIGlmIGhpbnRpbmcsIHJvdW5kIHBwMSwgYW5kIHNoaWZ0IHRoZSBnbHlwaCBhY2NvcmRpbmdseSAqLworICAgICAgaWYgKCBzdWJnLT5pc19oaW50ZWQgKQorICAgICAgeworICAgICAgICB4ID0gcHRzLT5vcmdbbl9wb2ludHMgLSAyXS54OworICAgICAgICB4ID0gKCh4ICsgMzIpICYgLTY0KSAtIHg7CisgICAgICAgIHRyYW5zbGF0ZV9hcnJheSggbl9wb2ludHMsIHB0cy0+b3JnLCB4LCAwICk7CisKKyAgICAgICAgb3JnX3RvX2N1ciggbl9wb2ludHMsIHB0cyApOworCisgICAgICAgIHB0cy0+Y3VyW25fcG9pbnRzIC0gMV0ueCA9IChwdHMtPmN1cltuX3BvaW50cyAtIDFdLnggKyAzMikgJiAtNjQ7CisKKyAgICAgICAgLyogbm93IGNvbnNpZGVyIGhpbnRpbmcgKi8KKyAgICAgICAgaWYgKCBuX2lucyA+IDAgKQorICAgICAgICB7CisgICAgICAgICAgZXhlYy0+aXNfY29tcG9zaXRlICAgICA9IEZBTFNFOworICAgICAgICAgIGV4ZWMtPnBlZGFudGljX2hpbnRpbmcgPSBsb2FkX2ZsYWdzICYgRlRfTE9BRF9QRURBTlRJQzsKKworICAgICAgICAgIGVycm9yID0gVFRfUnVuX0NvbnRleHQoIGV4ZWMsIGRlYnVnICk7CisgICAgICAgICAgaWYgKCBlcnJvciAmJiBleGVjLT5wZWRhbnRpY19oaW50aW5nICkKKyAgICAgICAgICAgIHJldHVybiBlcnJvcjsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgICBvcmdfdG9fY3VyKCBuX3BvaW50cywgcHRzICk7CisgICAgfQorCisgICAgLyogc2F2ZSBnbHlwaCBwaGFudG9tIHBvaW50cyAqLworICAgIGlmICggIXN1YmctPnByZXNlcnZlX3BwcyApCisgICAgeworICAgICAgc3ViZy0+cHAxID0gcHRzLT5jdXJbbl9wb2ludHMgLSAyXTsKKyAgICAgIHN1YmctPnBwMiA9IHB0cy0+Y3VyW25fcG9pbnRzIC0gMV07CisgICAgfQorCisgICAgcmV0dXJuIFRUX0Vycl9PazsKKyAgICAKKyAgRmFpbDoKKyAgICBGT1JHRVRfRnJhbWUoKTsKKyAgICByZXR1cm4gZXJyb3I7CisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIExvYWRfQ29tcG9zaXRlX0VuZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZpbmFsaXplcyB0aGUgbG9hZGluZyBwcm9jZXNzIG9mIGEgY29tcG9zaXRlIGdseXBoIGVsZW1lbnQuICBUaGlzICAqLworICAvKiAgICBmdW5jdGlvbiBpcyB1c2VkIGZvciB0aGUgYExvYWRfRW5kJyBzdGF0ZSBvZiBUVF9Mb2FkX0dseXBoKCkuICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0YXRpYworICBUVF9FcnJvciAgTG9hZF9Db21wb3NpdGVfRW5kKCBUVF9VU2hvcnQgICAgICAgIG5fcG9pbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9TaG9ydCAgICAgICAgIG5fY29udG91cnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX0V4ZWNDb250ZXh0ICAgZXhlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfU3ViR2x5cGhSZWMqICBzdWJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gICAgICAgIHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfVUludCAgICAgICAgICBsb2FkX2ZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9Cb29sICAgICAgICAgIGRlYnVnICkKKyAgeworICAgIFRUX0Vycm9yICAgICAgIGVycm9yOworCisgICAgVFRfVVNob3J0ICAgICAgaywgbl9pbnM7CisgICAgVFRfR2x5cGhab25lKiAgcHRzOworCisgICAgaWYgKCBzdWJnLT5pc19oaW50ZWQgICAgICAgICAgICAgICAgICAgICYmCisgICAgICAgICBzdWJnLT5lbGVtZW50X2ZsYWcgJiBXRV9IQVZFX0lOU1RSICkKKyAgICB7CisgICAgICBpZiAoIFJFQURfVVNob3J0KCBuX2lucyApICkgICAgLyogcmVhZCBzaXplIG9mIGluc3RydWN0aW9ucyAqLworICAgICAgICByZXR1cm4gZXJyb3I7CisKKyAgICAgIEZUX1RSQUNFNCgoICJJbnN0cnVjdGlvbnMgc2l6ZSA9ICVkXG4iLCBuX2lucyApKTsKKworICAgICAgaWYgKCBuX2lucyA+IGV4ZWMtPmZhY2UtPm1heF9wcm9maWxlLm1heFNpemVPZkluc3RydWN0aW9ucyApCisgICAgICB7CisgICAgICAgIEZUX1RSQUNFMCgoICJUb28gbWFueSBpbnN0cnVjdGlvbnMgaW4gY29tcG9zaXRlIGdseXBoICVsZFxuIiwKKyAgICAgICAgICAgICAgICAgIHN1YmctPmluZGV4ICkpOworICAgICAgICByZXR1cm4gVFRfRXJyX1Rvb19NYW55X0luczsKKyAgICAgIH0KKworICAgICAgaWYgKCBGSUxFX1JlYWQoIGV4ZWMtPmdseXBoSW5zLCBuX2lucyApICkKKyAgICAgICAgcmV0dXJuIGVycm9yOworCisgICAgICBlcnJvciA9IFRUX1NldF9Db2RlUmFuZ2UoIGV4ZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR0X2NvZGVyYW5nZV9nbHlwaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlYy0+Z2x5cGhJbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5faW5zICk7CisgICAgICBpZiAoIGVycm9yICkKKyAgICAgICAgcmV0dXJuIGVycm9yOworICAgIH0KKyAgICBlbHNlCisgICAgICBuX2lucyA9IDA7CisKKworICAgIC8qIHByZXBhcmUgdGhlIGV4ZWN1dGlvbiBjb250ZXh0ICovCisgICAgbl9wb2ludHMgKz0gMjsKKyAgICBleGVjLT5wdHMgPSBzdWJnLT56b25lOworICAgIHB0cyAgICAgICA9ICZleGVjLT5wdHM7CisKKyAgICBwdHMtPm5fcG9pbnRzICAgPSBuX3BvaW50czsKKyAgICBwdHMtPm5fY29udG91cnMgPSBuX2NvbnRvdXJzOworCisgICAgLyogYWRkIHBoYW50b20gcG9pbnRzICovCisgICAgcHRzLT5jdXJbbl9wb2ludHMgLSAyXSA9IHN1YmctPnBwMTsKKyAgICBwdHMtPmN1cltuX3BvaW50cyAtIDFdID0gc3ViZy0+cHAyOworCisgICAgcHRzLT50b3VjaFtuX3BvaW50cyAtIDFdID0gMDsKKyAgICBwdHMtPnRvdWNoW25fcG9pbnRzIC0gMl0gPSAwOworCisgICAgLyogaWYgaGludGluZywgcm91bmQgdGhlIHBoYW50b20gcG9pbnRzICovCisgICAgaWYgKCBzdWJnLT5pc19oaW50ZWQgKQorICAgIHsKKyAgICAgIHB0cy0+Y3VyW25fcG9pbnRzIC0gMl0ueCA9ICgoc3ViZy0+cHAxLnggKyAzMikgJiAtNjQpOworICAgICAgcHRzLT5jdXJbbl9wb2ludHMgLSAxXS54ID0gKChzdWJnLT5wcDIueCArIDMyKSAmIC02NCk7CisgICAgfQorCisgICAgZm9yICggayA9IDA7IGsgPCBuX3BvaW50czsgaysrICkKKyAgICAgIHB0cy0+dG91Y2hba10gJj0gRlRfQ3VydmVfVGFnX09uOworCisgICAgY3VyX3RvX29yZyggbl9wb2ludHMsIHB0cyApOworCisgICAgLyogbm93IGNvbnNpZGVyIGhpbnRpbmcgKi8KKyAgICBpZiAoIHN1YmctPmlzX2hpbnRlZCAmJiBuX2lucyA+IDAgKQorICAgIHsKKyAgICAgIGV4ZWMtPmlzX2NvbXBvc2l0ZSAgICAgPSBUUlVFOworICAgICAgZXhlYy0+cGVkYW50aWNfaGludGluZyA9IGxvYWRfZmxhZ3MgJiBGVF9MT0FEX1BFREFOVElDOworCisgICAgICBlcnJvciA9IFRUX1J1bl9Db250ZXh0KCBleGVjLCBkZWJ1ZyApOworICAgICAgaWYgKCBlcnJvciAmJiBleGVjLT5wZWRhbnRpY19oaW50aW5nICkKKyAgICAgICAgcmV0dXJuIGVycm9yOworICAgIH0KKworICAgIC8qIHNhdmUgZ2x5cGggb3JpZ2luIGFuZCBhZHZhbmNlIHBvaW50cyAqLworICAgIHN1YmctPnBwMSA9IHB0cy0+Y3VyW25fcG9pbnRzIC0gMl07CisgICAgc3ViZy0+cHAyID0gcHRzLT5jdXJbbl9wb2ludHMgLSAxXTsKKworICAgIHJldHVybiBUVF9FcnJfT2s7CisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEluaXRfR2x5cGhfQ29tcG9uZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEluaXRpYWxpemVzIGEgZ2x5cGggY29tcG9uZW50IGZvciBmdXJ0aGVyIHByb2Nlc3NpbmcuICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgc3RhdGljCisgIHZvaWQgIEluaXRfR2x5cGhfQ29tcG9uZW50KCBUVF9TdWJHbHlwaFJlYyogIGVsZW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9TdWJHbHlwaFJlYyogIG9yaWdpbmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfRXhlY0NvbnRleHQgICBleGVjICkKKyAgeworICAgIGVsZW1lbnQtPmluZGV4ICAgICA9IC0xOworICAgIGVsZW1lbnQtPmlzX3NjYWxlZCA9IEZBTFNFOworICAgIGVsZW1lbnQtPmlzX2hpbnRlZCA9IEZBTFNFOworCisgICAgaWYgKCBvcmlnaW5hbCApCisgICAgICBtb3VudF96b25lKCAmb3JpZ2luYWwtPnpvbmUsICZlbGVtZW50LT56b25lICk7CisgICAgZWxzZQorICAgICAgZWxlbWVudC0+em9uZSA9IGV4ZWMtPnB0czsKKworICAgIGVsZW1lbnQtPnpvbmUubl9jb250b3VycyA9IDA7CisgICAgZWxlbWVudC0+em9uZS5uX3BvaW50cyAgID0gMDsKKworICAgIGVsZW1lbnQtPmFyZzEgPSAwOworICAgIGVsZW1lbnQtPmFyZzIgPSAwOworCisgICAgZWxlbWVudC0+ZWxlbWVudF9mbGFnID0gMDsKKyAgICBlbGVtZW50LT5wcmVzZXJ2ZV9wcHMgPSBGQUxTRTsKKworICAgIGVsZW1lbnQtPnRyYW5zZm9ybS54eCA9IDEgPDwgMTY7CisgICAgZWxlbWVudC0+dHJhbnNmb3JtLnh5ID0gMDsKKyAgICBlbGVtZW50LT50cmFuc2Zvcm0ueXggPSAwOworICAgIGVsZW1lbnQtPnRyYW5zZm9ybS55eSA9IDEgPDwgMTY7CisKKyAgICBlbGVtZW50LT50cmFuc2Zvcm0ub3ggPSAwOworICAgIGVsZW1lbnQtPnRyYW5zZm9ybS5veSA9IDA7CisKKyAgICBlbGVtZW50LT5sZWZ0X2JlYXJpbmcgPSAwOworICAgIGVsZW1lbnQtPmFkdmFuY2UgICAgICA9IDA7CisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX0xvYWRfR2x5cGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgZnVuY3Rpb24gdXNlZCB0byBsb2FkIGEgc2luZ2xlIGdseXBoIHdpdGhpbiBhIGdpdmVuIGdseXBoIHNsb3QsICAqLworICAvKiAgICBmb3IgYSBnaXZlbiBzaXplLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBnbHlwaCAgICAgICA6OiBBIGhhbmRsZSB0byBhIHRhcmdldCBzbG90IG9iamVjdCB3aGVyZSB0aGUgZ2x5cGggICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgd2lsbCBiZSBsb2FkZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzaXplICAgICAgICA6OiBBIGhhbmRsZSB0byB0aGUgc291cmNlIGZhY2Ugc2l6ZSBhdCB3aGljaCB0aGUgZ2x5cGggKi8KKyAgLyogICAgICAgICAgICAgICAgICAgbXVzdCBiZSBzY2FsZWQvbG9hZGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBnbHlwaF9pbmRleCA6OiBUaGUgaW5kZXggb2YgdGhlIGdseXBoIGluIHRoZSBmb250IGZpbGUuICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGxvYWRfZmxhZ3MgIDo6IEEgZmxhZyBpbmRpY2F0aW5nIHdoYXQgdG8gbG9hZCBmb3IgdGhpcyBnbHlwaC4gIFRoZSAqLworICAvKiAgICAgICAgICAgICAgICAgICBGVF9MT0FEX1hYWCBjb25zdGFudHMgY2FuIGJlIHVzZWQgdG8gY29udHJvbCB0aGUgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgZ2x5cGggbG9hZGluZyBwcm9jZXNzIChlLmcuLCB3aGV0aGVyIHRoZSBvdXRsaW5lICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgIHNob3VsZCBiZSBzY2FsZWQsIHdoZXRoZXIgdG8gbG9hZCBiaXRtYXBzIG9yIG5vdCwgICAqLworICAvKiAgICAgICAgICAgICAgICAgICB3aGV0aGVyIHRvIGhpbnQgdGhlIG91dGxpbmUsIGV0YykuICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHJlc3VsdCAgICAgIDo6IEEgc2V0IG9mIGJpdCBmbGFncyBpbmRpY2F0aW5nIHRoZSB0eXBlIG9mIGRhdGEgdGhhdCAqLworICAvKiAgICAgICAgICAgICAgICAgICB3YXMgbG9hZGVkIGluIHRoZSBnbHlwaCBzbG90IChvdXRsaW5lIG9yIGJpdG1hcCwgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgZXRjKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICBZb3UgY2FuIHNldCB0aGlzIGZpZWxkIHRvIDAgaWYgeW91IGRvbid0IHdhbnQgdGhpcyAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgaW5mb3JtYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBMT0NBTF9GVU5DCisgIFRUX0Vycm9yICBUVF9Mb2FkX0dseXBoKCBUVF9TaXplICAgICAgIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9HbHlwaFNsb3QgIGdseXBoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfVVNob3J0ICAgICBnbHlwaF9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX1VJbnQgICAgICAgbG9hZF9mbGFncyApCisgIHsKKyAgICB0eXBlZGVmIGVudW0gIFRQaGFzZXNfCisgICAgeworICAgICAgTG9hZF9FeGl0LAorICAgICAgTG9hZF9HbHlwaCwKKyAgICAgIExvYWRfSGVhZGVyLAorICAgICAgTG9hZF9TaW1wbGUsCisgICAgICBMb2FkX0NvbXBvc2l0ZSwKKyAgICAgIExvYWRfRW5kCisKKyAgICB9IFRQaGFzZXM7CisKKyAgICBUVF9FcnJvciAgIGVycm9yID0gMDsKKyAgICBGVF9TdHJlYW0gIHN0cmVhbTsKKworICAgIFRUX0ZhY2UgICAgZmFjZTsKKworICAgIFRUX1VTaG9ydCAgbnVtX3BvaW50czsKKyAgICBUVF9TaG9ydCAgIG51bV9jb250b3VyczsKKyAgICBUVF9VU2hvcnQgIGxlZnRfcG9pbnRzOworICAgIFRUX1Nob3J0ICAgbGVmdF9jb250b3VyczsKKworICAgIFRUX1VMb25nICAgbG9hZF90b3A7CisgICAgVFRfTG9uZyAgICBrLCBsOworICAgIFRUX0ludCAgICAgbmV3X2ZsYWdzOworICAgIFRUX1VTaG9ydCAgaW5kZXg7CisgICAgVFRfVVNob3J0ICB1OworICAgIFRUX0xvbmcgICAgY291bnQ7CisKKyAgICBUVF9Mb25nICBnbHlwaF9vZmZzZXQsIG9mZnNldDsKKworICAgIFRUX0YyNkRvdDYgIHgsIHksIG54LCBueTsKKworICAgIFRUX0ZpeGVkICB4eCwgeHksIHl4LCB5eTsKKyAgICBUVF9CQm94ICAgYmJveDsKKworICAgIFRUX0V4ZWNDb250ZXh0ICBleGVjOworCisgICAgVFRfU3ViR2x5cGhSZWMgKnN1YmdseXBoLCAqc3ViZ2x5cGgyOworCisgICAgVFRfR2x5cGhab25lIGJhc2VfcHRzOworCisgICAgVFBoYXNlcyAgIHBoYXNlOworICAgIFRUX0J5dGUqICB3aWR0aHM7CisKKyAgICBTRk5UX0ludGVyZmFjZSogIHNmbnQ7CisgICAgCisgICAgLyogZmlyc3Qgb2YgYWxsLCBjaGVjayBhcmd1bWVudHMgKi8KKyAgICBpZiAoICFnbHlwaCApCisgICAgICByZXR1cm4gVFRfRXJyX0ludmFsaWRfR2x5cGhfSGFuZGxlOworCisgICAgZmFjZSA9IChUVF9GYWNlKWdseXBoLT5mYWNlOworICAgIGlmICggIWZhY2UgKQorICAgICAgcmV0dXJuIFRUX0Vycl9JbnZhbGlkX0dseXBoX0hhbmRsZTsKKworICAgIHNmbnQgICA9IChTRk5UX0ludGVyZmFjZSopZmFjZS0+c2ZudDsKKyAgICBzdHJlYW0gPSBmYWNlLT5yb290LnN0cmVhbTsKKyAgICBjb3VudCAgPSAwOworICAgIAorICAgIGlmICggZ2x5cGhfaW5kZXggPj0gZmFjZS0+cm9vdC5udW1fZ2x5cGhzICkKKyAgICAgIHJldHVybiBUVF9FcnJfSW52YWxpZF9HbHlwaF9JbmRleDsKKworICAgIGlmICggIXNpemUgfHwgKGxvYWRfZmxhZ3MgJiBGVF9MT0FEX05PX1NDQUxFKSApCisgICAgeworICAgICAgc2l6ZSAgICAgICAgPSBOVUxMOworICAgICAgbG9hZF9mbGFncyB8PSBGVF9MT0FEX05PX1NDQUxFICAgfAorICAgICAgICAgICAgICAgICAgICBGVF9MT0FEX05PX0hJTlRJTkcgfAorICAgICAgICAgICAgICAgICAgICBGVF9MT0FEX05PX0JJVE1BUDsKKyAgICB9CisKKyAgICAvKiBUcnkgdG8gbG9hZCBlbWJlZGRlZCBiaXRtYXAgaWYgYW55ICovCisgICAgaWYgKCBzaXplICYmIChsb2FkX2ZsYWdzICYgRlRfTE9BRF9OT19CSVRNQVApID09IDAgJiYgc2ZudC0+bG9hZF9zYml0cyApCisgICAgeworICAgICAgVFRfU0JpdF9NZXRyaWNzICBtZXRyaWNzOworIAorICAgICAgZXJyb3IgPSBzZm50LT5sb2FkX3NiaXRfaW1hZ2UoIGZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZS0+cm9vdC5tZXRyaWNzLnhfcHBlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLT5yb290Lm1ldHJpY3MueV9wcGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBoX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2x5cGgtPmJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWV0cmljcyApOworICAgICAgaWYgKCAhZXJyb3IgKQorICAgICAgeworICAgICAgICBnbHlwaC0+b3V0bGluZS5uX3BvaW50cyAgID0gMDsKKyAgICAgICAgZ2x5cGgtPm91dGxpbmUubl9jb250b3VycyA9IDA7CisKKyAgICAgICAgZ2x5cGgtPm1ldHJpY3Mud2lkdGggID0gKFRUX1BvcyltZXRyaWNzLndpZHRoICA8PCA2OworICAgICAgICBnbHlwaC0+bWV0cmljcy5oZWlnaHQgPSAoVFRfUG9zKW1ldHJpY3MuaGVpZ2h0IDw8IDY7CisKKyAgICAgICAgZ2x5cGgtPm1ldHJpY3MuaG9yaUJlYXJpbmdYID0gKFRUX1BvcyltZXRyaWNzLmhvcmlCZWFyaW5nWCA8PCA2OworICAgICAgICBnbHlwaC0+bWV0cmljcy5ob3JpQmVhcmluZ1kgPSAoVFRfUG9zKW1ldHJpY3MuaG9yaUJlYXJpbmdZIDw8IDY7CisgICAgICAgIGdseXBoLT5tZXRyaWNzLmhvcmlBZHZhbmNlICA9IChUVF9Qb3MpbWV0cmljcy5ob3JpQWR2YW5jZSAgPDwgNjsKKworICAgICAgICBnbHlwaC0+bWV0cmljcy52ZXJ0QmVhcmluZ1ggPSAoVFRfUG9zKW1ldHJpY3MudmVydEJlYXJpbmdYIDw8IDY7CisgICAgICAgIGdseXBoLT5tZXRyaWNzLnZlcnRCZWFyaW5nWSA9IChUVF9Qb3MpbWV0cmljcy52ZXJ0QmVhcmluZ1kgPDwgNjsKKyAgICAgICAgZ2x5cGgtPm1ldHJpY3MudmVydEFkdmFuY2UgID0gKFRUX1BvcyltZXRyaWNzLnZlcnRBZHZhbmNlICA8PCA2OworCisgICAgICAgIGdseXBoLT5mb3JtYXQgPSBmdF9nbHlwaF9mb3JtYXRfYml0bWFwOworICAgICAgICByZXR1cm4gZXJyb3I7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKCBsb2FkX2ZsYWdzICYgRlRfTE9BRF9OT19PVVRMSU5FICkKKyAgICAgIHJldHVybiAoIGVycm9yID8gZXJyb3IgOiBUVF9FcnJfVW5hdmFpbGFibGVfQml0bWFwICk7CisKKyAgICBlcnJvciA9IGZhY2UtPmdvdG9fdGFibGUoIGZhY2UsIFRUQUdfZ2x5Ziwgc3RyZWFtLCAwICk7CisgICAgaWYgKGVycm9yKQorICAgIHsKKyAgICAgIEZUX0VSUk9SKCggIlRULkdMb2FkOiBjb3VsZCBub3QgYWNjZXNzIGdseXBoIHRhYmxlXG4iICkpOworICAgICAgcmV0dXJuIGVycm9yOworICAgIH0KKworICAgIGdseXBoX29mZnNldCA9IEZJTEVfUG9zKCk7CisKKyAgICAvKiBxdWVyeSBuZXcgZXhlY3V0aW9uIGNvbnRleHQgKi8KKworICAgIGlmICggc2l6ZSAmJiBzaXplLT5kZWJ1ZyApCisgICAgICBleGVjID0gc2l6ZS0+Y29udGV4dDsKKyAgICBlbHNlCisgICAgICBleGVjID0gVFRfTmV3X0NvbnRleHQoIGZhY2UgKTsKKworICAgIGlmICggIWV4ZWMgKQorICAgICAgcmV0dXJuIFRUX0Vycl9Db3VsZF9Ob3RfRmluZF9Db250ZXh0OworCisgICAgVFRfTG9hZF9Db250ZXh0KCBleGVjLCBmYWNlLCBzaXplICk7CisKKyAgICBpZiAoIHNpemUgKQorICAgIHsKKyAgICAgIC8qIGxvYWQgZGVmYXVsdCBncmFwaGljcyBzdGF0ZSAtIGlmIG5lZWRlZCAqLworICAgICAgaWYgKCBzaXplLT5HUy5pbnN0cnVjdF9jb250cm9sICYgMiApCisgICAgICAgIGV4ZWMtPkdTID0gdHRfZGVmYXVsdF9ncmFwaGljc19zdGF0ZTsKKworICAgICAgZ2x5cGgtPm91dGxpbmUuaGlnaF9wcmVjaXNpb24gPSAoIHNpemUtPnJvb3QubWV0cmljcy55X3BwZW0gPCAyNCApOworICAgIH0KKworICAgIC8qIHNhdmUgaXRzIGNyaXRpY2FsIHBvaW50ZXJzLCBhcyB0aGV5J2xsIGJlIG1vZGlmaWVkIGR1cmluZyBsb2FkICovCisgICAgYmFzZV9wdHMgPSBleGVjLT5wdHM7CisKKyAgICAvKiBpbml0IHZhcmlhYmxlcyAqLworICAgIGxlZnRfcG9pbnRzICAgPSBmYWNlLT5yb290Lm1heF9wb2ludHM7ICAgIC8qIHJlbW92ZSBwaGFudG9tIHBvaW50cyAqLworICAgIGxlZnRfY29udG91cnMgPSBmYWNlLT5yb290Lm1heF9jb250b3VyczsKKworICAgIG51bV9wb2ludHMgICA9IDA7CisgICAgbnVtX2NvbnRvdXJzID0gMDsKKworICAgIGxvYWRfdG9wID0gMDsKKyAgICBzdWJnbHlwaCA9IGV4ZWMtPmxvYWRTdGFjazsKKworICAgIEluaXRfR2x5cGhfQ29tcG9uZW50KCBzdWJnbHlwaCwgTlVMTCwgZXhlYyApOworCisgICAgc3ViZ2x5cGgtPmluZGV4ICAgICA9IGdseXBoX2luZGV4OworICAgIHN1YmdseXBoLT5pc19oaW50ZWQgPSAhKGxvYWRfZmxhZ3MgJiBGVF9MT0FEX05PX0hJTlRJTkcpOworCisgICAgLyogd2hlbiB0aGUgY3Z0IHByb2dyYW0gaGFzIGRpc2FibGVkIGhpbnRpbmcsIHRoZSBhcmd1bWVudCAqLworICAgIC8qIGlzIGlnbm9yZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBpZiAoIHNpemUgJiYgKHNpemUtPkdTLmluc3RydWN0X2NvbnRyb2wgJiAxKSApCisgICAgICBzdWJnbHlwaC0+aXNfaGludGVkID0gRkFMU0U7CisKKyAgICAvKiBNYWluIGxvYWRpbmcgbG9vcCAqLworCisgICAgcGhhc2UgPSBMb2FkX0dseXBoOworICAgIGluZGV4ID0gMDsKKworICAgIHdoaWxlICggcGhhc2UgIT0gTG9hZF9FeGl0ICkKKyAgICB7CisgICAgICBzdWJnbHlwaCA9IGV4ZWMtPmxvYWRTdGFjayArIGxvYWRfdG9wOworCisgICAgICBzd2l0Y2ggKCBwaGFzZSApCisgICAgICB7CisKKyAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgLyogTG9hZF9HbHlwaCBzdGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgLyogICByZWFkaW5nIGEgZ2x5cGgncyBnZW5lcmljIGRhdGEsIGNoZWNraW5nIHdoZXRoZXIgdGhlICAgKi8KKyAgICAgICAgLyogICBnbHlwaCBpcyBjYWNoZWQgYWxyZWFkeSAobm90IGltcGxlbWVudGVkIHlldCkgICAgICAgICAgKi8KKyAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgLyogZXhpdCBzdGF0ZXM6IExvYWRfSGVhZGVyIGFuZCBMb2FkX0VuZCAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgIGNhc2UgTG9hZF9HbHlwaDoKKyAgICAgICAgLyogY2hlY2sgZ2x5cGggaW5kZXggYW5kIHRhYmxlICovCisKKyAgICAgICAgaW5kZXggPSAoVFRfVUludClzdWJnbHlwaC0+aW5kZXg7CisgICAgICAgIGlmICggaW5kZXggPj0gZmFjZS0+cm9vdC5udW1fZ2x5cGhzICkKKyAgICAgICAgeworICAgICAgICAgIGVycm9yID0gVFRfRXJyX0ludmFsaWRfR2x5cGhfSW5kZXg7CisgICAgICAgICAgZ290byBGYWlsOworICAgICAgICB9CisKKyAgICAgICAgLyogZ2V0IGhvcml6b250YWwgbWV0cmljcyAqLworICAgICAgICB7CisgICAgICAgICAgVFRfU2hvcnQgICBsZWZ0X2JlYXJpbmc7CisgICAgICAgICAgVFRfVVNob3J0ICBhZHZhbmNlX3dpZHRoOworCisKKyAgICAgICAgICBHZXRfSE1ldHJpY3MoIGZhY2UsIGluZGV4LCBUUlVFLAorICAgICAgICAgICAgICAgICAgICAgICAgJmxlZnRfYmVhcmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICZhZHZhbmNlX3dpZHRoICk7CisKKyAgICAgICAgICBzdWJnbHlwaC0+bGVmdF9iZWFyaW5nID0gbGVmdF9iZWFyaW5nOworICAgICAgICAgIHN1YmdseXBoLT5hZHZhbmNlICAgICAgPSBhZHZhbmNlX3dpZHRoOworICAgICAgICB9CisKKyAgICAgICAgcGhhc2UgPSBMb2FkX0hlYWRlcjsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgLyogTG9hZF9IZWFkZXIgc3RhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgLyogICByZWFkaW5nIGEgZ2x5cGgncyBnZW5lcmljIGhlYWRlciB0byBkZXRlcm1pbmUgd2hldGhlciAgKi8KKyAgICAgICAgLyogICBpdCBpcyBhIHNpbXBsZSBvciBjb21wb3NpdGUgZ2x5cGggICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgLyogZXhpdCBzdGF0ZXM6IExvYWRfU2ltcGxlIGFuZCBMb2FkX0NvbXBvc2l0ZSAgICAgICAgICAgICAgKi8KKyAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgIGNhc2UgTG9hZF9IZWFkZXI6CisgICAgICAgIC8qIGxvYWQgZ2x5cGggKi8KKworICAgICAgICBvZmZzZXQgPSBmYWNlLT5nbHlwaF9sb2NhdGlvbnNbaW5kZXhdOworICAgICAgICBjb3VudCAgPSAwOworICAgICAgICBpZiAoaW5kZXggPCBmYWNlLT5udW1fbG9jYXRpb25zLTEpCisgICAgICAgICAgY291bnQgPSBmYWNlLT5nbHlwaF9sb2NhdGlvbnNbaW5kZXgrMV0gLSBvZmZzZXQ7CisKKyAgICAgICAgaWYgKCBpbmRleCA8ICggZmFjZS0+bnVtX2xvY2F0aW9ucyAtIDEgKSAmJiBjb3VudCA9PSAwICkKKyAgICAgICAgeworICAgICAgICAgIC8qIGFzIGRlc2NyaWJlZCBieSBGcmVkZXJpYyBMb3llciwgdGhlc2UgYXJlIHNwYWNlcywgYW5kICovCisgICAgICAgICAgLyogbm90IHRoZSB1bmtub3duIGdseXBoLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICAgICAgICAgIG51bV9jb250b3VycyA9IDA7CisgICAgICAgICAgbnVtX3BvaW50cyAgID0gMDsKKworICAgICAgICAgIHN1YmdseXBoLT5iYm94LnhNaW4gPSAwOworICAgICAgICAgIHN1YmdseXBoLT5iYm94LnhNYXggPSAwOworICAgICAgICAgIHN1YmdseXBoLT5iYm94LnlNaW4gPSAwOworICAgICAgICAgIHN1YmdseXBoLT5iYm94LnlNYXggPSAwOworCisgICAgICAgICAgc3ViZ2x5cGgtPnBwMS54ID0gMDsKKyAgICAgICAgICBzdWJnbHlwaC0+cHAyLnggPSBzdWJnbHlwaC0+YWR2YW5jZTsKKworICAgICAgICAgIGlmICggIShsb2FkX2ZsYWdzICYgRlRfTE9BRF9OT19TQ0FMRSkgKQorICAgICAgICAgICAgc3ViZ2x5cGgtPnBwMi54ID0gU0NBTEVfWCggc3ViZ2x5cGgtPnBwMi54ICk7CisKKyAgICAgICAgICBleGVjLT5nbHlwaFNpemUgPSAwOworICAgICAgICAgIHBoYXNlID0gTG9hZF9FbmQ7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBvZmZzZXQgPSBnbHlwaF9vZmZzZXQgKyBvZmZzZXQ7CisKKyAgICAgICAgLyogcmVhZCBmaXJzdCBnbHlwaCBoZWFkZXIgKi8KKyAgICAgICAgaWYgKCBGSUxFX1NlZWsoIG9mZnNldCApIHx8CisgICAgICAgICAgICAgQUNDRVNTX0ZyYW1lKCAxMEwgKSApCisgICAgICAgICAgZ290byBGYWlsX0ZpbGU7CisKKyAgICAgICAgbnVtX2NvbnRvdXJzID0gR0VUX1Nob3J0KCk7CisKKyAgICAgICAgc3ViZ2x5cGgtPmJib3gueE1pbiA9IEdFVF9TaG9ydCgpOworICAgICAgICBzdWJnbHlwaC0+YmJveC55TWluID0gR0VUX1Nob3J0KCk7CisgICAgICAgIHN1YmdseXBoLT5iYm94LnhNYXggPSBHRVRfU2hvcnQoKTsKKyAgICAgICAgc3ViZ2x5cGgtPmJib3gueU1heCA9IEdFVF9TaG9ydCgpOworCisgICAgICAgIEZPUkdFVF9GcmFtZSgpOworCisgICAgICAgIEZUX1RSQUNFNigoICJHbHlwaCAlbGRcbiIsIGluZGV4ICkpOworICAgICAgICBGVF9UUkFDRTYoKCAiICMgb2YgY29udG91cnMgOiAlZFxuIiwgbnVtX2NvbnRvdXJzICkpOworICAgICAgICBGVF9UUkFDRTYoKCAiIHhNaW46ICU0ZCAgeE1heDogJTRkXG4iLAorICAgICAgICAgICAgICAgICAgICAgc3ViZ2x5cGgtPmJib3gueE1pbiwKKyAgICAgICAgICAgICAgICAgICAgIHN1YmdseXBoLT5iYm94LnhNYXggKSk7CisgICAgICAgIEZUX1RSQUNFNigoICIgeU1pbjogJTRkICB5TWF4OiAlNGRcbiIsCisgICAgICAgICAgICAgICAgICAgICBzdWJnbHlwaC0+YmJveC55TWluLAorICAgICAgICAgICAgICAgICAgICAgc3ViZ2x5cGgtPmJib3gueU1heCApKTsKKyAgICAgICAgRlRfVFJBQ0U2KCggIi0iICkpOworCisgICAgICAgIGNvdW50IC09IDEwOworCisgICAgICAgIGlmICggbnVtX2NvbnRvdXJzID4gbGVmdF9jb250b3VycyApCisgICAgICAgIHsKKyAgICAgICAgICBGVF9UUkFDRTAoKCAiRVJST1I6IFRvbyBtYW55IGNvbnRvdXJzIGZvciBnbHlwaCAlbGRcbiIsIGluZGV4ICkpOworICAgICAgICAgIGVycm9yID0gVFRfRXJyX1Rvb19NYW55X0NvbnRvdXJzOworICAgICAgICAgIGdvdG8gRmFpbDsKKyAgICAgICAgfQorCisgICAgICAgIHN1YmdseXBoLT5wcDEueCA9IHN1YmdseXBoLT5iYm94LnhNaW4gLSBzdWJnbHlwaC0+bGVmdF9iZWFyaW5nOworICAgICAgICBzdWJnbHlwaC0+cHAxLnkgPSAwOworICAgICAgICBzdWJnbHlwaC0+cHAyLnggPSBzdWJnbHlwaC0+cHAxLnggKyBzdWJnbHlwaC0+YWR2YW5jZTsKKyAgICAgICAgaWYgKCEobG9hZF9mbGFncyAmIEZUX0xPQURfTk9fU0NBTEUpKQorICAgICAgICB7CisgICAgICAgICAgc3ViZ2x5cGgtPnBwMS54ID0gU0NBTEVfWCggc3ViZ2x5cGgtPnBwMS54ICk7CisgICAgICAgICAgc3ViZ2x5cGgtPnBwMi54ID0gU0NBTEVfWCggc3ViZ2x5cGgtPnBwMi54ICk7CisgICAgICAgIH0KKworICAgICAgICAvKiBpcyBpdCBhIHNpbXBsZSBnbHlwaCA/ICovCisgICAgICAgIGlmICggbnVtX2NvbnRvdXJzID4gMCApCisgICAgICAgICAgcGhhc2UgPSBMb2FkX1NpbXBsZTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHBoYXNlID0gTG9hZF9Db21wb3NpdGU7CisKKyAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgLyogTG9hZF9TaW1wbGUgc3RhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgLyogICByZWFkaW5nIGEgc2ltcGxlIGdseXBoIChudW1fY29udG91cnMgbXVzdCBiZSBzZXQgdG8gICAgKi8KKyAgICAgICAgLyogICB0aGUgZ2x5cGgncyBudW1iZXIgb2YgY29udG91cnMuKSAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgLyogZXhpdCBzdGF0ZTogTG9hZF9FbmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgIGNhc2UgTG9hZF9TaW1wbGU6CisgICAgICAgIG5ld19mbGFncyA9IGxvYWRfZmxhZ3M7CisKKyAgICAgICAgLyogZGlzYWJsZSBoaW50aW5nIHdoZW4gc2NhbGluZyAqLworICAgICAgICBpZiAoICFzdWJnbHlwaC0+aXNfaGludGVkICkKKyAgICAgICAgICBuZXdfZmxhZ3MgfD0gRlRfTE9BRF9OT19ISU5USU5HOworCisgICAgICAgIGVycm9yID0gTG9hZF9TaW1wbGVfR2x5cGgoIGV4ZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9jb250b3VycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdF9jb250b3VycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdF9wb2ludHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld19mbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViZ2x5cGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChUVF9Cb29sKShzaXplICYmIHNpemUtPmRlYnVnICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkX3RvcCA9PSAwKSApOworICAgICAgICBpZiAoIGVycm9yICkKKyAgICAgICAgICBnb3RvIEZhaWw7CisKKyAgICAgICAgLyogTm90ZTogV2UgY291bGQgaGF2ZSBwdXQgdGhlIHNpbXBsZSBsb2FkZXIgc291cmNlIHRoZXJlICovCisgICAgICAgIC8qICAgICAgIGJ1dCB0aGUgY29kZSBpcyBmYXQgZW5vdWdoIGFscmVhZHkgOi0pICAgICAgICAgICAqLworCisgICAgICAgIG51bV9wb2ludHMgPSBleGVjLT5wdHMubl9wb2ludHMgLSAyOworCisgICAgICAgIHBoYXNlID0gTG9hZF9FbmQ7CisKKyAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgLyogTG9hZF9Db21wb3NpdGUgc3RhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgLyogICByZWFkaW5nIGEgY29tcG9zaXRlIGdseXBoIGhlYWRlciBhbmQgcHVzaGluZyBhIG5ldyAgICAgKi8KKyAgICAgICAgLyogICBsb2FkIGVsZW1lbnQgb24gdGhlIHN0YWNrLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgLyogZXhpdCBzdGF0ZTogTG9hZF9HbHlwaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgY2FzZSBMb2FkX0NvbXBvc2l0ZToKKworICAgICAgICAvKiBjcmVhdGUgYSBuZXcgZWxlbWVudCBvbiB0aGUgc3RhY2sgKi8KKyAgICAgICAgbG9hZF90b3ArKzsKKworICAgICAgICBpZiAoIGxvYWRfdG9wID4gZmFjZS0+bWF4X2NvbXBvbmVudHMgKQorICAgICAgICB7CisgICAgICAgICAgZXJyb3IgPSBUVF9FcnJfSW52YWxpZF9Db21wb3NpdGU7CisgICAgICAgICAgZ290byBGYWlsOworICAgICAgICB9CisKKyAgICAgICAgc3ViZ2x5cGgyID0gZXhlYy0+bG9hZFN0YWNrICsgbG9hZF90b3A7CisKKyAgICAgICAgSW5pdF9HbHlwaF9Db21wb25lbnQoIHN1YmdseXBoMiwgc3ViZ2x5cGgsIE5VTEwgKTsKKyAgICAgICAgc3ViZ2x5cGgyLT5pc19oaW50ZWQgPSBzdWJnbHlwaC0+aXNfaGludGVkOworCisgICAgICAgIC8qIG5vdyByZWFkIGNvbXBvc2l0ZSBoZWFkZXIgKi8KKworICAgICAgICBpZiAoIEFDQ0VTU19GcmFtZSggNEwgKSApCisgICAgICAgICAgZ290byBGYWlsX0ZpbGU7CisKKyAgICAgICAgc3ViZ2x5cGgtPmVsZW1lbnRfZmxhZyA9IG5ld19mbGFncyA9IEdFVF9VU2hvcnQoKTsKKworICAgICAgICBzdWJnbHlwaDItPmluZGV4ID0gR0VUX1VTaG9ydCgpOworCisgICAgICAgIEZPUkdFVF9GcmFtZSgpOworCisgICAgICAgIGsgPSAxKzE7CisKKyAgICAgICAgaWYgKCBuZXdfZmxhZ3MgJiBBUkdTX0FSRV9XT1JEUyApCisgICAgICAgICAgayAqPSAyOworCisgICAgICAgIGlmICggbmV3X2ZsYWdzICYgV0VfSEFWRV9BX1NDQUxFICkKKyAgICAgICAgICBrICs9IDI7CisKKyAgICAgICAgZWxzZSBpZiAoIG5ld19mbGFncyAmIFdFX0hBVkVfQU5fWFlfU0NBTEUgKQorICAgICAgICAgIGsgKz0gNDsKKworICAgICAgICBlbHNlIGlmICggbmV3X2ZsYWdzICYgV0VfSEFWRV9BXzJYMiApCisgICAgICAgICAgayArPSA4OworCisgICAgICAgIGlmICggQUNDRVNTX0ZyYW1lKCBrICkgKQorICAgICAgICAgIGdvdG8gRmFpbF9GaWxlOworCisgICAgICAgIGlmICggbmV3X2ZsYWdzICYgQVJHU19BUkVfV09SRFMgKQorICAgICAgICB7CisgICAgICAgICAgayA9IEdFVF9TaG9ydCgpOworICAgICAgICAgIGwgPSBHRVRfU2hvcnQoKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBrID0gR0VUX0NoYXIoKTsKKyAgICAgICAgICBsID0gR0VUX0NoYXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIHN1YmdseXBoLT5hcmcxID0gazsKKyAgICAgICAgc3ViZ2x5cGgtPmFyZzIgPSBsOworCisgICAgICAgIGlmICggbmV3X2ZsYWdzICYgQVJHU19BUkVfWFlfVkFMVUVTICkKKyAgICAgICAgeworICAgICAgICAgIHN1YmdseXBoLT50cmFuc2Zvcm0ub3ggPSBrOworICAgICAgICAgIHN1YmdseXBoLT50cmFuc2Zvcm0ub3kgPSBsOworICAgICAgICB9CisKKyAgICAgICAgeHggPSAxIDw8IDE2OworICAgICAgICB4eSA9IDA7CisgICAgICAgIHl4ID0gMDsKKyAgICAgICAgeXkgPSAxIDw8IDE2OworCisgICAgICAgIGlmICggbmV3X2ZsYWdzICYgV0VfSEFWRV9BX1NDQUxFICkKKyAgICAgICAgeworICAgICAgICAgIHh4ID0gKFRUX0ZpeGVkKUdFVF9TaG9ydCgpIDw8IDI7CisgICAgICAgICAgeXkgPSB4eDsKKyAgICAgICAgICBzdWJnbHlwaDItPmlzX3NjYWxlZCA9IFRSVUU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIG5ld19mbGFncyAmIFdFX0hBVkVfQU5fWFlfU0NBTEUgKQorICAgICAgICB7CisgICAgICAgICAgeHggPSAoVFRfRml4ZWQpR0VUX1Nob3J0KCkgPDwgMjsKKyAgICAgICAgICB5eSA9IChUVF9GaXhlZClHRVRfU2hvcnQoKSA8PCAyOworICAgICAgICAgIHN1YmdseXBoMi0+aXNfc2NhbGVkID0gVFJVRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICggbmV3X2ZsYWdzICYgV0VfSEFWRV9BXzJYMiApCisgICAgICAgIHsKKyAgICAgICAgICB4eCA9IChUVF9GaXhlZClHRVRfU2hvcnQoKSA8PCAyOworICAgICAgICAgIHh5ID0gKFRUX0ZpeGVkKUdFVF9TaG9ydCgpIDw8IDI7CisgICAgICAgICAgeXggPSAoVFRfRml4ZWQpR0VUX1Nob3J0KCkgPDwgMjsKKyAgICAgICAgICB5eSA9IChUVF9GaXhlZClHRVRfU2hvcnQoKSA8PCAyOworICAgICAgICAgIHN1YmdseXBoMi0+aXNfc2NhbGVkID0gVFJVRTsKKyAgICAgICAgfQorCisgICAgICAgIEZPUkdFVF9GcmFtZSgpOworCisgICAgICAgIHN1YmdseXBoLT50cmFuc2Zvcm0ueHggPSB4eDsKKyAgICAgICAgc3ViZ2x5cGgtPnRyYW5zZm9ybS54eSA9IHh5OworICAgICAgICBzdWJnbHlwaC0+dHJhbnNmb3JtLnl4ID0geXg7CisgICAgICAgIHN1YmdseXBoLT50cmFuc2Zvcm0ueXkgPSB5eTsKKworICAgICAgICBrID0gRlRfTXVsRml4KCB4eCwgeXkgKSAtICBGVF9NdWxGaXgoIHh5LCB5eCApOworCisgICAgICAgIC8qIGRpc2FibGUgaGludGluZyBpbiBjYXNlIG9mIHNjYWxpbmcvc2xhbnRpbmcgKi8KKyAgICAgICAgaWYgKCBBQlMoIGsgKSAhPSAoMSA8PCAxNikgKQorICAgICAgICAgIHN1YmdseXBoMi0+aXNfaGludGVkID0gRkFMU0U7CisKKyAgICAgICAgc3ViZ2x5cGgtPmZpbGVfb2Zmc2V0ID0gRklMRV9Qb3MoKTsKKworICAgICAgICBwaGFzZSA9IExvYWRfR2x5cGg7CisKKyAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgLyogTG9hZF9FbmQgc3RhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgLyogICBhZnRlciBsb2FkaW5nIGEgZ2x5cGgsIGFwcGx5IHRyYW5zZm9ybWF0aW9uIGFuZCBvZmZzZXQgKi8KKyAgICAgICAgLyogICB3aGVyZSBuZWNlc3NhcnksIHBvcCBlbGVtZW50IGFuZCBjb250aW51ZSBvciBzdG9wICAgICAgKi8KKyAgICAgICAgLyogICBwcm9jZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgLyogZXhpdCBzdGF0ZXM6IExvYWRfQ29tcG9zaXRlIGFuZCBMb2FkX0V4aXQgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgIGNhc2UgTG9hZF9FbmQ6CisgICAgICAgIGlmICggbG9hZF90b3AgPiAwICkKKyAgICAgICAgeworICAgICAgICAgIHN1YmdseXBoMiA9IHN1YmdseXBoOworCisgICAgICAgICAgbG9hZF90b3AtLTsKKyAgICAgICAgICBzdWJnbHlwaCA9IGV4ZWMtPmxvYWRTdGFjayArIGxvYWRfdG9wOworCisgICAgICAgICAgLyogY2hlY2sgYWR2YW5jZSB3aWR0aCBhbmQgbGVmdCBzaWRlIGJlYXJpbmcgKi8KKworICAgICAgICAgIGlmICggIXN1YmdseXBoLT5wcmVzZXJ2ZV9wcHMgJiYKKyAgICAgICAgICAgICAgIHN1YmdseXBoLT5lbGVtZW50X2ZsYWcgJiBVU0VfTVlfTUVUUklDUyApCisgICAgICAgICAgeworICAgICAgICAgICAgc3ViZ2x5cGgtPmxlZnRfYmVhcmluZyA9IHN1YmdseXBoMi0+bGVmdF9iZWFyaW5nOworICAgICAgICAgICAgc3ViZ2x5cGgtPmFkdmFuY2UgICAgICA9IHN1YmdseXBoMi0+YWR2YW5jZTsKKworICAgICAgICAgICAgc3ViZ2x5cGgtPnBwMSA9IHN1YmdseXBoMi0+cHAxOworICAgICAgICAgICAgc3ViZ2x5cGgtPnBwMiA9IHN1YmdseXBoMi0+cHAyOworCisgICAgICAgICAgICBzdWJnbHlwaC0+cHJlc2VydmVfcHBzID0gVFJVRTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICAvKiBhcHBseSBzY2FsZSAqLworCisgICAgICAgICAgaWYgKCBzdWJnbHlwaDItPmlzX3NjYWxlZCApCisgICAgICAgICAgeworICAgICAgICAgICAgVFRfVmVjdG9yKiAgY3VyID0gc3ViZ2x5cGgyLT56b25lLmN1cjsKKyAgICAgICAgICAgIFRUX1ZlY3RvciogIG9yZyA9IHN1YmdseXBoMi0+em9uZS5vcmc7CisKKworICAgICAgICAgICAgZm9yICggdSA9IDA7IHUgPCBudW1fcG9pbnRzOyB1KysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBueCA9IEZUX011bEZpeCggY3VyLT54LCBzdWJnbHlwaC0+dHJhbnNmb3JtLnh4ICkgKworICAgICAgICAgICAgICAgICAgIEZUX011bEZpeCggY3VyLT55LCBzdWJnbHlwaC0+dHJhbnNmb3JtLnl4ICk7CisKKyAgICAgICAgICAgICAgbnkgPSBGVF9NdWxGaXgoIGN1ci0+eCwgc3ViZ2x5cGgtPnRyYW5zZm9ybS54eSApICsKKyAgICAgICAgICAgICAgICAgICBGVF9NdWxGaXgoIGN1ci0+eSwgc3ViZ2x5cGgtPnRyYW5zZm9ybS55eSApOworCisgICAgICAgICAgICAgIGN1ci0+eCA9IG54OworICAgICAgICAgICAgICBjdXItPnkgPSBueTsKKworICAgICAgICAgICAgICBueCA9IEZUX011bEZpeCggb3JnLT54LCBzdWJnbHlwaC0+dHJhbnNmb3JtLnh4ICkgKworICAgICAgICAgICAgICAgICAgIEZUX011bEZpeCggb3JnLT55LCBzdWJnbHlwaC0+dHJhbnNmb3JtLnl4ICk7CisKKyAgICAgICAgICAgICAgbnkgPSBGVF9NdWxGaXgoIG9yZy0+eCwgc3ViZ2x5cGgtPnRyYW5zZm9ybS54eSApICsKKyAgICAgICAgICAgICAgICAgICBGVF9NdWxGaXgoIG9yZy0+eSwgc3ViZ2x5cGgtPnRyYW5zZm9ybS55eSApOworCisgICAgICAgICAgICAgIG9yZy0+eCA9IG54OworICAgICAgICAgICAgICBvcmctPnkgPSBueTsKKworICAgICAgICAgICAgICBjdXIrKzsKKyAgICAgICAgICAgICAgb3JnKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgLyogYWRqdXN0IGNvdW50cyAqLworCisgICAgICAgICAgZm9yICggayA9IDA7IGsgPCBudW1fY29udG91cnM7IGsrKyApCisgICAgICAgICAgICBzdWJnbHlwaDItPnpvbmUuY29udG91cnNba10gKz0gc3ViZ2x5cGgtPnpvbmUubl9wb2ludHM7CisKKyAgICAgICAgICBzdWJnbHlwaC0+em9uZS5uX3BvaW50cyAgICs9IG51bV9wb2ludHM7CisgICAgICAgICAgc3ViZ2x5cGgtPnpvbmUubl9jb250b3VycyArPSBudW1fY29udG91cnM7CisKKyAgICAgICAgICBsZWZ0X3BvaW50cyAgIC09IG51bV9wb2ludHM7CisgICAgICAgICAgbGVmdF9jb250b3VycyAtPSBudW1fY29udG91cnM7CisKKyAgICAgICAgICAvKiBhcHBseSBvZmZzZXQgKi8KKworICAgICAgICAgIGlmICggIShzdWJnbHlwaC0+ZWxlbWVudF9mbGFnICYgQVJHU19BUkVfWFlfVkFMVUVTKSApCisgICAgICAgICAgeworICAgICAgICAgICAgayA9IHN1YmdseXBoLT5hcmcxOworICAgICAgICAgICAgbCA9IHN1YmdseXBoLT5hcmcyOworCisgICAgICAgICAgICBpZiAoIGsgPj0gc3ViZ2x5cGgtPnpvbmUubl9wb2ludHMgfHwKKyAgICAgICAgICAgICAgICAgbCA+PSBudW1fcG9pbnRzICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZXJyb3IgPSBUVF9FcnJfSW52YWxpZF9Db21wb3NpdGU7CisgICAgICAgICAgICAgIGdvdG8gRmFpbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbCArPSBzdWJnbHlwaC0+em9uZS5uX3BvaW50czsgCisJICAgIAorICAgICAgICAgICAgeCA9IHN1YmdseXBoLT56b25lLmN1cltrXS54IC0gc3ViZ2x5cGgtPnpvbmUuY3VyW2xdLng7CisgICAgICAgICAgICB5ID0gc3ViZ2x5cGgtPnpvbmUuY3VyW2tdLnkgLSBzdWJnbHlwaC0+em9uZS5jdXJbbF0ueTsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgIHsKKyAgICAgICAgICAgIHggPSBzdWJnbHlwaC0+dHJhbnNmb3JtLm94OworICAgICAgICAgICAgeSA9IHN1YmdseXBoLT50cmFuc2Zvcm0ub3k7CisKKyAgICAgICAgICAgIGlmICghKGxvYWRfZmxhZ3MgJiBGVF9MT0FEX05PX1NDQUxFKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgeCA9IFNDQUxFX1goIHggKTsKKyAgICAgICAgICAgICAgeSA9IFNDQUxFX1koIHkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoIHN1YmdseXBoLT5lbGVtZW50X2ZsYWcgJiBST1VORF9YWV9UT19HUklEICkKKwkgIHsKKwkgICAgeCA9ICh4ICsgMzIpICYgLTY0OworCSAgICB5ID0gKHkgKyAzMikgJiAtNjQ7CisJICB9CisKKyAgICAgICAgICB0cmFuc2xhdGVfYXJyYXkoIG51bV9wb2ludHMsIHN1YmdseXBoMi0+em9uZS5jdXIsIHgsIHkgKTsKKworICAgICAgICAgIGN1cl90b19vcmcoIG51bV9wb2ludHMsICZzdWJnbHlwaDItPnpvbmUgKTsKKworICAgICAgICAgIG51bV9wb2ludHMgICA9IHN1YmdseXBoLT56b25lLm5fcG9pbnRzOworICAgICAgICAgIG51bV9jb250b3VycyA9IHN1YmdseXBoLT56b25lLm5fY29udG91cnM7CisKKyAgICAgICAgICAvKiBjaGVjayBmb3IgbGFzdCBjb21wb25lbnQgKi8KKworICAgICAgICAgIGlmICggRklMRV9TZWVrKCBzdWJnbHlwaC0+ZmlsZV9vZmZzZXQgKSApCisgICAgICAgICAgICBnb3RvIEZhaWxfRmlsZTsKKworICAgICAgICAgIGlmICggc3ViZ2x5cGgtPmVsZW1lbnRfZmxhZyAmIE1PUkVfQ09NUE9ORU5UUyApCisgICAgICAgICAgICBwaGFzZSA9IExvYWRfQ29tcG9zaXRlOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICB7CisgICAgICAgICAgICBlcnJvciA9IExvYWRfQ29tcG9zaXRlX0VuZCggbnVtX3BvaW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fY29udG91cnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJnbHlwaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZF9mbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVFRfQm9vbCkoc2l6ZSAmJiBzaXplLT5kZWJ1ZyAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkX3RvcCA9PSAwKSApOworICAgICAgICAgICAgaWYgKCBlcnJvciApCisgICAgICAgICAgICAgIGdvdG8gRmFpbDsKKworICAgICAgICAgICAgcGhhc2UgPSBMb2FkX0VuZDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgIHBoYXNlID0gTG9hZF9FeGl0OworCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIExvYWRfRXhpdDoKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorCisgICAgLyogZmluYWxseSwgY29weSB0aGUgcG9pbnRzIGFycmF5cyB0byB0aGUgZ2x5cGggb2JqZWN0ICovCisKKyAgICBleGVjLT5wdHMgPSBiYXNlX3B0czsKKworICAgIGZvciAoIHUgPSAwOyB1IDwgbnVtX3BvaW50czsgdSsrICkKKyAgICB7CisgICAgICBnbHlwaC0+b3V0bGluZS5wb2ludHNbdV0gPSBleGVjLT5wdHMuY3VyW3VdOworICAgICAgZ2x5cGgtPm91dGxpbmUuZmxhZ3MgW3VdID0gZXhlYy0+cHRzLnRvdWNoW3VdOworICAgIH0KKworICAgIGZvciAoIGsgPSAwOyBrIDwgbnVtX2NvbnRvdXJzOyBrKysgKQorICAgICAgZ2x5cGgtPm91dGxpbmUuY29udG91cnNba10gPSBleGVjLT5wdHMuY29udG91cnNba107CisKKyAgICBnbHlwaC0+b3V0bGluZS5uX3BvaW50cyAgICA9IG51bV9wb2ludHM7CisgICAgZ2x5cGgtPm91dGxpbmUubl9jb250b3VycyAgPSBudW1fY29udG91cnM7CisgICAgZ2x5cGgtPm91dGxpbmUuc2Vjb25kX3Bhc3MgPSBUUlVFOworCisgICAgLyogdHJhbnNsYXRlIGFycmF5IHNvIHRoYXQgKDAsMCkgaXMgdGhlIGdseXBoJ3Mgb3JpZ2luICovCisgICAgdHJhbnNsYXRlX2FycmF5KCBudW1fcG9pbnRzLCBnbHlwaC0+b3V0bGluZS5wb2ludHMsCisgICAgICAgICAgICAgICAgICAgICAtc3ViZ2x5cGgtPnBwMS54LCAwICk7CisKKyAgICBGVF9HZXRfT3V0bGluZV9DQm94KCAmZ2x5cGgtPm91dGxpbmUsICZiYm94ICk7CisKKyAgICBpZiAoIHN1YmdseXBoLT5pc19oaW50ZWQgKQorICAgIHsKKyAgICAgIC8qIGdyaWQtZml0IHRoZSBib3VuZGluZyBib3ggKi8KKyAgICAgIGJib3gueE1pbiAmPSAtNjQ7CisgICAgICBiYm94LnlNaW4gJj0gLTY0OworICAgICAgYmJveC54TWF4ICA9IChiYm94LnhNYXggKyA2MykgJiAtNjQ7CisgICAgICBiYm94LnlNYXggID0gKGJib3gueU1heCArIDYzKSAmIC02NDsKKyAgICB9CisKKyAgICAvKiBnZXQgdGhlIGRldmljZS1pbmRlcGVuZGVudCBzY2FsZWQgaG9yaXpvbnRhbCBtZXRyaWNzICovCisgICAgLyogdGFrZSBjYXJlIG9mIGZpeGVkLXBpdGNoIGZvbnRzLi4uICAgICAgICAgICAgICAgICAgICAqLworICAgIHsKKyAgICAgIFRUX1BvcyAgbGVmdF9iZWFyaW5nOworICAgICAgVFRfUG9zICBhZHZhbmNlOworCisKKyAgICAgIGxlZnRfYmVhcmluZyA9IHN1YmdseXBoLT5sZWZ0X2JlYXJpbmc7CisgICAgICBhZHZhbmNlICAgICAgPSBzdWJnbHlwaC0+YWR2YW5jZTsKKworICAgICAgaWYgKCBmYWNlLT5wb3N0c2NyaXB0LmlzRml4ZWRQaXRjaCApCisgICAgICAgIGFkdmFuY2UgPSBmYWNlLT5ob3Jpem9udGFsLmFkdmFuY2VfV2lkdGhfTWF4OworCisgICAgICBpZiAoICEobG9hZF9mbGFncyAmIEZUX0xPQURfTk9fU0NBTEUpICkKKyAgICAgIHsKKyAgICAgICAgbGVmdF9iZWFyaW5nID0gU0NBTEVfWCggbGVmdF9iZWFyaW5nICk7CisgICAgICAgIGFkdmFuY2UgICAgICA9IFNDQUxFX1goIGFkdmFuY2UgKTsKKyAgICAgIH0KKworICAgICAgZ2x5cGgtPm1ldHJpY3MyLmhvcmlCZWFyaW5nWCA9IGxlZnRfYmVhcmluZzsKKyAgICAgIGdseXBoLT5tZXRyaWNzMi5ob3JpQWR2YW5jZSAgPSBhZHZhbmNlOworICAgIH0KKworICAgIGdseXBoLT5tZXRyaWNzLmhvcmlCZWFyaW5nWCA9IGJib3gueE1pbjsKKyAgICBnbHlwaC0+bWV0cmljcy5ob3JpQmVhcmluZ1kgPSBiYm94LnlNYXg7CisgICAgZ2x5cGgtPm1ldHJpY3MuaG9yaUFkdmFuY2UgID0gc3ViZ2x5cGgtPnBwMi54IC0gc3ViZ2x5cGgtPnBwMS54OworCisgICAgLyogTm93IHRha2UgY2FyZSBvZiB2ZXJ0aWNhbCBtZXRyaWNzLiAgSW4gdGhlIGNhc2Ugd2hlcmUgdGhlcmUgaXMgICAgKi8KKyAgICAvKiBubyB2ZXJ0aWNhbCBpbmZvcm1hdGlvbiB3aXRoaW4gdGhlIGZvbnQgKHJlbGF0aXZlbHkgY29tbW9uKSwgbWFrZSAqLworICAgIC8qIHVwIHNvbWUgbWV0cmljcyBieSBgaGFuZCcuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICB7CisgICAgICBUVF9TaG9ydCAgIHRvcF9iZWFyaW5nOyAgICAvKiB2ZXJ0aWNhbCB0b3Agc2lkZSBiZWFyaW5nIChFTSB1bml0cykgKi8KKyAgICAgIFRUX1VTaG9ydCAgYWR2YW5jZV9oZWlnaHQ7IC8qIHZlcnRpY2FsIGFkdmFuY2UgaGVpZ2h0ICAgKEVNIHVuaXRzKSAqLworCisgICAgICBUVF9Qb3MgIGxlZnQ7ICAgICAvKiBzY2FsZWQgdmVydGljYWwgbGVmdCBzaWRlIGJlYXJpbmcgICovCisgICAgICBUVF9Qb3MgIHRvcDsgICAgICAvKiBzY2FsZWQgdmVydGljYWwgdG9wIHNpZGUgYmVhcmluZyAgICovCisgICAgICBUVF9Qb3MgIGFkdmFuY2U7ICAvKiBzY2FsZWQgdmVydGljYWwgYWR2YW5jZSBoZWlnaHQgICAgICovCisKKworICAgICAgLyogR2V0IHRoZSB1bnNjYWxlZCBgdHNiJyBhbmQgYGFoJyAqLworICAgICAgaWYgKCBmYWNlLT52ZXJ0aWNhbF9pbmZvICAgICAgICAgICAgICAgICAgICYmCisgICAgICAgICAgIGZhY2UtPnZlcnRpY2FsLm51bWJlcl9PZl9WTWV0cmljcyA+IDAgKQorICAgICAgeworICAgICAgICAvKiBEb24ndCBhc3N1bWUgdGhhdCBib3RoIHRoZSB2ZXJ0aWNhbCBoZWFkZXIgYW5kIHZlcnRpY2FsICovCisgICAgICAgIC8qIG1ldHJpY3MgYXJlIHByZXNlbnQgaW4gdGhlIHNhbWUgZm9udCA6LSkgICAgICAgICAgICAgICAgKi8KKworICAgICAgICBUVF9HZXRfTWV0cmljcyggKFRUX0hvcmlIZWFkZXIqKSZmYWNlLT52ZXJ0aWNhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdseXBoX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgJnRvcF9iZWFyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgJmFkdmFuY2VfaGVpZ2h0ICk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIE1ha2UgdXAgdGhlIGRpc3RhbmNlcyBmcm9tIHRoZSBob3Jpem9udGFsIGhlYWRlci4uICAgICAqLworCisgICAgICAgIC8qIE5PVEU6IFRoZSBPUy8yIHZhbHVlcyBhcmUgdGhlIG9ubHkgYHBvcnRhYmxlJyBvbmVzLCAgICAqLworICAgICAgICAvKiAgICAgICB3aGljaCBpcyB3aHkgd2UgdXNlIHRoZW0sIHdoZW4gdGhlcmUgaXMgYW4gICAgICAgKi8KKyAgICAgICAgLyogICAgICAgT1MvMiB0YWJsZSBpbiB0aGUgZm9udC4gT3RoZXJ3aXNlLCB3ZSB1c2UgdGhlICAgICovCisgICAgICAgIC8qICAgICAgIHZhbHVlcyBkZWZpbmVkIGluIHRoZSBob3Jpem9udGFsIGhlYWRlci4uICAgICAgICAqLworICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgLyogTk9URTI6IFRoZSBzVHlwb0Rlc2NlbmRlciBpcyBuZWdhdGl2ZSwgd2hpY2ggaXMgd2h5ICAgICovCisgICAgICAgIC8qICAgICAgICB3ZSBjb21wdXRlIHRoZSBiYXNlbGluZS10by1iYXNlbGluZSBkaXN0YW5jZSAgICAqLworICAgICAgICAvKiAgICAgICAgaGVyZSB3aXRoOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgLyogICAgICAgICAgICAgYXNjZW5kZXIgLSBkZXNjZW5kZXIgKyBsaW5lZ2FwICAgICAgICAgICAgICovCisgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICBpZiAoIGZhY2UtPm9zMi52ZXJzaW9uICE9IDB4RkZGRiApCisgICAgICAgIHsKKyAgICAgICAgICB0b3BfYmVhcmluZyAgICA9IGZhY2UtPm9zMi5zVHlwb0xpbmVHYXAgLyAyOworICAgICAgICAgIGFkdmFuY2VfaGVpZ2h0ID0gKFRUX1VTaG9ydCkoZmFjZS0+b3MyLnNUeXBvQXNjZW5kZXIgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZS0+b3MyLnNUeXBvRGVzY2VuZGVyICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2UtPm9zMi5zVHlwb0xpbmVHYXApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIHRvcF9iZWFyaW5nICAgID0gZmFjZS0+aG9yaXpvbnRhbC5MaW5lX0dhcCAvIDI7CisgICAgICAgICAgYWR2YW5jZV9oZWlnaHQgPSAoVFRfVVNob3J0KShmYWNlLT5ob3Jpem9udGFsLkFzY2VuZGVyICArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlLT5ob3Jpem9udGFsLkRlc2NlbmRlciArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlLT5ob3Jpem9udGFsLkxpbmVfR2FwKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvKiBzY2FsZSB0aGUgbWV0cmljcyAqLworICAgICAgaWYgKCAhKGxvYWRfZmxhZ3MgJiBGVF9MT0FEX05PX1NDQUxFKSApCisgICAgICB7CisgICAgICAgIHRvcCAgICAgPSBTQ0FMRV9ZKCB0b3BfYmVhcmluZyApOworICAgICAgICBhZHZhbmNlID0gU0NBTEVfWCggYWR2YW5jZV9oZWlnaHQgKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgdG9wICAgICA9IHRvcF9iZWFyaW5nOworICAgICAgICBhZHZhbmNlID0gYWR2YW5jZV9oZWlnaHQ7CisgICAgICB9CisKKyAgICAgIGdseXBoLT5tZXRyaWNzMi52ZXJ0QmVhcmluZ1kgPSB0b3A7CisgICAgICBnbHlwaC0+bWV0cmljczIudmVydEFkdmFuY2UgID0gYWR2YW5jZTsKKworICAgICAgLyogWFhYOiBmb3Igbm93LCB3ZSBoYXZlIG5vIGJldHRlciBhbGdvcml0aG0gZm9yIHRoZSBsc2IsIGJ1dCBpdCAgICAqLworICAgICAgLyogICAgICBzaG91bGQgd29yayBmaW5lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgbGVmdCA9ICggYmJveC54TWluIC0gYmJveC54TWF4ICkgLyAyOworCisgICAgICAvKiBncmlkLWZpdCB0aGVtIGlmIG5lY2Vzc2FyeSAqLworICAgICAgaWYgKCBzdWJnbHlwaC0+aXNfaGludGVkICkKKyAgICAgIHsKKyAgICAgICAgbGVmdCAgICY9IC02NDsKKyAgICAgICAgdG9wICAgICA9ICh0b3AgKyA2MykgJiAtNjQ7CisgICAgICAgIGFkdmFuY2UgPSAoYWR2YW5jZSArIDMyKSAmIC02NDsKKyAgICAgIH0KKworICAgICAgZ2x5cGgtPm1ldHJpY3MudmVydEJlYXJpbmdYID0gbGVmdDsKKyAgICAgIGdseXBoLT5tZXRyaWNzLnZlcnRCZWFyaW5nWSA9IHRvcDsKKyAgICAgIGdseXBoLT5tZXRyaWNzLnZlcnRBZHZhbmNlICA9IGFkdmFuY2U7CisgICAgfQorCisgICAgLyogQWRqdXN0IGFkdmFuY2Ugd2lkdGggdG8gdGhlIHZhbHVlIGNvbnRhaW5lZCBpbiB0aGUgaGRteCB0YWJsZS4gKi8KKyAgICBpZiAoICFleGVjLT5mYWNlLT5wb3N0c2NyaXB0LmlzRml4ZWRQaXRjaCAmJiBzaXplICYmCisgICAgICAgICBzdWJnbHlwaC0+aXNfaGludGVkICkKKyAgICB7CisgICAgICB3aWR0aHMgPSBHZXRfQWR2YW5jZV9XaWR0aHMoIGV4ZWMtPmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWMtPnNpemUtPnJvb3QubWV0cmljcy54X3BwZW0gKTsKKyAgICAgIGlmICggd2lkdGhzICkKKyAgICAgICAgZ2x5cGgtPm1ldHJpY3MuaG9yaUFkdmFuY2UgPSB3aWR0aHNbZ2x5cGhfaW5kZXhdIDw8IDY7CisgICAgfQorCisgICAgZ2x5cGgtPm91dGxpbmUuZHJvcG91dF9tb2RlID0gKFRUX0NoYXIpZXhlYy0+R1Muc2Nhbl90eXBlOworCisgICAgLyogc2V0IGdseXBoIGRpbWVuc2lvbnMgKi8KKyAgICBnbHlwaC0+bWV0cmljcy53aWR0aCAgPSBiYm94LnhNYXggLSBiYm94LnhNaW47CisgICAgZ2x5cGgtPm1ldHJpY3MuaGVpZ2h0ID0gYmJveC55TWF4IC0gYmJveC55TWluOworCisgICAgZ2x5cGgtPmZvcm1hdCA9IGZ0X2dseXBoX2Zvcm1hdF9vdXRsaW5lOworCisgICAgZXJyb3IgPSBUVF9FcnJfT2s7CisKKyAgRmFpbF9GaWxlOgorICBGYWlsOgorCisgICAgLyogcmVzZXQgdGhlIGV4ZWN1dGlvbiBjb250ZXh0ICovCisgICAgZXhlYy0+cHRzID0gYmFzZV9wdHM7CisKKyAgICBpZiAoICFzaXplIHx8ICFzaXplLT5kZWJ1ZyApCisgICAgICBUVF9Eb25lX0NvbnRleHQoIGV4ZWMgKTsKKworICAgIHJldHVybiBlcnJvcjsKKyAgfQorCisKKy8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3RydWV0eXBlL3R0Z2xvYWQuaCBiL3NyYy90cnVldHlwZS90dGdsb2FkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDU0NGNlZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90cnVldHlwZS90dGdsb2FkLmgKQEAgLTAsMCArMSwxMDkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHR0Z2xvYWQuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBUcnVlVHlwZSBHbHlwaCBMb2FkZXIgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMTk5Ni0xOTk5IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQgICAgICAgICovCisvKiAgbW9kaWZpZWQgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICAqLworLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KKy8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCisvKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2lmbmRlZiBUVEdMT0FEX0gKKyNkZWZpbmUgVFRHTE9BRF9ICisKKyNpbmNsdWRlIDx0dG9ianMuaD4KKworI2lmZGVmIF9fY3BsdXNwbHVzCisgIGV4dGVybiAiQyIgeworI2VuZGlmCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUVF9HZXRfTWV0cmljcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBSZXR1cm5zIHRoZSBob3Jpem9udGFsIG9yIHZlcnRpY2FsIG1ldHJpY3MgaW4gZm9udCB1bml0cyBmb3IgYSAgICAgKi8KKyAgLyogICAgZ2l2ZW4gZ2x5cGguICBUaGUgbWV0cmljcyBhcmUgdGhlIGxlZnQgc2lkZSBiZWFyaW5nIChyZXNwLiB0b3AgICAgICovCisgIC8qICAgIHNpZGUgYmVhcmluZykgYW5kIGFkdmFuY2Ugd2lkdGggKHJlc3AuIGFkdmFuY2UgaGVpZ2h0KS4gICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGhlYWRlciAgOjogQSBwb2ludGVyIHRvIGVpdGhlciB0aGUgaG9yaXpvbnRhbCBvciB2ZXJ0aWNhbCBtZXRyaWNzICAqLworICAvKiAgICAgICAgICAgICAgIHN0cnVjdHVyZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGluZGV4ICAgOjogVGhlIGdseXBoIGluZGV4LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGJlYXJpbmcgOjogVGhlIGJlYXJpbmcsIGVpdGhlciBsZWZ0IHNpZGUgb3IgdG9wIHNpZGUuICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgYWR2YW5jZSA6OiBUaGUgYWR2YW5jZSB3aWR0aCByZXNwLiBhZHZhbmNlIGhlaWdodC4gICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhpcyBmdW5jdGlvbiB3aWxsIG11Y2ggcHJvYmFibHkgbW92ZSB0byBhbm90aGVyIGNvbXBvbmVudCBpbiB0aGUgICovCisgIC8qICAgIG5lYXIgZnV0dXJlLCBidXQgSSBoYXZlbid0IGRlY2lkZWQgd2hpY2ggeWV0LiAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgTE9DQUxfREVGCisgIHZvaWQgIFRUX0dldF9NZXRyaWNzKCBUVF9Ib3JpSGVhZGVyKiAgaGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgVFRfVVNob3J0ICAgICAgIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgVFRfU2hvcnQqICAgICAgIGJlYXJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICBUVF9VU2hvcnQqICAgICAgYWR2YW5jZSApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfTG9hZF9HbHlwaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSBmdW5jdGlvbiB1c2VkIHRvIGxvYWQgYSBzaW5nbGUgZ2x5cGggd2l0aGluIGEgZ2l2ZW4gZ2x5cGggc2xvdCwgICovCisgIC8qICAgIGZvciBhIGdpdmVuIHNpemUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGdseXBoICAgICAgIDo6IEEgaGFuZGxlIHRvIGEgdGFyZ2V0IHNsb3Qgb2JqZWN0IHdoZXJlIHRoZSBnbHlwaCAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICB3aWxsIGJlIGxvYWRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHNpemUgICAgICAgIDo6IEEgaGFuZGxlIHRvIHRoZSBzb3VyY2UgZmFjZSBzaXplIGF0IHdoaWNoIHRoZSBnbHlwaCAqLworICAvKiAgICAgICAgICAgICAgICAgICBtdXN0IGJlIHNjYWxlZC9sb2FkZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGdseXBoX2luZGV4IDo6IFRoZSBpbmRleCBvZiB0aGUgZ2x5cGggaW4gdGhlIGZvbnQgZmlsZS4gICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbG9hZF9mbGFncyAgOjogQSBmbGFnIGluZGljYXRpbmcgd2hhdCB0byBsb2FkIGZvciB0aGlzIGdseXBoLiAgVGhlICovCisgIC8qICAgICAgICAgICAgICAgICAgIEZUX0xPQURfWFhYIGNvbnN0YW50cyBjYW4gYmUgdXNlZCB0byBjb250cm9sIHRoZSAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICBnbHlwaCBsb2FkaW5nIHByb2Nlc3MgKGUuZy4sIHdoZXRoZXIgdGhlIG91dGxpbmUgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgc2hvdWxkIGJlIHNjYWxlZCwgd2hldGhlciB0byBsb2FkIGJpdG1hcHMgb3Igbm90LCAgICovCisgIC8qICAgICAgICAgICAgICAgICAgIHdoZXRoZXIgdG8gaGludCB0aGUgb3V0bGluZSwgZXRjKS4gICAgICAgICAgICAgICAgICAqLworICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgcmVzdWx0ICAgICAgOjogQSBzZXQgb2YgYml0IGZsYWdzIGluZGljYXRpbmcgdGhlIHR5cGUgb2YgZGF0YSB0aGF0ICovCisgIC8qICAgICAgICAgICAgICAgICAgIHdhcyBsb2FkZWQgaW4gdGhlIGdseXBoIHNsb3QgKG91dGxpbmUgb3IgYml0bWFwLCAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICBldGMpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgIFlvdSBjYW4gc2V0IHRoaXMgZmllbGQgdG8gMCBpZiB5b3UgZG9uJ3Qgd2FudCB0aGlzICAqLworICAvKiAgICAgICAgICAgICAgICAgICBpbmZvcm1hdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIExPQ0FMX0RFRgorICBUVF9FcnJvciAgVFRfTG9hZF9HbHlwaCggVFRfU2l6ZSAgICAgICBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfR2x5cGhTbG90ICBnbHlwaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX1VTaG9ydCAgICAgZ2x5cGhfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9VSW50ICAgICAgIGxvYWRfZmxhZ3MgKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCisgIH0KKyNlbmRpZgorCisKKyNlbmRpZiAvKiBUVEdMT0FEX0ggKi8KKworCisvKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy90cnVldHlwZS90dGludGVycC5jIGIvc3JjL3RydWV0eXBlL3R0aW50ZXJwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzliZTRmMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90cnVldHlwZS90dGludGVycC5jCkBAIC0wLDAgKzEsNzk1NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgdHRpbnRlcnAuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIFRydWVUeXBlIGJ5dGVjb2RlIGludGVwcmV0ZXIgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAxOTk2LTE5OTkgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCAgICAgICAgKi8KKy8qICBtb2RpZmllZCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgICovCisvKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLworLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KKy8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjaW5jbHVkZSA8ZnRkZWJ1Zy5oPgorI2luY2x1ZGUgPGZ0c3lzdGVtLmg+CisjaW5jbHVkZSA8ZnRjYWxjLmg+CisKKyNpbmNsdWRlIDx0dGludGVycC5oPgorCisjZGVmaW5lIFRUX01VTEZJWCAgIEZUX011bEZpeAorI2RlZmluZSBUVF9NVUxESVYgICBGVF9NdWxEaXYKKworI2RlZmluZSBUVF9JTlQ2NCAgICBGVF9JbnQ2NAorCisvKiByZXF1aXJlZCBieSB0aGUgdHJhY2luZyBtb2RlICovCisjdW5kZWYgIEZUX0NPTVBPTkVOVAorI2RlZmluZSBGVF9DT01QT05FTlQgICAgICB0cmFjZV90dGludGVycAorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBJbiBvcmRlciB0byBkZXRlY3QgaW5maW5pdGUgbG9vcHMgaW4gdGhlIGNvZGUsIHdlIHNldC11cCBhIGNvdW50ZXIgICAgKi8KKyAgLyogd2l0aGluIHRoZSBydW4gbG9vcC4gYSBzaW5nbGUgc3Ryb2tlIG9mIGludGVycHJldGF0aW9uIGlzIG5vdyBsaW1pdGVkICovCisgIC8qIHRvIGEgbWF4aW11bSBudW1iZXIgb2Ygb3Bjb2RlcyBkZWZpbmVkIGJlbG93LiAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTUFYX1JVTk5BQkxFX09QQ09ERVMgIDEwMDAwMDAKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogVGhlcmUgYXJlIHR3byBraW5kcyBvZiBpbXBsZW1lbnRhdGlvbnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBhLiBzdGF0aWMgaW1wbGVtZW50YXRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoZSBjdXJyZW50IGV4ZWN1dGlvbiBjb250ZXh0IGlzIGEgc3RhdGljIHZhcmlhYmxlLCB3aGljaCBmaWVsZHMgICAqLworICAvKiAgICBhcmUgYWNjZXNzZWQgZGlyZWN0bHkgYnkgdGhlIGludGVycHJldGVyIGR1cmluZyBleGVjdXRpb24uICBUaGUgICAgKi8KKyAgLyogICAgY29udGV4dCBpcyBuYW1lZCBgY3VyJy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGlzIHZlcnNpb24gaXMgbm9uLXJlZW50cmFudCwgb2YgY291cnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIGIuIGluZGlyZWN0IGltcGxlbWVudGF0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhlIGN1cnJlbnQgZXhlY3V0aW9uIGNvbnRleHQgaXMgcGFzc2VkIHRvIF9lYWNoXyBmdW5jdGlvbiBhcyBpdHMgICovCisgIC8qICAgIGZpcnN0IGFyZ3VtZW50LCBhbmQgZWFjaCBmaWVsZCBpcyB0aHVzIGFjY2Vzc2VkIGluZGlyZWN0bHkuICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhpcyB2ZXJzaW9uIGlzIGZ1bGx5IHJlLWVudHJhbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBUaGUgaWRlYSBpcyB0aGF0IGFuIGluZGlyZWN0IGltcGxlbWVudGF0aW9uIG1heSBiZSBzbG93ZXIgdG8gZXhlY3V0ZSAgKi8KKyAgLyogb24gbG93LWVuZCBwcm9jZXNzb3JzIHRoYXQgYXJlIHVzZWQgaW4gc29tZSBzeXN0ZW1zIChsaWtlIDM4NnMgb3IgICAgICovCisgIC8qIGV2ZW4gNDg2cykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogQXMgYSBjb25zZXF1ZW5jZSwgdGhlIGluZGlyZWN0IGltcGxlbWVudGF0aW9uIGlzIG5vdyB0aGUgZGVmYXVsdCwgYXMgICovCisgIC8qIGl0cyBwZXJmb3JtYW5jZSBjb3N0cyBjYW4gYmUgY29uc2lkZXJlZCBuZWdsaWdpYmxlIGluIG91ciBjb250ZXh0LiAgICAqLworICAvKiBOb3RlLCBob3dldmVyLCB0aGF0IHdlIGtlcHQgdGhlIHNhbWUgc291cmNlIHdpdGggbWFjcm9zIGJlY2F1c2U6ICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIC0gVGhlIGNvZGUgaXMga2VwdCB2ZXJ5IGNsb3NlIGluIGRlc2lnbiB0byB0aGUgUGFzY2FsIGNvZGUgdXNlZCBmb3IgICAqLworICAvKiAgIGRldmVsb3BtZW50LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIC0gSXQncyBtdWNoIG1vcmUgcmVhZGFibGUgdGhhdCB3YXkhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogLSBJdCdzIHN0aWxsIG9wZW4gdG8gZXhwZXJpbWVudGF0aW9uIGFuZCB0dW5pbmcuICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjaWZuZGVmIFRUX0NPTkZJR19PUFRJT05fU1RBVElDX0lOVEVSUFJFVEVSICAgICAgLyogaW5kaXJlY3QgaW1wbGVtZW50YXRpb24gKi8KKworI2RlZmluZSBDVVIgKCpleGMpICAgICAgICAgICAgICAgICAvKiBzZWUgdHRvYmpzLmggKi8KKworI2Vsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdGF0aWMgaW1wbGVtZW50YXRpb24gKi8KKworI2RlZmluZSBDVVIgY3VyCisKKyAgc3RhdGljCisgIFRUX0V4ZWNDb250ZXh0UmVjICBjdXI7ICAgLyogc3RhdGljIGV4ZWMuIGNvbnRleHQgdmFyaWFibGUgKi8KKworICAvKiBhcHBhcmVudGx5LCB3ZSBoYXZlIGEgX2xvdF8gb2YgZGlyZWN0IGluZGV4aW5nIHdoZW4gYWNjZXNzaW5nICAqLworICAvKiB0aGUgc3RhdGljIGBjdXInLCB3aGljaCBtYWtlcyB0aGUgY29kZSBiaWdnZXIgKGR1ZSB0byBhbGwgdGhlICAqLworICAvKiBmb3VyIGJ5dGVzIGFkZHJlc3NlcykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisjZW5kaWYgLyogVFRfQ09ORklHX09QVElPTl9TVEFUSUNfSU5URVJQUkVURVIgKi8KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogTW9zdCBvZiBGcmVlVHlwZSBidWlsZHMgZG9uJ3QgdXNlIGVuZ2luZSBjb21wZW5zYXRpb25zLiAgV2UgdGh1cyAgICAgICovCisgIC8qIGludHJvZHVjZSBhIG1hY3JvLCBGVF9DT05GSUdfT1BUSU9OX0lOVEVSUFJFVEVSX1FVSUNLLCB3aGljaCBjb250cm9scyAqLworICAvKiB0aGUgdXNlIG9mIHRoZXNlIHZhbHVlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIElOU19BUkcgIEVYRUNfT1BfIFRUX0xvbmcqICBhcmdzICAvKiBzZWUgdHRvYmpzLmggZm9yIEVYRUNfT1BfICovCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFRoaXMgbWFjcm8gaXMgdXNlZCB3aGVuZXZlciBgZXhlYycgaXMgdW51c2VkIGluIGEgZnVuY3Rpb24sIHRvIGF2b2lkICAqLworICAvKiBzdHVwaWQgd2FybmluZ3MgZnJvbSBwZWRhbnRpYyBjb21waWxlcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFVOVVNFRF9FWEVDICAodm9pZClDVVIKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogVGhpcyBtYWNybyBpcyB1c2VkIHdoZW5ldmVyIGBhcmdzJyBpcyB1bnVzZWQgaW4gYSBmdW5jdGlvbiwgdG8gYXZvaWQgICovCisgIC8qIHN0dXBpZCB3YXJuaW5ncyBmcm9tIHBlZGFudGljIGNvbXBpbGVycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVU5VU0VEX0FSRyAgVU5VU0VEX0VYRUM7ICh2b2lkKWFyZ3M7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFRoZSBmb2xsb3dpbmcgbWFjcm9zIGhpZGUgdGhlIHVzZSBvZiBFWEVDX0FSRyBhbmQgRVhFQ19BUkdfIHRvICAgICAgICAqLworICAvKiBpbmNyZWFzZSByZWFkYWJpbHR5b2YgdGhlIGNvZGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNkZWZpbmUgU0tJUF9Db2RlKCkgXAorICAgICAgICAgIFNraXBDb2RlKCBFWEVDX0FSRyApCisKKyNkZWZpbmUgR0VUX1Nob3J0SW5zKCkgXAorICAgICAgICAgIEdldFNob3J0SW5zKCBFWEVDX0FSRyApCisKKyNkZWZpbmUgTk9STWFsaXplKCB4LCB5LCB2ICkgXAorICAgICAgICAgIE5vcm1hbGl6ZSggRVhFQ19BUkdfIHgsIHksIHYgKQorCisjZGVmaW5lIFNFVF9TdXBlclJvdW5kKCBzY2FsZSwgZmxhZ3MgKSBcCisgICAgICAgICAgU2V0U3VwZXJSb3VuZCggRVhFQ19BUkdfIHNjYWxlLCBmbGFncyApCisKKyNkZWZpbmUgUk9VTkRfTm9uZSggZCwgYyApIFwKKyAgICAgICAgICBSb3VuZF9Ob25lKCBFWEVDX0FSR18gZCwgYyApCisKKyNkZWZpbmUgSU5TX0dvdG9fQ29kZVJhbmdlKCByYW5nZSwgaXAgKSBcCisgICAgICAgICAgSW5zX0dvdG9fQ29kZVJhbmdlKCBFWEVDX0FSR18gcmFuZ2UsIGlwICkKKworI2RlZmluZSBDVVJfRnVuY19wcm9qZWN0KCB4LCB5ICkgXAorICAgICAgICAgIENVUi5mdW5jX3Byb2plY3QoIEVYRUNfQVJHXyB4LCB5ICkKKworI2RlZmluZSBDVVJfRnVuY19tb3ZlKCB6LCBwLCBkICkgXAorICAgICAgICAgIENVUi5mdW5jX21vdmUoIEVYRUNfQVJHXyB6LCBwLCBkICkKKworI2RlZmluZSBDVVJfRnVuY19kdWFscHJvaiggeCwgeSApIFwKKyAgICAgICAgICBDVVIuZnVuY19kdWFscHJvaiggRVhFQ19BUkdfIHgsIHkgKQorCisjZGVmaW5lIENVUl9GdW5jX2ZyZWVQcm9qKCB4LCB5ICkgXAorICAgICAgICAgIENVUi5mdW5jX2ZyZWVQcm9qKCBFWEVDX0FSR18geCwgeSApCisKKyNkZWZpbmUgQ1VSX0Z1bmNfcm91bmQoIGQsIGMgKSBcCisgICAgICAgICAgQ1VSLmZ1bmNfcm91bmQoIEVYRUNfQVJHXyBkLCBjICkKKworI2RlZmluZSBDVVJfRnVuY19yZWFkX2N2dCggaW5kZXggKSBcCisgICAgICAgICAgQ1VSLmZ1bmNfcmVhZF9jdnQoIEVYRUNfQVJHXyBpbmRleCApCisKKyNkZWZpbmUgQ1VSX0Z1bmNfd3JpdGVfY3Z0KCBpbmRleCwgdmFsICkgXAorICAgICAgICAgIENVUi5mdW5jX3dyaXRlX2N2dCggRVhFQ19BUkdfIGluZGV4LCB2YWwgKQorCisjZGVmaW5lIENVUl9GdW5jX21vdmVfY3Z0KCBpbmRleCwgdmFsICkgXAorICAgICAgICAgIENVUi5mdW5jX21vdmVfY3Z0KCBFWEVDX0FSR18gaW5kZXgsIHZhbCApCisKKyNkZWZpbmUgQ1VSUkVOVF9SYXRpbygpIFwKKyAgICAgICAgICBDdXJyZW50X1JhdGlvKCBFWEVDX0FSRyApCisKKyNkZWZpbmUgQ1VSUkVOVF9QcGVtKCkgXAorICAgICAgICAgIEN1cnJlbnRfUHBlbSggRVhFQ19BUkcgKQorCisjZGVmaW5lIENVUl9QcGVtKCkgXAorICAgICAgICAgIEN1cl9QUEVNKCBFWEVDX0FSRyApCisKKyNkZWZpbmUgQ0FMQ19MZW5ndGgoKSBcCisgICAgICAgICAgQ2FsY19MZW5ndGgoIEVYRUNfQVJHICkKKworI2RlZmluZSBJTlNfU3hWVEwoIGEsIGIsIGMsIGQgKSBcCisgICAgICAgICAgSW5zX1N4VlRMKCBFWEVDX0FSR18gYSwgYiwgYywgZCApCisKKyNkZWZpbmUgQ09NUFVURV9GdW5jcygpIFwKKyAgICAgICAgICBDb21wdXRlX0Z1bmNzKCBFWEVDX0FSRyApCisKKyNkZWZpbmUgQ09NUFVURV9Sb3VuZCggYSApIFwKKyAgICAgICAgICBDb21wdXRlX1JvdW5kKCBFWEVDX0FSR18gYSApCisKKyNkZWZpbmUgQ09NUFVURV9Qb2ludF9EaXNwbGFjZW1lbnQoIGEsIGIsIGMsIGQgKSBcCisgICAgICAgICAgQ29tcHV0ZV9Qb2ludF9EaXNwbGFjZW1lbnQoIEVYRUNfQVJHXyBhLCBiLCBjLCBkICkKKworI2RlZmluZSBNT1ZFX1pwMl9Qb2ludCggYSwgYiwgYywgdCApIFwKKyAgICAgICAgICBNb3ZlX1pwMl9Qb2ludCggRVhFQ19BUkdfIGEsIGIsIGMsIHQgKQorCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIEluc3RydWN0aW9uIGRpc3BhdGNoIGZ1bmN0aW9uLCBhcyB1c2VkIGJ5IHRoZSBpbnRlcnByZXRlci4gICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiB2b2lkICAoKlRJbnN0cnVjdGlvbl9GdW5jdGlvbikoIElOU19BUkcgKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogQSBzaW1wbGUgYm91bmRzLWNoZWNraW5nIG1hY3JvLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBCT1VORFMoIHgsIG4gKSAgKChUVF9VSW50KSh4KSA+PSAoVFRfVUludCkobikpCisKKworI3VuZGVmICAgU1VDQ0VTUworI2RlZmluZSAgU1VDQ0VTUyAgIDAKKworI3VuZGVmICAgIEZBSUxVUkUKKyNkZWZpbmUgICBGQUlMVVJFIDEKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICBDT0RFUkFOR0UgRlVOQ1RJT05TICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX0dvdG9fQ29kZVJhbmdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFN3aXRjaGVzIHRvIGEgbmV3IGNvZGUgcmFuZ2UgKHVwZGF0ZXMgdGhlIGNvZGUgcmVsYXRlZCBlbGVtZW50cyBpbiAqLworICAvKiAgICBgZXhlYycsIGFuZCBgSVAnKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICByYW5nZSA6OiBUaGUgbmV3IGV4ZWN1dGlvbiBjb2RlIHJhbmdlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgSVAgICAgOjogVGhlICBuZXcgSVAgaW4gdGhlIG5ldyBjb2RlIHJhbmdlLiAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZXhlYyAgOjogVGhlIHRhcmdldCBleGVjdXRpb24gY29udGV4dC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICBUcnVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBFWFBPUlRfRlVOQworICBUVF9FcnJvciAgVFRfR290b19Db2RlUmFuZ2UoIFRUX0V4ZWNDb250ZXh0ICBleGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX0ludCAgICAgICAgICByYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9Mb25nICAgICAgICAgSVAgKQorICB7CisgICAgVFRfQ29kZVJhbmdlKiAgY29kZXJhbmdlOworCisKKyAgICBGVF9Bc3NlcnQoIHJhbmdlID49IDEgJiYgcmFuZ2UgPD0gMyApOworCisgICAgY29kZXJhbmdlID0gJmV4ZWMtPmNvZGVSYW5nZVRhYmxlW3JhbmdlIC0gMV07CisKKyAgICBGVF9Bc3NlcnQoIGNvZGVyYW5nZS0+YmFzZSAhPSBOVUxMICk7CisKKyAgICAvKiBOT1RFOiBCZWNhdXNlIHRoZSBsYXN0IGluc3RydWN0aW9uIG9mIGEgcHJvZ3JhbSBtYXkgYmUgYSBDQUxMICovCisgICAgLyogICAgICAgd2hpY2ggd2lsbCByZXR1cm4gdG8gdGhlIGZpcnN0IGJ5dGUgKmFmdGVyKiB0aGUgY29kZSAgICAqLworICAgIC8qICAgICAgIHJhbmdlLCB3ZSB0ZXN0IGZvciBJUCA8PSBTaXplLCBpbnN0ZWFkIG9mIElQIDwgU2l6ZS4gICAgKi8KKyAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgRlRfQXNzZXJ0KCAoVFRfVUxvbmcpSVAgPD0gY29kZXJhbmdlLT5zaXplICk7CisKKyAgICBleGVjLT5jb2RlICAgICA9IGNvZGVyYW5nZS0+YmFzZTsKKyAgICBleGVjLT5jb2RlU2l6ZSA9IGNvZGVyYW5nZS0+c2l6ZTsKKyAgICBleGVjLT5JUCAgICAgICA9IElQOworICAgIGV4ZWMtPmN1clJhbmdlID0gcmFuZ2U7CisKKyAgICByZXR1cm4gVFRfRXJyX09rOworICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUVF9TZXRfQ29kZVJhbmdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBTZXRzIGEgY29kZSByYW5nZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICByYW5nZSAgOjogVGhlIGNvZGUgcmFuZ2UgaW5kZXguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgYmFzZSAgIDo6IFRoZSBuZXcgY29kZSBiYXNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGxlbmd0aCA6OiBUaGUgcmFuZ2Ugc2l6ZSBpbiBieXRlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGV4ZWMgICA6OiBUaGUgdGFyZ2V0IGV4ZWN1dGlvbiBjb250ZXh0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgVHJ1ZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgRVhQT1JUX0ZVTkMKKyAgVFRfRXJyb3IgIFRUX1NldF9Db2RlUmFuZ2UoIFRUX0V4ZWNDb250ZXh0ICBleGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfSW50ICAgICAgICAgIHJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICAgICAgIGJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9Mb25nICAgICAgICAgbGVuZ3RoICkKKyAgeworICAgIEZUX0Fzc2VydCggcmFuZ2UgPj0gMSAmJiByYW5nZSA8PSAzICk7CisKKyAgICBleGVjLT5jb2RlUmFuZ2VUYWJsZVtyYW5nZSAtIDFdLmJhc2UgPSAoVFRfQnl0ZSopYmFzZTsKKyAgICBleGVjLT5jb2RlUmFuZ2VUYWJsZVtyYW5nZSAtIDFdLnNpemUgPSBsZW5ndGg7CisKKyAgICByZXR1cm4gVFRfRXJyX09rOworICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUVF9DbGVhcl9Db2RlUmFuZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBDbGVhcnMgYSBjb2RlIHJhbmdlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICByYW5nZSA6OiBUaGUgY29kZSByYW5nZSBpbmRleC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBleGVjICA6OiBUaGUgdGFyZ2V0IGV4ZWN1dGlvbiBjb250ZXh0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIFRydWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBEb2VzIG5vdCBzZXQgdGhlIEVycm9yIHZhcmlhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEVYUE9SVF9GVU5DCisgIFRUX0Vycm9yICBUVF9DbGVhcl9Db2RlUmFuZ2UoIFRUX0V4ZWNDb250ZXh0ICBleGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9JbnQgICAgICAgICAgcmFuZ2UgKQorICB7CisgICAgRlRfQXNzZXJ0KCByYW5nZSA+PSAxICYmIHJhbmdlIDw9IDMgKTsKKworICAgIGV4ZWMtPmNvZGVSYW5nZVRhYmxlW3JhbmdlIC0gMV0uYmFzZSA9IE5VTEw7CisgICAgZXhlYy0+Y29kZVJhbmdlVGFibGVbcmFuZ2UgLSAxXS5zaXplID0gMDsKKworICAgIHJldHVybiBUVF9FcnJfT2s7CisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgRVhFQ1VUSU9OIENPTlRFWFQgUk9VVElORVMgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX0Rlc3Ryb3lfQ29udGV4dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIERlc3Ryb3lzIGEgZ2l2ZW4gY29udGV4dC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGV4ZWMgICA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGV4ZWN1dGlvbiBjb250ZXh0LiAgICAgICAgICAgICAgICAqLworICAvKiAgICBzeXN0ZW0gOjogQSBoYW5kbGUgdG8gdGhlIHBhcmVudCBzeXN0ZW0gb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUcnVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBPbmx5IHRoZSBnbHlwaCBsb2FkZXIgYW5kIGRlYnVnZ2VyIHNob3VsZCBjYWxsIHRoaXMgZnVuY3Rpb24uICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIExPQ0FMX0ZVTkMKKyAgVFRfRXJyb3IgIFRUX0Rlc3Ryb3lfQ29udGV4dCggVFRfRXhlY0NvbnRleHQgIGV4ZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX01lbW9yeSAgICAgICBtZW1vcnkgKQorICB7CisgICAgLyogZnJlZSBjb21wb3NpdGUgbG9hZCBzdGFjayAqLworICAgIEZSRUUoIGV4ZWMtPmxvYWRTdGFjayApOworICAgIGV4ZWMtPmxvYWRTaXplID0gMDsKKworICAgIC8qIHBvaW50cyB6b25lICovCisgICAgVFRfRG9uZV9HbHlwaFpvbmUoIGV4ZWMtPm1lbW9yeSwgJmV4ZWMtPnB0cyApOworICAgIGV4ZWMtPm1heFBvaW50cyAgID0gMDsKKyAgICBleGVjLT5tYXhDb250b3VycyA9IDA7CisKKyAgICAvKiBmcmVlIHN0YWNrICovCisgICAgRlJFRSggZXhlYy0+c3RhY2sgKTsKKyAgICBleGVjLT5zdGFja1NpemUgPSAwOworCisgICAgLyogZnJlZSBjYWxsIHN0YWNrICovCisgICAgRlJFRSggZXhlYy0+Y2FsbFN0YWNrICk7CisgICAgZXhlYy0+Y2FsbFNpemUgPSAwOworICAgIGV4ZWMtPmNhbGxUb3AgID0gMDsKKworICAgIC8qIGZyZWUgZ2x5cGggY29kZSByYW5nZSAqLworICAgIEZSRUUoIGV4ZWMtPmdseXBoSW5zICk7CisgICAgZXhlYy0+Z2x5cGhTaXplID0gMDsKKworICAgIGV4ZWMtPnNpemUgPSBOVUxMOworICAgIGV4ZWMtPmZhY2UgPSBOVUxMOworCisgICAgRlJFRSggZXhlYyApOworICAgIHJldHVybiBUVF9FcnJfT2s7CisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEluaXRfQ29udGV4dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEluaXRpYWxpemVzIGEgY29udGV4dCBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG1lbW9yeSA6OiBBIGhhbmRsZSB0byB0aGUgcGFyZW50IG1lbW9yeSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZmFjZSAgIDo6IEEgaGFuZGxlIHRvIHRoZSBzb3VyY2UgVHJ1ZVR5cGUgZmFjZSBvYmplY3QuICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZXhlYyAgIDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZXhlY3V0aW9uIGNvbnRleHQuICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVHJ1ZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBzdGF0aWMKKyAgVFRfRXJyb3IgIEluaXRfQ29udGV4dCggVFRfRXhlY0NvbnRleHQgIGV4ZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX0ZhY2UgICAgICAgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9NZW1vcnkgICAgICAgbWVtb3J5ICkKKyAgeworICAgIFRUX0Vycm9yICBlcnJvcjsKKworCisgICAgRlRfVFJBQ0UxKCggIlRULkNyZWF0ZV9DcmVhdGU6IG5ldyBvYmplY3QgYXQgMHglMDhseCwgcGFyZW50ID0gMHglMDhseFxuIiwKKyAgICAgICAgICAgICAgKGxvbmcpZXhlYywgKGxvbmcpZmFjZSApKTsKKworICAgIC8qIFhYWDogV2UgZG9uJ3QgcmVzZXJ2ZSBhcnJheXMgYW55bW9yZSwgdGhpcyBpcyBkb25lIGF1dG9tYXRpY2FsbHkgKi8KKyAgICAvKiAgICAgIGR1cmluZyBhIGNhbGwgdG8gQ29udGV4dF9Mb2FkKCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICBleGVjLT5tZW1vcnkgICA9IG1lbW9yeTsKKyAgICBleGVjLT5jYWxsU2l6ZSA9IDMyOworCisgICAgaWYgKCBBTExPQ19BUlJBWSggZXhlYy0+Y2FsbFN0YWNrLCBleGVjLT5jYWxsU2l6ZSwgVFRfQ2FsbFJlYyApICkKKyAgICAgIGdvdG8gRmFpbF9NZW1vcnk7CisKKyAgICAvKiBhbGwgdmFsdWVzIGluIHRoZSBjb250ZXh0IGFyZSBzZXQgdG8gMCBhbHJlYWR5LCBidXQgdGhpcyBpcyAqLworICAgIC8qIGhlcmUgYXMgYSByZW1haW5kZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgZXhlYy0+bWF4UG9pbnRzICAgPSAwOworICAgIGV4ZWMtPm1heENvbnRvdXJzID0gMDsKKworICAgIGV4ZWMtPnN0YWNrU2l6ZSA9IDA7CisgICAgZXhlYy0+bG9hZFNpemUgID0gMDsKKyAgICBleGVjLT5nbHlwaFNpemUgPSAwOworCisgICAgZXhlYy0+c3RhY2sgICAgID0gTlVMTDsKKyAgICBleGVjLT5sb2FkU3RhY2sgPSBOVUxMOworICAgIGV4ZWMtPmdseXBoSW5zICA9IE5VTEw7CisKKyAgICBleGVjLT5mYWNlID0gZmFjZTsKKyAgICBleGVjLT5zaXplID0gTlVMTDsKKworICAgIHJldHVybiBUVF9FcnJfT2s7CisKKyAgRmFpbF9NZW1vcnk6CisgICAgRlRfRVJST1IoKCAiVFQuQ29udGV4dF9DcmVhdGU6IG5vdCBlbm91Z2ggbWVtb3J5IGZvciAweCUwOGx4XG4iLAorICAgICAgICAgICAgIChsb25nKWV4ZWMgKSk7CisgICAgVFRfRGVzdHJveV9Db250ZXh0KCBleGVjLCBtZW1vcnkgKTsKKworICAgIHJldHVybiBlcnJvcjsKKyB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBVcGRhdGVfTWF4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBDaGVja3MgdGhlIHNpemUgb2YgYSBidWZmZXIgYW5kIHJlYWxsb2NhdGVzIGl0IGlmIG5lY2Vzc2FyeS4gICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBtdWx0aXBsaWVyIDo6IFRoZSBzaXplIGluIGJ5dGVzIG9mIGVhY2ggZWxlbWVudCBpbiB0aGUgYnVmZmVyLiAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG5ld19tYXggICAgOjogVGhlIG5ldyBjYXBhY2l0eSAoc2l6ZSkgb2YgdGhlIGJ1ZmZlci4gICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHNpemUgICAgICAgOjogVGhlIGFkZHJlc3Mgb2YgdGhlIGJ1ZmZlcidzIGN1cnJlbnQgc2l6ZSBleHByZXNzZWQgICAqLworICAvKiAgICAgICAgICAgICAgICAgIGluIGVsZW1lbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGJ1ZmYgICAgICAgOjogVGhlIGFkZHJlc3Mgb2YgdGhlIGJ1ZmZlciBiYXNlIHBvaW50ZXIuICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRydWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgc3RhdGljCisgIFRUX0Vycm9yICBVcGRhdGVfTWF4KCBGVF9NZW1vcnkgIG1lbW9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRUX1VMb25nKiAgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRUX0xvbmcgICAgbXVsdGlwbGllciwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqKiAgICAgYnVmZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRUX1VMb25nICAgbmV3X21heCApCisgIHsKKyAgICBUVF9FcnJvciAgZXJyb3I7CisKKworICAgIGlmICggKnNpemUgPCBuZXdfbWF4ICkKKyAgICB7CisgICAgICBGUkVFKCAqYnVmZiApOworICAgICAgaWYgKCBBTExPQyggKmJ1ZmYsIG5ld19tYXggKiBtdWx0aXBsaWVyICkgKQorICAgICAgICByZXR1cm4gZXJyb3I7CisgICAgICAqc2l6ZSA9IG5ld19tYXg7CisgICAgfQorCisgICAgcmV0dXJuIFRUX0Vycl9PazsKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVXBkYXRlX1pvbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQ2hlY2tzIHRoZSBzaXplIG9mIGEgem9uZSBhbmQgcmVhbGxvY2F0ZXMgaXQgaWYgbmVjZXNzYXJ5LiAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbmV3UG9pbnRzICAgOjogVGhlIG5ldyBjYXBhY2l0eSBmb3IgcG9pbnRzLiAgV2UgYWRkIHR3byBzbG90cyBmb3IgICovCisgIC8qICAgICAgICAgICAgICAgICAgIHBoYW50b20gcG9pbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbmV3Q29udG91cnMgOjogVGhlIG5ldyBjYXBhY2l0eSBmb3IgY29udG91cnMuICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgem9uZSAgICAgICAgOjogVGhlIGFkZHJlc3Mgb2YgdGhlIHRhcmdldCB6b25lLiAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBtYXhQb2ludHMgICA6OiBUaGUgYWRkcmVzcyBvZiB0aGUgem9uZSdzIGN1cnJlbnQgY2FwYWNpdHkgZm9yICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgcG9pbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBtYXhDb250b3VycyA6OiBUaGUgYWRkcmVzcyBvZiB0aGUgem9uZSdzIGN1cnJlbnQgY2FwYWNpdHkgZm9yICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgY29udG91cnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBzdGF0aWMKKyAgVFRfRXJyb3IgIFVwZGF0ZV9ab25lKCBGVF9NZW1vcnkgICAgICBtZW1vcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgVFRfR2x5cGhab25lKiAgem9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBUVF9VU2hvcnQqICAgICBtYXhQb2ludHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgVFRfU2hvcnQqICAgICAgbWF4Q29udG91cnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgVFRfVVNob3J0ICAgICAgbmV3UG9pbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgIFRUX1Nob3J0ICAgICAgIG5ld0NvbnRvdXJzICkKKyAgeworICAgIG5ld1BvaW50cyArPSAyOworCisgICAgaWYgKCAqbWF4UG9pbnRzIDwgbmV3UG9pbnRzIHx8ICptYXhDb250b3VycyA8IG5ld0NvbnRvdXJzICkKKyAgICB7CisgICAgICBUVF9FcnJvciAgZXJyb3I7CisKKworICAgICAgVFRfRG9uZV9HbHlwaFpvbmUoIG1lbW9yeSwgem9uZSApOworCisgICAgICBlcnJvciA9IFRUX05ld19HbHlwaFpvbmUoIG1lbW9yeSwgem9uZSwgbmV3UG9pbnRzLCBuZXdDb250b3VycyApOworICAgICAgaWYgKCBlcnJvciApCisgICAgICAgIHJldHVybiBlcnJvcjsKKworICAgICAgKm1heFBvaW50cyAgID0gbmV3UG9pbnRzOworICAgICAgKm1heENvbnRvdXJzID0gbmV3Q29udG91cnM7CisgICAgfQorCisgICAgcmV0dXJuIFRUX0Vycl9PazsKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfTG9hZF9Db250ZXh0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgUHJlcGFyZSBhbiBleGVjdXRpb24gY29udGV4dCBmb3IgZ2x5cGggaGludGluZy4gICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZmFjZSA6OiBBIGhhbmRsZSB0byB0aGUgc291cmNlIGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHNpemUgOjogQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBzaXplIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGV4ZWMgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBleGVjdXRpb24gY29udGV4dC4gICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRydWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIE9ubHkgdGhlIGdseXBoIGxvYWRlciBhbmQgZGVidWdnZXIgc2hvdWxkIGNhbGwgdGhpcyBmdW5jdGlvbi4gICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgRVhQT1JUX0ZVTkMKKyAgVFRfRXJyb3IgIFRUX0xvYWRfQ29udGV4dCggVFRfRXhlY0NvbnRleHQgIGV4ZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX0ZhY2UgICAgICAgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9TaXplICAgICAgICAgc2l6ZSApCisgIHsKKyAgICBUVF9JbnQgICAgICAgICAgaTsKKyAgICBUVF9VTG9uZyAgICAgICAgdG1wOworICAgIFRUX01heFByb2ZpbGUqICBtYXhwOworICAgIFRUX0Vycm9yICAgICAgICBlcnJvcjsKKworCisgICAgZXhlYy0+ZmFjZSA9IGZhY2U7CisgICAgbWF4cCAgICAgICA9ICZmYWNlLT5tYXhfcHJvZmlsZTsKKyAgICBleGVjLT5zaXplID0gc2l6ZTsKKworICAgIGlmICggc2l6ZSApCisgICAgeworICAgICAgZXhlYy0+bnVtRkRlZnMgICA9IHNpemUtPm51bV9mdW5jdGlvbl9kZWZzOworICAgICAgZXhlYy0+bWF4RkRlZnMgICA9IHNpemUtPm1heF9mdW5jdGlvbl9kZWZzOworICAgICAgZXhlYy0+bnVtSURlZnMgICA9IHNpemUtPm51bV9pbnN0cnVjdGlvbl9kZWZzOworICAgICAgZXhlYy0+bWF4SURlZnMgICA9IHNpemUtPm1heF9pbnN0cnVjdGlvbl9kZWZzOworICAgICAgZXhlYy0+RkRlZnMgICAgICA9IHNpemUtPmZ1bmN0aW9uX2RlZnM7CisgICAgICBleGVjLT5JRGVmcyAgICAgID0gc2l6ZS0+aW5zdHJ1Y3Rpb25fZGVmczsKKyAgICAgIGV4ZWMtPnR0X21ldHJpY3MgPSBzaXplLT50dG1ldHJpY3M7CisgICAgICBleGVjLT5tZXRyaWNzICAgID0gc2l6ZS0+cm9vdC5tZXRyaWNzOworCisgICAgICBleGVjLT5tYXhGdW5jICAgID0gc2l6ZS0+bWF4X2Z1bmM7CisgICAgICBleGVjLT5tYXhJbnMgICAgID0gc2l6ZS0+bWF4X2luczsKKworICAgICAgZm9yICggaSA9IDA7IGkgPCBUVF9NQVhfQ09ERV9SQU5HRVM7IGkrKyApCisgICAgICAgIGV4ZWMtPmNvZGVSYW5nZVRhYmxlW2ldID0gc2l6ZS0+Y29kZVJhbmdlVGFibGVbaV07CisKKyAgICAgIC8qIHNldCBncmFwaGljcyBzdGF0ZSAqLworICAgICAgZXhlYy0+R1MgPSBzaXplLT5HUzsKKworICAgICAgZXhlYy0+Y3Z0U2l6ZSA9IHNpemUtPmN2dF9zaXplOworICAgICAgZXhlYy0+Y3Z0ICAgICA9IHNpemUtPmN2dDsKKworICAgICAgZXhlYy0+c3RvcmVTaXplID0gc2l6ZS0+c3RvcmFnZV9zaXplOworICAgICAgZXhlYy0+c3RvcmFnZSAgID0gc2l6ZS0+c3RvcmFnZTsKKworICAgICAgZXhlYy0+dHdpbGlnaHQgID0gc2l6ZS0+dHdpbGlnaHQ7CisgICAgfQorCisgICAgZXJyb3IgPSBVcGRhdGVfTWF4KCBleGVjLT5tZW1vcnksCisgICAgICAgICAgICAgICAgICAgICAgICAmZXhlYy0+bG9hZFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YgKCBUVF9TdWJHbHlwaFJlYyApLAorICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKikmZXhlYy0+bG9hZFN0YWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgZXhlYy0+ZmFjZS0+bWF4X2NvbXBvbmVudHMgKyAxICk7CisgICAgaWYgKCBlcnJvciApCisgICAgICByZXR1cm4gZXJyb3I7CisKKyAgICAvKiBYWFg6IFdlIHJlc2VydmUgYSBsaXR0bGUgbW9yZSBlbGVtZW50cyBvbiB0aGUgc3RhY2sgdG8gZGVhbCBzYWZlbHkgKi8KKyAgICAvKiAgICAgIHdpdGggYnJva2VuIGZvbnRzIGxpa2UgYXJpYWxicywgY291cmJzLCB0aW1lc2JzLCBldGMuICAgICAgICAgKi8KKyAgICB0bXAgPSBleGVjLT5zdGFja1NpemU7CisgICAgZXJyb3IgPSBVcGRhdGVfTWF4KCBleGVjLT5tZW1vcnksCisgICAgICAgICAgICAgICAgICAgICAgICAmdG1wLAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mICggVFRfRjI2RG90NiApLAorICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKikmZXhlYy0+c3RhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICBtYXhwLT5tYXhTdGFja0VsZW1lbnRzICsgMzIgKTsKKyAgICBleGVjLT5zdGFja1NpemUgPSAoVFRfVUludCl0bXA7CisgICAgaWYgKCBlcnJvciApCisgICAgICByZXR1cm4gZXJyb3I7CisKKyAgICB0bXAgPSBleGVjLT5nbHlwaFNpemU7CisgICAgZXJyb3IgPSBVcGRhdGVfTWF4KCBleGVjLT5tZW1vcnksCisgICAgICAgICAgICAgICAgICAgICAgICAmdG1wLAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mICggVFRfQnl0ZSApLAorICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKikmZXhlYy0+Z2x5cGhJbnMsCisgICAgICAgICAgICAgICAgICAgICAgICBtYXhwLT5tYXhTaXplT2ZJbnN0cnVjdGlvbnMgKTsKKyAgICBleGVjLT5nbHlwaFNpemUgPSAoVFRfVVNob3J0KXRtcDsKKyAgICBpZiAoIGVycm9yICkKKyAgICAgIHJldHVybiBlcnJvcjsKKworICAgIC8qIFhYWDogVXBkYXRlX1pvbmUoKSByZXNlcnZlcyB0d28gcG9zaXRpb25zIGZvciB0aGUgcGhhbnRvbSBwb2ludHMhICovCisgICAgZXJyb3IgPSBVcGRhdGVfWm9uZSggZXhlYy0+bWVtb3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICZleGVjLT5wdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgJmV4ZWMtPm1heFBvaW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAmZXhlYy0+bWF4Q29udG91cnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgZXhlYy0+ZmFjZS0+cm9vdC5tYXhfcG9pbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWMtPmZhY2UtPnJvb3QubWF4X2NvbnRvdXJzICk7CisgICAgaWYgKCBlcnJvciApCisgICAgICByZXR1cm4gZXJyb3I7CisKKyAgICBleGVjLT5wdHMubl9wb2ludHMgICA9IDA7CisgICAgZXhlYy0+cHRzLm5fY29udG91cnMgPSAwOworCisgICAgZXhlYy0+aW5zdHJ1Y3Rpb25fdHJhcCA9IEZBTFNFOworCisgICAgcmV0dXJuIFRUX0Vycl9PazsKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfU2F2ZV9Db250ZXh0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgU2F2ZXMgdGhlIGNvZGUgcmFuZ2VzIGluIGEgYHNpemUnIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZXhlYyA6OiBBIGhhbmRsZSB0byB0aGUgc291cmNlIGV4ZWN1dGlvbiBjb250ZXh0LiAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgaW5zICA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IHNpemUgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVHJ1ZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgT25seSB0aGUgZ2x5cGggbG9hZGVyIGFuZCBkZWJ1Z2dlciBzaG91bGQgY2FsbCB0aGlzIGZ1bmN0aW9uLiAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBFWFBPUlRfRlVOQworICBUVF9FcnJvciAgVFRfU2F2ZV9Db250ZXh0KCBUVF9FeGVjQ29udGV4dCAgZXhlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfU2l6ZSAgICAgICAgIHNpemUgKQorICB7CisgICAgVFRfSW50ICBpOworCisgICAgLyogWFhYWDogV2lsbCBwcm9iYWJseSBkaXNhcHBlYXIgc29vbiB3aXRoIGFsbCB0aGUgY29kZSByYW5nZSAqLworICAgIC8qICAgICAgIG1hbmFnZW1lbnQsIHdoaWNoIGlzIG5vdyByYXRoZXIgb2Jzb2xldGUuICAgICAgICAgICAgKi8KKyAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgc2l6ZS0+bnVtX2Z1bmN0aW9uX2RlZnMgICAgPSBleGVjLT5udW1GRGVmczsKKyAgICBzaXplLT5udW1faW5zdHJ1Y3Rpb25fZGVmcyA9IGV4ZWMtPm51bUlEZWZzOworCisgICAgc2l6ZS0+bWF4X2Z1bmMgPSBleGVjLT5tYXhGdW5jOworICAgIHNpemUtPm1heF9pbnMgID0gZXhlYy0+bWF4SW5zOworCisgICAgZm9yICggaSA9IDA7IGkgPCBUVF9NQVhfQ09ERV9SQU5HRVM7IGkrKyApCisgICAgICBzaXplLT5jb2RlUmFuZ2VUYWJsZVtpXSA9IGV4ZWMtPmNvZGVSYW5nZVRhYmxlW2ldOworCisgICAgcmV0dXJuIFRUX0Vycl9PazsKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfUnVuX0NvbnRleHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRXhlY3V0ZXMgb25lIG9yIG1vcmUgaW5zdHJ1Y3Rpb25zIGluIHRoZSBleGVjdXRpb24gY29udGV4dC4gICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZGVidWcgOjogQSBCb29sZWFuIGZsYWcuICBJZiBzZXQsIHRoZSBmdW5jdGlvbiBzZXRzIHNvbWUgaW50ZXJuYWwgICovCisgIC8qICAgICAgICAgICAgIHZhcmlhYmxlcyBhbmQgcmV0dXJucyBpbW1lZGlhdGVseSwgb3RoZXJ3aXNlIFRUX1J1bklucygpICAqLworICAvKiAgICAgICAgICAgICBpcyBjYWxsZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBleGVjICA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGV4ZWN1dGlvbiBjb250ZXh0LiAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUcnVlVHlvZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBPbmx5IHRoZSBnbHlwaCBsb2FkZXIgYW5kIGRlYnVnZ2VyIHNob3VsZCBjYWxsIHRoaXMgZnVuY3Rpb24uICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEVYUE9SVF9GVU5DCisgIFRUX0Vycm9yICBUVF9SdW5fQ29udGV4dCggVFRfRXhlY0NvbnRleHQgIGV4ZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfQm9vbCAgICAgICAgIGRlYnVnICkKKyAgeworICAgIFRUX0Vycm9yICBlcnJvcjsKKworICAgIGlmICggKGVycm9yID0gVFRfR290b19Db2RlUmFuZ2UoIGV4ZWMsIHR0X2NvZGVyYW5nZV9nbHlwaCwgMCApKQorICAgICAgICAgICAhPSBUVF9FcnJfT2sgKQorICAgICAgcmV0dXJuIGVycm9yOworCisgICAgZXhlYy0+enAwID0gZXhlYy0+cHRzOworICAgIGV4ZWMtPnpwMSA9IGV4ZWMtPnB0czsKKyAgICBleGVjLT56cDIgPSBleGVjLT5wdHM7CisKKyAgICBleGVjLT5HUy5nZXAwID0gMTsKKyAgICBleGVjLT5HUy5nZXAxID0gMTsKKyAgICBleGVjLT5HUy5nZXAyID0gMTsKKworICAgIGV4ZWMtPkdTLnByb2pWZWN0b3IueCA9IDB4NDAwMDsKKyAgICBleGVjLT5HUy5wcm9qVmVjdG9yLnkgPSAweDAwMDA7CisKKyAgICBleGVjLT5HUy5mcmVlVmVjdG9yID0gZXhlYy0+R1MucHJvalZlY3RvcjsKKyAgICBleGVjLT5HUy5kdWFsVmVjdG9yID0gZXhlYy0+R1MucHJvalZlY3RvcjsKKworICAgIGV4ZWMtPkdTLnJvdW5kX3N0YXRlID0gMTsKKyAgICBleGVjLT5HUy5sb29wICAgICAgICA9IDE7CisKKyAgICAvKiBzb21lIGdseXBocyBsZWF2ZSBzb21ldGhpbmcgb24gdGhlIHN0YWNrLiBzbyB3ZSBjbGVhbiBpdCAqLworICAgIC8qIGJlZm9yZSBhIG5ldyBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgZXhlYy0+dG9wICAgICA9IDA7CisgICAgZXhlYy0+Y2FsbFRvcCA9IDA7CisKKyNpZiAxCisgICAgcmV0dXJuIGV4ZWMtPmZhY2UtPmludGVycHJldGVyKCBleGVjICk7CisjZWxzZQorICAgIGlmICggIWRlYnVnICkKKyAgICAgIHJldHVybiBUVF9SdW5JbnMoIGV4ZWMgKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4gVFRfRXJyX09rOworI2VuZGlmCisgIH0KKworCisgIExPQ0FMX0ZVTkMKKyAgY29uc3QgVFRfR3JhcGhpY3NTdGF0ZSAgdHRfZGVmYXVsdF9ncmFwaGljc19zdGF0ZSA9CisgIHsKKyAgICAwLCAwLCAwLAorICAgIHsgMHg0MDAwLCAwIH0sCisgICAgeyAweDQwMDAsIDAgfSwKKyAgICB7IDB4NDAwMCwgMCB9LAorICAgIDEsIDY0LCAxLAorICAgIFRSVUUsIDY4LCAwLCAwLCA5LCAzLAorICAgIDAsIEZBTFNFLCAyLCAxLCAxLCAxCisgIH07CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUVF9OZXdfQ29udGV4dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBRdWVyaWVzIHRoZSBmYWNlIGNvbnRleHQgZm9yIGEgZ2l2ZW4gZm9udC4gIE5vdGUgdGhhdCB0aGVyZSBpcyAgICAgKi8KKyAgLyogICAgbm93IGEgX3NpbmdsZV8gZXhlY3V0aW9uIGNvbnRleHQgaW4gdGhlIFRydWVUeXBlIGRyaXZlciB3aGljaCBpcyAgICovCisgIC8qICAgIHNoYXJlZCBhbW9uZyBmYWNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZhY2UgOjogQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgaGFuZGxlIHRvIHRoZSBleGVjdXRpb24gY29udGV4dC4gIEluaXRpYWxpemVkIGZvciBgZmFjZScuICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIE9ubHkgdGhlIGdseXBoIGxvYWRlciBhbmQgZGVidWdnZXIgc2hvdWxkIGNhbGwgdGhpcyBmdW5jdGlvbi4gICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgRVhQT1JUX0ZVTkMKKyAgVFRfRXhlY0NvbnRleHQgIFRUX05ld19Db250ZXh0KCBUVF9GYWNlICBmYWNlICkKKyAgeworICAgIFRUX0RyaXZlciAgICAgICBkcml2ZXIgPSAoVFRfRHJpdmVyKWZhY2UtPnJvb3QuZHJpdmVyOworICAgIFRUX0V4ZWNDb250ZXh0ICBleGVjOworICAgIEZUX01lbW9yeSAgICAgICBtZW1vcnkgPSBkcml2ZXItPnJvb3QubWVtb3J5OworCisKKyAgICBleGVjID0gZHJpdmVyLT5jb250ZXh0OworCisgICAgaWYgKCAhZHJpdmVyLT5jb250ZXh0ICkKKyAgICB7CisgICAgICBUVF9FcnJvciAgIGVycm9yOworCisKKyAgICAgIC8qIGFsbG9jYXRlIG9iamVjdCAqLworICAgICAgaWYgKCBBTExPQyggZXhlYywgc2l6ZW9mICggKmV4ZWMgKSApICkKKyAgICAgICAgZ290byBFeGl0OworCisgICAgICAvKiBpbml0aWFsaXplIGl0ICovCisgICAgICBlcnJvciA9IEluaXRfQ29udGV4dCggZXhlYywgZmFjZSwgbWVtb3J5ICk7CisgICAgICBpZiAoIGVycm9yICkKKyAgICAgICAgZ290byBGYWlsOworCisgICAgICAvKiBzdG9yZSBpdCBpbnRvIHRoZSBkcml2ZXIgKi8KKyAgICAgIGRyaXZlci0+Y29udGV4dCA9IGV4ZWM7CisgICAgfQorCisgIEV4aXQ6CisgICAgcmV0dXJuIGRyaXZlci0+Y29udGV4dDsKKworICBGYWlsOgorICAgIEZSRUUoIGV4ZWMgKTsKKworICAgIHJldHVybiAwOworICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUVF9Eb25lX0NvbnRleHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBEaXNjYXJkcyBhbiBleGVjdXRpb24gY29udGV4dC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBleGVjIDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZXhlY3V0aW9uIGNvbnRleHQuICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUcnVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBPbmx5IHRoZSBnbHlwaCBsb2FkZXIgYW5kIGRlYnVnZ2VyIHNob3VsZCBjYWxsIHRoaXMgZnVuY3Rpb24uICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEVYUE9SVF9GVU5DCisgIFRUX0Vycm9yICBUVF9Eb25lX0NvbnRleHQoIFRUX0V4ZWNDb250ZXh0ICBleGVjICkKKyAgeworICAgIC8qIE5vdGhpbmcgYXQgYWxsIGZvciBub3cgKi8KKyAgICBVTlVTRUQoIGV4ZWMgKTsKKworICAgIHJldHVybiBUVF9FcnJfT2s7CisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogQmVmb3JlIGFuIG9wY29kZSBpcyBleGVjdXRlZCwgdGhlIGludGVycHJldGVyIHZlcmlmaWVzIHRoYXQgdGhlcmUgYXJlICovCisgIC8qIGVub3VnaCBhcmd1bWVudHMgb24gdGhlIHN0YWNrLCB3aXRoIHRoZSBoZWxwIG9mIHRoZSBQb3BfUHVzaF9Db3VudCAgICAqLworICAvKiB0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIEZvciBlYWNoIG9wY29kZSwgdGhlIGZpcnN0IGNvbHVtbiBnaXZlcyB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cyB0aGF0ICAqLworICAvKiBhcmUgcG9wcGVkIGZyb20gdGhlIHN0YWNrOyB0aGUgc2Vjb25kIG9uZSBnaXZlcyB0aGUgbnVtYmVyIG9mIHRob3NlICAgKi8KKyAgLyogdGhhdCBhcmUgcHVzaGVkIGluIHJlc3VsdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBOb3RlIHRoYXQgZm9yIG9wY29kZXMgd2l0aCBhIHZhcnlpbmcgbnVtYmVyIG9mIHBhcmFtZXRlcnMsIGVpdGhlciAwICAgKi8KKyAgLyogb3IgMSBhcmcgaXMgdmVyaWZpZWQgYmVmb3JlIGV4ZWN1dGlvbiwgZGVwZW5kaW5nIG9uIHRoZSBuYXR1cmUgb2YgdGhlICovCisgIC8qIGluc3RydWN0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogLSBpZiB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cyBpcyBnaXZlbiBieSB0aGUgYnl0ZWNvZGUgc3RyZWFtIG9yIHRoZSAgICovCisgIC8qICAgbG9vcCB2YXJpYWJsZSwgMCBpcyBjaG9zZW4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogLSBpZiB0aGUgZmlyc3QgYXJndW1lbnQgaXMgYSBjb3VudCBuIHRoYXQgaXMgZm9sbG93ZWQgYnkgYXJndW1lbnRzICAgICovCisgIC8qICAgYTEgLi4gYW4sIHRoZW4gMSBpcyBjaG9zZW4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI3VuZGVmICBQQUNLCisjZGVmaW5lIFBBQ0soIHgsIHkgKSAgKCh4IDw8IDQpIHwgeSkKKworCisgIHN0YXRpYworICBjb25zdCBUVF9CeXRlICBQb3BfUHVzaF9Db3VudFsyNTZdID0KKyAgeworICAgIC8qIG9wY29kZXMgYXJlIGdhdGhlcmVkIGluIGdyb3VwcyBvZiAxNiAqLworICAgIC8qIHBsZWFzZSBrZWVwIHRoZSBzcGFjZXMgYXMgdGhleSBhcmUgICAqLworCisgICAgLyogIFNWVENBICB5ICAqLyAgUEFDSyggMCwgMCApLAorICAgIC8qICBTVlRDQSAgeCAgKi8gIFBBQ0soIDAsIDAgKSwKKyAgICAvKiAgU1B2VENBIHkgICovICBQQUNLKCAwLCAwICksCisgICAgLyogIFNQdlRDQSB4ICAqLyAgUEFDSyggMCwgMCApLAorICAgIC8qICBTRnZUQ0EgeSAgKi8gIFBBQ0soIDAsIDAgKSwKKyAgICAvKiAgU0Z2VENBIHggICovICBQQUNLKCAwLCAwICksCisgICAgLyogIFNQdlRMIC8vICAqLyAgUEFDSyggMiwgMCApLAorICAgIC8qICBTUHZUTCArICAgKi8gIFBBQ0soIDIsIDAgKSwKKyAgICAvKiAgU0Z2VEwgLy8gICovICBQQUNLKCAyLCAwICksCisgICAgLyogIFNGdlRMICsgICAqLyAgUEFDSyggMiwgMCApLAorICAgIC8qICBTUHZGUyAgICAgKi8gIFBBQ0soIDIsIDAgKSwKKyAgICAvKiAgU0Z2RlMgICAgICovICBQQUNLKCAyLCAwICksCisgICAgLyogIEdQViAgICAgICAqLyAgUEFDSyggMCwgMiApLAorICAgIC8qICBHRlYgICAgICAgKi8gIFBBQ0soIDAsIDIgKSwKKyAgICAvKiAgU0Z2VFB2ICAgICovICBQQUNLKCAwLCAwICksCisgICAgLyogIElTRUNUICAgICAqLyAgUEFDSyggNSwgMCApLAorCisgICAgLyogIFNSUDAgICAgICAqLyAgUEFDSyggMSwgMCApLAorICAgIC8qICBTUlAxICAgICAgKi8gIFBBQ0soIDEsIDAgKSwKKyAgICAvKiAgU1JQMiAgICAgICovICBQQUNLKCAxLCAwICksCisgICAgLyogIFNaUDAgICAgICAqLyAgUEFDSyggMSwgMCApLAorICAgIC8qICBTWlAxICAgICAgKi8gIFBBQ0soIDEsIDAgKSwKKyAgICAvKiAgU1pQMiAgICAgICovICBQQUNLKCAxLCAwICksCisgICAgLyogIFNaUFMgICAgICAqLyAgUEFDSyggMSwgMCApLAorICAgIC8qICBTTE9PUCAgICAgKi8gIFBBQ0soIDEsIDAgKSwKKyAgICAvKiAgUlRHICAgICAgICovICBQQUNLKCAwLCAwICksCisgICAgLyogIFJUSEcgICAgICAqLyAgUEFDSyggMCwgMCApLAorICAgIC8qICBTTUQgICAgICAgKi8gIFBBQ0soIDEsIDAgKSwKKyAgICAvKiAgRUxTRSAgICAgICovICBQQUNLKCAwLCAwICksCisgICAgLyogIEpNUFIgICAgICAqLyAgUEFDSyggMSwgMCApLAorICAgIC8qICBTQ3ZUQ2kgICAgKi8gIFBBQ0soIDEsIDAgKSwKKyAgICAvKiAgU1N3Q2kgICAgICovICBQQUNLKCAxLCAwICksCisgICAgLyogIFNTVyAgICAgICAqLyAgUEFDSyggMSwgMCApLAorCisgICAgLyogIERVUCAgICAgICAqLyAgUEFDSyggMSwgMiApLAorICAgIC8qICBQT1AgICAgICAgKi8gIFBBQ0soIDEsIDAgKSwKKyAgICAvKiAgQ0xFQVIgICAgICovICBQQUNLKCAwLCAwICksCisgICAgLyogIFNXQVAgICAgICAqLyAgUEFDSyggMiwgMiApLAorICAgIC8qICBERVBUSCAgICAgKi8gIFBBQ0soIDAsIDEgKSwKKyAgICAvKiAgQ0lOREVYICAgICovICBQQUNLKCAxLCAxICksCisgICAgLyogIE1JTkRFWCAgICAqLyAgUEFDSyggMSwgMCApLAorICAgIC8qICBBbGlnblBUUyAgKi8gIFBBQ0soIDIsIDAgKSwKKyAgICAvKiAgSU5TXyQyOCAgICovICBQQUNLKCAwLCAwICksCisgICAgLyogIFVUUCAgICAgICAqLyAgUEFDSyggMSwgMCApLAorICAgIC8qICBMT09QQ0FMTCAgKi8gIFBBQ0soIDIsIDAgKSwKKyAgICAvKiAgQ0FMTCAgICAgICovICBQQUNLKCAxLCAwICksCisgICAgLyogIEZERUYgICAgICAqLyAgUEFDSyggMSwgMCApLAorICAgIC8qICBFTkRGICAgICAgKi8gIFBBQ0soIDAsIDAgKSwKKyAgICAvKiAgTURBUFswXSAgICovICBQQUNLKCAxLCAwICksCisgICAgLyogIE1EQVBbMV0gICAqLyAgUEFDSyggMSwgMCApLAorCisgICAgLyogIElVUFswXSAgICAqLyAgUEFDSyggMCwgMCApLAorICAgIC8qICBJVVBbMV0gICAgKi8gIFBBQ0soIDAsIDAgKSwKKyAgICAvKiAgU0hQWzBdICAgICovICBQQUNLKCAwLCAwICksCisgICAgLyogIFNIUFsxXSAgICAqLyAgUEFDSyggMCwgMCApLAorICAgIC8qICBTSENbMF0gICAgKi8gIFBBQ0soIDEsIDAgKSwKKyAgICAvKiAgU0hDWzFdICAgICovICBQQUNLKCAxLCAwICksCisgICAgLyogIFNIWlswXSAgICAqLyAgUEFDSyggMSwgMCApLAorICAgIC8qICBTSFpbMV0gICAgKi8gIFBBQ0soIDEsIDAgKSwKKyAgICAvKiAgU0hQSVggICAgICovICBQQUNLKCAxLCAwICksCisgICAgLyogIElQICAgICAgICAqLyAgUEFDSyggMCwgMCApLAorICAgIC8qICBNU0lSUFswXSAgKi8gIFBBQ0soIDIsIDAgKSwKKyAgICAvKiAgTVNJUlBbMV0gICovICBQQUNLKCAyLCAwICksCisgICAgLyogIEFsaWduUlAgICAqLyAgUEFDSyggMCwgMCApLAorICAgIC8qICBSVERHICAgICAgKi8gIFBBQ0soIDAsIDAgKSwKKyAgICAvKiAgTUlBUFswXSAgICovICBQQUNLKCAyLCAwICksCisgICAgLyogIE1JQVBbMV0gICAqLyAgUEFDSyggMiwgMCApLAorCisgICAgLyogIE5QdXNoQiAgICAqLyAgUEFDSyggMCwgMCApLAorICAgIC8qICBOUHVzaFcgICAgKi8gIFBBQ0soIDAsIDAgKSwKKyAgICAvKiAgV1MgICAgICAgICovICBQQUNLKCAyLCAwICksCisgICAgLyogIFJTICAgICAgICAqLyAgUEFDSyggMSwgMSApLAorICAgIC8qICBXQ3Z0UCAgICAgKi8gIFBBQ0soIDIsIDAgKSwKKyAgICAvKiAgUkN2dCAgICAgICovICBQQUNLKCAxLCAxICksCisgICAgLyogIEdDWzBdICAgICAqLyAgUEFDSyggMSwgMSApLAorICAgIC8qICBHQ1sxXSAgICAgKi8gIFBBQ0soIDEsIDEgKSwKKyAgICAvKiAgU0NGUyAgICAgICovICBQQUNLKCAyLCAwICksCisgICAgLyogIE1EWzBdICAgICAqLyAgUEFDSyggMiwgMSApLAorICAgIC8qICBNRFsxXSAgICAgKi8gIFBBQ0soIDIsIDEgKSwKKyAgICAvKiAgTVBQRU0gICAgICovICBQQUNLKCAwLCAxICksCisgICAgLyogIE1QUyAgICAgICAqLyAgUEFDSyggMCwgMSApLAorICAgIC8qICBGbGlwT04gICAgKi8gIFBBQ0soIDAsIDAgKSwKKyAgICAvKiAgRmxpcE9GRiAgICovICBQQUNLKCAwLCAwICksCisgICAgLyogIERFQlVHICAgICAqLyAgUEFDSyggMSwgMCApLAorCisgICAgLyogIExUICAgICAgICAqLyAgUEFDSyggMiwgMSApLAorICAgIC8qICBMVEVRICAgICAgKi8gIFBBQ0soIDIsIDEgKSwKKyAgICAvKiAgR1QgICAgICAgICovICBQQUNLKCAyLCAxICksCisgICAgLyogIEdURVEgICAgICAqLyAgUEFDSyggMiwgMSApLAorICAgIC8qICBFUSAgICAgICAgKi8gIFBBQ0soIDIsIDEgKSwKKyAgICAvKiAgTkVRICAgICAgICovICBQQUNLKCAyLCAxICksCisgICAgLyogIE9ERCAgICAgICAqLyAgUEFDSyggMSwgMSApLAorICAgIC8qICBFVkVOICAgICAgKi8gIFBBQ0soIDEsIDEgKSwKKyAgICAvKiAgSUYgICAgICAgICovICBQQUNLKCAxLCAwICksCisgICAgLyogIEVJRiAgICAgICAqLyAgUEFDSyggMCwgMCApLAorICAgIC8qICBBTkQgICAgICAgKi8gIFBBQ0soIDIsIDEgKSwKKyAgICAvKiAgT1IgICAgICAgICovICBQQUNLKCAyLCAxICksCisgICAgLyogIE5PVCAgICAgICAqLyAgUEFDSyggMSwgMSApLAorICAgIC8qICBEZWx0YVAxICAgKi8gIFBBQ0soIDEsIDAgKSwKKyAgICAvKiAgU0RCICAgICAgICovICBQQUNLKCAxLCAwICksCisgICAgLyogIFNEUyAgICAgICAqLyAgUEFDSyggMSwgMCApLAorCisgICAgLyogIEFERCAgICAgICAqLyAgUEFDSyggMiwgMSApLAorICAgIC8qICBTVUIgICAgICAgKi8gIFBBQ0soIDIsIDEgKSwKKyAgICAvKiAgRElWICAgICAgICovICBQQUNLKCAyLCAxICksCisgICAgLyogIE1VTCAgICAgICAqLyAgUEFDSyggMiwgMSApLAorICAgIC8qICBBQlMgICAgICAgKi8gIFBBQ0soIDEsIDEgKSwKKyAgICAvKiAgTkVHICAgICAgICovICBQQUNLKCAxLCAxICksCisgICAgLyogIEZMT09SICAgICAqLyAgUEFDSyggMSwgMSApLAorICAgIC8qICBDRUlMSU5HICAgKi8gIFBBQ0soIDEsIDEgKSwKKyAgICAvKiAgUk9VTkRbMF0gICovICBQQUNLKCAxLCAxICksCisgICAgLyogIFJPVU5EWzFdICAqLyAgUEFDSyggMSwgMSApLAorICAgIC8qICBST1VORFsyXSAgKi8gIFBBQ0soIDEsIDEgKSwKKyAgICAvKiAgUk9VTkRbM10gICovICBQQUNLKCAxLCAxICksCisgICAgLyogIE5ST1VORFswXSAqLyAgUEFDSyggMSwgMSApLAorICAgIC8qICBOUk9VTkRbMV0gKi8gIFBBQ0soIDEsIDEgKSwKKyAgICAvKiAgTlJPVU5EWzJdICovICBQQUNLKCAxLCAxICksCisgICAgLyogIE5ST1VORFszXSAqLyAgUEFDSyggMSwgMSApLAorCisgICAgLyogIFdDdnRGICAgICAqLyAgUEFDSyggMiwgMCApLAorICAgIC8qICBEZWx0YVAyICAgKi8gIFBBQ0soIDEsIDAgKSwKKyAgICAvKiAgRGVsdGFQMyAgICovICBQQUNLKCAxLCAwICksCisgICAgLyogIERlbHRhQ25bMF0gKi8gUEFDSyggMSwgMCApLAorICAgIC8qICBEZWx0YUNuWzFdICovIFBBQ0soIDEsIDAgKSwKKyAgICAvKiAgRGVsdGFDblsyXSAqLyBQQUNLKCAxLCAwICksCisgICAgLyogIFNST1VORCAgICAqLyAgUEFDSyggMSwgMCApLAorICAgIC8qICBTNDVSb3VuZCAgKi8gIFBBQ0soIDEsIDAgKSwKKyAgICAvKiAgSlJPVCAgICAgICovICBQQUNLKCAyLCAwICksCisgICAgLyogIEpST0YgICAgICAqLyAgUEFDSyggMiwgMCApLAorICAgIC8qICBST0ZGICAgICAgKi8gIFBBQ0soIDAsIDAgKSwKKyAgICAvKiAgSU5TXyQ3QiAgICovICBQQUNLKCAwLCAwICksCisgICAgLyogIFJVVEcgICAgICAqLyAgUEFDSyggMCwgMCApLAorICAgIC8qICBSRFRHICAgICAgKi8gIFBBQ0soIDAsIDAgKSwKKyAgICAvKiAgU0FOR1cgICAgICovICBQQUNLKCAxLCAwICksCisgICAgLyogIEFBICAgICAgICAqLyAgUEFDSyggMSwgMCApLAorCisgICAgLyogIEZsaXBQVCAgICAqLyAgUEFDSyggMCwgMCApLAorICAgIC8qICBGbGlwUmdPTiAgKi8gIFBBQ0soIDIsIDAgKSwKKyAgICAvKiAgRmxpcFJnT0ZGICovICBQQUNLKCAyLCAwICksCisgICAgLyogIElOU18kODMgICAqLyAgUEFDSyggMCwgMCApLAorICAgIC8qICBJTlNfJDg0ICAgKi8gIFBBQ0soIDAsIDAgKSwKKyAgICAvKiAgU2NhbkNUUkwgICovICBQQUNLKCAxLCAwICksCisgICAgLyogIFNEVlBUTFswXSAqLyAgUEFDSyggMiwgMCApLAorICAgIC8qICBTRFZQVExbMV0gKi8gIFBBQ0soIDIsIDAgKSwKKyAgICAvKiAgR2V0SU5GTyAgICovICBQQUNLKCAxLCAxICksCisgICAgLyogIElERUYgICAgICAqLyAgUEFDSyggMSwgMCApLAorICAgIC8qICBST0xMICAgICAgKi8gIFBBQ0soIDMsIDMgKSwKKyAgICAvKiAgTUFYICAgICAgICovICBQQUNLKCAyLCAxICksCisgICAgLyogIE1JTiAgICAgICAqLyAgUEFDSyggMiwgMSApLAorICAgIC8qICBTY2FuVFlQRSAgKi8gIFBBQ0soIDEsIDAgKSwKKyAgICAvKiAgSW5zdENUUkwgICovICBQQUNLKCAyLCAwICksCisgICAgLyogIElOU18kOEYgICAqLyAgUEFDSyggMCwgMCApLAorCisgICAgLyogIElOU18kOTAgICovICAgUEFDSyggMCwgMCApLAorICAgIC8qICBJTlNfJDkxICAqLyAgIFBBQ0soIDAsIDAgKSwKKyAgICAvKiAgSU5TXyQ5MiAgKi8gICBQQUNLKCAwLCAwICksCisgICAgLyogIElOU18kOTMgICovICAgUEFDSyggMCwgMCApLAorICAgIC8qICBJTlNfJDk0ICAqLyAgIFBBQ0soIDAsIDAgKSwKKyAgICAvKiAgSU5TXyQ5NSAgKi8gICBQQUNLKCAwLCAwICksCisgICAgLyogIElOU18kOTYgICovICAgUEFDSyggMCwgMCApLAorICAgIC8qICBJTlNfJDk3ICAqLyAgIFBBQ0soIDAsIDAgKSwKKyAgICAvKiAgSU5TXyQ5OCAgKi8gICBQQUNLKCAwLCAwICksCisgICAgLyogIElOU18kOTkgICovICAgUEFDSyggMCwgMCApLAorICAgIC8qICBJTlNfJDlBICAqLyAgIFBBQ0soIDAsIDAgKSwKKyAgICAvKiAgSU5TXyQ5QiAgKi8gICBQQUNLKCAwLCAwICksCisgICAgLyogIElOU18kOUMgICovICAgUEFDSyggMCwgMCApLAorICAgIC8qICBJTlNfJDlEICAqLyAgIFBBQ0soIDAsIDAgKSwKKyAgICAvKiAgSU5TXyQ5RSAgKi8gICBQQUNLKCAwLCAwICksCisgICAgLyogIElOU18kOUYgICovICAgUEFDSyggMCwgMCApLAorCisgICAgLyogIElOU18kQTAgICovICAgUEFDSyggMCwgMCApLAorICAgIC8qICBJTlNfJEExICAqLyAgIFBBQ0soIDAsIDAgKSwKKyAgICAvKiAgSU5TXyRBMiAgKi8gICBQQUNLKCAwLCAwICksCisgICAgLyogIElOU18kQTMgICovICAgUEFDSyggMCwgMCApLAorICAgIC8qICBJTlNfJEE0ICAqLyAgIFBBQ0soIDAsIDAgKSwKKyAgICAvKiAgSU5TXyRBNSAgKi8gICBQQUNLKCAwLCAwICksCisgICAgLyogIElOU18kQTYgICovICAgUEFDSyggMCwgMCApLAorICAgIC8qICBJTlNfJEE3ICAqLyAgIFBBQ0soIDAsIDAgKSwKKyAgICAvKiAgSU5TXyRBOCAgKi8gICBQQUNLKCAwLCAwICksCisgICAgLyogIElOU18kQTkgICovICAgUEFDSyggMCwgMCApLAorICAgIC8qICBJTlNfJEFBICAqLyAgIFBBQ0soIDAsIDAgKSwKKyAgICAvKiAgSU5TXyRBQiAgKi8gICBQQUNLKCAwLCAwICksCisgICAgLyogIElOU18kQUMgICovICAgUEFDSyggMCwgMCApLAorICAgIC8qICBJTlNfJEFEICAqLyAgIFBBQ0soIDAsIDAgKSwKKyAgICAvKiAgSU5TXyRBRSAgKi8gICBQQUNLKCAwLCAwICksCisgICAgLyogIElOU18kQUYgICovICAgUEFDSyggMCwgMCApLAorCisgICAgLyogIFB1c2hCWzBdICAqLyAgUEFDSyggMCwgMSApLAorICAgIC8qICBQdXNoQlsxXSAgKi8gIFBBQ0soIDAsIDIgKSwKKyAgICAvKiAgUHVzaEJbMl0gICovICBQQUNLKCAwLCAzICksCisgICAgLyogIFB1c2hCWzNdICAqLyAgUEFDSyggMCwgNCApLAorICAgIC8qICBQdXNoQls0XSAgKi8gIFBBQ0soIDAsIDUgKSwKKyAgICAvKiAgUHVzaEJbNV0gICovICBQQUNLKCAwLCA2ICksCisgICAgLyogIFB1c2hCWzZdICAqLyAgUEFDSyggMCwgNyApLAorICAgIC8qICBQdXNoQls3XSAgKi8gIFBBQ0soIDAsIDggKSwKKyAgICAvKiAgUHVzaFdbMF0gICovICBQQUNLKCAwLCAxICksCisgICAgLyogIFB1c2hXWzFdICAqLyAgUEFDSyggMCwgMiApLAorICAgIC8qICBQdXNoV1syXSAgKi8gIFBBQ0soIDAsIDMgKSwKKyAgICAvKiAgUHVzaFdbM10gICovICBQQUNLKCAwLCA0ICksCisgICAgLyogIFB1c2hXWzRdICAqLyAgUEFDSyggMCwgNSApLAorICAgIC8qICBQdXNoV1s1XSAgKi8gIFBBQ0soIDAsIDYgKSwKKyAgICAvKiAgUHVzaFdbNl0gICovICBQQUNLKCAwLCA3ICksCisgICAgLyogIFB1c2hXWzddICAqLyAgUEFDSyggMCwgOCApLAorCisgICAgLyogIE1EUlBbMDBdICAqLyAgUEFDSyggMSwgMCApLAorICAgIC8qICBNRFJQWzAxXSAgKi8gIFBBQ0soIDEsIDAgKSwKKyAgICAvKiAgTURSUFswMl0gICovICBQQUNLKCAxLCAwICksCisgICAgLyogIE1EUlBbMDNdICAqLyAgUEFDSyggMSwgMCApLAorICAgIC8qICBNRFJQWzA0XSAgKi8gIFBBQ0soIDEsIDAgKSwKKyAgICAvKiAgTURSUFswNV0gICovICBQQUNLKCAxLCAwICksCisgICAgLyogIE1EUlBbMDZdICAqLyAgUEFDSyggMSwgMCApLAorICAgIC8qICBNRFJQWzA3XSAgKi8gIFBBQ0soIDEsIDAgKSwKKyAgICAvKiAgTURSUFswOF0gICovICBQQUNLKCAxLCAwICksCisgICAgLyogIE1EUlBbMDldICAqLyAgUEFDSyggMSwgMCApLAorICAgIC8qICBNRFJQWzEwXSAgKi8gIFBBQ0soIDEsIDAgKSwKKyAgICAvKiAgTURSUFsxMV0gICovICBQQUNLKCAxLCAwICksCisgICAgLyogIE1EUlBbMTJdICAqLyAgUEFDSyggMSwgMCApLAorICAgIC8qICBNRFJQWzEzXSAgKi8gIFBBQ0soIDEsIDAgKSwKKyAgICAvKiAgTURSUFsxNF0gICovICBQQUNLKCAxLCAwICksCisgICAgLyogIE1EUlBbMTVdICAqLyAgUEFDSyggMSwgMCApLAorCisgICAgLyogIE1EUlBbMTZdICAqLyAgUEFDSyggMSwgMCApLAorICAgIC8qICBNRFJQWzE3XSAgKi8gIFBBQ0soIDEsIDAgKSwKKyAgICAvKiAgTURSUFsxOF0gICovICBQQUNLKCAxLCAwICksCisgICAgLyogIE1EUlBbMTldICAqLyAgUEFDSyggMSwgMCApLAorICAgIC8qICBNRFJQWzIwXSAgKi8gIFBBQ0soIDEsIDAgKSwKKyAgICAvKiAgTURSUFsyMV0gICovICBQQUNLKCAxLCAwICksCisgICAgLyogIE1EUlBbMjJdICAqLyAgUEFDSyggMSwgMCApLAorICAgIC8qICBNRFJQWzIzXSAgKi8gIFBBQ0soIDEsIDAgKSwKKyAgICAvKiAgTURSUFsyNF0gICovICBQQUNLKCAxLCAwICksCisgICAgLyogIE1EUlBbMjVdICAqLyAgUEFDSyggMSwgMCApLAorICAgIC8qICBNRFJQWzI2XSAgKi8gIFBBQ0soIDEsIDAgKSwKKyAgICAvKiAgTURSUFsyN10gICovICBQQUNLKCAxLCAwICksCisgICAgLyogIE1EUlBbMjhdICAqLyAgUEFDSyggMSwgMCApLAorICAgIC8qICBNRFJQWzI5XSAgKi8gIFBBQ0soIDEsIDAgKSwKKyAgICAvKiAgTURSUFszMF0gICovICBQQUNLKCAxLCAwICksCisgICAgLyogIE1EUlBbMzFdICAqLyAgUEFDSyggMSwgMCApLAorCisgICAgLyogIE1JUlBbMDBdICAqLyAgUEFDSyggMiwgMCApLAorICAgIC8qICBNSVJQWzAxXSAgKi8gIFBBQ0soIDIsIDAgKSwKKyAgICAvKiAgTUlSUFswMl0gICovICBQQUNLKCAyLCAwICksCisgICAgLyogIE1JUlBbMDNdICAqLyAgUEFDSyggMiwgMCApLAorICAgIC8qICBNSVJQWzA0XSAgKi8gIFBBQ0soIDIsIDAgKSwKKyAgICAvKiAgTUlSUFswNV0gICovICBQQUNLKCAyLCAwICksCisgICAgLyogIE1JUlBbMDZdICAqLyAgUEFDSyggMiwgMCApLAorICAgIC8qICBNSVJQWzA3XSAgKi8gIFBBQ0soIDIsIDAgKSwKKyAgICAvKiAgTUlSUFswOF0gICovICBQQUNLKCAyLCAwICksCisgICAgLyogIE1JUlBbMDldICAqLyAgUEFDSyggMiwgMCApLAorICAgIC8qICBNSVJQWzEwXSAgKi8gIFBBQ0soIDIsIDAgKSwKKyAgICAvKiAgTUlSUFsxMV0gICovICBQQUNLKCAyLCAwICksCisgICAgLyogIE1JUlBbMTJdICAqLyAgUEFDSyggMiwgMCApLAorICAgIC8qICBNSVJQWzEzXSAgKi8gIFBBQ0soIDIsIDAgKSwKKyAgICAvKiAgTUlSUFsxNF0gICovICBQQUNLKCAyLCAwICksCisgICAgLyogIE1JUlBbMTVdICAqLyAgUEFDSyggMiwgMCApLAorCisgICAgLyogIE1JUlBbMTZdICAqLyAgUEFDSyggMiwgMCApLAorICAgIC8qICBNSVJQWzE3XSAgKi8gIFBBQ0soIDIsIDAgKSwKKyAgICAvKiAgTUlSUFsxOF0gICovICBQQUNLKCAyLCAwICksCisgICAgLyogIE1JUlBbMTldICAqLyAgUEFDSyggMiwgMCApLAorICAgIC8qICBNSVJQWzIwXSAgKi8gIFBBQ0soIDIsIDAgKSwKKyAgICAvKiAgTUlSUFsyMV0gICovICBQQUNLKCAyLCAwICksCisgICAgLyogIE1JUlBbMjJdICAqLyAgUEFDSyggMiwgMCApLAorICAgIC8qICBNSVJQWzIzXSAgKi8gIFBBQ0soIDIsIDAgKSwKKyAgICAvKiAgTUlSUFsyNF0gICovICBQQUNLKCAyLCAwICksCisgICAgLyogIE1JUlBbMjVdICAqLyAgUEFDSyggMiwgMCApLAorICAgIC8qICBNSVJQWzI2XSAgKi8gIFBBQ0soIDIsIDAgKSwKKyAgICAvKiAgTUlSUFsyN10gICovICBQQUNLKCAyLCAwICksCisgICAgLyogIE1JUlBbMjhdICAqLyAgUEFDSyggMiwgMCApLAorICAgIC8qICBNSVJQWzI5XSAgKi8gIFBBQ0soIDIsIDAgKSwKKyAgICAvKiAgTUlSUFszMF0gICovICBQQUNLKCAyLCAwICksCisgICAgLyogIE1JUlBbMzFdICAqLyAgUEFDSyggMiwgMCApCisgIH07CisKKworICBzdGF0aWMKKyAgY29uc3QgVFRfQ2hhciAgb3Bjb2RlX2xlbmd0aFsyNTZdID0KKyAgeworICAgIDEsIDEsIDEsIDEsICAxLCAxLCAxLCAxLCAgMSwgMSwgMSwgMSwgIDEsIDEsIDEsIDEsCisgICAgMSwgMSwgMSwgMSwgIDEsIDEsIDEsIDEsICAxLCAxLCAxLCAxLCAgMSwgMSwgMSwgMSwKKyAgICAxLCAxLCAxLCAxLCAgMSwgMSwgMSwgMSwgIDEsIDEsIDEsIDEsICAxLCAxLCAxLCAxLAorICAgIDEsIDEsIDEsIDEsICAxLCAxLCAxLCAxLCAgMSwgMSwgMSwgMSwgIDEsIDEsIDEsIDEsCisKKyAgIC0xLC0xLCAxLCAxLCAgMSwgMSwgMSwgMSwgIDEsIDEsIDEsIDEsICAxLCAxLCAxLCAxLAorICAgIDEsIDEsIDEsIDEsICAxLCAxLCAxLCAxLCAgMSwgMSwgMSwgMSwgIDEsIDEsIDEsIDEsCisgICAgMSwgMSwgMSwgMSwgIDEsIDEsIDEsIDEsICAxLCAxLCAxLCAxLCAgMSwgMSwgMSwgMSwKKyAgICAxLCAxLCAxLCAxLCAgMSwgMSwgMSwgMSwgIDEsIDEsIDEsIDEsICAxLCAxLCAxLCAxLAorCisgICAgMSwgMSwgMSwgMSwgIDEsIDEsIDEsIDEsICAxLCAxLCAxLCAxLCAgMSwgMSwgMSwgMSwKKyAgICAxLCAxLCAxLCAxLCAgMSwgMSwgMSwgMSwgIDEsIDEsIDEsIDEsICAxLCAxLCAxLCAxLAorICAgIDEsIDEsIDEsIDEsICAxLCAxLCAxLCAxLCAgMSwgMSwgMSwgMSwgIDEsIDEsIDEsIDEsCisgICAgMiwgMywgNCwgNSwgIDYsIDcsIDgsIDksICAzLCA1LCA3LCA5LCAxMSwxMywxNSwxNywKKworICAgIDEsIDEsIDEsIDEsICAxLCAxLCAxLCAxLCAgMSwgMSwgMSwgMSwgIDEsIDEsIDEsIDEsCisgICAgMSwgMSwgMSwgMSwgIDEsIDEsIDEsIDEsICAxLCAxLCAxLCAxLCAgMSwgMSwgMSwgMSwKKyAgICAxLCAxLCAxLCAxLCAgMSwgMSwgMSwgMSwgIDEsIDEsIDEsIDEsICAxLCAxLCAxLCAxLAorICAgIDEsIDEsIDEsIDEsICAxLCAxLCAxLCAxLCAgMSwgMSwgMSwgMSwgIDEsIDEsIDEsIDEKKyAgfTsKKworICBzdGF0aWMKKyAgY29uc3QgVFRfVmVjdG9yICBOdWxsX1ZlY3RvciA9IHswLDB9OworCisKKyN1bmRlZiAgUEFDSworCisKKyN1bmRlZiAgTlVMTF9WZWN0b3IKKyNkZWZpbmUgTlVMTF9WZWN0b3IgKFRUX1ZlY3RvciopJk51bGxfVmVjdG9yCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBDdXJyZW50X1JhdGlvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBSZXR1cm5zIHRoZSBjdXJyZW50IGFzcGVjdCByYXRpbyBzY2FsaW5nIGZhY3RvciBkZXBlbmRpbmcgb24gdGhlICAgKi8KKyAgLyogICAgcHJvamVjdGlvbiB2ZWN0b3IncyBzdGF0ZSBhbmQgZGV2aWNlIHJlc29sdXRpb25zLiAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhlIGFzcGVjdCByYXRpbyBpbiAxNi4xNiBmb3JtYXQsIGFsd2F5cyA8PSAxLjAgLiAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBzdGF0aWMKKyAgVFRfTG9uZyAgQ3VycmVudF9SYXRpbyggRVhFQ19PUCApCisgIHsKKyAgICBpZiAoIENVUi50dF9tZXRyaWNzLnJhdGlvICkKKyAgICAgIHJldHVybiBDVVIudHRfbWV0cmljcy5yYXRpbzsKKworICAgIGlmICggQ1VSLkdTLnByb2pWZWN0b3IueSA9PSAwICkKKyAgICAgIENVUi50dF9tZXRyaWNzLnJhdGlvID0gQ1VSLnR0X21ldHJpY3MueF9yYXRpbzsKKworICAgIGVsc2UgaWYgKCBDVVIuR1MucHJvalZlY3Rvci54ID09IDAgKQorICAgICAgQ1VSLnR0X21ldHJpY3MucmF0aW8gPSBDVVIudHRfbWV0cmljcy55X3JhdGlvOworCisgICAgZWxzZQorICAgIHsKKyAgICAgIFRUX0xvbmcgIHgsIHk7CisjaWYgMAorICAgICAgeCA9IFRUX01VTERJViggQ1VSLkdTLnByb2pWZWN0b3IueCwgQ1VSLnR0X21ldHJpY3MueF9yYXRpbywgMHg0MDAwICk7CisgICAgICB5ID0gVFRfTVVMRElWKCBDVVIuR1MucHJvalZlY3Rvci55LCBDVVIudHRfbWV0cmljcy55X3JhdGlvLCAweDQwMDAgKTsKKyAgICAgIENVUi50dF9tZXRyaWNzLnJhdGlvID0gTm9ybSggeCwgeSApOworI2Vsc2UKKyAgICAgIHggPSBUVF9NVUxESVYoIENVUi5HUy5wcm9qVmVjdG9yLngsIENVUi50dF9tZXRyaWNzLnhfcmF0aW8sIDB4ODAwMCApOworICAgICAgeSA9IFRUX01VTERJViggQ1VSLkdTLnByb2pWZWN0b3IueSwgQ1VSLnR0X21ldHJpY3MueV9yYXRpbywgMHg4MDAwICk7CisgICAgICBDVVIudHRfbWV0cmljcy5yYXRpbyA9IEZUX1NxcnQzMiggeCp4K3kqeSApIDw8IDE7CisjZW5kaWYKKyAgICB9CisKKyAgICByZXR1cm4gQ1VSLnR0X21ldHJpY3MucmF0aW87CisgIH0KKworCisgIHN0YXRpYworICBUVF9Mb25nICBDdXJyZW50X1BwZW0oIEVYRUNfT1AgKQorICB7CisgICAgcmV0dXJuIFRUX01VTEZJWCggQ1VSLnR0X21ldHJpY3MucHBlbSwgQ1VSUkVOVF9SYXRpbygpICk7CisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogRnVuY3Rpb25zIHJlbGF0ZWQgdG8gdGhlIGNvbnRyb2wgdmFsdWUgdGFibGUgKENWVCkuICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisgIHN0YXRpYworICBUVF9GMjZEb3Q2ICBSZWFkX0NWVCggRVhFQ19PUF8gVFRfVUxvbmcgIGluZGV4ICkKKyAgeworICAgIHJldHVybiBDVVIuY3Z0W2luZGV4XTsKKyAgfQorCisKKyAgc3RhdGljCisgIFRUX0YyNkRvdDYgIFJlYWRfQ1ZUX1N0cmV0Y2hlZCggRVhFQ19PUF8gVFRfVUxvbmcgIGluZGV4ICkKKyAgeworICAgIHJldHVybiBUVF9NVUxGSVgoIENVUi5jdnRbaW5kZXhdLCBDVVJSRU5UX1JhdGlvKCkgKTsKKyAgfQorCisKKyAgc3RhdGljCisgIHZvaWQgIFdyaXRlX0NWVCggRVhFQ19PUF8gVFRfVUxvbmcgICAgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfRjI2RG90NiAgdmFsdWUgKQorICB7CisgICAgQ1VSLmN2dFtpbmRleF0gPSB2YWx1ZTsKKyAgfQorCisgIHN0YXRpYworICB2b2lkICBXcml0ZV9DVlRfU3RyZXRjaGVkKCBFWEVDX09QXyBUVF9VTG9uZyAgICBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfRjI2RG90NiAgdmFsdWUgKQorICB7CisgICAgQ1VSLmN2dFtpbmRleF0gPSBGVF9EaXZGaXgoIHZhbHVlLCBDVVJSRU5UX1JhdGlvKCkgKTsKKyAgfQorCisKKyAgc3RhdGljCisgIHZvaWQgIE1vdmVfQ1ZUKCBFWEVDX09QXyBUVF9VTG9uZyAgICBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX0YyNkRvdDYgIHZhbHVlICkKKyAgeworICAgIENVUi5jdnRbaW5kZXhdICs9IHZhbHVlOworICB9CisKKworICBzdGF0aWMKKyAgdm9pZCAgTW92ZV9DVlRfU3RyZXRjaGVkKCBFWEVDX09QXyBUVF9VTG9uZyAgICBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9GMjZEb3Q2ICB2YWx1ZSApCisgIHsKKyAgICBDVVIuY3Z0W2luZGV4XSArPSBGVF9EaXZGaXgoIHZhbHVlLCBDVVJSRU5UX1JhdGlvKCkgKTsKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgR2V0U2hvcnRJbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgUmV0dXJucyBhIHNob3J0IGludGVnZXIgdGFrZW4gZnJvbSB0aGUgaW5zdHJ1Y3Rpb24gc3RyZWFtIGF0ICAgICAgICovCisgIC8qICAgIGFkZHJlc3MgSVAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFNob3J0IHJlYWQgYXQgY29kZVtJUF0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoaXMgb25lIGNvdWxkIGJlY29tZSBhIG1hY3JvLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgc3RhdGljIFRUX1Nob3J0ICBHZXRTaG9ydElucyggRVhFQ19PUCApCisgIHsKKyAgICAvKiBSZWFkaW5nIGEgYnl0ZSBzdHJlYW0gc28gdGhlcmUgaXMgbm8gZW5kaWFuZXNzIChEYXZlUCkgKi8KKyAgICBDVVIuSVAgKz0gMjsKKyAgICByZXR1cm4gKFRUX1Nob3J0KSgoQ1VSLmNvZGVbQ1VSLklQIC0gMl0gPDwgOCkgKyBDVVIuY29kZVtDVVIuSVAgLSAxXSk7CisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEluc19Hb3RvX0NvZGVSYW5nZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEdvZXMgdG8gYSBjZXJ0YWluIGNvZGUgcmFuZ2UgaW4gdGhlIGluc3RydWN0aW9uIHN0cmVhbS4gICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGFSYW5nZSA6OiBUaGUgaW5kZXggb2YgdGhlIGNvZGUgcmFuZ2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgYUlQICAgIDo6IFRoZSBuZXcgSVAgYWRkcmVzcyBpbiB0aGUgY29kZSByYW5nZS4gICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgU1VDQ0VTUyBvciBGQUlMVVJFLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBzdGF0aWMKKyAgVFRfQm9vbCAgSW5zX0dvdG9fQ29kZVJhbmdlKCBFWEVDX09QXyBUVF9JbnQgICAgYVJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX1VMb25nICBhSVAgKQorICB7CisgICAgVFRfQ29kZVJhbmdlKiAgcmFuZ2U7CisKKworICAgIGlmICggYVJhbmdlIDwgMSB8fCBhUmFuZ2UgPiAzICkKKyAgICB7CisgICAgICBDVVIuZXJyb3IgPSBUVF9FcnJfQmFkX0FyZ3VtZW50OworICAgICAgcmV0dXJuIEZBSUxVUkU7CisgICAgfQorCisgICAgcmFuZ2UgPSAmQ1VSLmNvZGVSYW5nZVRhYmxlW2FSYW5nZSAtIDFdOworCisgICAgaWYgKCByYW5nZS0+YmFzZSA9PSBOVUxMICkgICAgIC8qIGludmFsaWQgY29kZXJhbmdlICovCisgICAgeworICAgICAgQ1VSLmVycm9yID0gVFRfRXJyX0ludmFsaWRfQ29kZVJhbmdlOworICAgICAgcmV0dXJuIEZBSUxVUkU7CisgICAgfQorCisgICAgLyogTk9URTogQmVjYXVzZSB0aGUgbGFzdCBpbnN0cnVjdGlvbiBvZiBhIHByb2dyYW0gbWF5IGJlIGEgQ0FMTCAqLworICAgIC8qICAgICAgIHdoaWNoIHdpbGwgcmV0dXJuIHRvIHRoZSBmaXJzdCBieXRlICphZnRlciogdGhlIGNvZGUgICAgKi8KKyAgICAvKiAgICAgICByYW5nZSwgd2UgdGVzdCBmb3IgQUlQIDw9IFNpemUsIGluc3RlYWQgb2YgQUlQIDwgU2l6ZS4gICovCisKKyAgICBpZiAoIGFJUCA+IHJhbmdlLT5zaXplICkKKyAgICB7CisgICAgICBDVVIuZXJyb3IgPSBUVF9FcnJfQ29kZV9PdmVyZmxvdzsKKyAgICAgIHJldHVybiBGQUlMVVJFOworICAgIH0KKworICAgIENVUi5jb2RlICAgICA9IHJhbmdlLT5iYXNlOworICAgIENVUi5jb2RlU2l6ZSA9IHJhbmdlLT5zaXplOworICAgIENVUi5JUCAgICAgICA9IGFJUDsKKyAgICBDVVIuY3VyUmFuZ2UgPSBhUmFuZ2U7CisKKyAgICByZXR1cm4gU1VDQ0VTUzsKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRGlyZWN0X01vdmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgTW92ZXMgYSBwb2ludCBieSBhIGdpdmVuIGRpc3RhbmNlIGFsb25nIHRoZSBmcmVlZG9tIHZlY3Rvci4gIFRoZSAgICovCisgIC8qICAgIHBvaW50IHdpbGwgYmUgYHRvdWNoZWQnLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHBvaW50ICAgIDo6IFRoZSBpbmRleCBvZiB0aGUgcG9pbnQgdG8gbW92ZS4gICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBkaXN0YW5jZSA6OiBUaGUgZGlzdGFuY2UgdG8gYXBwbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB6b25lICAgICA6OiBUaGUgYWZmZWN0ZWQgZ2x5cGggem9uZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0YXRpYworICB2b2lkICBEaXJlY3RfTW92ZSggRVhFQ19PUF8gVFRfR2x5cGhab25lKiAgem9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX1VTaG9ydCAgICAgIHBvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfRjI2RG90NiAgICAgZGlzdGFuY2UgKQorICB7CisgICAgVFRfRjI2RG90NiB2OworCisKKyAgICB2ID0gQ1VSLkdTLmZyZWVWZWN0b3IueDsKKworICAgIGlmICggdiAhPSAwICkKKyAgICB7CisgICAgICB6b25lLT5jdXJbcG9pbnRdLnggKz0gVFRfTVVMRElWKCBkaXN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYgKiAweDEwMDAwTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENVUi5GX2RvdF9QICk7CisKKyAgICAgIHpvbmUtPnRvdWNoW3BvaW50XSB8PSBGVF9DdXJ2ZV9UYWdfVG91Y2hfWDsKKyAgICB9CisKKyAgICB2ID0gQ1VSLkdTLmZyZWVWZWN0b3IueTsKKworICAgIGlmICggdiAhPSAwICkKKyAgICB7CisgICAgICB6b25lLT5jdXJbcG9pbnRdLnkgKz0gVFRfTVVMRElWKCBkaXN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYgKiAweDEwMDAwTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENVUi5GX2RvdF9QICk7CisKKyAgICAgIHpvbmUtPnRvdWNoW3BvaW50XSB8PSBGVF9DdXJ2ZV9UYWdfVG91Y2hfWTsKKyAgICB9CisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogU3BlY2lhbCB2ZXJzaW9ucyBvZiBEaXJlY3RfTW92ZSgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIFRoZSBmb2xsb3dpbmcgdmVyc2lvbnMgYXJlIHVzZWQgd2hlbmV2ZXIgYm90aCB2ZWN0b3JzIGFyZSBib3RoICAgICAgKi8KKyAgLyogICBhbG9uZyBvbmUgb2YgdGhlIGNvb3JkaW5hdGUgdW5pdCB2ZWN0b3JzLCBpLmUuIGluIDkwJSBjYXNlcy4gICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICBzdGF0aWMKKyAgdm9pZCAgRGlyZWN0X01vdmVfWCggRVhFQ19PUF8gVFRfR2x5cGhab25lKiAgem9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfVVNob3J0ICAgICAgcG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX0YyNkRvdDYgICAgIGRpc3RhbmNlICkKKyAgeworICAgIFVOVVNFRF9FWEVDOworCisgICAgem9uZS0+Y3VyW3BvaW50XS54ICs9IGRpc3RhbmNlOworICAgIHpvbmUtPnRvdWNoW3BvaW50XSB8PSBGVF9DdXJ2ZV9UYWdfVG91Y2hfWDsKKyAgfQorCisKKyAgc3RhdGljCisgIHZvaWQgIERpcmVjdF9Nb3ZlX1koIEVYRUNfT1BfIFRUX0dseXBoWm9uZSogIHpvbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX1VTaG9ydCAgICAgIHBvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9GMjZEb3Q2ICAgICBkaXN0YW5jZSApCisgIHsKKyAgICBVTlVTRURfRVhFQzsKKworICAgIHpvbmUtPmN1cltwb2ludF0ueSArPSBkaXN0YW5jZTsKKyAgICB6b25lLT50b3VjaFtwb2ludF0gfD0gRlRfQ3VydmVfVGFnX1RvdWNoX1k7CisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFJvdW5kX05vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIERvZXMgbm90IHJvdW5kLCBidXQgYWRkcyBlbmdpbmUgY29tcGVuc2F0aW9uLiAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGRpc3RhbmNlICAgICA6OiBUaGUgZGlzdGFuY2UgKG5vdCkgdG8gcm91bmQuICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBjb21wZW5zYXRpb24gOjogVGhlIGVuZ2luZSBjb21wZW5zYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGUgY29tcGVuc2F0ZWQgZGlzdGFuY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGUgVHJ1ZVR5cGUgc3BlY2lmaWNhdGlvbiBzYXlzIHZlcnkgZmV3IGFib3V0IHRoZSByZWxhdGlvbnNoaXAgICAgKi8KKyAgLyogICAgYmV0d2VlbiByb3VuZGluZyBhbmQgZW5naW5lIGNvbXBlbnNhdGlvbi4gIEhvd2V2ZXIsIGl0IHNlZW1zIGZyb20gICovCisgIC8qICAgIHRoZSBkZXNjcmlwdGlvbiBvZiBzdXBlciByb3VuZCB0aGF0IHdlIHNob3VsZCBhZGQgdGhlIGNvbXBlbnNhdGlvbiAqLworICAvKiAgICBiZWZvcmUgcm91bmRpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0YXRpYworICBUVF9GMjZEb3Q2ICBSb3VuZF9Ob25lKCBFWEVDX09QXyBUVF9GMjZEb3Q2ICBkaXN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfRjI2RG90NiAgY29tcGVuc2F0aW9uICkKKyAgeworICAgIFRUX0YyNkRvdDYgIHZhbDsKKworCisgICAgVU5VU0VEX0VYRUM7CisKKyAgICBpZiAoIGRpc3RhbmNlID49IDAgKQorICAgIHsKKyAgICAgIHZhbCA9IGRpc3RhbmNlICsgY29tcGVuc2F0aW9uOworICAgICAgaWYgKCB2YWwgPCAwICkKKyAgICAgICAgdmFsID0gMDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICB2YWwgPSBkaXN0YW5jZSAtIGNvbXBlbnNhdGlvbjsKKyAgICAgIGlmICggdmFsID4gMCApCisgICAgICAgIHZhbCA9IDA7CisgICAgfQorICAgIHJldHVybiB2YWw7CisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFJvdW5kX1RvX0dyaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFJvdW5kcyB2YWx1ZSB0byBncmlkIGFmdGVyIGFkZGluZyBlbmdpbmUgY29tcGVuc2F0aW9uLiAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGRpc3RhbmNlICAgICA6OiBUaGUgZGlzdGFuY2UgdG8gcm91bmQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBjb21wZW5zYXRpb24gOjogVGhlIGVuZ2luZSBjb21wZW5zYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBSb3VuZGVkIGRpc3RhbmNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0YXRpYworICBUVF9GMjZEb3Q2ICBSb3VuZF9Ub19HcmlkKCBFWEVDX09QXyBUVF9GMjZEb3Q2ICBkaXN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfRjI2RG90NiAgY29tcGVuc2F0aW9uICkKKyAgeworICAgIFRUX0YyNkRvdDYgIHZhbDsKKworCisgICAgVU5VU0VEX0VYRUM7CisKKyAgICBpZiAoIGRpc3RhbmNlID49IDAgKQorICAgIHsKKyAgICAgIHZhbCA9IGRpc3RhbmNlICsgY29tcGVuc2F0aW9uICsgMzI7CisgICAgICBpZiAoIHZhbCA+IDAgKQorICAgICAgICB2YWwgJj0gfjYzOworICAgICAgZWxzZQorICAgICAgICB2YWwgPSAwOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgdmFsID0gLSggKGNvbXBlbnNhdGlvbiAtIGRpc3RhbmNlICsgMzIpICYgKC02NCkgKTsKKyAgICAgIGlmICggdmFsID4gMCApCisgICAgICAgIHZhbCA9IDA7CisgICAgfQorICAgIHJldHVybiAgdmFsOworICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBSb3VuZF9Ub19IYWxmX0dyaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBSb3VuZHMgdmFsdWUgdG8gaGFsZiBncmlkIGFmdGVyIGFkZGluZyBlbmdpbmUgY29tcGVuc2F0aW9uLiAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBkaXN0YW5jZSAgICAgOjogVGhlIGRpc3RhbmNlIHRvIHJvdW5kLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgY29tcGVuc2F0aW9uIDo6IFRoZSBlbmdpbmUgY29tcGVuc2F0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgUm91bmRlZCBkaXN0YW5jZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBzdGF0aWMKKyAgVFRfRjI2RG90NiAgUm91bmRfVG9fSGFsZl9HcmlkKCBFWEVDX09QXyBUVF9GMjZEb3Q2ICBkaXN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9GMjZEb3Q2ICBjb21wZW5zYXRpb24gKQorICB7CisgICAgVFRfRjI2RG90NiAgdmFsOworCisgCisgICBVTlVTRURfRVhFQzsKKworICAgIGlmICggZGlzdGFuY2UgPj0gMCApCisgICAgeworICAgICAgdmFsID0gKChkaXN0YW5jZSArIGNvbXBlbnNhdGlvbikgJiAoLTY0KSkgKyAzMjsKKyAgICAgIGlmICggdmFsIDwgMCApCisgICAgICAgIHZhbCA9IDA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICB2YWwgPSAtKCAoKGNvbXBlbnNhdGlvbiAtIGRpc3RhbmNlKSAmICgtNjQpKSArIDMyICk7CisgICAgICBpZiAoIHZhbCA+IDAgKQorICAgICAgICB2YWwgPSAwOworICAgIH0KKyAgICByZXR1cm4gdmFsOworICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBSb3VuZF9Eb3duX1RvX0dyaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBSb3VuZHMgdmFsdWUgZG93biB0byBncmlkIGFmdGVyIGFkZGluZyBlbmdpbmUgY29tcGVuc2F0aW9uLiAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBkaXN0YW5jZSAgICAgOjogVGhlIGRpc3RhbmNlIHRvIHJvdW5kLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgY29tcGVuc2F0aW9uIDo6IFRoZSBlbmdpbmUgY29tcGVuc2F0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgUm91bmRlZCBkaXN0YW5jZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBzdGF0aWMKKyAgVFRfRjI2RG90NiAgUm91bmRfRG93bl9Ub19HcmlkKCBFWEVDX09QXyBUVF9GMjZEb3Q2ICBkaXN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9GMjZEb3Q2ICBjb21wZW5zYXRpb24gKQorICB7CisgICAgVFRfRjI2RG90NiAgdmFsOworCisKKyAgICBVTlVTRURfRVhFQzsKKworICAgIGlmICggZGlzdGFuY2UgPj0gMCApCisgICAgeworICAgICAgdmFsID0gZGlzdGFuY2UgKyBjb21wZW5zYXRpb247CisgICAgICBpZiAoIHZhbCA+IDAgKQorICAgICAgICB2YWwgJj0gfjYzOworICAgICAgZWxzZQorICAgICAgICB2YWwgPSAwOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgdmFsID0gLSggKGNvbXBlbnNhdGlvbiAtIGRpc3RhbmNlKSAmICgtNjQpICk7CisgICAgICBpZiAoIHZhbCA+IDAgKQorICAgICAgICB2YWwgPSAwOworICAgIH0KKyAgICByZXR1cm4gdmFsOworICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBSb3VuZF9VcF9Ub19HcmlkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBSb3VuZHMgdmFsdWUgdXAgdG8gZ3JpZCBhZnRlciBhZGRpbmcgZW5naW5lIGNvbXBlbnNhdGlvbi4gICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBkaXN0YW5jZSAgICAgOjogVGhlIGRpc3RhbmNlIHRvIHJvdW5kLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgY29tcGVuc2F0aW9uIDo6IFRoZSBlbmdpbmUgY29tcGVuc2F0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgUm91bmRlZCBkaXN0YW5jZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBzdGF0aWMKKyAgVFRfRjI2RG90NiAgUm91bmRfVXBfVG9fR3JpZCggRVhFQ19PUF8gVFRfRjI2RG90NiAgZGlzdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX0YyNkRvdDYgIGNvbXBlbnNhdGlvbiApCisgIHsKKyAgICBUVF9GMjZEb3Q2ICB2YWw7CisKKworICAgIFVOVVNFRF9FWEVDOworCisgICAgaWYgKCBkaXN0YW5jZSA+PSAwICkKKyAgICB7CisgICAgICB2YWwgPSBkaXN0YW5jZSArIGNvbXBlbnNhdGlvbiArIDYzOworICAgICAgaWYgKCB2YWwgPiAwICkKKyAgICAgICAgdmFsICY9IH42MzsKKyAgICAgIGVsc2UKKyAgICAgICAgdmFsID0gMDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIHZhbCA9IC0oIChjb21wZW5zYXRpb24gLSBkaXN0YW5jZSArIDYzKSAmICgtNjQpICk7CisgICAgICBpZiAoIHZhbCA+IDAgKQorICAgICAgICB2YWwgPSAwOworICAgIH0KKyAgICByZXR1cm4gdmFsOworICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBSb3VuZF9Ub19Eb3VibGVfR3JpZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBSb3VuZHMgdmFsdWUgdG8gZG91YmxlIGdyaWQgYWZ0ZXIgYWRkaW5nIGVuZ2luZSBjb21wZW5zYXRpb24uICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBkaXN0YW5jZSAgICAgOjogVGhlIGRpc3RhbmNlIHRvIHJvdW5kLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgY29tcGVuc2F0aW9uIDo6IFRoZSBlbmdpbmUgY29tcGVuc2F0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgUm91bmRlZCBkaXN0YW5jZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBzdGF0aWMKKyAgVFRfRjI2RG90NiAgUm91bmRfVG9fRG91YmxlX0dyaWQoIEVYRUNfT1BfIFRUX0YyNkRvdDYgIGRpc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfRjI2RG90NiAgY29tcGVuc2F0aW9uICkKKyAgeworICAgIFRUX0YyNkRvdDYgdmFsOworCisgICAgVU5VU0VEX0VYRUM7CisKKyAgICBpZiAoIGRpc3RhbmNlID49IDAgKQorICAgIHsKKyAgICAgIHZhbCA9IGRpc3RhbmNlICsgY29tcGVuc2F0aW9uICsgMTY7CisgICAgICBpZiAoIHZhbCA+IDAgKQorICAgICAgICB2YWwgJj0gfjMxOworICAgICAgZWxzZQorICAgICAgICB2YWwgPSAwOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgdmFsID0gLSggKGNvbXBlbnNhdGlvbiAtIGRpc3RhbmNlICsgMTYpICYgKC0zMikgKTsKKyAgICAgIGlmICggdmFsID4gMCApCisgICAgICAgIHZhbCA9IDA7CisgICAgfQorICAgIHJldHVybiB2YWw7CisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFJvdW5kX1N1cGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFN1cGVyLXJvdW5kcyB2YWx1ZSB0byBncmlkIGFmdGVyIGFkZGluZyBlbmdpbmUgY29tcGVuc2F0aW9uLiAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGRpc3RhbmNlICAgICA6OiBUaGUgZGlzdGFuY2UgdG8gcm91bmQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBjb21wZW5zYXRpb24gOjogVGhlIGVuZ2luZSBjb21wZW5zYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBSb3VuZGVkIGRpc3RhbmNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGUgVHJ1ZVR5cGUgc3BlY2lmaWNhdGlvbiBzYXlzIHZlcnkgZmV3IGFib3V0IHRoZSByZWxhdGlvbnNoaXAgICAgKi8KKyAgLyogICAgYmV0d2VlbiByb3VuZGluZyBhbmQgZW5naW5lIGNvbXBlbnNhdGlvbi4gIEhvd2V2ZXIsIGl0IHNlZW1zIGZyb20gICovCisgIC8qICAgIHRoZSBkZXNjcmlwdGlvbiBvZiBzdXBlciByb3VuZCB0aGF0IHdlIHNob3VsZCBhZGQgdGhlIGNvbXBlbnNhdGlvbiAqLworICAvKiAgICBiZWZvcmUgcm91bmRpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0YXRpYworICBUVF9GMjZEb3Q2ICBSb3VuZF9TdXBlciggRVhFQ19PUF8gVFRfRjI2RG90NiAgZGlzdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9GMjZEb3Q2ICBjb21wZW5zYXRpb24gKQorICB7CisgICAgVFRfRjI2RG90NiAgdmFsOworCisKKyAgICBpZiAoIGRpc3RhbmNlID49IDAgKQorICAgIHsKKyAgICAgIHZhbCA9IChkaXN0YW5jZSAtIENVUi5waGFzZSArIENVUi50aHJlc2hvbGQgKyBjb21wZW5zYXRpb24pICYKKyAgICAgICAgICAgICAgKC1DVVIucGVyaW9kKTsKKyAgICAgIGlmICggdmFsIDwgMCApCisgICAgICAgIHZhbCA9IDA7CisgICAgICB2YWwgKz0gQ1VSLnBoYXNlOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgdmFsID0gLSggKENVUi50aHJlc2hvbGQgLSBDVVIucGhhc2UgLSBkaXN0YW5jZSArIGNvbXBlbnNhdGlvbikgJgorICAgICAgICAgICAgICAgKC1DVVIucGVyaW9kKSApOworICAgICAgaWYgKCB2YWwgPiAwICkKKyAgICAgICAgdmFsID0gMDsKKyAgICAgIHZhbCAtPSBDVVIucGhhc2U7CisgICAgfQorICAgIHJldHVybiB2YWw7CisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFJvdW5kX1N1cGVyXzQ1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFN1cGVyLXJvdW5kcyB2YWx1ZSB0byBncmlkIGFmdGVyIGFkZGluZyBlbmdpbmUgY29tcGVuc2F0aW9uLiAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGRpc3RhbmNlICAgICA6OiBUaGUgZGlzdGFuY2UgdG8gcm91bmQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBjb21wZW5zYXRpb24gOjogVGhlIGVuZ2luZSBjb21wZW5zYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBSb3VuZGVkIGRpc3RhbmNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGVyZSBpcyBhIHNlcGFyYXRlIGZ1bmN0aW9uIGZvciBSb3VuZF9TdXBlcl80NSgpIGFzIHdlIG1heSBuZWVkICAgKi8KKyAgLyogICAgZ3JlYXRlciBwcmVjaXNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBzdGF0aWMKKyAgVFRfRjI2RG90NiAgUm91bmRfU3VwZXJfNDUoIEVYRUNfT1BfIFRUX0YyNkRvdDYgIGRpc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfRjI2RG90NiAgY29tcGVuc2F0aW9uICkKKyAgeworICAgIFRUX0YyNkRvdDYgIHZhbDsKKworCisgICAgaWYgKCBkaXN0YW5jZSA+PSAwICkKKyAgICB7CisgICAgICB2YWwgPSAoIChkaXN0YW5jZSAtIENVUi5waGFzZSArIENVUi50aHJlc2hvbGQgKyBjb21wZW5zYXRpb24pIC8KKyAgICAgICAgICAgICAgICBDVVIucGVyaW9kICkgKiBDVVIucGVyaW9kOworICAgICAgaWYgKCB2YWwgPCAwICkKKyAgICAgICAgdmFsID0gMDsKKyAgICAgIHZhbCArPSBDVVIucGhhc2U7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICB2YWwgPSAtKCAoIChDVVIudGhyZXNob2xkIC0gQ1VSLnBoYXNlIC0gZGlzdGFuY2UgKyBjb21wZW5zYXRpb24pIC8KKyAgICAgICAgICAgICAgICAgICBDVVIucGVyaW9kICkgKiBDVVIucGVyaW9kICk7CisgICAgICBpZiAoIHZhbCA+IDAgKQorICAgICAgICB2YWwgPSAwOworICAgICAgdmFsIC09IENVUi5waGFzZTsKKyAgICB9CisKKyAgICByZXR1cm4gdmFsOworICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBDb21wdXRlX1JvdW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBTZXRzIHRoZSByb3VuZGluZyBtb2RlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICByb3VuZF9tb2RlIDo6IFRoZSByb3VuZGluZyBtb2RlIHRvIGJlIHVzZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0YXRpYworICB2b2lkICBDb21wdXRlX1JvdW5kKCBFWEVDX09QXyBUVF9CeXRlICByb3VuZF9tb2RlICkKKyAgeworICAgIHN3aXRjaCAoIHJvdW5kX21vZGUgKQorICAgIHsKKyAgICBjYXNlIFRUX1JvdW5kX09mZjoKKyAgICAgIENVUi5mdW5jX3JvdW5kID0gKFRUX1JvdW5kX0Z1bmMpUm91bmRfTm9uZTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBUVF9Sb3VuZF9Ub19HcmlkOgorICAgICAgQ1VSLmZ1bmNfcm91bmQgPSAoVFRfUm91bmRfRnVuYylSb3VuZF9Ub19HcmlkOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFRUX1JvdW5kX1VwX1RvX0dyaWQ6CisgICAgICBDVVIuZnVuY19yb3VuZCA9IChUVF9Sb3VuZF9GdW5jKVJvdW5kX1VwX1RvX0dyaWQ7CisgICAgICBicmVhazsKKworICAgIGNhc2UgVFRfUm91bmRfRG93bl9Ub19HcmlkOgorICAgICAgQ1VSLmZ1bmNfcm91bmQgPSAoVFRfUm91bmRfRnVuYylSb3VuZF9Eb3duX1RvX0dyaWQ7CisgICAgICBicmVhazsKKworICAgIGNhc2UgVFRfUm91bmRfVG9fSGFsZl9HcmlkOgorICAgICAgQ1VSLmZ1bmNfcm91bmQgPSAoVFRfUm91bmRfRnVuYylSb3VuZF9Ub19IYWxmX0dyaWQ7CisgICAgICBicmVhazsKKworICAgIGNhc2UgVFRfUm91bmRfVG9fRG91YmxlX0dyaWQ6CisgICAgICBDVVIuZnVuY19yb3VuZCA9IChUVF9Sb3VuZF9GdW5jKVJvdW5kX1RvX0RvdWJsZV9HcmlkOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFRUX1JvdW5kX1N1cGVyOgorICAgICAgQ1VSLmZ1bmNfcm91bmQgPSAoVFRfUm91bmRfRnVuYylSb3VuZF9TdXBlcjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBUVF9Sb3VuZF9TdXBlcl80NToKKyAgICAgIENVUi5mdW5jX3JvdW5kID0gKFRUX1JvdW5kX0Z1bmMpUm91bmRfU3VwZXJfNDU7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFNldFN1cGVyUm91bmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFNldHMgU3VwZXIgUm91bmQgcGFyYW1ldGVycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEdyaWRQZXJpb2QgOjogR3JpZCBwZXJpb2QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzZWxlY3RvciAgIDo6IFNST1VORCBvcGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0YXRpYworICB2b2lkICBTZXRTdXBlclJvdW5kKCBFWEVDX09QXyBUVF9GMjZEb3Q2ICBHcmlkUGVyaW9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9Mb25nICAgICBzZWxlY3RvciApCisgIHsKKyAgICBzd2l0Y2ggKCAoVFRfSW50KShzZWxlY3RvciAmIDB4QzApICkKKyAgICB7CisgICAgICBjYXNlIDA6CisgICAgICAgIENVUi5wZXJpb2QgPSBHcmlkUGVyaW9kIC8gMjsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgMHg0MDoKKyAgICAgICAgQ1VSLnBlcmlvZCA9IEdyaWRQZXJpb2Q7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIDB4ODA6CisgICAgICAgIENVUi5wZXJpb2QgPSBHcmlkUGVyaW9kICogMjsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIC8qIFRoaXMgb3Bjb2RlIGlzIHJlc2VydmVkLCBidXQuLi4gKi8KKworICAgICAgY2FzZSAweEMwOgorICAgICAgICBDVVIucGVyaW9kID0gR3JpZFBlcmlvZDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgc3dpdGNoICggKFRUX0ludCkoc2VsZWN0b3IgJiAweDMwKSApCisgICAgeworICAgIGNhc2UgMDoKKyAgICAgIENVUi5waGFzZSA9IDA7CisgICAgICBicmVhazsKKworICAgIGNhc2UgMHgxMDoKKyAgICAgIENVUi5waGFzZSA9IENVUi5wZXJpb2QgLyA0OworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIDB4MjA6CisgICAgICBDVVIucGhhc2UgPSBDVVIucGVyaW9kIC8gMjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAweDMwOgorICAgICAgQ1VSLnBoYXNlID0gR3JpZFBlcmlvZCAqIDMgLyA0OworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKCAoc2VsZWN0b3IgJiAweDBGKSA9PSAwICkKKyAgICAgIENVUi50aHJlc2hvbGQgPSBDVVIucGVyaW9kIC0gMTsKKyAgICBlbHNlCisgICAgICBDVVIudGhyZXNob2xkID0gKCAoVFRfSW50KShzZWxlY3RvciAmIDB4MEYpIC0gNCApICogQ1VSLnBlcmlvZCAvIDg7CisKKyAgICBDVVIucGVyaW9kICAgIC89IDI1NjsKKyAgICBDVVIucGhhc2UgICAgIC89IDI1NjsKKyAgICBDVVIudGhyZXNob2xkIC89IDI1NjsKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgUHJvamVjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQ29tcHV0ZXMgdGhlIHByb2plY3Rpb24gb2YgdmVjdG9yIGdpdmVuIGJ5ICh2Mi12MSkgYWxvbmcgdGhlICAgICAgICovCisgIC8qICAgIGN1cnJlbnQgcHJvamVjdGlvbiB2ZWN0b3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHYxIDo6IEZpcnN0IGlucHV0IHZlY3Rvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB2MiA6OiBTZWNvbmQgaW5wdXQgdmVjdG9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGUgZGlzdGFuY2UgaW4gRjI2ZG90NiBmb3JtYXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0YXRpYworICBUVF9GMjZEb3Q2ICBQcm9qZWN0KCBFWEVDX09QXyBUVF9WZWN0b3IqICB2MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfVmVjdG9yKiAgdjIgKQorICB7CisgICAgcmV0dXJuIFRUX01VTERJViggdjEtPnggLSB2Mi0+eCwgQ1VSLkdTLnByb2pWZWN0b3IueCwgMHg0MDAwICkgKworICAgICAgICAgICBUVF9NVUxESVYoIHYxLT55IC0gdjItPnksIENVUi5HUy5wcm9qVmVjdG9yLnksIDB4NDAwMCApOworICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBEdWFsX1Byb2plY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBDb21wdXRlcyB0aGUgcHJvamVjdGlvbiBvZiB0aGUgdmVjdG9yIGdpdmVuIGJ5ICh2Mi12MSkgYWxvbmcgdGhlICAgKi8KKyAgLyogICAgY3VycmVudCBkdWFsIHZlY3Rvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgdjEgOjogRmlyc3QgaW5wdXQgdmVjdG9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHYyIDo6IFNlY29uZCBpbnB1dCB2ZWN0b3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoZSBkaXN0YW5jZSBpbiBGMjZkb3Q2IGZvcm1hdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgc3RhdGljCisgIFRUX0YyNkRvdDYgIER1YWxfUHJvamVjdCggRVhFQ19PUF8gVFRfVmVjdG9yKiAgdjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfVmVjdG9yKiAgdjIgKQorICB7CisgICAgcmV0dXJuIFRUX01VTERJViggdjEtPnggLSB2Mi0+eCwgQ1VSLkdTLmR1YWxWZWN0b3IueCwgMHg0MDAwICkgKworICAgICAgICAgICBUVF9NVUxESVYoIHYxLT55IC0gdjItPnksIENVUi5HUy5kdWFsVmVjdG9yLnksIDB4NDAwMCApOworICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGcmVlX1Byb2plY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBDb21wdXRlcyB0aGUgcHJvamVjdGlvbiBvZiB0aGUgdmVjdG9yIGdpdmVuIGJ5ICh2Mi12MSkgYWxvbmcgdGhlICAgKi8KKyAgLyogICAgY3VycmVudCBmcmVlZG9tIHZlY3Rvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgdjEgOjogRmlyc3QgaW5wdXQgdmVjdG9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHYyIDo6IFNlY29uZCBpbnB1dCB2ZWN0b3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoZSBkaXN0YW5jZSBpbiBGMjZkb3Q2IGZvcm1hdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgc3RhdGljCisgIFRUX0YyNkRvdDYgIEZyZWVfUHJvamVjdCggRVhFQ19PUF8gVFRfVmVjdG9yKiAgdjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfVmVjdG9yKiAgdjIgKQorICB7CisgICAgcmV0dXJuIFRUX01VTERJViggdjEtPnggLSB2Mi0+eCwgQ1VSLkdTLmZyZWVWZWN0b3IueCwgMHg0MDAwICkgKworICAgICAgICAgICBUVF9NVUxESVYoIHYxLT55IC0gdjItPnksIENVUi5HUy5mcmVlVmVjdG9yLnksIDB4NDAwMCApOworICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBQcm9qZWN0X3ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBDb21wdXRlcyB0aGUgcHJvamVjdGlvbiBvZiB0aGUgdmVjdG9yIGdpdmVuIGJ5ICh2Mi12MSkgYWxvbmcgdGhlICAgKi8KKyAgLyogICAgaG9yaXpvbnRhbCBheGlzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgdjEgOjogRmlyc3QgaW5wdXQgdmVjdG9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHYyIDo6IFNlY29uZCBpbnB1dCB2ZWN0b3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoZSBkaXN0YW5jZSBpbiBGMjZkb3Q2IGZvcm1hdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgc3RhdGljCisgIFRUX0YyNkRvdDYgIFByb2plY3RfeCggRVhFQ19PUF8gVFRfVmVjdG9yKiAgdjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfVmVjdG9yKiAgdjIgKQorICB7CisgICAgVU5VU0VEX0VYRUM7CisKKyAgICByZXR1cm4gKHYxLT54IC0gdjItPngpOworICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBQcm9qZWN0X3kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBDb21wdXRlcyB0aGUgcHJvamVjdGlvbiBvZiB0aGUgdmVjdG9yIGdpdmVuIGJ5ICh2Mi12MSkgYWxvbmcgdGhlICAgKi8KKyAgLyogICAgdmVydGljYWwgYXhpcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgdjEgOjogRmlyc3QgaW5wdXQgdmVjdG9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHYyIDo6IFNlY29uZCBpbnB1dCB2ZWN0b3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoZSBkaXN0YW5jZSBpbiBGMjZkb3Q2IGZvcm1hdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgc3RhdGljCisgIFRUX0YyNkRvdDYgIFByb2plY3RfeSggRVhFQ19PUF8gVFRfVmVjdG9yKiAgdjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfVmVjdG9yKiAgdjIgKQorICB7CisgICAgVU5VU0VEX0VYRUM7CisgCisgICByZXR1cm4gKHYxLT55IC0gdjItPnkpOworICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBDb21wdXRlX0Z1bmNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBDb21wdXRlcyB0aGUgcHJvamVjdGlvbiBhbmQgbW92ZW1lbnQgZnVuY3Rpb24gcG9pbnRlcnMgYWNjb3JkaW5nICAgKi8KKyAgLyogICAgdG8gdGhlIGN1cnJlbnQgZ3JhcGhpY3Mgc3RhdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBzdGF0aWMKKyAgdm9pZCAgQ29tcHV0ZV9GdW5jcyggRVhFQ19PUCApCisgIHsKKyAgICBpZiAoIENVUi5HUy5mcmVlVmVjdG9yLnggPT0gMHg0MDAwICkKKyAgICB7CisgICAgICBDVVIuZnVuY19mcmVlUHJvaiA9IChUVF9Qcm9qZWN0X0Z1bmMpUHJvamVjdF94OworICAgICAgQ1VSLkZfZG90X1AgICAgICAgPSBDVVIuR1MucHJvalZlY3Rvci54ICogMHgxMDAwMEw7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBpZiAoIENVUi5HUy5mcmVlVmVjdG9yLnkgPT0gMHg0MDAwICkKKyAgICAgIHsKKyAgICAgICAgQ1VSLmZ1bmNfZnJlZVByb2ogPSAoVFRfUHJvamVjdF9GdW5jKVByb2plY3RfeTsKKyAgICAgICAgQ1VSLkZfZG90X1AgICAgICAgPSBDVVIuR1MucHJvalZlY3Rvci55ICogMHgxMDAwMEw7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIENVUi5mdW5jX2ZyZWVQcm9qID0gKFRUX1Byb2plY3RfRnVuYylGcmVlX1Byb2plY3Q7CisgICAgICAgIENVUi5GX2RvdF9QID0gKFRUX0xvbmcpQ1VSLkdTLnByb2pWZWN0b3IueCAqIENVUi5HUy5mcmVlVmVjdG9yLnggKiA0ICsKKyAgICAgICAgICAgICAgICAgICAgICAoVFRfTG9uZylDVVIuR1MucHJvalZlY3Rvci55ICogQ1VSLkdTLmZyZWVWZWN0b3IueSAqIDQ7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKCBDVVIuR1MucHJvalZlY3Rvci54ID09IDB4NDAwMCApCisgICAgICBDVVIuZnVuY19wcm9qZWN0ID0gKFRUX1Byb2plY3RfRnVuYylQcm9qZWN0X3g7CisgICAgZWxzZQorICAgIHsKKyAgICAgIGlmICggQ1VSLkdTLnByb2pWZWN0b3IueSA9PSAweDQwMDAgKQorICAgICAgICBDVVIuZnVuY19wcm9qZWN0ID0gKFRUX1Byb2plY3RfRnVuYylQcm9qZWN0X3k7CisgICAgICBlbHNlCisgICAgICAgIENVUi5mdW5jX3Byb2plY3QgPSAoVFRfUHJvamVjdF9GdW5jKVByb2plY3Q7CisgICAgfQorCisgICAgaWYgKCBDVVIuR1MuZHVhbFZlY3Rvci54ID09IDB4NDAwMCApCisgICAgICBDVVIuZnVuY19kdWFscHJvaiA9IChUVF9Qcm9qZWN0X0Z1bmMpUHJvamVjdF94OworICAgIGVsc2UKKyAgICB7CisgICAgICBpZiAoIENVUi5HUy5kdWFsVmVjdG9yLnkgPT0gMHg0MDAwICkKKyAgICAgICAgQ1VSLmZ1bmNfZHVhbHByb2ogPSAoVFRfUHJvamVjdF9GdW5jKVByb2plY3RfeTsKKyAgICAgIGVsc2UKKyAgICAgICAgQ1VSLmZ1bmNfZHVhbHByb2ogPSAoVFRfUHJvamVjdF9GdW5jKUR1YWxfUHJvamVjdDsKKyAgICB9CisKKyAgICBDVVIuZnVuY19tb3ZlID0gKFRUX01vdmVfRnVuYylEaXJlY3RfTW92ZTsKKworICAgIGlmICggQ1VSLkZfZG90X1AgPT0gMHg0MDAwMDAwMEwgKQorICAgIHsKKyAgICAgIGlmICggQ1VSLkdTLmZyZWVWZWN0b3IueCA9PSAweDQwMDAgKQorICAgICAgICBDVVIuZnVuY19tb3ZlID0gKFRUX01vdmVfRnVuYylEaXJlY3RfTW92ZV9YOworICAgICAgZWxzZQorICAgICAgeworICAgICAgICBpZiAoIENVUi5HUy5mcmVlVmVjdG9yLnkgPT0gMHg0MDAwICkKKyAgICAgICAgICBDVVIuZnVuY19tb3ZlID0gKFRUX01vdmVfRnVuYylEaXJlY3RfTW92ZV9ZOworICAgICAgfQorICAgIH0KKworICAgIC8qIGF0IHNtYWxsIHNpemVzLCBGX2RvdF9QIGNhbiBiZWNvbWUgdG9vIHNtYWxsLCByZXN1bHRpbmcgICAqLworICAgIC8qIGluIG92ZXJmbG93cyBhbmQgYHNwaWtlcycgaW4gYSBudW1iZXIgb2YgZ2x5cGhzIGxpa2UgYHcnLiAqLworCisgICAgaWYgKCBBQlMoIENVUi5GX2RvdF9QICkgPCAweDQwMDAwMDBMICkKKyAgICAgIENVUi5GX2RvdF9QID0gMHg0MDAwMDAwMEw7CisKKyAgICAvKiBEaXNhYmxlIGNhY2hlZCBhc3BlY3QgcmF0aW8gKi8KKyAgICBDVVIudHRfbWV0cmljcy5yYXRpbyA9IDA7CisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIE5vcm1hbGl6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIE5vcm1zIGEgdmVjdG9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFZ4IDo6IFRoZSBob3Jpem9udGFsIGlucHV0IHZlY3RvciBjb29yZGluYXRlLiAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBWeSA6OiBUaGUgdmVydGljYWwgaW5wdXQgdmVjdG9yIGNvb3JkaW5hdGUuICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBSICA6OiBUaGUgbm9ybWVkIHVuaXQgdmVjdG9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBSZXR1cm5zIEZBSUxVUkUgaWYgYSB2ZWN0b3IgcGFyYW1ldGVyIGlzIHplcm8uICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBJbiBjYXNlIFZ4IGFuZCBWeSBhcmUgYm90aCB6ZXJvLCBOb3JtYWxpemUoKSByZXR1cm5zIFNVQ0NFU1MsIGFuZCAgKi8KKyAgLyogICAgUiBpcyB1bmRlZmluZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBzdGF0aWMKKyAgVFRfQm9vbCAgTm9ybWFsaXplKCBFWEVDX09QXyBUVF9GMjZEb3Q2ICAgICAgVngsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfRjI2RG90NiAgICAgIFZ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX1VuaXRWZWN0b3IqICBSICkKKyAgeworICAgIFRUX0YyNkRvdDYgIHUsIHYsIGQ7CisgICAgVFRfSW50ICAgICAgc2hpZnQ7CisgICAgVFRfVUxvbmcgICAgSCwgTCwgTDIsIGhpLCBsbywgbWVkOworCisgICAgdSA9IEFCUyhWeCk7CisgICAgdiA9IEFCUyhWeSk7CisKKyAgICBpZiAodSA8IHYpCisgICAgeworICAgICAgZCA9IHU7CisgICAgICB1ID0gdjsKKyAgICAgIHYgPSBkOworICAgIH0KKworICAgIFItPnggPSAwOworICAgIFItPnkgPSAwOworICAgIAorICAgIC8qIGNoZWNrIHRoYXQgd2UncmUgbm90IHRyeWluZyB0byBub3JtYWxpc2UgemVybyAhISAqLworICAgIGlmICh1PT0wKSByZXR1cm4gU1VDQ0VTUzsKKworICAgIC8qIGNvbXB1dGUgKHUqdSt2KnYpIG9uIDY0IGJpdHMgd2l0aCB0d28gMzItYml0IHJlZ2lzdGVycyBbSDpMXSAqLworICAgIGhpICA9IChUVF9VTG9uZyl1ID4+IDE2OworICAgIGxvICA9IChUVF9VTG9uZyl1ICYgMHhGRkZGOworICAgIG1lZCA9IGhpKmxvOworICAgIAorICAgIEggICAgID0gaGkqaGkgKyAobWVkID4+IDE1KTsKKyAgICBtZWQgPDw9IDE3OworICAgIEwgICAgID0gbG8qbG8gKyBtZWQ7CisgICAgaWYgKEwgPCBtZWQpIEgrKzsKKyAgICAKKyAgICBoaSAgPSAoVFRfVUxvbmcpdiA+PiAxNjsKKyAgICBsbyAgPSAoVFRfVUxvbmcpdiAmIDB4RkZGRjsKKyAgICBtZWQgPSBoaSpsbzsKKyAgICAKKyAgICBIICAgICs9IGhpKmhpICsgKG1lZCA+PiAxNSk7CisgICAgbWVkIDw8PSAxNzsKKyAgICBMMiAgICA9IGxvKmxvICsgbWVkOworICAgIGlmIChMMiA8IG1lZCkgSCsrOworICAgIAorICAgIEwgKz0gTDI7CisgICAgaWYgKEwgPCBMMikgSCsrOworCisgICAgLyogaWYgdGhlIHZhbHVlIGlzIHNtYWxsZXIgdGhhbiAzMi1iaXRzICovCisgICAgaWYgKEggPT0gMCkKKyAgICB7CisgICAgICBzaGlmdCA9IDA7CisgICAgICB3aGlsZSAoKEwgJiAweEMwMDAwMDAwKSA9PSAwKQorICAgICAgeworICAgICAgICBMIDw8PSAyOworICAgICAgICBzaGlmdCsrOworICAgICAgfQorICAgICAgCisgICAgICBkID0gRlRfU3FydDMyKEwpOworICAgICAgUi0+eCA9IChUVF9GMkRvdDE0KVRUX01VTERJViggVnggPDwgc2hpZnQsIDB4NDAwMCwgZCApOworICAgICAgUi0+eSA9IChUVF9GMkRvdDE0KVRUX01VTERJViggVnkgPDwgc2hpZnQsIDB4NDAwMCwgZCApOworICAgIH0KKyAgICAvKiBpZiB0aGUgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIDY0LWJpdHMgKi8KKyAgICBlbHNlCisgICAgeworICAgICAgc2hpZnQgPSAwOworICAgICAgd2hpbGUgKEgpCisgICAgICB7CisgICAgICAgIEwgICA9IChMID4+IDIpIHwgKEggPDwgMzApOworICAgICAgICBIID4+PSAyOworICAgICAgICBzaGlmdCsrOworICAgICAgfQorICAgICAgCisgICAgICBkID0gRlRfU3FydDMyKEwpOworICAgICAgUi0+eCA9IChUVF9GMkRvdDE0KVRUX01VTERJViggVnggPj4gc2hpZnQsIDB4NDAwMCwgZCApOworICAgICAgUi0+eSA9IChUVF9GMkRvdDE0KVRUX01VTERJViggVnkgPj4gc2hpZnQsIDB4NDAwMCwgZCApOworICAgIH0KKworICAgIHJldHVybiBTVUNDRVNTOworICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIEhlcmUgd2Ugc3RhcnQgd2l0aCB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIHZhcmlvdXMgb3Bjb2Rlcy4gICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworICBzdGF0aWMKKyAgVFRfQm9vbCAgSW5zX1N4VlRMKCBFWEVDX09QXyBUVF9VU2hvcnQgICAgICAgYUlkeDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfVVNob3J0ICAgICAgIGFJZHgyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX0ludCAgICAgICAgICBhT3BjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX1VuaXRWZWN0b3IqICBWZWMgKQorICB7CisgICAgVFRfTG9uZyAgICAgQSwgQiwgQzsKKyAgICBUVF9WZWN0b3IqICBwMTsKKyAgICBUVF9WZWN0b3IqICBwMjsKKworCisgICAgaWYgKCBCT1VORFMoIGFJZHgxLCBDVVIuenAyLm5fcG9pbnRzICkgfHwKKyAgICAgICAgIEJPVU5EUyggYUlkeDIsIENVUi56cDEubl9wb2ludHMgKSApCisgICAgeworICAgICAgaWYgKCBDVVIucGVkYW50aWNfaGludGluZyApCisgICAgICAgIENVUi5lcnJvciA9IFRUX0Vycl9JbnZhbGlkX1JlZmVyZW5jZTsKKyAgICAgIHJldHVybiBGQUlMVVJFOworICAgIH0KKworICAgIHAxID0gQ1VSLnpwMS5jdXIgKyBhSWR4MjsKKyAgICBwMiA9IENVUi56cDIuY3VyICsgYUlkeDE7CisKKyAgICBBID0gcDEtPnggLSBwMi0+eDsKKyAgICBCID0gcDEtPnkgLSBwMi0+eTsKKworICAgIGlmICggKGFPcGMgJiAxKSAhPSAwICkKKyAgICB7CisgICAgICBDID0gIEI7ICAgLyogQ291bnRlckNsb2Nrd2lzZSByb3RhdGlvbiAqLworICAgICAgQiA9ICBBOworICAgICAgQSA9IC1DOworICAgIH0KKworICAgIE5PUk1hbGl6ZSggQSwgQiwgVmVjICk7CisKKyAgICByZXR1cm4gU1VDQ0VTUzsKKyAgfQorCisKKyAgLyogV2hlbiBub3QgdXNpbmcgdGhlIGJpZyBzd2l0Y2ggc3RhdGVtZW50cywgdGhlIGludGVycHJldGVyIHVzZXMgYSAqLworICAvKiBjYWxsIHRhYmxlIGRlZmluZWQgbGF0ZXIgYmVsb3cgaW4gdGhpcyBzb3VyY2UuICBFYWNoIG9wY29kZSBtdXN0ICovCisgIC8qIHRodXMgaGF2ZSBhIGNvcnJlc3BvbmRpbmcgZnVuY3Rpb24sIGV2ZW4gdHJpdmlhbCBvbmVzLiAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBUaGV5J3JlIGFsbCBkZWZpbmVkIHRoZXJlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyNkZWZpbmUgRE9fU1ZUQ0EgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBUVF9TaG9ydCAgQSwgQjsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBBID0gKFRUX1Nob3J0KShDVVIub3Bjb2RlICYgMSkgPDwgMTQ7IFwKKyAgICBCID0gQSBeIChUVF9TaG9ydCkweDQwMDA7ICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBDVVIuR1MuZnJlZVZlY3Rvci54ID0gQTsgICAgICAgICAgICAgIFwKKyAgICBDVVIuR1MucHJvalZlY3Rvci54ID0gQTsgICAgICAgICAgICAgIFwKKyAgICBDVVIuR1MuZHVhbFZlY3Rvci54ID0gQTsgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBDVVIuR1MuZnJlZVZlY3Rvci55ID0gQjsgICAgICAgICAgICAgIFwKKyAgICBDVVIuR1MucHJvalZlY3Rvci55ID0gQjsgICAgICAgICAgICAgIFwKKyAgICBDVVIuR1MuZHVhbFZlY3Rvci55ID0gQjsgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBDT01QVVRFX0Z1bmNzKCk7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCisKKyNkZWZpbmUgRE9fU1BWVENBICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBUVF9TaG9ydCAgQSwgQjsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBBID0gKFRUX1Nob3J0KShDVVIub3Bjb2RlICYgMSkgPDwgMTQ7IFwKKyAgICBCID0gQSBeIChUVF9TaG9ydCkweDQwMDA7ICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBDVVIuR1MucHJvalZlY3Rvci54ID0gQTsgICAgICAgICAgICAgIFwKKyAgICBDVVIuR1MuZHVhbFZlY3Rvci54ID0gQTsgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBDVVIuR1MucHJvalZlY3Rvci55ID0gQjsgICAgICAgICAgICAgIFwKKyAgICBDVVIuR1MuZHVhbFZlY3Rvci55ID0gQjsgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBDT01QVVRFX0Z1bmNzKCk7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCisKKyNkZWZpbmUgRE9fU0ZWVENBICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBUVF9TaG9ydCAgQSwgQjsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBBID0gKFRUX1Nob3J0KShDVVIub3Bjb2RlICYgMSkgPDwgMTQ7IFwKKyAgICBCID0gQSBeIChUVF9TaG9ydCkweDQwMDA7ICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBDVVIuR1MuZnJlZVZlY3Rvci54ID0gQTsgICAgICAgICAgICAgIFwKKyAgICBDVVIuR1MuZnJlZVZlY3Rvci55ID0gQjsgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBDT01QVVRFX0Z1bmNzKCk7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCisKKyNkZWZpbmUgRE9fU1BWVEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICggSU5TX1N4VlRMKCAoVFRfVVNob3J0KWFyZ3NbMV0sICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIChUVF9VU2hvcnQpYXJnc1swXSwgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgQ1VSLm9wY29kZSwgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAmQ1VSLkdTLnByb2pWZWN0b3IpID09IFNVQ0NFU1MgKSBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIENVUi5HUy5kdWFsVmVjdG9yID0gQ1VSLkdTLnByb2pWZWN0b3I7ICAgICAgICAgXAorICAgICAgQ09NUFVURV9GdW5jcygpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCisKKyNkZWZpbmUgRE9fU0ZWVEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICggSU5TX1N4VlRMKCAoVFRfVVNob3J0KShhcmdzWzFdKSwgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIChUVF9VU2hvcnQpKGFyZ3NbMF0pLCAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgQ1VSLm9wY29kZSwgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAmQ1VSLkdTLmZyZWVWZWN0b3IpID09IFNVQ0NFU1MgKSBcCisgICAgICBDT01QVVRFX0Z1bmNzKCk7CisKKworI2RlZmluZSBET19TRlZUUFYgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBDVVIuR1MuZnJlZVZlY3RvciA9IENVUi5HUy5wcm9qVmVjdG9yOyBcCisgICAgQ09NUFVURV9GdW5jcygpOworCisKKyNkZWZpbmUgRE9fU1BWRlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBUVF9TaG9ydCAgUzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBUVF9Mb25nICAgWCwgWTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiBPbmx5IHVzZSBsb3cgMTZiaXRzLCB0aGVuIHNpZ24gZXh0ZW5kICovIFwKKyAgICBTID0gKFRUX1Nob3J0KWFyZ3NbMV07ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBZID0gKFRUX0xvbmcpUzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBTID0gKFRUX1Nob3J0KWFyZ3NbMF07ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBYID0gKFRUX0xvbmcpUzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBOT1JNYWxpemUoIFgsIFksICZDVVIuR1MucHJvalZlY3RvciApOyAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBDVVIuR1MuZHVhbFZlY3RvciA9IENVUi5HUy5wcm9qVmVjdG9yOyAgICAgIFwKKyAgICBDT01QVVRFX0Z1bmNzKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCisKKyNkZWZpbmUgRE9fU0ZWRlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBUVF9TaG9ydCAgUzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBUVF9Mb25nICAgWCwgWTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiBPbmx5IHVzZSBsb3cgMTZiaXRzLCB0aGVuIHNpZ24gZXh0ZW5kICovIFwKKyAgICBTID0gKFRUX1Nob3J0KWFyZ3NbMV07ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBZID0gKFRUX0xvbmcpUzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBTID0gKFRUX1Nob3J0KWFyZ3NbMF07ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBYID0gUzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBOT1JNYWxpemUoIFgsIFksICZDVVIuR1MuZnJlZVZlY3RvciApOyAgICAgIFwKKyAgICBDT01QVVRFX0Z1bmNzKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCisKKyNkZWZpbmUgRE9fR1BWICAgICAgICAgICAgICAgICAgICAgXAorICAgIGFyZ3NbMF0gPSBDVVIuR1MucHJvalZlY3Rvci54OyBcCisgICAgYXJnc1sxXSA9IENVUi5HUy5wcm9qVmVjdG9yLnk7CisKKworI2RlZmluZSBET19HRlYgICAgICAgICAgICAgICAgICAgICBcCisgICAgYXJnc1swXSA9IENVUi5HUy5mcmVlVmVjdG9yLng7IFwKKyAgICBhcmdzWzFdID0gQ1VSLkdTLmZyZWVWZWN0b3IueTsKKworCisjZGVmaW5lIERPX1NSUDAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQ1VSLkdTLnJwMCA9IChUVF9VU2hvcnQpKGFyZ3NbMF0pOworCisKKyNkZWZpbmUgRE9fU1JQMSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBDVVIuR1MucnAxID0gKFRUX1VTaG9ydCkoYXJnc1swXSk7CisKKworI2RlZmluZSBET19TUlAyICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIENVUi5HUy5ycDIgPSAoVFRfVVNob3J0KShhcmdzWzBdKTsKKworCisjZGVmaW5lIERPX1JUSEcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBDVVIuR1Mucm91bmRfc3RhdGUgPSBUVF9Sb3VuZF9Ub19IYWxmX0dyaWQ7ICAgICAgICAgXAorICAgIENVUi5mdW5jX3JvdW5kID0gKFRUX1JvdW5kX0Z1bmMpUm91bmRfVG9fSGFsZl9HcmlkOworCisKKyNkZWZpbmUgRE9fUlRHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBDVVIuR1Mucm91bmRfc3RhdGUgPSBUVF9Sb3VuZF9Ub19HcmlkOyAgICAgICAgIFwKKyAgICBDVVIuZnVuY19yb3VuZCA9IChUVF9Sb3VuZF9GdW5jKVJvdW5kX1RvX0dyaWQ7CisKKworI2RlZmluZSBET19SVERHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBDVVIuR1Mucm91bmRfc3RhdGUgPSBUVF9Sb3VuZF9Ub19Eb3VibGVfR3JpZDsgICAgICAgICBcCisgICAgQ1VSLmZ1bmNfcm91bmQgPSAoVFRfUm91bmRfRnVuYylSb3VuZF9Ub19Eb3VibGVfR3JpZDsKKworCisjZGVmaW5lIERPX1JVVEcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQ1VSLkdTLnJvdW5kX3N0YXRlID0gVFRfUm91bmRfVXBfVG9fR3JpZDsgICAgICAgICBcCisgICAgQ1VSLmZ1bmNfcm91bmQgPSAoVFRfUm91bmRfRnVuYylSb3VuZF9VcF9Ub19HcmlkOworCisKKyNkZWZpbmUgRE9fUkRURyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIENVUi5HUy5yb3VuZF9zdGF0ZSA9IFRUX1JvdW5kX0Rvd25fVG9fR3JpZDsgICAgICAgICBcCisgICAgQ1VSLmZ1bmNfcm91bmQgPSAoVFRfUm91bmRfRnVuYylSb3VuZF9Eb3duX1RvX0dyaWQ7CisKKworI2RlZmluZSBET19ST0ZGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIENVUi5HUy5yb3VuZF9zdGF0ZSA9IFRUX1JvdW5kX09mZjsgICAgICAgICAgXAorICAgIENVUi5mdW5jX3JvdW5kID0gKFRUX1JvdW5kX0Z1bmMpUm91bmRfTm9uZTsKKworCisjZGVmaW5lIERPX1NST1VORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFNFVF9TdXBlclJvdW5kKCAweDQwMDAsIGFyZ3NbMF0gKTsgICAgICAgICAgIFwKKyAgICBDVVIuR1Mucm91bmRfc3RhdGUgPSBUVF9Sb3VuZF9TdXBlcjsgICAgICAgICBcCisgICAgQ1VSLmZ1bmNfcm91bmQgPSAoVFRfUm91bmRfRnVuYylSb3VuZF9TdXBlcjsKKworCisjZGVmaW5lIERPX1M0NVJPVU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFNFVF9TdXBlclJvdW5kKCAweDJENDEsIGFyZ3NbMF0gKTsgICAgICAgICAgICAgIFwKKyAgICBDVVIuR1Mucm91bmRfc3RhdGUgPSBUVF9Sb3VuZF9TdXBlcl80NTsgICAgICAgICBcCisgICAgQ1VSLmZ1bmNfcm91bmQgPSAoVFRfUm91bmRfRnVuYylSb3VuZF9TdXBlcl80NTsKKworCisjZGVmaW5lIERPX1NMT09QICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCBhcmdzWzBdIDwgMCApICAgICAgICAgICAgICAgICBcCisgICAgICBDVVIuZXJyb3IgPSBUVF9FcnJfQmFkX0FyZ3VtZW50OyBcCisgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBDVVIuR1MubG9vcCA9IGFyZ3NbMF07CisKKworI2RlZmluZSBET19TTUQgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIENVUi5HUy5taW5pbXVtX2Rpc3RhbmNlID0gYXJnc1swXTsKKworCisjZGVmaW5lIERPX1NDVlRDSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQ1VSLkdTLmNvbnRyb2xfdmFsdWVfY3V0aW4gPSAoVFRfRjI2RG90NilhcmdzWzBdOworCisKKyNkZWZpbmUgRE9fU1NXQ0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIENVUi5HUy5zaW5nbGVfd2lkdGhfY3V0aW4gPSAoVFRfRjI2RG90NilhcmdzWzBdOworCisKKyAgICAvKiBYWFg6IFVORE9DVU1FTlRFRCEgb3IgYnVnIGluIHRoZSBXaW5kb3dzIGVuZ2luZT8gKi8KKyAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiBJdCBzZWVtcyB0aGF0IHRoZSB2YWx1ZSB0aGF0IGlzIHJlYWQgaGVyZSBpcyAgICAgKi8KKyAgICAvKiBleHByZXNzZWQgaW4gMTYuMTYgZm9ybWF0IHJhdGhlciB0aGFuIGluIGZvbnQgICAgKi8KKyAgICAvKiB1bml0cy4uICAgIC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRE9fU1NXICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQ1VSLkdTLnNpbmdsZV93aWR0aF92YWx1ZSA9IChUVF9GMjZEb3Q2KShhcmdzWzBdID4+IDEwKTsKKworCisjZGVmaW5lIERPX0ZMSVBPTiAgICAgICAgICAgIFwKKyAgICBDVVIuR1MuYXV0b19mbGlwID0gVFJVRTsKKworCisjZGVmaW5lIERPX0ZMSVBPRkYgICAgICAgICAgICBcCisgICAgQ1VSLkdTLmF1dG9fZmxpcCA9IEZBTFNFOworCisKKyNkZWZpbmUgRE9fU0RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQ1VSLkdTLmRlbHRhX2Jhc2UgPSAoVFRfU2hvcnQpYXJnc1swXTsKKworCisjZGVmaW5lIERPX1NEUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBDVVIuR1MuZGVsdGFfc2hpZnQgPSAoVFRfU2hvcnQpYXJnc1swXTsKKworCisjZGVmaW5lIERPX01EICAvKiBub3RoaW5nICovCisKKworI2RlZmluZSBET19NUFBFTSAgICAgICAgICAgICAgXAorICAgIGFyZ3NbMF0gPSBDVVJSRU5UX1BwZW0oKTsKKworCisvKiBOb3RlOiB0aGUgcG9pbnRTaXplIHNob3VsZCBiZSBpcnJlbGV2YW50IGluIGEgZ2l2ZW4gZm9udCBwcm9ncmFtICovCisvKiAgICAgICB3ZSB0aHVzIGRlY2lkZSB0byByZXR1cm4gb25seSB0aGUgcHBlbSAgICAgICAgICAgICAgICAgICAgICovCisjaWYgMAorI2RlZmluZSBET19NUFMgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhcmdzWzBdID0gQ1VSLm1ldHJpY3MucG9pbnRTaXplOworI2Vsc2UKKyNkZWZpbmUgRE9fTVBTICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYXJnc1swXSA9IENVUlJFTlRfUHBlbSgpOworI2VuZGlmCisKKyNkZWZpbmUgRE9fRFVQICAgICAgICAgXAorICAgIGFyZ3NbMV0gPSBhcmdzWzBdOworCisKKyNkZWZpbmUgRE9fQ0xFQVIgICAgIFwKKyAgICBDVVIubmV3X3RvcCA9IDA7CisKKworI2RlZmluZSBET19TV0FQICAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgIFwKKyAgICBUVF9Mb25nICBMOyAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgTCAgICAgICA9IGFyZ3NbMF07IFwKKyAgICBhcmdzWzBdID0gYXJnc1sxXTsgXAorICAgIGFyZ3NbMV0gPSBMOyAgICAgICBcCisgIH0KKworCisjZGVmaW5lIERPX0RFUFRIICAgICAgIFwKKyAgICBhcmdzWzBdID0gQ1VSLnRvcDsKKworCisjZGVmaW5lIERPX0NJTkRFWCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFRUX0xvbmcgIEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEwgPSBhcmdzWzBdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoIEwgPD0gMCB8fCBMID4gQ1VSLmFyZ3MgKSAgICAgICAgICAgXAorICAgICAgQ1VSLmVycm9yID0gVFRfRXJyX0ludmFsaWRfUmVmZXJlbmNlOyBcCisgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGFyZ3NbMF0gPSBDVVIuc3RhY2tbQ1VSLmFyZ3MgLSBMXTsgICAgXAorICB9CisKKworI2RlZmluZSBET19KUk9UICAgICAgICAgICAgICAgXAorICAgIGlmICggYXJnc1sxXSAhPSAwICkgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgQ1VSLklQICAgICAgKz0gYXJnc1swXTsgXAorICAgICAgQ1VSLnN0ZXBfaW5zID0gRkFMU0U7ICAgXAorICAgIH0KKworCisjZGVmaW5lIERPX0pNUFIgICAgICAgICAgICAgXAorICAgIENVUi5JUCAgICAgICs9IGFyZ3NbMF07IFwKKyAgICBDVVIuc3RlcF9pbnMgPSBGQUxTRTsKKworCisjZGVmaW5lIERPX0pST0YgICAgICAgICAgICAgICBcCisgICAgaWYgKCBhcmdzWzFdID09IDAgKSAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBDVVIuSVAgICAgICArPSBhcmdzWzBdOyBcCisgICAgICBDVVIuc3RlcF9pbnMgPSBGQUxTRTsgICBcCisgICAgfQorCisKKyNkZWZpbmUgRE9fTFQgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGFyZ3NbMF0gPSAoYXJnc1swXSA8IGFyZ3NbMV0pOworCisKKyNkZWZpbmUgRE9fTFRFUSAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhcmdzWzBdID0gKGFyZ3NbMF0gPD0gYXJnc1sxXSk7CisKKworI2RlZmluZSBET19HVCAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYXJnc1swXSA9IChhcmdzWzBdID4gYXJnc1sxXSk7CisKKworI2RlZmluZSBET19HVEVRICAgICAgICAgICAgICAgICAgICAgXAorICAgIGFyZ3NbMF0gPSAoYXJnc1swXSA+PSBhcmdzWzFdKTsKKworCisjZGVmaW5lIERPX0VRICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYXJnc1swXSA9IChhcmdzWzBdID09IGFyZ3NbMV0pOworCisKKyNkZWZpbmUgRE9fTkVRICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhcmdzWzBdID0gKGFyZ3NbMF0gIT0gYXJnc1sxXSk7CisKKworI2RlZmluZSBET19PREQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYXJnc1swXSA9ICggKENVUl9GdW5jX3JvdW5kKCBhcmdzWzBdLCAwICkgJiAxMjcpID09IDY0ICk7CisKKworI2RlZmluZSBET19FVkVOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhcmdzWzBdID0gKCAoQ1VSX0Z1bmNfcm91bmQoIGFyZ3NbMF0sIDAgKSAmIDEyNykgPT0gMCApOworCisKKyNkZWZpbmUgRE9fQU5EICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGFyZ3NbMF0gPSAoIGFyZ3NbMF0gJiYgYXJnc1sxXSApOworCisKKyNkZWZpbmUgRE9fT1IgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGFyZ3NbMF0gPSAoIGFyZ3NbMF0gfHwgYXJnc1sxXSApOworCisKKyNkZWZpbmUgRE9fTk9UICAgICAgICAgIFwKKyAgICBhcmdzWzBdID0gIWFyZ3NbMF07CisKKworI2RlZmluZSBET19BREQgICAgICAgICAgXAorICAgIGFyZ3NbMF0gKz0gYXJnc1sxXTsKKworCisjZGVmaW5lIERPX1NVQiAgICAgICAgICBcCisgICAgYXJnc1swXSAtPSBhcmdzWzFdOworCisKKyNkZWZpbmUgRE9fRElWICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCBhcmdzWzFdID09IDAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgQ1VSLmVycm9yID0gVFRfRXJyX0RpdmlkZV9CeV9aZXJvOyAgICAgICAgICAgIFwKKyAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBhcmdzWzBdID0gVFRfTVVMRElWKCBhcmdzWzBdLCA2NEwsIGFyZ3NbMV0gKTsKKworCisjZGVmaW5lIERPX01VTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhcmdzWzBdID0gVFRfTVVMRElWKCBhcmdzWzBdLCBhcmdzWzFdLCA2NEwgKTsKKworCisjZGVmaW5lIERPX0FCUyAgICAgICAgICAgICAgICBcCisgICAgYXJnc1swXSA9IEFCUyggYXJnc1swXSApOworCisKKyNkZWZpbmUgRE9fTkVHICAgICAgICAgIFwKKyAgICBhcmdzWzBdID0gLWFyZ3NbMF07CisKKworI2RlZmluZSBET19GTE9PUiAgICBcCisgICAgYXJnc1swXSAmPSAtNjQ7CisKKworI2RlZmluZSBET19DRUlMSU5HICAgICAgICAgICAgICAgICAgICBcCisgICAgYXJnc1swXSA9IChhcmdzWzBdICsgNjMpICYgKC02NCk7CisKKworI2RlZmluZSBET19SUyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICBUVF9VTG9uZyAgSSA9IChUVF9VTG9uZylhcmdzWzBdOyAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICBpZiAoIEJPVU5EUyggSSwgQ1VSLnN0b3JlU2l6ZSApICkgXAorICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIGlmICggQ1VSLnBlZGFudGljX2hpbnRpbmcgKSAgICAgXAorICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgQVJSQVlfQk9VTkRfRVJST1I7ICAgICAgICAgICAgXAorICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgYXJnc1swXSA9IDA7ICAgICAgICAgICAgICAgICAgXAorICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIGFyZ3NbMF0gPSBDVVIuc3RvcmFnZVtJXTsgICAgICAgXAorICAgfQorCisKKyNkZWZpbmUgRE9fV1MgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgVFRfVUxvbmcgIEkgPSAoVFRfVUxvbmcpYXJnc1swXTsgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgaWYgKCBCT1VORFMoIEksIENVUi5zdG9yZVNpemUgKSApIFwKKyAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICBpZiAoIENVUi5wZWRhbnRpY19oaW50aW5nICkgICAgIFwKKyAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIEFSUkFZX0JPVU5EX0VSUk9SOyAgICAgICAgICAgIFwKKyAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICBDVVIuc3RvcmFnZVtJXSA9IGFyZ3NbMV07ICAgICAgIFwKKyAgIH0KKworCisjZGVmaW5lIERPX1JDVlQgICAgICAgICAgICAgICAgICAgICAgICBcCisgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIFRUX1VMb25nICBJID0gKFRUX1VMb25nKWFyZ3NbMF07ICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIGlmICggQk9VTkRTKCBJLCBDVVIuY3Z0U2l6ZSApICkgICBcCisgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgaWYgKCBDVVIucGVkYW50aWNfaGludGluZyApICAgICBcCisgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICBBUlJBWV9CT1VORF9FUlJPUjsgICAgICAgICAgICBcCisgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICBhcmdzWzBdID0gMDsgICAgICAgICAgICAgICAgICBcCisgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgYXJnc1swXSA9IENVUl9GdW5jX3JlYWRfY3Z0KEkpOyBcCisgICB9CisKKworI2RlZmluZSBET19XQ1ZUUCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgVFRfVUxvbmcgIEkgPSAoVFRfVUxvbmcpYXJnc1swXTsgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgaWYgKCBCT1VORFMoIEksIENVUi5jdnRTaXplICkgKSAgICAgXAorICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgaWYgKCBDVVIucGVkYW50aWNfaGludGluZyApICAgICAgIFwKKyAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgQVJSQVlfQk9VTkRfRVJST1I7ICAgICAgICAgICAgICBcCisgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgQ1VSX0Z1bmNfd3JpdGVfY3Z0KCBJLCBhcmdzWzFdICk7IFwKKyAgIH0KKworCisjZGVmaW5lIERPX1dDVlRGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgVFRfVUxvbmcgIEkgPSAoVFRfVUxvbmcpYXJnc1swXTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgaWYgKCBCT1VORFMoIEksIENVUi5jdnRTaXplICkgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIGlmICggQ1VSLnBlZGFudGljX2hpbnRpbmcgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICBBUlJBWV9CT1VORF9FUlJPUjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIENVUi5jdnRbSV0gPSBUVF9NVUxGSVgoIGFyZ3NbMV0sIENVUi50dF9tZXRyaWNzLnNjYWxlICk7IFwKKyAgIH0KKworCisjZGVmaW5lIERPX0RFQlVHICAgICAgICAgICAgICAgICAgICAgXAorICAgIENVUi5lcnJvciA9IFRUX0Vycl9EZWJ1Z19PcENvZGU7CisKKworI2RlZmluZSBET19ST1VORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhcmdzWzBdID0gQ1VSX0Z1bmNfcm91bmQoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgYXJnc1swXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIENVUi50dF9tZXRyaWNzLmNvbXBlbnNhdGlvbnNbQ1VSLm9wY29kZSAtIDB4NjhdICk7CisKKworI2RlZmluZSBET19OUk9VTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYXJnc1swXSA9IFJPVU5EX05vbmUoIGFyZ3NbMF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSLnR0X21ldHJpY3MuY29tcGVuc2F0aW9uc1tDVVIub3Bjb2RlIC0gMHg2Q10gKTsKKworCisjZGVmaW5lIERPX01BWCAgICAgICAgICAgICAgIFwKKyAgICBpZiAoIGFyZ3NbMV0gPiBhcmdzWzBdICkgXAorICAgICAgYXJnc1swXSA9IGFyZ3NbMV07CisKKworI2RlZmluZSBET19NSU4gICAgICAgICAgICAgICBcCisgICAgaWYgKCBhcmdzWzFdIDwgYXJnc1swXSApIFwKKyAgICAgIGFyZ3NbMF0gPSBhcmdzWzFdOworCisKKyNpZm5kZWYgVFRfQ09ORklHX09QVElPTl9JTlRFUlBSRVRFUl9TV0lUQ0gKKworCisjdW5kZWYgIEFSUkFZX0JPVU5EX0VSUk9SCisjZGVmaW5lIEFSUkFZX0JPVU5EX0VSUk9SICAgICAgICAgICAgICAgICAgICBcCisgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgQ1VSLmVycm9yID0gVFRfRXJyX0ludmFsaWRfUmVmZXJlbmNlOyBcCisgICAgICAgcmV0dXJuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogU1ZUQ0FbYV06ICAgICBTZXQgKEYgYW5kIFApIFZlY3RvcnMgdG8gQ29vcmRpbmF0ZSBBeGlzICAgICAgICAgICAgICAgICovCisgIC8qIE9wY29kZSByYW5nZTogMHgwMC0weDAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBTdGFjazogICAgICAgIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0YXRpYworICB2b2lkICBJbnNfU1ZUQ0EoIElOU19BUkcgKQorICB7CisgICAgRE9fU1ZUQ0EKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBTUFZUQ0FbYV06ICAgIFNldCBQVmVjdG9yIHRvIENvb3JkaW5hdGUgQXhpcyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogT3Bjb2RlIHJhbmdlOiAweDAyLTB4MDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFN0YWNrOiAgICAgICAgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgc3RhdGljCisgIHZvaWQgIEluc19TUFZUQ0EoIElOU19BUkcgKQorICB7CisgICAgRE9fU1BWVENBCisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogU0ZWVENBW2FdOiAgICBTZXQgRlZlY3RvciB0byBDb29yZGluYXRlIEF4aXMgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIE9wY29kZSByYW5nZTogMHgwNC0weDA1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBTdGFjazogICAgICAgIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0YXRpYworICB2b2lkICBJbnNfU0ZWVENBKCBJTlNfQVJHICkKKyAgeworICAgIERPX1NGVlRDQQorICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFNQVlRMW2FdOiAgICAgU2V0IFBWZWN0b3IgVG8gTGluZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBPcGNvZGUgcmFuZ2U6IDB4MDYtMHgwNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogU3RhY2s6ICAgICAgICB1aW50MzIgdWludDMyIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBzdGF0aWMKKyAgdm9pZCAgSW5zX1NQVlRMKCBJTlNfQVJHICkKKyAgeworICAgIERPX1NQVlRMCisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogU0ZWVExbYV06ICAgICBTZXQgRlZlY3RvciBUbyBMaW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIE9wY29kZSByYW5nZTogMHgwOC0weDA5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBTdGFjazogICAgICAgIHVpbnQzMiB1aW50MzIgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0YXRpYworICB2b2lkICBJbnNfU0ZWVEwoIElOU19BUkcgKQorICB7CisgICAgRE9fU0ZWVEwKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBTRlZUUFZbXTogICAgIFNldCBGVmVjdG9yIFRvIFBWZWN0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogT3Bjb2RlIHJhbmdlOiAweDBFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFN0YWNrOiAgICAgICAgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgc3RhdGljCisgIHZvaWQgIEluc19TRlZUUFYoIElOU19BUkcgKQorICB7CisgICAgRE9fU0ZWVFBWCisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogU1BWRlNbXTogICAgICBTZXQgUFZlY3RvciBGcm9tIFN0YWNrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIE9wY29kZSByYW5nZTogMHgwQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBTdGFjazogICAgICAgIGYyLjE0IGYyLjE0IC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0YXRpYworICB2b2lkICBJbnNfU1BWRlMoIElOU19BUkcgKQorICB7CisgICAgRE9fU1BWRlMKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBTRlZGU1tdOiAgICAgIFNldCBGVmVjdG9yIEZyb20gU3RhY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogT3Bjb2RlIHJhbmdlOiAweDBCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFN0YWNrOiAgICAgICAgZjIuMTQgZjIuMTQgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgc3RhdGljCisgIHZvaWQgIEluc19TRlZGUyggSU5TX0FSRyApCisgIHsKKyAgICBET19TRlZGUworICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIEdQVltdOiAgICAgICAgR2V0IFByb2plY3Rpb24gVmVjdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBPcGNvZGUgcmFuZ2U6IDB4MEMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogU3RhY2s6ICAgICAgICBlZjIuMTQgLS0+IGVmMi4xNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBzdGF0aWMKKyAgdm9pZCAgSW5zX0dQViggSU5TX0FSRyApCisgIHsKKyAgICBET19HUFYKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qIEdGVltdOiAgICAgICAgR2V0IEZyZWVkb20gVmVjdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBPcGNvZGUgcmFuZ2U6IDB4MEQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogU3RhY2s6ICAgICAgICBlZjIuMTQgLS0+IGVmMi4xNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBzdGF0aWMKKyAgdm9pZCAgSW5zX0dGViggSU5TX0FSRyApCisgIHsKKyAgICBET19HRlYKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBTUlAwW106ICAgICAgIFNldCBSZWZlcmVuY2UgUG9pbnQgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogT3Bjb2RlIHJhbmdlOiAweDEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFN0YWNrOiAgICAgICAgdWludDMyIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgc3RhdGljCisgIHZvaWQgIEluc19TUlAwKCBJTlNfQVJHICkKKyAgeworICAgIERPX1NSUDAKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBTUlAxW106ICAgICAgIFNldCBSZWZlcmVuY2UgUG9pbnQgMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogT3Bjb2RlIHJhbmdlOiAweDExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFN0YWNrOiAgICAgICAgdWludDMyIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgc3RhdGljCisgIHZvaWQgIEluc19TUlAxKCBJTlNfQVJHICkKKyAgeworICAgIERPX1NSUDEKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBTUlAyW106ICAgICAgIFNldCBSZWZlcmVuY2UgUG9pbnQgMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogT3Bjb2RlIHJhbmdlOiAweDEyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFN0YWNrOiAgICAgICAgdWludDMyIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgc3RhdGljCisgIHZvaWQgIEluc19TUlAyKCBJTlNfQVJHICkKKyAgeworICAgIERPX1NSUDIKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBSVEhHW106ICAgICAgIFJvdW5kIFRvIEhhbGYgR3JpZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogT3Bjb2RlIHJhbmdlOiAweDE5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFN0YWNrOiAgICAgICAgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgc3RhdGljCisgIHZvaWQgIEluc19SVEhHKCBJTlNfQVJHICkKKyAgeworICAgIERPX1JUSEcKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBSVEdbXTogICAgICAgIFJvdW5kIFRvIEdyaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogT3Bjb2RlIHJhbmdlOiAweDE4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFN0YWNrOiAgICAgICAgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgc3RhdGljCisgIHZvaWQgIEluc19SVEcoIElOU19BUkcgKQorICB7CisgICAgRE9fUlRHCisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiBSVERHW106ICAgICAgIFJvdW5kIFRvIERvdWJsZSBHcmlkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogT3Bjb2RlIHJhbmdlOiAweDNEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFN0YWNrOiAgICAgICAgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgc3RhdGljCisgIHZvaWQgIEluc19SVERHKCBJTlNfQVJHICkKKyAgeworICAgIERPX1JUREcKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qIFJVVEdbXTogICAgICAgUm91bmQgVXAgVG8gR3JpZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBPcGNvZGUgcmFuZ2U6IDB4N0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogU3RhY2s6ICAgICAgICAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBzdGF0aWMKKyAgdm9pZCAgSW5zX1JVVEcoIElOU19BUkcgKQorICB7CisgICAgRE9fUlVURworICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFJEVEdbXTogICAgICAgUm91bmQgRG93biBUbyBHcmlkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBPcGNvZGUgcmFuZ2U6IDB4N0QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogU3RhY2s6ICAgICAgICAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBzdGF0aWMKKyAgdm9pZCAgSW5zX1JEVEcoIElOU19BUkcgKQorICB7CisgICAgRE9fUkRURworICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFJPRkZbXTogICAgICAgUm91bmQgT0ZGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBPcGNvZGUgcmFuZ2U6IDB4N0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogU3RhY2s6ICAgICAgICAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBzdGF0aWMKKyAgdm9pZCAgSW5zX1JPRkYoIElOU19BUkcgKQorICB7CisgICAgRE9fUk9GRgorICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFNST1VORFtdOiAgICAgU3VwZXIgUk9VTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBPcGNvZGUgcmFuZ2U6IDB4NzYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogU3RhY2s6ICAgICAgICBFaW50OCAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBzdGF0aWMKKyAgdm9pZCAgSW5zX1NST1VORCggSU5TX0FSRyApCisgIHsKKyAgICBET19TUk9VTkQKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBTNDVST1VORFtdOiAgIFN1cGVyIFJPVU5EIDQ1IGRlZ3JlZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogT3Bjb2RlIHJhbmdlOiAweDc3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFN0YWNrOiAgICAgICAgdWludDMyIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgc3RhdGljCisgIHZvaWQgIEluc19TNDVST1VORCggSU5TX0FSRyApCisgIHsKKyAgICBET19TNDVST1VORAorICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFNMT09QW106ICAgICAgU2V0IExPT1AgdmFyaWFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBPcGNvZGUgcmFuZ2U6IDB4MTcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogU3RhY2s6ICAgICAgICBpbnQzMj8gLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBzdGF0aWMKKyAgdm9pZCAgSW5zX1NMT09QKCBJTlNfQVJHICkKKyAgeworICAgIERPX1NMT09QCisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogU01EW106ICAgICAgICBTZXQgTWluaW11bSBEaXN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIE9wY29kZSByYW5nZTogMHgxQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBTdGFjazogICAgICAgIGYyNi42IC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0YXRpYworICB2b2lkICBJbnNfU01EKCBJTlNfQVJHICkKKyAgeworICAgIERPX1NNRAorICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFNDVlRDSVtdOiAgICAgU2V0IENvbnRyb2wgVmFsdWUgVGFibGUgQ3V0IEluICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBPcGNvZGUgcmFuZ2U6IDB4MUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogU3RhY2s6ICAgICAgICBmMjYuNiAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBzdGF0aWMKKyAgdm9pZCAgSW5zX1NDVlRDSSggSU5TX0FSRyApCisgIHsKKyAgICBET19TQ1ZUQ0kKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBTU1dDSVtdOiAgICAgIFNldCBTaW5nbGUgV2lkdGggQ3V0IEluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogT3Bjb2RlIHJhbmdlOiAweDFFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFN0YWNrOiAgICAgICAgZjI2LjYgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgc3RhdGljCisgIHZvaWQgIEluc19TU1dDSSggSU5TX0FSRyApCisgIHsKKyAgICBET19TU1dDSQorICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFNTV1tdOiAgICAgICAgU2V0IFNpbmdsZSBXaWR0aCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBPcGNvZGUgcmFuZ2U6IDB4MUYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogU3RhY2s6ICAgICAgICBpbnQzMj8gLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBzdGF0aWMKKyAgdm9pZCAgSW5zX1NTVyggSU5TX0FSRyApCisgIHsKKyAgICBET19TU1cKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBGTElQT05bXTogICAgIFNldCBhdXRvLUZMSVAgdG8gT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogT3Bjb2RlIHJhbmdlOiAweDREICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFN0YWNrOiAgICAgICAgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgc3RhdGljCisgIHZvaWQgIEluc19GTElQT04oIElOU19BUkcgKQorICB7CisgICAgRE9fRkxJUE9OCisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogRkxJUE9GRltdOiAgICBTZXQgYXV0by1GTElQIHRvIE9GRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIE9wY29kZSByYW5nZTogMHg0RSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBTdGFjazogLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0YXRpYworICB2b2lkICBJbnNfRkxJUE9GRiggSU5TX0FSRyApCisgIHsKKyAgICBET19GTElQT0ZGCisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogU0FOR1dbXTogICAgICBTZXQgQU5HbGUgV2VpZ2h0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIE9wY29kZSByYW5nZTogMHg3RSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBTdGFjazogICAgICAgIHVpbnQzMiAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0YXRpYworICB2b2lkICBJbnNfU0FOR1coIElOU19BUkcgKQorICB7CisgICAgLyogaW5zdHJ1Y3Rpb24gbm90IHN1cHBvcnRlZCBhbnltb3JlICovCisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogU0RCW106ICAgICAgICBTZXQgRGVsdGEgQmFzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIE9wY29kZSByYW5nZTogMHg1RSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBTdGFjazogICAgICAgIHVpbnQzMiAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0YXRpYworICB2b2lkICBJbnNfU0RCKCBJTlNfQVJHICkKKyAgeworICAgIERPX1NEQgorICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFNEU1tdOiAgICAgICAgU2V0IERlbHRhIFNoaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBPcGNvZGUgcmFuZ2U6IDB4NUYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogU3RhY2s6ICAgICAgICB1aW50MzIgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBzdGF0aWMKKyAgdm9pZCAgSW5zX1NEUyggSU5TX0FSRyApCisgIHsKKyAgICBET19TRFMKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBNUFBFTVtdOiAgICAgIE1lYXN1cmUgUGl4ZWwgUGVyIEVNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogT3Bjb2RlIHJhbmdlOiAweDRCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFN0YWNrOiAgICAgICAgLS0+IEV1aW50MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgc3RhdGljCisgIHZvaWQgIEluc19NUFBFTSggSU5TX0FSRyApCisgIHsKKyAgICBET19NUFBFTQorICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIE1QU1tdOiAgICAgICAgTWVhc3VyZSBQb2ludCBTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBPcGNvZGUgcmFuZ2U6IDB4NEMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogU3RhY2s6ICAgICAgICAtLT4gRXVpbnQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBzdGF0aWMKKyAgdm9pZCAgSW5zX01QUyggSU5TX0FSRyApCisgIHsKKyAgICBET19NUFMKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBEVVBbXTogICAgICAgIERVUGxpY2F0ZSB0b3Agc3RhY2sgZWxlbWVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogT3Bjb2RlIHJhbmdlOiAweDIwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFN0YWNrOiAgICAgICAgU3RrRWx0IC0tPiBTdGtFbHQgU3RrRWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgc3RhdGljCisgIHZvaWQgIEluc19EVVAoIElOU19BUkcgKQorICB7CisgICAgRE9fRFVQCisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogUE9QW106ICAgICAgICBQT1AgdGhlIHN0YWNrJ3MgdG9wIGVsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIE9wY29kZSByYW5nZTogMHgyMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBTdGFjazogICAgICAgIFN0a0VsdCAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0YXRpYworICB2b2lkICBJbnNfUE9QKCBJTlNfQVJHICkKKyAgeworICAgIC8qIG5vdGhpbmcgdG8gZG8gKi8KKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBDTEVBUltdOiAgICAgIENMRUFSIHRoZSBlbnRpcmUgc3RhY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogT3Bjb2RlIHJhbmdlOiAweDIyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFN0YWNrOiAgICAgICAgU3RrRWx0Li4uIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgc3RhdGljCisgIHZvaWQgIEluc19DTEVBUiggSU5TX0FSRyApCisgIHsKKyAgICBET19DTEVBUgorICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFNXQVBbXTogICAgICAgU1dBUCB0aGUgdG9wIHR3byBlbGVtZW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBPcGNvZGUgcmFuZ2U6IDB4MjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogU3RhY2s6ICAgICAgICAyICogU3RrRWx0IC0tPiAyICogU3RrRWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBzdGF0aWMKKyAgdm9pZCAgSW5zX1NXQVAoIElOU19BUkcgKQorICB7CisgICAgRE9fU1dBUAorICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIERFUFRIW106ICAgICAgcmV0dXJuIHRoZSBzdGFjayBERVBUSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBPcGNvZGUgcmFuZ2U6IDB4MjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogU3RhY2s6ICAgICAgICAtLT4gdWludDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBzdGF0aWMKKyAgdm9pZCAgSW5zX0RFUFRIKCBJTlNfQVJHICkKKyAgeworICAgIERPX0RFUFRICisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogQ0lOREVYW106ICAgICBDb3B5IElOREVYZWQgZWxlbWVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIE9wY29kZSByYW5nZTogMHgyNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBTdGFjazogICAgICAgIGludDMyIC0tPiBTdGtFbHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0YXRpYworICB2b2lkICBJbnNfQ0lOREVYKCBJTlNfQVJHICkKKyAgeworICAgIERPX0NJTkRFWAorICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIEVJRltdOiAgICAgICAgRW5kIElGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBPcGNvZGUgcmFuZ2U6IDB4NTkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogU3RhY2s6ICAgICAgICAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBzdGF0aWMKKyAgdm9pZCAgSW5zX0VJRiggSU5TX0FSRyApCisgIHsKKyAgICAvKiBub3RoaW5nIHRvIGRvICovCisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogSlJPVFtdOiAgICAgICBKdW1wIFJlbGF0aXZlIE9uIFRydWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIE9wY29kZSByYW5nZTogMHg3OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBTdGFjazogICAgICAgIFN0a0VsdCBpbnQzMiAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0YXRpYworICB2b2lkICBJbnNfSlJPVCggSU5TX0FSRyApCisgIHsKKyAgICBET19KUk9UCisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogSk1QUltdOiAgICAgICBKdU1QIFJlbGF0aXZlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIE9wY29kZSByYW5nZTogMHgxQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBTdGFjazogICAgICAgIGludDMyIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0YXRpYworICB2b2lkICBJbnNfSk1QUiggSU5TX0FSRyApCisgIHsKKyAgICBET19KTVBSCisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogSlJPRltdOiAgICAgICBKdW1wIFJlbGF0aXZlIE9uIEZhbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIE9wY29kZSByYW5nZTogMHg3OSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBTdGFjazogICAgICAgIFN0a0VsdCBpbnQzMiAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0YXRpYworICB2b2lkICBJbnNfSlJPRiggSU5TX0FSRyApCisgIHsKKyAgICBET19KUk9GCisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogTFRbXTogICAgICAgICBMZXNzIFRoYW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIE9wY29kZSByYW5nZTogMHg1MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBTdGFjazogICAgICAgIGludDMyPyBpbnQzMj8gLS0+IGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0YXRpYworICB2b2lkICBJbnNfTFQoIElOU19BUkcgKQorICB7CisgICAgRE9fTFQKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBMVEVRW106ICAgICAgIExlc3MgVGhhbiBvciBFUXVhbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogT3Bjb2RlIHJhbmdlOiAweDUxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFN0YWNrOiAgICAgICAgaW50MzI/IGludDMyPyAtLT4gYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgc3RhdGljCisgIHZvaWQgIEluc19MVEVRKCBJTlNfQVJHICkKKyAgeworICAgIERPX0xURVEKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBHVFtdOiAgICAgICAgIEdyZWF0ZXIgVGhhbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogT3Bjb2RlIHJhbmdlOiAweDUyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFN0YWNrOiAgICAgICAgaW50MzI/IGludDMyPyAtLT4gYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgc3RhdGljCisgIHZvaWQgIEluc19HVCggSU5TX0FSRyApCisgIHsKKyAgICBET19HVAorICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIEdURVFbXTogICAgICAgR3JlYXRlciBUaGFuIG9yIEVRdWFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBPcGNvZGUgcmFuZ2U6IDB4NTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogU3RhY2s6ICAgICAgICBpbnQzMj8gaW50MzI/IC0tPiBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBzdGF0aWMKKyAgdm9pZCAgSW5zX0dURVEoIElOU19BUkcgKQorICB7CisgICAgRE9fR1RFUQorICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIEVRW106ICAgICAgICAgRVF1YWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBPcGNvZGUgcmFuZ2U6IDB4NTQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogU3RhY2s6ICAgICAgICBTdGtFbHQgU3RrRWx0IC0tPiBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBzdGF0aWMKKyAgdm9pZCAgSW5zX0VRKCBJTlNfQVJHICkKKyAgeworICAgIERPX0VRCisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogTkVRW106ICAgICAgICBOb3QgRVF1YWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIE9wY29kZSByYW5nZTogMHg1NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBTdGFjazogICAgICAgIFN0a0VsdCBTdGtFbHQgLS0+IGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0YXRpYworICB2b2lkICBJbnNfTkVRKCBJTlNfQVJHICkKKyAgeworICAgIERPX05FUQorICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIE9ERFtdOiAgICAgICAgSXMgT0REICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBPcGNvZGUgcmFuZ2U6IDB4NTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogU3RhY2s6ICAgICAgICBmMjYuNiAtLT4gYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBzdGF0aWMKKyAgdm9pZCAgSW5zX09ERCggSU5TX0FSRyApCisgIHsKKyAgICBET19PREQKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBFVkVOW106ICAgICAgIElzIEVWRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogT3Bjb2RlIHJhbmdlOiAweDU3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFN0YWNrOiAgICAgICAgZjI2LjYgLS0+IGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgc3RhdGljCisgIHZvaWQgIEluc19FVkVOKCBJTlNfQVJHICkKKyAgeworICAgIERPX0VWRU4KKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBBTkRbXTogICAgICAgIGxvZ2ljYWwgQU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogT3Bjb2RlIHJhbmdlOiAweDVBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFN0YWNrOiAgICAgICAgdWludDMyIHVpbnQzMiAtLT4gdWludDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgc3RhdGljCisgIHZvaWQgIEluc19BTkQoIElOU19BUkcgKQorICB7CisgICAgRE9fQU5ECisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogT1JbXTogICAgICAgICBsb2dpY2FsIE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIE9wY29kZSByYW5nZTogMHg1QiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBTdGFjazogICAgICAgIHVpbnQzMiB1aW50MzIgLS0+IHVpbnQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0YXRpYworICB2b2lkICBJbnNfT1IoIElOU19BUkcgKQorICB7CisgICAgRE9fT1IKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBOT1RbXTogICAgICAgIGxvZ2ljYWwgTk9UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogT3Bjb2RlIHJhbmdlOiAweDVDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFN0YWNrOiAgICAgICAgU3RrRWx0IC0tPiB1aW50MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgc3RhdGljCisgIHZvaWQgIEluc19OT1QoIElOU19BUkcgKQorICB7CisgICAgRE9fTk9UCisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogQUREW106ICAgICAgICBBREQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIE9wY29kZSByYW5nZTogMHg2MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBTdGFjazogICAgICAgIGYyNi42IGYyNi42IC0tPiBmMjYuNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0YXRpYworICB2b2lkICBJbnNfQUREKCBJTlNfQVJHICkKKyAgeworICAgIERPX0FERAorICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFNVQltdOiAgICAgICAgU1VCdHJhY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBPcGNvZGUgcmFuZ2U6IDB4NjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogU3RhY2s6ICAgICAgICBmMjYuNiBmMjYuNiAtLT4gZjI2LjYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBzdGF0aWMKKyAgdm9pZCAgSW5zX1NVQiggSU5TX0FSRyApCisgIHsKKyAgICBET19TVUIKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBESVZbXTogICAgICAgIERJVmlkZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogT3Bjb2RlIHJhbmdlOiAweDYyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFN0YWNrOiAgICAgICAgZjI2LjYgZjI2LjYgLS0+IGYyNi42ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgc3RhdGljCisgIHZvaWQgIEluc19ESVYoIElOU19BUkcgKQorICB7CisgICAgRE9fRElWCisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogTVVMW106ICAgICAgICBNVUx0aXBseSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIE9wY29kZSByYW5nZTogMHg2MyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBTdGFjazogICAgICAgIGYyNi42IGYyNi42IC0tPiBmMjYuNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0YXRpYworICB2b2lkICBJbnNfTVVMKCBJTlNfQVJHICkKKyAgeworICAgIERPX01VTAorICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIEFCU1tdOiAgICAgICAgQUJTb2x1dGUgdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBPcGNvZGUgcmFuZ2U6IDB4NjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogU3RhY2s6ICAgICAgICBmMjYuNiAtLT4gZjI2LjYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBzdGF0aWMKKyAgdm9pZCAgSW5zX0FCUyggSU5TX0FSRyApCisgIHsKKyAgICBET19BQlMKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBORUdbXTogICAgICAgIE5FR2F0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogT3Bjb2RlIHJhbmdlOiAweDY1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFN0YWNrOiBmMjYuNiAtLT4gZjI2LjYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgc3RhdGljCisgIHZvaWQgIEluc19ORUcoIElOU19BUkcgKQorICB7CisgICAgRE9fTkVHCisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogRkxPT1JbXTogICAgICBGTE9PUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIE9wY29kZSByYW5nZTogMHg2NiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBTdGFjazogICAgICAgIGYyNi42IC0tPiBmMjYuNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0YXRpYworICB2b2lkICBJbnNfRkxPT1IoIElOU19BUkcgKQorICB7CisgICAgRE9fRkxPT1IKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBDRUlMSU5HW106ICAgIENFSUxJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogT3Bjb2RlIHJhbmdlOiAweDY3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFN0YWNrOiAgICAgICAgZjI2LjYgLS0+IGYyNi42ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgc3RhdGljCisgIHZvaWQgIEluc19DRUlMSU5HKCBJTlNfQVJHICkKKyAgeworICAgIERPX0NFSUxJTkcKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBSU1tdOiAgICAgICAgIFJlYWQgU3RvcmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogT3Bjb2RlIHJhbmdlOiAweDQzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFN0YWNrOiAgICAgICAgdWludDMyIC0tPiB1aW50MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgc3RhdGljCisgIHZvaWQgIEluc19SUyggSU5TX0FSRyApCisgIHsKKyAgICBET19SUworICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFdTW106ICAgICAgICAgV3JpdGUgU3RvcmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBPcGNvZGUgcmFuZ2U6IDB4NDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogU3RhY2s6ICAgICAgICB1aW50MzIgdWludDMyIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBzdGF0aWMKKyAgdm9pZCAgSW5zX1dTKCBJTlNfQVJHICkKKyAgeworICAgIERPX1dTCisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogV0NWVFBbXTogICAgICBXcml0ZSBDVlQgaW4gUGl4ZWwgdW5pdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIE9wY29kZSByYW5nZTogMHg0NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBTdGFjazogICAgICAgIGYyNi42IHVpbnQzMiAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0YXRpYworICB2b2lkICBJbnNfV0NWVFAoIElOU19BUkcgKQorICB7CisgICAgRE9fV0NWVFAKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBXQ1ZURltdOiAgICAgIFdyaXRlIENWVCBpbiBGdW5pdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogT3Bjb2RlIHJhbmdlOiAweDcwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFN0YWNrOiAgICAgICAgdWludDMyIHVpbnQzMiAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgc3RhdGljCisgIHZvaWQgIEluc19XQ1ZURiggSU5TX0FSRyApCisgIHsKKyAgICBET19XQ1ZURgorICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFJDVlRbXTogICAgICAgUmVhZCBDVlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBPcGNvZGUgcmFuZ2U6IDB4NDUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogU3RhY2s6ICAgICAgICB1aW50MzIgLS0+IGYyNi42ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBzdGF0aWMKKyAgdm9pZCAgSW5zX1JDVlQoIElOU19BUkcgKQorICB7CisgICAgRE9fUkNWVAorICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIEFBW106ICAgICAgICAgQWRqdXN0IEFuZ2xlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBPcGNvZGUgcmFuZ2U6IDB4N0YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogU3RhY2s6ICAgICAgICB1aW50MzIgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBzdGF0aWMKKyAgdm9pZCAgSW5zX0FBKCBJTlNfQVJHICkKKyAgeworICAgIC8qIEludGVudGlvbmFsIC0gbm8gbG9uZ2VyIHN1cHBvcnRlZCAqLworICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIERFQlVHW106ICAgICAgREVCVUcuICBVbnN1cHBvcnRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBPcGNvZGUgcmFuZ2U6IDB4NEYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogU3RhY2s6ICAgICAgICB1aW50MzIgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBOb3RlOiBUaGUgb3JpZ2luYWwgaW5zdHJ1Y3Rpb24gcG9wcyBhIHZhbHVlIGZyb20gdGhlIHN0YWNrICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0YXRpYworICB2b2lkICBJbnNfREVCVUcoIElOU19BUkcgKQorICB7CisgICAgRE9fREVCVUcKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBST1VORFthYl06ICAgIFJPVU5EIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogT3Bjb2RlIHJhbmdlOiAweDY4LTB4NkIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFN0YWNrOiAgICAgICAgZjI2LjYgLS0+IGYyNi42ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgc3RhdGljCisgIHZvaWQgIEluc19ST1VORCggSU5TX0FSRyApCisgIHsKKyAgICBET19ST1VORAorICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIE5ST1VORFthYl06ICAgTm8gUk9VTkRpbmcgb2YgdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBPcGNvZGUgcmFuZ2U6IDB4NkMtMHg2RiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogU3RhY2s6ICAgICAgICBmMjYuNiAtLT4gZjI2LjYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBzdGF0aWMKKyAgdm9pZCAgSW5zX05ST1VORCggSU5TX0FSRyApCisgIHsKKyAgICBET19OUk9VTkQKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBNQVhbXTogICAgICAgIE1BWGltdW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogT3Bjb2RlIHJhbmdlOiAweDY4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFN0YWNrOiAgICAgICAgaW50MzI/IGludDMyPyAtLT4gaW50MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgc3RhdGljCisgIHZvaWQgIEluc19NQVgoIElOU19BUkcgKQorICB7CisgICAgRE9fTUFYCisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogTUlOW106ICAgICAgICBNSU5pbXVtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIE9wY29kZSByYW5nZTogMHg2OSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBTdGFjazogICAgICAgIGludDMyPyBpbnQzMj8gLS0+IGludDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0YXRpYworICB2b2lkICBJbnNfTUlOKCBJTlNfQVJHICkKKyAgeworICAgIERPX01JTgorICB9CisKKworI2VuZGlmICAvKiAhVFRfQ09ORklHX09QVElPTl9JTlRFUlBSRVRFUl9TV0lUQ0ggKi8KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYXJlIGNhbGxlZCBhcyBpcyB3aXRoaW4gdGhlIHN3aXRjaCBzdGF0ZW1lbnQuICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogTUlOREVYW106ICAgICBNb3ZlIElOREVYZWQgZWxlbWVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIE9wY29kZSByYW5nZTogMHgyNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBTdGFjazogICAgICAgIGludDMyPyAtLT4gU3RrRWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0YXRpYworICB2b2lkICBJbnNfTUlOREVYKCBJTlNfQVJHICkKKyAgeworICAgIFRUX0xvbmcgIEwsIEs7CisKKworICAgIEwgPSBhcmdzWzBdOworCisgICAgaWYgKCBMIDw9IDAgfHwgTCA+IENVUi5hcmdzICkKKyAgICB7CisgICAgICBDVVIuZXJyb3IgPSBUVF9FcnJfSW52YWxpZF9SZWZlcmVuY2U7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgSyA9IENVUi5zdGFja1tDVVIuYXJncyAtIExdOworCisgICAgTUVNX01vdmUoICgmQ1VSLnN0YWNrW0NVUi5hcmdzIC0gTCAgICBdKSwKKyAgICAgICAgICAgICAgKCZDVVIuc3RhY2tbQ1VSLmFyZ3MgLSBMICsgMV0pLAorICAgICAgICAgICAgICAoTCAtIDEpICogc2l6ZW9mICggVFRfTG9uZyApICk7CisKKyAgICBDVVIuc3RhY2tbQ1VSLmFyZ3MgLSAxXSA9IEs7CisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogUk9MTFtdOiAgICAgICBST0xMIHRvcCB0aHJlZSBlbGVtZW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIE9wY29kZSByYW5nZTogMHg4QSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBTdGFjazogICAgICAgIDMgKiBTdGtFbHQgLS0+IDMgKiBTdGtFbHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0YXRpYworICB2b2lkICBJbnNfUk9MTCggSU5TX0FSRyApCisgIHsKKyAgICBUVF9Mb25nICBBLCBCLCBDOworCisKKyAgICBVTlVTRURfRVhFQzsKKworICAgIEEgPSBhcmdzWzJdOworICAgIEIgPSBhcmdzWzFdOworICAgIEMgPSBhcmdzWzBdOworCisgICAgYXJnc1syXSA9IEM7CisgICAgYXJnc1sxXSA9IEE7CisgICAgYXJnc1swXSA9IEI7CisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogTUFOQUdJTkcgVEhFIEZMT1cgT0YgQ09OVFJPTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgSW5zdHJ1Y3Rpb25zIGFwcGVhciBpbiB0aGUgc3BlY3MnIG9yZGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyAgc3RhdGljCisgIFRUX0Jvb2wgIFNraXBDb2RlKCBFWEVDX09QICkKKyAgeworICAgIENVUi5JUCArPSBDVVIubGVuZ3RoOworCisgICAgaWYgKCBDVVIuSVAgPCBDVVIuY29kZVNpemUgKQorICAgIHsKKyAgICAgIENVUi5vcGNvZGUgPSBDVVIuY29kZVtDVVIuSVBdOworCisgICAgICBDVVIubGVuZ3RoID0gb3Bjb2RlX2xlbmd0aFtDVVIub3Bjb2RlXTsKKyAgICAgIGlmICggQ1VSLmxlbmd0aCA8IDAgKQorICAgICAgeworICAgICAgICBpZiAoIENVUi5JUCArIDEgPiBDVVIuY29kZVNpemUgKQorICAgICAgICAgIGdvdG8gRmFpbF9PdmVyZmxvdzsKKyAgICAgICAgQ1VSLmxlbmd0aCA9IENVUi5jb2RlW0NVUi5JUCArIDFdICsgMjsKKyAgICAgIH0KKworICAgICAgaWYgKCBDVVIuSVAgKyBDVVIubGVuZ3RoIDw9IENVUi5jb2RlU2l6ZSApCisgICAgICAgIHJldHVybiBTVUNDRVNTOworICAgIH0KKworICBGYWlsX092ZXJmbG93OgorICAgIENVUi5lcnJvciA9IFRUX0Vycl9Db2RlX092ZXJmbG93OworICAgIHJldHVybiBGQUlMVVJFOworICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIElGW106ICAgICAgICAgSUYgdGVzdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBPcGNvZGUgcmFuZ2U6IDB4NTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogU3RhY2s6ICAgICAgICBTdGtFbHQgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBzdGF0aWMKKyAgdm9pZCAgSW5zX0lGKCBJTlNfQVJHICkKKyAgeworICAgIFRUX0ludCAgIG5JZnM7CisgICAgVFRfQm9vbCAgT3V0OworCisKKyAgICBpZiAoIGFyZ3NbMF0gIT0gMCApCisgICAgICByZXR1cm47CisKKyAgICBuSWZzID0gMTsKKyAgICBPdXQgPSAwOworCisgICAgZG8KKyAgICB7CisgICAgICBpZiAoIFNLSVBfQ29kZSgpID09IEZBSUxVUkUgKQorICAgICAgICByZXR1cm47CisKKyAgICAgIHN3aXRjaCAoIENVUi5vcGNvZGUgKQorICAgICAgeworICAgICAgY2FzZSAweDU4OiAgICAgIC8qIElGICovCisgICAgICAgIG5JZnMrKzsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgMHgxQjogICAgICAvKiBFTFNFICovCisgICAgICAgIE91dCA9IChuSWZzID09IDEpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSAweDU5OiAgICAgIC8qIEVJRiAqLworICAgICAgICBuSWZzLS07CisgICAgICAgIE91dCA9IChuSWZzID09IDApOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9IHdoaWxlICggT3V0ID09IDAgKTsKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBFTFNFW106ICAgICAgIEVMU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogT3Bjb2RlIHJhbmdlOiAweDFCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFN0YWNrOiAgICAgICAgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgc3RhdGljCisgIHZvaWQgIEluc19FTFNFKCBJTlNfQVJHICkKKyAgeworICAgIFRUX0ludCAgbklmczsKKworCisgICAgVU5VU0VEX0FSRzsKKworICAgIG5JZnMgPSAxOworCisgICAgZG8KKyAgICB7CisgICAgICBpZiAoIFNLSVBfQ29kZSgpID09IEZBSUxVUkUgKQorICAgICAgICByZXR1cm47CisKKyAgICAgIHN3aXRjaCAoIENVUi5vcGNvZGUgKQorICAgICAgeworICAgICAgY2FzZSAweDU4OiAgICAvKiBJRiAqLworICAgICAgICBuSWZzKys7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIDB4NTk6ICAgIC8qIEVJRiAqLworICAgICAgICBuSWZzLS07CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0gd2hpbGUgKCBuSWZzICE9IDAgKTsKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBERUZJTklORyBBTkQgVVNJTkcgRlVOQ1RJT05TIEFORCBJTlNUUlVDVElPTlMgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICBJbnN0cnVjdGlvbnMgYXBwZWFyIGluIHRoZSBzcGVjcycgb3JkZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIEZERUZbXTogICAgICAgRnVuY3Rpb24gREVGaW5pdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBPcGNvZGUgcmFuZ2U6IDB4MkMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogU3RhY2s6ICAgICAgICB1aW50MzIgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBzdGF0aWMKKyAgdm9pZCAgSW5zX0ZERUYoIElOU19BUkcgKQorICB7CisgICAgVFRfVUxvbmcgICAgICAgbjsKKyAgICBUVF9EZWZSZWNvcmQqICByZWM7CisgICAgVFRfRGVmUmVjb3JkKiAgbGltaXQ7CisKKyAgICAvKiBzb21lIGZvbnQgcHJvZ3JhbXMgYXJlIGJyb2tlbiBlbm91Z2ggdG8gcmVkZWZpbmUgZnVuY3Rpb25zISAqLworICAgIC8qIFdlIHdpbGwgdGhlbiBwYXJzZSB0aGUgY3VycmVudCB0YWJsZS4uICAgICAgICAgICAgICAgICAgICAgICovCisgICAgcmVjICAgPSBDVVIuRkRlZnM7CisgICAgbGltaXQgPSByZWMgKyBDVVIubnVtRkRlZnM7CisgICAgbiAgICAgPSBhcmdzWzBdOworICAgIAorICAgIGZvciAoIDsgcmVjIDwgbGltaXQ7IHJlYysrICkKKyAgICB7CisgICAgICBpZiAocmVjLT5vcGMgPT0gbikKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIAorICAgIGlmICggcmVjID09IGxpbWl0ICkKKyAgICB7CisgICAgICAvKiBjaGVjayB0aGF0IHRoZXJlIGlzIGVub3VnaCByb29tIGZvciBuZXcgZnVuY3Rpb25zICovCisgICAgICBpZiAoIENVUi5udW1GRGVmcyA+PSBDVVIubWF4RkRlZnMgKQorICAgICAgeworICAgICAgICBDVVIuZXJyb3IgPSBUVF9FcnJfVG9vX01hbnlfRnVuY3Rpb25fRGVmczsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgQ1VSLm51bUZEZWZzKys7CisgICAgfQorICAgIAorICAgIHJlYy0+cmFuZ2UgID0gQ1VSLmN1clJhbmdlOworICAgIHJlYy0+b3BjICAgID0gbjsKKyAgICByZWMtPnN0YXJ0ICA9IENVUi5JUCsxOworICAgIHJlYy0+YWN0aXZlID0gVFJVRTsKKyAgICAKKyAgICBpZiAoIG4gPiBDVVIubWF4RnVuYyApCisgICAgICBDVVIubWF4RnVuYyA9IG47CisgICAgCisgICAgLyogTm93IHNraXAgdGhlIHdob2xlIGZ1bmN0aW9uIGRlZmluaXRpb24uICovCisgICAgLyogV2UgZG9uJ3QgYWxsb3cgbmVzdGVkIElERUZTICYgRkRFRnMuICAgICovCisKKyAgICB3aGlsZSAoIFNLSVBfQ29kZSgpID09IFNVQ0NFU1MgKQorICAgIHsKKyAgICAgIHN3aXRjaCAoIENVUi5vcGNvZGUgKQorICAgICAgeworICAgICAgY2FzZSAweDg5OiAgICAvKiBJREVGICovCisgICAgICBjYXNlIDB4MkM6ICAgIC8qIEZERUYgKi8KKyAgICAgICAgQ1VSLmVycm9yID0gVFRfRXJyX05lc3RlZF9ERUZTOworICAgICAgICByZXR1cm47CisKKyAgICAgIGNhc2UgMHgyRDogICAvKiBFTkRGICovCisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICB9CisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogRU5ERltdOiAgICAgICBFTkQgRnVuY3Rpb24gZGVmaW5pdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIE9wY29kZSByYW5nZTogMHgyRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBTdGFjazogICAgICAgIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0YXRpYworICB2b2lkICBJbnNfRU5ERiggSU5TX0FSRyApCisgIHsKKyAgICBUVF9DYWxsUmVjKiAgcFJlYzsKKworCisgICAgVU5VU0VEX0FSRzsKKworICAgIGlmICggQ1VSLmNhbGxUb3AgPD0gMCApICAgICAvKiBXZSBlbmNvdW50ZXJlZCBhbiBFTkRGIHdpdGhvdXQgYSBjYWxsICovCisgICAgeworICAgICAgQ1VSLmVycm9yID0gVFRfRXJyX0VOREZfSW5fRXhlY19TdHJlYW07CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgQ1VSLmNhbGxUb3AtLTsKKworICAgIHBSZWMgPSAmQ1VSLmNhbGxTdGFja1tDVVIuY2FsbFRvcF07CisKKyAgICBwUmVjLT5DdXJfQ291bnQtLTsKKworICAgIENVUi5zdGVwX2lucyA9IEZBTFNFOworCisgICAgaWYgKCBwUmVjLT5DdXJfQ291bnQgPiAwICkKKyAgICB7CisgICAgICBDVVIuY2FsbFRvcCsrOworICAgICAgQ1VSLklQID0gcFJlYy0+Q3VyX1Jlc3RhcnQ7CisgICAgfQorICAgIGVsc2UKKyAgICAgIC8qIExvb3AgdGhyb3VnaCB0aGUgY3VycmVudCBmdW5jdGlvbiAqLworICAgICAgSU5TX0dvdG9fQ29kZVJhbmdlKCBwUmVjLT5DYWxsZXJfUmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBSZWMtPkNhbGxlcl9JUCApOworCisgICAgLyogRXhpdCB0aGUgY3VycmVudCBjYWxsIGZyYW1lLiAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICAgIC8qIE5PVEU6IFdoZW4gdGhlIGxhc3QgaW50cnVjdGlvbiBvZiBhIHByb2dyYW0gICAgICAgICovCisgICAgLyogICAgICAgaXMgYSBDQUxMIG9yIExPT1BDQUxMLCB0aGUgcmV0dXJuIGFkZHJlc3MgICAgKi8KKyAgICAvKiAgICAgICBpcyBhbHdheXMgb3V0IG9mIHRoZSBjb2RlIHJhbmdlLiAgVGhpcyBpcyAgICAqLworICAgIC8qICAgICAgIGEgdmFsaWQgYWRkcmVzcywgYW5kIGl0J3Mgd2h5IHdlIGRvIG5vdCB0ZXN0ICovCisgICAgLyogICAgICAgdGhlIHJlc3VsdCBvZiBJbnNfR290b19Db2RlUmFuZ2UoKSBoZXJlISAgICAgKi8KKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBDQUxMW106ICAgICAgIENBTEwgZnVuY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogT3Bjb2RlIHJhbmdlOiAweDJCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFN0YWNrOiAgICAgICAgdWludDMyPyAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgc3RhdGljCisgIHZvaWQgIEluc19DQUxMKCBJTlNfQVJHICkKKyAgeworICAgIFRUX1VMb25nICAgICAgIEY7CisgICAgVFRfQ2FsbFJlYyogICAgcENyZWM7CisgICAgVFRfRGVmUmVjb3JkKiAgZGVmOworCisgICAgLyogZmlyc3Qgb2YgYWxsLCBjaGVjayB0aGUgaW5kZXggKi8KKyAgICBGID0gYXJnc1swXTsKKyAgICBpZiAoIEJPVU5EUyggRiwgQ1VSLm1heEZ1bmMrMSApICkgZ290byBGYWlsOworICAgIAorICAgIC8qIEV4Y2VwdCBmb3Igc29tZSBvbGQgQXBwbGUgZm9udHMsIGFsbCBmdW5jdGlvbnMgaW4gYSBUcnVlVHlwZSAqLworICAgIC8qIGZvbnQgYXJlIGRlZmluZWQgaW4gaW5jcmVhc2luZyBvcmRlciwgc3RhcnRpbmcgZnJvbSAwLiBUaGlzICAqLworICAgIC8qIG1lYW5zIHRoYXQgd2Ugbm9ybWFsbHkgaGF2ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICAgIENVUi5tYXhGdW5jKzEgPT0gQ1VSLm51bUZEZWZzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICAgIENVUi5GRGVmc1tuXS5vcGMgPT0gbiBmb3IgbiBpbiAwLi5DVVIubWF4RnVuYyAgICAgICAgICAgICAqLworICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qIElmIHRoaXMgaXNuJ3QgdHJ1ZSwgd2UgbmVlZCB0byBsb29rIHVwIHRoZSBmdW5jdGlvbiB0YWJsZS4gICAqLworCisgICAgZGVmID0gQ1VSLkZEZWZzICsgRjsKKyAgICBpZiAoIENVUi5tYXhGdW5jKzEgIT0gQ1VSLm51bUZEZWZzICB8fCBkZWYtPm9wYyAhPSBGICkKKyAgICB7CisgICAgICAvKiBsb29rIHVwIHRoZSBGRGVmcyB0YWJsZSAqLworICAgICAgVFRfRGVmUmVjb3JkKiAgbGltaXQ7CisgICAgICAKKyAgICAgIGRlZiAgID0gQ1VSLkZEZWZzOworICAgICAgbGltaXQgPSBkZWYgKyBDVVIubnVtRkRlZnM7CisgICAgICAKKyAgICAgIHdoaWxlIChkZWYgPCBsaW1pdCAmJiBkZWYtPm9wYyAhPSBGKQorICAgICAgICBkZWYrKzsKKyAgICAgICAgCisgICAgICBpZiAoZGVmID09IGxpbWl0KSBnb3RvIEZhaWw7CisgICAgfQorICAgIAorICAgIC8qIGNoZWNrIHRoYXQgdGhlIGZ1bmN0aW9uIGlzIGFjdGl2ZSAqLworICAgIGlmICghZGVmLT5hY3RpdmUpCisgICAgICBnb3RvIEZhaWw7CisgICAgICAKKyAgICAvKiBjaGVjayB0aGUgY2FsbCBzdGFjayAqLworICAgIGlmICggQ1VSLmNhbGxUb3AgPj0gQ1VSLmNhbGxTaXplICkKKyAgICB7CisgICAgICBDVVIuZXJyb3IgPSBUVF9FcnJfU3RhY2tfT3ZlcmZsb3c7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgcENyZWMgPSBDVVIuY2FsbFN0YWNrICsgQ1VSLmNhbGxUb3A7CisKKyAgICBwQ3JlYy0+Q2FsbGVyX1JhbmdlID0gQ1VSLmN1clJhbmdlOworICAgIHBDcmVjLT5DYWxsZXJfSVAgICAgPSBDVVIuSVAgKyAxOworICAgIHBDcmVjLT5DdXJfQ291bnQgICAgPSAxOworICAgIHBDcmVjLT5DdXJfUmVzdGFydCAgPSBkZWYtPnN0YXJ0OworCisgICAgQ1VSLmNhbGxUb3ArKzsKKworICAgIElOU19Hb3RvX0NvZGVSYW5nZSggZGVmLT5yYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZi0+c3RhcnQgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIENVUi5zdGVwX2lucyA9IEZBTFNFOworICAgIHJldHVybjsKKyAgICAKKyAgRmFpbDoKKyAgICBDVVIuZXJyb3IgPSBUVF9FcnJfSW52YWxpZF9SZWZlcmVuY2U7CisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogTE9PUENBTExbXTogICBMT09QIGFuZCBDQUxMIGZ1bmN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIE9wY29kZSByYW5nZTogMHgyQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBTdGFjazogICAgICAgIHVpbnQzMj8gRWludDE2PyAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0YXRpYworICB2b2lkICBJbnNfTE9PUENBTEwoIElOU19BUkcgKQorICB7CisgICAgVFRfVUxvbmcgICAgICAgRjsKKyAgICBUVF9DYWxsUmVjKiAgICBwQ3JlYzsKKyAgICBUVF9EZWZSZWNvcmQqICBkZWY7CisKKyAgICAvKiBmaXJzdCBvZiBhbGwsIGNoZWNrIHRoZSBpbmRleCAqLworICAgIEYgPSBhcmdzWzFdOworICAgIGlmICggQk9VTkRTKCBGLCBDVVIubWF4RnVuYysxICkgKSBnb3RvIEZhaWw7CisgICAgCisgICAgLyogRXhjZXB0IGZvciBzb21lIG9sZCBBcHBsZSBmb250cywgYWxsIGZ1bmN0aW9ucyBpbiBhIFRydWVUeXBlICovCisgICAgLyogZm9udCBhcmUgZGVmaW5lZCBpbiBpbmNyZWFzaW5nIG9yZGVyLCBzdGFydGluZyBmcm9tIDAuIFRoaXMgICovCisgICAgLyogbWVhbnMgdGhhdCB3ZSBub3JtYWxseSBoYXZlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogICAgQ1VSLm1heEZ1bmMrMSA9PSBDVVIubnVtRkRlZnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogICAgQ1VSLkZEZWZzW25dLm9wYyA9PSBuIGZvciBuIGluIDAuLkNVUi5tYXhGdW5jICAgICAgICAgICAgICovCisgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogSWYgdGhpcyBpc24ndCB0cnVlLCB3ZSBuZWVkIHRvIGxvb2sgdXAgdGhlIGZ1bmN0aW9uIHRhYmxlLiAgICovCisKKyAgICBkZWYgPSBDVVIuRkRlZnMgKyBGOworICAgIGlmICggQ1VSLm1heEZ1bmMrMSAhPSBDVVIubnVtRkRlZnMgIHx8IGRlZi0+b3BjICE9IEYgKQorICAgIHsKKyAgICAgIC8qIGxvb2sgdXAgdGhlIEZEZWZzIHRhYmxlICovCisgICAgICBUVF9EZWZSZWNvcmQqICBsaW1pdDsKKyAgICAgIAorICAgICAgZGVmICAgPSBDVVIuRkRlZnM7CisgICAgICBsaW1pdCA9IGRlZiArIENVUi5udW1GRGVmczsKKyAgICAgIAorICAgICAgd2hpbGUgKGRlZiA8IGxpbWl0ICYmIGRlZi0+b3BjICE9IEYpCisgICAgICAgIGRlZisrOworICAgICAgICAKKyAgICAgIGlmIChkZWYgPT0gbGltaXQpIGdvdG8gRmFpbDsKKyAgICB9CisgICAgCisgICAgLyogY2hlY2sgdGhhdCB0aGUgZnVuY3Rpb24gaXMgYWN0aXZlICovCisgICAgaWYgKCFkZWYtPmFjdGl2ZSkKKyAgICAgIGdvdG8gRmFpbDsKKworICAgIC8qIGNoZWNrIHN0YWNrICovICAgICAgCisgICAgaWYgKCBDVVIuY2FsbFRvcCA+PSBDVVIuY2FsbFNpemUgKQorICAgIHsKKyAgICAgIENVUi5lcnJvciA9IFRUX0Vycl9TdGFja19PdmVyZmxvdzsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoIGFyZ3NbMF0gPiAwICkKKyAgICB7CisgICAgICBwQ3JlYyA9IENVUi5jYWxsU3RhY2sgKyBDVVIuY2FsbFRvcDsKKworICAgICAgcENyZWMtPkNhbGxlcl9SYW5nZSA9IENVUi5jdXJSYW5nZTsKKyAgICAgIHBDcmVjLT5DYWxsZXJfSVAgICAgPSBDVVIuSVAgKyAxOworICAgICAgcENyZWMtPkN1cl9Db3VudCAgICA9IChUVF9JbnQpKGFyZ3NbMF0pOworICAgICAgcENyZWMtPkN1cl9SZXN0YXJ0ICA9IGRlZi0+c3RhcnQ7CisKKyAgICAgIENVUi5jYWxsVG9wKys7CisKKyAgICAgIElOU19Hb3RvX0NvZGVSYW5nZSggZGVmLT5yYW5nZSwgZGVmLT5zdGFydCApOworCisgICAgICBDVVIuc3RlcF9pbnMgPSBGQUxTRTsKKyAgICB9CisgICAgcmV0dXJuOworCisgIEZhaWw6CisgICAgQ1VSLmVycm9yID0gVFRfRXJyX0ludmFsaWRfUmVmZXJlbmNlOworICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIElERUZbXTogICAgICAgSW5zdHJ1Y3Rpb24gREVGaW5pdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBPcGNvZGUgcmFuZ2U6IDB4ODkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogU3RhY2s6ICAgICAgICBFaW50OCAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBzdGF0aWMKKyAgdm9pZCBJbnNfSURFRiggSU5TX0FSRyApCisgIHsKKyAgICBUVF9EZWZSZWNvcmQqICBkZWY7CisgICAgVFRfRGVmUmVjb3JkKiAgbGltaXQ7CisKKyAgICAvKiAgRmlyc3Qgb2YgYWxsLCBsb29rIGZvciB0aGUgc2FtZSBmdW5jdGlvbiBpbiBvdXIgdGFibGUgKi8KKyAgICBkZWYgICA9IENVUi5JRGVmczsKKyAgICBsaW1pdCA9IGRlZiArIENVUi5udW1JRGVmczsKKyAgICBmb3IgKCA7IGRlZiA8IGxpbWl0OyBkZWYrKyApCisgICAgICBpZiAoZGVmLT5vcGMgPT0gKFRUX1VMb25nKWFyZ3NbMF0gKQorICAgICAgICBicmVhazsKKyAgICAgICAgCisgICAgaWYgKCBkZWYgPT0gbGltaXQgKQorICAgIHsKKyAgICAgIC8qIGNoZWNrIHRoYXQgdGhlcmUgaXMgZW5vdWdoIHJvb20gZm9yIGEgbmV3IGluc3RydWN0aW9uICovCisgICAgICBpZiAoIENVUi5udW1JRGVmcyA+PSBDVVIubWF4SURlZnMgKQorICAgICAgeworICAgICAgICBDVVIuZXJyb3IgPSBUVF9FcnJfVG9vX01hbnlfSW5zdHJ1Y3Rpb25fRGVmczsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgQ1VSLm51bUlEZWZzKys7CisgICAgfQorICAgIAorICAgIGRlZi0+b3BjICAgID0gYXJnc1swXTsKKyAgICBkZWYtPnN0YXJ0ICA9IENVUi5JUCsxOworICAgIGRlZi0+cmFuZ2UgID0gQ1VSLmN1clJhbmdlOworICAgIGRlZi0+YWN0aXZlID0gVFJVRTsKKyAgICAKKyAgICBpZiAoIChUVF9VTG9uZylhcmdzWzBdID4gQ1VSLm1heElucyApCisgICAgICBDVVIubWF4SW5zID0gYXJnc1swXTsKKyAgICAKKyAgICAvKiBOb3cgc2tpcCB0aGUgd2hvbGUgZnVuY3Rpb24gZGVmaW5pdGlvbi4gKi8KKyAgICAvKiBXZSBkb24ndCBhbGxvdyBuZXN0ZWQgSURFRnMgJiBGREVGcy4gICAgKi8KKworICAgIHdoaWxlICggU0tJUF9Db2RlKCkgPT0gU1VDQ0VTUyApCisgICAgeworICAgICAgc3dpdGNoICggQ1VSLm9wY29kZSApCisgICAgICB7CisgICAgICBjYXNlIDB4ODk6ICAgLyogSURFRiAqLworICAgICAgY2FzZSAweDJDOiAgIC8qIEZERUYgKi8KKyAgICAgICAgQ1VSLmVycm9yID0gVFRfRXJyX05lc3RlZF9ERUZTOworICAgICAgICByZXR1cm47CisgICAgICBjYXNlIDB4MkQ6ICAgLyogRU5ERiAqLworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgfQorICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFBVU0hJTkcgREFUQSBPTlRPIFRIRSBJTlRFUlBSRVRFUiBTVEFDSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogIEluc3RydWN0aW9ucyBhcHBlYXIgaW4gdGhlIHNwZWNzJyBvcmRlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogTlBVU0hCW106ICAgICBQVVNIIE4gQnl0ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIE9wY29kZSByYW5nZTogMHg0MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBTdGFjazogICAgICAgIC0tPiB1aW50MzIuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0YXRpYworICB2b2lkICBJbnNfTlBVU0hCKCBJTlNfQVJHICkKKyAgeworICAgIFRUX1VTaG9ydCAgTCwgSzsKKworCisgICAgTCA9IChUVF9VU2hvcnQpQ1VSLmNvZGVbQ1VSLklQICsgMV07CisKKyAgICBpZiAoIEJPVU5EUyggTCwgQ1VSLnN0YWNrU2l6ZSArIDEgLSBDVVIudG9wICkgKQorICAgIHsKKyAgICAgIENVUi5lcnJvciA9IFRUX0Vycl9TdGFja19PdmVyZmxvdzsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBmb3IgKCBLID0gMTsgSyA8PSBMOyBLKysgKQorICAgICAgYXJnc1tLIC0gMV0gPSBDVVIuY29kZVtDVVIuSVAgKyBLICsgMV07CisKKyAgICBDVVIubmV3X3RvcCArPSBMOworICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIE5QVVNIV1tdOiAgICAgUFVTSCBOIFdvcmRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBPcGNvZGUgcmFuZ2U6IDB4NDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogU3RhY2s6ICAgICAgICAtLT4gaW50MzIuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBzdGF0aWMKKyAgdm9pZCAgSW5zX05QVVNIVyggSU5TX0FSRyApCisgIHsKKyAgICBUVF9VU2hvcnQgIEwsIEs7CisKKworICAgIEwgPSAoVFRfVVNob3J0KUNVUi5jb2RlW0NVUi5JUCArIDFdOworCisgICAgaWYgKCBCT1VORFMoIEwsIENVUi5zdGFja1NpemUgKyAxIC0gQ1VSLnRvcCApICkKKyAgICB7CisgICAgICBDVVIuZXJyb3IgPSBUVF9FcnJfU3RhY2tfT3ZlcmZsb3c7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgQ1VSLklQICs9IDI7CisKKyAgICBmb3IgKCBLID0gMDsgSyA8IEw7IEsrKyApCisgICAgICBhcmdzW0tdID0gR0VUX1Nob3J0SW5zKCk7CisKKyAgICBDVVIuc3RlcF9pbnMgPSBGQUxTRTsKKyAgICBDVVIubmV3X3RvcCArPSBMOworICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFBVU0hCW2FiY106ICAgUFVTSCBCeXRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBPcGNvZGUgcmFuZ2U6IDB4QjAtMHhCNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogU3RhY2s6ICAgICAgICAtLT4gdWludDMyLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBzdGF0aWMKKyAgdm9pZCAgSW5zX1BVU0hCKCBJTlNfQVJHICkKKyAgeworICAgIFRUX1VTaG9ydCAgTCwgSzsKKworCisgICAgTCA9IChUVF9VU2hvcnQpQ1VSLm9wY29kZSAtIDB4QjAgKyAxOworCisgICAgaWYgKCBCT1VORFMoIEwsIENVUi5zdGFja1NpemUgKyAxIC0gQ1VSLnRvcCApICkKKyAgICB7CisgICAgICBDVVIuZXJyb3IgPSBUVF9FcnJfU3RhY2tfT3ZlcmZsb3c7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgZm9yICggSyA9IDE7IEsgPD0gTDsgSysrICkKKyAgICAgIGFyZ3NbSyAtIDFdID0gQ1VSLmNvZGVbQ1VSLklQICsgS107CisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogUFVTSFdbYWJjXTogICBQVVNIIFdvcmRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIE9wY29kZSByYW5nZTogMHhCOC0weEJGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBTdGFjazogICAgICAgIC0tPiBpbnQzMi4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0YXRpYworICB2b2lkICBJbnNfUFVTSFcoIElOU19BUkcgKQorICB7CisgICAgVFRfVVNob3J0ICBMLCBLOworCisKKyAgICBMID0gKFRUX1VTaG9ydClDVVIub3Bjb2RlIC0gMHhCOCArIDE7CisKKyAgICBpZiAoIEJPVU5EUyggTCwgQ1VSLnN0YWNrU2l6ZSArIDEgLSBDVVIudG9wICkgKQorICAgIHsKKyAgICAgIENVUi5lcnJvciA9IFRUX0Vycl9TdGFja19PdmVyZmxvdzsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBDVVIuSVArKzsKKworICAgIGZvciAoIEsgPSAwOyBLIDwgTDsgSysrICkKKyAgICAgIGFyZ3NbS10gPSBHRVRfU2hvcnRJbnMoKTsKKworICAgIENVUi5zdGVwX2lucyA9IEZBTFNFOworICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIE1BTkFHSU5HIFRIRSBHUkFQSElDUyBTVEFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogIEluc3RydWN0aW9ucyBhcHBlYXIgaW4gdGhlIHNwZWNzJyBvcmRlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogR0NbYV06ICAgICAgICBHZXQgQ29vcmRpbmF0ZSBwcm9qZWN0ZWQgb250byAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIE9wY29kZSByYW5nZTogMHg0Ni0weDQ3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBTdGFjazogICAgICAgIHVpbnQzMiAtLT4gZjI2LjYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIEJVTExTSElUOiBNZWFzdXJlcyBmcm9tIHRoZSBvcmlnaW5hbCBnbHlwaCBtdXN0IGJlIHRha2VuIGFsb25nIHRoZSAgICAqLworICAvKiAgICAgICAgICAgZHVhbCBwcm9qZWN0aW9uIHZlY3RvciEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0YXRpYyB2b2lkICBJbnNfR0MoIElOU19BUkcgKQorICB7CisgICAgVFRfVUxvbmcgICAgTDsKKyAgICBUVF9GMjZEb3Q2ICBSOworCisKKyAgICBMID0gKFRUX1VMb25nKWFyZ3NbMF07CisKKyAgICBpZiAoIEJPVU5EUyggTCwgQ1VSLnpwMi5uX3BvaW50cyApICkKKyAgICB7CisgICAgICBpZiAoIENVUi5wZWRhbnRpY19oaW50aW5nICkKKyAgICAgIHsKKyAgICAgICAgQ1VSLmVycm9yID0gVFRfRXJyX0ludmFsaWRfUmVmZXJlbmNlOworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIFIgPSAwOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaWYgKCBDVVIub3Bjb2RlICYgMSApCisgICAgICAgIFIgPSBDVVJfRnVuY19kdWFscHJvaiggQ1VSLnpwMi5vcmcgKyBMLCBOVUxMX1ZlY3RvciApOworICAgICAgZWxzZQorICAgICAgICBSID0gQ1VSX0Z1bmNfcHJvamVjdCggQ1VSLnpwMi5jdXIgKyBMLCBOVUxMX1ZlY3RvciApOworICAgIH0KKworICAgIGFyZ3NbMF0gPSBSOworICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFNDRlNbXTogICAgICAgU2V0IENvb3JkaW5hdGUgRnJvbSBTdGFjayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBPcGNvZGUgcmFuZ2U6IDB4NDggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogU3RhY2s6ICAgICAgICBmMjYuNiB1aW50MzIgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBGb3JtdWxhOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgT0EgOj0gT0EgKyAoIHZhbHVlIC0gT0EucCApLyggZi5wICkgKiBmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgc3RhdGljCisgIHZvaWQgIEluc19TQ0ZTKCBJTlNfQVJHICkKKyAgeworICAgIFRUX0xvbmcgICAgSzsKKyAgICBUVF9VU2hvcnQgIEw7CisKKworICAgIEwgPSAoVFRfVVNob3J0KWFyZ3NbMF07CisKKyAgICBpZiAoIEJPVU5EUyggTCwgQ1VSLnpwMi5uX3BvaW50cyApICkKKyAgICB7CisgICAgICBpZiAoIENVUi5wZWRhbnRpY19oaW50aW5nICkKKyAgICAgICAgQ1VSLmVycm9yID0gVFRfRXJyX0ludmFsaWRfUmVmZXJlbmNlOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEsgPSBDVVJfRnVuY19wcm9qZWN0KCBDVVIuenAyLmN1ciArIEwsIE5VTExfVmVjdG9yICk7CisKKyAgICBDVVJfRnVuY19tb3ZlKCAmQ1VSLnpwMiwgTCwgYXJnc1sxXSAtIEsgKTsKKworICAgIC8qIG5vdCBwYXJ0IG9mIHRoZSBzcGVjcywgYnV0IGhlcmUgZm9yIHNhZmV0eSAqLworCisgICAgaWYgKCBDVVIuR1MuZ2VwMiA9PSAwICkKKyAgICAgIENVUi56cDIub3JnW0xdID0gQ1VSLnpwMi5jdXJbTF07CisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogTURbYV06ICAgICAgICBNZWFzdXJlIERpc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIE9wY29kZSByYW5nZTogMHg0OS0weDRBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBTdGFjazogICAgICAgIHVpbnQzMiB1aW50MzIgLS0+IGYyNi42ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIEJVTExTSElUOiBNZWFzdXJlIHRha2VuIGluIHRoZSBvcmlnaW5hbCBnbHlwaCBtdXN0IGJlIGFsb25nIHRoZSBkdWFsICAqLworICAvKiAgICAgICAgICAgcHJvamVjdGlvbiB2ZWN0b3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFNlY29uZCBCVUxMU0hJVDogRmxhZyBhdHRyaWJ1dGVzIGFyZSBpbnZlcnRlZCEgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgIDAgPT4gbWVhc3VyZSBkaXN0YW5jZSBpbiBvcmlnaW5hbCBvdXRsaW5lICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAxID0+IG1lYXN1cmUgZGlzdGFuY2UgaW4gZ3JpZC1maXR0ZWQgb3V0bGluZSAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBUaGlyZCBvbmU6IGB6cDAgLSB6cDEnLCBhbmQgbm90IGB6cDIgLSB6cDEhICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0YXRpYworICB2b2lkICBJbnNfTUQoIElOU19BUkcgKQorICB7CisgICAgVFRfVVNob3J0ICAgSywgTDsKKyAgICBUVF9GMjZEb3Q2ICBEOworCisKKyAgICBLID0gKFRUX1VTaG9ydClhcmdzWzFdOworICAgIEwgPSAoVFRfVVNob3J0KWFyZ3NbMF07CisKKyAgICBpZiggQk9VTkRTKCBMLCBDVVIuenAwLm5fcG9pbnRzICkgfHwKKyAgICAgICAgQk9VTkRTKCBLLCBDVVIuenAxLm5fcG9pbnRzICkgKQorICAgIHsKKyAgICAgIGlmICggQ1VSLnBlZGFudGljX2hpbnRpbmcgKQorICAgICAgeworICAgICAgICBDVVIuZXJyb3IgPSBUVF9FcnJfSW52YWxpZF9SZWZlcmVuY2U7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIEQgPSAwOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaWYgKCBDVVIub3Bjb2RlICYgMSApCisgICAgICAgIEQgPSBDVVJfRnVuY19wcm9qZWN0KCBDVVIuenAwLmN1ciArIEwsIENVUi56cDEuY3VyICsgSyApOworICAgICAgZWxzZQorICAgICAgICBEID0gQ1VSX0Z1bmNfZHVhbHByb2ooIENVUi56cDAub3JnICsgTCwgQ1VSLnpwMS5vcmcgKyBLICk7CisgICAgfQorCisgICAgYXJnc1swXSA9IEQ7CisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogU0RQVlRMW2FdOiAgICBTZXQgRHVhbCBQVmVjdG9yIHRvIExpbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIE9wY29kZSByYW5nZTogMHg4Ni0weDg3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBTdGFjazogICAgICAgIHVpbnQzMiB1aW50MzIgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0YXRpYworICB2b2lkICBJbnNfU0RQVlRMKCBJTlNfQVJHICkKKyAgeworICAgIFRUX0xvbmcgICAgQSwgQiwgQzsKKyAgICBUVF9VU2hvcnQgIHAxLCBwMjsgICAvKiB3YXMgVFRfSW50IGluIHBhcyB0eXBlIEVSUk9SICovCisKKworICAgIHAxID0gKFRUX1VTaG9ydClhcmdzWzFdOworICAgIHAyID0gKFRUX1VTaG9ydClhcmdzWzBdOworCisgICAgaWYgKCBCT1VORFMoIHAyLCBDVVIuenAxLm5fcG9pbnRzICkgfHwKKyAgICAgICAgIEJPVU5EUyggcDEsIENVUi56cDIubl9wb2ludHMgKSApCisgICAgeworICAgICAgaWYgKCBDVVIucGVkYW50aWNfaGludGluZyApCisgICAgICAgIENVUi5lcnJvciA9IFRUX0Vycl9JbnZhbGlkX1JlZmVyZW5jZTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB7CisgICAgICBUVF9WZWN0b3IqIHYxID0gQ1VSLnpwMS5vcmcgKyBwMjsKKyAgICAgIFRUX1ZlY3RvciogdjIgPSBDVVIuenAyLm9yZyArIHAxOworCisKKyAgICAgIEEgPSB2MS0+eCAtIHYyLT54OworICAgICAgQiA9IHYxLT55IC0gdjItPnk7CisgICAgfQorCisgICAgaWYgKCAoQ1VSLm9wY29kZSAmIDEpICE9IDAgKQorICAgIHsKKyAgICAgIEMgPSAgQjsgICAvKiBDb3VudGVyQ2xvY2t3aXNlIHJvdGF0aW9uICovCisgICAgICBCID0gIEE7CisgICAgICBBID0gLUM7CisgICAgfQorCisgICAgTk9STWFsaXplKCBBLCBCLCAmQ1VSLkdTLmR1YWxWZWN0b3IgKTsKKworICAgIHsKKyAgICAgIFRUX1ZlY3RvciogIHYxID0gQ1VSLnpwMS5jdXIgKyBwMjsKKyAgICAgIFRUX1ZlY3RvciogIHYyID0gQ1VSLnpwMi5jdXIgKyBwMTsKKworCisgICAgICBBID0gdjEtPnggLSB2Mi0+eDsKKyAgICAgIEIgPSB2MS0+eSAtIHYyLT55OworICAgIH0KKworICAgIGlmICggKENVUi5vcGNvZGUgJiAxKSAhPSAwICkKKyAgICB7CisgICAgICBDID0gIEI7ICAgLyogQ291bnRlckNsb2Nrd2lzZSByb3RhdGlvbiAqLworICAgICAgQiA9ICBBOworICAgICAgQSA9IC1DOworICAgIH0KKworICAgIE5PUk1hbGl6ZSggQSwgQiwgJkNVUi5HUy5wcm9qVmVjdG9yICk7CisKKyAgICBDT01QVVRFX0Z1bmNzKCk7CisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogU1pQMFtdOiAgICAgICBTZXQgWm9uZSBQb2ludGVyIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIE9wY29kZSByYW5nZTogMHgxMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBTdGFjazogICAgICAgIHVpbnQzMiAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0YXRpYworICB2b2lkICBJbnNfU1pQMCggSU5TX0FSRyApCisgIHsKKyAgICBzd2l0Y2ggKCAoVFRfSW50KWFyZ3NbMF0gKQorICAgIHsKKyAgICBjYXNlIDA6CisgICAgICBDVVIuenAwID0gQ1VSLnR3aWxpZ2h0OworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIDE6CisgICAgICBDVVIuenAwID0gQ1VSLnB0czsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIGlmICggQ1VSLnBlZGFudGljX2hpbnRpbmcgKQorICAgICAgICBDVVIuZXJyb3IgPSBUVF9FcnJfSW52YWxpZF9SZWZlcmVuY2U7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgQ1VSLkdTLmdlcDAgPSAoVFRfVVNob3J0KShhcmdzWzBdKTsKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBTWlAxW106ICAgICAgIFNldCBab25lIFBvaW50ZXIgMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogT3Bjb2RlIHJhbmdlOiAweDE0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFN0YWNrOiAgICAgICAgdWludDMyIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgc3RhdGljCisgIHZvaWQgIEluc19TWlAxKCBJTlNfQVJHICkKKyAgeworICAgIHN3aXRjaCAoIChUVF9JbnQpYXJnc1swXSApCisgICAgeworICAgIGNhc2UgMDoKKyAgICAgIENVUi56cDEgPSBDVVIudHdpbGlnaHQ7CisgICAgICBicmVhazsKKworICAgIGNhc2UgMToKKyAgICAgIENVUi56cDEgPSBDVVIucHRzOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgaWYgKCBDVVIucGVkYW50aWNfaGludGluZyApCisgICAgICAgIENVUi5lcnJvciA9IFRUX0Vycl9JbnZhbGlkX1JlZmVyZW5jZTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBDVVIuR1MuZ2VwMSA9IChUVF9VU2hvcnQpKGFyZ3NbMF0pOworICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFNaUDJbXTogICAgICAgU2V0IFpvbmUgUG9pbnRlciAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBPcGNvZGUgcmFuZ2U6IDB4MTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogU3RhY2s6ICAgICAgICB1aW50MzIgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBzdGF0aWMKKyAgdm9pZCAgSW5zX1NaUDIoIElOU19BUkcgKQorICB7CisgICAgc3dpdGNoICggKFRUX0ludClhcmdzWzBdICkKKyAgICB7CisgICAgY2FzZSAwOgorICAgICAgQ1VSLnpwMiA9IENVUi50d2lsaWdodDsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAxOgorICAgICAgQ1VSLnpwMiA9IENVUi5wdHM7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBpZiAoIENVUi5wZWRhbnRpY19oaW50aW5nICkKKyAgICAgICAgQ1VSLmVycm9yID0gVFRfRXJyX0ludmFsaWRfUmVmZXJlbmNlOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIENVUi5HUy5nZXAyID0gKFRUX1VTaG9ydCkoYXJnc1swXSk7CisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogU1pQU1tdOiAgICAgICBTZXQgWm9uZSBQb2ludGVyUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIE9wY29kZSByYW5nZTogMHgxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBTdGFjazogICAgICAgIHVpbnQzMiAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0YXRpYworICB2b2lkICBJbnNfU1pQUyggSU5TX0FSRyApCisgIHsKKyAgICBzd2l0Y2ggKCAoVFRfSW50KWFyZ3NbMF0gKQorICAgIHsKKyAgICBjYXNlIDA6CisgICAgICBDVVIuenAwID0gQ1VSLnR3aWxpZ2h0OworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIDE6CisgICAgICBDVVIuenAwID0gQ1VSLnB0czsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIGlmICggQ1VSLnBlZGFudGljX2hpbnRpbmcgKQorICAgICAgICBDVVIuZXJyb3IgPSBUVF9FcnJfSW52YWxpZF9SZWZlcmVuY2U7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgQ1VSLnpwMSA9IENVUi56cDA7CisgICAgQ1VSLnpwMiA9IENVUi56cDA7CisKKyAgICBDVVIuR1MuZ2VwMCA9IChUVF9VU2hvcnQpKGFyZ3NbMF0pOworICAgIENVUi5HUy5nZXAxID0gKFRUX1VTaG9ydCkoYXJnc1swXSk7CisgICAgQ1VSLkdTLmdlcDIgPSAoVFRfVVNob3J0KShhcmdzWzBdKTsKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBJTlNUQ1RSTFtdOiAgIElOU1RydWN0aW9uIENvblRSb0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogT3Bjb2RlIHJhbmdlOiAweDhlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFN0YWNrOiAgICAgICAgaW50MzIgaW50MzIgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgc3RhdGljCisgIHZvaWQgIEluc19JTlNUQ1RSTCggSU5TX0FSRyApCisgIHsKKyAgICBUVF9Mb25nICBLLCBMOworCisKKyAgICBLID0gYXJnc1sxXTsKKyAgICBMID0gYXJnc1swXTsKKworICAgIGlmICggSyA8IDEgfHwgSyA+IDIgKQorICAgIHsKKyAgICAgIGlmICggQ1VSLnBlZGFudGljX2hpbnRpbmcgKQorICAgICAgICBDVVIuZXJyb3IgPSBUVF9FcnJfSW52YWxpZF9SZWZlcmVuY2U7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCBMICE9IDAgKQorICAgICAgICBMID0gSzsKKworICAgIENVUi5HUy5pbnN0cnVjdF9jb250cm9sID0KKyAgICAgIChUVF9CeXRlKSggQ1VSLkdTLmluc3RydWN0X2NvbnRyb2wgJiB+KFRUX0J5dGUpSyApIHwgKFRUX0J5dGUpTDsKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBTQ0FOQ1RSTFtdOiAgIFNDQU4gQ29uVFJvTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogT3Bjb2RlIHJhbmdlOiAweDg1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFN0YWNrOiAgICAgICAgdWludDMyPyAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgc3RhdGljCisgIHZvaWQgIEluc19TQ0FOQ1RSTCggSU5TX0FSRyApCisgIHsKKyAgICBUVF9JbnQgIEE7CisKKworICAgIC8qIEdldCBUaHJlc2hvbGQgKi8KKyAgICBBID0gKFRUX0ludCkoYXJnc1swXSAmIDB4RkYpOworCisgICAgaWYgKCBBID09IDB4RkYgKQorICAgIHsKKyAgICAgIENVUi5HUy5zY2FuX2NvbnRyb2wgPSBUUlVFOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBlbHNlIGlmICggQSA9PSAwICkKKyAgICB7CisgICAgICBDVVIuR1Muc2Nhbl9jb250cm9sID0gRkFMU0U7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgQSAqPSA2NDsKKworICAgIC8qCisgICAgaWYgKCAoYXJnc1swXSAmIDB4MTAwKSAhPSAwICYmIENVUi5tZXRyaWNzLnBvaW50U2l6ZSA8PSBBICkKKyAgICAgIENVUi5HUy5zY2FuX2NvbnRyb2wgPSBUUlVFOworICAgICovCisKKyAgICBpZiAoIChhcmdzWzBdICYgMHgyMDApICE9IDAgJiYgQ1VSLnR0X21ldHJpY3Mucm90YXRlZCApCisgICAgICBDVVIuR1Muc2Nhbl9jb250cm9sID0gVFJVRTsKKworICAgIGlmICggKGFyZ3NbMF0gJiAweDQwMCkgIT0gMCAmJiBDVVIudHRfbWV0cmljcy5zdHJldGNoZWQgKQorICAgICAgQ1VSLkdTLnNjYW5fY29udHJvbCA9IFRSVUU7CisKKyAgICAvKgorICAgIGlmICggKGFyZ3NbMF0gJiAweDgwMCkgIT0gMCAmJiBDVVIubWV0cmljcy5wb2ludFNpemUgPiBBICkKKyAgICAgIENVUi5HUy5zY2FuX2NvbnRyb2wgPSBGQUxTRTsKKyAgICAqLworCisgICAgaWYgKCAoYXJnc1swXSAmIDB4MTAwMCkgIT0gMCAmJiBDVVIudHRfbWV0cmljcy5yb3RhdGVkICkKKyAgICAgIENVUi5HUy5zY2FuX2NvbnRyb2wgPSBGQUxTRTsKKworICAgIGlmICggKGFyZ3NbMF0gJiAweDIwMDApICE9IDAgJiYgQ1VSLnR0X21ldHJpY3Muc3RyZXRjaGVkICkKKyAgICAgIENVUi5HUy5zY2FuX2NvbnRyb2wgPSBGQUxTRTsKK30KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogU0NBTlRZUEVbXTogICBTQ0FOIFRZUEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIE9wY29kZSByYW5nZTogMHg4RCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBTdGFjazogICAgICAgIHVpbnQzMj8gLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0YXRpYworICB2b2lkICBJbnNfU0NBTlRZUEUoIElOU19BUkcgKQorICB7CisgICAgLyogRm9yIGNvbXBhdGliaWxpdHkgd2l0aCBmdXR1cmUgZW5oYW5jZW1lbnRzLCAqLworICAgIC8qIHdlIG11c3QgaWdub3JlIG5ldyBtb2RlcyAgICAgICAgICAgICAgICAgICAgKi8KKworICAgIGlmICggYXJnc1swXSA+PSAwICYmIGFyZ3NbMF0gPD0gNSApCisgICAgeworICAgICAgaWYgKCBhcmdzWzBdID09IDMgKQorICAgICAgICBhcmdzWzBdID0gMjsKKworICAgICAgQ1VSLkdTLnNjYW5fdHlwZSA9IChUVF9JbnQpYXJnc1swXTsKKyAgICB9CisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogTUFOQUdJTkcgT1VUTElORVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgSW5zdHJ1Y3Rpb25zIGFwcGVhciBpbiB0aGUgc3BlY3MnIG9yZGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBGTElQUFRbXTogICAgIEZMSVAgUG9pblQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogT3Bjb2RlIHJhbmdlOiAweDgwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFN0YWNrOiAgICAgICAgdWludDMyLi4uIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgc3RhdGljCisgIHZvaWQgIEluc19GTElQUFQoIElOU19BUkcgKQorICB7CisgICAgVFRfVVNob3J0ICBwb2ludDsKKworCisgICAgVU5VU0VEX0FSRzsKKworICAgIGlmICggQ1VSLnRvcCA8IENVUi5HUy5sb29wICkKKyAgICB7CisgICAgICBDVVIuZXJyb3IgPSBUVF9FcnJfVG9vX0Zld19Bcmd1bWVudHM7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgd2hpbGUgKCBDVVIuR1MubG9vcCA+IDAgKQorICAgIHsKKyAgICAgIENVUi5hcmdzLS07CisKKyAgICAgIHBvaW50ID0gKFRUX1VTaG9ydClDVVIuc3RhY2tbQ1VSLmFyZ3NdOworCisgICAgICBpZiAoIEJPVU5EUyggcG9pbnQsIENVUi5wdHMubl9wb2ludHMgKSApCisgICAgICB7CisgICAgICAgIGlmICggQ1VSLnBlZGFudGljX2hpbnRpbmcgKQorICAgICAgICB7CisgICAgICAgICAgQ1VSLmVycm9yID0gVFRfRXJyX0ludmFsaWRfUmVmZXJlbmNlOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgICBDVVIucHRzLnRvdWNoW3BvaW50XSBePSBGVF9DdXJ2ZV9UYWdfT247CisKKyAgICAgIENVUi5HUy5sb29wLS07CisgICAgfQorCisgICAgQ1VSLkdTLmxvb3AgPSAxOworICAgIENVUi5uZXdfdG9wID0gQ1VSLmFyZ3M7CisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogRkxJUFJHT05bXTogICBGTElQIFJhbkdlIE9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIE9wY29kZSByYW5nZTogMHg4MSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBTdGFjazogICAgICAgIHVpbnQzMiB1aW50MzIgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0YXRpYworICB2b2lkICBJbnNfRkxJUFJHT04oIElOU19BUkcgKQorICB7CisgICAgVFRfVVNob3J0ICBJLCBLLCBMOworCisKKyAgICBLID0gKFRUX1VTaG9ydClhcmdzWzFdOworICAgIEwgPSAoVFRfVVNob3J0KWFyZ3NbMF07CisKKyAgICBpZiAoIEJPVU5EUyggSywgQ1VSLnB0cy5uX3BvaW50cyApIHx8CisgICAgICAgICBCT1VORFMoIEwsIENVUi5wdHMubl9wb2ludHMgKSApCisgICAgeworICAgICAgaWYgKCBDVVIucGVkYW50aWNfaGludGluZyApCisgICAgICAgIENVUi5lcnJvciA9IFRUX0Vycl9JbnZhbGlkX1JlZmVyZW5jZTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBmb3IgKCBJID0gTDsgSSA8PSBLOyBJKysgKQorICAgICAgQ1VSLnB0cy50b3VjaFtJXSB8PSBGVF9DdXJ2ZV9UYWdfT247CisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogRkxJUFJHT0ZGOiAgICBGTElQIFJhbkdlIE9GRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIE9wY29kZSByYW5nZTogMHg4MiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBTdGFjazogICAgICAgIHVpbnQzMiB1aW50MzIgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0YXRpYworICB2b2lkICBJbnNfRkxJUFJHT0ZGKCBJTlNfQVJHICkKKyAgeworICAgIFRUX1VTaG9ydCAgSSwgSywgTDsKKworCisgICAgSyA9IChUVF9VU2hvcnQpYXJnc1sxXTsKKyAgICBMID0gKFRUX1VTaG9ydClhcmdzWzBdOworCisgICAgaWYgKCBCT1VORFMoIEssIENVUi5wdHMubl9wb2ludHMgKSB8fAorICAgICAgICAgQk9VTkRTKCBMLCBDVVIucHRzLm5fcG9pbnRzICkgKQorICAgIHsKKyAgICAgIGlmICggQ1VSLnBlZGFudGljX2hpbnRpbmcgKQorICAgICAgICBDVVIuZXJyb3IgPSBUVF9FcnJfSW52YWxpZF9SZWZlcmVuY2U7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgZm9yICggSSA9IEw7IEkgPD0gSzsgSSsrICkKKyAgICAgIENVUi5wdHMudG91Y2hbSV0gJj0gfkZUX0N1cnZlX1RhZ19PbjsKKyAgfQorCisKKyAgc3RhdGljCisgIFRUX0Jvb2wgIENvbXB1dGVfUG9pbnRfRGlzcGxhY2VtZW50KCBFWEVDX09QXyBUVF9GMjZEb3Q2KiAgICB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfRjI2RG90NiogICAgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX0dseXBoWm9uZSogIHpvbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9VU2hvcnQqICAgICByZWZwICkKKyAgeworICAgIFRUX0dseXBoWm9uZSAgenA7CisgICAgVFRfVVNob3J0ICAgICBwOworICAgIFRUX0YyNkRvdDYgICAgZDsKKworCisgICAgaWYgKCBDVVIub3Bjb2RlICYgMSApCisgICAgeworICAgICAgenAgPSBDVVIuenAwOworICAgICAgcCAgPSBDVVIuR1MucnAxOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgenAgPSBDVVIuenAxOworICAgICAgcCAgPSBDVVIuR1MucnAyOworICAgIH0KKworICAgIGlmICggQk9VTkRTKCBwLCB6cC5uX3BvaW50cyApICkKKyAgICB7CisgICAgICBpZiAoIENVUi5wZWRhbnRpY19oaW50aW5nICkKKyAgICAgICAgQ1VSLmVycm9yID0gVFRfRXJyX0ludmFsaWRfUmVmZXJlbmNlOworICAgICAgcmV0dXJuIEZBSUxVUkU7CisgICAgfQorCisgICAgKnpvbmUgPSB6cDsKKyAgICAqcmVmcCA9IHA7CisKKyAgICBkID0gQ1VSX0Z1bmNfcHJvamVjdCggenAuY3VyICsgcCwgenAub3JnICsgcCApOworCisgICAgKnggPSBUVF9NVUxESVYoIGQsCisgICAgICAgICAgICAgICAgICAgIChUVF9Mb25nKUNVUi5HUy5mcmVlVmVjdG9yLnggKiAweDEwMDAwTCwKKyAgICAgICAgICAgICAgICAgICAgQ1VSLkZfZG90X1AgKTsKKyAgICAqeSA9IFRUX01VTERJViggZCwKKyAgICAgICAgICAgICAgICAgICAgKFRUX0xvbmcpQ1VSLkdTLmZyZWVWZWN0b3IueSAqIDB4MTAwMDBMLAorICAgICAgICAgICAgICAgICAgICBDVVIuRl9kb3RfUCApOworCisgICAgcmV0dXJuIFNVQ0NFU1M7CisgIH0KKworCisgIHN0YXRpYworICB2b2lkICBNb3ZlX1pwMl9Qb2ludCggRVhFQ19PUF8gVFRfVVNob3J0ICAgcG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9GMjZEb3Q2ICBkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX0YyNkRvdDYgIGR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfQm9vbCAgICAgdG91Y2ggKQorICB7CisgICAgaWYgKCBDVVIuR1MuZnJlZVZlY3Rvci54ICE9IDAgKQorICAgIHsKKyAgICAgIENVUi56cDIuY3VyW3BvaW50XS54ICs9IGR4OworICAgICAgaWYgKCB0b3VjaCApCisgICAgICAgIENVUi56cDIudG91Y2hbcG9pbnRdIHw9IEZUX0N1cnZlX1RhZ19Ub3VjaF9YOworICAgIH0KKworICAgIGlmICggQ1VSLkdTLmZyZWVWZWN0b3IueSAhPSAwICkKKyAgICB7CisgICAgICBDVVIuenAyLmN1cltwb2ludF0ueSArPSBkeTsKKyAgICAgIGlmICggdG91Y2ggKQorICAgICAgICBDVVIuenAyLnRvdWNoW3BvaW50XSB8PSBGVF9DdXJ2ZV9UYWdfVG91Y2hfWTsKKyAgICB9CisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogU0hQW2FdOiAgICAgICBTSGlmdCBQb2ludCBieSB0aGUgbGFzdCBwb2ludCAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIE9wY29kZSByYW5nZTogMHgzMi0weDMzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBTdGFjazogICAgICAgIHVpbnQzMi4uLiAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0YXRpYworICB2b2lkICBJbnNfU0hQKCBJTlNfQVJHICkKKyAgeworICAgIFRUX0dseXBoWm9uZSAgenA7CisgICAgVFRfVVNob3J0ICAgICByZWZwOworCisgICAgVFRfRjI2RG90NiAgICBkeCwKKyAgICAgICAgICAgICAgICAgIGR5OworICAgIFRUX1VTaG9ydCAgICAgcG9pbnQ7CisKKworICAgIFVOVVNFRF9BUkc7CisKKyAgICBpZiAoIENVUi50b3AgPCBDVVIuR1MubG9vcCApCisgICAgeworICAgICAgQ1VSLmVycm9yID0gVFRfRXJyX0ludmFsaWRfUmVmZXJlbmNlOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICggQ09NUFVURV9Qb2ludF9EaXNwbGFjZW1lbnQoICZkeCwgJmR5LCAmenAsICZyZWZwICkgKQorICAgICAgcmV0dXJuOworCisgICAgd2hpbGUgKCBDVVIuR1MubG9vcCA+IDAgKQorICAgIHsKKyAgICAgIENVUi5hcmdzLS07CisgICAgICBwb2ludCA9IChUVF9VU2hvcnQpQ1VSLnN0YWNrW0NVUi5hcmdzXTsKKworICAgICAgaWYgKCBCT1VORFMoIHBvaW50LCBDVVIuenAyLm5fcG9pbnRzICkgKQorICAgICAgeworICAgICAgICBpZiAoIENVUi5wZWRhbnRpY19oaW50aW5nICkKKyAgICAgICAgeworICAgICAgICAgIENVUi5lcnJvciA9IFRUX0Vycl9JbnZhbGlkX1JlZmVyZW5jZTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgLyogWFhYOiBVTkRPQ1VNRU5URUQhIFNIUCB0b3VjaGVzIHRoZSBwb2ludHMgKi8KKyAgICAgICAgTU9WRV9acDJfUG9pbnQoIHBvaW50LCBkeCwgZHksIFRSVUUgKTsKKworICAgICAgQ1VSLkdTLmxvb3AtLTsKKyAgICB9CisKKyAgICBDVVIuR1MubG9vcCA9IDE7CisgICAgQ1VSLm5ld190b3AgPSBDVVIuYXJnczsKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBTSENbYV06ICAgICAgIFNIaWZ0IENvbnRvdXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogT3Bjb2RlIHJhbmdlOiAweDM0LTM1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFN0YWNrOiAgICAgICAgdWludDMyIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgc3RhdGljCisgIHZvaWQgIEluc19TSEMoIElOU19BUkcgKQorICB7CisgICAgVFRfR2x5cGhab25lIHpwOworICAgIFRUX1VTaG9ydCAgICByZWZwOworICAgIFRUX0YyNkRvdDYgICBkeCwKKyAgICAgICAgICAgICAgICAgZHk7CisKKyAgICBUVF9TaG9ydCAgICAgY29udG91cjsKKyAgICBUVF9VU2hvcnQgICAgZmlyc3RfcG9pbnQsIGxhc3RfcG9pbnQsIGk7CisKKworICAgIGNvbnRvdXIgPSAoVFRfVVNob3J0KWFyZ3NbMF07CisKKyAgICBpZiAoIEJPVU5EUyggY29udG91ciwgQ1VSLnB0cy5uX2NvbnRvdXJzICkgKQorICAgIHsKKyAgICAgIGlmICggQ1VSLnBlZGFudGljX2hpbnRpbmcgKQorICAgICAgICBDVVIuZXJyb3IgPSBUVF9FcnJfSW52YWxpZF9SZWZlcmVuY2U7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCBDT01QVVRFX1BvaW50X0Rpc3BsYWNlbWVudCggJmR4LCAmZHksICZ6cCwgJnJlZnAgKSApCisgICAgICByZXR1cm47CisKKyAgICBpZiAoIGNvbnRvdXIgPT0gMCApCisgICAgICBmaXJzdF9wb2ludCA9IDA7CisgICAgZWxzZQorICAgICAgZmlyc3RfcG9pbnQgPSBDVVIucHRzLmNvbnRvdXJzW2NvbnRvdXIgLSAxXSArIDE7CisKKyAgICBsYXN0X3BvaW50ID0gQ1VSLnB0cy5jb250b3Vyc1tjb250b3VyXTsKKworICAgIC8qIFhYWDogdGhpcyBpcyBwcm9iYWJseSB3cm9uZy4uLiBhdCBsZWFzdCBpdCBwcmV2ZW50cyBtZW1vcnkgKi8KKyAgICAvKiAgICAgIGNvcnJ1cHRpb24gd2hlbiB6cDIgaXMgdGhlIHR3aWxpZ2h0IHpvbmUgICAgICAgICAgICAgICovCisgICAgaWYgKCBsYXN0X3BvaW50ID4gQ1VSLnpwMi5uX3BvaW50cyApCisgICAgeworICAgICAgaWYgKCBDVVIuenAyLm5fcG9pbnRzID4gMCApCisgICAgICAgIGxhc3RfcG9pbnQgPSBDVVIuenAyLm5fcG9pbnRzIC0gMTsKKyAgICAgIGVsc2UKKyAgICAgICAgbGFzdF9wb2ludCA9IDA7CisgICAgfQorCisgICAgLyogWFhYOiBVTkRPQ1VNRU5URUQhIFNIQyBkb2Vzbid0IHRvdWNoIHRoZSBwb2ludHMgKi8KKyAgICBmb3IgKCBpID0gZmlyc3RfcG9pbnQ7IGkgPD0gbGFzdF9wb2ludDsgaSsrICkKKyAgICB7CisgICAgICBpZiAoIHpwLmN1ciAhPSBDVVIuenAyLmN1ciB8fCByZWZwICE9IGkgKQorICAgICAgICBNT1ZFX1pwMl9Qb2ludCggaSwgZHgsIGR5LCBGQUxTRSApOworICAgIH0KKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBTSFpbYV06ICAgICAgIFNIaWZ0IFpvbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogT3Bjb2RlIHJhbmdlOiAweDM2LTM3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFN0YWNrOiAgICAgICAgdWludDMyIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgc3RhdGljCisgIHZvaWQgIEluc19TSFooIElOU19BUkcgKQorICB7CisgICAgVFRfR2x5cGhab25lIHpwOworICAgIFRUX1VTaG9ydCAgICByZWZwOworICAgIFRUX0YyNkRvdDYgICBkeCwKKyAgICAgICAgICAgICAgICAgZHk7CisKKyAgICBUVF9VU2hvcnQgIGxhc3RfcG9pbnQsIGk7CisKKworICAgIGlmICggQk9VTkRTKCBhcmdzWzBdLCAyICkgKQorICAgIHsKKyAgICAgIGlmICggQ1VSLnBlZGFudGljX2hpbnRpbmcgKQorICAgICAgICBDVVIuZXJyb3IgPSBUVF9FcnJfSW52YWxpZF9SZWZlcmVuY2U7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCBDT01QVVRFX1BvaW50X0Rpc3BsYWNlbWVudCggJmR4LCAmZHksICZ6cCwgJnJlZnAgKSApCisgICAgICByZXR1cm47CisKKyAgICBpZiAoIENVUi56cDIubl9wb2ludHMgPiAwICkKKyAgICAgIGxhc3RfcG9pbnQgPSBDVVIuenAyLm5fcG9pbnRzIC0gMTsKKyAgICBlbHNlCisgICAgICBsYXN0X3BvaW50ID0gMDsKKworICAgIC8qIFhYWDogVU5ET0NVTUVOVEVEISBTSFogZG9lc24ndCB0b3VjaCB0aGUgcG9pbnRzICovCisgICAgZm9yICggaSA9IDA7IGkgPD0gbGFzdF9wb2ludDsgaSsrICkKKyAgICB7CisgICAgICBpZiAoIHpwLmN1ciAhPSBDVVIuenAyLmN1ciB8fCByZWZwICE9IGkgKQorICAgICAgICBNT1ZFX1pwMl9Qb2ludCggaSwgZHgsIGR5LCBGQUxTRSApOworICAgIH0KKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBTSFBJWFtdOiAgICAgIFNIaWZ0IHBvaW50cyBieSBhIFBJWGVsIGFtb3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogT3Bjb2RlIHJhbmdlOiAweDM4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFN0YWNrOiAgICAgICAgZjI2LjYgdWludDMyLi4uIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgc3RhdGljCisgIHZvaWQgIEluc19TSFBJWCggSU5TX0FSRyApCisgIHsKKyAgICBUVF9GMjZEb3Q2ICBkeCwgZHk7CisgICAgVFRfVVNob3J0ICAgcG9pbnQ7CisKKworICAgIGlmICggQ1VSLnRvcCA8IENVUi5HUy5sb29wICsgMSApCisgICAgeworICAgICAgQ1VSLmVycm9yID0gVFRfRXJyX0ludmFsaWRfUmVmZXJlbmNlOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGR4ID0gVFRfTVVMRElWKCBhcmdzWzBdLAorICAgICAgICAgICAgICAgICAgICAoVFRfTG9uZylDVVIuR1MuZnJlZVZlY3Rvci54LAorICAgICAgICAgICAgICAgICAgICAweDQwMDAgKTsKKyAgICBkeSA9IFRUX01VTERJViggYXJnc1swXSwKKyAgICAgICAgICAgICAgICAgICAgKFRUX0xvbmcpQ1VSLkdTLmZyZWVWZWN0b3IueSwKKyAgICAgICAgICAgICAgICAgICAgMHg0MDAwICk7CisKKyAgICB3aGlsZSAoIENVUi5HUy5sb29wID4gMCApCisgICAgeworICAgICAgQ1VSLmFyZ3MtLTsKKworICAgICAgcG9pbnQgPSAoVFRfVVNob3J0KUNVUi5zdGFja1tDVVIuYXJnc107CisKKyAgICAgIGlmICggQk9VTkRTKCBwb2ludCwgQ1VSLnpwMi5uX3BvaW50cyApICkKKyAgICAgIHsKKyAgICAgICAgaWYgKCBDVVIucGVkYW50aWNfaGludGluZyApCisgICAgICAgIHsKKyAgICAgICAgICBDVVIuZXJyb3IgPSBUVF9FcnJfSW52YWxpZF9SZWZlcmVuY2U7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIE1PVkVfWnAyX1BvaW50KCBwb2ludCwgZHgsIGR5LCBUUlVFICk7CisKKyAgICAgIENVUi5HUy5sb29wLS07CisgICAgfQorCisgICAgQ1VSLkdTLmxvb3AgPSAxOworICAgIENVUi5uZXdfdG9wID0gQ1VSLmFyZ3M7CisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogTVNJUlBbYV06ICAgICBNb3ZlIFN0YWNrIEluZGlyZWN0IFJlbGF0aXZlIFBvc2l0aW9uICAgICAgICAgICAgICAgICAgICovCisgIC8qIE9wY29kZSByYW5nZTogMHgzQS0weDNCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBTdGFjazogICAgICAgIGYyNi42IHVpbnQzMiAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0YXRpYworICB2b2lkICBJbnNfTVNJUlAoIElOU19BUkcgKQorICB7CisgICAgVFRfVVNob3J0ICAgICAgcG9pbnQ7CisgICAgVFRfRjI2RG90NiAgZGlzdGFuY2U7CisKKworICAgIHBvaW50ID0gKFRUX1VTaG9ydClhcmdzWzBdOworCisgICAgaWYgKCBCT1VORFMoIHBvaW50LCAgICAgIENVUi56cDEubl9wb2ludHMgKSB8fAorICAgICAgICAgQk9VTkRTKCBDVVIuR1MucnAwLCBDVVIuenAwLm5fcG9pbnRzICkgKQorICAgIHsKKyAgICAgIGlmICggQ1VSLnBlZGFudGljX2hpbnRpbmcgKQorICAgICAgICBDVVIuZXJyb3IgPSBUVF9FcnJfSW52YWxpZF9SZWZlcmVuY2U7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyogWFhYOiBVTkRPQ1VNRU5URUQhIGJlaGF2aW91ciAqLworICAgIGlmICggQ1VSLkdTLmdlcDAgPT0gMCApICAgLyogaWYgaW4gdHdpbGlnaHQgem9uZSAqLworICAgIHsKKyAgICAgIENVUi56cDEub3JnW3BvaW50XSA9IENVUi56cDAub3JnW0NVUi5HUy5ycDBdOworICAgICAgQ1VSLnpwMS5jdXJbcG9pbnRdID0gQ1VSLnpwMS5vcmdbcG9pbnRdOworICAgIH0KKworICAgIGRpc3RhbmNlID0gQ1VSX0Z1bmNfcHJvamVjdCggQ1VSLnpwMS5jdXIgKyBwb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENVUi56cDAuY3VyICsgQ1VSLkdTLnJwMCApOworCisgICAgQ1VSX0Z1bmNfbW92ZSggJkNVUi56cDEsIHBvaW50LCBhcmdzWzFdIC0gZGlzdGFuY2UgKTsKKworICAgIENVUi5HUy5ycDEgPSBDVVIuR1MucnAwOworICAgIENVUi5HUy5ycDIgPSBwb2ludDsKKworICAgIGlmICggKENVUi5vcGNvZGUgJiAxKSAhPSAwICkKKyAgICAgIENVUi5HUy5ycDAgPSBwb2ludDsKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBNREFQW2FdOiAgICAgIE1vdmUgRGlyZWN0IEFic29sdXRlIFBvaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogT3Bjb2RlIHJhbmdlOiAweDJFLTB4MkYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFN0YWNrOiAgICAgICAgdWludDMyIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgc3RhdGljCisgIHZvaWQgIEluc19NREFQKCBJTlNfQVJHICkKKyAgeworICAgIFRUX1VTaG9ydCAgIHBvaW50OworICAgIFRUX0YyNkRvdDYgIGN1cl9kaXN0LAorICAgICAgICAgICAgICAgIGRpc3RhbmNlOworCisKKyAgICBwb2ludCA9IChUVF9VU2hvcnQpYXJnc1swXTsKKworICAgIGlmICggQk9VTkRTKCBwb2ludCwgQ1VSLnpwMC5uX3BvaW50cyApICkKKyAgICB7CisgICAgICBpZiAoIENVUi5wZWRhbnRpY19oaW50aW5nICkKKyAgICAgICAgQ1VSLmVycm9yID0gVFRfRXJyX0ludmFsaWRfUmVmZXJlbmNlOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qIFhYWDogSXMgdGhlcmUgc29tZSB1bmRvY3VtZW50ZWQgZmVhdHVyZSB3aGlsZSBpbiB0aGUgKi8KKyAgICAvKiAgICAgIHR3aWxpZ2h0IHpvbmU/ID8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgaWYgKCAoQ1VSLm9wY29kZSAmIDEpICE9IDAgKQorICAgIHsKKyAgICAgIGN1cl9kaXN0ID0gQ1VSX0Z1bmNfcHJvamVjdCggQ1VSLnpwMC5jdXIgKyBwb2ludCwgTlVMTF9WZWN0b3IgKTsKKyAgICAgIGRpc3RhbmNlID0gQ1VSX0Z1bmNfcm91bmQoIGN1cl9kaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSLnR0X21ldHJpY3MuY29tcGVuc2F0aW9uc1swXSApIC0gY3VyX2Rpc3Q7CisgICAgfQorICAgIGVsc2UKKyAgICAgIGRpc3RhbmNlID0gMDsKKworICAgIENVUl9GdW5jX21vdmUoICZDVVIuenAwLCBwb2ludCwgZGlzdGFuY2UgKTsKKworICAgIENVUi5HUy5ycDAgPSBwb2ludDsKKyAgICBDVVIuR1MucnAxID0gcG9pbnQ7CisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogTUlBUFthXTogICAgICBNb3ZlIEluZGlyZWN0IEFic29sdXRlIFBvaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIE9wY29kZSByYW5nZTogMHgzRS0weDNGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBTdGFjazogICAgICAgIHVpbnQzMiB1aW50MzIgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0YXRpYworICB2b2lkICBJbnNfTUlBUCggSU5TX0FSRyApCisgIHsKKyAgICBUVF9VTG9uZyAgICBjdnRFbnRyeTsKKyAgICBUVF9VU2hvcnQgICBwb2ludDsKKyAgICBUVF9GMjZEb3Q2ICBkaXN0YW5jZSwKKyAgICAgICAgICAgICAgICBvcmdfZGlzdDsKKworCisgICAgY3Z0RW50cnkgPSAoVFRfVUxvbmcpYXJnc1sxXTsKKyAgICBwb2ludCAgICA9IChUVF9VU2hvcnQpYXJnc1swXTsKKworICAgIGlmICggQk9VTkRTKCBwb2ludCwgICAgQ1VSLnpwMC5uX3BvaW50cyApIHx8CisgICAgICAgICBCT1VORFMoIGN2dEVudHJ5LCBDVVIuY3Z0U2l6ZSApICAgICAgKQorICAgIHsKKyAgICAgIGlmICggQ1VSLnBlZGFudGljX2hpbnRpbmcgKQorICAgICAgICBDVVIuZXJyb3IgPSBUVF9FcnJfSW52YWxpZF9SZWZlcmVuY2U7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyogVU5ET0NVTUVOVEVEISAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiBUaGUgYmVoYXZpb3VyIG9mIGFuIE1JQVAgaW5zdHJ1Y3Rpb24gaXMgcXVpdGUgICAgICovCisgICAgLyogZGlmZmVyZW50IHdoZW4gdXNlZCBpbiB0aGUgdHdpbGlnaHQgem9uZS4gICAgICAgICAqLworICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiBGaXJzdCwgbm8gY29udHJvbCB2YWx1ZSBjdXRpbiB0ZXN0IGlzIHBlcmZvcm1lZCAgICovCisgICAgLyogYXMgaXQgd291bGQgZmFpbCBhbnl3YXkuICBTZWNvbmQsIHRoZSBvcmlnaW5hbCAgICAqLworICAgIC8qIHBvaW50LCBpLmUuIChvcmdfeCxvcmdfeSkgb2YgenAwLnBvaW50LCBpcyBzZXQgICAgKi8KKyAgICAvKiB0byB0aGUgYWJzb2x1dGUsIHVucm91bmRlZCBkaXN0YW5jZSBmb3VuZCBpbiAgICAgICovCisgICAgLyogdGhlIENWVC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiBUaGlzIGlzIHVzZWQgaW4gdGhlIENWVCBwcm9ncmFtcyBvZiB0aGUgTWljcm9zb2Z0ICovCisgICAgLyogZm9udHMgQXJpYWwsIFRpbWVzLCBldGMuLCBpbiBvcmRlciB0byByZS1hZGp1c3QgICAqLworICAgIC8qIHNvbWUga2V5IGZvbnQgaGVpZ2h0cy4gIEl0IGFsbG93cyB0aGUgdXNlIG9mIHRoZSAgKi8KKyAgICAvKiBJUCBpbnN0cnVjdGlvbiBpbiB0aGUgdHdpbGlnaHQgem9uZSwgd2hpY2ggICAgICAgICovCisgICAgLyogb3RoZXJ3aXNlIHdvdWxkIGJlIGBpbGxlZ2FsJyBhY2NvcmRpbmcgdG8gdGhlICAgICAqLworICAgIC8qIHNwZWNzIDopICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogV2UgaW1wbGVtZW50IGl0IHdpdGggYSBzcGVjaWFsIHNlcXVlbmNlIGZvciB0aGUgICAqLworICAgIC8qIHR3aWxpZ2h0IHpvbmUuICBUaGlzIGlzIGEgYmFkIGhhY2ssIGJ1dCBpdCBzZWVtcyAgKi8KKyAgICAvKiB0byB3b3JrLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICBkaXN0YW5jZSA9IENVUl9GdW5jX3JlYWRfY3Z0KCBjdnRFbnRyeSApOworCisgICAgaWYgKCBDVVIuR1MuZ2VwMCA9PSAwICkgICAvKiBJZiBpbiB0d2lsaWdodCB6b25lICovCisgICAgeworICAgICAgQ1VSLnpwMC5vcmdbcG9pbnRdLnggPSBUVF9NVUxESVYoIENVUi5HUy5mcmVlVmVjdG9yLngsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzdGFuY2UsIDB4NDAwMCApOworICAgICAgQ1VSLnpwMC5vcmdbcG9pbnRdLnkgPSBUVF9NVUxESVYoIENVUi5HUy5mcmVlVmVjdG9yLnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzdGFuY2UsIDB4NDAwMCApOworICAgICAgQ1VSLnpwMC5jdXJbcG9pbnRdID0gQ1VSLnpwMC5vcmdbcG9pbnRdOworICAgIH0KKworICAgIG9yZ19kaXN0ID0gQ1VSX0Z1bmNfcHJvamVjdCggQ1VSLnpwMC5jdXIgKyBwb2ludCwgTlVMTF9WZWN0b3IgKTsKKworICAgIGlmICggKENVUi5vcGNvZGUgJiAxKSAhPSAwICkgICAvKiByb3VuZGluZyBhbmQgY29udHJvbCBjdXRpbiBmbGFnICovCisgICAgeworICAgICAgaWYgKCBBQlMoIGRpc3RhbmNlIC0gb3JnX2Rpc3QgKSA+IENVUi5HUy5jb250cm9sX3ZhbHVlX2N1dGluICkKKyAgICAgICAgZGlzdGFuY2UgPSBvcmdfZGlzdDsKKworICAgICAgZGlzdGFuY2UgPSBDVVJfRnVuY19yb3VuZCggZGlzdGFuY2UsIENVUi50dF9tZXRyaWNzLmNvbXBlbnNhdGlvbnNbMF0gKTsKKyAgICB9CisKKyAgICBDVVJfRnVuY19tb3ZlKCAmQ1VSLnpwMCwgcG9pbnQsIGRpc3RhbmNlIC0gb3JnX2Rpc3QgKTsKKworICAgIENVUi5HUy5ycDAgPSBwb2ludDsKKyAgICBDVVIuR1MucnAxID0gcG9pbnQ7CisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogTURSUFthYmNkZV06ICBNb3ZlIERpcmVjdCBSZWxhdGl2ZSBQb2ludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIE9wY29kZSByYW5nZTogMHhDMC0weERGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBTdGFjazogICAgICAgIHVpbnQzMiAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0YXRpYworICB2b2lkICBJbnNfTURSUCggSU5TX0FSRyApCisgIHsKKyAgICBUVF9VU2hvcnQgICBwb2ludDsKKyAgICBUVF9GMjZEb3Q2ICBvcmdfZGlzdCwgZGlzdGFuY2U7CisKKworICAgIHBvaW50ID0gKFRUX1VTaG9ydClhcmdzWzBdOworCisgICAgaWYgKCBCT1VORFMoIHBvaW50LCAgICAgIENVUi56cDEubl9wb2ludHMgKSB8fAorICAgICAgICAgQk9VTkRTKCBDVVIuR1MucnAwLCBDVVIuenAwLm5fcG9pbnRzICkgKQorICAgIHsKKyAgICAgIGlmICggQ1VSLnBlZGFudGljX2hpbnRpbmcgKQorICAgICAgICBDVVIuZXJyb3IgPSBUVF9FcnJfSW52YWxpZF9SZWZlcmVuY2U7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyogWFhYOiBJcyB0aGVyZSBzb21lIHVuZG9jdW1lbnRlZCBmZWF0dXJlIHdoaWxlIGluIHRoZSAqLworICAgIC8qICAgICAgdHdpbGlnaHQgem9uZT8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICAgIG9yZ19kaXN0ID0gQ1VSX0Z1bmNfZHVhbHByb2ooIENVUi56cDEub3JnICsgcG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSLnpwMC5vcmcgKyBDVVIuR1MucnAwICk7CisKKyAgICAvKiBzaW5nbGUgd2lkdGggY3V0aW4gdGVzdCAqLworCisgICAgaWYgKCBBQlMoIG9yZ19kaXN0ICkgPCBDVVIuR1Muc2luZ2xlX3dpZHRoX2N1dGluICkKKyAgICB7CisgICAgICBpZiAoIG9yZ19kaXN0ID49IDAgKQorICAgICAgICBvcmdfZGlzdCA9IENVUi5HUy5zaW5nbGVfd2lkdGhfdmFsdWU7CisgICAgICBlbHNlCisgICAgICAgIG9yZ19kaXN0ID0gLUNVUi5HUy5zaW5nbGVfd2lkdGhfdmFsdWU7CisgICAgfQorCisgICAgLyogcm91bmQgZmxhZyAqLworCisgICAgaWYgKCAoQ1VSLm9wY29kZSAmIDQpICE9IDAgKQorICAgICAgZGlzdGFuY2UgPSBDVVJfRnVuY19yb3VuZCggb3JnX2Rpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVVIudHRfbWV0cmljcy5jb21wZW5zYXRpb25zW0NVUi5vcGNvZGUgJiAzXSApOworICAgIGVsc2UKKyAgICAgIGRpc3RhbmNlID0gUk9VTkRfTm9uZSggb3JnX2Rpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENVUi50dF9tZXRyaWNzLmNvbXBlbnNhdGlvbnNbQ1VSLm9wY29kZSAmIDNdICApOworCisgICAgLyogbWluaW11bSBkaXN0YW5jZSBmbGFnICovCisKKyAgICBpZiAoIChDVVIub3Bjb2RlICYgOCkgIT0gMCApCisgICAgeworICAgICAgaWYgKCBvcmdfZGlzdCA+PSAwICkKKyAgICAgIHsKKyAgICAgICAgaWYgKCBkaXN0YW5jZSA8IENVUi5HUy5taW5pbXVtX2Rpc3RhbmNlICkKKyAgICAgICAgICBkaXN0YW5jZSA9IENVUi5HUy5taW5pbXVtX2Rpc3RhbmNlOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBpZiAoIGRpc3RhbmNlID4gLUNVUi5HUy5taW5pbXVtX2Rpc3RhbmNlICkKKyAgICAgICAgICBkaXN0YW5jZSA9IC1DVVIuR1MubWluaW11bV9kaXN0YW5jZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBub3cgbW92ZSB0aGUgcG9pbnQgKi8KKworICAgIG9yZ19kaXN0ID0gQ1VSX0Z1bmNfcHJvamVjdCggQ1VSLnpwMS5jdXIgKyBwb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENVUi56cDAuY3VyICsgQ1VSLkdTLnJwMCApOworCisgICAgQ1VSX0Z1bmNfbW92ZSggJkNVUi56cDEsIHBvaW50LCBkaXN0YW5jZSAtIG9yZ19kaXN0ICk7CisKKyAgICBDVVIuR1MucnAxID0gQ1VSLkdTLnJwMDsKKyAgICBDVVIuR1MucnAyID0gcG9pbnQ7CisKKyAgICBpZiAoIChDVVIub3Bjb2RlICYgMTYpICE9IDAgKQorICAgICAgQ1VSLkdTLnJwMCA9IHBvaW50OworICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIE1JUlBbYWJjZGVdOiAgTW92ZSBJbmRpcmVjdCBSZWxhdGl2ZSBQb2ludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBPcGNvZGUgcmFuZ2U6IDB4RTAtMHhGRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogU3RhY2s6ICAgICAgICBpbnQzMj8gdWludDMyIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBzdGF0aWMKKyAgdm9pZCAgSW5zX01JUlAoIElOU19BUkcgKQorICB7CisgICAgVFRfVVNob3J0ICAgcG9pbnQ7CisgICAgVFRfVUxvbmcgICAgY3Z0RW50cnk7CisKKyAgICBUVF9GMjZEb3Q2ICBjdnRfZGlzdCwKKyAgICAgICAgICAgICAgICBkaXN0YW5jZSwKKyAgICAgICAgICAgICAgICBjdXJfZGlzdCwKKyAgICAgICAgICAgICAgICBvcmdfZGlzdDsKKworCisgICAgcG9pbnQgICAgPSAoVFRfVVNob3J0KWFyZ3NbMF07CisgICAgY3Z0RW50cnkgPSAoVFRfVUxvbmcpKGFyZ3NbMV0gKyAxKTsKKworICAgIC8qIFhYWDogVU5ET0NVTUVOVEVEISBjdnRbLTFdID0gMCBhbHdheXMgKi8KKworICAgIGlmICggQk9VTkRTKCBwb2ludCwgICAgICBDVVIuenAxLm5fcG9pbnRzICkgfHwKKyAgICAgICAgIEJPVU5EUyggY3Z0RW50cnksICAgQ1VSLmN2dFNpemUgKyAxICkgIHx8CisgICAgICAgICBCT1VORFMoIENVUi5HUy5ycDAsIENVUi56cDAubl9wb2ludHMgKSApCisgICAgeworICAgICAgaWYgKCBDVVIucGVkYW50aWNfaGludGluZyApCisgICAgICAgIENVUi5lcnJvciA9IFRUX0Vycl9JbnZhbGlkX1JlZmVyZW5jZTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoICFjdnRFbnRyeSApCisgICAgICBjdnRfZGlzdCA9IDA7CisgICAgZWxzZQorICAgICAgY3Z0X2Rpc3QgPSBDVVJfRnVuY19yZWFkX2N2dCggY3Z0RW50cnkgLSAxICk7CisKKyAgICAvKiBzaW5nbGUgd2lkdGggdGVzdCAqLworCisgICAgaWYgKCBBQlMoIGN2dF9kaXN0ICkgPCBDVVIuR1Muc2luZ2xlX3dpZHRoX2N1dGluICkKKyAgICB7CisgICAgICBpZiAoIGN2dF9kaXN0ID49IDAgKQorICAgICAgICBjdnRfZGlzdCA9ICBDVVIuR1Muc2luZ2xlX3dpZHRoX3ZhbHVlOworICAgICAgZWxzZQorICAgICAgICBjdnRfZGlzdCA9IC1DVVIuR1Muc2luZ2xlX3dpZHRoX3ZhbHVlOworICAgIH0KKworICAgIC8qIFhYWDogVU5ET0NVTUVOVEVEISAtLSB0d2lsaWdodCB6b25lICovCisKKyAgICBpZiAoIENVUi5HUy5nZXAxID09IDAgKQorICAgIHsKKyAgICAgIENVUi56cDEub3JnW3BvaW50XS54ID0gQ1VSLnpwMC5vcmdbQ1VSLkdTLnJwMF0ueCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX01VTERJViggY3Z0X2Rpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSLkdTLmZyZWVWZWN0b3IueCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDAgKTsKKworICAgICAgQ1VSLnpwMS5vcmdbcG9pbnRdLnkgPSBDVVIuenAwLm9yZ1tDVVIuR1MucnAwXS55ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfTVVMRElWKCBjdnRfZGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVVIuR1MuZnJlZVZlY3Rvci55LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMCApOworCisgICAgICBDVVIuenAxLmN1cltwb2ludF0gPSBDVVIuenAxLm9yZ1twb2ludF07CisgICAgfQorCisgICAgb3JnX2Rpc3QgPSBDVVJfRnVuY19kdWFscHJvaiggQ1VSLnpwMS5vcmcgKyBwb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVVIuenAwLm9yZyArIENVUi5HUy5ycDAgKTsKKworICAgIGN1cl9kaXN0ID0gQ1VSX0Z1bmNfcHJvamVjdCggQ1VSLnpwMS5jdXIgKyBwb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENVUi56cDAuY3VyICsgQ1VSLkdTLnJwMCApOworCisgICAgLyogYXV0by1mbGlwIHRlc3QgKi8KKworICAgIGlmICggQ1VSLkdTLmF1dG9fZmxpcCApCisgICAgeworICAgICAgaWYgKCAob3JnX2Rpc3QgXiBjdnRfZGlzdCkgPCAwICkKKyAgICAgICAgY3Z0X2Rpc3QgPSAtY3Z0X2Rpc3Q7CisgICAgfQorCisgICAgLyogY29udHJvbCB2YWx1ZSBjdXRpbiBhbmQgcm91bmQgKi8KKworICAgIGlmICggKENVUi5vcGNvZGUgJiA0KSAhPSAwICkKKyAgICB7CisgICAgICAvKiBYWFg6IFVORE9DVU1FTlRFRCEgIE9ubHkgcGVyZm9ybSBjdXQtaW4gdGVzdCB3aGVuIGJvdGggcG9pbnRzICovCisgICAgICAvKiAgICAgIHJlZmVyIHRvIHRoZSBzYW1lIHpvbmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICAgIGlmICggQ1VSLkdTLmdlcDAgPT0gQ1VSLkdTLmdlcDEgKQorICAgICAgICBpZiAoIEFCUyggY3Z0X2Rpc3QgLSBvcmdfZGlzdCApID49IENVUi5HUy5jb250cm9sX3ZhbHVlX2N1dGluICkKKyAgICAgICAgICBjdnRfZGlzdCA9IG9yZ19kaXN0OworCisgICAgICBkaXN0YW5jZSA9IENVUl9GdW5jX3JvdW5kKCBjdnRfZGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENVUi50dF9tZXRyaWNzLmNvbXBlbnNhdGlvbnNbQ1VSLm9wY29kZSAmIDNdICk7CisgICAgfQorICAgIGVsc2UKKyAgICAgIGRpc3RhbmNlID0gUk9VTkRfTm9uZSggY3Z0X2Rpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENVUi50dF9tZXRyaWNzLmNvbXBlbnNhdGlvbnNbQ1VSLm9wY29kZSAmIDNdICk7CisKKyAgICAvKiBtaW5pbXVtIGRpc3RhbmNlIHRlc3QgKi8KKworICAgIGlmICggKENVUi5vcGNvZGUgJiA4KSAhPSAwICkKKyAgICB7CisgICAgICBpZiAoIG9yZ19kaXN0ID49IDAgKQorICAgICAgeworICAgICAgICBpZiAoIGRpc3RhbmNlIDwgQ1VSLkdTLm1pbmltdW1fZGlzdGFuY2UgKQorICAgICAgICAgIGRpc3RhbmNlID0gQ1VSLkdTLm1pbmltdW1fZGlzdGFuY2U7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGlmICggZGlzdGFuY2UgPiAtQ1VSLkdTLm1pbmltdW1fZGlzdGFuY2UgKQorICAgICAgICAgIGRpc3RhbmNlID0gLUNVUi5HUy5taW5pbXVtX2Rpc3RhbmNlOworICAgICAgfQorICAgIH0KKworICAgIENVUl9GdW5jX21vdmUoICZDVVIuenAxLCBwb2ludCwgZGlzdGFuY2UgLSBjdXJfZGlzdCApOworCisgICAgQ1VSLkdTLnJwMSA9IENVUi5HUy5ycDA7CisKKyAgICBpZiAoIChDVVIub3Bjb2RlICYgMTYpICE9IDAgKQorICAgICAgQ1VSLkdTLnJwMCA9IHBvaW50OworCisgICAgLyogWFhYOiBVTkRPQ1VNRU5URUQhICovCisKKyAgICBDVVIuR1MucnAyID0gcG9pbnQ7CisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogQUxJR05SUFtdOiAgICBBTElHTiBSZWxhdGl2ZSBQb2ludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIE9wY29kZSByYW5nZTogMHgzQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBTdGFjazogICAgICAgIHVpbnQzMiB1aW50MzIuLi4gLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0YXRpYworICB2b2lkICBJbnNfQUxJR05SUCggSU5TX0FSRyApCisgIHsKKyAgICBUVF9VU2hvcnQgICBwb2ludDsKKyAgICBUVF9GMjZEb3Q2ICBkaXN0YW5jZTsKKworCisgICAgVU5VU0VEX0FSRzsKKworICAgIGlmICggQ1VSLnRvcCA8IENVUi5HUy5sb29wIHx8CisgICAgICAgICBCT1VORFMoIENVUi5HUy5ycDAsIENVUi56cDAubl9wb2ludHMgKSApCisgICAgeworICAgICAgaWYgKCBDVVIucGVkYW50aWNfaGludGluZyApCisgICAgICAgIENVUi5lcnJvciA9IFRUX0Vycl9JbnZhbGlkX1JlZmVyZW5jZTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB3aGlsZSAoIENVUi5HUy5sb29wID4gMCApCisgICAgeworICAgICAgQ1VSLmFyZ3MtLTsKKworICAgICAgcG9pbnQgPSAoVFRfVVNob3J0KUNVUi5zdGFja1tDVVIuYXJnc107CisKKyAgICAgIGlmICggQk9VTkRTKCBwb2ludCwgQ1VSLnpwMS5uX3BvaW50cyApICkKKyAgICAgIHsKKyAgICAgICAgaWYgKCBDVVIucGVkYW50aWNfaGludGluZyApCisgICAgICAgIHsKKyAgICAgICAgICBDVVIuZXJyb3IgPSBUVF9FcnJfSW52YWxpZF9SZWZlcmVuY2U7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGRpc3RhbmNlID0gQ1VSX0Z1bmNfcHJvamVjdCggQ1VSLnpwMS5jdXIgKyBwb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVVIuenAwLmN1ciArIENVUi5HUy5ycDAgKTsKKworICAgICAgICBDVVJfRnVuY19tb3ZlKCAmQ1VSLnpwMSwgcG9pbnQsIC1kaXN0YW5jZSApOworICAgICAgfQorCisgICAgICBDVVIuR1MubG9vcC0tOworICAgIH0KKworICAgIENVUi5HUy5sb29wID0gMTsKKyAgICBDVVIubmV3X3RvcCA9IENVUi5hcmdzOworICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIElTRUNUW106ICAgICAgbW92ZXMgcG9pbnQgdG8gSW50ZXJTRUNUaW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBPcGNvZGUgcmFuZ2U6IDB4MEYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogU3RhY2s6ICAgICAgICA1ICogdWludDMyIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBzdGF0aWMKKyAgdm9pZCAgSW5zX0lTRUNUKCBJTlNfQVJHICkKKyAgeworICAgIFRUX1VTaG9ydCAgIHBvaW50LAorICAgICAgICAgICAgICAgIGEwLCBhMSwKKyAgICAgICAgICAgICAgICBiMCwgYjE7CisKKyAgICBUVF9GMjZEb3Q2ICBkaXNjcmltaW5hbnQ7CisKKyAgICBUVF9GMjZEb3Q2ICBkeCwgIGR5LAorICAgICAgICAgICAgICAgIGRheCwgZGF5LAorICAgICAgICAgICAgICAgIGRieCwgZGJ5OworCisgICAgVFRfRjI2RG90NiAgdmFsOworCisgICAgVFRfVmVjdG9yICAgUjsKKworCisgICAgcG9pbnQgPSAoVFRfVVNob3J0KWFyZ3NbMF07CisKKyAgICBhMCA9IChUVF9VU2hvcnQpYXJnc1sxXTsKKyAgICBhMSA9IChUVF9VU2hvcnQpYXJnc1syXTsKKyAgICBiMCA9IChUVF9VU2hvcnQpYXJnc1szXTsKKyAgICBiMSA9IChUVF9VU2hvcnQpYXJnc1s0XTsKKworICAgIGlmICggQk9VTkRTKCBiMCwgQ1VSLnpwMC5uX3BvaW50cyApICB8fAorICAgICAgICAgQk9VTkRTKCBiMSwgQ1VSLnpwMC5uX3BvaW50cyApICB8fAorICAgICAgICAgQk9VTkRTKCBhMCwgQ1VSLnpwMS5uX3BvaW50cyApICB8fAorICAgICAgICAgQk9VTkRTKCBhMSwgQ1VSLnpwMS5uX3BvaW50cyApICB8fAorICAgICAgICAgQk9VTkRTKCBwb2ludCwgQ1VSLnpwMi5uX3BvaW50cyApICkKKyAgICB7CisgICAgICBpZiAoIENVUi5wZWRhbnRpY19oaW50aW5nICkKKyAgICAgICAgQ1VSLmVycm9yID0gVFRfRXJyX0ludmFsaWRfUmVmZXJlbmNlOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGRieCA9IENVUi56cDAuY3VyW2IxXS54IC0gQ1VSLnpwMC5jdXJbYjBdLng7CisgICAgZGJ5ID0gQ1VSLnpwMC5jdXJbYjFdLnkgLSBDVVIuenAwLmN1cltiMF0ueTsKKworICAgIGRheCA9IENVUi56cDEuY3VyW2ExXS54IC0gQ1VSLnpwMS5jdXJbYTBdLng7CisgICAgZGF5ID0gQ1VSLnpwMS5jdXJbYTFdLnkgLSBDVVIuenAxLmN1clthMF0ueTsKKworICAgIGR4ID0gQ1VSLnpwMC5jdXJbYjBdLnggLSBDVVIuenAxLmN1clthMF0ueDsKKyAgICBkeSA9IENVUi56cDAuY3VyW2IwXS55IC0gQ1VSLnpwMS5jdXJbYTBdLnk7CisKKyAgICBDVVIuenAyLnRvdWNoW3BvaW50XSB8PSBGVF9DdXJ2ZV9UYWdfVG91Y2hfQm90aDsKKworICAgIGRpc2NyaW1pbmFudCA9IFRUX01VTERJViggZGF4LCAtZGJ5LCAweDQwICkgKworICAgICAgICAgICAgICAgICAgIFRUX01VTERJViggZGF5LCBkYngsIDB4NDAgKTsKKworICAgIGlmICggQUJTKCBkaXNjcmltaW5hbnQgKSA+PSAweDQwICkKKyAgICB7CisgICAgICB2YWwgPSBUVF9NVUxESVYoIGR4LCAtZGJ5LCAweDQwICkgKyBUVF9NVUxESVYoIGR5LCBkYngsIDB4NDAgKTsKKworICAgICAgUi54ID0gVFRfTVVMRElWKCB2YWwsIGRheCwgZGlzY3JpbWluYW50ICk7CisgICAgICBSLnkgPSBUVF9NVUxESVYoIHZhbCwgZGF5LCBkaXNjcmltaW5hbnQgKTsKKworICAgICAgQ1VSLnpwMi5jdXJbcG9pbnRdLnggPSBDVVIuenAxLmN1clthMF0ueCArIFIueDsKKyAgICAgIENVUi56cDIuY3VyW3BvaW50XS55ID0gQ1VSLnpwMS5jdXJbYTBdLnkgKyBSLnk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBlbHNlLCB0YWtlIHRoZSBtaWRkbGUgb2YgdGhlIG1pZGRsZXMgb2YgQSBhbmQgQiAqLworCisgICAgICBDVVIuenAyLmN1cltwb2ludF0ueCA9ICggQ1VSLnpwMS5jdXJbYTBdLnggKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENVUi56cDEuY3VyW2ExXS54ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVVIuenAwLmN1cltiMF0ueCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSLnpwMC5jdXJbYjFdLnggKSAvIDQ7CisgICAgICBDVVIuenAyLmN1cltwb2ludF0ueSA9ICggQ1VSLnpwMS5jdXJbYTBdLnkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENVUi56cDEuY3VyW2ExXS55ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVVIuenAwLmN1cltiMF0ueSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSLnpwMC5jdXJbYjFdLnkgKSAvIDQ7CisgICAgfQorICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIEFMSUdOUFRTW106ICAgQUxJR04gUG9pblRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBPcGNvZGUgcmFuZ2U6IDB4MjcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogU3RhY2s6ICAgICAgICB1aW50MzIgdWludDMyIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBzdGF0aWMKKyAgdm9pZCAgSW5zX0FMSUdOUFRTKCBJTlNfQVJHICkKKyAgeworICAgIFRUX1VTaG9ydCAgIHAxLCBwMjsKKyAgICBUVF9GMjZEb3Q2ICBkaXN0YW5jZTsKKworCisgICAgcDEgPSAoVFRfVVNob3J0KWFyZ3NbMF07CisgICAgcDIgPSAoVFRfVVNob3J0KWFyZ3NbMV07CisKKyAgICBpZiAoIEJPVU5EUyggYXJnc1swXSwgQ1VSLnpwMS5uX3BvaW50cyApIHx8CisgICAgICAgICBCT1VORFMoIGFyZ3NbMV0sIENVUi56cDAubl9wb2ludHMgKSApCisgICAgeworICAgICAgaWYgKCBDVVIucGVkYW50aWNfaGludGluZyApCisgICAgICAgIENVUi5lcnJvciA9IFRUX0Vycl9JbnZhbGlkX1JlZmVyZW5jZTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBkaXN0YW5jZSA9IENVUl9GdW5jX3Byb2plY3QoIENVUi56cDAuY3VyICsgcDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVVIuenAxLmN1ciArIHAxICkgLyAyOworCisgICAgQ1VSX0Z1bmNfbW92ZSggJkNVUi56cDEsIHAxLCBkaXN0YW5jZSApOworICAgIENVUl9GdW5jX21vdmUoICZDVVIuenAwLCBwMiwgLWRpc3RhbmNlICk7CisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogSVBbXTogICAgICAgICBJbnRlcnBvbGF0ZSBQb2ludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIE9wY29kZSByYW5nZTogMHgzOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBTdGFjazogICAgICAgIHVpbnQzMi4uLiAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0YXRpYworICB2b2lkICBJbnNfSVAoIElOU19BUkcgKQorICB7CisgICAgVFRfRjI2RG90NiAgb3JnX2EsIG9yZ19iLCBvcmdfeCwKKyAgICAgICAgICAgICAgICBjdXJfYSwgY3VyX2IsIGN1cl94LAorICAgICAgICAgICAgICAgIGRpc3RhbmNlOworICAgIFRUX1VTaG9ydCAgIHBvaW50OworCisKKyAgICBVTlVTRURfQVJHOworCisgICAgaWYgKCBDVVIudG9wIDwgQ1VSLkdTLmxvb3AgKQorICAgIHsKKyAgICAgIENVUi5lcnJvciA9IFRUX0Vycl9JbnZhbGlkX1JlZmVyZW5jZTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKiBYWFg6IHRoZXJlIGFyZSBzb21lIGdseXBocyBpbiBzb21lIGJyYWluZGVhZCBidXQgcG9wdWxhciAgKi8KKyAgICAvKiAgICAgIGZvbnRzIG91dCB0aGVyZSAoZS5nLiBbYWV1XWdyYXZlIGluIG1vbm90eXBlLnR0ZikgICAgKi8KKyAgICAvKiAgICAgIGNhbGxpbmcgSVBbXSB3aXRoIGJhZCB2YWx1ZXMgb2YgcnBbMTJdLiAgICAgICAgICAgICAgKi8KKyAgICAvKiAgICAgIERvIHNvbWV0aGluZyBzYW5lIHdoZW4gdGhpcyBvZGQgdGhpbmcgaGFwcGVucy4gICAgICAgKi8KKworICAgIGlmICggQk9VTkRTKCBDVVIuR1MucnAxLCBDVVIuenAwLm5fcG9pbnRzICkgfHwKKyAgICAgICAgIEJPVU5EUyggQ1VSLkdTLnJwMiwgQ1VSLnpwMS5uX3BvaW50cyApICkKKyAgICB7CisgICAgICBvcmdfYSA9IGN1cl9hID0gMDsKKyAgICAgIG9yZ19iID0gY3VyX2IgPSAwOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgb3JnX2EgPSBDVVJfRnVuY19kdWFscHJvaiggQ1VSLnpwMC5vcmcgKyBDVVIuR1MucnAxLCBOVUxMX1ZlY3RvciApOworICAgICAgb3JnX2IgPSBDVVJfRnVuY19kdWFscHJvaiggQ1VSLnpwMS5vcmcgKyBDVVIuR1MucnAyLCBOVUxMX1ZlY3RvciApOworCisgICAgICBjdXJfYSA9IENVUl9GdW5jX3Byb2plY3QoIENVUi56cDAuY3VyICsgQ1VSLkdTLnJwMSwgTlVMTF9WZWN0b3IgKTsKKyAgICAgIGN1cl9iID0gQ1VSX0Z1bmNfcHJvamVjdCggQ1VSLnpwMS5jdXIgKyBDVVIuR1MucnAyLCBOVUxMX1ZlY3RvciApOworICAgIH0KKworICAgIHdoaWxlICggQ1VSLkdTLmxvb3AgPiAwICkKKyAgICB7CisgICAgICBDVVIuYXJncy0tOworCisgICAgICBwb2ludCA9IChUVF9VU2hvcnQpQ1VSLnN0YWNrW0NVUi5hcmdzXTsKKyAgICAgIGlmICggQk9VTkRTKCBwb2ludCwgQ1VSLnpwMi5uX3BvaW50cyApICkKKyAgICAgIHsKKyAgICAgICAgaWYgKCBDVVIucGVkYW50aWNfaGludGluZyApCisgICAgICAgIHsKKyAgICAgICAgICBDVVIuZXJyb3IgPSBUVF9FcnJfSW52YWxpZF9SZWZlcmVuY2U7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIG9yZ194ID0gQ1VSX0Z1bmNfZHVhbHByb2ooIENVUi56cDIub3JnICsgcG9pbnQsIE5VTExfVmVjdG9yICk7CisgICAgICAgIGN1cl94ID0gQ1VSX0Z1bmNfcHJvamVjdCAoIENVUi56cDIuY3VyICsgcG9pbnQsIE5VTExfVmVjdG9yICk7CisKKyAgICAgICAgaWYgKCAoIG9yZ19hIDw9IG9yZ19iICYmIG9yZ194IDw9IG9yZ19hICkgfHwKKyAgICAgICAgICAgICAoIG9yZ19hID4gIG9yZ19iICYmIG9yZ194ID49IG9yZ19hICkgKQorCisgICAgICAgICAgZGlzdGFuY2UgPSAoIGN1cl9hIC0gb3JnX2EgKSArICggb3JnX3ggLSBjdXJfeCApOworCisgICAgICAgIGVsc2UgaWYgKCAoIG9yZ19hIDw9IG9yZ19iICAmJiAgb3JnX3ggPj0gb3JnX2IgKSB8fAorICAgICAgICAgICAgICAgICAgKCBvcmdfYSA+ICBvcmdfYiAgJiYgIG9yZ194IDwgIG9yZ19iICkgKQorCisgICAgICAgICAgZGlzdGFuY2UgPSAoIGN1cl9iIC0gb3JnX2IgKSArICggb3JnX3ggLSBjdXJfeCApOworCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgLyogbm90ZTogaXQgc2VlbXMgdGhhdCByb3VuZGluZyB0aGlzIHZhbHVlIGlzbid0IGEgZ29vZCAqLworICAgICAgICAgICAvKiAgICAgICBpZGVhIChjZi4gd2lkdGggb2YgY2FwaXRhbCBgUycgaW4gVGltZXMpICAgICAgICovCisKKyAgICAgICAgICAgZGlzdGFuY2UgPSBUVF9NVUxESVYoIGN1cl9iIC0gY3VyX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmdfeCAtIG9yZ19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnX2IgLSBvcmdfYSApICsgKCBjdXJfYSAtIGN1cl94ICk7CisKKyAgICAgICAgQ1VSX0Z1bmNfbW92ZSggJkNVUi56cDIsIHBvaW50LCBkaXN0YW5jZSApOworICAgICAgfQorCisgICAgICBDVVIuR1MubG9vcC0tOworICAgIH0KKworICAgIENVUi5HUy5sb29wID0gMTsKKyAgICBDVVIubmV3X3RvcCA9IENVUi5hcmdzOworICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFVUUFthXTogICAgICAgVW5Ub3VjaCBQb2ludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBPcGNvZGUgcmFuZ2U6IDB4MjkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogU3RhY2s6ICAgICAgICB1aW50MzIgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBzdGF0aWMKKyAgdm9pZCAgSW5zX1VUUCggSU5TX0FSRyApCisgIHsKKyAgICBUVF9VU2hvcnQgIHBvaW50OworICAgIFRUX0J5dGUgICAgbWFzazsKKworCisgICAgcG9pbnQgPSAoVFRfVVNob3J0KWFyZ3NbMF07CisKKyAgICBpZiAoIEJPVU5EUyggcG9pbnQsIENVUi56cDAubl9wb2ludHMgKSApCisgICAgeworICAgICAgaWYgKCBDVVIucGVkYW50aWNfaGludGluZyApCisgICAgICAgIENVUi5lcnJvciA9IFRUX0Vycl9JbnZhbGlkX1JlZmVyZW5jZTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtYXNrID0gMHhGRjsKKworICAgIGlmICggQ1VSLkdTLmZyZWVWZWN0b3IueCAhPSAwICkKKyAgICAgIG1hc2sgJj0gfkZUX0N1cnZlX1RhZ19Ub3VjaF9YOworCisgICAgaWYgKCBDVVIuR1MuZnJlZVZlY3Rvci55ICE9IDAgKQorICAgICAgbWFzayAmPSB+RlRfQ3VydmVfVGFnX1RvdWNoX1k7CisKKyAgICBDVVIuenAwLnRvdWNoW3BvaW50XSAmPSBtYXNrOworICB9CisKKworICAvKiBMb2NhbCB2YXJpYWJsZXMgZm9yIEluc19JVVA6ICovCisgIHN0cnVjdCBMT0NfSW5zX0lVUAorICB7CisgICAgVFRfVmVjdG9yKiAgb3JnczsgICAvKiBvcmlnaW5hbCBhbmQgY3VycmVudCBjb29yZGluYXRlICovCisgICAgVFRfVmVjdG9yKiAgY3VyczsgICAvKiBhcnJheXMgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIH07CisKKworICBzdGF0aWMgdm9pZCAgU2hpZnQoIFRUX1VJbnQgICAgICAgICAgICAgIHAxLAorICAgICAgICAgICAgICAgICAgICAgIFRUX1VJbnQgICAgICAgICAgICAgIHAyLAorICAgICAgICAgICAgICAgICAgICAgIFRUX1VJbnQgICAgICAgICAgICAgIHAsCisgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IExPQ19JbnNfSVVQKiAgTElOSyApCisgIHsKKyAgICBUVF9VSW50ICAgICBpOworICAgIFRUX0YyNkRvdDYgIHg7CisKKyAgICB4ID0gTElOSy0+Y3Vyc1twXS54IC0gTElOSy0+b3Jnc1twXS54OworCisgICAgZm9yICggaSA9IHAxOyBpIDwgcDsgaSsrICkKKyAgICAgIExJTkstPmN1cnNbaV0ueCArPSB4OworCisgICAgZm9yICggaSA9IHAgKyAxOyBpIDw9IHAyOyBpKysgKQorICAgICAgTElOSy0+Y3Vyc1tpXS54ICs9IHg7CisgIH0KKworCisgIHN0YXRpYyB2b2lkICBJbnRlcnAoIFRUX1VJbnQgICAgICAgICAgICAgIHAxLAorICAgICAgICAgICAgICAgICAgICAgICBUVF9VSW50ICAgICAgICAgICAgICBwMiwKKyAgICAgICAgICAgICAgICAgICAgICAgVFRfVUludCAgICAgICAgICAgICAgcmVmMSwKKyAgICAgICAgICAgICAgICAgICAgICAgVFRfVUludCAgICAgICAgICAgICAgcmVmMiwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IExPQ19JbnNfSVVQKiAgTElOSyApCisgIHsKKyAgICBUVF9VSW50ICAgICBpOworICAgIFRUX0YyNkRvdDYgIHgsIHgxLCB4MiwgZDEsIGQyOworCisgICAgaWYgKCBwMSA+IHAyICkKKyAgICAgIHJldHVybjsKKworICAgIHgxID0gTElOSy0+b3Jnc1tyZWYxXS54OworICAgIGQxID0gTElOSy0+Y3Vyc1tyZWYxXS54IC0gTElOSy0+b3Jnc1tyZWYxXS54OworICAgIHgyID0gTElOSy0+b3Jnc1tyZWYyXS54OworICAgIGQyID0gTElOSy0+Y3Vyc1tyZWYyXS54IC0gTElOSy0+b3Jnc1tyZWYyXS54OworCisgICAgaWYgKCB4MSA9PSB4MiApCisgICAgeworICAgICAgZm9yICggaSA9IHAxOyBpIDw9IHAyOyBpKysgKQorICAgICAgeworICAgICAgICB4ID0gTElOSy0+b3Jnc1tpXS54OworCisgICAgICAgIGlmICggeCA8PSB4MSApCisgICAgICAgICAgeCArPSBkMTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHggKz0gZDI7CisKKyAgICAgICAgTElOSy0+Y3Vyc1tpXS54ID0geDsKKyAgICAgIH0KKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoIHgxIDwgeDIgKQorICAgIHsKKyAgICAgIGZvciAoIGkgPSBwMTsgaSA8PSBwMjsgaSsrICkKKyAgICAgIHsKKyAgICAgICAgeCA9IExJTkstPm9yZ3NbaV0ueDsKKworICAgICAgICBpZiAoIHggPD0geDEgKQorICAgICAgICAgIHggKz0gZDE7CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGlmICggeCA+PSB4MiApCisgICAgICAgICAgICB4ICs9IGQyOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHggPSBMSU5LLT5jdXJzW3JlZjFdLnggKworICAgICAgICAgICAgICAgICAgVFRfTVVMRElWKCB4IC0geDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExJTkstPmN1cnNbcmVmMl0ueCAtIExJTkstPmN1cnNbcmVmMV0ueCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeDIgLSB4MSApOworICAgICAgICB9CisgICAgICAgIExJTkstPmN1cnNbaV0ueCA9IHg7CisgICAgICB9CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyogeDIgPCB4MSAqLworCisgICAgZm9yICggaSA9IHAxOyBpIDw9IHAyOyBpKysgKQorICAgIHsKKyAgICAgIHggPSBMSU5LLT5vcmdzW2ldLng7CisgICAgICBpZiAoIHggPD0geDIgKQorICAgICAgICB4ICs9IGQyOworICAgICAgZWxzZQorICAgICAgeworICAgICAgICBpZiAoIHggPj0geDEgKQorICAgICAgICAgIHggKz0gZDE7CisgICAgICAgIGVsc2UKKyAgICAgICAgICB4ID0gTElOSy0+Y3Vyc1tyZWYxXS54ICsKKyAgICAgICAgICAgICAgVFRfTVVMRElWKCB4IC0geDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgTElOSy0+Y3Vyc1tyZWYyXS54IC0gTElOSy0+Y3Vyc1tyZWYxXS54LAorICAgICAgICAgICAgICAgICAgICAgICAgIHgyIC0geDEgKTsKKyAgICAgIH0KKyAgICAgIExJTkstPmN1cnNbaV0ueCA9IHg7CisgICAgfQorICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIElVUFthXTogICAgICAgSW50ZXJwb2xhdGUgVW50b3VjaGVkIFBvaW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBPcGNvZGUgcmFuZ2U6IDB4MzAtMHgzMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogU3RhY2s6ICAgICAgICAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBzdGF0aWMKKyAgdm9pZCAgSW5zX0lVUCggSU5TX0FSRyApCisgIHsKKyAgICBzdHJ1Y3QgTE9DX0luc19JVVAgIFY7CisgICAgVFRfQnl0ZSAgICAgICAgICAgICBtYXNrOworCisgICAgVFRfVUludCAgIGZpcnN0X3BvaW50OyAgIC8qIGZpcnN0IHBvaW50IG9mIGNvbnRvdXIgICAgICAgICovCisgICAgVFRfVUludCAgIGVuZF9wb2ludDsgICAgIC8qIGVuZCBwb2ludCAobGFzdCsxKSBvZiBjb250b3VyICovCisKKyAgICBUVF9VSW50ICAgZmlyc3RfdG91Y2hlZDsgLyogZmlyc3QgdG91Y2hlZCBwb2ludCBpbiBjb250b3VyICAgKi8KKyAgICBUVF9VSW50ICAgY3VyX3RvdWNoZWQ7ICAgLyogY3VycmVudCB0b3VjaGVkIHBvaW50IGluIGNvbnRvdXIgKi8KKworICAgIFRUX1VJbnQgICBwb2ludDsgICAgICAgICAvKiBjdXJyZW50IHBvaW50ICAgKi8KKyAgICBUVF9TaG9ydCAgY29udG91cjsgICAgICAgLyogY3VycmVudCBjb250b3VyICovCisKKworICAgIFVOVVNFRF9BUkc7CisKKyAgICBpZiAoIENVUi5vcGNvZGUgJiAxICkKKyAgICB7CisgICAgICBtYXNrICAgPSBGVF9DdXJ2ZV9UYWdfVG91Y2hfWDsKKyAgICAgIFYub3JncyA9IENVUi5wdHMub3JnOworICAgICAgVi5jdXJzID0gQ1VSLnB0cy5jdXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBtYXNrICAgPSBGVF9DdXJ2ZV9UYWdfVG91Y2hfWTsKKyAgICAgIFYub3JncyA9IChUVF9WZWN0b3IqKSggKChUVF9GMjZEb3Q2KilDVVIucHRzLm9yZykgKyAxICk7CisgICAgICBWLmN1cnMgPSAoVFRfVmVjdG9yKikoICgoVFRfRjI2RG90NiopQ1VSLnB0cy5jdXIpICsgMSApOworICAgIH0KKworICAgIGNvbnRvdXIgPSAwOworICAgIHBvaW50ICAgPSAwOworCisgICAgZG8KKyAgICB7CisgICAgICBlbmRfcG9pbnQgICA9IENVUi5wdHMuY29udG91cnNbY29udG91cl07CisgICAgICBmaXJzdF9wb2ludCA9IHBvaW50OworCisgICAgICB3aGlsZSAoIHBvaW50IDw9IGVuZF9wb2ludCAmJiAoQ1VSLnB0cy50b3VjaFtwb2ludF0gJiBtYXNrKSA9PSAwICkKKyAgICAgICAgcG9pbnQrKzsKKworICAgICAgaWYgKCBwb2ludCA8PSBlbmRfcG9pbnQgKQorICAgICAgeworICAgICAgICBmaXJzdF90b3VjaGVkID0gcG9pbnQ7CisgICAgICAgIGN1cl90b3VjaGVkICAgPSBwb2ludDsKKworICAgICAgICBwb2ludCsrOworCisgICAgICAgIHdoaWxlICggcG9pbnQgPD0gZW5kX3BvaW50ICkKKyAgICAgICAgeworICAgICAgICAgIGlmICggKENVUi5wdHMudG91Y2hbcG9pbnRdICYgbWFzaykgIT0gMCApCisgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBwb2ludCA+IDAgKQorICAgICAgICAgICAgICBJbnRlcnAoIGN1cl90b3VjaGVkICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICBwb2ludCAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgY3VyX3RvdWNoZWQsCisgICAgICAgICAgICAgICAgICAgICAgcG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgJlYgKTsKKyAgICAgICAgICAgIGN1cl90b3VjaGVkID0gcG9pbnQ7CisgICAgICAgICAgfQorCisgICAgICAgICAgcG9pbnQrKzsKKyAgICAgICAgfQorCisgICAgICAgIGlmICggY3VyX3RvdWNoZWQgPT0gZmlyc3RfdG91Y2hlZCApCisgICAgICAgICAgU2hpZnQoIGZpcnN0X3BvaW50LCBlbmRfcG9pbnQsIGN1cl90b3VjaGVkLCAmViApOworICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBJbnRlcnAoIChUVF9VU2hvcnQpKGN1cl90b3VjaGVkICsgMSksCisgICAgICAgICAgICAgICAgICBlbmRfcG9pbnQsCisgICAgICAgICAgICAgICAgICBjdXJfdG91Y2hlZCwKKyAgICAgICAgICAgICAgICAgIGZpcnN0X3RvdWNoZWQsCisgICAgICAgICAgICAgICAgICAmViApOworCisgICAgICAgICAgaWYgKCBmaXJzdF90b3VjaGVkID4gMCApCisgICAgICAgICAgICBJbnRlcnAoIGZpcnN0X3BvaW50LAorICAgICAgICAgICAgICAgICAgICBmaXJzdF90b3VjaGVkIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgY3VyX3RvdWNoZWQsCisgICAgICAgICAgICAgICAgICAgIGZpcnN0X3RvdWNoZWQsCisgICAgICAgICAgICAgICAgICAgICZWICk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGNvbnRvdXIrKzsKKyAgICB9IHdoaWxlICggY29udG91ciA8IENVUi5wdHMubl9jb250b3VycyApOworICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIERFTFRBUG5bXTogICAgREVMVEEgZXhjZXB0aW9ucyBQMSwgUDIsIFAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBPcGNvZGUgcmFuZ2U6IDB4NUQsMHg3MSwweDcyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogU3RhY2s6ICAgICAgICB1aW50MzIgKDIgKiB1aW50MzIpLi4uIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBzdGF0aWMKKyAgdm9pZCAgSW5zX0RFTFRBUCggSU5TX0FSRyApCisgIHsKKyAgICBUVF9VTG9uZyAgIGssIG51bXA7CisgICAgVFRfVVNob3J0ICBBOworICAgIFRUX1VMb25nICAgQzsKKyAgICBUVF9Mb25nICAgIEI7CisKKworICAgIG51bXAgPSAoVFRfVUxvbmcpYXJnc1swXTsgICAvKiBzb21lIHBvaW50cyB0aGVvcmV0aWNhbGx5IG1heSBvY2N1ciBtb3JlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYW4gb25jZSwgdGh1cyBVU2hvcnQgaXNuJ3QgZW5vdWdoICovCisKKyAgICBmb3IgKCBrID0gMTsgayA8PSBudW1wOyBrKysgKQorICAgIHsKKyAgICAgIGlmICggQ1VSLmFyZ3MgPCAyICkKKyAgICAgIHsKKyAgICAgICAgQ1VSLmVycm9yID0gVFRfRXJyX1Rvb19GZXdfQXJndW1lbnRzOworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIENVUi5hcmdzIC09IDI7CisKKyAgICAgIEEgPSAoVFRfVVNob3J0KUNVUi5zdGFja1tDVVIuYXJncyArIDFdOworICAgICAgQiA9IENVUi5zdGFja1tDVVIuYXJnc107CisKKyAgICAgIC8qIFhYWCA6IGJlY2F1c2Ugc29tZSBwb3B1bGFyIGZvbnRzIGNvbnRhaW4gc29tZSBpbnZhbGlkIERlbHRhUCAqLworICAgICAgLyogICAgICAgaW5zdHJ1Y3Rpb25zLCB3ZSBzaW1wbHkgaWdub3JlIHRoZW0gd2hlbiB0aGUgc3RhY2tlZCAgICovCisgICAgICAvKiAgICAgICBwb2ludCByZWZlcmVuY2UgaXMgb2ZmIGxpbWl0LCByYXRoZXIgdGhhbiByZXR1cm5pbmcgYW4gKi8KKyAgICAgIC8qICAgICAgIGVycm9yLiBBcyBhIGRlbHRhIGluc3RydWN0aW9uIGRvZXNuJ3QgY2hhbmdlIGEgZ2x5cGggICAqLworICAgICAgLyogICAgICAgaW4gZ3JlYXQgd2F5cywgdGhpcyBzaG91bGRuJ3QgYmUgYSBwcm9ibGVtLi4gICAgICAgICAgICovCisKKyAgICAgIGlmICggIUJPVU5EUyggQSwgQ1VSLnpwMC5uX3BvaW50cyApICkKKyAgICAgIHsKKyAgICAgICAgQyA9ICgoVFRfVUxvbmcpQiAmIDB4RjApID4+IDQ7CisKKyAgICAgICAgc3dpdGNoICggQ1VSLm9wY29kZSApCisgICAgICAgIHsKKyAgICAgICAgY2FzZSAweDVEOgorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMHg3MToKKyAgICAgICAgICBDICs9IDE2OworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMHg3MjoKKyAgICAgICAgICBDICs9IDMyOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgQyArPSBDVVIuR1MuZGVsdGFfYmFzZTsKKworICAgICAgICBpZiAoIENVUlJFTlRfUHBlbSgpID09IChUVF9Mb25nKUMgKQorICAgICAgICB7CisgICAgICAgICAgQiA9ICgoVFRfVUxvbmcpQiAmIDB4RikgLSA4OworICAgICAgICAgIGlmICggQiA+PSAwICkKKyAgICAgICAgICAgIEIrKzsKKyAgICAgICAgICBCID0gQiAqIDY0IC8gKDFMIDw8IENVUi5HUy5kZWx0YV9zaGlmdCk7CisKKyAgICAgICAgICBDVVJfRnVuY19tb3ZlKCAmQ1VSLnpwMCwgQSwgQiApOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIGlmICggQ1VSLnBlZGFudGljX2hpbnRpbmcgKQorICAgICAgICAgIENVUi5lcnJvciA9IFRUX0Vycl9JbnZhbGlkX1JlZmVyZW5jZTsKKyAgICB9CisKKyAgICBDVVIubmV3X3RvcCA9IENVUi5hcmdzOworICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIERFTFRBQ25bXTogICAgREVMVEEgZXhjZXB0aW9ucyBDMSwgQzIsIEMzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBPcGNvZGUgcmFuZ2U6IDB4NzMsMHg3NCwweDc1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogU3RhY2s6ICAgICAgICB1aW50MzIgKDIgKiB1aW50MzIpLi4uIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBzdGF0aWMKKyAgdm9pZCAgSW5zX0RFTFRBQyggSU5TX0FSRyApCisgIHsKKyAgICBUVF9VTG9uZyAgbnVtcCwgazsKKyAgICBUVF9VTG9uZyAgQSwgQzsKKyAgICBUVF9Mb25nICAgQjsKKworCisgICAgbnVtcCA9IChUVF9VTG9uZylhcmdzWzBdOworCisgICAgZm9yICggayA9IDE7IGsgPD0gbnVtcDsgaysrICkKKyAgICB7CisgICAgICBpZiAoIENVUi5hcmdzIDwgMiApCisgICAgICB7CisgICAgICAgIENVUi5lcnJvciA9IFRUX0Vycl9Ub29fRmV3X0FyZ3VtZW50czsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBDVVIuYXJncyAtPSAyOworCisgICAgICBBID0gKFRUX1VMb25nKUNVUi5zdGFja1tDVVIuYXJncyArIDFdOworICAgICAgQiA9IENVUi5zdGFja1tDVVIuYXJnc107CisKKyAgICAgIGlmICggQk9VTkRTKCBBLCBDVVIuY3Z0U2l6ZSApICkKKyAgICAgIHsKKyAgICAgICAgaWYgKENVUi5wZWRhbnRpY19oaW50aW5nKQorICAgICAgICB7CisgICAgICAgICAgQ1VSLmVycm9yID0gVFRfRXJyX0ludmFsaWRfUmVmZXJlbmNlOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBDID0gKChUVF9VTG9uZylCICYgMHhGMCkgPj4gNDsKKworICAgICAgICBzd2l0Y2ggKCBDVVIub3Bjb2RlICkKKyAgICAgICAgeworICAgICAgICBjYXNlIDB4NzM6CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAweDc0OgorICAgICAgICAgIEMgKz0gMTY7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAweDc1OgorICAgICAgICAgIEMgKz0gMzI7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBDICs9IENVUi5HUy5kZWx0YV9iYXNlOworCisgICAgICAgIGlmICggQ1VSUkVOVF9QcGVtKCkgPT0gKFRUX0xvbmcpQyApCisgICAgICAgIHsKKyAgICAgICAgICBCID0gKChUVF9VTG9uZylCICYgMHhGKSAtIDg7CisgICAgICAgICAgaWYgKCBCID49IDAgKQorICAgICAgICAgICAgQisrOworICAgICAgICAgIEIgPSBCICogNjQgLyAoMUwgPDwgQ1VSLkdTLmRlbHRhX3NoaWZ0KTsKKworICAgICAgICAgIENVUl9GdW5jX21vdmVfY3Z0KCBBLCBCICk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBDVVIubmV3X3RvcCA9IENVUi5hcmdzOworICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIE1JU0MuIElOU1RSVUNUSU9OUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIEdFVElORk9bXTogICAgR0VUIElORk9ybWF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBPcGNvZGUgcmFuZ2U6IDB4ODggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogU3RhY2s6ICAgICAgICB1aW50MzIgLS0+IHVpbnQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBYWFg6IEFjY29yZGluZyB0byBBcHBsZSBzcGVjcywgYml0cyAxICYgMiBvZiB0aGUgYXJndW1lbnQgb3VnaHQgdG8gYmUgKi8KKyAgLyogICAgICBjb25zdWx0ZWQgYmVmb3JlIHJvdGF0ZWQvc3RyZXRjaGVkIGluZm8gaXMgcmV0dXJuZWQuICAgICAgICAgICAgICovCisgIHN0YXRpYworICB2b2lkICBJbnNfR0VUSU5GTyggSU5TX0FSRyApCisgIHsKKyAgICBUVF9Mb25nICBLOworCisKKyAgICBLID0gMDsKKworICAgIC8qIFdlIHJldHVybiB0aGVuIFdpbmRvd3MgMy4xIHZlcnNpb24gbnVtYmVyICovCisgICAgLyogZm9yIHRoZSBmb250IHNjYWxlciAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBpZiAoIChhcmdzWzBdICYgMSkgIT0gMCApCisgICAgICBLID0gMzsKKworICAgIC8qIEhhcyB0aGUgZ2x5cGggYmVlbiByb3RhdGVkID8gKi8KKyAgICBpZiAoIENVUi50dF9tZXRyaWNzLnJvdGF0ZWQgKQorICAgICAgSyB8PSAweDgwOworCisgICAgLyogSGFzIHRoZSBnbHlwaCBiZWVuIHN0cmV0Y2hlZCA/ICovCisgICAgaWYgKCBDVVIudHRfbWV0cmljcy5zdHJldGNoZWQgKQorICAgICAgSyB8PSAweDEwMDsKKworICAgIGFyZ3NbMF0gPSBLOworICB9CisKKworICBzdGF0aWMKKyAgdm9pZCAgSW5zX1VOS05PV04oIElOU19BUkcgKQorICB7CisgICAgVFRfRGVmUmVjb3JkKiAgZGVmICAgPSBDVVIuSURlZnM7CisgICAgVFRfRGVmUmVjb3JkKiAgbGltaXQgPSBkZWYgKyBDVVIubnVtSURlZnM7CisgICAgCisgICAgVU5VU0VEX0FSRzsKKyAKKyAgICBmb3IgKCA7IGRlZiA8IGxpbWl0OyBkZWYrKyApCisgICAgeworICAgICAgaWYgKGRlZi0+b3BjID09IENVUi5vcGNvZGUgJiYgZGVmLT5hY3RpdmUgKQorICAgICAgeworICAgICAgICBUVF9DYWxsUmVjKiAgY2FsbDsKKyAgICAgICAgCisgICAgICAgIGlmICggQ1VSLmNhbGxUb3AgPj0gQ1VSLmNhbGxTaXplICkKKyAgICAgICAgeworICAgICAgICAgIENVUi5lcnJvciA9IFRUX0Vycl9TdGFja19PdmVyZmxvdzsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGNhbGwgPSBDVVIuY2FsbFN0YWNrICsgQ1VSLmNhbGxUb3ArKzsKKworICAgICAgICBjYWxsLT5DYWxsZXJfUmFuZ2UgPSBDVVIuY3VyUmFuZ2U7CisgICAgICAgIGNhbGwtPkNhbGxlcl9JUCAgICA9IENVUi5JUCsxOworICAgICAgICBjYWxsLT5DdXJfQ291bnQgICAgPSAxOworICAgICAgICBjYWxsLT5DdXJfUmVzdGFydCAgPSBkZWYtPnN0YXJ0OworICAgICAgICAKKyAgICAgICAgSU5TX0dvdG9fQ29kZVJhbmdlKCBkZWYtPnJhbmdlLCBkZWYtPnN0YXJ0ICk7CisgICAgICAgIAorICAgICAgICBDVVIuc3RlcF9pbnMgPSBGQUxTRTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgIH0KKworICAgIENVUi5lcnJvciA9IFRUX0Vycl9JbnZhbGlkX09wY29kZTsKKyAgfQorCisKKyNpZm5kZWYgVFRfQ09ORklHX09QVElPTl9JTlRFUlBSRVRFUl9TV0lUQ0gKKyAgc3RhdGljCisgIFRJbnN0cnVjdGlvbl9GdW5jdGlvbiAgSW5zdHJ1Y3RfRGlzcGF0Y2hbMjU2XSA9CisgIHsKKyAgICAvKiBPcGNvZGVzIGFyZSBnYXRoZXJlZCBpbiBncm91cHMgb2YgMTYuICovCisgICAgLyogUGxlYXNlIGtlZXAgdGhlIHNwYWNlcyBhcyB0aGV5IGFyZS4gICAqLworCisgICAgLyogIFNWVENBICB5ICAqLyAgSW5zX1NWVENBLAorICAgIC8qICBTVlRDQSAgeCAgKi8gIEluc19TVlRDQSwKKyAgICAvKiAgU1B2VENBIHkgICovICBJbnNfU1BWVENBLAorICAgIC8qICBTUHZUQ0EgeCAgKi8gIEluc19TUFZUQ0EsCisgICAgLyogIFNGdlRDQSB5ICAqLyAgSW5zX1NGVlRDQSwKKyAgICAvKiAgU0Z2VENBIHggICovICBJbnNfU0ZWVENBLAorICAgIC8qICBTUHZUTCAvLyAgKi8gIEluc19TUFZUTCwKKyAgICAvKiAgU1B2VEwgKyAgICovICBJbnNfU1BWVEwsCisgICAgLyogIFNGdlRMIC8vICAqLyAgSW5zX1NGVlRMLAorICAgIC8qICBTRnZUTCArICAgKi8gIEluc19TRlZUTCwKKyAgICAvKiAgU1B2RlMgICAgICovICBJbnNfU1BWRlMsCisgICAgLyogIFNGdkZTICAgICAqLyAgSW5zX1NGVkZTLAorICAgIC8qICBHUFYgICAgICAgKi8gIEluc19HUFYsCisgICAgLyogIEdGViAgICAgICAqLyAgSW5zX0dGViwKKyAgICAvKiAgU0Z2VFB2ICAgICovICBJbnNfU0ZWVFBWLAorICAgIC8qICBJU0VDVCAgICAgKi8gIEluc19JU0VDVCwKKworICAgIC8qICBTUlAwICAgICAgKi8gIEluc19TUlAwLAorICAgIC8qICBTUlAxICAgICAgKi8gIEluc19TUlAxLAorICAgIC8qICBTUlAyICAgICAgKi8gIEluc19TUlAyLAorICAgIC8qICBTWlAwICAgICAgKi8gIEluc19TWlAwLAorICAgIC8qICBTWlAxICAgICAgKi8gIEluc19TWlAxLAorICAgIC8qICBTWlAyICAgICAgKi8gIEluc19TWlAyLAorICAgIC8qICBTWlBTICAgICAgKi8gIEluc19TWlBTLAorICAgIC8qICBTTE9PUCAgICAgKi8gIEluc19TTE9PUCwKKyAgICAvKiAgUlRHICAgICAgICovICBJbnNfUlRHLAorICAgIC8qICBSVEhHICAgICAgKi8gIEluc19SVEhHLAorICAgIC8qICBTTUQgICAgICAgKi8gIEluc19TTUQsCisgICAgLyogIEVMU0UgICAgICAqLyAgSW5zX0VMU0UsCisgICAgLyogIEpNUFIgICAgICAqLyAgSW5zX0pNUFIsCisgICAgLyogIFNDdlRDaSAgICAqLyAgSW5zX1NDVlRDSSwKKyAgICAvKiAgU1N3Q2kgICAgICovICBJbnNfU1NXQ0ksCisgICAgLyogIFNTVyAgICAgICAqLyAgSW5zX1NTVywKKworICAgIC8qICBEVVAgICAgICAgKi8gIEluc19EVVAsCisgICAgLyogIFBPUCAgICAgICAqLyAgSW5zX1BPUCwKKyAgICAvKiAgQ0xFQVIgICAgICovICBJbnNfQ0xFQVIsCisgICAgLyogIFNXQVAgICAgICAqLyAgSW5zX1NXQVAsCisgICAgLyogIERFUFRIICAgICAqLyAgSW5zX0RFUFRILAorICAgIC8qICBDSU5ERVggICAgKi8gIEluc19DSU5ERVgsCisgICAgLyogIE1JTkRFWCAgICAqLyAgSW5zX01JTkRFWCwKKyAgICAvKiAgQWxpZ25QVFMgICovICBJbnNfQUxJR05QVFMsCisgICAgLyogIElOU18weDI4ICAqLyAgSW5zX1VOS05PV04sCisgICAgLyogIFVUUCAgICAgICAqLyAgSW5zX1VUUCwKKyAgICAvKiAgTE9PUENBTEwgICovICBJbnNfTE9PUENBTEwsCisgICAgLyogIENBTEwgICAgICAqLyAgSW5zX0NBTEwsCisgICAgLyogIEZERUYgICAgICAqLyAgSW5zX0ZERUYsCisgICAgLyogIEVOREYgICAgICAqLyAgSW5zX0VOREYsCisgICAgLyogIE1EQVBbMF0gICAqLyAgSW5zX01EQVAsCisgICAgLyogIE1EQVBbMV0gICAqLyAgSW5zX01EQVAsCisKKyAgICAvKiAgSVVQWzBdICAgICovICBJbnNfSVVQLAorICAgIC8qICBJVVBbMV0gICAgKi8gIEluc19JVVAsCisgICAgLyogIFNIUFswXSAgICAqLyAgSW5zX1NIUCwKKyAgICAvKiAgU0hQWzFdICAgICovICBJbnNfU0hQLAorICAgIC8qICBTSENbMF0gICAgKi8gIEluc19TSEMsCisgICAgLyogIFNIQ1sxXSAgICAqLyAgSW5zX1NIQywKKyAgICAvKiAgU0haWzBdICAgICovICBJbnNfU0haLAorICAgIC8qICBTSFpbMV0gICAgKi8gIEluc19TSFosCisgICAgLyogIFNIUElYICAgICAqLyAgSW5zX1NIUElYLAorICAgIC8qICBJUCAgICAgICAgKi8gIEluc19JUCwKKyAgICAvKiAgTVNJUlBbMF0gICovICBJbnNfTVNJUlAsCisgICAgLyogIE1TSVJQWzFdICAqLyAgSW5zX01TSVJQLAorICAgIC8qICBBbGlnblJQICAgKi8gIEluc19BTElHTlJQLAorICAgIC8qICBSVERHICAgICAgKi8gIEluc19SVERHLAorICAgIC8qICBNSUFQWzBdICAgKi8gIEluc19NSUFQLAorICAgIC8qICBNSUFQWzFdICAgKi8gIEluc19NSUFQLAorCisgICAgLyogIE5QdXNoQiAgICAqLyAgSW5zX05QVVNIQiwKKyAgICAvKiAgTlB1c2hXICAgICovICBJbnNfTlBVU0hXLAorICAgIC8qICBXUyAgICAgICAgKi8gIEluc19XUywKKyAgICAvKiAgUlMgICAgICAgICovICBJbnNfUlMsCisgICAgLyogIFdDdnRQICAgICAqLyAgSW5zX1dDVlRQLAorICAgIC8qICBSQ3Z0ICAgICAgKi8gIEluc19SQ1ZULAorICAgIC8qICBHQ1swXSAgICAgKi8gIEluc19HQywKKyAgICAvKiAgR0NbMV0gICAgICovICBJbnNfR0MsCisgICAgLyogIFNDRlMgICAgICAqLyAgSW5zX1NDRlMsCisgICAgLyogIE1EWzBdICAgICAqLyAgSW5zX01ELAorICAgIC8qICBNRFsxXSAgICAgKi8gIEluc19NRCwKKyAgICAvKiAgTVBQRU0gICAgICovICBJbnNfTVBQRU0sCisgICAgLyogIE1QUyAgICAgICAqLyAgSW5zX01QUywKKyAgICAvKiAgRmxpcE9OICAgICovICBJbnNfRkxJUE9OLAorICAgIC8qICBGbGlwT0ZGICAgKi8gIEluc19GTElQT0ZGLAorICAgIC8qICBERUJVRyAgICAgKi8gIEluc19ERUJVRywKKworICAgIC8qICBMVCAgICAgICAgKi8gIEluc19MVCwKKyAgICAvKiAgTFRFUSAgICAgICovICBJbnNfTFRFUSwKKyAgICAvKiAgR1QgICAgICAgICovICBJbnNfR1QsCisgICAgLyogIEdURVEgICAgICAqLyAgSW5zX0dURVEsCisgICAgLyogIEVRICAgICAgICAqLyAgSW5zX0VRLAorICAgIC8qICBORVEgICAgICAgKi8gIEluc19ORVEsCisgICAgLyogIE9ERCAgICAgICAqLyAgSW5zX09ERCwKKyAgICAvKiAgRVZFTiAgICAgICovICBJbnNfRVZFTiwKKyAgICAvKiAgSUYgICAgICAgICovICBJbnNfSUYsCisgICAgLyogIEVJRiAgICAgICAqLyAgSW5zX0VJRiwKKyAgICAvKiAgQU5EICAgICAgICovICBJbnNfQU5ELAorICAgIC8qICBPUiAgICAgICAgKi8gIEluc19PUiwKKyAgICAvKiAgTk9UICAgICAgICovICBJbnNfTk9ULAorICAgIC8qICBEZWx0YVAxICAgKi8gIEluc19ERUxUQVAsCisgICAgLyogIFNEQiAgICAgICAqLyAgSW5zX1NEQiwKKyAgICAvKiAgU0RTICAgICAgICovICBJbnNfU0RTLAorCisgICAgLyogIEFERCAgICAgICAqLyAgSW5zX0FERCwKKyAgICAvKiAgU1VCICAgICAgICovICBJbnNfU1VCLAorICAgIC8qICBESVYgICAgICAgKi8gIEluc19ESVYsCisgICAgLyogIE1VTCAgICAgICAqLyAgSW5zX01VTCwKKyAgICAvKiAgQUJTICAgICAgICovICBJbnNfQUJTLAorICAgIC8qICBORUcgICAgICAgKi8gIEluc19ORUcsCisgICAgLyogIEZMT09SICAgICAqLyAgSW5zX0ZMT09SLAorICAgIC8qICBDRUlMSU5HICAgKi8gIEluc19DRUlMSU5HLAorICAgIC8qICBST1VORFswXSAgKi8gIEluc19ST1VORCwKKyAgICAvKiAgUk9VTkRbMV0gICovICBJbnNfUk9VTkQsCisgICAgLyogIFJPVU5EWzJdICAqLyAgSW5zX1JPVU5ELAorICAgIC8qICBST1VORFszXSAgKi8gIEluc19ST1VORCwKKyAgICAvKiAgTlJPVU5EWzBdICovICBJbnNfTlJPVU5ELAorICAgIC8qICBOUk9VTkRbMV0gKi8gIEluc19OUk9VTkQsCisgICAgLyogIE5ST1VORFsyXSAqLyAgSW5zX05ST1VORCwKKyAgICAvKiAgTlJPVU5EWzNdICovICBJbnNfTlJPVU5ELAorCisgICAgLyogIFdDdnRGICAgICAqLyAgSW5zX1dDVlRGLAorICAgIC8qICBEZWx0YVAyICAgKi8gIEluc19ERUxUQVAsCisgICAgLyogIERlbHRhUDMgICAqLyAgSW5zX0RFTFRBUCwKKyAgICAvKiAgRGVsdGFDblswXSAqLyBJbnNfREVMVEFDLAorICAgIC8qICBEZWx0YUNuWzFdICovIEluc19ERUxUQUMsCisgICAgLyogIERlbHRhQ25bMl0gKi8gSW5zX0RFTFRBQywKKyAgICAvKiAgU1JPVU5EICAgICovICBJbnNfU1JPVU5ELAorICAgIC8qICBTNDVSb3VuZCAgKi8gIEluc19TNDVST1VORCwKKyAgICAvKiAgSlJPVCAgICAgICovICBJbnNfSlJPVCwKKyAgICAvKiAgSlJPRiAgICAgICovICBJbnNfSlJPRiwKKyAgICAvKiAgUk9GRiAgICAgICovICBJbnNfUk9GRiwKKyAgICAvKiAgSU5TXzB4N0IgICovICBJbnNfVU5LTk9XTiwKKyAgICAvKiAgUlVURyAgICAgICovICBJbnNfUlVURywKKyAgICAvKiAgUkRURyAgICAgICovICBJbnNfUkRURywKKyAgICAvKiAgU0FOR1cgICAgICovICBJbnNfU0FOR1csCisgICAgLyogIEFBICAgICAgICAqLyAgSW5zX0FBLAorCisgICAgLyogIEZsaXBQVCAgICAqLyAgSW5zX0ZMSVBQVCwKKyAgICAvKiAgRmxpcFJnT04gICovICBJbnNfRkxJUFJHT04sCisgICAgLyogIEZsaXBSZ09GRiAqLyAgSW5zX0ZMSVBSR09GRiwKKyAgICAvKiAgSU5TXzB4ODMgICovICBJbnNfVU5LTk9XTiwKKyAgICAvKiAgSU5TXzB4ODQgICovICBJbnNfVU5LTk9XTiwKKyAgICAvKiAgU2NhbkNUUkwgICovICBJbnNfU0NBTkNUUkwsCisgICAgLyogIFNEUFZUTFswXSAqLyAgSW5zX1NEUFZUTCwKKyAgICAvKiAgU0RQVlRMWzFdICovICBJbnNfU0RQVlRMLAorICAgIC8qICBHZXRJTkZPICAgKi8gIEluc19HRVRJTkZPLAorICAgIC8qICBJREVGICAgICAgKi8gIEluc19JREVGLAorICAgIC8qICBST0xMICAgICAgKi8gIEluc19ST0xMLAorICAgIC8qICBNQVggICAgICAgKi8gIEluc19NQVgsCisgICAgLyogIE1JTiAgICAgICAqLyAgSW5zX01JTiwKKyAgICAvKiAgU2NhblRZUEUgICovICBJbnNfU0NBTlRZUEUsCisgICAgLyogIEluc3RDVFJMICAqLyAgSW5zX0lOU1RDVFJMLAorICAgIC8qICBJTlNfMHg4RiAgKi8gIEluc19VTktOT1dOLAorCisgICAgLyogIElOU18weDkwICAqLyAgIEluc19VTktOT1dOLAorICAgIC8qICBJTlNfMHg5MSAgKi8gICBJbnNfVU5LTk9XTiwKKyAgICAvKiAgSU5TXzB4OTIgICovICAgSW5zX1VOS05PV04sCisgICAgLyogIElOU18weDkzICAqLyAgIEluc19VTktOT1dOLAorICAgIC8qICBJTlNfMHg5NCAgKi8gICBJbnNfVU5LTk9XTiwKKyAgICAvKiAgSU5TXzB4OTUgICovICAgSW5zX1VOS05PV04sCisgICAgLyogIElOU18weDk2ICAqLyAgIEluc19VTktOT1dOLAorICAgIC8qICBJTlNfMHg5NyAgKi8gICBJbnNfVU5LTk9XTiwKKyAgICAvKiAgSU5TXzB4OTggICovICAgSW5zX1VOS05PV04sCisgICAgLyogIElOU18weDk5ICAqLyAgIEluc19VTktOT1dOLAorICAgIC8qICBJTlNfMHg5QSAgKi8gICBJbnNfVU5LTk9XTiwKKyAgICAvKiAgSU5TXzB4OUIgICovICAgSW5zX1VOS05PV04sCisgICAgLyogIElOU18weDlDICAqLyAgIEluc19VTktOT1dOLAorICAgIC8qICBJTlNfMHg5RCAgKi8gICBJbnNfVU5LTk9XTiwKKyAgICAvKiAgSU5TXzB4OUUgICovICAgSW5zX1VOS05PV04sCisgICAgLyogIElOU18weDlGICAqLyAgIEluc19VTktOT1dOLAorCisgICAgLyogIElOU18weEEwICAqLyAgIEluc19VTktOT1dOLAorICAgIC8qICBJTlNfMHhBMSAgKi8gICBJbnNfVU5LTk9XTiwKKyAgICAvKiAgSU5TXzB4QTIgICovICAgSW5zX1VOS05PV04sCisgICAgLyogIElOU18weEEzICAqLyAgIEluc19VTktOT1dOLAorICAgIC8qICBJTlNfMHhBNCAgKi8gICBJbnNfVU5LTk9XTiwKKyAgICAvKiAgSU5TXzB4QTUgICovICAgSW5zX1VOS05PV04sCisgICAgLyogIElOU18weEE2ICAqLyAgIEluc19VTktOT1dOLAorICAgIC8qICBJTlNfMHhBNyAgKi8gICBJbnNfVU5LTk9XTiwKKyAgICAvKiAgSU5TXzB4QTggICovICAgSW5zX1VOS05PV04sCisgICAgLyogIElOU18weEE5ICAqLyAgIEluc19VTktOT1dOLAorICAgIC8qICBJTlNfMHhBQSAgKi8gICBJbnNfVU5LTk9XTiwKKyAgICAvKiAgSU5TXzB4QUIgICovICAgSW5zX1VOS05PV04sCisgICAgLyogIElOU18weEFDICAqLyAgIEluc19VTktOT1dOLAorICAgIC8qICBJTlNfMHhBRCAgKi8gICBJbnNfVU5LTk9XTiwKKyAgICAvKiAgSU5TXzB4QUUgICovICAgSW5zX1VOS05PV04sCisgICAgLyogIElOU18weEFGICAqLyAgIEluc19VTktOT1dOLAorCisgICAgLyogIFB1c2hCWzBdICAqLyAgSW5zX1BVU0hCLAorICAgIC8qICBQdXNoQlsxXSAgKi8gIEluc19QVVNIQiwKKyAgICAvKiAgUHVzaEJbMl0gICovICBJbnNfUFVTSEIsCisgICAgLyogIFB1c2hCWzNdICAqLyAgSW5zX1BVU0hCLAorICAgIC8qICBQdXNoQls0XSAgKi8gIEluc19QVVNIQiwKKyAgICAvKiAgUHVzaEJbNV0gICovICBJbnNfUFVTSEIsCisgICAgLyogIFB1c2hCWzZdICAqLyAgSW5zX1BVU0hCLAorICAgIC8qICBQdXNoQls3XSAgKi8gIEluc19QVVNIQiwKKyAgICAvKiAgUHVzaFdbMF0gICovICBJbnNfUFVTSFcsCisgICAgLyogIFB1c2hXWzFdICAqLyAgSW5zX1BVU0hXLAorICAgIC8qICBQdXNoV1syXSAgKi8gIEluc19QVVNIVywKKyAgICAvKiAgUHVzaFdbM10gICovICBJbnNfUFVTSFcsCisgICAgLyogIFB1c2hXWzRdICAqLyAgSW5zX1BVU0hXLAorICAgIC8qICBQdXNoV1s1XSAgKi8gIEluc19QVVNIVywKKyAgICAvKiAgUHVzaFdbNl0gICovICBJbnNfUFVTSFcsCisgICAgLyogIFB1c2hXWzddICAqLyAgSW5zX1BVU0hXLAorCisgICAgLyogIE1EUlBbMDBdICAqLyAgSW5zX01EUlAsCisgICAgLyogIE1EUlBbMDFdICAqLyAgSW5zX01EUlAsCisgICAgLyogIE1EUlBbMDJdICAqLyAgSW5zX01EUlAsCisgICAgLyogIE1EUlBbMDNdICAqLyAgSW5zX01EUlAsCisgICAgLyogIE1EUlBbMDRdICAqLyAgSW5zX01EUlAsCisgICAgLyogIE1EUlBbMDVdICAqLyAgSW5zX01EUlAsCisgICAgLyogIE1EUlBbMDZdICAqLyAgSW5zX01EUlAsCisgICAgLyogIE1EUlBbMDddICAqLyAgSW5zX01EUlAsCisgICAgLyogIE1EUlBbMDhdICAqLyAgSW5zX01EUlAsCisgICAgLyogIE1EUlBbMDldICAqLyAgSW5zX01EUlAsCisgICAgLyogIE1EUlBbMTBdICAqLyAgSW5zX01EUlAsCisgICAgLyogIE1EUlBbMTFdICAqLyAgSW5zX01EUlAsCisgICAgLyogIE1EUlBbMTJdICAqLyAgSW5zX01EUlAsCisgICAgLyogIE1EUlBbMTNdICAqLyAgSW5zX01EUlAsCisgICAgLyogIE1EUlBbMTRdICAqLyAgSW5zX01EUlAsCisgICAgLyogIE1EUlBbMTVdICAqLyAgSW5zX01EUlAsCisKKyAgICAvKiAgTURSUFsxNl0gICovICBJbnNfTURSUCwKKyAgICAvKiAgTURSUFsxN10gICovICBJbnNfTURSUCwKKyAgICAvKiAgTURSUFsxOF0gICovICBJbnNfTURSUCwKKyAgICAvKiAgTURSUFsxOV0gICovICBJbnNfTURSUCwKKyAgICAvKiAgTURSUFsyMF0gICovICBJbnNfTURSUCwKKyAgICAvKiAgTURSUFsyMV0gICovICBJbnNfTURSUCwKKyAgICAvKiAgTURSUFsyMl0gICovICBJbnNfTURSUCwKKyAgICAvKiAgTURSUFsyM10gICovICBJbnNfTURSUCwKKyAgICAvKiAgTURSUFsyNF0gICovICBJbnNfTURSUCwKKyAgICAvKiAgTURSUFsyNV0gICovICBJbnNfTURSUCwKKyAgICAvKiAgTURSUFsyNl0gICovICBJbnNfTURSUCwKKyAgICAvKiAgTURSUFsyN10gICovICBJbnNfTURSUCwKKyAgICAvKiAgTURSUFsyOF0gICovICBJbnNfTURSUCwKKyAgICAvKiAgTURSUFsyOV0gICovICBJbnNfTURSUCwKKyAgICAvKiAgTURSUFszMF0gICovICBJbnNfTURSUCwKKyAgICAvKiAgTURSUFszMV0gICovICBJbnNfTURSUCwKKworICAgIC8qICBNSVJQWzAwXSAgKi8gIEluc19NSVJQLAorICAgIC8qICBNSVJQWzAxXSAgKi8gIEluc19NSVJQLAorICAgIC8qICBNSVJQWzAyXSAgKi8gIEluc19NSVJQLAorICAgIC8qICBNSVJQWzAzXSAgKi8gIEluc19NSVJQLAorICAgIC8qICBNSVJQWzA0XSAgKi8gIEluc19NSVJQLAorICAgIC8qICBNSVJQWzA1XSAgKi8gIEluc19NSVJQLAorICAgIC8qICBNSVJQWzA2XSAgKi8gIEluc19NSVJQLAorICAgIC8qICBNSVJQWzA3XSAgKi8gIEluc19NSVJQLAorICAgIC8qICBNSVJQWzA4XSAgKi8gIEluc19NSVJQLAorICAgIC8qICBNSVJQWzA5XSAgKi8gIEluc19NSVJQLAorICAgIC8qICBNSVJQWzEwXSAgKi8gIEluc19NSVJQLAorICAgIC8qICBNSVJQWzExXSAgKi8gIEluc19NSVJQLAorICAgIC8qICBNSVJQWzEyXSAgKi8gIEluc19NSVJQLAorICAgIC8qICBNSVJQWzEzXSAgKi8gIEluc19NSVJQLAorICAgIC8qICBNSVJQWzE0XSAgKi8gIEluc19NSVJQLAorICAgIC8qICBNSVJQWzE1XSAgKi8gIEluc19NSVJQLAorCisgICAgLyogIE1JUlBbMTZdICAqLyAgSW5zX01JUlAsCisgICAgLyogIE1JUlBbMTddICAqLyAgSW5zX01JUlAsCisgICAgLyogIE1JUlBbMThdICAqLyAgSW5zX01JUlAsCisgICAgLyogIE1JUlBbMTldICAqLyAgSW5zX01JUlAsCisgICAgLyogIE1JUlBbMjBdICAqLyAgSW5zX01JUlAsCisgICAgLyogIE1JUlBbMjFdICAqLyAgSW5zX01JUlAsCisgICAgLyogIE1JUlBbMjJdICAqLyAgSW5zX01JUlAsCisgICAgLyogIE1JUlBbMjNdICAqLyAgSW5zX01JUlAsCisgICAgLyogIE1JUlBbMjRdICAqLyAgSW5zX01JUlAsCisgICAgLyogIE1JUlBbMjVdICAqLyAgSW5zX01JUlAsCisgICAgLyogIE1JUlBbMjZdICAqLyAgSW5zX01JUlAsCisgICAgLyogIE1JUlBbMjddICAqLyAgSW5zX01JUlAsCisgICAgLyogIE1JUlBbMjhdICAqLyAgSW5zX01JUlAsCisgICAgLyogIE1JUlBbMjldICAqLyAgSW5zX01JUlAsCisgICAgLyogIE1JUlBbMzBdICAqLyAgSW5zX01JUlAsCisgICAgLyogIE1JUlBbMzFdICAqLyAgSW5zX01JUlAKKyAgfTsKKyNlbmRpZiAvKiAhVFRfQ09ORklHX09QVElPTl9JTlRFUlBSRVRFUl9TV0lUQ0ggKi8KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogUlVOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgVGhpcyBmdW5jdGlvbiBleGVjdXRlcyBhIHJ1biBvZiBvcGNvZGVzLiAgSXQgd2lsbCBleGl0IGluIHRoZSAgICAgICAgKi8KKyAgLyogIGZvbGxvd2luZyBjYXNlczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgLSBFcnJvcnMgKGluIHdoaWNoIGNhc2UgaXQgcmV0dXJucyBGQUxTRSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAtIFJlYWNoaW5nIHRoZSBlbmQgb2YgdGhlIG1haW4gY29kZSByYW5nZSAocmV0dXJucyBUUlVFKS4gICAgICAgICAgICAqLworICAvKiAgICBSZWFjaGluZyB0aGUgZW5kIG9mIGEgY29kZSByYW5nZSB3aXRoaW4gYSBmdW5jdGlvbiBjYWxsIGlzIGFuICAgICAgKi8KKyAgLyogICAgZXJyb3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgLSBBZnRlciBleGVjdXRpbmcgb25lIHNpbmdsZSBvcGNvZGUsIGlmIHRoZSBmbGFnIGBJbnN0cnVjdGlvbl9UcmFwJyAgKi8KKyAgLyogICAgaXMgc2V0IHRvIFRSVUUgKHJldHVybnMgVFJVRSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgT24gZXhpdCB3aGl0aCBUUlVFLCB0ZXN0IElQIDwgQ29kZVNpemUgdG8ga25vdyB3ZXRoZXIgaXQgY29tZXMgZnJvbSAgKi8KKyAgLyogIGFuIGluc3RydWN0aW9uIHRyYXAgb3IgYSBub3JtYWwgdGVybWluYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogIE5vdGU6IFRoZSBkb2N1bWVudGVkIERFQlVHIG9wY29kZSBwb3BzIGEgdmFsdWUgZnJvbSB0aGUgc3RhY2suICBUaGlzICovCisgIC8qICAgICAgICBiZWhhdmlvdXIgaXMgdW5zdXBwb3J0ZWQsIGhlcmUgYSBERUJVRyBvcGNvZGUgaXMgYWx3YXlzIGFuICAgICAqLworICAvKiAgICAgICAgZXJyb3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBUSElTIElTIFRIRSBJTlRFUlBSRVRFUidTIE1BSU4gTE9PUC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICBJbnN0cnVjdGlvbnMgYXBwZWFyIGluIHRoZSBzcGVjcycgb3JkZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworICBFWFBPUlRfRlVOQworI2lmbmRlZiBERUJVR19JTlRFUlBSRVRFUgorICBUVF9FcnJvciAgVFRfUnVuSW5zKCBUVF9FeGVjQ29udGV4dCAgZXhjICkKKyNlbHNlCisgIFRUX0Vycm9yICBUVF9SdW5JbnMyKCBUVF9FeGVjQ29udGV4dCAgZXhjICkKKyNlbmRpZgorICB7CisgICAgVFRfTG9uZyAgICBpbnNfY291bnRlciA9IDA7ICAvKiBleGVjdXRlZCBpbnN0cnVjdGlvbnMgY291bnRlciAqLworCisjaWZkZWYgVFRfQ09ORklHX09QVElPTl9TVEFUSUNfUkFTVEVSCisgICAgY3VyID0gKmV4YzsKKyNlbmRpZgorCisgICAgLyogc2V0IENWVCBmdW5jdGlvbnMgKi8KKyAgICBDVVIudHRfbWV0cmljcy5yYXRpbyA9IDA7CisgICAgaWYgKCBDVVIubWV0cmljcy54X3BwZW0gIT0gQ1VSLm1ldHJpY3MueV9wcGVtICkKKyAgICB7CisgICAgICAvKiBub24tc3F1YXJlIHBpeGVscywgdXNlIHRoZSBzdHJldGNoZWQgcm91dGluZXMgKi8KKyAgICAgIENVUi5mdW5jX3JlYWRfY3Z0ICA9IFJlYWRfQ1ZUX1N0cmV0Y2hlZDsKKyAgICAgIENVUi5mdW5jX3dyaXRlX2N2dCA9IFdyaXRlX0NWVF9TdHJldGNoZWQ7CisgICAgICBDVVIuZnVuY19tb3ZlX2N2dCAgPSBNb3ZlX0NWVF9TdHJldGNoZWQ7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBzcXVhcmUgcGl4ZWxzLCB1c2Ugbm9ybWFsIHJvdXRpbmVzICovCisgICAgICBDVVIuZnVuY19yZWFkX2N2dCAgPSBSZWFkX0NWVDsKKyAgICAgIENVUi5mdW5jX3dyaXRlX2N2dCA9IFdyaXRlX0NWVDsKKyAgICAgIENVUi5mdW5jX21vdmVfY3Z0ICA9IE1vdmVfQ1ZUOworICAgIH0KKworICAgIENPTVBVVEVfRnVuY3MoKTsKKyAgICBDT01QVVRFX1JvdW5kKCAoVFRfQnl0ZSlleGMtPkdTLnJvdW5kX3N0YXRlICk7CisKKyAgICBkbworICAgIHsKKyAgICAgIENVUi5vcGNvZGUgPSBDVVIuY29kZVtDVVIuSVBdOworCisgICAgICBpZiAoICggQ1VSLmxlbmd0aCA9IG9wY29kZV9sZW5ndGhbQ1VSLm9wY29kZV0gKSA8IDAgKQorICAgICAgeworICAgICAgICBpZiAoIENVUi5JUCArIDEgPiBDVVIuY29kZVNpemUgKQorICAgICAgICAgIGdvdG8gTEVycm9yQ29kZU92ZXJmbG93XzsKKworICAgICAgICBDVVIubGVuZ3RoID0gQ1VSLmNvZGVbQ1VSLklQICsgMV0gKyAyOworICAgICAgfQorCisgICAgICBpZiAoIENVUi5JUCArIENVUi5sZW5ndGggPiBDVVIuY29kZVNpemUgKQorICAgICAgICBnb3RvIExFcnJvckNvZGVPdmVyZmxvd187CisKKyAgICAgIC8qIEZpcnN0LCBsZXQncyBjaGVjayBmb3IgZW1wdHkgc3RhY2sgYW5kIG92ZXJmbG93ICovCisgICAgICBDVVIuYXJncyA9IENVUi50b3AgLSAoUG9wX1B1c2hfQ291bnRbQ1VSLm9wY29kZV0gPj4gNCk7CisKKyAgICAgIC8qIGBhcmdzJyBpcyB0aGUgdG9wIG9mIHRoZSBzdGFjayBvbmNlIGFyZ3VtZW50cyBoYXZlIGJlZW4gcG9wcGVkLiAqLworICAgICAgLyogT25lIGNhbiBhbHNvIGludGVycHJldCBpdCBhcyB0aGUgaW5kZXggb2YgdGhlIGxhc3QgYXJndW1lbnQuICAgICovCisgICAgICBpZiAoIENVUi5hcmdzIDwgMCApCisgICAgICB7CisgICAgICAgIENVUi5lcnJvciA9IFRUX0Vycl9Ub29fRmV3X0FyZ3VtZW50czsKKyAgICAgICAgZ290byBMRXJyb3JMYWJlbF87CisgICAgICB9CisKKyAgICAgIENVUi5uZXdfdG9wID0gQ1VSLmFyZ3MgKyAoUG9wX1B1c2hfQ291bnRbQ1VSLm9wY29kZV0gJiAxNSk7CisKKyAgICAgIC8qIGBuZXdfdG9wJyBpcyB0aGUgbmV3IHRvcCBvZiB0aGUgc3RhY2ssIGFmdGVyIHRoZSBpbnN0cnVjdGlvbidzICovCisgICAgICAvKiBleGVjdXRpb24uICBgdG9wJyB3aWxsIGJlIHNldCB0byBgbmV3X3RvcCcgYWZ0ZXIgdGhlIGBzd2l0Y2gnICAqLworICAgICAgLyogc3RhdGVtZW50LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgIGlmICggQ1VSLm5ld190b3AgPiBDVVIuc3RhY2tTaXplICkKKyAgICAgIHsKKyAgICAgICAgQ1VSLmVycm9yID0gVFRfRXJyX1N0YWNrX092ZXJmbG93OworICAgICAgICBnb3RvIExFcnJvckxhYmVsXzsKKyAgICAgIH0KKworICAgICAgQ1VSLnN0ZXBfaW5zID0gVFJVRTsKKyAgICAgIENVUi5lcnJvciAgICA9IFRUX0Vycl9PazsKKworI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fSU5URVJQUkVURVJfU1dJVENICisgICAgICB7CisgICAgICAgIFRUX0xvbmcqICBhcmdzICAgPSBDVVIuc3RhY2sgKyBDVVIuYXJnczsKKyAgICAgICAgVFRfQnl0ZSAgIG9wY29kZSA9IENVUi5vcGNvZGU7CisKKworI3VuZGVmICAgQVJSQVlfQk9VTkRfRVJST1IKKyNkZWZpbmUgIEFSUkFZX0JPVU5EX0VSUk9SICAgZ290byBTZXRfSW52YWxpZF9SZWYKKworCisgICAgICAgIHN3aXRjaCAoIG9wY29kZSApCisgICAgICAgIHsKKyAgICAgICAgY2FzZSAweDAwOiAgLyogU1ZUQ0EgeSAgKi8KKyAgICAgICAgY2FzZSAweDAxOiAgLyogU1ZUQ0EgeCAgKi8KKyAgICAgICAgY2FzZSAweDAyOiAgLyogU1B2VENBIHkgKi8KKyAgICAgICAgY2FzZSAweDAzOiAgLyogU1B2VENBIHggKi8KKyAgICAgICAgY2FzZSAweDA0OiAgLyogU0Z2VENBIHkgKi8KKyAgICAgICAgY2FzZSAweDA1OiAgLyogU0Z2VENBIHggKi8KKyAgICAgICAgICB7CisgICAgICAgICAgICBUVF9TaG9ydCBBQSwgQkI7CisKKworICAgICAgICAgICAgQUEgPSAoVFRfU2hvcnQpKG9wY29kZSAmIDEpIDw8IDE0OworICAgICAgICAgICAgQkIgPSBBQSBeIChUVF9TaG9ydCkweDQwMDA7CisKKyAgICAgICAgICAgIGlmICggb3Bjb2RlIDwgNCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIENVUi5HUy5wcm9qVmVjdG9yLnggPSBBQTsKKyAgICAgICAgICAgICAgQ1VSLkdTLnByb2pWZWN0b3IueSA9IEJCOworCisgICAgICAgICAgICAgIENVUi5HUy5kdWFsVmVjdG9yLnggPSBBQTsKKyAgICAgICAgICAgICAgQ1VSLkdTLmR1YWxWZWN0b3IueSA9IEJCOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIChvcGNvZGUgJiAyKSA9PSAwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgQ1VSLkdTLmZyZWVWZWN0b3IueCA9IEFBOworICAgICAgICAgICAgICBDVVIuR1MuZnJlZVZlY3Rvci55ID0gQkI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENPTVBVVEVfRnVuY3MoKTsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAweDA2OiAgLyogU1B2VEwgLy8gKi8KKyAgICAgICAgY2FzZSAweDA3OiAgLyogU1B2VEwgKyAgKi8KKyAgICAgICAgICBET19TUFZUTAorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMHgwODogIC8qIFNGdlRMIC8vICovCisgICAgICAgIGNhc2UgMHgwOTogIC8qIFNGdlRMICsgICovCisgICAgICAgICAgRE9fU0ZWVEwKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDB4MEE6ICAvKiBTUHZGUyAqLworICAgICAgICAgIERPX1NQVkZTCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAweDBCOiAgLyogU0Z2RlMgKi8KKyAgICAgICAgICBET19TRlZGUworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMHgwQzogIC8qIEdQViAqLworICAgICAgICAgIERPX0dQVgorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMHgwRDogIC8qIEdGViAqLworICAgICAgICAgIERPX0dGVgorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMHgwRTogIC8qIFNGdlRQdiAqLworICAgICAgICAgIERPX1NGVlRQVgorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMHgwRjogIC8qIElTRUNUICAqLworICAgICAgICAgIEluc19JU0VDVCggRVhFQ19BUkdfICBhcmdzICk7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAweDEwOiAgLyogU1JQMCAqLworICAgICAgICAgIERPX1NSUDAKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDB4MTE6ICAvKiBTUlAxICovCisgICAgICAgICAgRE9fU1JQMQorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMHgxMjogIC8qIFNSUDIgKi8KKyAgICAgICAgICBET19TUlAyCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAweDEzOiAgLyogU1pQMCAqLworICAgICAgICAgIEluc19TWlAwKCBFWEVDX0FSR18gIGFyZ3MgKTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDB4MTQ6ICAvKiBTWlAxICovCisgICAgICAgICAgSW5zX1NaUDEoIEVYRUNfQVJHXyAgYXJncyApOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMHgxNTogIC8qIFNaUDIgKi8KKyAgICAgICAgICBJbnNfU1pQMiggRVhFQ19BUkdfICBhcmdzICk7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAweDE2OiAgLyogU1pQUyAqLworICAgICAgICAgIEluc19TWlBTKCBFWEVDX0FSR18gIGFyZ3MgKTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDB4MTc6ICAvKiBTTE9PUCAqLworICAgICAgICAgIERPX1NMT09QCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAweDE4OiAgLyogUlRHICovCisgICAgICAgICAgRE9fUlRHCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAweDE5OiAgLyogUlRIRyAqLworICAgICAgICAgIERPX1JUSEcKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDB4MUE6ICAvKiBTTUQgKi8KKyAgICAgICAgICBET19TTUQKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDB4MUI6ICAvKiBFTFNFICovCisgICAgICAgICAgSW5zX0VMU0UoIEVYRUNfQVJHXyAgYXJncyApOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMHgxQzogIC8qIEpNUFIgKi8KKyAgICAgICAgICBET19KTVBSCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAweDFEOiAgLyogU0NWVENJICovCisgICAgICAgICAgRE9fU0NWVENJCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAweDFFOiAgLyogU1NXQ0kgKi8KKyAgICAgICAgICBET19TU1dDSQorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMHgxRjogIC8qIFNTVyAqLworICAgICAgICAgIERPX1NTVworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMHgyMDogIC8qIERVUCAqLworICAgICAgICAgIERPX0RVUAorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMHgyMTogIC8qIFBPUCAqLworICAgICAgICAgIC8qIG5vdGhpbmcgOi0pICEgKi8KKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDB4MjI6ICAvKiBDTEVBUiAqLworICAgICAgICAgIERPX0NMRUFSCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAweDIzOiAgLyogU1dBUCAqLworICAgICAgICAgIERPX1NXQVAKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDB4MjQ6ICAvKiBERVBUSCAqLworICAgICAgICAgIERPX0RFUFRICisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAweDI1OiAgLyogQ0lOREVYICovCisgICAgICAgICAgRE9fQ0lOREVYCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAweDI2OiAgLyogTUlOREVYICovCisgICAgICAgICAgSW5zX01JTkRFWCggRVhFQ19BUkdfICBhcmdzICk7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAweDI3OiAgLyogQUxJR05QVFMgKi8KKyAgICAgICAgICBJbnNfQUxJR05QVFMoIEVYRUNfQVJHXyAgYXJncyApOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMHgyODogIC8qID8/Pz8gKi8KKyAgICAgICAgICBJbnNfVU5LTk9XTiggRVhFQ19BUkdfICBhcmdzICk7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAweDI5OiAgLyogVVRQICovCisgICAgICAgICAgSW5zX1VUUCggRVhFQ19BUkdfICBhcmdzICk7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAweDJBOiAgLyogTE9PUENBTEwgKi8KKyAgICAgICAgICBJbnNfTE9PUENBTEwoIEVYRUNfQVJHXyAgYXJncyApOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMHgyQjogIC8qIENBTEwgKi8KKyAgICAgICAgICBJbnNfQ0FMTCggRVhFQ19BUkdfICBhcmdzICk7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAweDJDOiAgLyogRkRFRiAqLworICAgICAgICAgIEluc19GREVGKCBFWEVDX0FSR18gIGFyZ3MgKTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDB4MkQ6ICAvKiBFTkRGICovCisgICAgICAgICAgSW5zX0VOREYoIEVYRUNfQVJHXyAgYXJncyApOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMHgyRTogIC8qIE1EQVAgKi8KKyAgICAgICAgY2FzZSAweDJGOiAgLyogTURBUCAqLworICAgICAgICAgIEluc19NREFQKCBFWEVDX0FSR18gIGFyZ3MgKTsKKyAgICAgICAgICBicmVhazsKKworCisgICAgICAgIGNhc2UgMHgzMDogIC8qIElVUCAqLworICAgICAgICBjYXNlIDB4MzE6ICAvKiBJVVAgKi8KKyAgICAgICAgICBJbnNfSVVQKCBFWEVDX0FSR18gIGFyZ3MgKTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDB4MzI6ICAvKiBTSFAgKi8KKyAgICAgICAgY2FzZSAweDMzOiAgLyogU0hQICovCisgICAgICAgICAgSW5zX1NIUCggRVhFQ19BUkdfICBhcmdzICk7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAweDM0OiAgLyogU0hDICovCisgICAgICAgIGNhc2UgMHgzNTogIC8qIFNIQyAqLworICAgICAgICAgIEluc19TSEMoIEVYRUNfQVJHXyAgYXJncyApOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMHgzNjogIC8qIFNIWiAqLworICAgICAgICBjYXNlIDB4Mzc6ICAvKiBTSFogKi8KKyAgICAgICAgICBJbnNfU0haKCBFWEVDX0FSR18gIGFyZ3MgKTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDB4Mzg6ICAvKiBTSFBJWCAqLworICAgICAgICAgIEluc19TSFBJWCggRVhFQ19BUkdfICBhcmdzICk7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAweDM5OiAgLyogSVAgICAgKi8KKyAgICAgICAgICBJbnNfSVAoIEVYRUNfQVJHXyAgYXJncyApOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMHgzQTogIC8qIE1TSVJQICovCisgICAgICAgIGNhc2UgMHgzQjogIC8qIE1TSVJQICovCisgICAgICAgICAgSW5zX01TSVJQKCBFWEVDX0FSR18gIGFyZ3MgKTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDB4M0M6ICAvKiBBbGlnblJQICovCisgICAgICAgICAgSW5zX0FMSUdOUlAoIEVYRUNfQVJHXyAgYXJncyApOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMHgzRDogIC8qIFJUREcgKi8KKyAgICAgICAgICBET19SVERHCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAweDNFOiAgLyogTUlBUCAqLworICAgICAgICBjYXNlIDB4M0Y6ICAvKiBNSUFQICovCisgICAgICAgICAgSW5zX01JQVAoIEVYRUNfQVJHXyAgYXJncyApOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMHg0MDogIC8qIE5QVVNIQiAqLworICAgICAgICAgIEluc19OUFVTSEIoIEVYRUNfQVJHXyAgYXJncyApOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMHg0MTogIC8qIE5QVVNIVyAqLworICAgICAgICAgIEluc19OUFVTSFcoIEVYRUNfQVJHXyAgYXJncyApOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMHg0MjogIC8qIFdTICovCisgICAgICAgICAgRE9fV1MKKyAgICAgICAgICBicmVhazsKKworICAgIFNldF9JbnZhbGlkX1JlZjoKKyAgICAgICAgICAgIENVUi5lcnJvciA9IFRUX0Vycl9JbnZhbGlkX1JlZmVyZW5jZTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDB4NDM6ICAvKiBSUyAqLworICAgICAgICAgIERPX1JTCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAweDQ0OiAgLyogV0NWVFAgKi8KKyAgICAgICAgICBET19XQ1ZUUAorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMHg0NTogIC8qIFJDVlQgKi8KKyAgICAgICAgICBET19SQ1ZUCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAweDQ2OiAgLyogR0MgKi8KKyAgICAgICAgY2FzZSAweDQ3OiAgLyogR0MgKi8KKyAgICAgICAgICBJbnNfR0MoIEVYRUNfQVJHXyAgYXJncyApOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMHg0ODogIC8qIFNDRlMgKi8KKyAgICAgICAgICBJbnNfU0NGUyggRVhFQ19BUkdfICBhcmdzICk7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAweDQ5OiAgLyogTUQgKi8KKyAgICAgICAgY2FzZSAweDRBOiAgLyogTUQgKi8KKyAgICAgICAgICBJbnNfTUQoIEVYRUNfQVJHXyAgYXJncyApOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMHg0QjogIC8qIE1QUEVNICovCisgICAgICAgICAgRE9fTVBQRU0KKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDB4NEM6ICAvKiBNUFMgKi8KKyAgICAgICAgICBET19NUFMKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDB4NEQ6ICAvKiBGTElQT04gKi8KKyAgICAgICAgICBET19GTElQT04KKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDB4NEU6ICAvKiBGTElQT0ZGICovCisgICAgICAgICAgRE9fRkxJUE9GRgorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMHg0RjogIC8qIERFQlVHICovCisgICAgICAgICAgRE9fREVCVUcKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDB4NTA6ICAvKiBMVCAqLworICAgICAgICAgIERPX0xUCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAweDUxOiAgLyogTFRFUSAqLworICAgICAgICAgIERPX0xURVEKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDB4NTI6ICAvKiBHVCAqLworICAgICAgICAgIERPX0dUCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAweDUzOiAgLyogR1RFUSAqLworICAgICAgICAgIERPX0dURVEKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDB4NTQ6ICAvKiBFUSAqLworICAgICAgICAgIERPX0VRCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAweDU1OiAgLyogTkVRICovCisgICAgICAgICAgRE9fTkVRCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAweDU2OiAgLyogT0REICovCisgICAgICAgICAgRE9fT0RECisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAweDU3OiAgLyogRVZFTiAqLworICAgICAgICAgIERPX0VWRU4KKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDB4NTg6ICAvKiBJRiAqLworICAgICAgICAgIEluc19JRiggRVhFQ19BUkdfICBhcmdzICk7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAweDU5OiAgLyogRUlGICovCisgICAgICAgICAgLyogZG8gbm90aGluZyAqLworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMHg1QTogIC8qIEFORCAqLworICAgICAgICAgIERPX0FORAorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMHg1QjogIC8qIE9SICovCisgICAgICAgICAgRE9fT1IKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDB4NUM6ICAvKiBOT1QgKi8KKyAgICAgICAgICBET19OT1QKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDB4NUQ6ICAvKiBERUxUQVAxICovCisgICAgICAgICAgSW5zX0RFTFRBUCggRVhFQ19BUkdfICBhcmdzICk7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAweDVFOiAgLyogU0RCICovCisgICAgICAgICAgRE9fU0RCCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAweDVGOiAgLyogU0RTICovCisgICAgICAgICAgRE9fU0RTCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAweDYwOiAgLyogQUREICovCisgICAgICAgICAgRE9fQURECisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAweDYxOiAgLyogU1VCICovCisgICAgICAgICAgRE9fU1VCCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAweDYyOiAgLyogRElWICovCisgICAgICAgICAgRE9fRElWCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAweDYzOiAgLyogTVVMICovCisgICAgICAgICAgRE9fTVVMCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAweDY0OiAgLyogQUJTICovCisgICAgICAgICAgRE9fQUJTCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAweDY1OiAgLyogTkVHICovCisgICAgICAgICAgRE9fTkVHCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAweDY2OiAgLyogRkxPT1IgKi8KKyAgICAgICAgICBET19GTE9PUgorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMHg2NzogIC8qIENFSUxJTkcgKi8KKyAgICAgICAgICBET19DRUlMSU5HCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAweDY4OiAgLyogUk9VTkQgKi8KKyAgICAgICAgY2FzZSAweDY5OiAgLyogUk9VTkQgKi8KKyAgICAgICAgY2FzZSAweDZBOiAgLyogUk9VTkQgKi8KKyAgICAgICAgY2FzZSAweDZCOiAgLyogUk9VTkQgKi8KKyAgICAgICAgICBET19ST1VORAorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMHg2QzogIC8qIE5ST1VORCAqLworICAgICAgICBjYXNlIDB4NkQ6ICAvKiBOUk9VTkQgKi8KKyAgICAgICAgY2FzZSAweDZFOiAgLyogTlJSVU5EICovCisgICAgICAgIGNhc2UgMHg2RjogIC8qIE5ST1VORCAqLworICAgICAgICAgIERPX05ST1VORAorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMHg3MDogIC8qIFdDVlRGICovCisgICAgICAgICAgRE9fV0NWVEYKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDB4NzE6ICAvKiBERUxUQVAyICovCisgICAgICAgIGNhc2UgMHg3MjogIC8qIERFTFRBUDMgKi8KKyAgICAgICAgICBJbnNfREVMVEFQKCBFWEVDX0FSR18gIGFyZ3MgKTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDB4NzM6ICAvKiBERUxUQUMwICovCisgICAgICAgIGNhc2UgMHg3NDogIC8qIERFTFRBQzEgKi8KKyAgICAgICAgY2FzZSAweDc1OiAgLyogREVMVEFDMiAqLworICAgICAgICAgIEluc19ERUxUQUMoIEVYRUNfQVJHXyAgYXJncyApOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMHg3NjogIC8qIFNST1VORCAqLworICAgICAgICAgIERPX1NST1VORAorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMHg3NzogIC8qIFM0NVJvdW5kICovCisgICAgICAgICAgRE9fUzQ1Uk9VTkQKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDB4Nzg6ICAvKiBKUk9UICovCisgICAgICAgICAgRE9fSlJPVAorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMHg3OTogIC8qIEpST0YgKi8KKyAgICAgICAgICBET19KUk9GCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAweDdBOiAgLyogUk9GRiAqLworICAgICAgICAgIERPX1JPRkYKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDB4N0I6ICAvKiA/Pz8/ICovCisgICAgICAgICAgSW5zX1VOS05PV04oIEVYRUNfQVJHXyAgYXJncyApOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMHg3QzogIC8qIFJVVEcgKi8KKyAgICAgICAgICBET19SVVRHCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAweDdEOiAgLyogUkRURyAqLworICAgICAgICAgIERPX1JEVEcKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDB4N0U6ICAvKiBTQU5HVyAqLworICAgICAgICBjYXNlIDB4N0Y6ICAvKiBBQSAgICAqLworICAgICAgICAgIC8qIG5vdGhpbmcgLSBvYnNvbGV0ZSAqLworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMHg4MDogIC8qIEZMSVBQVCAqLworICAgICAgICAgIEluc19GTElQUFQoIEVYRUNfQVJHXyAgYXJncyApOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMHg4MTogIC8qIEZMSVBSR09OICovCisgICAgICAgICAgSW5zX0ZMSVBSR09OKCBFWEVDX0FSR18gIGFyZ3MgKTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDB4ODI6ICAvKiBGTElQUkdPRkYgKi8KKyAgICAgICAgICBJbnNfRkxJUFJHT0ZGKCBFWEVDX0FSR18gIGFyZ3MgKTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDB4ODM6ICAvKiBVTktOT1dOICovCisgICAgICAgIGNhc2UgMHg4NDogIC8qIFVOS05PV04gKi8KKyAgICAgICAgICBJbnNfVU5LTk9XTiggRVhFQ19BUkdfICBhcmdzICk7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAweDg1OiAgLyogU0NBTkNUUkwgKi8KKyAgICAgICAgICBJbnNfU0NBTkNUUkwoIEVYRUNfQVJHXyAgYXJncyApOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMHg4NjogIC8qIFNEUFZUTCAqLworICAgICAgICBjYXNlIDB4ODc6ICAvKiBTRFBWVEwgKi8KKyAgICAgICAgICBJbnNfU0RQVlRMKCBFWEVDX0FSR18gIGFyZ3MgKTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDB4ODg6ICAvKiBHRVRJTkZPICovCisgICAgICAgICAgSW5zX0dFVElORk8oIEVYRUNfQVJHXyAgYXJncyApOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMHg4OTogIC8qIElERUYgKi8KKyAgICAgICAgICBJbnNfSURFRiggRVhFQ19BUkdfICBhcmdzICk7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAweDhBOiAgLyogUk9MTCAqLworICAgICAgICAgIEluc19ST0xMKCBFWEVDX0FSR18gIGFyZ3MgKTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDB4OEI6ICAvKiBNQVggKi8KKyAgICAgICAgICBET19NQVgKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDB4OEM6ICAvKiBNSU4gKi8KKyAgICAgICAgICBET19NSU4KKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDB4OEQ6ICAvKiBTQ0FOVFlQRSAqLworICAgICAgICAgIEluc19TQ0FOVFlQRSggRVhFQ19BUkdfICBhcmdzICk7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAweDhFOiAgLyogSU5TVENUUkwgKi8KKyAgICAgICAgICBJbnNfSU5TVENUUkwoIEVYRUNfQVJHXyAgYXJncyApOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMHg4RjoKKyAgICAgICAgICBJbnNfVU5LTk9XTiggRVhFQ19BUkdfICBhcmdzICk7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBpZiAoIG9wY29kZSA+PSAweEUwICkKKyAgICAgICAgICAgIEluc19NSVJQKCBFWEVDX0FSR18gIGFyZ3MgKTsKKyAgICAgICAgICBlbHNlIGlmICggb3Bjb2RlID49IDB4QzAgKQorICAgICAgICAgICAgSW5zX01EUlAoIEVYRUNfQVJHXyAgYXJncyApOworICAgICAgICAgIGVsc2UgaWYgKCBvcGNvZGUgPj0gMHhCOCApCisgICAgICAgICAgICBJbnNfUFVTSFcoIEVYRUNfQVJHXyAgYXJncyApOworICAgICAgICAgIGVsc2UgaWYgKCBvcGNvZGUgPj0gMHhCMCApCisgICAgICAgICAgICBJbnNfUFVTSEIoIEVYRUNfQVJHXyAgYXJncyApOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIEluc19VTktOT1dOKCBFWEVDX0FSR18gIGFyZ3MgKTsKKyAgICAgICAgfQorCisgICAgICB9CisjZWxzZQorICAgICAgSW5zdHJ1Y3RfRGlzcGF0Y2hbQ1VSLm9wY29kZV0oIEVYRUNfQVJHXyAmQ1VSLnN0YWNrW0NVUi5hcmdzXSApOworI2VuZGlmCisgICAgICBpZiAoIENVUi5lcnJvciAhPSBUVF9FcnJfT2sgKQorICAgICAgeworICAgICAgICBzd2l0Y2ggKCBDVVIuZXJyb3IgKQorICAgICAgICB7CisgICAgICAgIGNhc2UgVFRfRXJyX0ludmFsaWRfT3Bjb2RlOiAvKiBsb29raW5nIGZvciByZWRlZmluZWQgaW5zdHJ1Y3Rpb25zICovCisgICAgICAgICAgeworICAgICAgICAgICAgVFRfRGVmUmVjb3JkKiAgZGVmICAgPSBDVVIuSURlZnM7CisgICAgICAgICAgICBUVF9EZWZSZWNvcmQqICBsaW1pdCA9IGRlZiArIENVUi5udW1JRGVmczsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgZm9yICggOyBkZWYgPCBsaW1pdDsgZGVmKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpZiAoIGRlZi0+YWN0aXZlICYmIENVUi5vcGNvZGUgPT0gZGVmLT5vcGMgKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVFRfQ2FsbFJlYyogIGNhbGxyZWM7CisgICAgCisgICAgICAgICAgICAgICAgaWYgKCBDVVIuY2FsbFRvcCA+PSBDVVIuY2FsbFNpemUgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIENVUi5lcnJvciA9IFRUX0Vycl9JbnZhbGlkX1JlZmVyZW5jZTsKKyAgICAgICAgICAgICAgICAgIGdvdG8gTEVycm9yTGFiZWxfOworICAgICAgICAgICAgICAgIH0KKyAgICAKKyAgICAgICAgICAgICAgICBjYWxscmVjID0gJkNVUi5jYWxsU3RhY2tbQ1VSLmNhbGxUb3BdOworICAgIAorICAgICAgICAgICAgICAgIGNhbGxyZWMtPkNhbGxlcl9SYW5nZSA9IENVUi5jdXJSYW5nZTsKKyAgICAgICAgICAgICAgICBjYWxscmVjLT5DYWxsZXJfSVAgICAgPSBDVVIuSVAgKyAxOworICAgICAgICAgICAgICAgIGNhbGxyZWMtPkN1cl9Db3VudCAgICA9IDE7CisgICAgICAgICAgICAgICAgY2FsbHJlYy0+Q3VyX1Jlc3RhcnQgID0gZGVmLT5zdGFydDsKKyAgICAKKyAgICAgICAgICAgICAgICBpZiAoIElOU19Hb3RvX0NvZGVSYW5nZSggZGVmLT5yYW5nZSwgZGVmLT5zdGFydCApID09IEZBSUxVUkUgKQorICAgICAgICAgICAgICAgICAgZ290byBMRXJyb3JMYWJlbF87CisgICAgCisgICAgICAgICAgICAgICAgZ290byBMU3VpdGVMYWJlbF87CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICBDVVIuZXJyb3IgPSBUVF9FcnJfSW52YWxpZF9PcGNvZGU7CisgICAgICAgICAgZ290byBMRXJyb3JMYWJlbF87CisvKiAgICAgICAgYnJlYWs7ICAgVW5yZWFjaGFibGUgY29kZSB3YXJuaW5nIHN1cHByZXNzLiAgTGVhdmUgaW4gY2FzZSBhIGxhdGVyCisgICAgICAgICAgICAgICAgICAgY2hhbmdlIHRvIHJlbWluZCB0aGUgZWRpdG9yIHRvIGNvbnNpZGVyIGJyZWFrOyAqLworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgZ290byBMRXJyb3JMYWJlbF87CisvKiAgICAgICAgYnJlYWs7ICovCisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgQ1VSLnRvcCA9IENVUi5uZXdfdG9wOworCisgICAgICBpZiAoIENVUi5zdGVwX2lucyApCisgICAgICAgIENVUi5JUCArPSBDVVIubGVuZ3RoOworCisgICAgICAvKiBpbmNyZW1lbnQgaW5zdHJ1Y3Rpb24gY291bnRlciBhbmQgY2hlY2sgaWYgd2UgZGlkbid0ICAgKi8KKyAgICAgIC8qIHJ1biB0aGlzIHByb2dyYW0gZm9yIHRvbyBsb25nID8/IChlLmcuIGluZmluaXRlIGxvb3BzKSAqLworICAgICAgaWYgKCArK2luc19jb3VudGVyID4gTUFYX1JVTk5BQkxFX09QQ09ERVMgKQorICAgICAgICByZXR1cm4gVFRfRXJyX0V4ZWN1dGlvbl9Ub29fTG9uZzsKKworICBMU3VpdGVMYWJlbF86CisgICAgICBpZiAoIENVUi5JUCA+PSBDVVIuY29kZVNpemUgKQorICAgICAgeworICAgICAgICBpZiAoIENVUi5jYWxsVG9wID4gMCApCisgICAgICAgIHsKKyAgICAgICAgICBDVVIuZXJyb3IgPSBUVF9FcnJfQ29kZV9PdmVyZmxvdzsKKyAgICAgICAgICBnb3RvIExFcnJvckxhYmVsXzsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgZ290byBMTm9fRXJyb3JfOworICAgICAgfQorICAgIH0gd2hpbGUgKCAhQ1VSLmluc3RydWN0aW9uX3RyYXAgKTsKKworICBMTm9fRXJyb3JfOgorI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fU1RBVElDX1JBU1RFUgorICAgICpleGMgPSBjdXI7CisjZW5kaWYKKyAgICByZXR1cm4gVFRfRXJyX09rOworCisgIExFcnJvckNvZGVPdmVyZmxvd186CisgICAgQ1VSLmVycm9yID0gVFRfRXJyX0NvZGVfT3ZlcmZsb3c7CisKKyAgTEVycm9yTGFiZWxfOgorI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fU1RBVElDX1JBU1RFUgorICAgICpleGMgPSBjdXI7CisjZW5kaWYKKyAgICByZXR1cm4gQ1VSLmVycm9yOworICB9CisKKworI2lmIDAKKworICAvKiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgZGVjbGFyZWQgYnkgdGhlIGRlYnVnZ2VyIGZyb250IGVuZCAqLworICAvKiBpbiBvcmRlciB0byBzcGVjaWZ5IHdoaWNoIGNvZGUgcmFuZ2UgdG8gZGVidWcuICAgICAgICAgICAqLworCisgIGludCAgZGVidWdfY29kZXJhbmdlID0gdHRfY29kZXJhbmdlX2dseXBoOworCisgIHN0YXRpYyBjaGFyICB0ZW1wU3RyWzEyOF07CisKKyAgc3RhdGljIGNvbnN0IGNoYXIqICBPcFN0clsyNTZdID0KKyAgeworICAgICJTVlRDQSB5IiwgICAgICAgLyogU2V0IHZlY3RvcnMgdG8gY29vcmRpbmF0ZSBheGlzIHkgICAgKi8KKyAgICAiU1ZUQ0EgeCIsICAgICAgIC8qIFNldCB2ZWN0b3JzIHRvIGNvb3JkaW5hdGUgYXhpcyB4ICAgICovCisgICAgIlNQdlRDQSB5IiwgICAgICAvKiBTZXQgUHJvai4gdmVjLiB0byBjb29yZC4gYXhpcyB5ICAgICAqLworICAgICJTUHZUQ0EgeCIsICAgICAgLyogU2V0IFByb2ouIHZlYy4gdG8gY29vcmQuIGF4aXMgeCAgICAgKi8KKyAgICAiU0Z2VENBIHkiLCAgICAgIC8qIFNldCBGcmVlLiB2ZWMuIHRvIGNvb3JkLiBheGlzIHkgICAgICovCisgICAgIlNGdlRDQSB4IiwgICAgICAvKiBTZXQgRnJlZS4gdmVjLiB0byBjb29yZC4gYXhpcyB4ICAgICAqLworICAgICJTUHZUTCAvLyIsICAgICAgLyogU2V0IFByb2ouIHZlYy4gcGFyYWxsZWwgdG8gc2VnbWVudCAgKi8KKyAgICAiU1B2VEwgKyIsICAgICAgIC8qIFNldCBQcm9qLiB2ZWMuIG5vcm1hbCB0byBzZWdtZW50ICAgICovCisgICAgIlNGdlRMIC8vIiwgICAgICAvKiBTZXQgRnJlZS4gdmVjLiBwYXJhbGxlbCB0byBzZWdtZW50ICAqLworICAgICJTRnZUTCArIiwgICAgICAgLyogU2V0IEZyZWUuIHZlYy4gbm9ybWFsIHRvIHNlZ21lbnQgICAgKi8KKyAgICAiU1B2RlMiLCAgICAgICAgIC8qIFNldCBQcm9qLiB2ZWMuIGZyb20gc3RhY2sgICAgICAgICAgICovCisgICAgIlNGdkZTIiwgICAgICAgICAvKiBTZXQgRnJlZS4gdmVjLiBmcm9tIHN0YWNrICAgICAgICAgICAqLworICAgICJHUFYiLCAgICAgICAgICAgLyogR2V0IHByb2plY3Rpb24gdmVjdG9yICAgICAgICAgICAgICAgKi8KKyAgICAiR0ZWIiwgICAgICAgICAgIC8qIEdldCBmcmVlZG9tIHZlY3RvciAgICAgICAgICAgICAgICAgICovCisgICAgIlNGdlRQdiIsICAgICAgICAvKiBTZXQgZnJlZS4gdmVjLiB0byBwcm9qLiB2ZWMuICAgICAgICAqLworICAgICJJU0VDVCIsICAgICAgICAgLyogY29tcHV0ZSBpbnRlcnNlY3Rpb24gICAgICAgICAgICAgICAgKi8KKworICAgICJTUlAwIiwgICAgICAgICAgLyogU2V0IHJlZmVyZW5jZSBwb2ludCAwICAgICAgICAgICAgICAgKi8KKyAgICAiU1JQMSIsICAgICAgICAgIC8qIFNldCByZWZlcmVuY2UgcG9pbnQgMSAgICAgICAgICAgICAgICovCisgICAgIlNSUDIiLCAgICAgICAgICAvKiBTZXQgcmVmZXJlbmNlIHBvaW50IDIgICAgICAgICAgICAgICAqLworICAgICJTWlAwIiwgICAgICAgICAgLyogU2V0IFpvbmUgUG9pbnRlciAwICAgICAgICAgICAgICAgICAgKi8KKyAgICAiU1pQMSIsICAgICAgICAgIC8qIFNldCBab25lIFBvaW50ZXIgMSAgICAgICAgICAgICAgICAgICovCisgICAgIlNaUDIiLCAgICAgICAgICAvKiBTZXQgWm9uZSBQb2ludGVyIDIgICAgICAgICAgICAgICAgICAqLworICAgICJTWlBTIiwgICAgICAgICAgLyogU2V0IGFsbCB6b25lIHBvaW50ZXJzICAgICAgICAgICAgICAgKi8KKyAgICAiU0xPT1AiLCAgICAgICAgIC8qIFNldCBsb29wIGNvdW50ZXIgICAgICAgICAgICAgICAgICAgICovCisgICAgIlJURyIsICAgICAgICAgICAvKiBSb3VuZCB0byBHcmlkICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICJSVEhHIiwgICAgICAgICAgLyogUm91bmQgdG8gSGFsZi1HcmlkICAgICAgICAgICAgICAgICAgKi8KKyAgICAiU01EIiwgICAgICAgICAgIC8qIFNldCBNaW5pbXVtIERpc3RhbmNlICAgICAgICAgICAgICAgICovCisgICAgIkVMU0UiLCAgICAgICAgICAvKiBFbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICJKTVBSIiwgICAgICAgICAgLyogSnVtcCBSZWxhdGl2ZSAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAiU0N2VENpIiwgICAgICAgIC8qIFNldCBDVlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgIlNTd0NpIiwgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICJTU1ciLCAgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICAgICJEVVAiLAorICAgICJQT1AiLAorICAgICJDTEVBUiIsCisgICAgIlNXQVAiLAorICAgICJERVBUSCIsCisgICAgIkNJTkRFWCIsCisgICAgIk1JTkRFWCIsCisgICAgIkFsaWduUFRTIiwKKyAgICAiSU5TXyQyOCIsCisgICAgIlVUUCIsCisgICAgIkxPT1BDQUxMIiwKKyAgICAiQ0FMTCIsCisgICAgIkZERUYiLAorICAgICJFTkRGIiwKKyAgICAiTURBUFstXSIsCisgICAgIk1EQVBbcl0iLAorCisgICAgIklVUFt5XSIsCisgICAgIklVUFt4XSIsCisgICAgIlNIUFswXSIsCisgICAgIlNIUFsxXSIsCisgICAgIlNIQ1swXSIsCisgICAgIlNIQ1sxXSIsCisgICAgIlNIWlswXSIsCisgICAgIlNIWlsxXSIsCisgICAgIlNIUElYIiwKKyAgICAiSVAiLAorICAgICJNU0lSUFswXSIsCisgICAgIk1TSVJQWzFdIiwKKyAgICAiQWxpZ25SUCIsCisgICAgIlJUREciLAorICAgICJNSUFQWy1dIiwKKyAgICAiTUlBUFtyXSIsCisKKyAgICAiTlB1c2hCIiwKKyAgICAiTlB1c2hXIiwKKyAgICAiV1MiLAorICAgICJSUyIsCisgICAgIldDdnRQIiwKKyAgICAiUkN2dCIsCisgICAgIkdDWzBdIiwKKyAgICAiR0NbMV0iLAorICAgICJTQ0ZTIiwKKyAgICAiTURbMF0iLAorICAgICJNRFsxXSIsCisgICAgIk1QUEVNIiwKKyAgICAiTVBTIiwKKyAgICAiRmxpcE9OIiwKKyAgICAiRmxpcE9GRiIsCisgICAgIkRFQlVHIiwKKworICAgICJMVCIsCisgICAgIkxURVEiLAorICAgICJHVCIsCisgICAgIkdURVEiLAorICAgICJFUSIsCisgICAgIk5FUSIsCisgICAgIk9ERCIsCisgICAgIkVWRU4iLAorICAgICJJRiIsCisgICAgIkVJRiIsCisgICAgIkFORCIsCisgICAgIk9SIiwKKyAgICAiTk9UIiwKKyAgICAiRGVsdGFQMSIsCisgICAgIlNEQiIsCisgICAgIlNEUyIsCisKKyAgICAiQUREIiwKKyAgICAiU1VCIiwKKyAgICAiRElWIiwKKyAgICAiTVVMIiwKKyAgICAiQUJTIiwKKyAgICAiTkVHIiwKKyAgICAiRkxPT1IiLAorICAgICJDRUlMSU5HIiwKKyAgICAiUk9VTkRbR10iLAorICAgICJST1VORFtCXSIsCisgICAgIlJPVU5EW1ddIiwKKyAgICAiUk9VTkRbP10iLAorICAgICJOUk9VTkRbR10iLAorICAgICJOUk9VTkRbQl0iLAorICAgICJOUk9VTkRbV10iLAorICAgICJOUk9VTkRbP10iLAorCisgICAgIldDdnRGIiwKKyAgICAiRGVsdGFQMiIsCisgICAgIkRlbHRhUDMiLAorICAgICJEZWx0YUMxIiwKKyAgICAiRGVsdGFDMiIsCisgICAgIkRlbHRhQzMiLAorICAgICJTUk9VTkQiLAorICAgICJTNDVSb3VuZCIsCisgICAgIkpST1QiLAorICAgICJKUk9GIiwKKyAgICAiUk9GRiIsCisgICAgIklOU18kN0IiLAorICAgICJSVVRHIiwKKyAgICAiUkRURyIsCisgICAgIlNBTkdXIiwKKyAgICAiQUEiLAorCisgICAgIkZsaXBQVCIsCisgICAgIkZsaXBSZ09OIiwKKyAgICAiRmxpcFJnT0ZGIiwKKyAgICAiSU5TXyQ4MyIsCisgICAgIklOU18kODQiLAorICAgICJTY2FuQ1RSTCIsCisgICAgIlNEUFZUTFswXSIsCisgICAgIlNEUFZUTFsxXSIsCisgICAgIkdldElORk8iLAorICAgICJJREVGIiwKKyAgICAiUk9MTCIsCisgICAgIk1BWCIsCisgICAgIk1JTiIsCisgICAgIlNjYW5UWVBFIiwKKyAgICAiSW50Q1RSTCIsCisgICAgIklOU18kOEYiLAorCisgICAgIklOU18kOTAiLAorICAgICJJTlNfJDkxIiwKKyAgICAiSU5TXyQ5MiIsCisgICAgIklOU18kOTMiLAorICAgICJJTlNfJDk0IiwKKyAgICAiSU5TXyQ5NSIsCisgICAgIklOU18kOTYiLAorICAgICJJTlNfJDk3IiwKKyAgICAiSU5TXyQ5OCIsCisgICAgIklOU18kOTkiLAorICAgICJJTlNfJDlBIiwKKyAgICAiSU5TXyQ5QiIsCisgICAgIklOU18kOUMiLAorICAgICJJTlNfJDlEIiwKKyAgICAiSU5TXyQ5RSIsCisgICAgIklOU18kOUYiLAorCisgICAgIklOU18kQTAiLAorICAgICJJTlNfJEExIiwKKyAgICAiSU5TXyRBMiIsCisgICAgIklOU18kQTMiLAorICAgICJJTlNfJEE0IiwKKyAgICAiSU5TXyRBNSIsCisgICAgIklOU18kQTYiLAorICAgICJJTlNfJEE3IiwKKyAgICAiSU5TXyRBOCIsCisgICAgIklOU18kQTkiLAorICAgICJJTlNfJEFBIiwKKyAgICAiSU5TXyRBQiIsCisgICAgIklOU18kQUMiLAorICAgICJJTlNfJEFEIiwKKyAgICAiSU5TXyRBRSIsCisgICAgIklOU18kQUYiLAorCisgICAgIlB1c2hCWzBdIiwKKyAgICAiUHVzaEJbMV0iLAorICAgICJQdXNoQlsyXSIsCisgICAgIlB1c2hCWzNdIiwKKyAgICAiUHVzaEJbNF0iLAorICAgICJQdXNoQls1XSIsCisgICAgIlB1c2hCWzZdIiwKKyAgICAiUHVzaEJbN10iLAorICAgICJQdXNoV1swXSIsCisgICAgIlB1c2hXWzFdIiwKKyAgICAiUHVzaFdbMl0iLAorICAgICJQdXNoV1szXSIsCisgICAgIlB1c2hXWzRdIiwKKyAgICAiUHVzaFdbNV0iLAorICAgICJQdXNoV1s2XSIsCisgICAgIlB1c2hXWzddIiwKKworICAgICJNRFJQW0ddIiwKKyAgICAiTURSUFtCXSIsCisgICAgIk1EUlBbV10iLAorICAgICJNRFJQWz9dIiwKKyAgICAiTURSUFtyR10iLAorICAgICJNRFJQW3JCXSIsCisgICAgIk1EUlBbclddIiwKKyAgICAiTURSUFtyP10iLAorICAgICJNRFJQW21HXSIsCisgICAgIk1EUlBbbUJdIiwKKyAgICAiTURSUFttV10iLAorICAgICJNRFJQW20/XSIsCisgICAgIk1EUlBbbXJHXSIsCisgICAgIk1EUlBbbXJCXSIsCisgICAgIk1EUlBbbXJXXSIsCisgICAgIk1EUlBbbXI/XSIsCisgICAgIk1EUlBbcEddIiwKKyAgICAiTURSUFtwQl0iLAorCisgICAgIk1EUlBbcFddIiwKKyAgICAiTURSUFtwP10iLAorICAgICJNRFJQW3ByR10iLAorICAgICJNRFJQW3ByQl0iLAorICAgICJNRFJQW3ByV10iLAorICAgICJNRFJQW3ByP10iLAorICAgICJNRFJQW3BtR10iLAorICAgICJNRFJQW3BtQl0iLAorICAgICJNRFJQW3BtV10iLAorICAgICJNRFJQW3BtP10iLAorICAgICJNRFJQW3BtckddIiwKKyAgICAiTURSUFtwbXJCXSIsCisgICAgIk1EUlBbcG1yV10iLAorICAgICJNRFJQW3Btcj9dIiwKKworICAgICJNSVJQW0ddIiwKKyAgICAiTUlSUFtCXSIsCisgICAgIk1JUlBbV10iLAorICAgICJNSVJQWz9dIiwKKyAgICAiTUlSUFtyR10iLAorICAgICJNSVJQW3JCXSIsCisgICAgIk1JUlBbclddIiwKKyAgICAiTUlSUFtyP10iLAorICAgICJNSVJQW21HXSIsCisgICAgIk1JUlBbbUJdIiwKKyAgICAiTUlSUFttV10iLAorICAgICJNSVJQW20/XSIsCisgICAgIk1JUlBbbXJHXSIsCisgICAgIk1JUlBbbXJCXSIsCisgICAgIk1JUlBbbXJXXSIsCisgICAgIk1JUlBbbXI/XSIsCisgICAgIk1JUlBbcEddIiwKKyAgICAiTUlSUFtwQl0iLAorCisgICAgIk1JUlBbcFddIiwKKyAgICAiTUlSUFtwP10iLAorICAgICJNSVJQW3ByR10iLAorICAgICJNSVJQW3ByQl0iLAorICAgICJNSVJQW3ByV10iLAorICAgICJNSVJQW3ByP10iLAorICAgICJNSVJQW3BtR10iLAorICAgICJNSVJQW3BtQl0iLAorICAgICJNSVJQW3BtV10iLAorICAgICJNSVJQW3BtP10iLAorICAgICJNSVJQW3BtckddIiwKKyAgICAiTUlSUFtwbXJCXSIsCisgICAgIk1JUlBbcG1yV10iLAorICAgICJNSVJQW3Btcj9dIgorICB9OworCisKKyAgY29uc3QgY2hhciogQ3VyX1VfTGluZSggVFRfRXhlY0NvbnRleHQgZXhlYyApCisgIHsKKyAgICBjaGFyICBzWzMyXTsKKworICAgIGludCAgb3AsIGksIG47CisKKyAgICBvcCA9IGV4ZWMtPmNvZGVbZXhlYy0+SVBdOworCisgICAgc3ByaW50ZiggdGVtcFN0ciwgIiVzIiwgT3BTdHJbb3BdICk7CisKKyAgICBpZiAoIG9wID09IDB4NDAgKQorICAgIHsKKyAgICAgIG4gPSBleGVjLT5jb2RlW2V4ZWMtPklQICsgMV07CisgICAgICBzcHJpbnRmKCBzLCAiKCVkKSIsIG4gKTsKKyAgICAgIHN0cm5jYXQoIHRlbXBTdHIsIHMsIDggKTsKKworICAgICAgaWYgKCBuID4gMjAgKSBuID0gMjA7IC8qIGxpbWl0IG91dHB1dCAqLworCisgICAgICBmb3IgKCBpID0gMDsgaSA8IG47IGkrKyApCisgICAgICB7CisgICAgICAgIHNwcmludGYoIHMsICIgJCUwMmh4IiwgZXhlYy0+Y29kZVtleGVjLT5JUCArIGkgKyAyXSApOworICAgICAgICBzdHJuY2F0KCB0ZW1wU3RyLCBzLCA4ICk7CisgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKCBvcCA9PSAweDQxICkKKyAgICB7CisgICAgICBuID0gZXhlYy0+Y29kZVtleGVjLT5JUCArIDFdOworICAgICAgc3ByaW50ZiggcywgIiglZCkiLCBuICk7CisgICAgICBzdHJuY2F0KCB0ZW1wU3RyLCBzLCA4ICk7CisKKyAgICAgIGlmICggbiA+IDIwICkgbiA9IDIwOyAvKiBsaW1pdCBvdXRwdXQgKi8KKworICAgICAgZm9yICggaSA9IDA7IGkgPCBuOyBpKysgKQorICAgICAgeworICAgICAgICBzcHJpbnRmKCBzLCAiICQlMDJoeCUwMmh4IiwgZXhlYy0+Y29kZVtleGVjLT5JUCArIGkqMiArIDJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlYy0+Y29kZVtleGVjLT5JUCArIGkqMiArIDNdICk7CisgICAgICAgIHN0cm5jYXQoIHRlbXBTdHIsIHMsIDggKTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoIChvcCAmIDB4RjgpID09IDB4QjAgKQorICAgIHsKKyAgICAgIG4gPSBvcCAtIDB4QjA7CisKKyAgICAgIGZvciAoIGkgPSAwOyBpIDw9IG47IGkrKyApCisgICAgICB7CisgICAgICAgIHNwcmludGYoIHMsICIgJCUwMmh4IiwgZXhlYy0+Y29kZVtleGVjLT5JUCArIGkgKyAxXSApOworICAgICAgICBzdHJuY2F0KCB0ZW1wU3RyLCBzLCA4ICk7CisgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKCAob3AgJiAweEY4KSA9PSAweEI4ICkKKyAgICB7CisgICAgICBuID0gb3AtMHhCODsKKworICAgICAgZm9yICggaSA9IDA7IGkgPD0gbjsgaSsrICkKKyAgICAgIHsKKyAgICAgICAgc3ByaW50ZiggcywgIiAkJTAyaHglMDJoeCIsIGV4ZWMtPmNvZGVbZXhlYy0+SVAgKyBpKjIgKyAxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWMtPmNvZGVbZXhlYy0+SVAgKyBpKjIgKyAyXSApOworICAgICAgICBzdHJuY2F0KCB0ZW1wU3RyLCBzLCA4ICk7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIChjaGFyKil0ZW1wU3RyOworICB9CisKKworICBFWFBPUlRfRlVOQworICBUVF9FcnJvciAgVFRfUnVuSW5zKCBUVF9FeGVjQ29udGV4dCAgZXhjICkKKyAgeworICAgIFRUX0ludCAgICBBLCBkaWZmOworICAgIFRUX1VMb25nICBuZXh0X0lQOworICAgIFRUX0NoYXIgICBjaCwgb2xkY2g7CisgICAgY2hhciAgICAgKnRlbXA7CisgICAgaW50ICAgICAgIGtleTsKKyAgICBGVF9NZW1vcnkgbWVtb3J5OworCisgICAgVFRfRXJyb3IgIGVycm9yID0gMDsKKworICAgIFRUX0dseXBoWm9uZSAgc2F2ZTsKKyAgICBUVF9HbHlwaFpvbmUgIHB0czsKKworI2RlZmluZSBUVF9Sb3VuZF9PZmYgICAgICAgICAgICAgNQorI2RlZmluZSBUVF9Sb3VuZF9Ub19IYWxmX0dyaWQgICAgMAorI2RlZmluZSBUVF9Sb3VuZF9Ub19HcmlkICAgICAgICAgMQorI2RlZmluZSBUVF9Sb3VuZF9Ub19Eb3VibGVfR3JpZCAgMgorI2RlZmluZSBUVF9Sb3VuZF9VcF9Ub19HcmlkICAgICAgNAorI2RlZmluZSBUVF9Sb3VuZF9Eb3duX1RvX0dyaWQgICAgMworI2RlZmluZSBUVF9Sb3VuZF9TdXBlciAgICAgICAgICAgNgorI2RlZmluZSBUVF9Sb3VuZF9TdXBlcl80NSAgICAgICAgNworCisgICAgY29uc3QgY2hhciogIHJvdW5kX3N0cls4XSA9CisgICAgeworICAgICAgInRvIGhhbGYtZ3JpZCIsCisgICAgICAidG8gZ3JpZCIsCisgICAgICAidG8gZG91YmxlIGdyaWQiLAorICAgICAgImRvd24gdG8gZ3JpZCIsCisgICAgICAidXAgdG8gZ3JpZCIsCisgICAgICAib2ZmIiwKKyAgICAgICJzdXBlciIsCisgICAgICAic3VwZXIgNDUiCisgICAgfTsKKworICAgIC8qIENoZWNrIHRoYXQgd2UncmUgcnVubmluZyB0aGUgY29kZSByYW5nZSB0aGF0IGlzIGVmZmVjdGl2ZWx5ICovCisgICAgLyogYXNrZWQgYnkgdGhlIGRlYnVnZ2VyIGZyb250IGVuZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBpZiAoIGV4Yy0+Y3VyUmFuZ2UgIT0gZGVidWdfY29kZXJhbmdlICkKKyAgICAgIHJldHVybiBUVF9SdW5JbnMyKCBleGMgKTsKKworICAgIHB0cyA9IGV4Yy0+cHRzOworCisgICAgbWVtb3J5ID0gZXhjLT5mYWNlLT5yb290Lm1lbW9yeTsKKworICAgIHNhdmUubl9wb2ludHMgICA9IHB0cy5uX3BvaW50czsKKyAgICBzYXZlLm5fY29udG91cnMgPSBwdHMubl9jb250b3VyczsKKworICAgIE1FTV9BbGxvYyggc2F2ZS5vcmcsIHNpemVvZiAoIFRUX1ZlY3RvciApICogc2F2ZS5uX3BvaW50cyApOworICAgIE1FTV9BbGxvYyggc2F2ZS5jdXIsIHNpemVvZiAoIFRUX1ZlY3RvciApICogc2F2ZS5uX3BvaW50cyApOworICAgIE1FTV9BbGxvYyggc2F2ZS50b3VjaCwgc2l6ZW9mICggVFRfQnl0ZSApICogc2F2ZS5uX3BvaW50cyApOworCisgICAgZXhjLT5pbnN0cnVjdGlvbl90cmFwID0gMTsKKworICAgIG9sZGNoID0gJ1wwJzsKKworICAgIGRvCisgICAgeworICAgICAgaWYgKCBleGMtPklQIDwgZXhjLT5jb2RlU2l6ZSApCisgICAgICB7CisjaWZkZWYgVFRfQ09ORklHX09QVElPTl9TVEFUSUNfSU5URVJQUkVURVIKKyAgICAgICAgY3VyID0gKmV4YzsKKyNlbmRpZgorICAgICAgICBpZiAoICggQ1VSLmxlbmd0aCA9IG9wY29kZV9sZW5ndGhbQ1VSLm9wY29kZV0gKSA8IDAgKQorICAgICAgICB7CisgICAgICAgICAgaWYgKCBDVVIuSVAgKyAxID4gQ1VSLmNvZGVTaXplICkKKyAgICAgICAgICAgIGdvdG8gTEVycm9yQ29kZU92ZXJmbG93XzsKKworICAgICAgICAgIENVUi5sZW5ndGggPSBDVVIuY29kZVtDVVIuSVAgKyAxXSArIDI7CisgICAgICAgIH0KKworICAgICAgICBleGMtPmFyZ3MgPSBleGMtPnRvcCAtIChQb3BfUHVzaF9Db3VudFtleGMtPm9wY29kZV0gPj4gNCk7CisKKyAgICAgICAgLyogYGFyZ3MnIGlzIHRoZSB0b3Agb2YgdGhlIHN0YWNrIG9uY2UgYXJndW1lbnRzIGhhdmUgYmVlbiBwb3BwZWQuICovCisgICAgICAgIC8qIE9uZSBjYW4gYWxzbyBpbnRlcnByZXQgaXQgYXMgdGhlIGluZGV4IG9mIHRoZSBsYXN0IGFyZ3VtZW50LiAgICAqLworCisgICAgICAgIC8qIFByaW50IHRoZSBjdXJyZW50IGxpbmUuICBXZSB1c2UgYSA4MC1jb2x1bW5zIGNvbnNvbGUgd2l0aCB0aGUgICAqLworICAgICAgICAvKiBmb2xsb3dpbmcgZm9ybWF0dGluZzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgIC8qIFtsb2NdOlthZGRyXSBbb3Bjb2RlXSAgW2Rpc2Fzc2VtYnldICAgICAgICAgIFthXVtiXXxbY11bZF0gICAgICAqLworICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICAgICAgICB7CisgICAgICAgICAgY2hhciAgICAgIHRlbXBbODBdOworICAgICAgICAgIGludCAgICAgICBuLCBjb2wsIHBvcDsKKyAgICAgICAgICBpbnQgICAgICAgYXJncyA9IENVUi5hcmdzOworCisKKyAgICAgICAgICBzcHJpbnRmKCB0ZW1wLCAiJTc4Y1xuIiwgJyAnICk7CisKKyAgICAgICAgICAvKiBmaXJzdCBsZXR0ZXIgb2YgbG9jYXRpb24gKi8KKyAgICAgICAgICBzd2l0Y2ggKCBDVVIuY3VyUmFuZ2UgKQorICAgICAgICAgIHsKKyAgICAgICAgICBjYXNlIHR0X2NvZGVyYW5nZV9nbHlwaDoKKyAgICAgICAgICAgIHRlbXBbMF0gPSAnZyc7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIHR0X2NvZGVyYW5nZV9jdnQ6CisgICAgICAgICAgICB0ZW1wWzBdID0gJ2MnOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHRlbXBbMF0gPSAnZic7CisgICAgICAgICAgfQorCisgICAgICAgICAgLyogY3VycmVudCBJUCAqLworICAgICAgICAgIHNwcmludGYoIHRlbXArMSwgIiUwNGx4OiAlMDJ4ICAlLTM2LjM2cyIsCisgICAgICAgICAgICAgICAgICAgQ1VSLklQLAorICAgICAgICAgICAgICAgICAgIENVUi5vcGNvZGUsCisgICAgICAgICAgICAgICAgICAgQ3VyX1VfTGluZSgmQ1VSKSApOworCisgICAgICAgICAgc3RybmNweSggdGVtcCs0NiwgIiAoIiwgMiApOworCisgICAgICAgICAgYXJncyA9IENVUi50b3AgLSAxOworICAgICAgICAgIHBvcCAgPSBQb3BfUHVzaF9Db3VudFtDVVIub3Bjb2RlXSA+PiA0OworICAgICAgICAgIGNvbCAgPSA0ODsKKyAgICAgICAgICBmb3IgKCBuID0gNjsgbiA+IDA7IG4tLSApCisgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBwb3AgPT0gMCApCisgICAgICAgICAgICAgIHRlbXBbY29sLTFdID0gKHRlbXBbY29sLTFdID09ICcoJyA/ICcgJyA6ICcpJyApOworCisgICAgICAgICAgICBpZiAoIGFyZ3MgPCBDVVIudG9wICYmIGFyZ3MgPj0gMCApCisgICAgICAgICAgICAgIHNwcmludGYoIHRlbXArY29sLCAiJTA0bHgiLCBDVVIuc3RhY2tbYXJnc10gKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgc3ByaW50ZiggdGVtcCtjb2wsICIgICAgIiApOworCisgICAgICAgICAgICB0ZW1wW2NvbCs0XSA9ICcgJzsKKyAgICAgICAgICAgIGNvbCArPSA1OworICAgICAgICAgICAgcG9wLS07CisgICAgICAgICAgICBhcmdzLS07CisgICAgICAgICAgfQorICAgICAgICAgIHRlbXBbNzhdID0gJ1xuJzsKKyAgICAgICAgICB0ZW1wWzc5XSA9ICdcMCc7CisgICAgICAgICAgRlRfVFJBQ0UwKCggdGVtcCApKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIEZpcnN0LCBjaGVjayBmb3IgZW1wdHkgc3RhY2sgYW5kIG92ZXJmbG93ICovCisgICAgICAgIGlmICggQ1VSLmFyZ3MgPCAwICkKKyAgICAgICAgeworICAgICAgICAgIEZUX1RSQUNFMCgoICJFUlJPUiA6IFRvbyBmZXcgYXJndW1lbnRzXG4iICkpOworICAgICAgICAgIGV4Yy0+ZXJyb3IgPSBUVF9FcnJfVG9vX0Zld19Bcmd1bWVudHM7CisgICAgICAgICAgZ290byBMRXJyb3JMYWJlbF87CisgICAgICAgIH0KKworICAgICAgICBDVVIubmV3X3RvcCA9IENVUi5hcmdzICsgKFBvcF9QdXNoX0NvdW50W0NVUi5vcGNvZGVdICYgMTUpOworCisgICAgICAvKiBuZXdfdG9wICBpcyB0aGUgbmV3IHRvcCBvZiB0aGUgc3RhY2ssIGFmdGVyIHRoZSBpbnN0cnVjdGlvbidzICovCisgICAgICAvKiBleGVjdXRpb24uIHRvcCB3aWxsIGJlIHNldCB0byBuZXdfdG9wIGFmdGVyIHRoZSAnY2FzZScgICAgICAgICovCisKKyAgICAgICAgaWYgKCBDVVIubmV3X3RvcCA+IENVUi5zdGFja1NpemUgKQorICAgICAgICB7CisgICAgICAgICAgRlRfVFJBQ0UwKCggIkVSUk9SIDogU3RhY2sgb3ZlcmZsb3dcbiIgKSk7CisgICAgICAgICAgZXhjLT5lcnJvciA9IFRUX0Vycl9TdGFja19PdmVyZmxvdzsKKyAgICAgICAgICBnb3RvIExFcnJvckxhYmVsXzsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgICBGVF9UUkFDRTAoKCAiRW5kIG9mIHByb2dyYW0gcmVhY2hlZC5cbiIgKSk7CisKKyAgICAgIGtleSA9IDA7CisgICAgICBkbworICAgICAgeworICAgICAgIC8qIHJlYWQga2V5Ym9hcmQgKi8KKworICAgICAgICBjaCA9IGdldGNoKCk7CisKKyAgICAgICAgc3dpdGNoICggY2ggKQorICAgICAgICB7CisgICAgICAgIC8qIEhlbHAgLSBzaG93IGtleWJpbmRpbmdzICovCisgICAgICAgIGNhc2UgJz8nOgorICAgICAgICAgIEZUX1RSQUNFMCgoICJGRGVidWcgSGVscFxuXG4iICkpOworICAgICAgICAgIEZUX1RSQUNFMCgoICI/ICAgU2hvdyB0aGlzIHBhZ2VcbiIgKSk7CisgICAgICAgICAgRlRfVFJBQ0UwKCggInEgICBRdWl0IGRlYnVnZ2VyXG4iICkpOworICAgICAgICAgIEZUX1RSQUNFMCgoICJuICAgU2tpcCB0byBuZXh0IGluc3RydWN0aW9uXG4iICkpOworICAgICAgICAgIEZUX1RSQUNFMCgoICJzICAgU3RlcCBpbnRvXG4iICkpOworICAgICAgICAgIEZUX1RSQUNFMCgoICJ2ICAgU2hvdyB2ZWN0b3IgaW5mb1xuIiApKTsKKyAgICAgICAgICBGVF9UUkFDRTAoKCAiZyAgIFNob3cgZ3JhcGhpY3Mgc3RhdGVcbiIgKSk7CisgICAgICAgICAgRlRfVFJBQ0UwKCggInAgICBTaG93IHBvaW50cyB6b25lXG5cbiIgKSk7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLyogU2hvdyB2ZWN0b3JzICovCisgICAgICAgIGNhc2UgJ3YnOgorICAgICAgICAgIEZUX1RSQUNFMCgoICJmcmVlZG9tICAgICglMDRoeCwlMDRoeClcbiIsIGV4Yy0+R1MuZnJlZVZlY3Rvci54LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGMtPkdTLmZyZWVWZWN0b3IueSApKTsKKyAgICAgICAgICBGVF9UUkFDRTAoKCAicHJvamVjdGlvbiAoJTA0aHgsJTA0aHgpXG4iLCBleGMtPkdTLnByb2pWZWN0b3IueCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjLT5HUy5wcm9qVmVjdG9yLnkgKSk7CisgICAgICAgICAgRlRfVFJBQ0UwKCggImR1YWwgICAgICAgKCUwNGh4LCUwNGh4KVxuXG4iLCBleGMtPkdTLmR1YWxWZWN0b3IueCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGMtPkdTLmR1YWxWZWN0b3IueSApKTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICAvKiBTaG93IGdyYXBoaWNzIHN0YXRlICovCisgICAgICAgIGNhc2UgJ2cnOgorICAgICAgICAgIEZUX1RSQUNFMCgoICJyb3VuZGluZyAgICVzXG4iLCByb3VuZF9zdHJbZXhjLT5HUy5yb3VuZF9zdGF0ZV0gKSk7CisgICAgICAgICAgRlRfVFJBQ0UwKCggIm1pbiBkaXN0ICAgJTA0bHhcbiIsIGV4Yy0+R1MubWluaW11bV9kaXN0YW5jZSApKTsKKyAgICAgICAgICBGVF9UUkFDRTAoKCAiY3Z0X2N1dGluICAlMDRseFxuIiwgZXhjLT5HUy5jb250cm9sX3ZhbHVlX2N1dGluICkpOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIC8qIFNob3cgcG9pbnRzIHRhYmxlICovCisgICAgICAgIGNhc2UgJ3AnOgorICAgICAgICAgIGZvciAoIEEgPSAwOyBBIDwgZXhjLT5wdHMubl9wb2ludHM7IEErKyApCisgICAgICAgICAgeworICAgICAgICAgICAgRlRfVFJBQ0UwKCggIiUwMmh4ICAiLCBBICkpOworICAgICAgICAgICAgRlRfVFJBQ0UwKCggIiUwOGx4LCUwOGx4IC0gIiwgcHRzLm9yZ1tBXS54LCBwdHMub3JnW0FdLnkgKSk7CisgICAgICAgICAgICBGVF9UUkFDRTAoKCAiJTA4bHgsJTA4bHhcbiIsICBwdHMuY3VyW0FdLngsIHB0cy5jdXJbQV0ueSApKTsKKyAgICAgICAgICB9CisgICAgICAgICAgRlRfVFJBQ0UwKCggIlxuIiApKTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGtleSA9IDE7CisgICAgICAgIH0KKyAgICAgIH0gd2hpbGUgKCAha2V5ICk7CisKKyAgICAgIE1FTV9Db3B5KCBzYXZlLm9yZywgICBwdHMub3JnLCBwdHMubl9wb2ludHMgKiBzaXplb2YgKCBUVF9WZWN0b3IgKSApOworICAgICAgTUVNX0NvcHkoIHNhdmUuY3VyLCAgIHB0cy5jdXIsIHB0cy5uX3BvaW50cyAqIHNpemVvZiAoIFRUX1ZlY3RvciApICk7CisgICAgICBNRU1fQ29weSggc2F2ZS50b3VjaCwgcHRzLnRvdWNoLCBwdHMubl9wb2ludHMgKTsKKworICAgICAgLyogYSByZXR1cm4gaW5kaWNhdGUgdGhlIGxhc3QgY29tbWFuZCAqLworICAgICAgaWYgKGNoID09ICdccicpCisgICAgICAgIGNoID0gb2xkY2g7CisKKyAgICAgIHN3aXRjaCAoIGNoICkKKyAgICAgIHsKKyAgICAgIC8qIFF1aXQgZGVidWdnZXIgKi8KKyAgICAgIGNhc2UgJ3EnOgorICAgICAgICBnb3RvIExFcnJvckxhYmVsXzsKKworICAgICAgLyogU3RlcCBvdmVyICovCisgICAgICBjYXNlICduJzoKKyAgICAgICAgaWYgKCBleGMtPklQIDwgZXhjLT5jb2RlU2l6ZSApCisgICAgICAgIHsKKyAgICAgICAgICAvKiBgc3RlcCBvdmVyJyBpcyBlcXVpdmFsZW50IHRvIGBzdGVwIGludG8nIGV4Y2VwdCBpZiAgKi8KKyAgICAgICAgICAvKiB0aGUgY3VycmVudCBvcGNvZGUgaXMgYSBDQUxMIG9yIExPT1BDQUxMICAgICAgICAgICAgKi8KKyAgICAgICAgICBpZiAoIENVUi5vcGNvZGUgIT0gMHgyYSAmJiBDVVIub3Bjb2RlICE9IDB4MmIgKQorICAgICAgICAgICAgZ290byBTdGVwX2ludG87CisKKyAgICAgICAgICAvKiBvdGhlcndpc2UsIGxvb3AgZXhlY3V0aW9uIHVudGlsIHdlIHJlYWNoIHRoZSBuZXh0IG9wY29kZSAqLworICAgICAgICAgIG5leHRfSVAgPSBDVVIuSVAgKyBDVVIubGVuZ3RoOworICAgICAgICAgIHdoaWxlICggZXhjLT5JUCAhPSBuZXh0X0lQICkKKyAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoICggZXJyb3IgPSBUVF9SdW5JbnMyKCBleGMgKSApICkKKyAgICAgICAgICAgICAgZ290byBMRXJyb3JMYWJlbF87CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG9sZGNoID0gY2g7CisgICAgICAgIGJyZWFrOworCisgICAgICAvKiBTdGVwIGludG8gKi8KKyAgICAgIGNhc2UgJ3MnOgorICAgICAgICBpZiAoIGV4Yy0+SVAgPCBleGMtPmNvZGVTaXplICkKKworICAgICAgU3RlcF9pbnRvOgorICAgICAgICAgIGlmICggKCBlcnJvciA9IFRUX1J1bkluczIoIGV4YyApICkgKQorICAgICAgICAgICAgZ290byBMRXJyb3JMYWJlbF87CisgICAgICAgIG9sZGNoID0gY2g7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICBGVF9UUkFDRTAoKCAidW5rbm93biBjb21tYW5kLiBQcmVzcyA/IGZvciBoZWxwXG4iICkpOworICAgICAgICBvbGRjaCA9ICdcMCc7CisgICAgICB9CisKKyAgICAgIGZvciAoIEEgPSAwOyBBIDwgcHRzLm5fcG9pbnRzOyBBKysgKQorICAgICAgeworICAgICAgICBkaWZmID0gMDsKKyAgICAgICAgaWYgKCBzYXZlLm9yZ1tBXS54ICE9IHB0cy5vcmdbQV0ueCApIGRpZmYgfD0gMTsKKyAgICAgICAgaWYgKCBzYXZlLm9yZ1tBXS55ICE9IHB0cy5vcmdbQV0ueSApIGRpZmYgfD0gMjsKKyAgICAgICAgaWYgKCBzYXZlLmN1cltBXS54ICE9IHB0cy5jdXJbQV0ueCApIGRpZmYgfD0gNDsKKyAgICAgICAgaWYgKCBzYXZlLmN1cltBXS55ICE9IHB0cy5jdXJbQV0ueSApIGRpZmYgfD0gODsKKyAgICAgICAgaWYgKCBzYXZlLnRvdWNoW0FdICE9IHB0cy50b3VjaFtBXSApIGRpZmYgfD0gMTY7CisKKyAgICAgICAgaWYgKCBkaWZmICkKKyAgICAgICAgeworICAgICAgICAgIEZUX1RSQUNFMCgoICIlMDJoeCAgIiwgQSApKTsKKworICAgICAgICAgIGlmICggZGlmZiAmIDE2ICkgdGVtcCA9ICIoJTAxaHgpIjsgZWxzZSB0ZW1wID0gIiAlMDFoeCAiOworICAgICAgICAgIEZUX1RSQUNFMCgoIHRlbXAsIHNhdmUudG91Y2hbQV0gJiA3ICkpOworCisgICAgICAgICAgaWYgKCBkaWZmICYgMSApIHRlbXAgPSAiKCUwOGx4KSI7IGVsc2UgdGVtcCA9ICIgJTA4bHggIjsKKyAgICAgICAgICBGVF9UUkFDRTAoKCB0ZW1wLCBzYXZlLm9yZ1tBXS54ICkpOworCisgICAgICAgICAgaWYgKCBkaWZmICYgMiApIHRlbXAgPSAiKCUwOGx4KSI7IGVsc2UgdGVtcCA9ICIgJTA4bHggIjsKKyAgICAgICAgICBGVF9UUkFDRTAoKCB0ZW1wLCBzYXZlLm9yZ1tBXS55ICkpOworCisgICAgICAgICAgaWYgKCBkaWZmICYgNCApIHRlbXAgPSAiKCUwOGx4KSI7IGVsc2UgdGVtcCA9ICIgJTA4bHggIjsKKyAgICAgICAgICBGVF9UUkFDRTAoKCB0ZW1wLCBzYXZlLmN1cltBXS54ICkpOworCisgICAgICAgICAgaWYgKCBkaWZmICYgOCApIHRlbXAgPSAiKCUwOGx4KSI7IGVsc2UgdGVtcCA9ICIgJTA4bHggIjsKKyAgICAgICAgICBGVF9UUkFDRTAoKCB0ZW1wLCBzYXZlLmN1cltBXS55ICkpOworCisgICAgICAgICAgRlRfVFJBQ0UwKCggIlxuIiApKTsKKworICAgICAgICAgIEZUX1RSQUNFMCgoICIlMDJoeCAgIiwgQSApKTsKKworICAgICAgICAgIGlmICggZGlmZiAmIDE2ICkgdGVtcCA9ICJbJTAxaHhdIjsgZWxzZSB0ZW1wID0gIiAlMDFoeCAiOworICAgICAgICAgIEZUX1RSQUNFMCgoIHRlbXAsIHB0cy50b3VjaFtBXSAmIDcgKSk7CisKKyAgICAgICAgICBpZiAoIGRpZmYgJiAxICkgdGVtcCA9ICJbJTA4bHhdIjsgZWxzZSB0ZW1wID0gIiAlMDhseCAiOworICAgICAgICAgIEZUX1RSQUNFMCgoIHRlbXAsIHB0cy5vcmdbQV0ueCApKTsKKworICAgICAgICAgIGlmICggZGlmZiAmIDIgKSB0ZW1wID0gIlslMDhseF0iOyBlbHNlIHRlbXAgPSAiICUwOGx4ICI7CisgICAgICAgICAgRlRfVFJBQ0UwKCggdGVtcCwgcHRzLm9yZ1tBXS55ICkpOworCisgICAgICAgICAgaWYgKCBkaWZmICYgNCApIHRlbXAgPSAiWyUwOGx4XSI7IGVsc2UgdGVtcCA9ICIgJTA4bHggIjsKKyAgICAgICAgICBGVF9UUkFDRTAoKCB0ZW1wLCBwdHMuY3VyW0FdLnggKSk7CisKKyAgICAgICAgICBpZiAoIGRpZmYgJiA4ICkgdGVtcCA9ICJbJTA4bHhdIjsgZWxzZSB0ZW1wID0gIiAlMDhseCAiOworICAgICAgICAgIEZUX1RSQUNFMCgoIHRlbXAsIHB0cy5jdXJbQV0ueSApKTsKKworICAgICAgICAgIEZUX1RSQUNFMCgoICJcblxuIiApKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gd2hpbGUgKCBUUlVFICk7CisKKyAgTEVycm9yTGFiZWxfOgorCisgICAgcmV0dXJuIGVycm9yOworCisgIExFcnJvckNvZGVPdmVyZmxvd186CisgICAgZXJyb3IgPSBUVF9FcnJfQ29kZV9PdmVyZmxvdzsKKyAgICByZXR1cm4gZXJyb3I7CisgIH0KKworI2VuZGlmIC8qIERFQlVHX0lOVEVSUFJFVEVSICovCisKKworLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvdHJ1ZXR5cGUvdHRpbnRlcnAuaCBiL3NyYy90cnVldHlwZS90dGludGVycC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2Y2Q0YTUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdHJ1ZXR5cGUvdHRpbnRlcnAuaApAQCAtMCwwICsxLDQ3MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgdHRpbnRlcnAuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIFRydWVUeXBlIGJ5dGVjb2RlIGludGVwcmV0ZXIgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAxOTk2LTE5OTkgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCAgICAgICAgKi8KKy8qICBtb2RpZmllZCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgICovCisvKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLworLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KKy8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjaWZuZGVmIFRUSU5URVJQX0gKKyNkZWZpbmUgVFRJTlRFUlBfSAorCisjaW5jbHVkZSA8dHRvYmpzLmg+CisKKworI2lmZGVmIF9fY3BsdXNwbHVzCisgIGV4dGVybiAiQyIgeworI2VuZGlmCisKKworI2lmbmRlZiBUVF9TVEFUSUNfSU5URVBSRVRFUiAgLyogaW5kaXJlY3QgaW1wbGVtZW50YXRpb24gKi8KKworI2RlZmluZSBFWEVDX09QXyAgIFRUX0V4ZWNDb250ZXh0ICBleGMsCisjZGVmaW5lIEVYRUNfT1AgICAgVFRfRXhlY0NvbnRleHQgIGV4YworI2RlZmluZSBFWEVDX0FSR18gIGV4YywKKyNkZWZpbmUgRVhFQ19BUkcgICBleGMKKworI2Vsc2UgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN0YXRpYyBpbXBsZW1lbnRhdGlvbiAqLworCisjZGVmaW5lIEVYRUNfT1BfICAgLyogdm9pZCAqLworI2RlZmluZSBFWEVDX09QICAgIC8qIHZvaWQgKi8KKyNkZWZpbmUgRVhFQ19BUkdfICAvKiB2b2lkICovCisjZGVmaW5lIEVYRUNfQVJHICAgLyogdm9pZCAqLworCisjZW5kaWYgLyogVFRfU1RBVElDX0lOVEVSUFJFVEVSICovCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFJvdW5kaW5nIG1vZGUgY29uc3RhbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVFRfUm91bmRfT2ZmICAgICAgICAgICAgIDUKKyNkZWZpbmUgVFRfUm91bmRfVG9fSGFsZl9HcmlkICAgIDAKKyNkZWZpbmUgVFRfUm91bmRfVG9fR3JpZCAgICAgICAgIDEKKyNkZWZpbmUgVFRfUm91bmRfVG9fRG91YmxlX0dyaWQgIDIKKyNkZWZpbmUgVFRfUm91bmRfVXBfVG9fR3JpZCAgICAgIDQKKyNkZWZpbmUgVFRfUm91bmRfRG93bl9Ub19HcmlkICAgIDMKKyNkZWZpbmUgVFRfUm91bmRfU3VwZXIgICAgICAgICAgIDYKKyNkZWZpbmUgVFRfUm91bmRfU3VwZXJfNDUgICAgICAgIDcKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogRnVuY3Rpb24gdHlwZXMgdXNlZCBieSB0aGUgaW50ZXJwcmV0ZXIsIGRlcGVuZGluZyBvbiB2YXJpb3VzIG1vZGVzICAgICovCisgIC8qIChlLmcuIHRoZSByb3VuZGluZyBtb2RlLCB3aGV0aGVyIHRvIHJlbmRlciBhIHZlcnRpY2FsIG9yIGhvcml6b250YWwgICAqLworICAvKiBsaW5lIGV0YykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIC8qIFJvdW5kaW5nIGZ1bmN0aW9uICovCisgIHR5cGVkZWYgVFRfRjI2RG90NiAgKCpUVF9Sb3VuZF9GdW5jKSggRVhFQ19PUF8gVFRfRjI2RG90NiAgZGlzdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfRjI2RG90NiAgY29tcGVuc2F0aW9uICk7CisKKyAgLyogUG9pbnQgZGlzcGxhY2VtZW50IGFsb25nIHRoZSBmcmVlZG9tIHZlY3RvciByb3V0aW5lICovCisgIHR5cGVkZWYgdm9pZCAgKCpUVF9Nb3ZlX0Z1bmMpKCBFWEVDX09QXyBUVF9HbHlwaFpvbmUqICB6b25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfVUludCAgICAgICAgcG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9GMjZEb3Q2ICAgICBkaXN0YW5jZSApOworCisgIC8qIERpc3RhbmNlIHByb2plY3Rpb24gYWxvbmcgb25lIG9mIHRoZSBwcm9qZWN0aW9uIHZlY3RvcnMgKi8KKyAgdHlwZWRlZiBUVF9GMjZEb3Q2ICAoKlRUX1Byb2plY3RfRnVuYykoIEVYRUNfT1BfIFRUX1ZlY3RvciogIHYxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfVmVjdG9yKiAgdjIgKTsKKworICAvKiByZWFkaW5nIGEgY3Z0IHZhbHVlLiAgVGFrZSBjYXJlIG9mIG5vbi1zcXVhcmUgcGl4ZWxzIGlmIG5lY2Vzc2FyeSAqLworICB0eXBlZGVmIFRUX0YyNkRvdDYgICgqVFRfR2V0X0NWVF9GdW5jKSggRVhFQ19PUF8gVFRfVUxvbmcgIGluZGV4ICk7CisKKyAgLyogc2V0dGluZyBvciBtb3ZpbmcgYSBjdnQgdmFsdWUuICBUYWtlIGNhcmUgb2Ygbm9uLXNxdWFyZSBwaXhlbHMgICovCisgIC8qIGlmIG5lY2Vzc2FyeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHZvaWQgICgqVFRfU2V0X0NWVF9GdW5jKSggRVhFQ19PUF8gVFRfVUxvbmcgICAgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9GMjZEb3Q2ICB2YWx1ZSApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIGEgY2FsbCByZWNvcmQsIHVzZWQgdG8gbWFuYWdlIGZ1bmN0aW9uIGNhbGxzLiAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgc3RydWN0ICBUVF9DYWxsUmVjXworICB7CisgICAgVFRfSW50ICAgQ2FsbGVyX1JhbmdlOworICAgIFRUX0xvbmcgIENhbGxlcl9JUDsKKyAgICBUVF9Mb25nICBDdXJfQ291bnQ7CisgICAgVFRfTG9uZyAgQ3VyX1Jlc3RhcnQ7CisKKyAgfSBUVF9DYWxsUmVjLCAqVFRfQ2FsbFN0YWNrOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBUaGUgbWFpbiBzdHJ1Y3R1cmUgZm9yIHRoZSBpbnRlcnByZXRlciB3aGljaCBjb2xsZWN0cyBhbGwgbmVjZXNzYXJ5ICAgKi8KKyAgLyogdmFyaWFibGVzIGFuZCBzdGF0ZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHN0cnVjdCAgVFRfRXhlY0NvbnRleHRSZWNfCisgIHsKKyAgICBUVF9GYWNlICAgICAgICAgZmFjZTsKKyAgICBUVF9TaXplICAgICAgICAgc2l6ZTsKKyAgICBGVF9NZW1vcnkgICAgICAgbWVtb3J5OworCisgICAgLyogaW5zdHJ1Y3Rpb25zIHN0YXRlICovCisKKyAgICBUVF9FcnJvciAgICAgICAgZXJyb3I7ICAgICAgLyogbGFzdCBleGVjdXRpb24gZXJyb3IgKi8KKworICAgIFRUX0xvbmcgICAgICAgICB0b3A7ICAgICAgICAvKiB0b3Agb2YgZXhlYy4gc3RhY2sgICAqLworCisgICAgVFRfVUludCAgICAgICAgIHN0YWNrU2l6ZTsgIC8qIHNpemUgb2YgZXhlYy4gc3RhY2sgICovCisgICAgVFRfTG9uZyogICAgICAgIHN0YWNrOyAgICAgIC8qIGN1cnJlbnQgZXhlYy4gc3RhY2sgICovCisKKyAgICBUVF9Mb25nICAgICAgICAgYXJnczsKKyAgICBUVF9VSW50ICAgICAgICAgbmV3X3RvcDsgICAgLyogbmV3IHRvcCBhZnRlciBleGVjLiAgKi8KKworICAgIFRUX0dseXBoWm9uZSAgICB6cDAsICAgICAgICAvKiB6b25lIHJlY29yZHMgKi8KKyAgICAgICAgICAgICAgICAgICAgenAxLAorICAgICAgICAgICAgICAgICAgICB6cDIsCisgICAgICAgICAgICAgICAgICAgIHB0cywKKyAgICAgICAgICAgICAgICAgICAgdHdpbGlnaHQ7CisKKyAgICBGVF9TaXplX01ldHJpY3MgIG1ldHJpY3M7CisgICAgVFRfU2l6ZV9NZXRyaWNzICB0dF9tZXRyaWNzOyAvKiBzaXplIG1ldHJpY3MgKi8KKworICAgIFRUX0dyYXBoaWNzU3RhdGUgIEdTOyAgICAgICAgIC8qIGN1cnJlbnQgZ3JhcGhpY3Mgc3RhdGUgKi8KKworICAgIFRUX0ludCAgICAgICAgICBjdXJSYW5nZTsgIC8qIGN1cnJlbnQgY29kZSByYW5nZSBudW1iZXIgICAqLworICAgIFRUX0J5dGUqICAgICAgICBjb2RlOyAgICAgIC8qIGN1cnJlbnQgY29kZSByYW5nZSAgICAgICAgICAqLworICAgIFRUX0xvbmcgICAgICAgICBJUDsgICAgICAgIC8qIGN1cnJlbnQgaW5zdHJ1Y3Rpb24gcG9pbnRlciAqLworICAgIFRUX0xvbmcgICAgICAgICBjb2RlU2l6ZTsgIC8qIHNpemUgb2YgY3VycmVudCByYW5nZSAgICAgICAqLworCisgICAgVFRfQnl0ZSAgICAgICAgIG9wY29kZTsgICAgLyogY3VycmVudCBvcGNvZGUgICAgICAgICAgICAgICovCisgICAgVFRfSW50ICAgICAgICAgIGxlbmd0aDsgICAgLyogbGVuZ3RoIG9mIGN1cnJlbnQgb3Bjb2RlICAgICovCisKKyAgICBUVF9Cb29sICAgICAgICAgc3RlcF9pbnM7ICAvKiB0cnVlIGlmIHRoZSBpbnRlcnByZXRlciBtdXN0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5jcmVtZW50IElQIGFmdGVyIGlucy4gZXhlYyAqLworICAgIFRUX0xvbmcgICAgICAgICBjdnRTaXplOworICAgIFRUX0xvbmcqICAgICAgICBjdnQ7CisKKyAgICBUVF9VSW50ICAgICAgICAgZ2x5cGhTaXplOyAvKiBnbHlwaCBpbnN0cnVjdGlvbnMgYnVmZmVyIHNpemUgKi8KKyAgICBUVF9CeXRlKiAgICAgICAgZ2x5cGhJbnM7ICAvKiBnbHlwaCBpbnN0cnVjdGlvbnMgYnVmZmVyICovCisKKyAgICBUVF9VSW50ICAgICAgICAgbnVtRkRlZnM7ICAvKiBudW1iZXIgb2YgZnVuY3Rpb24gZGVmcyAgICAgICAgICovCisgICAgVFRfVUludCAgICAgICAgIG1heEZEZWZzOyAgLyogbWF4aW11bSBudW1iZXIgb2YgZnVuY3Rpb24gZGVmcyAqLworICAgIFRUX0RlZkFycmF5ICAgICBGRGVmczsgICAgIC8qIHRhYmxlIG9mIEZEZWZzIGVudHJpZXMgICAgICAgICAgKi8KKworICAgIFRUX1VJbnQgICAgICAgICBudW1JRGVmczsgIC8qIG51bWJlciBvZiBpbnN0cnVjdGlvbiBkZWZzICovCisgICAgVFRfVUludCAgICAgICAgIG1heElEZWZzOyAgLyogbWF4aW11bSBudW1iZXIgb2YgaW5zIGRlZnMgKi8KKyAgICBUVF9EZWZBcnJheSAgICAgSURlZnM7ICAgICAvKiB0YWJsZSBvZiBJRGVmcyBlbnRyaWVzICAgICAqLworCisgICAgVFRfVUludCAgICAgICAgIG1heEZ1bmM7ICAgLyogbWF4aW11bSBmdW5jdGlvbiBpbmRleCAgICAgKi8KKyAgICBUVF9VSW50ICAgICAgICAgbWF4SW5zOyAgICAvKiBtYXhpbXVtIGluc3RydWN0aW9uIGluZGV4ICAqLworCisgICAgVFRfSW50ICAgICAgICAgIGNhbGxUb3AsICAgIC8qIHRvcCBvZiBjYWxsIHN0YWNrIGR1cmluZyBleGVjdXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgY2FsbFNpemU7ICAgLyogc2l6ZSBvZiBjYWxsIHN0YWNrICovCisgICAgVFRfQ2FsbFN0YWNrICAgIGNhbGxTdGFjazsgIC8qIGNhbGwgc3RhY2sgKi8KKworICAgIFRUX1VTaG9ydCAgICAgICBtYXhQb2ludHM7ICAgIC8qIGNhcGFjaXR5IG9mIHRoaXMgY29udGV4dCdzIGBwdHMnICovCisgICAgVFRfU2hvcnQgICAgICAgIG1heENvbnRvdXJzOyAgLyogcmVjb3JkLCBleHByZXNzZWQgaW4gcG9pbnRzIGFuZCAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb250b3Vycy4gICAgICAgICAgICAgICAgICAgICAgICAqLworCisgICAgVFRfQ29kZVJhbmdlVGFibGUgIGNvZGVSYW5nZVRhYmxlOyAgLyogdGFibGUgb2YgdmFsaWQgY29kZSByYW5nZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB1c2VmdWwgZm9yIHRoZSBkZWJ1Z2dlciAgICovCisKKyAgICBUVF9VU2hvcnQgICAgICAgc3RvcmVTaXplOyAgLyogc2l6ZSBvZiBjdXJyZW50IHN0b3JhZ2UgKi8KKyAgICBUVF9Mb25nKiAgICAgICAgc3RvcmFnZTsgICAgLyogc3RvcmFnZSBhcmVhICAgICAgICAgICAgKi8KKworICAgIFRUX0YyNkRvdDYgICAgICBwZXJpb2Q7ICAgICAvKiB2YWx1ZXMgdXNlZCBmb3IgdGhlICovCisgICAgVFRfRjI2RG90NiAgICAgIHBoYXNlOyAgICAgIC8qIGBTdXBlclJvdW5kaW5nJyAgICAgKi8KKyAgICBUVF9GMjZEb3Q2ICAgICAgdGhyZXNob2xkOworCisgICAgLyogdGhpcyBzZWVtcyB0byBiZSB1bnVzZWQgKi8KKyNpZiAwCisgICAgVFRfSW50ICAgICAgICAgIGN1cl9wcGVtOyAgICAgICAvKiBwcGVtIGFsb25nIHRoZSBjdXJyZW50IHByb2ogdmVjdG9yICovCisjZW5kaWYKKyAgICBUVF9Cb29sICAgICAgICAgaW5zdHJ1Y3Rpb25fdHJhcDsgIC8qIElmIGBUcnVlJywgdGhlIGludGVycHJldGVyIHdpbGwgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGV4aXQgYWZ0ZXIgZWFjaCBpbnN0cnVjdGlvbiAgICAgKi8KKworICAgIFRUX0dyYXBoaWNzU3RhdGUgIGRlZmF1bHRfR1M7ICAgICAgLyogZ3JhcGhpY3Mgc3RhdGUgcmVzdWx0aW5nIGZyb20gICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoZSBwcmVwIHByb2dyYW0gICAgICAgICAgICAgICAgICovCisgICAgVFRfQm9vbCAgICAgICAgICBpc19jb21wb3NpdGU7ICAgICAvKiB0cnVlIGlmIHRoZSBnbHlwaCBpcyBjb21wb3NpdGUgICAqLworICAgIFRUX0Jvb2wgICAgICAgICAgcGVkYW50aWNfaGludGluZzsgLyogdHJ1ZSBmb3IgcGVkYW50aWMgaW50ZXJwcmV0YXRpb24gKi8KKworICAgIC8qIGxhdGVzdCBpbnRlcnByZXRlciBhZGRpdGlvbnMgKi8KKworICAgIFRUX0xvbmcgICAgICAgICAgICBGX2RvdF9QOyAgICAvKiBkb3QgcHJvZHVjdCBvZiBmcmVlZG9tIGFuZCBwcm9qZWN0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHZlY3RvcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBUVF9Sb3VuZF9GdW5jICAgICAgZnVuY19yb3VuZDsgLyogY3VycmVudCByb3VuZGluZyBmdW5jdGlvbiAgICAgICAgICAgICAqLworCisgICAgVFRfUHJvamVjdF9GdW5jICAgIGZ1bmNfcHJvamVjdCwgICAvKiBjdXJyZW50IHByb2plY3Rpb24gZnVuY3Rpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgZnVuY19kdWFscHJvaiwgIC8qIGN1cnJlbnQgZHVhbCBwcm9qLiBmdW5jdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICBmdW5jX2ZyZWVQcm9qOyAgLyogY3VycmVudCBmcmVlZG9tIHByb2ouIGZ1bmMgICovCisKKyAgICBUVF9Nb3ZlX0Z1bmMgICAgICAgZnVuY19tb3ZlOyAgICAgIC8qIGN1cnJlbnQgcG9pbnQgbW92ZSBmdW5jdGlvbiAqLworCisgICAgVFRfR2V0X0NWVF9GdW5jICAgIGZ1bmNfcmVhZF9jdnQ7ICAvKiByZWFkIGEgY3Z0IGVudHJ5ICAgICAgICAgICAgICAqLworICAgIFRUX1NldF9DVlRfRnVuYyAgICBmdW5jX3dyaXRlX2N2dDsgLyogd3JpdGUgYSBjdnQgZW50cnkgKGluIHBpeGVscykgKi8KKyAgICBUVF9TZXRfQ1ZUX0Z1bmMgICAgZnVuY19tb3ZlX2N2dDsgIC8qIGluY3IgYSBjdnQgZW50cnkgKGluIHBpeGVscykgICovCisKKyAgICBUVF9VTG9uZyAgICAgICAgICAgbG9hZFNpemU7CisgICAgVFRfU3ViR2x5cGhfU3RhY2sgIGxvYWRTdGFjazsgICAgICAvKiBsb2FkaW5nIHN1YmdseXBoIHN0YWNrICovCisKKyAgfSBUVF9FeGVjQ29udGV4dFJlYzsKKworCisKKyAgTE9DQUxfREVGCisgIGNvbnN0IFRUX0dyYXBoaWNzU3RhdGUgIHR0X2RlZmF1bHRfZ3JhcGhpY3Nfc3RhdGU7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUVF9Hb3RvX0NvZGVSYW5nZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBTd2l0Y2hlcyB0byBhIG5ldyBjb2RlIHJhbmdlICh1cGRhdGVzIHRoZSBjb2RlIHJlbGF0ZWQgZWxlbWVudHMgaW4gKi8KKyAgLyogICAgYGV4ZWMnLCBhbmQgYElQJykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgcmFuZ2UgOjogVGhlIG5ldyBleGVjdXRpb24gY29kZSByYW5nZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIElQICAgIDo6IFRoZSAgbmV3IElQIGluIHRoZSBuZXcgY29kZSByYW5nZS4gICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGV4ZWMgIDo6IFRoZSB0YXJnZXQgZXhlY3V0aW9uIGNvbnRleHQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgVHJ1ZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgTE9DQUxfREVGCisgIFRUX0Vycm9yICBUVF9Hb3RvX0NvZGVSYW5nZSggVFRfRXhlY0NvbnRleHQgIGV4ZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfSW50ICAgICAgICAgIHJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX0xvbmcgICAgICAgICBJUCApOworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX1NldF9Db2RlUmFuZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFNldHMgYSBjb2RlIHJhbmdlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHJhbmdlICA6OiBUaGUgY29kZSByYW5nZSBpbmRleC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBiYXNlICAgOjogVGhlIG5ldyBjb2RlIGJhc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbGVuZ3RoIDo6IFRoZSByYW5nZSBzaXplIGluIGJ5dGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZXhlYyAgIDo6IFRoZSB0YXJnZXQgZXhlY3V0aW9uIGNvbnRleHQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICBUcnVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBMT0NBTF9ERUYKKyAgVFRfRXJyb3IgIFRUX1NldF9Db2RlUmFuZ2UoIFRUX0V4ZWNDb250ZXh0ICBleGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfSW50ICAgICAgICAgIHJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICAgICAgIGJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9Mb25nICAgICAgICAgbGVuZ3RoICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUVF9DbGVhcl9Db2RlUmFuZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBDbGVhcnMgYSBjb2RlIHJhbmdlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICByYW5nZSA6OiBUaGUgY29kZSByYW5nZSBpbmRleC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBleGVjICA6OiBUaGUgdGFyZ2V0IGV4ZWN1dGlvbiBjb250ZXh0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIFRydWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBEb2VzIG5vdCBzZXQgdGhlIEVycm9yIHZhcmlhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIExPQ0FMX0RFRgorICBUVF9FcnJvciAgVFRfQ2xlYXJfQ29kZVJhbmdlKCBUVF9FeGVjQ29udGV4dCAgZXhlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfSW50ICAgICAgICAgIHJhbmdlICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUVF9OZXdfQ29udGV4dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBRdWVyaWVzIHRoZSBmYWNlIGNvbnRleHQgZm9yIGEgZ2l2ZW4gZm9udC4gIE5vdGUgdGhhdCB0aGVyZSBpcyAgICAgKi8KKyAgLyogICAgbm93IGEgX3NpbmdsZV8gZXhlY3V0aW9uIGNvbnRleHQgaW4gdGhlIFRydWVUeXBlIGRyaXZlciB3aGljaCBpcyAgICovCisgIC8qICAgIHNoYXJlZCBhbW9uZyBmYWNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZhY2UgOjogQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgaGFuZGxlIHRvIHRoZSBleGVjdXRpb24gY29udGV4dC4gIEluaXRpYWxpemVkIGZvciBgZmFjZScuICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIE9ubHkgdGhlIGdseXBoIGxvYWRlciBhbmQgZGVidWdnZXIgc2hvdWxkIGNhbGwgdGhpcyBmdW5jdGlvbi4gICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgRVhQT1JUX0RFRgorICBUVF9FeGVjQ29udGV4dCAgVFRfTmV3X0NvbnRleHQoIFRUX0ZhY2UgIGZhY2UgKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX0RvbmVfQ29udGV4dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIERpc2NhcmRzIGFuIGV4ZWN1dGlvbiBjb250ZXh0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGV4ZWMgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBleGVjdXRpb24gY29udGV4dC4gICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRydWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIE9ubHkgdGhlIGdseXBoIGxvYWRlciBhbmQgZGVidWdnZXIgc2hvdWxkIGNhbGwgdGhpcyBmdW5jdGlvbi4gICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgRVhQT1JUX0RFRgorICBUVF9FcnJvciAgVFRfRG9uZV9Db250ZXh0KCBUVF9FeGVjQ29udGV4dCAgZXhlYyApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfRGVzdHJveV9Db250ZXh0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRGVzdHJveXMgYSBnaXZlbiBjb250ZXh0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZXhlYyAgIDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZXhlY3V0aW9uIGNvbnRleHQuICAgICAgICAgICAgICAgICovCisgIC8qICAgIG1lbW9yeSA6OiBBIGhhbmRsZSB0byB0aGUgcGFyZW50IG1lbW9yeSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRydWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIE9ubHkgdGhlIGdseXBoIGxvYWRlciBhbmQgZGVidWdnZXIgc2hvdWxkIGNhbGwgdGhpcyBmdW5jdGlvbi4gICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgTE9DQUxfREVGCisgIFRUX0Vycm9yICBUVF9EZXN0cm95X0NvbnRleHQoIFRUX0V4ZWNDb250ZXh0ICBleGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9NZW1vcnkgICAgICAgbWVtb3J5ICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUVF9Mb2FkX0NvbnRleHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBQcmVwYXJlIGFuIGV4ZWN1dGlvbiBjb250ZXh0IGZvciBnbHlwaCBoaW50aW5nLiAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBleGVjIDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZXhlY3V0aW9uIGNvbnRleHQuICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZmFjZSA6OiBBIGhhbmRsZSB0byB0aGUgc291cmNlIGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHNpemUgOjogQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBzaXplIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRydWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIE9ubHkgdGhlIGdseXBoIGxvYWRlciBhbmQgZGVidWdnZXIgc2hvdWxkIGNhbGwgdGhpcyBmdW5jdGlvbi4gICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgRVhQT1JUX0RFRgorICBUVF9FcnJvciAgVFRfTG9hZF9Db250ZXh0KCBUVF9FeGVjQ29udGV4dCAgZXhlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfRmFjZSAgICAgICAgIGZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX1NpemUgICAgICAgICBzaXplICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUVF9TYXZlX0NvbnRleHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBTYXZlcyB0aGUgY29kZSByYW5nZXMgaW4gYSBgc2l6ZScgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBleGVjIDo6IEEgaGFuZGxlIHRvIHRoZSBzb3VyY2UgZXhlY3V0aW9uIGNvbnRleHQuICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBpbnMgIDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgc2l6ZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUcnVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBPbmx5IHRoZSBnbHlwaCBsb2FkZXIgYW5kIGRlYnVnZ2VyIHNob3VsZCBjYWxsIHRoaXMgZnVuY3Rpb24uICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIExPQ0FMX0RFRgorICBUVF9FcnJvciAgVFRfU2F2ZV9Db250ZXh0KCBUVF9FeGVjQ29udGV4dCAgZXhlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfU2l6ZSAgICAgICAgIGlucyApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfUnVuX0NvbnRleHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRXhlY3V0ZXMgb25lIG9yIG1vcmUgaW5zdHJ1Y3Rpb25zIGluIHRoZSBleGVjdXRpb24gY29udGV4dC4gICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZXhlYyAgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBleGVjdXRpb24gY29udGV4dC4gICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBkZWJ1ZyA6OiBBIEJvb2xlYW4gZmxhZy4gIElmIHNldCwgdGhlIGZ1bmN0aW9uIHNldHMgc29tZSBpbnRlcm5hbCAgKi8KKyAgLyogICAgICAgICAgICAgdmFyaWFibGVzIGFuZCByZXR1cm5zIGltbWVkaWF0ZWx5LCBvdGhlcndpc2UgVFRfUnVuSW5zKCkgICovCisgIC8qICAgICAgICAgICAgIGlzIGNhbGxlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRydWVUeW9lIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIE9ubHkgdGhlIGdseXBoIGxvYWRlciBhbmQgZGVidWdnZXIgc2hvdWxkIGNhbGwgdGhpcyBmdW5jdGlvbi4gICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgTE9DQUxfREVGCisgIFRUX0Vycm9yICBUVF9SdW5fQ29udGV4dCggVFRfRXhlY0NvbnRleHQgIGV4ZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfQm9vbCAgICAgICAgIGRlYnVnICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUVF9SdW5JbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBFeGVjdXRlcyBvbmUgb3IgbW9yZSBpbnN0cnVjdGlvbiBpbiB0aGUgZXhlY3V0aW9uIGNvbnRleHQuICBUaGlzICAgKi8KKyAgLyogICAgaXMgdGhlIG1haW4gZnVuY3Rpb24gb2YgdGhlIFRydWVUeXBlIG9wY29kZSBpbnRlcnByZXRlci4gICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZXhlYyA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGV4ZWN1dGlvbiBjb250ZXh0LiAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVHJ1ZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgT25seSBvYmplY3QgbWFuYWdlciBhbmQgZGVidWdnZXIgc2hvdWxkIGNhbGwgdGhpcyBmdW5jdGlvbi4gICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBFWFBPUlRfREVGCisgIFRUX0Vycm9yICBUVF9SdW5JbnMoIFRUX0V4ZWNDb250ZXh0ICBleGVjICk7CisKKworI2lmZGVmIF9fY3BsdXNwbHVzCisgIH0KKyNlbmRpZgorCisjZW5kaWYgLyogVFRJTlRFUlBfSCAqLworCisKKy8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3RydWV0eXBlL3R0bmFtZWlkLmggYi9zcmMvdHJ1ZXR5cGUvdHRuYW1laWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGIxOWFiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RydWV0eXBlL3R0bmFtZWlkLmgKQEAgLTAsMCArMSw2MDMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHR0bmFtZWlkLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBUcnVlVHlwZSBuYW1lIElEIGRlZmluaXRpb25zIChzcGVjaWZpY2F0aW9uIG9ubHkpLiAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMTk5Ni0xOTk5IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQgICAgICAgICovCisvKiAgbW9kaWZpZWQgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICAqLworLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KKy8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCisvKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2lmbmRlZiBGUkVFVFlQRV9ICisjZXJyb3IgIkRvbid0IGluY2x1ZGUgdGhpcyBmaWxlISBVc2UgZnJlZXR5cGUuaCBpbnN0ZWFkLiIKKyNlbmRpZgorCisKKyNpZm5kZWYgVFROQU1FSURfSAorI2RlZmluZSBUVE5BTUVJRF9ICisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFBvc3NpYmxlIHZhbHVlcyBmb3IgdGhlIGBQbGF0Zm9ybScgaWRlbnRpZmllciBjb2RlIGluIHRoZSBuYW1lICAgICAgICAqLworICAvKiByZWNvcmRzIG9mIHRoZSBUVEYgYG5hbWUnIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRUX1BMQVRGT1JNX0FQUExFX1VOSUNPREUgIDAKKyNkZWZpbmUgVFRfUExBVEZPUk1fTUFDSU5UT1NIICAgICAgMQorI2RlZmluZSBUVF9QTEFURk9STV9JU08gICAgICAgICAgICAyCisjZGVmaW5lIFRUX1BMQVRGT1JNX01JQ1JPU09GVCAgICAgIDMKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogUG9zc2libGUgdmFsdWVzIG9mIHRoZSBwbGF0Zm9ybSBzcGVjaWZpYyBlbmNvZGluZyBpZGVudGlmaWVyIGZpZWxkIGluICovCisgIC8qIHRoZSBuYW1lIHJlY29yZHMgb2YgdGhlIFRURiBgbmFtZScgdGFibGUgd2hlbiB0aGUgYFBsYXRmb3JtJyAgICAgICAgICAqLworICAvKiBpZGVudGlmaWVyIGNvZGUgaXMgVFRfUExBVEZPUk1fQVBQTEVfVU5JQ09ERS4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRUX0FQUExFX0lEX0RFRkFVTFQgICAgICAwCisjZGVmaW5lIFRUX0FQUExFX0lEX1VOSUNPREVfMV8xICAxCisjZGVmaW5lIFRUX0FQUExFX0lEX0lTT18xMDY0NiAgICAyCisjZGVmaW5lIFRUX0FQUExFX0lEX1VOSUNPREVfMl8wICAzCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFBvc3NpYmxlIHZhbHVlcyBvZiB0aGUgcGxhdGZvcm0gc3BlY2lmaWMgZW5jb2RpbmcgaWRlbnRpZmllciBmaWVsZCBpbiAqLworICAvKiB0aGUgbmFtZSByZWNvcmRzIG9mIHRoZSBUVEYgYG5hbWUnIHRhYmxlIHdoZW4gdGhlIGBQbGF0Zm9ybScgICAgICAgICAgKi8KKyAgLyogaWRlbnRpZmllciBjb2RlIGlzIFRUX1BMQVRGT1JNX01BQ0lOVE9TSC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUVF9NQUNfSURfUk9NQU4gICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgVFRfTUFDX0lEX0pBUEFORVNFICAgICAgICAgICAgICAxCisjZGVmaW5lIFRUX01BQ19JRF9UUkFESVRJT05BTF9DSElORVNFICAgMgorI2RlZmluZSBUVF9NQUNfSURfS09SRUFOICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgVFRfTUFDX0lEX0FSQUJJQyAgICAgICAgICAgICAgICA0CisjZGVmaW5lIFRUX01BQ19JRF9IRUJSRVcgICAgICAgICAgICAgICAgNQorI2RlZmluZSBUVF9NQUNfSURfR1JFRUsgICAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgVFRfTUFDX0lEX1JVU1NJQU4gICAgICAgICAgICAgICA3CisjZGVmaW5lIFRUX01BQ19JRF9SU1lNQk9MICAgICAgICAgICAgICAgOAorI2RlZmluZSBUVF9NQUNfSURfREVWQU5BR0FSSSAgICAgICAgICAgIDkKKyNkZWZpbmUgVFRfTUFDX0lEX0dVUk1VS0hJICAgICAgICAgICAgIDEwCisjZGVmaW5lIFRUX01BQ19JRF9HVUpBUkFUSSAgICAgICAgICAgICAxMQorI2RlZmluZSBUVF9NQUNfSURfT1JJWUEgICAgICAgICAgICAgICAgMTIKKyNkZWZpbmUgVFRfTUFDX0lEX0JFTkdBTEkgICAgICAgICAgICAgIDEzCisjZGVmaW5lIFRUX01BQ19JRF9UQU1JTCAgICAgICAgICAgICAgICAxNAorI2RlZmluZSBUVF9NQUNfSURfVEVMVUdVICAgICAgICAgICAgICAgMTUKKyNkZWZpbmUgVFRfTUFDX0lEX0tBTk5BREEgICAgICAgICAgICAgIDE2CisjZGVmaW5lIFRUX01BQ19JRF9NQUxBWUFMQU0gICAgICAgICAgICAxNworI2RlZmluZSBUVF9NQUNfSURfU0lOSEFMRVNFICAgICAgICAgICAgMTgKKyNkZWZpbmUgVFRfTUFDX0lEX0JVUk1FU0UgICAgICAgICAgICAgIDE5CisjZGVmaW5lIFRUX01BQ19JRF9LSE1FUiAgICAgICAgICAgICAgICAyMAorI2RlZmluZSBUVF9NQUNfSURfVEhBSSAgICAgICAgICAgICAgICAgMjEKKyNkZWZpbmUgVFRfTUFDX0lEX0xBT1RJQU4gICAgICAgICAgICAgIDIyCisjZGVmaW5lIFRUX01BQ19JRF9HRU9SR0lBTiAgICAgICAgICAgICAyMworI2RlZmluZSBUVF9NQUNfSURfQVJNRU5JQU4gICAgICAgICAgICAgMjQKKyNkZWZpbmUgVFRfTUFDX0lEX01BTERJVklBTiAgICAgICAgICAgIDI1CisjZGVmaW5lIFRUX01BQ19JRF9TSU1QTElGSUVEX0NISU5FU0UgICAyNQorI2RlZmluZSBUVF9NQUNfSURfVElCRVRBTiAgICAgICAgICAgICAgMjYKKyNkZWZpbmUgVFRfTUFDX0lEX01PTkdPTElBTiAgICAgICAgICAgIDI3CisjZGVmaW5lIFRUX01BQ19JRF9HRUVaICAgICAgICAgICAgICAgICAyOAorI2RlZmluZSBUVF9NQUNfSURfU0xBVklDICAgICAgICAgICAgICAgMjkKKyNkZWZpbmUgVFRfTUFDX0lEX1ZJRVROQU1FU0UgICAgICAgICAgIDMwCisjZGVmaW5lIFRUX01BQ19JRF9TSU5ESEkgICAgICAgICAgICAgICAzMQorI2RlZmluZSBUVF9NQUNfSURfVU5JTlRFUlAgICAgICAgICAgICAgMzIKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogUG9zc2libGUgdmFsdWVzIG9mIHRoZSBwbGF0Zm9ybSBzcGVjaWZpYyBlbmNvZGluZyBpZGVudGlmaWVyIGZpZWxkIGluICovCisgIC8qIHRoZSBuYW1lIHJlY29yZHMgb2YgdGhlIFRURiBgbmFtZScgdGFibGUgd2hlbiB0aGUgYFBsYXRmb3JtJyAgICAgICAgICAqLworICAvKiBpZGVudGlmaWVyIGNvZGUgaXMgVFRfUExBVEZPUk1fSVNPLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRUX0lTT19JRF83QklUX0FTQ0lJICAwCisjZGVmaW5lIFRUX0lTT19JRF8xMDY0NiAgICAgICAxCisjZGVmaW5lIFRUX0lTT19JRF84ODU5XzEgICAgICAyCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFBvc3NpYmxlIHZhbHVlcyBvZiB0aGUgcGxhdGZvcm0gc3BlY2lmaWMgZW5jb2RpbmcgaWRlbnRpZmllciBmaWVsZCBpbiAqLworICAvKiB0aGUgbmFtZSByZWNvcmRzIG9mIHRoZSBUVEYgYG5hbWUnIHRhYmxlIHdoZW4gdGhlIGBQbGF0Zm9ybScgICAgICAgICAgKi8KKyAgLyogaWRlbnRpZmllciBjb2RlIGlzIFRUX1BMQVRGT1JNX01JQ1JPU09GVC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUVF9NU19JRF9TWU1CT0xfQ1MgICAwCisjZGVmaW5lIFRUX01TX0lEX1VOSUNPREVfQ1MgIDEKKyNkZWZpbmUgVFRfTVNfSURfU0pJUyAgICAgICAgMgorI2RlZmluZSBUVF9NU19JRF9HQjIzMTIgICAgICAzCisjZGVmaW5lIFRUX01TX0lEX0JJR181ICAgICAgIDQKKyNkZWZpbmUgVFRfTVNfSURfV0FOU1VORyAgICAgNQorI2RlZmluZSBUVF9NU19JRF9KT0hBQiAgICAgICA2CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFBvc3NpYmxlIHZhbHVlcyBvZiB0aGUgbGFuZ3VhZ2UgaWRlbnRpZmllciBmaWVsZCBpbiB0aGUgbmFtZSByZWNvcmRzICAqLworICAvKiBvZiB0aGUgVFRGIGBuYW1lJyB0YWJsZSB3aGVuIHRoZSBgUGxhdGZvcm0nIGlkZW50aWZpZXIgY29kZSBpcyAgICAgICAgKi8KKyAgLyogVFRfUExBVEZPUk1fTUFDSU5UT1NILiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBUaGUgY2Fub25pY2FsIHNvdXJjZSBmb3IgdGhlIEFwcGxlIGFzc2lnbmVkIExhbmd1YWdlIElEJ3MgaXMgYXQgICAgICAgKi8KKyAgLyogaHR0cDovL2ZvbnRzLmFwcGxlLmNvbS9UVFJlZk1hbi9STTA2L0NoYXA2bmFtZS5odG1sLiAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUVF9NQUNfTEFOR0lEX0VOR0xJU0ggICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBUVF9NQUNfTEFOR0lEX0ZSRU5DSCAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBUVF9NQUNfTEFOR0lEX0dFUk1BTiAgICAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBUVF9NQUNfTEFOR0lEX0lUQUxJQU4gICAgICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBUVF9NQUNfTEFOR0lEX0RVVENIICAgICAgICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBUVF9NQUNfTEFOR0lEX1NXRURJU0ggICAgICAgICAgICAgICAgICAgICAgNQorI2RlZmluZSBUVF9NQUNfTEFOR0lEX1NQQU5JU0ggICAgICAgICAgICAgICAgICAgICAgNgorI2RlZmluZSBUVF9NQUNfTEFOR0lEX0RBTklTSCAgICAgICAgICAgICAgICAgICAgICAgNworI2RlZmluZSBUVF9NQUNfTEFOR0lEX1BPUlRVR1VFU0UgICAgICAgICAgICAgICAgICAgOAorI2RlZmluZSBUVF9NQUNfTEFOR0lEX05PUldFR0lBTiAgICAgICAgICAgICAgICAgICAgOQorI2RlZmluZSBUVF9NQUNfTEFOR0lEX0hFQlJFVyAgICAgICAgICAgICAgICAgICAgICAxMAorI2RlZmluZSBUVF9NQUNfTEFOR0lEX0pBUEFORVNFICAgICAgICAgICAgICAgICAgICAxMQorI2RlZmluZSBUVF9NQUNfTEFOR0lEX0FSQUJJQyAgICAgICAgICAgICAgICAgICAgICAxMgorI2RlZmluZSBUVF9NQUNfTEFOR0lEX0ZJTk5JU0ggICAgICAgICAgICAgICAgICAgICAxMworI2RlZmluZSBUVF9NQUNfTEFOR0lEX0dSRUVLICAgICAgICAgICAgICAgICAgICAgICAxNAorI2RlZmluZSBUVF9NQUNfTEFOR0lEX0lDRUxBTkRJQyAgICAgICAgICAgICAgICAgICAxNQorI2RlZmluZSBUVF9NQUNfTEFOR0lEX01BTFRFU0UgICAgICAgICAgICAgICAgICAgICAxNgorI2RlZmluZSBUVF9NQUNfTEFOR0lEX1RVUktJU0ggICAgICAgICAgICAgICAgICAgICAxNworI2RlZmluZSBUVF9NQUNfTEFOR0lEX0NST0FUSUFOICAgICAgICAgICAgICAgICAgICAxOAorI2RlZmluZSBUVF9NQUNfTEFOR0lEX0NISU5FU0VfVFJBRElUSU9OQUwgICAgICAgICAxOQorI2RlZmluZSBUVF9NQUNfTEFOR0lEX1VSRFUgICAgICAgICAgICAgICAgICAgICAgICAyMAorI2RlZmluZSBUVF9NQUNfTEFOR0lEX0hJTkRJICAgICAgICAgICAgICAgICAgICAgICAyMQorI2RlZmluZSBUVF9NQUNfTEFOR0lEX1RIQUkgICAgICAgICAgICAgICAgICAgICAgICAyMgorI2RlZmluZSBUVF9NQUNfTEFOR0lEX0tPUkVBTiAgICAgICAgICAgICAgICAgICAgICAyMworI2RlZmluZSBUVF9NQUNfTEFOR0lEX0xJVEhVQU5JQU4gICAgICAgICAgICAgICAgICAyNAorI2RlZmluZSBUVF9NQUNfTEFOR0lEX1BPTElTSCAgICAgICAgICAgICAgICAgICAgICAyNQorI2RlZmluZSBUVF9NQUNfTEFOR0lEX0hVTkdBUklBTiAgICAgICAgICAgICAgICAgICAyNgorI2RlZmluZSBUVF9NQUNfTEFOR0lEX0VTVE9OSUFOICAgICAgICAgICAgICAgICAgICAyNworI2RlZmluZSBUVF9NQUNfTEFOR0lEX0xFVFRJU0ggICAgICAgICAgICAgICAgICAgICAyOAorI2RlZmluZSBUVF9NQUNfTEFOR0lEX1NBQU1JU0sgICAgICAgICAgICAgICAgICAgICAyOQorI2RlZmluZSBUVF9NQUNfTEFOR0lEX0ZBRVJPRVNFICAgICAgICAgICAgICAgICAgICAzMAorI2RlZmluZSBUVF9NQUNfTEFOR0lEX0ZBUlNJICAgICAgICAgICAgICAgICAgICAgICAzMQorI2RlZmluZSBUVF9NQUNfTEFOR0lEX1JVU1NJQU4gICAgICAgICAgICAgICAgICAgICAzMgorI2RlZmluZSBUVF9NQUNfTEFOR0lEX0NISU5FU0VfU0lNUExJRklFRCAgICAgICAgICAzMworI2RlZmluZSBUVF9NQUNfTEFOR0lEX0ZMRU1JU0ggICAgICAgICAgICAgICAgICAgICAzNAorI2RlZmluZSBUVF9NQUNfTEFOR0lEX0lSSVNIICAgICAgICAgICAgICAgICAgICAgICAzNQorI2RlZmluZSBUVF9NQUNfTEFOR0lEX0FMQkFOSUFOICAgICAgICAgICAgICAgICAgICAzNgorI2RlZmluZSBUVF9NQUNfTEFOR0lEX1JPTUFOSUFOICAgICAgICAgICAgICAgICAgICAzNworI2RlZmluZSBUVF9NQUNfTEFOR0lEX0NaRUNIICAgICAgICAgICAgICAgICAgICAgICAzOAorI2RlZmluZSBUVF9NQUNfTEFOR0lEX1NMT1ZBSyAgICAgICAgICAgICAgICAgICAgICAzOQorI2RlZmluZSBUVF9NQUNfTEFOR0lEX1NMT1ZFTklBTiAgICAgICAgICAgICAgICAgICA0MAorI2RlZmluZSBUVF9NQUNfTEFOR0lEX1lJRERJU0ggICAgICAgICAgICAgICAgICAgICA0MQorI2RlZmluZSBUVF9NQUNfTEFOR0lEX1NFUkJJQU4gICAgICAgICAgICAgICAgICAgICA0MgorI2RlZmluZSBUVF9NQUNfTEFOR0lEX01BQ0VET05JQU4gICAgICAgICAgICAgICAgICA0MworI2RlZmluZSBUVF9NQUNfTEFOR0lEX0JVTEdBUklBTiAgICAgICAgICAgICAgICAgICA0NAorI2RlZmluZSBUVF9NQUNfTEFOR0lEX1VLUkFJTklBTiAgICAgICAgICAgICAgICAgICA0NQorI2RlZmluZSBUVF9NQUNfTEFOR0lEX0JZRUxPUlVTU0lBTiAgICAgICAgICAgICAgICA0NgorI2RlZmluZSBUVF9NQUNfTEFOR0lEX1VaQkVLICAgICAgICAgICAgICAgICAgICAgICA0NworI2RlZmluZSBUVF9NQUNfTEFOR0lEX0tBWkFLSCAgICAgICAgICAgICAgICAgICAgICA0OAorI2RlZmluZSBUVF9NQUNfTEFOR0lEX0FaRVJCQUlKQU5JICAgICAgICAgICAgICAgICA0OQorI2RlZmluZSBUVF9NQUNfTEFOR0lEX0FaRVJCQUlKQU5JX0FSQUJJQ19TQ1JJUFQgICA1MAorI2RlZmluZSBUVF9NQUNfTEFOR0lEX0FSTUVOSUFOICAgICAgICAgICAgICAgICAgICA1MQorI2RlZmluZSBUVF9NQUNfTEFOR0lEX0dFT1JHSUFOICAgICAgICAgICAgICAgICAgICA1MgorI2RlZmluZSBUVF9NQUNfTEFOR0lEX01PTERBVklBTiAgICAgICAgICAgICAgICAgICA1MworI2RlZmluZSBUVF9NQUNfTEFOR0lEX0tJUkdISVogICAgICAgICAgICAgICAgICAgICA1NAorI2RlZmluZSBUVF9NQUNfTEFOR0lEX1RBSklLSSAgICAgICAgICAgICAgICAgICAgICA1NQorI2RlZmluZSBUVF9NQUNfTEFOR0lEX1RVUktNRU4gICAgICAgICAgICAgICAgICAgICA1NgorI2RlZmluZSBUVF9NQUNfTEFOR0lEX01PTkdPTElBTiAgICAgICAgICAgICAgICAgICA1NworI2RlZmluZSBUVF9NQUNfTEFOR0lEX01PTkdPTElBTl9DWVJJTExJQ19TQ1JJUFQgICA1OAorI2RlZmluZSBUVF9NQUNfTEFOR0lEX1BBU0hUTyAgICAgICAgICAgICAgICAgICAgICA1OQorI2RlZmluZSBUVF9NQUNfTEFOR0lEX0tVUkRJU0ggICAgICAgICAgICAgICAgICAgICA2MAorI2RlZmluZSBUVF9NQUNfTEFOR0lEX0tBU0hNSVJJICAgICAgICAgICAgICAgICAgICA2MQorI2RlZmluZSBUVF9NQUNfTEFOR0lEX1NJTkRISSAgICAgICAgICAgICAgICAgICAgICA2MgorI2RlZmluZSBUVF9NQUNfTEFOR0lEX1RJQkVUQU4gICAgICAgICAgICAgICAgICAgICA2MworI2RlZmluZSBUVF9NQUNfTEFOR0lEX05FUEFMSSAgICAgICAgICAgICAgICAgICAgICA2NAorI2RlZmluZSBUVF9NQUNfTEFOR0lEX1NBTlNLUklUICAgICAgICAgICAgICAgICAgICA2NQorI2RlZmluZSBUVF9NQUNfTEFOR0lEX01BUkFUSEkgICAgICAgICAgICAgICAgICAgICA2NgorI2RlZmluZSBUVF9NQUNfTEFOR0lEX0JFTkdBTEkgICAgICAgICAgICAgICAgICAgICA2NworI2RlZmluZSBUVF9NQUNfTEFOR0lEX0FTU0FNRVNFICAgICAgICAgICAgICAgICAgICA2OAorI2RlZmluZSBUVF9NQUNfTEFOR0lEX0dVSkFSQVRJICAgICAgICAgICAgICAgICAgICA2OQorI2RlZmluZSBUVF9NQUNfTEFOR0lEX1BVTkpBQkkgICAgICAgICAgICAgICAgICAgICA3MAorI2RlZmluZSBUVF9NQUNfTEFOR0lEX09SSVlBICAgICAgICAgICAgICAgICAgICAgICA3MQorI2RlZmluZSBUVF9NQUNfTEFOR0lEX01BTEFZQUxBTSAgICAgICAgICAgICAgICAgICA3MgorI2RlZmluZSBUVF9NQUNfTEFOR0lEX0tBTk5BREEgICAgICAgICAgICAgICAgICAgICA3MworI2RlZmluZSBUVF9NQUNfTEFOR0lEX1RBTUlMICAgICAgICAgICAgICAgICAgICAgICA3NAorI2RlZmluZSBUVF9NQUNfTEFOR0lEX1RFTFVHVSAgICAgICAgICAgICAgICAgICAgICA3NQorI2RlZmluZSBUVF9NQUNfTEFOR0lEX1NJTkhBTEVTRSAgICAgICAgICAgICAgICAgICA3NgorI2RlZmluZSBUVF9NQUNfTEFOR0lEX0JVUk1FU0UgICAgICAgICAgICAgICAgICAgICA3NworI2RlZmluZSBUVF9NQUNfTEFOR0lEX0tITUVSICAgICAgICAgICAgICAgICAgICAgICA3OAorI2RlZmluZSBUVF9NQUNfTEFOR0lEX0xBTyAgICAgICAgICAgICAgICAgICAgICAgICA3OQorI2RlZmluZSBUVF9NQUNfTEFOR0lEX1ZJRVROQU1FU0UgICAgICAgICAgICAgICAgICA4MAorI2RlZmluZSBUVF9NQUNfTEFOR0lEX0lORE9ORVNJQU4gICAgICAgICAgICAgICAgICA4MQorI2RlZmluZSBUVF9NQUNfTEFOR0lEX1RBR0FMT0cgICAgICAgICAgICAgICAgICAgICA4MgorI2RlZmluZSBUVF9NQUNfTEFOR0lEX01BTEFZX1JPTUFOX1NDUklQVCAgICAgICAgICA4MworI2RlZmluZSBUVF9NQUNfTEFOR0lEX01BTEFZX0FSQUJJQ19TQ1JJUFQgICAgICAgICA4NAorI2RlZmluZSBUVF9NQUNfTEFOR0lEX0FNSEFSSUMgICAgICAgICAgICAgICAgICAgICA4NQorI2RlZmluZSBUVF9NQUNfTEFOR0lEX1RJR1JJTllBICAgICAgICAgICAgICAgICAgICA4NgorI2RlZmluZSBUVF9NQUNfTEFOR0lEX0dBTExBICAgICAgICAgICAgICAgICAgICAgICA4NworI2RlZmluZSBUVF9NQUNfTEFOR0lEX1NPTUFMSSAgICAgICAgICAgICAgICAgICAgICA4OAorI2RlZmluZSBUVF9NQUNfTEFOR0lEX1NXQUhJTEkgICAgICAgICAgICAgICAgICAgICA4OQorI2RlZmluZSBUVF9NQUNfTEFOR0lEX1JVQU5EQSAgICAgICAgICAgICAgICAgICAgICA5MAorI2RlZmluZSBUVF9NQUNfTEFOR0lEX1JVTkRJICAgICAgICAgICAgICAgICAgICAgICA5MQorI2RlZmluZSBUVF9NQUNfTEFOR0lEX0NIRVdBICAgICAgICAgICAgICAgICAgICAgICA5MgorI2RlZmluZSBUVF9NQUNfTEFOR0lEX01BTEFHQVNZICAgICAgICAgICAgICAgICAgICA5MworI2RlZmluZSBUVF9NQUNfTEFOR0lEX0VTUEVSQU5UTyAgICAgICAgICAgICAgICAgICA5NAorI2RlZmluZSBUVF9NQUNfTEFOR0lEX1dFTFNIICAgICAgICAgICAgICAgICAgICAgIDEyOAorI2RlZmluZSBUVF9NQUNfTEFOR0lEX0JBU1FVRSAgICAgICAgICAgICAgICAgICAgIDEyOQorI2RlZmluZSBUVF9NQUNfTEFOR0lEX0NBVEFMQU4gICAgICAgICAgICAgICAgICAgIDEzMAorI2RlZmluZSBUVF9NQUNfTEFOR0lEX0xBVElOICAgICAgICAgICAgICAgICAgICAgIDEzMQorI2RlZmluZSBUVF9NQUNfTEFOR0lEX1FVRUNIVUEgICAgICAgICAgICAgICAgICAgIDEzMgorI2RlZmluZSBUVF9NQUNfTEFOR0lEX0dVQVJBTkkgICAgICAgICAgICAgICAgICAgIDEzMworI2RlZmluZSBUVF9NQUNfTEFOR0lEX0FZTUFSQSAgICAgICAgICAgICAgICAgICAgIDEzNAorI2RlZmluZSBUVF9NQUNfTEFOR0lEX1RBVEFSICAgICAgICAgICAgICAgICAgICAgIDEzNQorI2RlZmluZSBUVF9NQUNfTEFOR0lEX1VJR0hVUiAgICAgICAgICAgICAgICAgICAgIDEzNgorI2RlZmluZSBUVF9NQUNfTEFOR0lEX0RaT05HS0hBICAgICAgICAgICAgICAgICAgIDEzNworI2RlZmluZSBUVF9NQUNfTEFOR0lEX0pBVkFORVNFICAgICAgICAgICAgICAgICAgIDEzOAorI2RlZmluZSBUVF9NQUNfTEFOR0lEX1NVTkRBTkVTRSAgICAgICAgICAgICAgICAgIDEzOQorI2RlZmluZSBUVF9NQUNfTEFOR0lEX1NDT1RUSVNIX0dBRUxJQyAgICAgICAgICAgIDE0MAorI2RlZmluZSBUVF9NQUNfTEFOR0lEX0lSSVNIX0dBRUxJQyAgICAgICAgICAgICAgIDE0MQorI2RlZmluZSBUVF9NQUNfTEFOR0lEX0JSRVRPTiAgICAgICAgICAgICAgICAgICAgIDE0MgorI2RlZmluZSBUVF9NQUNfTEFOR0lEX0lOVUtUSVRVVCAgICAgICAgICAgICAgICAgIDE0MworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBQb3NzaWJsZSB2YWx1ZXMgb2YgdGhlIGxhbmd1YWdlIGlkZW50aWZpZXIgZmllbGQgaW4gdGhlIG5hbWUgcmVjb3JkcyAgKi8KKyAgLyogb2YgdGhlIFRURiBgbmFtZScgdGFibGUgd2hlbiB0aGUgYFBsYXRmb3JtJyBpZGVudGlmaWVyIGNvZGUgaXMgICAgICAgICovCisgIC8qIFRUX1BMQVRGT1JNX01JQ1JPU09GVC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogVGhlIGNhbm9uaWNhbCBzb3VyY2UgZm9yIHRoZSBNUyBhc3NpZ25lZCBMQ0lEJ3MgaXMgYXQgICAgICAgICAgICAgICAgICovCisgIC8qIGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS90eXBvZ3JhcGh5L09UU1BFQy9sY2lkLWNwLnR4dC4gICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0FSQUJJQ19TQVVESV9BUkFCSUEgICAgICAgICAgICAgICAweDA0MDEKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0FSQUJJQ19JUkFRICAgICAgICAgICAgICAgICAgICAgICAweDA4MDEKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0FSQUJJQ19FR1lQVCAgICAgICAgICAgICAgICAgICAgICAweDBjMDEKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0FSQUJJQ19MSUJZQSAgICAgICAgICAgICAgICAgICAgICAweDEwMDEKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0FSQUJJQ19BTEdFUklBICAgICAgICAgICAgICAgICAgICAweDE0MDEKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0FSQUJJQ19NT1JPQ0NPICAgICAgICAgICAgICAgICAgICAweDE4MDEKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0FSQUJJQ19UVU5JU0lBICAgICAgICAgICAgICAgICAgICAweDFjMDEKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0FSQUJJQ19PTUFOICAgICAgICAgICAgICAgICAgICAgICAweDIwMDEKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0FSQUJJQ19ZRU1FTiAgICAgICAgICAgICAgICAgICAgICAweDI0MDEKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0FSQUJJQ19TWVJJQSAgICAgICAgICAgICAgICAgICAgICAweDI4MDEKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0FSQUJJQ19KT1JEQU4gICAgICAgICAgICAgICAgICAgICAweDJjMDEKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0FSQUJJQ19MRUJBTk9OICAgICAgICAgICAgICAgICAgICAweDMwMDEKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0FSQUJJQ19LVVdBSVQgICAgICAgICAgICAgICAgICAgICAweDM0MDEKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0FSQUJJQ19VQUUgICAgICAgICAgICAgICAgICAgICAgICAweDM4MDEKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0FSQUJJQ19CQUhSQUlOICAgICAgICAgICAgICAgICAgICAweDNjMDEKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0FSQUJJQ19RQVRBUiAgICAgICAgICAgICAgICAgICAgICAweDQwMDEKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0JVTEdBUklBTl9CVUxHQVJJQSAgICAgICAgICAgICAgICAweDA0MDIKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0NBVEFMQU5fU1BBSU4gICAgICAgICAgICAgICAgICAgICAweDA0MDMKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0NISU5FU0VfVEFJV0FOICAgICAgICAgICAgICAgICAgICAweDA0MDQKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0NISU5FU0VfUFJDICAgICAgICAgICAgICAgICAgICAgICAweDA4MDQKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0NISU5FU0VfSE9OR19LT05HICAgICAgICAgICAgICAgICAweDBjMDQKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0NISU5FU0VfU0lOR0FQT1JFICAgICAgICAgICAgICAgICAweDEwMDQKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0NISU5FU0VfTUFDQVUgICAgICAgICAgICAgICAgICAgICAweDE0MDQKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0NaRUNIX0NaRUNIX1JFUFVCTElDICAgICAgICAgICAgICAweDA0MDUKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0RBTklTSF9ERU5NQVJLICAgICAgICAgICAgICAgICAgICAweDA0MDYKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0dFUk1BTl9HRVJNQU5ZICAgICAgICAgICAgICAgICAgICAweDA0MDcKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0dFUk1BTl9TV0lUWkVSTEFORCAgICAgICAgICAgICAgICAweDA4MDcKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0dFUk1BTl9BVVNUUklBICAgICAgICAgICAgICAgICAgICAweDBjMDcKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0dFUk1BTl9MVVhFTUJPVVJHICAgICAgICAgICAgICAgICAweDEwMDcKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0dFUk1BTl9MSUVDSFRFTlNURUkgICAgICAgICAgICAgICAweDE0MDcKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0dSRUVLX0dSRUVDRSAgICAgICAgICAgICAgICAgICAgICAweDA0MDgKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0VOR0xJU0hfVU5JVEVEX1NUQVRFUyAgICAgICAgICAgICAweDA0MDkKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0VOR0xJU0hfVU5JVEVEX0tJTkdET00gICAgICAgICAgICAweDA4MDkKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0VOR0xJU0hfQVVTVFJBTElBICAgICAgICAgICAgICAgICAweDBjMDkKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0VOR0xJU0hfQ0FOQURBICAgICAgICAgICAgICAgICAgICAweDEwMDkKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0VOR0xJU0hfTkVXX1pFQUxBTkQgICAgICAgICAgICAgICAweDE0MDkKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0VOR0xJU0hfSVJFTEFORCAgICAgICAgICAgICAgICAgICAweDE4MDkKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0VOR0xJU0hfU09VVEhfQUZSSUNBICAgICAgICAgICAgICAweDFjMDkKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0VOR0xJU0hfSkFNQUlDQSAgICAgICAgICAgICAgICAgICAweDIwMDkKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0VOR0xJU0hfQ0FSSUJCRUFOICAgICAgICAgICAgICAgICAweDI0MDkKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0VOR0xJU0hfQkVMSVpFICAgICAgICAgICAgICAgICAgICAweDI4MDkKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0VOR0xJU0hfVFJJTklEQUQgICAgICAgICAgICAgICAgICAweDJjMDkKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0VOR0xJU0hfWklNQkFCV0UgICAgICAgICAgICAgICAgICAweDMwMDkKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0VOR0xJU0hfUEhJTElQUElORVMgICAgICAgICAgICAgICAweDM0MDkKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1NQQU5JU0hfU1BBSU5fVFJBRElUSU9OQUxfU09SVCAgICAweDA0MGEKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1NQQU5JU0hfTUVYSUNPICAgICAgICAgICAgICAgICAgICAweDA4MGEKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1NQQU5JU0hfU1BBSU5fSU5URVJOQVRJT05BTF9TT1JUICAweDBjMGEKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1NQQU5JU0hfR1VBVEVNQUxBICAgICAgICAgICAgICAgICAweDEwMGEKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1NQQU5JU0hfQ09TVEFfUklDQSAgICAgICAgICAgICAgICAweDE0MGEKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1NQQU5JU0hfUEFOQU1BICAgICAgICAgICAgICAgICAgICAweDE4MGEKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1NQQU5JU0hfRE9NSU5JQ0FOX1JFUFVCTElDICAgICAgICAweDFjMGEKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1NQQU5JU0hfVkVORVpVRUxBICAgICAgICAgICAgICAgICAweDIwMGEKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1NQQU5JU0hfQ09MT01CSUEgICAgICAgICAgICAgICAgICAweDI0MGEKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1NQQU5JU0hfUEVSVSAgICAgICAgICAgICAgICAgICAgICAweDI4MGEKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1NQQU5JU0hfQVJHRU5USU5BICAgICAgICAgICAgICAgICAweDJjMGEKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1NQQU5JU0hfRUNVQURPUiAgICAgICAgICAgICAgICAgICAweDMwMGEKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1NQQU5JU0hfQ0hJTEUgICAgICAgICAgICAgICAgICAgICAweDM0MGEKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1NQQU5JU0hfVVJVR1VBWSAgICAgICAgICAgICAgICAgICAweDM4MGEKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1NQQU5JU0hfUEFSQUdVQVkgICAgICAgICAgICAgICAgICAweDNjMGEKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1NQQU5JU0hfQk9MSVZJQSAgICAgICAgICAgICAgICAgICAweDQwMGEKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1NQQU5JU0hfRUxfU0FMVkFET1IgICAgICAgICAgICAgICAweDQ0MGEKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1NQQU5JU0hfSE9ORFVSQVMgICAgICAgICAgICAgICAgICAweDQ4MGEKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1NQQU5JU0hfTklDQVJBR1VBICAgICAgICAgICAgICAgICAweDRjMGEKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1NQQU5JU0hfUFVFUlRPX1JJQ08gICAgICAgICAgICAgICAweDUwMGEKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0ZJTk5JU0hfRklOTEFORCAgICAgICAgICAgICAgICAgICAweDA0MGIKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0ZSRU5DSF9GUkFOQ0UgICAgICAgICAgICAgICAgICAgICAweDA0MGMKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0ZSRU5DSF9CRUxHSVVNICAgICAgICAgICAgICAgICAgICAweDA4MGMKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0ZSRU5DSF9DQU5BREEgICAgICAgICAgICAgICAgICAgICAweDBjMGMKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0ZSRU5DSF9TV0lUWkVSTEFORCAgICAgICAgICAgICAgICAweDEwMGMKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0ZSRU5DSF9MVVhFTUJPVVJHICAgICAgICAgICAgICAgICAweDE0MGMKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0ZSRU5DSF9NT05BQ08gICAgICAgICAgICAgICAgICAgICAweDE4MGMKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0hFQlJFV19JU1JBRUwgICAgICAgICAgICAgICAgICAgICAweDA0MGQKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0hVTkdBUklBTl9IVU5HQVJZICAgICAgICAgICAgICAgICAweDA0MGUKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0lDRUxBTkRJQ19JQ0VMQU5EICAgICAgICAgICAgICAgICAweDA0MGYKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0lUQUxJQU5fSVRBTFkgICAgICAgICAgICAgICAgICAgICAweDA0MTAKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0lUQUxJQU5fU1dJVFpFUkxBTkQgICAgICAgICAgICAgICAweDA4MTAKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0pBUEFORVNFX0pBUEFOICAgICAgICAgICAgICAgICAgICAweDA0MTEKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0tPUkVBTl9FWFRFTkRFRF9XQU5TVU5HX0tPUkVBICAgICAweDA0MTIKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0tPUkVBTl9KT0hBQl9LT1JFQSAgICAgICAgICAgICAgICAweDA4MTIKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0RVVENIX05FVEhFUkxBTkRTICAgICAgICAgICAgICAgICAweDA0MTMKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0RVVENIX0JFTEdJVU0gICAgICAgICAgICAgICAgICAgICAweDA4MTMKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX05PUldFR0lBTl9OT1JXQVlfQk9LTUFMICAgICAgICAgICAweDA0MTQKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX05PUldFR0lBTl9OT1JXQVlfTllOT1JTSyAgICAgICAgICAweDA4MTQKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1BPTElTSF9QT0xBTkQgICAgICAgICAgICAgICAgICAgICAweDA0MTUKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1BPUlRVR1VFU0VfQlJBWklMICAgICAgICAgICAgICAgICAweDA0MTYKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1BPUlRVR1VFU0VfUE9SVFVHQUwgICAgICAgICAgICAgICAweDA4MTYKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1JIQUVUT19ST01BTklDX1NXSVRaRVJMQU5EICAgICAgICAweDA0MTcKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1JPTUFOSUFOX1JPTUFOSUEgICAgICAgICAgICAgICAgICAweDA0MTgKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX01PTERBVklBTl9NT0xEQVZJQSAgICAgICAgICAgICAgICAweDA4MTgKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1JVU1NJQU5fUlVTU0lBICAgICAgICAgICAgICAgICAgICAweDA0MTkKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1JVU1NJQU5fTU9MREFWSUEgICAgICAgICAgICAgICAgICAweDA4MTkKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0NST0FUSUFOX0NST0FUSUEgICAgICAgICAgICAgICAgICAweDA0MWEKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1NFUkJJQU5fU0VSQklBX0xBVElOICAgICAgICAgICAgICAweDA4MWEKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1NFUkJJQU5fU0VSQklBX0NZUklMTElDICAgICAgICAgICAweDBjMWEKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1NMT1ZBS19TTE9WQUtJQSAgICAgICAgICAgICAgICAgICAweDA0MWIKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0FMQkFOSUFOX0FMQkFOSUEgICAgICAgICAgICAgICAgICAweDA0MWMKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1NXRURJU0hfU1dFREVOICAgICAgICAgICAgICAgICAgICAweDA0MWQKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1NXRURJU0hfRklOTEFORCAgICAgICAgICAgICAgICAgICAweDA4MWQKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1RIQUlfVEhBSUxBTkQgICAgICAgICAgICAgICAgICAgICAweDA0MWUKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1RVUktJU0hfVFVSS0VZICAgICAgICAgICAgICAgICAgICAweDA0MWYKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1VSRFVfUEFLSVNUQU4gICAgICAgICAgICAgICAgICAgICAweDA0MjAKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0lORE9ORVNJQU5fSU5ET05FU0lBICAgICAgICAgICAgICAweDA0MjEKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1VLUkFJTklBTl9VS1JBSU5FICAgICAgICAgICAgICAgICAweDA0MjIKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0JFTEFSVVNJQU5fQkVMQVJVUyAgICAgICAgICAgICAgICAweDA0MjMKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1NMT1ZFTkVfU0xPVkVOSUEgICAgICAgICAgICAgICAgICAweDA0MjQKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0VTVE9OSUFOX0VTVE9OSUEgICAgICAgICAgICAgICAgICAweDA0MjUKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0xBVFZJQU5fTEFUVklBICAgICAgICAgICAgICAgICAgICAweDA0MjYKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0xJVEhVQU5JQU5fTElUSFVBTklBICAgICAgICAgICAgICAweDA0MjcKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0NMQVNTSUNfTElUSFVBTklBTl9MSVRIVUFOSUEgICAgICAweDA4MjcKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX01BT1JJX05FV19aRUFMQU5EICAgICAgICAgICAgICAgICAweDA0MjgKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0ZBUlNJX0lSQU4gICAgICAgICAgICAgICAgICAgICAgICAweDA0MjkKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1ZJRVROQU1FU0VfVklFVF9OQU0gICAgICAgICAgICAgICAweDA0MmEKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0FSTUVOSUFOX0FSTUVOSUEgICAgICAgICAgICAgICAgICAweDA0MmIKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0FaRVJJX0FaRVJCQUlKQU5fTEFUSU4gICAgICAgICAgICAweDA0MmMKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0FaRVJJX0FaRVJCQUlKQU5fQ1lSSUxMSUMgICAgICAgICAweDA4MmMKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0JBU1FVRV9TUEFJTiAgICAgICAgICAgICAgICAgICAgICAweDA0MmQKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1NPUkJJQU5fR0VSTUFOWSAgICAgICAgICAgICAgICAgICAweDA0MmUKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX01BQ0VET05JQU5fTUFDRURPTklBICAgICAgICAgICAgICAweDA0MmYKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1NVVFVfU09VVEhfQUZSSUNBICAgICAgICAgICAgICAgICAweDA0MzAKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1RTT05HQV9TT1VUSF9BRlJJQ0EgICAgICAgICAgICAgICAweDA0MzEKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1RTV0FOQV9TT1VUSF9BRlJJQ0EgICAgICAgICAgICAgICAweDA0MzIKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1ZFTkRBX1NPVVRIX0FGUklDQSAgICAgICAgICAgICAgICAweDA0MzMKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1hIT1NBX1NPVVRIX0FGUklDQSAgICAgICAgICAgICAgICAweDA0MzQKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1pVTFVfU09VVEhfQUZSSUNBICAgICAgICAgICAgICAgICAweDA0MzUKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0FGUklLQUFOU19TT1VUSF9BRlJJQ0EgICAgICAgICAgICAweDA0MzYKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0dFT1JHSUFOX0dFT1JHSUEgICAgICAgICAgICAgICAgICAweDA0MzcKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0ZBRVJPRVNFX0ZBRVJPRV9JU0xBTkRTICAgICAgICAgICAweDA0MzgKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0hJTkRJX0lORElBICAgICAgICAgICAgICAgICAgICAgICAweDA0MzkKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX01BTFRFU0VfTUFMVEEgICAgICAgICAgICAgICAgICAgICAweDA0M2EKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1NBQU1JX0xBUE9OSUEgICAgICAgICAgICAgICAgICAgICAweDA0M2IKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0lSSVNIX0dBRUxJQ19JUkVMQU5EICAgICAgICAgICAgICAweDA0M2MKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1NDT1RUSVNIX0dBRUxJQ19VTklURURfS0lOR0RPTSAgICAweDA4M2MKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX01BTEFZX01BTEFZU0lBICAgICAgICAgICAgICAgICAgICAweDA0M2UKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX01BTEFZX0JSVU5FSV9EQVJVU1NBTEFNICAgICAgICAgICAweDA4M2UKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0tBWkFLX0tBWkFLU1RBTiAgICAgICAgICAgICAgICAgICAweDA0M2YKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1NXQUhJTElfS0VOWUEgICAgICAgICAgICAgICAgICAgICAweDA0NDEKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1VaQkVLX1VaQkVLSVNUQU5fTEFUSU4gICAgICAgICAgICAweDA0NDMKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1VaQkVLX1VaQkVLSVNUQU5fQ1lSSUxMSUMgICAgICAgICAweDA4NDMKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1RBVEFSX1RBVEFSU1RBTiAgICAgICAgICAgICAgICAgICAweDA0NDQKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0JFTkdBTElfSU5ESUEgICAgICAgICAgICAgICAgICAgICAweDA0NDUKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1BVTkpBQklfSU5ESUEgICAgICAgICAgICAgICAgICAgICAweDA0NDYKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0dVSkFSQVRJX0lORElBICAgICAgICAgICAgICAgICAgICAweDA0NDcKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX09SSVlBX0lORElBICAgICAgICAgICAgICAgICAgICAgICAweDA0NDgKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1RBTUlMX0lORElBICAgICAgICAgICAgICAgICAgICAgICAweDA0NDkKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1RFTFVHVV9JTkRJQSAgICAgICAgICAgICAgICAgICAgICAweDA0NGEKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0tBTk5BREFfSU5ESUEgICAgICAgICAgICAgICAgICAgICAweDA0NGIKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX01BTEFZQUxBTV9JTkRJQSAgICAgICAgICAgICAgICAgICAweDA0NGMKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0FTU0FNRVNFX0lORElBICAgICAgICAgICAgICAgICAgICAweDA0NGQKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX01BUkFUSElfSU5ESUEgICAgICAgICAgICAgICAgICAgICAweDA0NGUKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1NBTlNLUklUX0lORElBICAgICAgICAgICAgICAgICAgICAweDA0NGYKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0tPTktBTklfSU5ESUEgICAgICAgICAgICAgICAgICAgICAweDA0NTcKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogcG9zc2libGUgdmFsdWVzIG9mIHRoZSBgTmFtZScgaWRlbnRpZmllciBmaWVsZCBpbiB0aGUgbmFtZSByZWNvcmRzIG9mICovCisgIC8qIHRoZSBUVEYgYG5hbWUnIHRhYmxlLiAgVGhlc2UgdmFsdWVzIGFyZSBwbGF0Zm9ybSBpbmRlcGVuZGVudC4gICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVFRfTkFNRV9JRF9DT1BZUklHSFQgICAgICAgICAgICAgMAorI2RlZmluZSBUVF9OQU1FX0lEX0ZPTlRfRkFNSUxZICAgICAgICAgICAxCisjZGVmaW5lIFRUX05BTUVfSURfRk9OVF9TVUJGQU1JTFkgICAgICAgIDIKKyNkZWZpbmUgVFRfTkFNRV9JRF9VTklRVUVfSUQgICAgICAgICAgICAgMworI2RlZmluZSBUVF9OQU1FX0lEX0ZVTExfTkFNRSAgICAgICAgICAgICA0CisjZGVmaW5lIFRUX05BTUVfSURfVkVSU0lPTl9TVFJJTkcgICAgICAgIDUKKyNkZWZpbmUgVFRfTkFNRV9JRF9QU19OQU1FICAgICAgICAgICAgICAgNgorI2RlZmluZSBUVF9OQU1FX0lEX1RSQURFTUFSSyAgICAgICAgICAgICA3CisvKiB0aGUgZm9sbG93aW5nIHZhbHVlcyBhcmUgZnJvbSB0aGUgT3BlblR5cGUgc3BlYyAqLworI2RlZmluZSBUVF9OQU1FX0lEX01BTlVGQUNUVVJFUiAgICAgICAgICA4CisjZGVmaW5lIFRUX05BTUVfSURfREVTSUdORVIgICAgICAgICAgICAgIDkKKyNkZWZpbmUgVFRfTkFNRV9JRF9ERVNDUklQVElPTiAgICAgICAgICAxMAorI2RlZmluZSBUVF9OQU1FX0lEX1ZFTkRPUl9VUkwgICAgICAgICAgIDExCisjZGVmaW5lIFRUX05BTUVfSURfREVTSUdORVJfVVJMICAgICAgICAgMTIKKyNkZWZpbmUgVFRfTkFNRV9JRF9MSUNFTlNFICAgICAgICAgICAgICAxMworI2RlZmluZSBUVF9OQU1FX0lEX0xJQ0VOU0VfVVJMICAgICAgICAgIDE0CisvKiBudW1iZXIgMTUgaXMgcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgVFRfTkFNRV9JRF9QUkVGRVJSRURfRkFNSUxZICAgICAxNgorI2RlZmluZSBUVF9OQU1FX0lEX1BSRUZFUlJFRF9TVUJGQU1JTFkgIDE3CisjZGVmaW5lIFRUX05BTUVfSURfTUFDX0ZVTExfTkFNRSAgICAgICAgMTgKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogQml0IG1hc2sgdmFsdWVzIGZvciB0aGUgVW5pY29kZSByYW5nZXMgZnJvbSB0aGUgVFRGIGBPUzIgJyB0YWJsZS4gICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvKiBHZW5lcmFsIFNjcmlwdHMgQXJlYSAqLworCisvKiBCaXQgIDAgICBDMCBDb250cm9scyBhbmQgQmFzaWMgTGF0aW4gKi8KKyNkZWZpbmUgVFRfVUNSX0JBU0lDX0xBVElOICAgICAgICAgICAgICAgICAgICAgICgxIDw8ICAwKSAvKiBVKzAwMDAtVSswMDdGICovCisvKiBCaXQgIDEgICBDMSBDb250cm9scyBhbmQgTGF0aW4tMSBTdXBwbGVtZW50ICovCisjZGVmaW5lIFRUX1VDUl9MQVRJTjFfU1VQUExFTUVOVCAgICAgICAgICAgICAgICAoMSA8PCAgMSkgLyogVSswMDgwLVUrMDBGRiAqLworLyogQml0ICAyICAgTGF0aW4gRXh0ZW5kZWQtQSAqLworI2RlZmluZSBUVF9VQ1JfTEFUSU5fRVhURU5ERURfQSAgICAgICAgICAgICAgICAgKDEgPDwgIDIpIC8qIFUrMDEwMC1VKzAxN0YgKi8KKy8qIEJpdCAgMyAgIExhdGluIEV4dGVuZGVkLUIgKi8KKyNkZWZpbmUgVFRfVUNSX0xBVElOX0VYVEVOREVEX0IgICAgICAgICAgICAgICAgICgxIDw8ICAzKSAvKiBVKzAxODAtVSswMjRGICovCisvKiBCaXQgIDQgICBJUEEgRXh0ZW5zaW9ucyAqLworI2RlZmluZSBUVF9VQ1JfSVBBX0VYVEVOU0lPTlMgICAgICAgICAgICAgICAgICAgKDEgPDwgIDQpIC8qIFUrMDI1MC1VKzAyQUYgKi8KKy8qIEJpdCAgNSAgIFNwYWNpbmcgTW9kaWZpZXIgTGV0dGVycyAqLworI2RlZmluZSBUVF9VQ1JfU1BBQ0lOR19NT0RJRklFUiAgICAgICAgICAgICAgICAgKDEgPDwgIDUpIC8qIFUrMDJCMC1VKzAyRkYgKi8KKy8qIEJpdCAgNiAgIENvbWJpbmluZyBEaWFjcml0aWNhbCBNYXJrcyAqLworI2RlZmluZSBUVF9VQ1JfQ09NQklOSU5HX0RJQUNSSVRJQ0FMX01BUktTICAgICAgKDEgPDwgIDYpIC8qIFUrMDMwMC1VKzAzNkYgKi8KKy8qIEJpdCAgNyAgIEdyZWVrICovCisjZGVmaW5lIFRUX1VDUl9HUkVFSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAgNykgLyogVSswMzcwLVUrMDNGRiAqLworLyogQml0IDggaXMgcmVzZXJ2ZWQgKHdhczogR3JlZWsgU3ltYm9scyBhbmQgQ29wdGljKSAqLworLyogQml0ICA5ICAgQ3lyaWxsaWMgKi8KKyNkZWZpbmUgVFRfVUNSX0NZUklMTElDICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8ICA5KSAvKiBVKzA0MDAtVSswNEZGICovCisvKiBCaXQgMTAgICBBcm1lbmlhbiAqLworI2RlZmluZSBUVF9VQ1JfQVJNRU5JQU4gICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMTApIC8qIFUrMDUzMC1VKzA1OEYgKi8KKy8qIEJpdCAxMSAgIEhlYnJldyAqLworI2RlZmluZSBUVF9VQ1JfSEVCUkVXICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMTEpIC8qIFUrMDU5MC1VKzA1RkYgKi8KKy8qIEJpdCAxMiBpcyByZXNlcnZlZCAod2FzOiBIZWJyZXcgRXh0ZW5kZWQpICovCisvKiBCaXQgMTMgICBBcmFiaWMgKi8KKyNkZWZpbmUgVFRfVUNSX0FSQUJJQyAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDEzKSAvKiBVKzA2MDAtVSswNkZGICovCisvKiBCaXQgMTQgaXMgcmVzZXJ2ZWQgKHdhczogQXJhYmljIEV4dGVuZGVkKSAqLworLyogQml0IDE1ICAgRGV2YW5hZ2FyaSAqLworI2RlZmluZSBUVF9VQ1JfREVWQU5BR0FSSSAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMTUpIC8qIFUrMDkwMC1VKzA5N0YgKi8KKy8qIEJpdCAxNiAgIEJlbmdhbGkgKi8KKyNkZWZpbmUgVFRfVUNSX0JFTkdBTEkgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDE2KSAvKiBVKzA5ODAtVSswOUZGICovCisvKiBCaXQgMTcgICBHdXJtdWtoaSAqLworI2RlZmluZSBUVF9VQ1JfR1VSTVVLSEkgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMTcpIC8qIFUrMEEwMC1VKzBBN0YgKi8KKy8qIEJpdCAxOCAgIEd1amFyYXRpICovCisjZGVmaW5lIFRUX1VDUl9HVUpBUkFUSSAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAxOCkgLyogVSswQTgwLVUrMEFGRiAqLworLyogQml0IDE5ICAgT3JpeWEgKi8KKyNkZWZpbmUgVFRfVUNSX09SSVlBICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDE5KSAvKiBVKzBCMDAtVSswQjdGICovCisvKiBCaXQgMjAgICBUYW1pbCAqLworI2RlZmluZSBUVF9VQ1JfVEFNSUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMjApIC8qIFUrMEI4MC1VKzBCRkYgKi8KKy8qIEJpdCAyMSAgIFRlbHVndSAqLworI2RlZmluZSBUVF9VQ1JfVEVMVUdVICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMjEpIC8qIFUrMEMwMC1VKzBDN0YgKi8KKy8qIEJpdCAyMiAgIEthbm5hZGEgKi8KKyNkZWZpbmUgVFRfVUNSX0tBTk5BREEgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDIyKSAvKiBVKzBDODAtVSswQ0ZGICovCisvKiBCaXQgMjMgICBNYWxheWFsYW0gKi8KKyNkZWZpbmUgVFRfVUNSX01BTEFZQUxBTSAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDIzKSAvKiBVKzBEMDAtVSswRDdGICovCisvKiBCaXQgMjQgICBUaGFpICovCisjZGVmaW5lIFRUX1VDUl9USEFJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAyNCkgLyogVSswRTAwLVUrMEU3RiAqLworLyogQml0IDI1ICAgTGFvICovCisjZGVmaW5lIFRUX1VDUl9MQU8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAyNSkgLyogVSswRTgwLVUrMEVGRiAqLworLyogQml0IDI2ICAgR2VvcmdpYW4gKi8KKyNkZWZpbmUgVFRfVUNSX0dFT1JHSUFOICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDI2KSAvKiBVKzEwQTAtVSsxMEZGICovCisvKiBCaXQgMjcgaXMgcmVzZXJ2ZWQgKHdhcyBHZW9yZ2lhbiBFeHRlbmRlZCkgKi8KKy8qIEJpdCAyOCAgIEhhbmd1bCBKYW1vICovCisjZGVmaW5lIFRUX1VDUl9IQU5HVUxfSkFNTyAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAyOCkgLyogVSsxMTAwLVUrMTFGRiAqLworLyogQml0IDI5ICAgTGF0aW4gRXh0ZW5kZWQgQWRkaXRpb25hbCAqLworI2RlZmluZSBUVF9VQ1JfTEFUSU5fRVhURU5ERURfQURESVRJT05BTCAgICAgICAgKDEgPDwgMjkpIC8qIFUrMUUwMC1VKzFFRkYgKi8KKy8qIEJpdCAzMCAgIEdyZWVrIEV4dGVuZGVkICovCisjZGVmaW5lIFRUX1VDUl9HUkVFS19FWFRFTkRFRCAgICAgICAgICAgICAgICAgICAoMSA8PCAzMCkgLyogVSsxRjAwLVUrMUZGRiAqLworCisvKiBTeW1ib2xzIEFyZWEgKi8KKworLyogQml0IDMxICAgR2VuZXJhbCBQdW5jdHVhdGlvbiAqLworI2RlZmluZSBUVF9VQ1JfR0VORVJBTF9QVU5DVFVBVElPTiAgICAgICAgICAgICAgKDEgPDwgMzEpIC8qIFUrMjAwMC1VKzIwNkYgKi8KKy8qIEJpdCAzMiAgIFN1cGVyc2NyaXB0cyBBbmQgU3Vic2NyaXB0cyAqLworI2RlZmluZSBUVF9VQ1JfU1VQRVJTQ1JJUFRTX1NVQlNDUklQVFMgICAgICAgICAgKDEgPDwgIDApIC8qIFUrMjA3MC1VKzIwOUYgKi8KKy8qIEJpdCAzMyAgIEN1cnJlbmN5IFN5bWJvbHMgKi8KKyNkZWZpbmUgVFRfVUNSX0NVUlJFTkNZX1NZTUJPTFMgICAgICAgICAgICAgICAgICgxIDw8ICAxKSAvKiBVKzIwQTAtVSsyMENGICovCisvKiBCaXQgMzQgICBDb21iaW5pbmcgRGlhY3JpdGljYWwgTWFya3MgRm9yIFN5bWJvbHMgKi8KKyNkZWZpbmUgVFRfVUNSX0NPTUJJTklOR19ESUFDUklUSUNBTF9NQVJLU19TWU1CICgxIDw8ICAyKSAvKiBVKzIwRDAtVSsyMEZGICovCisvKiBCaXQgMzUgICBMZXR0ZXJsaWtlIFN5bWJvbHMgKi8KKyNkZWZpbmUgVFRfVUNSX0xFVFRFUkxJS0VfU1lNQk9MUyAgICAgICAgICAgICAgICgxIDw8ICAzKSAvKiBVKzIxMDAtVSsyMTRGICovCisvKiBCaXQgMzYgICBOdW1iZXIgRm9ybXMgKi8KKyNkZWZpbmUgVFRfVUNSX05VTUJFUl9GT1JNUyAgICAgICAgICAgICAgICAgICAgICgxIDw8ICA0KSAvKiBVKzIxNTAtVSsyMThGICovCisvKiBCaXQgMzcgICBBcnJvd3MgKi8KKyNkZWZpbmUgVFRfVUNSX0FSUk9XUyAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8ICA1KSAvKiBVKzIxOTAtVSsyMUZGICovCisvKiBCaXQgMzggICBNYXRoZW1hdGljYWwgT3BlcmF0b3JzICovCisjZGVmaW5lIFRUX1VDUl9NQVRIRU1BVElDQUxfT1BFUkFUT1JTICAgICAgICAgICAoMSA8PCAgNikgLyogVSsyMjAwLVUrMjJGRiAqLworLyogQml0IDM5IE1pc2NlbGxhbmVvdXMgVGVjaG5pY2FsICovCisjZGVmaW5lIFRUX1VDUl9NSVNDRUxMQU5FT1VTX1RFQ0hOSUNBTCAgICAgICAgICAoMSA8PCAgNykgLyogVSsyMzAwLVUrMjNGRiAqLworLyogQml0IDQwICAgQ29udHJvbCBQaWN0dXJlcyAqLworI2RlZmluZSBUVF9VQ1JfQ09OVFJPTF9QSUNUVVJFUyAgICAgICAgICAgICAgICAgKDEgPDwgIDgpIC8qIFUrMjQwMC1VKzI0M0YgKi8KKy8qIEJpdCA0MSAgIE9wdGljYWwgQ2hhcmFjdGVyIFJlY29nbml0aW9uICovCisjZGVmaW5lIFRUX1VDUl9PQ1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAgOSkgLyogVSsyNDQwLVUrMjQ1RiAqLworLyogQml0IDQyICAgRW5jbG9zZWQgQWxwaGFudW1lcmljcyAqLworI2RlZmluZSBUVF9VQ1JfRU5DTE9TRURfQUxQSEFOVU1FUklDUyAgICAgICAgICAgKDEgPDwgMTApIC8qIFUrMjQ2MC1VKzI0RkYgKi8KKy8qIEJpdCA0MyAgIEJveCBEcmF3aW5nICovCisjZGVmaW5lIFRUX1VDUl9CT1hfRFJBV0lORyAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAxMSkgLyogVSsyNTAwLVUrMjU3RiAqLworLyogQml0IDQ0ICAgQmxvY2sgRWxlbWVudHMgKi8KKyNkZWZpbmUgVFRfVUNSX0JMT0NLX0VMRU1FTlRTICAgICAgICAgICAgICAgICAgICgxIDw8IDEyKSAvKiBVKzI1ODAtVSsyNTlGICovCisvKiBCaXQgNDUgICBHZW9tZXRyaWMgU2hhcGVzICovCisjZGVmaW5lIFRUX1VDUl9HRU9NRVRSSUNfU0hBUEVTICAgICAgICAgICAgICAgICAoMSA8PCAxMykgLyogVSsyNUEwLVUrMjVGRiAqLworLyogQml0IDQ2ICAgTWlzY2VsbGFuZW91cyBTeW1ib2xzICovCisjZGVmaW5lIFRUX1VDUl9NSVNDRUxMQU5FT1VTX1NZTUJPTFMgICAgICAgICAgICAoMSA8PCAxNCkgLyogVSsyNjAwLVUrMjZGRiAqLworLyogQml0IDQ3ICAgRGluZ2JhdHMgKi8KKyNkZWZpbmUgVFRfVUNSX0RJTkdCQVRTICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDE1KSAvKiBVKzI3MDAtVSsyN0JGICovCisKKy8qIENKSyBQaG9uZXRpY3MgYW5kIFN5bWJvbHMgQXJlYSAqLworCisvKiBCaXQgNDggICBDSksgU3ltYm9scyBBbmQgUHVuY3R1YXRpb24gKi8KKyNkZWZpbmUgVFRfVUNSX0NKS19TWU1CT0xTICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDE2KSAvKiBVKzMwMDAtVSszMDNGICovCisvKiBCaXQgNDkgICBIaXJhZ2FuYSAqLworI2RlZmluZSBUVF9VQ1JfSElSQUdBTkEgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMTcpIC8qIFUrMzA0MC1VKzMwOUYgKi8KKy8qIEJpdCA1MCAgIEthdGFrYW5hICovCisjZGVmaW5lIFRUX1VDUl9LQVRBS0FOQSAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAxOCkgLyogVSszMEEwLVUrMzBGRiAqLworLyogQml0IDUxICAgQm9wb21vZm8gKi8KKyNkZWZpbmUgVFRfVUNSX0JPUE9NT0ZPICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDE5KSAvKiBVKzMxMDAtVSszMTJGICovCisvKiBCaXQgNTIgICBIYW5ndWwgQ29tcGF0aWJpbGl0eSBKYW1vICovCisjZGVmaW5lIFRUX1VDUl9IQU5HVUxfQ09NUEFUSUJJTElUWV9KQU1PICAgICAgICAoMSA8PCAyMCkgLyogVSszMTMwLVUrMzE4RiAqLworLyogQml0IDUzICAgQ0pLIE1pc2NlbGxhbmVvdXMgKi8KKyNkZWZpbmUgVFRfVUNSX0NKS19NSVNDICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDIxKSAvKiBVKzMxOTAtVSszMTlGICovCisvKiBCaXQgNTQgICBFbmNsb3NlZCBDSksgTGV0dGVycyBBbmQgTW9udGhzICovCisjZGVmaW5lIFRUX1VDUl9FTkNMT1NFRF9DSktfTEVUVEVSU19NT05USFMgICAgICAoMSA8PCAyMikgLyogVSszMjAwLVUrMzJGRiAqLworLyogQml0IDU1ICAgQ0pLIENvbXBhdGliaWxpdHkgKi8KKyNkZWZpbmUgVFRfVUNSX0NKS19DT01QQVRJQklMSVRZICAgICAgICAgICAgICAgICgxIDw8IDIzKSAvKiBVKzMzMDAtVSszM0ZGICovCisKKy8qIEhhbmd1bCBTeWxsYWJsZXMgQXJlYSAqLworCisvKiBCaXQgNTYgICBIYW5ndWwgKi8KKyNkZWZpbmUgVFRfVUNSX0hBTkdVTCAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDI0KSAvKiBVK0FDMDAtVStEN0EzICovCisKKy8qIFN1cnJvZ2F0ZXMgQXJlYSAqLworCisvKiBCaXQgNTcgICBTdXJyb2dhdGVzICovCisjZGVmaW5lIFRUX1VDUl9TVVJST0dBVEVTICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAyNSkgLyogVStEODAwLVUrREZGRiAqLworLyogQml0IDU4IGlzIHJlc2VydmVkIGZvciBVbmljb2RlIFN1YlJhbmdlcyAqLworCisvKiBDSksgSWRlb2dyYXBocyBBcmVhICovCisKKy8qIEJpdCA1OSAgIENKSyBVbmlmaWVkIElkZW9ncmFwaHMgKi8KKyNkZWZpbmUgVFRfVUNSX0NKS19VTklGSUVEX0lERU9HUkFQSFMgICAgICAgICAgICgxIDw8IDI3KSAvKiBVKzRFMDAtVSs5RkZGICovCisKKy8qIFByaXZhdGUgVXNlIEFyZWEgKi8KKworLyogQml0IDYwICAgUHJpdmF0ZSBVc2UgKi8KKyNkZWZpbmUgVFRfVUNSX1BSSVZBVEVfVVNFICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDI4KSAvKiBVK0UwMDAtVStGOEZGICovCisKKy8qIENvbXBhdGliaWxpdHkgQXJlYSBhbmQgU3BlY2lhbHMgKi8KKworLyogQml0IDYxICAgQ0pLIENvbXBhdGliaWxpdHkgSWRlb2dyYXBocyAqLworI2RlZmluZSBUVF9VQ1JfQ0pLX0NPTVBBVElCSUxJVFlfSURFT0dSQVBIUyAgICAgKDEgPDwgMjkpIC8qIFUrRjkwMC1VK0ZBRkYgKi8KKy8qIEJpdCA2MiAgIEFscGhhYmV0aWMgUHJlc2VudGF0aW9uIEZvcm1zICovCisjZGVmaW5lIFRUX1VDUl9BTFBIQUJFVElDX1BSRVNFTlRBVElPTl9GT1JNUyAgICAoMSA8PCAzMCkgLyogVStGQjAwLVUrRkI0RiAqLworLyogQml0IDYzICAgQXJhYmljIFByZXNlbnRhdGlvbiBGb3Jtcy1BICovCisjZGVmaW5lIFRUX1VDUl9BUkFCSUNfUFJFU0VOVEFUSU9OX0ZPUk1TX0EgICAgICAoMSA8PCAzMSkgLyogVStGQjUwLVUrRlNGRiAqLworLyogQml0IDY0ICAgQ29tYmluaW5nIEhhbGYgTWFya3MgKi8KKyNkZWZpbmUgVFRfVUNSX0NPTUJJTklOR19IQUxGX01BUktTICAgICAgICAgICAgICgxIDw8ICAwKSAvKiBVK0ZFMjAtVStGRTJGICovCisvKiBCaXQgNjUgICBDSksgQ29tcGF0aWJpbGl0eSBGb3JtcyAqLworI2RlZmluZSBUVF9VQ1JfQ0pLX0NPTVBBVElCSUxJVFlfRk9STVMgICAgICAgICAgKDEgPDwgIDEpIC8qIFUrRkUzMC1VK0ZFNEYgKi8KKy8qIEJpdCA2NiAgIFNtYWxsIEZvcm0gVmFyaWFudHMgKi8KKyNkZWZpbmUgVFRfVUNSX1NNQUxMX0ZPUk1fVkFSSUFOVFMgICAgICAgICAgICAgICgxIDw8ICAyKSAvKiBVK0ZFNTAtVStGRTZGICovCisvKiBCaXQgNjcgICBBcmFiaWMgUHJlc2VudGF0aW9uIEZvcm1zLUIgKi8KKyNkZWZpbmUgVFRfVUNSX0FSQUJJQ19QUkVTRU5UQVRJT05fRk9STVNfQiAgICAgICgxIDw8ICAzKSAvKiBVK0ZFNzAtVStGRUZGICovCisvKiBCaXQgNjggICBIYWxmd2lkdGggQW5kIEZ1bGx3aWR0aCBGb3JtcyAqLworI2RlZmluZSBUVF9VQ1JfSEFMRldJRFRIX0ZVTExXSURUSF9GT1JNUyAgICAgICAgKDEgPDwgIDQpIC8qIFUrRkYwMC1VK0ZGRUYgKi8KKy8qIEJpdCA2OSAgIFNwZWNpYWxzICovCisjZGVmaW5lIFRUX1VDUl9TUEVDSUFMUyAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAgNSkgLyogVStGRUZGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrRkZGMC1VK0ZGRkYgKi8KKy8qIEJpdCA3MCAgIFRpYmV0YW4gKi8KKyNkZWZpbmUgVFRfVUNSX1RJQkVUQU4gICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8ICA2KSAvKiBVKzBGMDAtVSswRkJGICovCisKKworI2VuZGlmIC8qIFRUTkFNRUlEX0ggKi8KKworCisvKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy90cnVldHlwZS90dG9ianMuYyBiL3NyYy90cnVldHlwZS90dG9ianMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYWExNGFiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RydWV0eXBlL3R0b2Jqcy5jCkBAIC0wLDAgKzEsODg4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICB0dG9ianMuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT2JqZWN0cyBtYW5hZ2VyIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDE5OTYtMTk5OSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkICAgICAgICAqLworLyogIG1vZGlmaWVkIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAgKi8KKy8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCisvKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLworLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNpbmNsdWRlIDxmcmVldHlwZS5oPgorI2luY2x1ZGUgPGZ0ZGVidWcuaD4KKyNpbmNsdWRlIDxmdGNhbGMuaD4KKyNpbmNsdWRlIDxmdHN0cmVhbS5oPgorI2luY2x1ZGUgPHR0bmFtZWlkLmg+CisKKyNpbmNsdWRlIDxzZm50Lmg+CisKKyNpbmNsdWRlIDx0dHBsb2FkLmg+CisjaW5jbHVkZSA8dHRpbnRlcnAuaD4KKyNpbmNsdWRlIDx0dGVycm9ycy5oPgorCisvKiByZXF1aXJlZCBieSB0cmFjaW5nIG1vZGUgKi8KKyN1bmRlZiAgIEZUX0NPTVBPTkVOVAorI2RlZmluZSAgRlRfQ09NUE9ORU5UICB0cmFjZV90dG9ianMKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgIEdMWVBIIFpPTkUgRlVOQ1RJT05TICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX05ld19HbHlwaFpvbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEFsbG9jYXRlcyBhIG5ldyBnbHlwaCB6b25lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG1lbW9yeSAgICAgIDo6IEEgaGFuZGxlIHRvIHRoZSBjdXJyZW50IG1lbW9yeSBvYmplY3QuICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbWF4UG9pbnRzICAgOjogVGhlIGNhcGFjaXR5IG9mIGdseXBoIHpvbmUgaW4gcG9pbnRzLiAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBtYXhDb250b3VycyA6OiBUaGUgY2FwYWNpdHkgb2YgZ2x5cGggem9uZSBpbiBjb250b3Vycy4gICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBwdHMgICAgICAgICA6OiBBIHBvaW50ZXIgdG8gdGhlIHRhcmdldCBnbHlwaCB6b25lIHJlY29yZC4gICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUcnVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIExPQ0FMX0ZVTkMKKyAgVFRfRXJyb3IgIFRUX05ld19HbHlwaFpvbmUoIEZUX01lbW9yeSAgICAgIG1lbW9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX0dseXBoWm9uZSogIHB0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX1VTaG9ydCAgICAgIG1heFBvaW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX1Nob3J0ICAgICAgIG1heENvbnRvdXJzICkKKyAgeworICAgIFRUX0Vycm9yICBlcnJvcjsKKworCisgICAgaWYgKCBBTExPQyggcHRzLT5vcmcsIG1heFBvaW50cyAqIDIgKiBzaXplb2YgKCBUVF9GMjZEb3Q2ICkgICApIHx8CisgICAgICAgICBBTExPQyggcHRzLT5jdXIsIG1heFBvaW50cyAqIDIgKiBzaXplb2YgKCBUVF9GMjZEb3Q2ICkgICApIHx8CisgICAgICAgICBBTExPQyggcHRzLT50b3VjaCwgbWF4UG9pbnRzICogc2l6ZW9mICggVFRfQnl0ZSApICAgICAgICApIHx8CisgICAgICAgICBBTExPQyggcHRzLT5jb250b3VycywgbWF4Q29udG91cnMgKiBzaXplb2YgKCBUVF9VU2hvcnQgKSApICkKKyAgICAgIHJldHVybiBlcnJvcjsKKworICAgIHJldHVybiBUVF9FcnJfT2s7CisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX0RvbmVfR2x5cGhab25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIERlYWxsb2NhdGVzIGEgZ2x5cGggem9uZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG1lbW9yeSA6OiBBIGhhbmRsZSB0byB0aGUgY3VycmVudCBtZW1vcnkgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgcHRzICAgIDo6IEEgcG9pbnRlciB0byB0aGUgdGFyZ2V0IGdseXBoIHpvbmUgcmVjb3JkLiAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVHJ1ZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBMT0NBTF9GVU5DCisgIFRUX0Vycm9yICBUVF9Eb25lX0dseXBoWm9uZSggRlRfTWVtb3J5ICAgICAgbWVtb3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX0dseXBoWm9uZSogIHB0cyApCisgIHsKKyAgICBGUkVFKCBwdHMtPmNvbnRvdXJzICk7CisgICAgRlJFRSggcHRzLT50b3VjaCApOworICAgIEZSRUUoIHB0cy0+Y3VyICk7CisgICAgRlJFRSggcHRzLT5vcmcgKTsKKworICAgIHJldHVybiBUVF9FcnJfT2s7CisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEdldF9OYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFJldHVybnMgYSBnaXZlbiBFTkdMSVNIIG5hbWUgcmVjb3JkIGluIEFTQ0lJLiAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZhY2UgICA6OiBBIGhhbmRsZSB0byB0aGUgc291cmNlIGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbmFtZWlkIDo6IFRoZSBuYW1lIGlkIG9mIHRoZSBuYW1lIHJlY29yZCB0byByZXR1cm4uICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQ2hhciBzdHJpbmcuICBOVUxMIGlmIG5vIG5hbWUgaXMgcHJlc2VudC4gICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBzdGF0aWMKKyAgRlRfU3RyaW5nKiAgR2V0X05hbWUoIFRUX0ZhY2UgICAgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRUX1VTaG9ydCAgbmFtZWlkICkKKyAgeworICAgIEZUX01lbW9yeSAgICBtZW1vcnkgPSBmYWNlLT5yb290Lm1lbW9yeTsKKyAgICBUVF9VU2hvcnQgICAgbjsKKyAgICBUVF9OYW1lUmVjKiAgcmVjOworICAgIFRUX0Jvb2wgICAgICB3aWRlX2NoYXJzID0gMTsKKworICAgIC8qIGZpcnN0IHBhc3MsIGxvb2sgZm9yIGEgZ2l2ZW4gbmFtZSByZWNvcmQgKi8KKworICAgIHJlYyA9IGZhY2UtPm5hbWVfdGFibGUubmFtZXM7CisgICAgZm9yICggbiA9IDA7IG4gPCBmYWNlLT5uYW1lX3RhYmxlLm51bU5hbWVSZWNvcmRzOyBuKyssIHJlYysrICkKKyAgICB7CisgICAgICBpZiAoIHJlYy0+bmFtZUlEID09IG5hbWVpZCApCisgICAgICB7CisgICAgICAgIC8qIGZvdW5kIHRoZSBuYW1lIC0gbm93IGNyZWF0ZSBhbiBBU0NJSSBzdHJpbmcgZnJvbSBpdCAqLworICAgICAgICBUVF9Cb29sICBmb3VuZCA9IDA7CisKKworICAgICAgICAvKiBUZXN0IGZvciBNaWNyb3NvZnQgRW5nbGlzaCBsYW5ndWFnZSAqLworICAgICAgICBpZiAoIHJlYy0+cGxhdGZvcm1JRCA9PSBUVF9QTEFURk9STV9NSUNST1NPRlQgJiYKKyAgICAgICAgICAgICByZWMtPmVuY29kaW5nSUQgPCAgVFRfTVNfSURfVU5JQ09ERV9DUyAgICYmCisgICAgICAgICAgICAgKHJlYy0+bGFuZ3VhZ2VJRCAmIDB4M0ZGKSA9PSAweDAwOSApCisgICAgICAgICAgZm91bmQgPSAxOworCisgICAgICAgIC8qIFRlc3QgZm9yIEFwcGxlIFVuaWNvZGUgZW5jb2RpbmcgKi8KKyAgICAgICAgZWxzZSBpZiAoIHJlYy0+cGxhdGZvcm1JRCA9PSBUVF9QTEFURk9STV9BUFBMRV9VTklDT0RFICkKKyAgICAgICAgICBmb3VuZCA9IDE7CisgICAgICAgIAorICAgICAgICAvKiBUZXN0IGZvciBBcHBsZSBSb21hbiAqLworICAgICAgICBlbHNlIGlmICggcmVjLT5wbGF0Zm9ybUlEID09IFRUX1BMQVRGT1JNX01BQ0lOVE9TSCAmJgorICAgICAgICAgICAgICAgICAgcmVjLT5sYW5ndWFnZUlEID09IFRUX01BQ19JRF9ST01BTiAgICAgICApCisgICAgICAgIHsKKyAgICAgICAgICBmb3VuZCAgICAgID0gMTsKKyAgICAgICAgICB3aWRlX2NoYXJzID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIEZvdW5kIGEgVW5pY29kZSBOYW1lICovCisgICAgICAgIGlmICggZm91bmQgKQorICAgICAgICB7CisgICAgICAgICAgVFRfU3RyaW5nKiAgc3RyaW5nOworICAgICAgICAgIFRUX1VJbnQgICAgIGxlbjsKKworICAgICAgICAgIGlmICggd2lkZV9jaGFycyApCisgICAgICAgICAgeworICAgICAgICAgICAgVFRfVUludCAgIG07CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGxlbiA9IChUVF9VSW50KXJlYy0+c3RyaW5nTGVuZ3RoIC8gMjsKKyAgICAgICAgICAgIGlmICggTUVNX0FsbG9jKCBzdHJpbmcsIGxlbiArIDEgKSApCisgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIAorICAgICAgICAgICAgZm9yICggbSA9IDA7IG0gPCBsZW47IG0gKysgKQorICAgICAgICAgICAgICBzdHJpbmdbbV0gPSByZWMtPnN0cmluZ1syKm0gKyAxXTsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGxlbiA9IHJlYy0+c3RyaW5nTGVuZ3RoOworICAgICAgICAgICAgaWYgKCBNRU1fQWxsb2MoIHN0cmluZywgbGVuICsgMSApICkKKyAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICAgICAgICAgIE1FTV9Db3B5KCBzdHJpbmcsIHJlYy0+c3RyaW5nLCBsZW4gKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBzdHJpbmdbbGVuXSA9ICdcMCc7CisgICAgICAgICAgcmV0dXJuIHN0cmluZzsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisKKyN1bmRlZiAgTE9BRF8KKyNkZWZpbmUgTE9BRF8oeCkgICAoIChlcnJvciA9IHNmbnQtPmxvYWRfIyN4KCBmYWNlLCBzdHJlYW0gKSkgIT0gVFRfRXJyX09rICkKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX0luaXRfRmFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEluaXRpYWxpemVzIGEgZ2l2ZW4gVHJ1ZVR5cGUgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHJlc291cmNlICAgOjogVGhlIHNvdXJjZSBmb250IHJlc291cmNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBmYWNlX2luZGV4IDo6IFRoZSBpbmRleCBvZiB0aGUgZm9udCBmYWNlIGluIHRoZSByZXNvdXJjZS4gICAgICAgICAgKi8KKyAgLyogICAgZmFjZSAgICAgICA6OiBUaGUgbmV3bHkgYnVpbHQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVHJ1ZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBMT0NBTF9ERUYKKyAgVFRfRXJyb3IgIFRUX0luaXRfRmFjZSggRlRfU3RyZWFtICBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX0xvbmcgICAgZmFjZV9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfRmFjZSAgICBmYWNlICkKKyAgeworICAgIFRUX0Vycm9yICAgICAgICAgZXJyb3I7CisgICAgU0ZOVF9JbnRlcmZhY2UqICBzZm50OworCisgICAgc2ZudCA9IChTRk5UX0ludGVyZmFjZSopZmFjZS0+c2ZudDsKKyAgICBpZiAoIXNmbnQpCisgICAgeworICAgICAgLyogbG9vay11cCB0aGUgU0ZOVCBkcml2ZXIgKi8KKyAgICAgIEZUX0RyaXZlciAgc2ZudF9kcml2ZXI7CisgICAgICAKKyAgICAgIHNmbnRfZHJpdmVyID0gRlRfR2V0X0RyaXZlciggZmFjZS0+cm9vdC5kcml2ZXItPmxpYnJhcnksICJzZm50IiApOworICAgICAgaWYgKCFzZm50X2RyaXZlcikKKyAgICAgICAgcmV0dXJuIEZUX0Vycl9JbnZhbGlkX0ZpbGVfRm9ybWF0OworICAgICAgICAKKyAgICAgIHNmbnQgPSAoU0ZOVF9JbnRlcmZhY2UqKShzZm50X2RyaXZlci0+aW50ZXJmYWNlLmZvcm1hdF9pbnRlcmZhY2UpOworICAgICAgaWYgKCFzZm50KQorICAgICAgICByZXR1cm4gRlRfRXJyX0ludmFsaWRfRmlsZV9Gb3JtYXQ7CisgICAgICAgIAorICAgICAgZmFjZS0+c2ZudCAgICAgICA9IHNmbnQ7CisgICAgICBmYWNlLT5nb3RvX3RhYmxlID0gc2ZudC0+Z290b190YWJsZTsKKyAgICB9CisgICAgCisgICAgLyogY3JlYXRlIGlucHV0IHN0cmVhbSBmcm9tIHJlc291cmNlICovCisgICAgaWYgKCBGSUxFX1NlZWsoMCkgKQorICAgICAgZ290byBFeGl0OworCisgICAgLyogTG9hZCBjb2xsZWN0aW9uIGRpcmVjdG9yeSBpZiBwcmVzZW50LCB0aGVuIGZvbnQgZGlyZWN0b3J5ICovCisgICAgZXJyb3IgPSBzZm50LT5sb2FkX2RpcmVjdG9yeSggZmFjZSwgc3RyZWFtLCBmYWNlX2luZGV4ICk7CisgICAgaWYgKCBlcnJvciApIGdvdG8gRXhpdDsKKworICAgIGZhY2UtPnJvb3QubnVtX2ZhY2VzID0gZmFjZS0+dHRjX2hlYWRlci5EaXJDb3VudDsKKyAgICBpZiAoIGZhY2UtPnJvb3QubnVtX2ZhY2VzIDwgMSApCisgICAgICBmYWNlLT5yb290Lm51bV9mYWNlcyA9IDE7CisKKyAgICAvKiBJZiB3ZSdyZSBwZXJmb3JtaW5nIGEgc2ltcGxlIGZvbnQgZm9ybWF0IGNoZWNrLCBleGl0IGltbWVkaWF0ZWx5ICovCisgICAgaWYgKCBmYWNlX2luZGV4IDwgMCApCisgICAgICByZXR1cm4gVFRfRXJyX09rOworCisgICAgLyogTG9hZCB0YWJsZXMgKi8KKworICAgIGlmICggTE9BRF8oIGhlYWRlciApICAgICAgICB8fAorICAgICAgICAgTE9BRF8oIG1heF9wcm9maWxlICkgICB8fAorCisgICAgICAgICAoZXJyb3IgPSBzZm50LT5sb2FkX21ldHJpY3MoIGZhY2UsIHN0cmVhbSwgMCApKSAhPSBUVF9FcnJfT2sgIHx8CisgICAgICAgICAvKiBsb2FkIHRoZSBgaGhlYScgJiBgaG10eCcgdGFibGVzIGF0IG9uY2UgKi8KKworICAgICAgICAgKGVycm9yID0gc2ZudC0+bG9hZF9tZXRyaWNzKCBmYWNlLCBzdHJlYW0sIDEgKSkgIT0gVFRfRXJyX09rIHx8CisgICAgICAgICAvKiB0cnkgdG8gbG9hZCB0aGUgYHZoZWEnICYgYHZtdHgnIGF0IG9uY2UgaWYgcHJlc2VudCAqLworCisgICAgICAgICBMT0FEXyggY2hhcm1hcHMgKSAgICAgIHx8CisgICAgICAgICBMT0FEXyggbmFtZXMgKSAgICAgICAgIHx8CisgICAgICAgICBMT0FEXyggb3MyICkgICAgICAgICAgIHx8CisgICAgICAgICBMT0FEXyggcHNuYW1lcyApICAgICAgIHx8CisKKyAgICAgICAgIC8qIHRoZSBvcHRpb25hbCB0YWJsZXMgKi8KKyNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX0VNQkVEREVEX0JJVE1BUFMKKyAgICAgICAgIExPQURfKCBzYml0cyApICB8fAorI2VuZGlmCisgICAgICAgICBMT0FEXyggaGRteCApICAgICAgICAgIHx8CisgICAgICAgICBMT0FEXyggZ2FzcCApICAgICAgICAgIHx8CisgICAgICAgICBMT0FEXygga2VybmluZyApICAgICAgIHx8CisKKyAgICAgICAgIChlcnJvciA9IFRUX0xvYWRfTG9jYXRpb25zKCBmYWNlLCBzdHJlYW0gKSkgIT0gVFRfRXJyX09rIHx8CisgICAgICAgICAoZXJyb3IgPSBUVF9Mb2FkX0NWVCAgICAgICggZmFjZSwgc3RyZWFtICkpICE9IFRUX0Vycl9PayB8fAorICAgICAgICAgKGVycm9yID0gVFRfTG9hZF9Qcm9ncmFtcyAoIGZhY2UsIHN0cmVhbSApKSAhPSBUVF9FcnJfT2sgKQorCisgICAgICBnb3RvIEV4aXQ7CisKKyNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX0VYVEVORF9FTkdJTkUKKyAgICBpZiAoICggZXJyb3IgPSBUVF9FeHRlbnNpb25fQ3JlYXRlKCBmYWNlICkgKSAhPSBUVF9FcnJfT2sgKQorICAgICAgZ290byBFeGl0OworI2VuZGlmCisKKyAgICBmYWNlLT5yb290LmZhbWlseV9uYW1lID0gR2V0X05hbWUoIGZhY2UsIFRUX05BTUVfSURfRk9OVF9GQU1JTFkgKTsKKyAgICBmYWNlLT5yb290LnN0eWxlX25hbWUgID0gR2V0X05hbWUoIGZhY2UsIFRUX05BTUVfSURfRk9OVF9TVUJGQU1JTFkgKTsKKworICBFeGl0OgorICAgIHJldHVybiBlcnJvcjsKKyAgfQorCisKKyN1bmRlZiBMT0FEXworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfRG9uZV9GYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRmluYWxpemVzIGEgZ2l2ZW4gZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZmFjZSA6OiBBIHBvaW50ZXIgdG8gdGhlIGZhY2Ugb2JqZWN0IHRvIGRlc3Ryb3kuICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBMT0NBTF9ERUYKKyAgdm9pZCAgVFRfRG9uZV9GYWNlKCBUVF9GYWNlICBmYWNlICkKKyAgeworICAgIFRUX1VTaG9ydCAgbjsKKyAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IGZhY2UtPnJvb3QubWVtb3J5OworCisgICAgU0ZOVF9JbnRlcmZhY2UqICBzZm50ID0gZmFjZS0+c2ZudDsKKyAgICAKKyAgICBpZiAoc2ZudCkKKyAgICB7CisgICAgICAvKiBkZXN0cm95IHRoZSBwb3N0c2NyaXB0IG5hbWVzIHRhYmxlIGlmIGl0IGlzIHN1cHBvcnRlZCAqLworICAgICAgaWYgKHNmbnQtPmxvYWRfcHNuYW1lcykKKyAgICAgICAgc2ZudC0+ZnJlZV9wc25hbWVzKCBmYWNlICk7CisgICAgICAgIAorICAgICAgLyogZGVzdHJveSB0aGUgZW1iZWRkZWQgYml0bWFwcyB0YWJsZSBpZiBpdCBpcyBzdXBwb3J0ZWQgKi8KKyAgICAgIGlmIChzZm50LT5sb2FkX3NiaXRzKQorICAgICAgICBzZm50LT5mcmVlX3NiaXRzKCBmYWNlICk7CisgICAgfQorCisgICAgLyogZnJlZWluZyB0aGUga2VybmluZyB0YWJsZSAqLworICAgIEZSRUUoIGZhY2UtPmtlcm5fcGFpcnMgKTsKKyAgICBmYWNlLT5udW1fa2Vybl9wYWlycyA9IDA7CisKKyAgICAvKiBmcmVlaW5nIHRoZSBjb2xsZWN0aW9uIHRhYmxlICovCisgICAgRlJFRSggZmFjZS0+dHRjX2hlYWRlci5UYWJsZURpcmVjdG9yeSApOworICAgIGZhY2UtPnR0Y19oZWFkZXIuRGlyQ291bnQgPSAwOworCisgICAgLyogZnJlZWluZyB0YWJsZSBkaXJlY3RvcnkgKi8KKyAgICBGUkVFKCBmYWNlLT5kaXJfdGFibGVzICk7CisgICAgZmFjZS0+bnVtX3RhYmxlcyA9IDA7CisKKyAgICAvKiBmcmVlaW5nIHRoZSBsb2NhdGlvbnMgdGFibGUgKi8KKyAgICBGUkVFKCBmYWNlLT5nbHlwaF9sb2NhdGlvbnMgKTsKKyAgICBmYWNlLT5udW1fbG9jYXRpb25zID0gMDsKKworICAgIC8qIGZyZWVpbmcgdGhlIGNoYXJhY3RlciBtYXBwaW5nIHRhYmxlcyAqLworICAgIGlmIChzZm50ICYmIHNmbnQtPmxvYWRfY2hhcm1hcHMgKQorICAgIHsKKyAgICAgIGZvciAoIG4gPSAwOyBuIDwgZmFjZS0+bnVtX2NoYXJtYXBzOyBuKysgKQorICAgICAgICBzZm50LT5mcmVlX2NoYXJtYXAoIGZhY2UsICZmYWNlLT5jaGFybWFwc1tuXS5jbWFwICk7CisgICAgfQorCisgICAgRlJFRSggZmFjZS0+Y2hhcm1hcHMgKTsKKyAgICBmYWNlLT5udW1fY2hhcm1hcHMgPSAwOworCisgICAgRlJFRSggZmFjZS0+cm9vdC5jaGFybWFwcyApOworICAgIGZhY2UtPnJvb3QubnVtX2NoYXJtYXBzID0gMDsKKyAgICBmYWNlLT5yb290LmNoYXJtYXAgICAgICA9IDA7CisKKyAgICAvKiBmcmVlaW5nIHRoZSBDVlQgKi8KKyAgICBGUkVFKCBmYWNlLT5jdnQgKTsKKyAgICBmYWNlLT5jdnRfc2l6ZSA9IDA7CisKKyAgICAvKiBmcmVlaW5nIHRoZSBob3Jpem9udGFsIG1ldHJpY3MgKi8KKyAgICBGUkVFKCBmYWNlLT5ob3Jpem9udGFsLmxvbmdfbWV0cmljcyApOworICAgIEZSRUUoIGZhY2UtPmhvcml6b250YWwuc2hvcnRfbWV0cmljcyApOworCisgICAgLyogZnJlZWluZyB0aGUgdmVydGljYWwgb25lcywgaWYgYW55ICovCisgICAgaWYgKCBmYWNlLT52ZXJ0aWNhbF9pbmZvICkKKyAgICB7CisgICAgICBGUkVFKCBmYWNlLT52ZXJ0aWNhbC5sb25nX21ldHJpY3MgICk7CisgICAgICBGUkVFKCBmYWNlLT52ZXJ0aWNhbC5zaG9ydF9tZXRyaWNzICk7CisgICAgICBmYWNlLT52ZXJ0aWNhbF9pbmZvID0gMDsKKyAgICB9CisKKyAgICAvKiBmcmVlaW5nIHRoZSBwcm9ncmFtcyAqLworICAgIEZSRUUoIGZhY2UtPmZvbnRfcHJvZ3JhbSApOworICAgIEZSRUUoIGZhY2UtPmN2dF9wcm9ncmFtICk7CisgICAgZmFjZS0+Zm9udF9wcm9ncmFtX3NpemUgPSAwOworICAgIGZhY2UtPmN2dF9wcm9ncmFtX3NpemUgID0gMDsKKworICAgIC8qIGZyZWVpbmcgdGhlIGdhc3AgdGFibGUgKi8KKyAgICBGUkVFKCBmYWNlLT5nYXNwLmdhc3BSYW5nZXMgKTsKKyAgICBmYWNlLT5nYXNwLm51bVJhbmdlcyA9IDA7CisKKyAgICAvKiBmcmVlaW5nIHRoZSBuYW1lIHRhYmxlICovCisgICAgc2ZudC0+ZnJlZV9uYW1lcyggZmFjZSApOworCisgICAgLyogZnJlZWluZyB0aGUgaGRteCB0YWJsZSAqLworICAgIHNmbnQtPmZyZWVfaGRteCggZmFjZSApOworCisgICAgLyogZnJlZWluZyBmYW1pbHkgYW5kIHN0eWxlIG5hbWUgKi8KKyAgICBGUkVFKCBmYWNlLT5yb290LmZhbWlseV9uYW1lICk7CisgICAgRlJFRSggZmFjZS0+cm9vdC5zdHlsZV9uYW1lICk7CisgICAgCisgICAgZmFjZS0+c2ZudCA9IDA7CisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBTSVpFICBGVU5DVElPTlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX0luaXRfU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEluaXRpYWxpemVzIGEgbmV3IFRydWVUeXBlIHNpemUgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHNpemUgOjogQSBoYW5kbGUgdG8gdGhlIHNpemUgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRydWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgTE9DQUxfREVGCisgIFRUX0Vycm9yICBUVF9Jbml0X1NpemUoIFRUX1NpemUgIHNpemUgKQorICB7CisgICAgVFRfRmFjZSAgICBmYWNlICAgPSAoVFRfRmFjZSlzaXplLT5yb290LmZhY2U7CisgICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBmYWNlLT5yb290Lm1lbW9yeTsKKyAgICBUVF9FcnJvciAgIGVycm9yOworICAgIFRUX0ludCAgICAgaTsKKyAgICBUVF9VU2hvcnQgIG5fdHdpbGlnaHQ7CisKKyAgICBUVF9NYXhQcm9maWxlKiAgbWF4cCA9ICZmYWNlLT5tYXhfcHJvZmlsZTsKKyAgICBUVF9FeGVjQ29udGV4dCAgZXhlYzsKKworICAgIHNpemUtPnR0bWV0cmljcy52YWxpZCA9IEZBTFNFOworCisgICAgc2l6ZS0+bWF4X2Z1bmN0aW9uX2RlZnMgICAgPSBtYXhwLT5tYXhGdW5jdGlvbkRlZnM7CisgICAgc2l6ZS0+bWF4X2luc3RydWN0aW9uX2RlZnMgPSBtYXhwLT5tYXhJbnN0cnVjdGlvbkRlZnM7CisKKyAgICBzaXplLT5udW1fZnVuY3Rpb25fZGVmcyAgICA9IDA7CisgICAgc2l6ZS0+bnVtX2luc3RydWN0aW9uX2RlZnMgPSAwOworCisgICAgc2l6ZS0+bWF4X2Z1bmMgPSAwOworICAgIHNpemUtPm1heF9pbnMgID0gMDsKKworICAgIHNpemUtPmN2dF9zaXplICAgICA9IGZhY2UtPmN2dF9zaXplOworICAgIHNpemUtPnN0b3JhZ2Vfc2l6ZSA9IG1heHAtPm1heFN0b3JhZ2U7CisKKyAgICAvKiBTZXQgZGVmYXVsdCBtZXRyaWNzICovCisgICAgeworICAgICAgRlRfU2l6ZV9NZXRyaWNzKiAgbWV0cmljcyAgPSAmc2l6ZS0+cm9vdC5tZXRyaWNzOworICAgICAgVFRfU2l6ZV9NZXRyaWNzKiAgbWV0cmljczIgPSAmc2l6ZS0+dHRtZXRyaWNzOworCisgICAgICBtZXRyaWNzLT54X3BwZW0gPSAwOworICAgICAgbWV0cmljcy0+eV9wcGVtID0gMDsKKworICAgICAgbWV0cmljczItPnJvdGF0ZWQgICA9IEZBTFNFOworICAgICAgbWV0cmljczItPnN0cmV0Y2hlZCA9IEZBTFNFOworCisgICAgICAvKiBzZXQgZGVmYXVsdCBjb21wZW5zYXRpb24gKGFsbCAwKSAqLworICAgICAgZm9yICggaSA9IDA7IGkgPCA0OyBpKysgKQorICAgICAgICBtZXRyaWNzMi0+Y29tcGVuc2F0aW9uc1tpXSA9IDA7CisgICAgfQorCisgICAgLyogYWxsb2NhdGUgZnVuY3Rpb24gZGVmcywgaW5zdHJ1Y3Rpb24gZGVmcywgY3Z0IGFuZCBzdG9yYWdlIGFyZWEgKi8KKyAgICBpZiAoIEFMTE9DX0FSUkFZKCBzaXplLT5mdW5jdGlvbl9kZWZzLAorICAgICAgICAgICAgICAgICAgICAgIHNpemUtPm1heF9mdW5jdGlvbl9kZWZzLAorICAgICAgICAgICAgICAgICAgICAgIFRUX0RlZlJlY29yZCApICAgICAgICAgICAgICAgIHx8CisKKyAgICAgICAgIEFMTE9DX0FSUkFZKCBzaXplLT5pbnN0cnVjdGlvbl9kZWZzLAorICAgICAgICAgICAgICAgICAgICAgIHNpemUtPm1heF9pbnN0cnVjdGlvbl9kZWZzLAorICAgICAgICAgICAgICAgICAgICAgIFRUX0RlZlJlY29yZCApICAgICAgICAgICAgICAgIHx8CisKKyAgICAgICAgIEFMTE9DX0FSUkFZKCBzaXplLT5jdnQsCisgICAgICAgICAgICAgICAgICAgICAgc2l6ZS0+Y3Z0X3NpemUsIFRUX0xvbmcgKSAgICAgfHwKKworICAgICAgICAgQUxMT0NfQVJSQVkoIHNpemUtPnN0b3JhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgc2l6ZS0+c3RvcmFnZV9zaXplLCBUVF9Mb25nICkgKQorCisgICAgICBnb3RvIEZhaWxfTWVtb3J5OworCisgICAgLyogcmVzZXJ2ZSB0d2lsaWdodCB6b25lICovCisgICAgbl90d2lsaWdodCA9IG1heHAtPm1heFR3aWxpZ2h0UG9pbnRzOworICAgIGVycm9yID0gVFRfTmV3X0dseXBoWm9uZSggbWVtb3J5LCAmc2l6ZS0+dHdpbGlnaHQsIG5fdHdpbGlnaHQsIDAgKTsKKyAgICBpZiAoIGVycm9yICkKKyAgICAgIGdvdG8gRmFpbF9NZW1vcnk7CisKKyAgICBzaXplLT50d2lsaWdodC5uX3BvaW50cyA9IG5fdHdpbGlnaHQ7CisKKyAgICAvKiBzZXQgYGZhY2UtPmludGVycHJldGVyJyBhY2NvcmRpbmcgdG8gdGhlIGRlYnVnIGhvb2sgcHJlc2VudCAqLworICAgIHsKKyAgICAgIEZUX0xpYnJhcnkgIGxpYnJhcnkgPSBmYWNlLT5yb290LmRyaXZlci0+bGlicmFyeTsKKyAgICAgIAorICAgICAgZmFjZS0+aW50ZXJwcmV0ZXIgPSAoVFRfSW50ZXJwcmV0ZXIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlicmFyeS0+ZGVidWdfaG9va3NbIEZUX0RFQlVHX0hPT0tfVFJVRVRZUEUgXTsKKyAgICAgIGlmICghZmFjZS0+aW50ZXJwcmV0ZXIpCisgICAgICAgIGZhY2UtPmludGVycHJldGVyID0gKFRUX0ludGVycHJldGVyKVRUX1J1bkluczsKKyAgICB9CisKKyAgICAvKiBGaW5lLCBub3cgZXhlY3V0ZSB0aGUgZm9udCBwcm9ncmFtISAqLworICAgIGV4ZWMgPSBzaXplLT5jb250ZXh0OworICAgIGlmICghc2l6ZS0+ZGVidWcpCisgICAgICBleGVjID0gVFRfTmV3X0NvbnRleHQoIGZhY2UgKTsKKyAgICAvKiBzaXplIG9iamVjdHMgdXNlZCBkdXJpbmcgZGVidWdnaW5nIGhhdmUgdGhlaXIgb3duIGNvbnRleHQgKi8KKworICAgIGlmICggIWV4ZWMgKQorICAgIHsKKyAgICAgIGVycm9yID0gVFRfRXJyX0NvdWxkX05vdF9GaW5kX0NvbnRleHQ7CisgICAgICBnb3RvIEZhaWxfTWVtb3J5OworICAgIH0KKworICAgIHNpemUtPkdTID0gdHRfZGVmYXVsdF9ncmFwaGljc19zdGF0ZTsKKyAgICBUVF9Mb2FkX0NvbnRleHQoIGV4ZWMsIGZhY2UsIHNpemUgKTsKKworICAgIGV4ZWMtPmNhbGxUb3AgICA9IDA7CisgICAgZXhlYy0+dG9wICAgICAgID0gMDsKKworICAgIGV4ZWMtPnBlcmlvZCAgICA9IDY0OworICAgIGV4ZWMtPnBoYXNlICAgICA9IDA7CisgICAgZXhlYy0+dGhyZXNob2xkID0gMDsKKworICAgIHsKKyAgICAgIEZUX1NpemVfTWV0cmljcyogIG1ldHJpY3MgICAgPSAmZXhlYy0+bWV0cmljczsKKyAgICAgIFRUX1NpemVfTWV0cmljcyogIHR0X21ldHJpY3MgPSAmZXhlYy0+dHRfbWV0cmljczsKKworCisgICAgICBtZXRyaWNzLT54X3BwZW0gICAgPSAwOworICAgICAgbWV0cmljcy0+eV9wcGVtICAgID0gMDsKKyAgICAgIG1ldHJpY3MtPnhfc2NhbGUgICA9IDA7CisgICAgICBtZXRyaWNzLT55X3NjYWxlICAgPSAwOworCisgICAgICB0dF9tZXRyaWNzLT5wcGVtICAgPSAwOworICAgICAgdHRfbWV0cmljcy0+c2NhbGUgID0gMDsKKyAgICAgIHR0X21ldHJpY3MtPnJhdGlvICA9IDB4MTAwMDA7CisgICAgfQorCisgICAgZXhlYy0+aW5zdHJ1Y3Rpb25fdHJhcCA9IEZBTFNFOworCisgICAgZXhlYy0+Y3Z0U2l6ZSA9IHNpemUtPmN2dF9zaXplOworICAgIGV4ZWMtPmN2dCAgICAgPSBzaXplLT5jdnQ7CisKKyAgICBleGVjLT5GX2RvdF9QID0gMHgxMDAwMEw7CisKKyAgICAvKiBhbGxvdyBmb250IHByb2dyYW0gZXhlY3V0aW9uICovCisgICAgVFRfU2V0X0NvZGVSYW5nZSggZXhlYywKKyAgICAgICAgICAgICAgICAgICAgICB0dF9jb2RlcmFuZ2VfZm9udCwKKyAgICAgICAgICAgICAgICAgICAgICBmYWNlLT5mb250X3Byb2dyYW0sCisgICAgICAgICAgICAgICAgICAgICAgZmFjZS0+Zm9udF9wcm9ncmFtX3NpemUgKTsKKworICAgIC8qIGRpc2FibGUgQ1ZUIGFuZCBnbHlwaCBwcm9ncmFtcyBjb2RlcmFuZ2UgKi8KKyAgICBUVF9DbGVhcl9Db2RlUmFuZ2UoIGV4ZWMsIHR0X2NvZGVyYW5nZV9jdnQgKTsKKyAgICBUVF9DbGVhcl9Db2RlUmFuZ2UoIGV4ZWMsIHR0X2NvZGVyYW5nZV9nbHlwaCApOworCisgICAgaWYgKCBmYWNlLT5mb250X3Byb2dyYW1fc2l6ZSA+IDAgKQorICAgIHsKKyAgICAgIGVycm9yID0gVFRfR290b19Db2RlUmFuZ2UoIGV4ZWMsIHR0X2NvZGVyYW5nZV9mb250LCAwICk7CisgICAgICBpZiAoICFlcnJvciApCisgICAgICAgIGVycm9yID0gZmFjZS0+aW50ZXJwcmV0ZXIoIGV4ZWMgKTsKKworICAgICAgaWYgKCBlcnJvciApCisgICAgICAgIGdvdG8gRmFpbF9FeGVjOworICAgIH0KKyAgICBlbHNlCisgICAgICBlcnJvciA9IFRUX0Vycl9PazsKKworICAgIFRUX1NhdmVfQ29udGV4dCggZXhlYywgc2l6ZSApOworCisgICAgaWYgKCAhc2l6ZS0+ZGVidWcgKQorICAgICAgVFRfRG9uZV9Db250ZXh0KCBleGVjICk7CisKKyAgICBzaXplLT50dG1ldHJpY3MudmFsaWQgPSBGQUxTRTsKKyAgICByZXR1cm4gZXJyb3I7CisKKyAgRmFpbF9FeGVjOgorICAgIGlmICggIXNpemUtPmRlYnVnICkKKyAgICAgIFRUX0RvbmVfQ29udGV4dCggZXhlYyApOworCisgIEZhaWxfTWVtb3J5OgorICAgIFRUX0RvbmVfU2l6ZSggc2l6ZSApOworICAgIHJldHVybiBlcnJvcjsKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfRG9uZV9TaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhlIFRydWVUeXBlIHNpemUgb2JqZWN0IGZpbmFsaXplci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgc2l6ZSA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IHNpemUgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBMT0NBTF9GVU5DCisgIHZvaWQgIFRUX0RvbmVfU2l6ZSggVFRfU2l6ZSAgc2l6ZSApCisgIHsKKyAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IHNpemUtPnJvb3QuZmFjZS0+bWVtb3J5OworCisKKyAgICBpZiAoIHNpemUtPmRlYnVnICkKKyAgICB7CisgICAgICAvKiB0aGUgZGVidWcgY29udGV4dCBtdXN0IGJlIGRlbGV0ZWQgYnkgdGhlIGRlYnVnZ2VyIGl0c2VsZiAqLworICAgICAgc2l6ZS0+Y29udGV4dCA9IE5VTEw7CisgICAgICBzaXplLT5kZWJ1ZyAgID0gRkFMU0U7CisgICAgfQorCisgICAgRlJFRSggc2l6ZS0+Y3Z0ICk7CisgICAgc2l6ZS0+Y3Z0X3NpemUgPSAwOworCisgICAgLyogZnJlZSBzdG9yYWdlIGFyZWEgKi8KKyAgICBGUkVFKCBzaXplLT5zdG9yYWdlICk7CisgICAgc2l6ZS0+c3RvcmFnZV9zaXplID0gMDsKKworICAgIC8qIHR3aWxpZ2h0IHpvbmUgKi8KKyAgICBUVF9Eb25lX0dseXBoWm9uZSggbWVtb3J5LCAmc2l6ZS0+dHdpbGlnaHQgKTsKKworICAgIEZSRUUoIHNpemUtPmZ1bmN0aW9uX2RlZnMgKTsKKyAgICBGUkVFKCBzaXplLT5pbnN0cnVjdGlvbl9kZWZzICk7CisgICAgc2l6ZS0+bnVtX2Z1bmN0aW9uX2RlZnMgICAgPSAwOworICAgIHNpemUtPm1heF9mdW5jdGlvbl9kZWZzICAgID0gMDsKKyAgICBzaXplLT5udW1faW5zdHJ1Y3Rpb25fZGVmcyA9IDA7CisgICAgc2l6ZS0+bWF4X2luc3RydWN0aW9uX2RlZnMgPSAwOworCisgICAgc2l6ZS0+bWF4X2Z1bmMgPSAwOworICAgIHNpemUtPm1heF9pbnMgID0gMDsKKworICAgIHNpemUtPnR0bWV0cmljcy52YWxpZCA9IEZBTFNFOworICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUVF9SZXNldF9TaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBSZXNldHMgYSBUcnVlVHlwZSBzaXplIHdoZW4gcmVzb2x1dGlvbnMgYW5kIGNoYXJhY3RlciBkaW1lbnNpb25zICAgKi8KKyAgLyogICAgaGF2ZSBiZWVuIGNoYW5nZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgc2l6ZSA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IHNpemUgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBMT0NBTF9ERUYKKyAgVFRfRXJyb3IgIFRUX1Jlc2V0X1NpemUoIFRUX1NpemUgIHNpemUgKQorICB7CisgICAgVFRfRXhlY0NvbnRleHQgICAgZXhlYzsKKyAgICBUVF9FcnJvciAgICAgICAgICBlcnJvcjsKKyAgICBUVF9VU2hvcnQgICAgICAgICBpLCBqOworICAgIFRUX0ZhY2UgICAgICAgICAgIGZhY2U7CisKKyAgICBGVF9TaXplX01ldHJpY3MqICBtZXRyaWNzOworCisgICAgaWYgKCBzaXplLT50dG1ldHJpY3MudmFsaWQgKQorICAgICAgcmV0dXJuIFRUX0Vycl9PazsKKworICAgIGZhY2UgPSAoVFRfRmFjZSlzaXplLT5yb290LmZhY2U7CisKKyAgICBtZXRyaWNzID0gJnNpemUtPnJvb3QubWV0cmljczsKKworICAgIGlmICggbWV0cmljcy0+eF9wcGVtIDwgMSB8fCBtZXRyaWNzLT55X3BwZW0gPCAxICkKKyAgICAgIHJldHVybiBUVF9FcnJfSW52YWxpZF9QUGVtOworCisgICAgLyogY29tcHV0ZSBuZXcgdHJhbnNmb3JtYXRpb24gKi8KKyAgICBpZiAoIG1ldHJpY3MtPnhfcHBlbSA+PSBtZXRyaWNzLT55X3BwZW0gKQorICAgIHsKKyAgICAgIHNpemUtPnR0bWV0cmljcy5zY2FsZSAgID0gbWV0cmljcy0+eF9zY2FsZTsKKyAgICAgIHNpemUtPnR0bWV0cmljcy5wcGVtICAgID0gbWV0cmljcy0+eF9wcGVtOworICAgICAgc2l6ZS0+dHRtZXRyaWNzLnhfcmF0aW8gPSAweDEwMDAwOworICAgICAgc2l6ZS0+dHRtZXRyaWNzLnlfcmF0aW8gPSBGVF9NdWxEaXYoIG1ldHJpY3MtPnlfcHBlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMDAwTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRyaWNzLT54X3BwZW0gKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIHNpemUtPnR0bWV0cmljcy5zY2FsZSAgID0gbWV0cmljcy0+eV9zY2FsZTsKKyAgICAgIHNpemUtPnR0bWV0cmljcy5wcGVtICAgID0gbWV0cmljcy0+eV9wcGVtOworICAgICAgc2l6ZS0+dHRtZXRyaWNzLnhfcmF0aW8gPSBGVF9NdWxEaXYoIG1ldHJpY3MtPnhfcHBlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMDAwTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRyaWNzLT55X3BwZW0gKTsKKyAgICAgIHNpemUtPnR0bWV0cmljcy55X3JhdGlvID0gMHgxMDAwMDsKKyAgICB9CisKKyAgICAvKiBDb21wdXRlIHJvb3QgYXNjZW5kZXIsIGRlc2NlbmRlciwgdGVzdCBoZWlnaHQsIGFuZCBtYXhfYWR2YW5jZSAqLworICAgIG1ldHJpY3MtPmFzY2VuZGVyID0gKCBGVF9NdWxGaXgoIGZhY2UtPnJvb3QuYXNjZW5kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0cmljcy0+eV9zY2FsZSApICsgMzIgKSAmIC02NDsKKworICAgIG1ldHJpY3MtPmRlc2NlbmRlciA9ICggRlRfTXVsRml4KCBmYWNlLT5yb290LmRlc2NlbmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0cmljcy0+eV9zY2FsZSApICsgMzIgKSAmIC02NDsKKworICAgIG1ldHJpY3MtPmhlaWdodCA9ICggRlRfTXVsRml4KCBmYWNlLT5yb290LmhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0cmljcy0+eV9zY2FsZSApICsgMzIgKSAmIC02NDsKKworICAgIG1ldHJpY3MtPm1heF9hZHZhbmNlID0gKCBGVF9NdWxGaXgoIGZhY2UtPnJvb3QubWF4X2FkdmFuY2Vfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0cmljcy0+eF9zY2FsZSApICsgMzIgKSAmIC02NDsKKworICAgIC8qIFNjYWxlIHRoZSBjdnQgdmFsdWVzIHRvIHRoZSBuZXcgcHBlbS4gICAgICAgICAgKi8KKyAgICAvKiBXZSB1c2UgYnkgZGVmYXVsdCB0aGUgeSBwcGVtIHRvIHNjYWxlIHRoZSBDVlQuICovCisKKyAgICBmb3IgKCBpID0gMDsgaSA8IHNpemUtPmN2dF9zaXplOyBpKysgKQorICAgICAgc2l6ZS0+Y3Z0W2ldID0gRlRfTXVsRml4KCBmYWNlLT5jdnRbaV0sIHNpemUtPnR0bWV0cmljcy5zY2FsZSApOworCisgICAgLyogQWxsIHR3aWxpZ2h0IHBvaW50cyBhcmUgb3JpZ2luYWxseSB6ZXJvICovCisgICAgZm9yICggaiA9IDA7IGogPCBzaXplLT50d2lsaWdodC5uX3BvaW50czsgaisrICkKKyAgICB7CisgICAgICBzaXplLT50d2lsaWdodC5vcmdbal0ueCA9IDA7CisgICAgICBzaXplLT50d2lsaWdodC5vcmdbal0ueSA9IDA7CisgICAgICBzaXplLT50d2lsaWdodC5jdXJbal0ueCA9IDA7CisgICAgICBzaXplLT50d2lsaWdodC5jdXJbal0ueSA9IDA7CisgICAgfQorCisgICAgLyogY2xlYXIgc3RvcmFnZSBhcmVhICovCisgICAgZm9yICggaSA9IDA7IGkgPCBzaXplLT5zdG9yYWdlX3NpemU7IGkrKyApCisgICAgICBzaXplLT5zdG9yYWdlW2ldID0gMDsKKworICAgIHNpemUtPkdTID0gdHRfZGVmYXVsdF9ncmFwaGljc19zdGF0ZTsKKworICAgIC8qIGdldCBleGVjdXRpb24gY29udGV4dCBhbmQgcnVuIHByZXAgcHJvZ3JhbSAqLworICAgIGlmICggc2l6ZS0+ZGVidWcgKQorICAgICAgZXhlYyA9IHNpemUtPmNvbnRleHQ7CisgICAgZWxzZQorICAgICAgZXhlYyA9IFRUX05ld19Db250ZXh0KCBmYWNlICk7CisgICAgLyogZGVidWdnaW5nIGluc3RhbmNlcyBoYXZlIHRoZWlyIG93biBjb250ZXh0ICovCisKKyAgICBpZiAoICFleGVjICkKKyAgICAgIHJldHVybiBUVF9FcnJfQ291bGRfTm90X0ZpbmRfQ29udGV4dDsKKworICAgIFRUX0xvYWRfQ29udGV4dCggZXhlYywgZmFjZSwgc2l6ZSApOworCisgICAgVFRfU2V0X0NvZGVSYW5nZSggZXhlYywKKyAgICAgICAgICAgICAgICAgICAgICB0dF9jb2RlcmFuZ2VfY3Z0LAorICAgICAgICAgICAgICAgICAgICAgIGZhY2UtPmN2dF9wcm9ncmFtLAorICAgICAgICAgICAgICAgICAgICAgIGZhY2UtPmN2dF9wcm9ncmFtX3NpemUgKTsKKworICAgIFRUX0NsZWFyX0NvZGVSYW5nZSggZXhlYywgdHRfY29kZXJhbmdlX2dseXBoICk7CisKKyAgICBleGVjLT5pbnN0cnVjdGlvbl90cmFwID0gRkFMU0U7CisKKyAgICBleGVjLT50b3AgICAgID0gMDsKKyAgICBleGVjLT5jYWxsVG9wID0gMDsKKworICAgIGlmICggZmFjZS0+Y3Z0X3Byb2dyYW1fc2l6ZSA+IDAgKQorICAgIHsKKyAgICAgIGVycm9yID0gVFRfR290b19Db2RlUmFuZ2UoIGV4ZWMsIHR0X2NvZGVyYW5nZV9jdnQsIDAgKTsKKyAgICAgIGlmICggZXJyb3IgKQorICAgICAgICBnb3RvIEZpbjsKKworICAgICAgaWYgKCAhc2l6ZS0+ZGVidWcgKQorICAgICAgICBlcnJvciA9IGZhY2UtPmludGVycHJldGVyKCBleGVjICk7CisgICAgfQorICAgIGVsc2UKKyAgICAgIGVycm9yID0gVFRfRXJyX09rOworCisgICAgc2l6ZS0+R1MgPSBleGVjLT5HUzsKKyAgICAvKiBzYXZlIGRlZmF1bHQgZ3JhcGhpY3Mgc3RhdGUgKi8KKworICBGaW46CisgICAgVFRfU2F2ZV9Db250ZXh0KCBleGVjLCBzaXplICk7CisKKyAgICBpZiAoICFzaXplLT5kZWJ1ZyApCisgICAgICBUVF9Eb25lX0NvbnRleHQoIGV4ZWMgKTsKKyAgICAvKiBkZWJ1Z2dpbmcgaW5zdGFuY2VzIGtlZXAgdGhlaXIgY29udGV4dCAqLworCisgICAgaWYgKCAhZXJyb3IgKQorICAgICAgc2l6ZS0+dHRtZXRyaWNzLnZhbGlkID0gVFJVRTsKKworICAgIHJldHVybiBlcnJvcjsKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfSW5pdF9HbHlwaFNsb3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhlIFRydWVUeXBlIGdseXBoIHNsb3QgaW5pdGlhbGl6ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgc2xvdCA6OiBUaGUgZ2x5cGggcmVjb3JkIHRvIGJ1aWxkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVHJ1ZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBMT0NBTF9GVU5DCisgIFRUX0Vycm9yICBUVF9Jbml0X0dseXBoU2xvdCggVFRfR2x5cGhTbG90ICBzbG90ICkKKyAgeworICAgIC8qIGFsbG9jYXRlIHRoZSBvdXRsaW5lIHNwYWNlICovCisgICAgRlRfRmFjZSAgICAgZmFjZSAgICA9IHNsb3QtPmZhY2U7CisgICAgRlRfTGlicmFyeSAgbGlicmFyeSA9IGZhY2UtPmRyaXZlci0+bGlicmFyeTsKKworCisgICAgRlRfVFJBQ0U0KCggIlRULkluaXRfR2x5cGhTbG90OiBDcmVhdGluZyBvdXRsaW5lIG1heHAgPSAlZCwgbWF4YyA9ICVkXG4iLAorICAgICAgICAgICAgICAgIGZhY2UtPm1heF9wb2ludHMsIGZhY2UtPm1heF9jb250b3VycyApKTsKKworICAgIHJldHVybiBGVF9OZXdfT3V0bGluZSggbGlicmFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2UtPm1heF9wb2ludHMgKyAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZS0+bWF4X2NvbnRvdXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNsb3QtPm91dGxpbmUgKTsKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfRG9uZV9HbHlwaFNsb3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhlIFRydWVUeXBlIGdseXBoIHNsb3QgZmluYWxpemVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgc2xvdCA6OiBBIGhhbmRsZSB0byB0aGUgZ2x5cGggc2xvdCBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBMT0NBTF9GVU5DCisgIHZvaWQgIFRUX0RvbmVfR2x5cGhTbG90KCBUVF9HbHlwaFNsb3QgIHNsb3QgKQorICB7CisgICAgRlRfTGlicmFyeSAgbGlicmFyeSA9IHNsb3QtPmZhY2UtPmRyaXZlci0+bGlicmFyeTsKKworCisgICAgRlRfRG9uZV9PdXRsaW5lKCBsaWJyYXJ5LCAmc2xvdC0+b3V0bGluZSApOworICAgIHJldHVybjsKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfSW5pdF9Ecml2ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgSW5pdGlhbGl6ZXMgYSBnaXZlbiBUcnVlVHlwZSBkcml2ZXIgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZHJpdmVyIDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZHJpdmVyIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVHJ1ZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBMT0NBTF9GVU5DCisgIFRUX0Vycm9yICBUVF9Jbml0X0RyaXZlciggVFRfRHJpdmVyICBkcml2ZXIgKQorICB7CisgICAgLyogaW5pdCBleHRlbnNpb24gcmVnaXN0cnkgaWYgbmVlZGVkICovCisjaWZkZWYgVFRfQ09ORklHX09QVElPTl9FWFRFTkRfRU5HSU5FCisgICAgcmV0dXJuIFRUX0luaXRfRXh0ZW5zaW9ucyggZHJpdmVyICk7CisjZWxzZQorICAgIFVOVVNFRCggZHJpdmVyICk7CisKKyAgICByZXR1cm4gVFRfRXJyX09rOworI2VuZGlmCisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX0RvbmVfRHJpdmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZpbmFsaXplcyBhIGdpdmVuIFRydWVUeXBlIGRyaXZlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGRyaXZlciA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IFRydWVUeXBlIGRyaXZlci4gICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgTE9DQUxfRlVOQworICB2b2lkICBUVF9Eb25lX0RyaXZlciggVFRfRHJpdmVyICBkcml2ZXIgKQorICB7CisgICAgLyogZGVzdHJveSBleHRlbnNpb25zIHJlZ2lzdHJ5IGlmIG5lZWRlZCAqLworI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fRVhURU5EX0VOR0lORQorICAgIFRUX0RvbmVfRXh0ZW5zaW9ucyggZHJpdmVyICk7CisjZW5kaWYKKworICAgIC8qIGRlc3Ryb3kgdGhlIGV4ZWN1dGlvbiBjb250ZXh0ICovCisgICAgaWYgKCBkcml2ZXItPmNvbnRleHQgKQorICAgIHsKKyAgICAgIFRUX0Rlc3Ryb3lfQ29udGV4dCggZHJpdmVyLT5jb250ZXh0LCBkcml2ZXItPnJvb3QubWVtb3J5ICk7CisgICAgICBkcml2ZXItPmNvbnRleHQgPSBOVUxMOworICAgIH0KKyAgfQorCisKKy8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3RydWV0eXBlL3R0b2Jqcy5oIGIvc3JjL3RydWV0eXBlL3R0b2Jqcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0YmVmYjUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdHJ1ZXR5cGUvdHRvYmpzLmgKQEAgLTAsMCArMSw1OTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHR0b2Jqcy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPYmplY3RzIG1hbmFnZXIgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMTk5Ni0xOTk5IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQgICAgICAgICovCisvKiAgbW9kaWZpZWQgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICAqLworLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KKy8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCisvKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2lmbmRlZiBUVE9CSlNfSAorI2RlZmluZSBUVE9CSlNfSAorCisKKyNpbmNsdWRlIDxmdG9ianMuaD4KKyNpbmNsdWRlIDx0dHR5cGVzLmg+CisjaW5jbHVkZSA8dHRjb25maWcuaD4KKyNpbmNsdWRlIDx0dGVycm9ycy5oPgorCisKKyNpZmRlZiBfX2NwbHVzcGx1cworICBleHRlcm4gIkMiIHsKKyNlbmRpZgorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfRHJpdmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSBoYW5kbGUgdG8gYSBUcnVlVHlwZSBkcml2ZXIgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHN0cnVjdCBUVF9Ecml2ZXJSZWNfKiAgVFRfRHJpdmVyOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSBoYW5kbGUgdG8gYSBUcnVlVHlwZSBzaXplIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHN0cnVjdCBUVF9TaXplUmVjXyogIFRUX1NpemU7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUVF9HbHlwaFNsb3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBIGhhbmRsZSB0byBhIFRydWVUeXBlIGdseXBoIHNsb3Qgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGlzIGlzIGEgZGlyZWN0IHR5cGVkZWYgb2YgRlRfR2x5cGhTbG90LCBhcyB0aGVyZSBpcyBub3RoaW5nICAgICAgKi8KKyAgLyogICAgc3BlY2lmaWMgYWJvdXQgdGhlIFRydWVUeXBlIGdseXBoIHNsb3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIEZUX0dseXBoU2xvdCAgVFRfR2x5cGhTbG90OworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfR3JhcGhpY3NTdGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhlIFRydWVUeXBlIGdyYXBoaWNzIHN0YXRlIHVzZWQgZHVyaW5nIGJ5dGVjb2RlIGludGVycHJldGF0aW9uLiAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHN0cnVjdCAgVFRfR3JhcGhpY3NTdGF0ZV8KKyAgeworICAgIFRUX1VTaG9ydCAgICAgIHJwMDsKKyAgICBUVF9VU2hvcnQgICAgICBycDE7CisgICAgVFRfVVNob3J0ICAgICAgcnAyOworCisgICAgVFRfVW5pdFZlY3RvciAgZHVhbFZlY3RvcjsKKyAgICBUVF9Vbml0VmVjdG9yICBwcm9qVmVjdG9yOworICAgIFRUX1VuaXRWZWN0b3IgIGZyZWVWZWN0b3I7CisKKyAgICBUVF9Mb25nICAgICAgICBsb29wOworICAgIFRUX0YyNkRvdDYgICAgIG1pbmltdW1fZGlzdGFuY2U7CisgICAgVFRfSW50ICAgICAgICAgcm91bmRfc3RhdGU7CisKKyAgICBUVF9Cb29sICAgICAgICBhdXRvX2ZsaXA7CisgICAgVFRfRjI2RG90NiAgICAgY29udHJvbF92YWx1ZV9jdXRpbjsKKyAgICBUVF9GMjZEb3Q2ICAgICBzaW5nbGVfd2lkdGhfY3V0aW47CisgICAgVFRfRjI2RG90NiAgICAgc2luZ2xlX3dpZHRoX3ZhbHVlOworICAgIFRUX1Nob3J0ICAgICAgIGRlbHRhX2Jhc2U7CisgICAgVFRfU2hvcnQgICAgICAgZGVsdGFfc2hpZnQ7CisKKyAgICBUVF9CeXRlICAgICAgICBpbnN0cnVjdF9jb250cm9sOworICAgIFRUX0Jvb2wgICAgICAgIHNjYW5fY29udHJvbDsKKyAgICBUVF9JbnQgICAgICAgICBzY2FuX3R5cGU7CisKKyAgICBUVF9VU2hvcnQgICAgICBnZXAwOworICAgIFRUX1VTaG9ydCAgICAgIGdlcDE7CisgICAgVFRfVVNob3J0ICAgICAgZ2VwMjsKKworICB9IFRUX0dyYXBoaWNzU3RhdGU7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICBFWEVDVVRJT04gU1VCVEFCTEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogIFRoZXNlIHN1Yi10YWJsZXMgcmVsYXRlIHRvIGluc3RydWN0aW9uIGV4ZWN1dGlvbi4gICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjZGVmaW5lIFRUX01BWF9DT0RFX1JBTkdFUyAgMworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBUaGVyZSBjYW4gb25seSBiZSAzIGFjdGl2ZSBjb2RlIHJhbmdlcyBhdCBvbmNlOiAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAtIHRoZSBGb250IFByb2dyYW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgLSB0aGUgQ1ZUIFByb2dyYW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIC0gYSBnbHlwaCdzIGluc3RydWN0aW9ucyBzZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgZW51bSAgVFRfQ29kZVJhbmdlX1RhZ18KKyAgeworICAgIHR0X2NvZGVyYW5nZV9ub25lID0gMCwKKyAgICB0dF9jb2RlcmFuZ2VfZm9udCwKKyAgICB0dF9jb2RlcmFuZ2VfY3Z0LAorICAgIHR0X2NvZGVyYW5nZV9nbHlwaAorCisgIH0gVFRfQ29kZVJhbmdlX1RhZzsKKworCisgIHR5cGVkZWYgc3RydWN0ICBUVF9Db2RlUmFuZ2VfCisgIHsKKyAgICBUVF9CeXRlKiAgYmFzZTsKKyAgICBUVF9VTG9uZyAgc2l6ZTsKKworICB9IFRUX0NvZGVSYW5nZTsKKworICB0eXBlZGVmIFRUX0NvZGVSYW5nZSAgVFRfQ29kZVJhbmdlVGFibGVbVFRfTUFYX0NPREVfUkFOR0VTXTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogRGVmaW5lcyBhIGZ1bmN0aW9uL2luc3RydWN0aW9uIGRlZmluaXRpb24gcmVjb3JkLiAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHN0cnVjdCAgVFRfRGVmUmVjb3JkXworICB7CisgICAgVFRfSW50ICAgcmFuZ2U7ICAgICAgLyogaW4gd2hpY2ggY29kZSByYW5nZSBpcyBpdCBsb2NhdGVkPyAqLworICAgIFRUX0xvbmcgIHN0YXJ0OyAgICAgIC8qIHdoZXJlIGRvZXMgaXQgc3RhcnQ/ICAgICAgICAgICAgICAgKi8KKyAgICBUVF9VSW50ICBvcGM7ICAgICAgICAvKiBmdW5jdGlvbiAjLCBvciBpbnN0cnVjdGlvbiBjb2RlICAgICovCisgICAgVFRfQm9vbCAgYWN0aXZlOyAgICAgLyogaXMgaXQgYWN0aXZlPyAgICAgICAgICAgICAgICAgICAgICAqLworCisgIH0gVFRfRGVmUmVjb3JkLCAqVFRfRGVmQXJyYXk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFRoaXMgdHlwZSBkZWZpbmluZyBhIHNldCBvZiBnbHlwaCBwb2ludHMgd2lsbCBiZSB1c2VkIHRvIHJlcHJlc2VudCAgICAqLworICAvKiBlYWNoIHpvbmUgKHJlZ3VsYXIgYW5kIHR3aWxpZ2h0KSBkdXJpbmcgaW5zdHJ1Y3Rpb25zIGRlY29kaW5nLiAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgc3RydWN0ICBUVF9HbHlwaFpvbmVfCisgIHsKKyAgICBUVF9VU2hvcnQgICBuX3BvaW50czsgICAvKiBudW1iZXIgb2YgcG9pbnRzIGluIHpvbmUgICAgKi8KKyAgICBUVF9TaG9ydCAgICBuX2NvbnRvdXJzOyAvKiBudW1iZXIgb2YgY29udG91cnMgICAgICAgICAgKi8KKworICAgIFRUX1ZlY3RvciogIG9yZzsgICAgICAgIC8qIG9yaWdpbmFsIHBvaW50IGNvb3JkaW5hdGVzICAqLworICAgIFRUX1ZlY3RvciogIGN1cjsgICAgICAgIC8qIGN1cnJlbnQgcG9pbnQgY29vcmRpbmF0ZXMgICAqLworCisgICAgVFRfQnl0ZSogICAgdG91Y2g7ICAgICAgLyogY3VycmVudCB0b3VjaCBmbGFncyAgICAgICAgICovCisgICAgVFRfVVNob3J0KiAgY29udG91cnM7ICAgLyogY29udG91ciBlbmQgcG9pbnRzICAgICAgICAgICovCisKKyAgfSBUVF9HbHlwaFpvbmU7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFN1YmdseXBoIHRyYW5zZm9ybWF0aW9uIHJlY29yZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBzdHJ1Y3QgIFRUX1RyYW5zZm9ybV8KKyAgeworICAgIFRUX0ZpeGVkICAgIHh4LCB4eTsgICAgIC8qIHRyYW5zZm9ybWF0aW9uIG1hdHJpeCBjb2VmZmljaWVudHMgKi8KKyAgICBUVF9GaXhlZCAgICB5eCwgeXk7CisgICAgVFRfRjI2RG90NiAgb3gsIG95OyAgICAgLyogb2Zmc2V0cyAgICAgICAgKi8KKworICB9IFRUX1RyYW5zZm9ybTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogU3ViZ2x5cGggbG9hZGluZyByZWNvcmQuICBVc2VkIHRvIGxvYWQgY29tcG9zaXRlIGNvbXBvbmVudHMuICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHN0cnVjdCAgVFRfU3ViZ2x5cGhSZWNfCisgIHsKKyAgICBUVF9Mb25nICAgICAgIGluZGV4OyAgICAgICAgLyogc3ViZ2x5cGggaW5kZXg7IGluaXRpYWxpemVkIHdpdGggLTEgKi8KKyAgICBUVF9Cb29sICAgICAgIGlzX3NjYWxlZDsgICAgLyogaXMgdGhlIHN1YmdseXBoIHNjYWxlZD8gICAgICAgICAgICAgKi8KKyAgICBUVF9Cb29sICAgICAgIGlzX2hpbnRlZDsgICAgLyogc2hvdWxkIGl0IGJlIGhpbnRlZD8gICAgICAgICAgICAgICAgKi8KKyAgICBUVF9Cb29sICAgICAgIHByZXNlcnZlX3BwczsgLyogcHJlc2VydmUgcGhhbnRvbSBwb2ludHM/ICAgICAgICAgICAgKi8KKworICAgIFRUX0xvbmcgICAgICAgZmlsZV9vZmZzZXQ7CisKKyAgICBUVF9CQm94ICAgICAgIGJib3g7CisgICAgVFRfUG9zICAgICAgICBsZWZ0X2JlYXJpbmc7CisgICAgVFRfUG9zICAgICAgICBhZHZhbmNlOworCisgICAgVFRfR2x5cGhab25lICB6b25lOworCisgICAgVFRfTG9uZyAgICAgICBhcmcxOyAgICAgICAgIC8qIGZpcnN0IGFyZ3VtZW50ICAgICAgICAgICAgICAgICAgICAgICovCisgICAgVFRfTG9uZyAgICAgICBhcmcyOyAgICAgICAgIC8qIHNlY29uZCBhcmd1bWVudCAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICBUVF9VU2hvcnQgICAgIGVsZW1lbnRfZmxhZzsgLyogY3VycmVudCBsb2FkIGVsZW1lbnQgZmxhZyAgICAgICAgICAgKi8KKworICAgIFRUX1RyYW5zZm9ybSAgdHJhbnNmb3JtOyAgICAvKiB0cmFuc2Zvcm1hdGlvbiBtYXRyaXggICAgICAgICAgICAgICAqLworCisgICAgVFRfVmVjdG9yICAgICBwcDEsIHBwMjsgICAgIC8qIHBoYW50b20gcG9pbnRzICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgfSBUVF9TdWJHbHlwaFJlYywgKlRUX1N1YkdseXBoX1N0YWNrOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBBIG5vdGUgcmVnYXJkaW5nIG5vbi1zcXVhcmVkIHBpeGVsczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIChUaGlzIHRleHQgd2lsbCBwcm9iYWJseSBnbyBpbnRvIHNvbWUgZG9jcyBhdCBzb21lIHRpbWUsIGZvciBub3csIGl0ICAqLworICAvKiAgaXMga2VwdCBoZXJlIHRvIGV4cGxhaW4gc29tZSBkZWZpbml0aW9ucyBpbiB0aGUgVEluc19NZXRyaWNzICAgICAgICAgKi8KKyAgLyogIHJlY29yZCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBUaGUgQ1ZUIGlzIGEgb25lLWRpbWVuc2lvbmFsIGFycmF5IGNvbnRhaW5pbmcgdmFsdWVzIHRoYXQgY29udHJvbCAgICAgKi8KKyAgLyogY2VydGFpbiBpbXBvcnRhbnQgY2hhcmFjdGVyaXN0aWNzIGluIGEgZm9udCwgbGlrZSB0aGUgaGVpZ2h0IG9mIGFsbCAgICovCisgIC8qIGNhcGl0YWxzLCBhbGwgbG93ZXJjYXNlIGxldHRlciwgZGVmYXVsdCBzcGFjaW5nIG9yIHN0ZW0gd2lkdGgvaGVpZ2h0LiAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogVGhlc2UgdmFsdWVzIGFyZSBmb3VuZCBpbiBGVW5pdHMgaW4gdGhlIGZvbnQgZmlsZSwgYW5kIG11c3QgYmUgc2NhbGVkICovCisgIC8qIHRvIHBpeGVsIGNvb3JkaW5hdGVzIGJlZm9yZSBiZWluZyB1c2VkIGJ5IHRoZSBDVlQgYW5kIGdseXBoIHByb2dyYW1zLiAqLworICAvKiBVbmZvcnR1bmF0ZWx5LCB3aGVuIHVzaW5nIGRpc3RpbmN0IHggYW5kIHkgcmVzb2x1dGlvbnMgKG9yIGRpc3RpbmN0IHggKi8KKyAgLyogYW5kIHkgcG9pbnRzaXplcyksIHRoZXJlIGFyZSB0d28gcG9zc2libGUgc2NhbGluZ3MuICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBBIGZpcnN0IHRyeSB3YXMgdG8gaW1wbGVtZW50IGEgYGxhenknIHNjaGVtZSB3aGVyZSBhbGwgdmFsdWVzIHdlcmUgICAgKi8KKyAgLyogc2NhbGVkIHdoZW4gZmlyc3QgdXNlZC4gIEhvd2V2ZXIsIHdoaWxlIHNvbWUgdmFsdWVzIGFyZSBhbHdheXMgdXNlZCAgICovCisgIC8qIGluIHRoZSBzYW1lIGRpcmVjdGlvbiwgc29tZSBvdGhlcnMgYXJlIHVzZWQgdW5kZXIgbWFueSBkaWZmZXJlbnQgICAgICAqLworICAvKiBjaXJjdW1zdGFuY2VzIGFuZCBvcmllbnRhdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIEkgaGF2ZSBmb3VuZCBhIHNpbXBsZXIgd2F5IHRvIGRvIHRoZSBzYW1lLCBhbmQgaXQgZXZlbiBzZWVtcyB0byB3b3JrICAqLworICAvKiBpbiBtb3N0IG9mIHRoZSBjYXNlczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIC0gQWxsIENWVCB2YWx1ZXMgYXJlIHNjYWxlZCB0byB0aGUgbWF4aW11bSBwcGVtIHNpemUuICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogLSBXaGVuIHBlcmZvcm1pbmcgYSByZWFkIG9yIHdyaXRlIGluIHRoZSBDVlQsIGEgcmF0aW8gZmFjdG9yIGlzIHVzZWQgICovCisgIC8qICAgdG8gcGVyZm9ybSBhZGVxdWF0ZSBzY2FsaW5nLiAgRXhhbXBsZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgIHhfcHBlbSA9IDE0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICB5X3BwZW0gPSAxMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICBXZSBjaG9vc2UgcHBlbSA9IHhfcHBlbSA9IDE0IGFzIHRoZSBDVlQgc2NhbGluZyBzaXplLiAgQWxsIGN2dCAgICAgICovCisgIC8qICAgZW50cmllcyBhcmUgc2NhbGVkIHRvIGl0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgIHhfcmF0aW8gPSAxLjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICB5X3JhdGlvID0geV9wcGVtL3BwZW0gKDwgMS4wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICBXZSBjb21wdXRlIHRoZSBjdXJyZW50IHJhdGlvIGxpa2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIC0gSWYgcHJvalZlY3RvciBpcyBob3Jpem9udGFsLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgcmF0aW8gPSB4X3JhdGlvID0gMS4wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIC0gaWYgcHJvalZlY3RvciBpcyB2ZXJ0aWNhbCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgcmF0aW8gPSB5X3JhdGlvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIC0gZWxzZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgcmF0aW8gPSBzcXJ0KCAocHJvai54ICogeF9yYXRpbykgXiAyICsgKHByb2oueSAqIHlfcmF0aW8pIF4gMiApICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIFJlYWRpbmcgYSBjdnQgdmFsdWUgcmV0dXJucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgIHJhdGlvICogY3Z0W2luZGV4XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIFdyaXRpbmcgYSBjdnQgdmFsdWUgaW4gcGl4ZWxzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgIGN2dFtpbmRleF0gLyByYXRpbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIFRoZSBjdXJyZW50IHBwZW0gaXMgc2ltcGx5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgIHJhdGlvICogcHBlbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogTWV0cmljcyB1c2VkIGJ5IHRoZSBUcnVlVHlwZSBzaXplIGFuZCBjb250ZXh0IG9iamVjdHMuICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHN0cnVjdCAgVFRfU2l6ZV9NZXRyaWNzXworICB7CisgICAgLyogZm9yIG5vbi1zcXVhcmUgcGl4ZWxzICovCisgICAgVFRfTG9uZyAgICAgeF9yYXRpbzsKKyAgICBUVF9Mb25nICAgICB5X3JhdGlvOworCisgICAgVFRfVVNob3J0ICAgcHBlbTsgICAgICAgICAgICAgICAvKiBtYXhpbXVtIHBwZW0gc2l6ZSAgICAgICAgICAgICAgKi8KKyAgICBUVF9Mb25nICAgICByYXRpbzsgICAgICAgICAgICAgIC8qIGN1cnJlbnQgcmF0aW8gICAgICAgICAgICAgICAgICAqLworICAgIFRUX0ZpeGVkICAgIHNjYWxlOworCisgICAgVFRfRjI2RG90NiAgY29tcGVuc2F0aW9uc1s0XTsgICAvKiBkZXZpY2Utc3BlY2lmaWMgY29tcGVuc2F0aW9ucyAgKi8KKworICAgIFRUX0Jvb2wgICAgIHZhbGlkOworCisgICAgVFRfQm9vbCAgICAgcm90YXRlZDsgICAgICAgICAgICAvKiBgaXMgdGhlIGdseXBoIHJvdGF0ZWQ/Jy1mbGFnICAgKi8KKyAgICBUVF9Cb29sICAgICBzdHJldGNoZWQ7ICAgICAgICAgIC8qIGBpcyB0aGUgZ2x5cGggc3RyZXRjaGVkPyctZmxhZyAqLworCisgIH0gVFRfU2l6ZV9NZXRyaWNzOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBGcmVlVHlwZSBleGVjdXRpb24gY29udGV4dCB0eXBlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFRoaXMgaXMgYSBmb3J3YXJkIGRlY2xhcmF0aW9uOyB0aGUgZnVsbCBzcGVjaWZpY2F0aW9uIGlzIGluIHRoZSBmaWxlICAqLworICAvKiBgdHRpbnRlcnAuaCcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgc3RydWN0IFRUX0V4ZWNDb250ZXh0UmVjXyogIFRUX0V4ZWNDb250ZXh0OworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFRydWVUeXBlIHNpemUgY2xhc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHN0cnVjdCAgVFRfU2l6ZVJlY18KKyAgeworICAgIEZUX1NpemVSZWMgICAgICAgICByb290OworCisgICAgVFRfU2l6ZV9NZXRyaWNzICAgIHR0bWV0cmljczsKKworICAgIFRUX1VJbnQgICAgICAgICAgICBudW1fZnVuY3Rpb25fZGVmczsgLyogbnVtYmVyIG9mIGZ1bmN0aW9uIGRlZmluaXRpb25zICovCisgICAgVFRfVUludCAgICAgICAgICAgIG1heF9mdW5jdGlvbl9kZWZzOworICAgIFRUX0RlZkFycmF5ICAgICAgICBmdW5jdGlvbl9kZWZzOyAgICAgLyogdGFibGUgb2YgZnVuY3Rpb24gZGVmaW5pdGlvbnMgICovCisKKyAgICBUVF9VSW50ICAgICAgICAgICAgbnVtX2luc3RydWN0aW9uX2RlZnM7ICAvKiBudW1iZXIgb2YgaW5zLiBkZWZpbml0aW9ucyAqLworICAgIFRUX1VJbnQgICAgICAgICAgICBtYXhfaW5zdHJ1Y3Rpb25fZGVmczsKKyAgICBUVF9EZWZBcnJheSAgICAgICAgaW5zdHJ1Y3Rpb25fZGVmczsgICAgICAvKiB0YWJsZSBvZiBpbnMuIGRlZmluaXRpb25zICAqLworCisgICAgVFRfVUludCAgICAgICAgICAgIG1heF9mdW5jOworICAgIFRUX1VJbnQgICAgICAgICAgICBtYXhfaW5zOworCisgICAgVFRfQ29kZVJhbmdlVGFibGUgIGNvZGVSYW5nZVRhYmxlOworCisgICAgVFRfR3JhcGhpY3NTdGF0ZSAgIEdTOworCisgICAgVFRfVUxvbmcgICAgICAgICAgIGN2dF9zaXplOyAgICAgIC8qIHRoZSBzY2FsZWQgY29udHJvbCB2YWx1ZSB0YWJsZSAqLworICAgIFRUX0xvbmcqICAgICAgICAgICBjdnQ7CisKKyAgICBUVF9VU2hvcnQgICAgICAgICAgc3RvcmFnZV9zaXplOyAvKiBUaGUgc3RvcmFnZSBhcmVhIGlzIG5vdyBwYXJ0IG9mICovCisgICAgVFRfTG9uZyogICAgICAgICAgIHN0b3JhZ2U7ICAgICAgLyogdGhlIGluc3RhbmNlICAgICAgICAgICAgICAgICAgICAqLworCisgICAgVFRfR2x5cGhab25lICAgICAgIHR3aWxpZ2h0OyAgICAgLyogVGhlIGluc3RhbmNlJ3MgdHdpbGlnaHQgem9uZSAgICAqLworCisgICAgLyogZGVidWdnaW5nIHZhcmlhYmxlcyAqLworCisgICAgLyogV2hlbiB1c2luZyB0aGUgZGVidWdnZXIsIHdlIG11c3Qga2VlcCB0aGUgKi8KKyAgICAvKiBleGVjdXRpb24gY29udGV4dCB0aWVkIHRvIHRoZSBpbnN0YW5jZSAgICAqLworICAgIC8qIG9iamVjdCByYXRoZXIgdGhhbiBhc2tpbmcgaXQgb24gZGVtYW5kLiAgICovCisKKyAgICBUVF9Cb29sICAgICAgICAgICAgZGVidWc7CisgICAgVFRfRXhlY0NvbnRleHQgICAgIGNvbnRleHQ7CisKKyAgfSBUVF9TaXplUmVjOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFRydWVUeXBlIGRyaXZlciBjbGFzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHN0cnVjdCAgVFRfRHJpdmVyUmVjXworICB7CisgICAgRlRfRHJpdmVyUmVjICAgIHJvb3Q7CisgICAgVFRfRXhlY0NvbnRleHQgIGNvbnRleHQ7ICAvKiBleGVjdXRpb24gY29udGV4dCAqLworCisgICAgdm9pZCogICAgICAgICAgIGV4dGVuc2lvbl9jb21wb25lbnQ7CisKKyAgfSBUVF9Ecml2ZXJSZWM7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUVF9OZXdfR2x5cGhab25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBbGxvY2F0ZXMgYSBuZXcgZ2x5cGggem9uZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBtZW1vcnkgICAgICA6OiBBIGhhbmRsZSB0byB0aGUgY3VycmVudCBtZW1vcnkgb2JqZWN0LiAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG1heFBvaW50cyAgIDo6IFRoZSBjYXBhY2l0eSBvZiBnbHlwaCB6b25lIGluIHBvaW50cy4gICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbWF4Q29udG91cnMgOjogVGhlIGNhcGFjaXR5IG9mIGdseXBoIHpvbmUgaW4gY29udG91cnMuICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgcHRzICAgICAgICAgOjogQSBwb2ludGVyIHRvIHRoZSB0YXJnZXQgZ2x5cGggem9uZSByZWNvcmQuICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVHJ1ZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworIExPQ0FMX0RFRgorIFRUX0Vycm9yICBUVF9OZXdfR2x5cGhab25lKCBGVF9NZW1vcnkgICAgICBtZW1vcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX0dseXBoWm9uZSogIHB0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfVVNob3J0ICAgICAgbWF4UG9pbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9TaG9ydCAgICAgICBtYXhDb250b3VycyApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfRG9uZV9HbHlwaFpvbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRGVhbGxvY2F0ZXMgYSBnbHlwaCB6b25lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbWVtb3J5IDo6IEEgaGFuZGxlIHRvIHRoZSBjdXJyZW50IG1lbW9yeSBvYmplY3QuICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBwdHMgICAgOjogQSBwb2ludGVyIHRvIHRoZSB0YXJnZXQgZ2x5cGggem9uZSByZWNvcmQuICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUcnVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIExPQ0FMX0ZVTkMKKyAgVFRfRXJyb3IgIFRUX0RvbmVfR2x5cGhab25lKCBGVF9NZW1vcnkgICAgICBtZW1vcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfR2x5cGhab25lKiAgcHRzICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUVF9Jbml0X0ZhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBJbml0aWFsaXplcyBhIGdpdmVuIFRydWVUeXBlIGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICByZXNvdXJjZSAgIDo6IFRoZSBzb3VyY2UgZm9udCByZXNvdXJjZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZmFjZV9pbmRleCA6OiBUaGUgaW5kZXggb2YgdGhlIGZvbnQgZmFjZSBpbiB0aGUgcmVzb3VyY2UuICAgICAgICAgICovCisgIC8qICAgIGZhY2UgICAgICAgOjogVGhlIG5ld2x5IGJ1aWx0IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRydWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgTE9DQUxfREVGCisgIFRUX0Vycm9yICBUVF9Jbml0X0ZhY2UoIEZUX1N0cmVhbSAgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9Mb25nICAgIGZhY2VfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX0ZhY2UgICAgZmFjZSApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfRG9uZV9GYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRmluYWxpemVzIGEgZ2l2ZW4gZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZmFjZSA6OiBUaGUgdGFyZ2V0IGZhY2Ugb2JqZWN0IHRvIGZpbmFsaXplLiAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBMT0NBTF9ERUYKKyAgdm9pZCAgVFRfRG9uZV9GYWNlKCBUVF9GYWNlICBmYWNlICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUVF9Jbml0X1NpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBJbml0aWFsaXplcyBhIG5ldyBUcnVlVHlwZSBzaXplIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzaXplIDo6IEEgaGFuZGxlIHRvIHRoZSBzaXplIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUcnVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIExPQ0FMX0RFRgorICBUVF9FcnJvciAgVFRfSW5pdF9TaXplKCBUVF9TaXplICBzaXplICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUVF9Eb25lX1NpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGUgVHJ1ZVR5cGUgc2l6ZSBvYmplY3QgZmluYWxpemVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzaXplIDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgc2l6ZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIExPQ0FMX0RFRgorICB2b2lkICBUVF9Eb25lX1NpemUoIFRUX1NpemUgIHNpemUgKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX1Jlc2V0X1NpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFJlc2V0cyBhIFRydWVUeXBlIHNpemUgd2hlbiByZXNvbHV0aW9ucyBhbmQgY2hhcmFjdGVyIGRpbWVuc2lvbnMgICAqLworICAvKiAgICBoYXZlIGJlZW4gY2hhbmdlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzaXplIDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgc2l6ZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUcnVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIExPQ0FMX0RFRgorICBUVF9FcnJvciAgVFRfUmVzZXRfU2l6ZSggVFRfU2l6ZSAgc2l6ZSApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfSW5pdF9HbHlwaFNsb3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhlIFRydWVUeXBlIGdseXBoIHNsb3QgaW5pdGlhbGl6ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZ2x5cGggOjogVGhlIGdseXBoIHJlY29yZCB0byBidWlsZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVHJ1ZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBMT0NBTF9ERUYKKyAgVFRfRXJyb3IgIFRUX0luaXRfR2x5cGhTbG90KCBUVF9HbHlwaFNsb3QgIHNsb3QgKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX0RvbmVfR2x5cGhTbG90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoZSBUcnVlVHlwZSBnbHlwaCBzbG90IGZpbmFsaXplci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGdseXBoIDo6IEEgaGFuZGxlIHRvIHRoZSBnbHlwaCBzbG90IG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgTE9DQUxfREVGCisgIHZvaWQgIFRUX0RvbmVfR2x5cGhTbG90KCBUVF9HbHlwaFNsb3QgIHNsb3QgKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX0luaXRfRHJpdmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEluaXRpYWxpemVzIGEgZ2l2ZW4gVHJ1ZVR5cGUgZHJpdmVyIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGRyaXZlciA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGRyaXZlciBvYmplY3QuICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRydWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgTE9DQUxfREVGCisgIFRUX0Vycm9yICBUVF9Jbml0X0RyaXZlciggVFRfRHJpdmVyICBkcml2ZXIgKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX0RvbmVfRHJpdmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZpbmFsaXplcyBhIGdpdmVuIFRydWVUeXBlIGRyaXZlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGRyaXZlciA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IFRydWVUeXBlIGRyaXZlci4gICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgTE9DQUxfREVGCisgIHZvaWQgIFRUX0RvbmVfRHJpdmVyKCBUVF9Ecml2ZXIgIGRyaXZlciApOworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworICB9CisjZW5kaWYKKworCisjZW5kaWYgLyogVFRPQkpTX0ggKi8KKworCisvKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy90cnVldHlwZS90dHBsb2FkLmMgYi9zcmMvdHJ1ZXR5cGUvdHRwbG9hZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiNGE2OTAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdHJ1ZXR5cGUvdHRwbG9hZC5jCkBAIC0wLDAgKzEsMjYwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICB0dHBsb2FkLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgVHJ1ZVR5cGUgZ2x5cGggZGF0YS9wcm9ncmFtIHRhYmxlcyBsb2FkZXIgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDE5OTYtMTk5OSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkICAgICAgICAqLworLyogIG1vZGlmaWVkIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAgKi8KKy8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCisvKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLworLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNpbmNsdWRlIDxmdGRlYnVnLmg+CisjaW5jbHVkZSA8ZnRvYmpzLmg+CisjaW5jbHVkZSA8ZnRzdHJlYW0uaD4KKworI2luY2x1ZGUgPHR0cGxvYWQuaD4KKyNpbmNsdWRlIDx0dHRhZ3MuaD4KKyNpbmNsdWRlIDx0dGVycm9ycy5oPgorCisjdW5kZWYgIEZUX0NPTVBPTkVOVAorI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX3R0bG9hZAorCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX0xvYWRfTG9jYXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIExvYWRzIHRoZSBsb2NhdGlvbnMgdGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZhY2UgICA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzdHJlYW0gOjogVGhlIGlucHV0IHN0cmVhbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUcnVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIExPQ0FMX0ZVTkMKKyAgVFRfRXJyb3IgIFRUX0xvYWRfTG9jYXRpb25zKCBUVF9GYWNlICAgIGZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICBzdHJlYW0gKQorICB7CisgICAgVFRfRXJyb3IgICBlcnJvcjsKKyAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IHN0cmVhbS0+bWVtb3J5OworICAgIFRUX1Nob3J0ICAgTG9uZ09mZnNldHM7CisgICAgVFRfVUxvbmcgICB0YWJsZV9sZW47CisKKyAgICBGVF9UUkFDRTIoKCAiTG9jYXRpb25zICIgKSk7CisgICAgTG9uZ09mZnNldHMgPSBmYWNlLT5oZWFkZXIuSW5kZXhfVG9fTG9jX0Zvcm1hdDsKKworICAgIGVycm9yID0gZmFjZS0+Z290b190YWJsZSggZmFjZSwgVFRBR19sb2NhLCBzdHJlYW0sICZ0YWJsZV9sZW4gKTsKKyAgICBpZiAoZXJyb3IpCisgICAgeworICAgICAgZXJyb3IgPSBUVF9FcnJfTG9jYXRpb25zX01pc3Npbmc7CisgICAgICBnb3RvIEV4aXQ7CisgICAgfQorCisgICAgaWYgKCBMb25nT2Zmc2V0cyAhPSAwICkKKyAgICB7CisgICAgICBmYWNlLT5udW1fbG9jYXRpb25zID0gKFRUX1VTaG9ydCkodGFibGVfbGVuID4+IDIpOworCisgICAgICBGVF9UUkFDRTIoKCAiKDMyIGJpdHMgb2Zmc2V0cyk6ICUxMmQgIiwgZmFjZS0+bnVtX2xvY2F0aW9ucyApKTsKKworICAgICAgaWYgKCBBTExPQ19BUlJBWSggZmFjZS0+Z2x5cGhfbG9jYXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgZmFjZS0+bnVtX2xvY2F0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgIFRUX0xvbmcgKSApCisgICAgICAgIGdvdG8gRXhpdDsKKworICAgICAgaWYgKCBBQ0NFU1NfRnJhbWUoIGZhY2UtPm51bV9sb2NhdGlvbnMgKiA0TCApICkKKyAgICAgICAgZ290byBFeGl0OworCisgICAgICB7CisgICAgICAgIFRUX0xvbmcqICBsb2MgICA9IGZhY2UtPmdseXBoX2xvY2F0aW9uczsKKyAgICAgICAgVFRfTG9uZyogIGxpbWl0ID0gbG9jICsgZmFjZS0+bnVtX2xvY2F0aW9uczsKKworICAgICAgICBmb3IgKCA7IGxvYyA8IGxpbWl0OyBsb2MrKyApCisgICAgICAgICAgKmxvYyA9IEdFVF9Mb25nKCk7CisgICAgICB9CisKKyAgICAgIEZPUkdFVF9GcmFtZSgpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgZmFjZS0+bnVtX2xvY2F0aW9ucyA9IChUVF9VU2hvcnQpKHRhYmxlX2xlbiA+PiAxKTsKKworICAgICAgRlRfVFJBQ0UyKCggIigxNiBiaXRzIG9mZnNldHMpOiAlMTJkICIsCisgICAgICAgICAgICAgICAgICAgZmFjZS0+bnVtX2xvY2F0aW9ucyApKTsKKworICAgICAgaWYgKCBBTExPQ19BUlJBWSggZmFjZS0+Z2x5cGhfbG9jYXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgZmFjZS0+bnVtX2xvY2F0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgIFRUX0xvbmcgKSApCisgICAgICAgIGdvdG8gRXhpdDsKKworICAgICAgaWYgKCBBQ0NFU1NfRnJhbWUoIGZhY2UtPm51bV9sb2NhdGlvbnMgKiAyTCApICkKKyAgICAgICAgZ290byBFeGl0OworICAgICAgeworICAgICAgICBUVF9Mb25nKiAgbG9jICAgPSBmYWNlLT5nbHlwaF9sb2NhdGlvbnM7CisgICAgICAgIFRUX0xvbmcqICBsaW1pdCA9IGxvYyArIGZhY2UtPm51bV9sb2NhdGlvbnM7CisKKyAgICAgICAgZm9yICggOyBsb2MgPCBsaW1pdDsgbG9jKysgKQorICAgICAgICAgICpsb2MgPSAoVFRfTG9uZykoKFRUX1VMb25nKUdFVF9VU2hvcnQoKSAqIDIpOworICAgICAgfQorICAgICAgRk9SR0VUX0ZyYW1lKCk7CisgICAgfQorCisgICAgRlRfVFJBQ0UyKCggImxvYWRlZFxuIiApKTsKKworICBFeGl0OgorICAgIHJldHVybiBlcnJvcjsKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfTG9hZF9DVlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgTG9hZHMgdGhlIGNvbnRyb2wgdmFsdWUgdGFibGUgaW50byBhIGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZmFjZSAgIDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHN0cmVhbSA6OiBBIGhhbmRsZSB0byB0aGUgaW5wdXQgc3RyZWFtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRydWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgTE9DQUxfRlVOQworICBUVF9FcnJvciAgVFRfTG9hZF9DVlQoIFRUX0ZhY2UgICAgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gIHN0cmVhbSApCisgIHsKKyAgICBUVF9FcnJvciAgIGVycm9yOworICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gc3RyZWFtLT5tZW1vcnk7CisgICAgVFRfVUxvbmcgICB0YWJsZV9sZW47CisKKyAgICBGVF9UUkFDRTIoKCAiQ1ZUICIgKSk7CisKKyAgICBlcnJvciA9IGZhY2UtPmdvdG9fdGFibGUoIGZhY2UsIFRUQUdfY3Z0LCBzdHJlYW0sICZ0YWJsZV9sZW4gKTsKKyAgICBpZiAoZXJyb3IpCisgICAgeworICAgICAgRlRfVFJBQ0UyKCggImlzIG1pc3NpbmchXG4iICkpOworCisgICAgICBmYWNlLT5jdnRfc2l6ZSA9IDA7CisgICAgICBmYWNlLT5jdnQgICAgICA9IE5VTEw7CisgICAgICBlcnJvciAgICAgICAgICA9IFRUX0Vycl9PazsKKworICAgICAgZ290byBFeGl0OworICAgIH0KKworICAgIGZhY2UtPmN2dF9zaXplID0gdGFibGVfbGVuIC8gMjsKKworICAgIGlmICggQUxMT0NfQVJSQVkoIGZhY2UtPmN2dCwKKyAgICAgICAgICAgICAgICAgICAgICBmYWNlLT5jdnRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICBUVF9TaG9ydCApICkKKyAgICAgIGdvdG8gRXhpdDsKKworICAgIGlmICggQUNDRVNTX0ZyYW1lKCBmYWNlLT5jdnRfc2l6ZSAqIDJMICkgKQorICAgICAgZ290byBFeGl0OworCisgICAgeworICAgICAgVFRfU2hvcnQqICBjdXIgICA9IGZhY2UtPmN2dDsKKyAgICAgIFRUX1Nob3J0KiAgbGltaXQgPSBjdXIgKyBmYWNlLT5jdnRfc2l6ZTsKKworICAgICAgZm9yICggOyBjdXIgPCAgbGltaXQ7IGN1cisrICkKKyAgICAgICAgKmN1ciA9IEdFVF9TaG9ydCgpOworICAgIH0KKworICAgIEZPUkdFVF9GcmFtZSgpOworICAgIEZUX1RSQUNFMigoICJsb2FkZWRcbiIgKSk7CisKKyAgRXhpdDoKKyAgICByZXR1cm4gZXJyb3I7CisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX0xvYWRfUHJvZ2FtcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIExvYWRzIHRoZSBmb250IHByb2dyYW0gYW5kIHRoZSBjdnQgcHJvZ3JhbS4gICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZhY2UgICA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzdHJlYW0gOjogQSBoYW5kbGUgdG8gdGhlIGlucHV0IHN0cmVhbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUcnVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIExPQ0FMX0ZVTkMKKyAgVFRfRXJyb3IgIFRUX0xvYWRfUHJvZ3JhbXMoIFRUX0ZhY2UgICAgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgc3RyZWFtICkKKyAgeworICAgIFRUX0Vycm9yICAgZXJyb3I7CisgICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBzdHJlYW0tPm1lbW9yeTsKKyAgICBUVF9VTG9uZyAgIHRhYmxlX2xlbjsKKworICAgIEZUX1RSQUNFMigoICJGb250IHByb2dyYW0gIiApKTsKKworICAgIGVycm9yID0gVFRfRXJyX09rOworCisgICAgLyogVGhlIGZvbnQgcHJvZ3JhbSBpcyBvcHRpb25hbCAqLworICAgIGVycm9yID0gZmFjZS0+Z290b190YWJsZSggZmFjZSwgVFRBR19mcGdtLCBzdHJlYW0sICZ0YWJsZV9sZW4gKTsKKyAgICBpZiAoZXJyb3IpCisgICAgeworICAgICAgZmFjZS0+Zm9udF9wcm9ncmFtICAgICAgPSBOVUxMOworICAgICAgZmFjZS0+Zm9udF9wcm9ncmFtX3NpemUgPSAwOworICAgICAgRlRfVFJBQ0UyKCggImlzIG1pc3NpbmchXG4iICkpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgZmFjZS0+Zm9udF9wcm9ncmFtX3NpemUgPSB0YWJsZV9sZW47CisKKyAgICAgIGlmICggQUxMT0MoIGZhY2UtPmZvbnRfcHJvZ3JhbSwKKyAgICAgICAgICAgICAgICAgIGZhY2UtPmZvbnRfcHJvZ3JhbV9zaXplICkgfHwKKworICAgICAgICAgICBGSUxFX1JlYWQoICh2b2lkKilmYWNlLT5mb250X3Byb2dyYW0sCisgICAgICAgICAgICAgICAgICAgICAgZmFjZS0+Zm9udF9wcm9ncmFtX3NpemUgKSAgICkKKyAgICAgICAgZ290byBFeGl0OworCisgICAgICBGVF9UUkFDRTIoKCAibG9hZGVkLCAlMTJkIGJ5dGVzXG4iLCBmYWNlLT5mb250X3Byb2dyYW1fc2l6ZSApKTsKKyAgICB9CisKKyAgICBGVF9UUkFDRTIoKCAiUHJlcCBwcm9ncmFtICIgKSk7CisKKyAgICBlcnJvciA9IGZhY2UtPmdvdG9fdGFibGUoIGZhY2UsIFRUQUdfcHJlcCwgc3RyZWFtLCAmdGFibGVfbGVuICk7CisgICAgaWYgKGVycm9yKQorICAgIHsKKyAgICAgIGZhY2UtPmN2dF9wcm9ncmFtICAgICAgPSBOVUxMOworICAgICAgZmFjZS0+Y3Z0X3Byb2dyYW1fc2l6ZSA9IDA7CisKKyAgICAgIEZUX1RSQUNFMigoICJpcyBtaXNzaW5nIVxuIiApKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGZhY2UtPmN2dF9wcm9ncmFtX3NpemUgPSB0YWJsZV9sZW47CisKKyAgICAgIGlmICggQUxMT0MoIGZhY2UtPmN2dF9wcm9ncmFtLAorICAgICAgICAgICAgICAgICAgZmFjZS0+Y3Z0X3Byb2dyYW1fc2l6ZSApICAgICAgICAgICB8fAorCisgICAgICAgICAgIEZJTEVfUmVhZCggKHZvaWQqKWZhY2UtPmN2dF9wcm9ncmFtLAorICAgICAgICAgICAgICAgICAgICAgIGZhY2UtPmN2dF9wcm9ncmFtX3NpemUgKSApCisgICAgICAgIHJldHVybiBlcnJvcjsKKworICAgICAgRlRfVFJBQ0UyKCggImxvYWRlZCwgJTEyZCBieXRlc1xuIiwgZmFjZS0+Y3Z0X3Byb2dyYW1fc2l6ZSApKTsKKyAgICB9CisKKyAgRXhpdDoKKyAgICByZXR1cm4gZXJyb3I7CisgIH0KKworCisvKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy90cnVldHlwZS90dHBsb2FkLmggYi9zcmMvdHJ1ZXR5cGUvdHRwbG9hZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiN2M1MTcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdHJ1ZXR5cGUvdHRwbG9hZC5oCkBAIC0wLDAgKzEsOTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHR0cGxvYWQuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBUcnVlVHlwZSBnbHlwaCBkYXRhL3Byb2dyYW0gdGFibGVzIGxvYWRlciAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMTk5Ni0xOTk5IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQgICAgICAgICovCisvKiAgbW9kaWZpZWQgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICAqLworLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KKy8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCisvKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2lmbmRlZiBUVFBMT0FEX0gKKyNkZWZpbmUgVFRQTE9BRF9ICisKKyNpbmNsdWRlIDx0dHR5cGVzLmg+CisKKworI2lmZGVmIF9fY3BsdXNwbHVzCisgIGV4dGVybiAiQyIgeworI2VuZGlmCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUVF9Mb2FkX0xvY2F0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBMb2FkcyB0aGUgbG9jYXRpb25zIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBmYWNlICAgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgc3RyZWFtIDo6IFRoZSBpbnB1dCBzdHJlYW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVHJ1ZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBMT0NBTF9ERUYKKyAgVFRfRXJyb3IgIFRUX0xvYWRfTG9jYXRpb25zKCBUVF9GYWNlICAgIGZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICBzdHJlYW0gKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX0xvYWRfQ1ZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIExvYWRzIHRoZSBjb250cm9sIHZhbHVlIHRhYmxlIGludG8gYSBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZhY2UgICA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzdHJlYW0gOjogQSBoYW5kbGUgdG8gdGhlIGlucHV0IHN0cmVhbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUcnVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIExPQ0FMX0RFRgorICBUVF9FcnJvciAgVFRfTG9hZF9DVlQoIFRUX0ZhY2UgICAgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gIHN0cmVhbSApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfTG9hZF9Qcm9nYW1zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgTG9hZHMgdGhlIGZvbnQgcHJvZ3JhbSBhbmQgdGhlIGN2dCBwcm9ncmFtLiAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZmFjZSAgIDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHN0cmVhbSA6OiBBIGhhbmRsZSB0byB0aGUgaW5wdXQgc3RyZWFtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRydWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgTE9DQUxfREVGCisgIFRUX0Vycm9yICBUVF9Mb2FkX1Byb2dyYW1zKCBUVF9GYWNlICAgIGZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gIHN0cmVhbSApOworCisjZW5kaWYgLyogVFRQTE9BRF9IICovCisKKworLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvdHJ1ZXR5cGUvdHR0YWdzLmggYi9zcmMvdHJ1ZXR5cGUvdHR0YWdzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNiYmZjMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90cnVldHlwZS90dHRhZ3MuaApAQCAtMCwwICsxLDYwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICB0dHRhZ3MuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgVGFncyBmb3IgVHJ1ZVR5cGUgdGFibGVzIChzcGVjaWZpY2F0aW9uIG9ubHkpLiAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDE5OTYtMTk5OSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkICAgICAgICAqLworLyogIG1vZGlmaWVkIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAgKi8KKy8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgICovCisvKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLworLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNpZm5kZWYgVFRBR1NfSAorI2RlZmluZSBUVEFHU19ICisKKworI2luY2x1ZGUgPGZyZWV0eXBlLmg+ICAgLyogZm9yIE1BS0VfVFRfVEFHKCkgKi8KKworCisjZGVmaW5lIFRUQUdfY21hcCAgRlRfTUFLRV9UQUcoICdjJywgJ20nLCAnYScsICdwJyApCisjZGVmaW5lIFRUQUdfY3Z0ICAgRlRfTUFLRV9UQUcoICdjJywgJ3YnLCAndCcsICcgJyApCisjZGVmaW5lIFRUQUdfRUJEVCAgRlRfTUFLRV9UQUcoICdFJywgJ0InLCAnRCcsICdUJyApCisjZGVmaW5lIFRUQUdfRUJMQyAgRlRfTUFLRV9UQUcoICdFJywgJ0InLCAnTCcsICdDJyApCisjZGVmaW5lIFRUQUdfRUJTQyAgRlRfTUFLRV9UQUcoICdFJywgJ0InLCAnUycsICdDJyApCisjZGVmaW5lIFRUQUdfZnBnbSAgRlRfTUFLRV9UQUcoICdmJywgJ3AnLCAnZycsICdtJyApCisjZGVmaW5lIFRUQUdfZ2FzcCAgRlRfTUFLRV9UQUcoICdnJywgJ2EnLCAncycsICdwJyApCisjZGVmaW5lIFRUQUdfZ2x5ZiAgRlRfTUFLRV9UQUcoICdnJywgJ2wnLCAneScsICdmJyApCisjZGVmaW5lIFRUQUdfR1NVQiAgRlRfTUFLRV9UQUcoICdHJywgJ1MnLCAnVScsICdCJyApCisjZGVmaW5lIFRUQUdfaGRteCAgRlRfTUFLRV9UQUcoICdoJywgJ2QnLCAnbScsICd4JyApCisjZGVmaW5lIFRUQUdfaGVhZCAgRlRfTUFLRV9UQUcoICdoJywgJ2UnLCAnYScsICdkJyApCisjZGVmaW5lIFRUQUdfaGhlYSAgRlRfTUFLRV9UQUcoICdoJywgJ2gnLCAnZScsICdhJyApCisjZGVmaW5lIFRUQUdfaG10eCAgRlRfTUFLRV9UQUcoICdoJywgJ20nLCAndCcsICd4JyApCisjZGVmaW5lIFRUQUdfa2VybiAgRlRfTUFLRV9UQUcoICdrJywgJ2UnLCAncicsICduJyApCisjZGVmaW5lIFRUQUdfbG9jYSAgRlRfTUFLRV9UQUcoICdsJywgJ28nLCAnYycsICdhJyApCisjZGVmaW5lIFRUQUdfTFRTSCAgRlRfTUFLRV9UQUcoICdMJywgJ1QnLCAnUycsICdIJyApCisjZGVmaW5lIFRUQUdfbWF4cCAgRlRfTUFLRV9UQUcoICdtJywgJ2EnLCAneCcsICdwJyApCisjZGVmaW5lIFRUQUdfbmFtZSAgRlRfTUFLRV9UQUcoICduJywgJ2EnLCAnbScsICdlJyApCisjZGVmaW5lIFRUQUdfT1MyICAgRlRfTUFLRV9UQUcoICdPJywgJ1MnLCAnLycsICcyJyApCisjZGVmaW5lIFRUQUdfT1RUTyAgRlRfTUFLRV9UQUcoICdPJywgJ1QnLCAnVCcsICdPJyApCisjZGVmaW5lIFRUQUdfUENMVCAgRlRfTUFLRV9UQUcoICdQJywgJ0MnLCAnTCcsICdUJyApCisjZGVmaW5lIFRUQUdfcG9zdCAgRlRfTUFLRV9UQUcoICdwJywgJ28nLCAncycsICd0JyApCisjZGVmaW5lIFRUQUdfcHJlcCAgRlRfTUFLRV9UQUcoICdwJywgJ3InLCAnZScsICdwJyApCisjZGVmaW5lIFRUQUdfdHJ1ZSAgRlRfTUFLRV9UQUcoICd0JywgJ3InLCAndScsICdlJyApCisjZGVmaW5lIFRUQUdfdHRjICAgRlRfTUFLRV9UQUcoICd0JywgJ3QnLCAnYycsICcgJyApCisjZGVmaW5lIFRUQUdfdHRjZiAgRlRfTUFLRV9UQUcoICd0JywgJ3QnLCAnYycsICdmJyApCisjZGVmaW5lIFRUQUdfVkRNWCAgRlRfTUFLRV9UQUcoICdWJywgJ0QnLCAnTScsICdYJyApCisjZGVmaW5lIFRUQUdfdmhlYSAgRlRfTUFLRV9UQUcoICd2JywgJ2gnLCAnZScsICdhJyApCisjZGVmaW5lIFRUQUdfdm10eCAgRlRfTUFLRV9UQUcoICd2JywgJ20nLCAndCcsICd4JyApCisKKworI2VuZGlmIC8qIFRUQUdTX0ggKi8KKworCisvKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy90eXBlMS9ydWxlcy5tayBiL3NyYy90eXBlMS9ydWxlcy5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGFlOTljCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3R5cGUxL3J1bGVzLm1rCkBAIC0wLDAgKzEsMTY3IEBACisjKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMqICBUeXBlMSBkcml2ZXIgTWFrZWZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisjKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIyogIENvcHlyaWdodCAxOTk2LTE5OTkgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMqICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICAqCisjKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCAgICAgICAgICoKKyMqICBtb2RpZmllZCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgICAqCisjKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAgKgorIyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgICoKKyMqICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisjKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCisjKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMqICBJTVBPUlRBTlQgTk9URTogVGhpcyBNYWtlZmlsZSBpcyBpbnRlbmRlZCBmb3IgR05VIE1ha2UhICAgICAgICAgICAgICAgICAqCisjKiAgICAgICAgICAgICAgICAgIElmIHlvdSBwcm92aWRlIE1ha2VmaWxlcyBmb3Igb3RoZXIgbWFrZSB1dGlsaXRpZXMsICAgICAgKgorIyogICAgICAgICAgICAgICAgICBwbGVhc2UgcGxhY2UgdGhlbSBpbiBgZnJlZXR5cGUvbGliL2FyY2gvPHN5c3RlbT4nLiAgICAgICoKKyMqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisjKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIyogIFRoaXMgZmlsZSBpcyB0byBiZSBpbmNsdWRlZCBieSB0aGUgRnJlZVR5cGUgTWFrZWZpbGUubGliLCBsb2NhdGVkIGluICAgICoKKyMqICB0aGUgYGZyZWV0eXBlL2xpYicgZGlyZWN0b3J5LiAgSGVyZSBpcyB0aGUgbGlzdCBvZiB0aGUgdmFyaWFibGVzIHRoYXQgICAqCisjKiAgbXVzdCBiZSBkZWZpbmVkIHRvIHVzZSBpdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisjKiAgICAgQkFTRV9ESVI6ICAgIFRoZSBsb2NhdGlvbiBvZiB0aGUgYmFzZSBsYXllcidzIGRpcmVjdG9yeS4gIFRoaXMgaXMgICAgKgorIyogICAgICAgICAgICAgICAgICB1c3VhbGx5IGBmcmVldHlwZS9saWIvYmFzZScuICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisjKiAgICAgQVJDSF9ESVI6ICAgIFRoZSBsb2NhdGlvbiBvZiB0aGUgYXJjaGl0ZWN0dXJlLWRlcGVuZGVudCBkaXJlY3RvcnkuICAgKgorIyogICAgICAgICAgICAgICAgICBUaGlzIGlzIHVzdWFsbHkgYGZyZWV0eXBlL2xpYi9hcmNoLzxzeXN0ZW0+Jy4gICAgICAgICAgICoKKyMqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisjKiAgICAgRFJJVkVSU19ESVI6IFRoZSBsb2NhdGlvbiBvZiB0aGUgZm9udCBkcml2ZXIgc3ViLWRpcnMsIHVzdWFsbHkgICAgICAgKgorIyogICAgICAgICAgICAgICAgICBgZnJlZXR5cGUvbGliL2RyaXZlcnMnLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisjKiAgICAgT0JKX0RJUjogICAgIFRoZSBsb2NhdGlvbiB3aGVyZSB0aGUgY29tcGlsZWQgb2JqZWN0KHMpIGZpbGUgd2lsbCBiZSAgKgorIyogICAgICAgICAgICAgICAgICBwbGFjZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisjKiAgICAgQkFTRV9IOiAgICAgIEEgbGlzdCBvZiBwYXRobmFtZXMgdG8gdGhlIGJhc2UgbGF5ZXIncyBoZWFkZXIgZmlsZXMgb24gKgorIyogICAgICAgICAgICAgICAgICB3aGljaCB0aGUgZHJpdmVyIGRlcGVuZHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisjKiAgICAgRlRfQ0ZMQUdTOiAgIEEgc2V0IG9mIGZsYWdzIHVzZWQgZm9yIGNvbXBpbGF0aW9uIG9mIG9iamVjdCBmaWxlcy4gICAgKgorIyogICAgICAgICAgICAgICAgICBUaGlzIGNvbnRhaW5zIGF0IGxlYXN0IHRoZSBpbmNsdWRlIHBhdGhzIG9mIHRoZSBhcmNoICAgICoKKyMqICAgICAgICAgICAgICAgICAgYW5kIGJhc2UgZGlyZWN0b3JpZXMgKyBvcHRpbWl6YXRpb24gKyB3YXJuaW5ncyArIEFOU0kgICAqCisjKiAgICAgICAgICAgICAgICAgIGNvbXBsaWFuY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMqICAgICBGVF9JRkxBRzogICAgVGhlIGZsYWcgdXNlZCB0byBzcGVjaWZ5IGFuIGluY2x1ZGUgcGF0aCBvbiB0aGUgICAgICAgICAqCisjKiAgICAgICAgICAgICAgICAgIGNvbXBpbGVyIGNvbW1hbmQgbGluZS4gIEZvciBleGFtcGxlLCB3aXRoIEdDQywgdGhpcyBpcyAgKgorIyogICAgICAgICAgICAgICAgICBgLUknLCB3aGlsZSBzb21lIG90aGVyIGNvbXBpbGVycyB1c2UgYC9pPScgb3IgYC1KJywgICAgICoKKyMqICAgICAgICAgICAgICAgICAgZXRjLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisjKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIyogICAgIEZUX09CSjogICAgICBUaGUgc3VmZml4IG9mIGFuIG9iamVjdCBmaWxlIGZvciB0aGUgcGxhdGZvcm07IGNhbiBiZSAgICoKKyMqICAgICAgICAgICAgICAgICAgYG8nLCBgb2JqJywgYGNvZmYnLCBgdGNvJywgZXRjLiBkZXBlbmRpbmcgb24gdGhlICAgICAgICAqCisjKiAgICAgICAgICAgICAgICAgIHBsYXRmb3JtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisjKiAgSXQgYWxzbyB1cGRhdGVzIHRoZSBmb2xsb3dpbmcgdmFyaWFibGVzIGRlZmluZWQgYW5kIHVzZWQgaW4gdGhlIG1haW4gICAgKgorIyogIE1ha2VmaWxlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisjKiAgICAgRFJWX09CSl9TOiAgICAgICAgICAgIFRoZSBsaXN0IG9mIGRyaXZlciBvYmplY3QgZmlsZXMgaW4gICAgICAgICAgICAgKgorIyogICAgICAgICAgICAgICAgICAgICAgICAgICBzaW5nbGUtb2JqZWN0IG1vZGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisjKiAgICAgRFJWX09CSl9NOiAgICAgICAgICAgIFRoZSBsaXN0IG9mIGRyaXZlciBvYmplY3QgZmlsZXMgaW4gICAgICAgICAgICAgKgorIyogICAgICAgICAgICAgICAgICAgICAgICAgICBtdWx0aXBsZS1vYmplY3RzIG1vZGUuICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisjKiAgICAgRlRJTklUX0RSSVZFUl9QQVRIUzogIFRoZSBsaXN0IG9mIGluY2x1ZGUgcGF0aHMgdXNlZCB0byBjb21waWxlIHRoZSAgKgorIyogICAgICAgICAgICAgICAgICAgICAgICAgICBgZnRpbml0JyBjb21wb25lbnQgd2hpY2ggcmVnaXN0ZXJzIGFsbCBmb250ICAgICoKKyMqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyaXZlcnMgaW4gdGhlIEZUX0luaXRfRnJlZVR5cGUoKSBmdW5jdGlvbi4gICAqCisjKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIyogICAgIEZUSU5JVF9EUklWRVJfSDogICAgICBUaGUgbGlzdCBvZiBoZWFkZXIgZGVwZW5kZW5jaWVzIHVzZWQgdG8gICAgICAgICoKKyMqICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGlsZSB0aGUgYGZ0aW5pdCcgY29tcG9uZW50LiAgICAgICAgICAgICAgICAqCisjKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIyogICAgIEZUSU5JVF9EUklWRVJfTUFDUk9TOiBUaGUgbGlzdCBvZiBtYWNyb3MgdG8gYmUgZGVmaW5lZCB3aGVuICAgICAgICAgICoKKyMqICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGlsaW5nIHRoZSBgZnRpbml0JyBjb21wb25lbnQuICAgICAgICAgICAgICAqCisjKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIyogIGBTaW5nbGUtb2JqZWN0IGNvbXBpbGF0aW9uJyBtZWFucyB0aGF0IGVhY2ggZm9udCBkcml2ZXIgaXMgY29tcGlsZWQgICAgICoKKyMqICBpbnRvIGEgc2luZ2xlIG9iamVjdCBmaWxlLiAgVGhpcyBpcyB1c2VmdWwgdG8gZ2V0IHJpZCBvZiBhbGwgICAgICAgICAgICAqCisjKiAgZHJpdmVyLXNwZWNpZmljIGVudHJpZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKworIyBUeXBlMSBkcml2ZXIgZGlyZWN0b3J5CisjCitUMV9ESVIgIDo9ICQoU1JDXyl0eXBlMQorVDFfRElSXyA6PSAkKFQxX0RJUikkKFNFUCkKKworCisjIGFkZGl0aW9uYWwgaW5jbHVkZSBmbGFncyB1c2VkIHdoZW4gY29tcGlsaW5nIHRoZSBkcml2ZXIKKyMKK1QxX0lOQ0xVREUgOj0gJChTSEFSRUQpICQoVDFfRElSKQorVDFfQ09NUElMRSA6PSAkKEZUX0NDKSAkKFQxX0lOQ0xVREU6JT0kSSUpCisKKworIyBUeXBlMSBkcml2ZXIgc291cmNlcyAoaS5lLiwgQyBmaWxlcykKKyMKK1QxX0RSVl9TUkMgOj0gJChUMV9ESVJfKXQxb2Jqcy5jICAgIFwKKyAgICAgICAgICAgICAgJChUMV9ESVJfKXQxbG9hZC5jICAgIFwKKyAgICAgICAgICAgICAgJChUMV9ESVJfKXQxcGFyc2UuYyAgIFwKKyAgICAgICAgICAgICAgJChUMV9ESVJfKXQxdG9rZW5zLmMgIFwKKyAgICAgICAgICAgICAgJChUMV9ESVJfKXQxZHJpdmVyLmMgIFwKKwkgICAgICAkKFQxX0RJUl8pdDFlbmNvZGUuYyAgXAorICAgICAgICAgICAgICAkKFQxX0RJUl8pdDFoaW50ZXIuYyAgXAorICAgICAgICAgICAgICAkKFQxX0RJUl8pdDFnbG9hZC5jCisKKworIyBUeXBlMSBkcml2ZXIgaGVhZGVycworIworVDFfRFJWX0ggOj0gJChUMV9ESVJfKXQxZXJyb3JzLmggICAgXAorICAgICAgICAgICAgJChUMV9ESVJfKXQxY29uZmlnLmggICAgXAorICAgICAgICAgICAgJChUMVNIQVJFRF9IKSAgICAgICAgICAgXAorICAgICAgICAgICAgJChUMV9EUlZfU1JDOiUuYz0lLmgpCisKKworIyBkcml2ZXIgb2JqZWN0KHMpCisjCisjICAgVDFfRFJWX09CSl9NIGlzIHVzZWQgZHVyaW5nIGBkZWJ1ZycgYnVpbGRzCisjICAgVDFfRFJWX09CSl9TIGlzIHVzZWQgZHVyaW5nIGByZWxlYXNlJyBidWlsZHMKKyMKK1QxX0RSVl9PQkpfTSA6PSAkKFQxX0RSVl9TUkM6JChUMV9ESVJfKSUuYz0kKE9CSl8pJS4kTykgXAorICAgICAgICAgICAgICAgICQoVDFTSEFSRUQ6JChUMVNIQVJFRF9ESVJfKSUuYz0kKE9CSl8pJS4kTykKK1QxX0RSVl9PQkpfUyA6PSAkKE9CSl8pdHlwZTEuJE8KKworCisKKyMgZHJpdmVyIHJvb3Qgc291cmNlIGZpbGUocykKKyMKK1QxX0RSVl9TUkNfTSA6PSAkKFQxX0RSVl9TUkMpICQoVDFTSEFSRURfU1JDKQorVDFfRFJWX1NSQ19TIDo9ICQoVDFfRElSXyl0eXBlMS5jCisKKworIyBkcml2ZXIgLSBzaW5nbGUgb2JqZWN0CisjCisjICB0aGUgZHJpdmVyIGlzIHJlY29tcGlsZWQgaWYgYW55IG9mIHRoZSBoZWFkZXIgb3Igc291cmNlIGZpbGVzIGlzIGNoYW5nZWQKKyMKKyQoVDFfRFJWX09CSl9TKTogJChCQVNFX0gpICQoVDFfRFJWX0gpICQoVDFfRFJWX1NSQykgJChUMV9EUlZfU1JDX1MpCisJJChUMV9DT01QSUxFKSAkVCRAICQoVDFfRFJWX1NSQ19TKQorCisKKworIyBkcml2ZXIgLSBtdWx0aXBsZSBvYmplY3RzCisjCisjICAgQWxsIG9iamVjdHMgYXJlIHJlY29tcGlsZWQgaWYgYW55IG9mIHRoZSBoZWFkZXIgZmlsZXMgaXMgY2hhbmdlZAorIworJChPQkpfKXQxJS4kTzogJChUMV9ESVJfKXQxJS5jICQoQkFTRV9IKSAkKFQxX0RSVl9IKQorCSQoVDFfQ09NUElMRSkgJFQkQCAkPAorCiskKE9CSl8pdDElLiRPOiAkKFQxU0hBUkVEX0RJUl8pdDElLmMgJChCQVNFX0gpICQoVDFTSEFSRURfSCkKKwkkKFQxX0NPTVBJTEUpICRUJEAgJDwKKworCisjIHVwZGF0ZSBtYWluIGRyaXZlciBvYmplY3QgbGlzdHMKKyMKK0RSVl9PQkpTX1MgKz0gJChUMV9EUlZfT0JKX1MpCitEUlZfT0JKU19NICs9ICQoVDFfRFJWX09CSl9NKQorCisKKyMgdXBkYXRlICdmdGluaXQnIHZhcmlhYmxlcworIworRlRJTklUX0RSSVZFUl9QQVRIUyAgKz0gJChUMV9ESVIpICQoVDFTSEFSRURfRElSKQorRlRJTklUX0RSSVZFUl9IICAgICAgKz0gJChUMV9EUlZfSCkKK0ZUSU5JVF9EUklWRVJfTUFDUk9TICs9IEZUX1NVUFBPUlRfVFlQRTEKKworCisjIEVORApkaWZmIC0tZ2l0IGEvc3JjL3R5cGUxL3QxY29uZmlnLmggYi9zcmMvdHlwZTEvdDFjb25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzJiMTc3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3R5cGUxL3QxY29uZmlnLmgKQEAgLTAsMCArMSw0NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgdDFjb25maWcuaAorICoKKyAqICAgIFR5cGUgMSBkcml2ZXIgY29uZmlndXJhdGlvbiBmaWxlCisgKgorICogIENvcHlyaWdodCAxOTk2LTE5OTggYnkKKyAqICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAKKyAqICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBUMUNPTkZJR19ICisjZGVmaW5lIFQxQ09ORklHX0gKKworLyogVDFfTUFYX1NUQUNLX0RFUFRIIGlzIHRoZSBtYXhpbWFsIGRlcHRoIG9mIHRoZSB0b2tlbiBzdGFjayB1c2VkICovCisvKiBieSB0aGUgVHlwZSAxIHBhcnNlciAoc2VlIHQxbG9hZC5jKS4gQSBtaW5pbXVtIG9mIDE2IGlzIHJlcXVpcmVkICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVDFfTUFYX1NUQUNLX0RFUFRIICAxNgorCisvKiBUMV9NQVhfRElDVF9ERVBUSCBpcyB0aGUgbWF4aW1hbCBkZXB0aCBvZiBuZXN0IGRpY3Rpb25hcmllcyBhbmQgKi8KKy8qIGFycmF5cyBpbiB0aGUgVHlwZSAxIHN0cmVhbSAoc2VlIHQxbG9hZC5jKS4gQSBtaW5pbXVtIG9mIDQgaXMgICAqLworLyogcmVxdWlyZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFQxX01BWF9ESUNUX0RFUFRIICAgNQorCisvKiBUMV9NQVhfU1VCUlNfQ0FMTFMgZGV0YWlscyB0aGUgbWF4aW11bSBudW1iZXIgb2YgbmVzdGVkIHN1Yi1yb3V0aW5lICovCisvKiBjYWxscyBkdXJpbmcgZ2x5cGggbG9hZGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFQxX01BWF9TVUJSU19DQUxMUyAgIDgKKworCisvKiBUMV9NQVhfQ0hBUlNUUklOR19PUEVSQU5EUyBpcyB0aGUgY2hhcnN0cmluZyBzdGFjaydzIGNhcGFjaXR5ICovCisjZGVmaW5lIFQxX01BWF9DSEFSU1RSSU5HU19PUEVSQU5EUyAgMzIKKworCisvKiBEZWZpbmUgVDFfQ09ORklHX09QVElPTl9ESVNBQkxFX0hJTlRFUiBpZiB5b3Ugd2FudCB0byBnZW5lcmF0ZSAgKi8KKy8qIGEgZHJpdmVyIHdpdGggbm8gaGludGVyLiBUaGlzIGNhbiBiZSB1c2VmdWwgdG8gZGVidWcgdGhlIHBhcnNlciAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjdW5kZWYgIFQxX0NPTkZJR19PUFRJT05fRElTQUJMRV9ISU5URVIKKworI2VuZGlmIC8qIFQxQ09ORklHX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy90eXBlMS90MWRyaXZlci5jIGIvc3JjL3R5cGUxL3QxZHJpdmVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGM5NzRiZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90eXBlMS90MWRyaXZlci5jCkBAIC0wLDAgKzEsMjc5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICB0MWRyaXZlci5jCisgKgorICogICAgSGlnaC1sZXZlbCBUeXBlMSBkcml2ZXIgaW50ZXJmYWNlIGZvciBGcmVlVHlwZSAyLjAKKyAqCisgKiAgQ29weXJpZ2h0IDE5OTYtMTk5OCBieQorICogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlIAorICogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8dDFkcml2ZXIuaD4KKyNpbmNsdWRlIDx0MWdsb2FkLmg+CisKKyNpbmNsdWRlIDxmdGRlYnVnLmg+CisjaW5jbHVkZSA8ZnRzdHJlYW0uaD4KKworI3VuZGVmICBGVF9DT01QT05FTlQKKyNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV90MWRyaXZlcgorCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gU2V0X0NoYXJfU2l6ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgZHJpdmVyIG1ldGhvZCB1c2VkIHRvIHJlc2V0IGEgc2l6ZSdzIGNoYXJhY3RlciBzaXplcyAgICAgICovCisgIC8qICAgIChob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCkgZXhwcmVzc2VkIGluIGZyYWN0aW9uYWwgcG9pbnRzLiAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHNpemUgICAgICAgIDo6IGhhbmRsZSB0byB0YXJnZXQgc2l6ZSBvYmplY3QgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGNoYXJfd2lkdGggIDo6IGNoYXJhY3RlciB3aWR0aCBleHByZXNzZWQgaW4gMjYuNiBwb2ludHMgICAgICovCisgIC8qICAgIGNoYXJfaGVpZ2h0IDo6IGNoYXJhY3RlciBoZWlnaHQgZXhwcmVzc2VkIGluIDI2LjYgcG9pbnRzICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuIDAgbWVhbnMgc3VjY2VzcyAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0YXRpYworICBUMV9FcnJvciAgU2V0X0NoYXJfU2l6ZXMoIFQxX1NpemUgICAgICBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQxX0YyNkRvdDYgICBjaGFyX3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQxX0YyNkRvdDYgICBjaGFyX2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUMV9VSW50ICAgICAgaG9yel9yZXNvbHV0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQxX1VJbnQgICAgICB2ZXJ0X3Jlc29sdXRpb24gKQorICB7CisgICAgRlRfU2l6ZV9NZXRyaWNzKiAgbWV0cmljczsKKyAgICBUMV9GYWNlICAgICAgICAgICBmYWNlOworICAKKyAgICBpZiAoIXNpemUpCisgICAgICByZXR1cm4gVDFfRXJyX0ludmFsaWRfU2l6ZV9IYW5kbGU7CisgICAgCisgICAgaWYgKCBjaGFyX3dpZHRoICA8IDEqNjQgKSBjaGFyX3dpZHRoID0gMSo2NDsKKyAgICBpZiAoIGNoYXJfaGVpZ2h0IDwgMSo2NCApIGNoYXJfaGVpZ2h0ID0gMSo2NDsKKworICAgIG1ldHJpY3MgPSAmc2l6ZS0+cm9vdC5tZXRyaWNzOworICAgIGZhY2UgICAgPSAoVDFfRmFjZSlzaXplLT5yb290LmZhY2U7CisgICAgCisgICAgbWV0cmljcy0+eF9wcGVtID0gKCBjaGFyX3dpZHRoICAqIGhvcnpfcmVzb2x1dGlvbiArIDM2ICkvNzI7CisgICAgbWV0cmljcy0+eV9wcGVtID0gKCBjaGFyX2hlaWdodCAqIHZlcnRfcmVzb2x1dGlvbiArIDM2ICkvNzI7CisgICAgCisgICAgbWV0cmljcy0+eF9wcGVtID0gKCBtZXRyaWNzLT54X3BwZW0gKyAzMiApICYgLTY0OworICAgIG1ldHJpY3MtPnlfcHBlbSA9ICggbWV0cmljcy0+eV9wcGVtICsgMzIgKSAmIC02NDsKKyAgICAKKyAgICBtZXRyaWNzLT54X3NjYWxlID0gRlRfTXVsRGl2KCBtZXRyaWNzLT54X3BwZW0sIDB4MTAwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZS0+cm9vdC51bml0c19wZXJfRU0gKTsKKyAgICAKKyAgICBtZXRyaWNzLT55X3NjYWxlID0gRlRfTXVsRGl2KCBtZXRyaWNzLT55X3BwZW0sIDB4MTAwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZS0+cm9vdC51bml0c19wZXJfRU0gKTsKKworICAgIG1ldHJpY3MtPnhfcHBlbSA+Pj0gNjsKKyAgICBtZXRyaWNzLT55X3BwZW0gPj49IDY7CisgICAgCisgICAgc2l6ZS0+dmFsaWQgPSBGQUxTRTsKKworICAgIHJldHVybiBUMV9SZXNldF9TaXplKCBzaXplICk7CisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gU2V0X1BpeGVsX1NpemVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgZHJpdmVyIG1ldGhvZCB1c2VkIHRvIHJlc2V0IGEgc2l6ZSdzIGNoYXJhY3RlciBzaXplcyAgICAgICovCisgIC8qICAgIChob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCkgZXhwcmVzc2VkIGluIGludGVnZXIgcGl4ZWxzLiAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHNpemUgICAgICAgICA6OiBoYW5kbGUgdG8gdGFyZ2V0IHNpemUgb2JqZWN0ICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHBpeGVsX3dpZHRoICA6OiBjaGFyYWN0ZXIgd2lkdGggZXhwcmVzc2VkIGluIDI2LjYgcG9pbnRzICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHBpeGVsX2hlaWdodCA6OiBjaGFyYWN0ZXIgaGVpZ2h0IGV4cHJlc3NlZCBpbiAyNi42IHBvaW50cyAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGNoYXJfc2l6ZSAgICA6OiB0aGUgY29ycmVzcG9uZGluZyBjaGFyYWN0ZXIgc2l6ZSBpbiBwb2ludHMgICovCisgIC8qICAgICAgICAgICAgICAgICAgICBUaGlzIHZhbHVlIGlzIG9ubHkgc2VudCB0byB0aGUgVHJ1ZVR5cGUgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICBieXRlY29kZSBpbnRlcnByZXRlciwgZXZlbiB0aG91Z2ggOTklIG9mICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICBnbHlwaCBwcm9ncmFtcyB3aWxsIHNpbXBseSBpZ25vcmUgaXQuIEEgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICBzYWZlIHZhbHVlIHRoZXJlIGlzIHRoZSBtYXhpbXVtIG9mIHRoZSAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICBwaXhlbCB3aWR0aCBhbmQgaGVpZ2h0IChtdWx0aXBsaWVkIGJ5ICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICA2NCB0byBtYWtlIGl0IGEgMjYuNiBmaXhlZCBmbG9hdCAhKSAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuIDAgbWVhbnMgc3VjY2VzcyAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0YXRpYworICBUMV9FcnJvciAgU2V0X1BpeGVsX1NpemVzKCBUMV9TaXplICAgICBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUMV9JbnQgICAgICBwaXhlbF93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVDFfSW50ICAgICAgcGl4ZWxfaGVpZ2h0ICkKKyAgeworICAgIEZUX1NpemVfTWV0cmljcyogICBtZXRyaWNzOworICAgIFQxX0ZhY2UgICAgICAgICAgICBmYWNlOworICAKKyAgICBpZiAoIXNpemUpCisgICAgICByZXR1cm4gVDFfRXJyX0ludmFsaWRfU2l6ZV9IYW5kbGU7CisgICAgCisgICAgaWYgKCBwaXhlbF93aWR0aCAgPCAxICkgcGl4ZWxfd2lkdGggPSAxOworICAgIGlmICggcGl4ZWxfaGVpZ2h0IDwgMSApIHBpeGVsX2hlaWdodCA9IDE7CisgIAorICAgIG1ldHJpY3MgPSAmc2l6ZS0+cm9vdC5tZXRyaWNzOworICAgIGZhY2UgICAgPSAoVDFfRmFjZSlzaXplLT5yb290LmZhY2U7CisgIAorICAgIG1ldHJpY3MtPnhfcHBlbSAgICA9IHBpeGVsX3dpZHRoOworICAgIG1ldHJpY3MtPnlfcHBlbSAgICA9IHBpeGVsX2hlaWdodDsKKyAgCisgICAgbWV0cmljcy0+eF9zY2FsZSA9IEZUX011bERpdiggbWV0cmljcy0+eF9wcGVtICogNjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwMCwgZmFjZS0+cm9vdC51bml0c19wZXJfRU0gKTsKKyAgCisgICAgbWV0cmljcy0+eV9zY2FsZSA9IEZUX011bERpdiggbWV0cmljcy0+eV9wcGVtICogNjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwMCwgZmFjZS0+cm9vdC51bml0c19wZXJfRU0gKTsKKyAgCisgICAgc2l6ZS0+dmFsaWQgPSAwOworICAKKyAgICByZXR1cm4gVDFfUmVzZXRfU2l6ZShzaXplKTsKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFN0cnVjdD4gRlRfRHJpdmVySW50ZXJmYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSBzdHJ1Y3R1cmUgdXNlZCB0byBob2xkIGEgZm9udCBkcml2ZXIncyBiYXNpYyBpbnRlcmZhY2UgICAgKi8KKyAgLyogICAgdXNlZCBieSB0aGUgaGlnaC1sZXZlbCBwYXJ0cyBvZiBGcmVlVHlwZSAob3Igb3RoZXIgYXBwcykgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgTW9zdCBzY2FsYWJsZSBkcml2ZXJzIHByb3ZpZGUgYSBzcGVjaWFsaXplZCBpbnRlcmZhY2UgdG8gICAgKi8KKyAgLyogICAgYWNjZXNzIGZvcm1hdC1zcGVjaWZpYyBmZWF0dXJlcy4gSXQgY2FuIGJlIHJldHJpZXZlZCB3aXRoICAgKi8KKyAgLyogICAgYSBjYWxsIHRvIHRoZSAiZ2V0X2Zvcm1hdF9pbnRlcmZhY2UiLCBhbmQgc2hvdWxkIGJlIGRlZmluZWQgKi8KKyAgLyogICAgaW4gZWFjaCBmb250IGRyaXZlciBoZWFkZXIgKGUuZy4gdHRkcml2ZXIuaCwgdDFkcml2ZXIuaCwuLikgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQWxsIGZpZWxkcyBhcmUgZnVuY3Rpb24gcG9pbnRlcnMgLi4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbmV3X2VuZ2luZSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgIHVzZWQgdG8gY3JlYXRlIGFuZCBpbml0aWFsaXNlIGEgbmV3IGRyaXZlciBvYmplY3QgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZG9uZV9lbmdpbmUgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgIHVzZWQgdG8gZmluYWxpc2UgYW5kIGRlc3Ryb3kgYSBnaXZlbiBkcml2ZXIgb2JqZWN0ICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZ2V0X2Zvcm1hdF9pbnRlcmZhY2UgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgIHJldHVybiBhIHR5cGVsZXNzIHBvaW50ZXIgdG8gdGhlIGZvcm1hdC1zcGVjaWZpYyAgICAgICAgKi8KKyAgLyogICAgICAgIGRyaXZlciBpbnRlcmZhY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbmV3X2ZhY2UgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgIGNyZWF0ZSBhIG5ldyBmYWNlIG9iamVjdCBmcm9tIGEgcmVzb3VyY2UgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZG9uZV9mYWNlIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgIGRpc2NhcmRzIGEgZmFjZSBvYmplY3QsIGFzIHdlbGwgYXMgYWxsIGNoaWxkIG9iamVjdHMgICAgKi8KKyAgLyogICAgICAgICggc2l6ZXMsIGNoYXJtYXBzLCBnbHlwaCBzbG90cyApICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZ2V0X2ZhY2VfcHJvcGVydGllcyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgIHJldHVybiBnZW5lcmljIGZhY2UgcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZ2V0X2tlcm5pbmcgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgIHJldHVybiB0aGUga2VybmluZyB2ZWN0b3IgY29ycmVzcG9uZGluZyB0byBhIHBhaXIgICAgICAgKi8KKyAgLyogICAgICAgIG9mIGdseXBocywgZXhwcmVzc2VkIGluIHVuc2NhbGVkIGZvbnQgdW5pdHMuICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbmV3X3NpemUgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgIGNyZWF0ZSBhbmQgaW5pdGlhbGlzZSBhIG5ldyBzY2FsYWJsZSBzaXplIG9iamVjdC4gICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbmV3X2ZpeGVkX3NpemUgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgIGNyZWF0ZSBhbmQgaW5pdGlhbGlzZSBhIG5ldyBmaXhlZC1zaXplIG9iamVjdC4gICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZG9uZV9zaXplIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgIGZpbmFsaXplIGEgZ2l2ZW4gZmFjZSBzaXplIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgc2V0X3NpemVfcmVzb2x1dGlvbnMgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgIHJlc2V0IGEgc2NhbGFibGUgc2l6ZSBvYmplY3QncyBvdXRwdXQgcmVzb2x1dGlvbnMgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgc2V0X3NpemVfY2hhcl9zaXplcyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgIHJlc2V0IGEgc2NhbGFibGUgc2l6ZSBvYmplY3QncyBjaGFyYWN0ZXIgc2l6ZSAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgc2V0X3BpeGVsX3NpemVzIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgIHJlc2V0IGEgZmFjZSBzaXplIG9iamVjdCdzIHBpeGVsIGRpbWVuc2lvbnMuIEFwcGxpZXMgICAgKi8KKyAgLyogICAgICAgIHRvIGJvdGggc2NhbGFibGUgYW5kIGZpeGVkIGZhY2VzLiAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbmV3X2dseXBoX3Nsb3QgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgIGNyZWF0ZSBhbmQgaW5pdGlhbGlzZSBhIG5ldyBnbHlwaCBzbG90ICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZG9uZV9nbHlwaF9zbG90IDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgIGRpc2NhcmQgYSBnaXZlbiBnbHlwaCBzbG90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbG9hZF9nbHlwaCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgIGxvYWQgYSBnaXZlbiBnbHlwaCBpbnRvIGEgZ2l2ZW4gc2xvdCAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZ2V0X2dseXBoX21ldHJpY3MgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgIHJldHVybiBhIGxvYWRlZCBnbHlwaCdzIG1ldHJpY3MuICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICBFWFBPUlRfRlVOQworICBjb25zdCAgRlRfRHJpdmVySW50ZXJmYWNlICB0MV9kcml2ZXJfaW50ZXJmYWNlID0KKyAgeworICAgIHNpemVvZiggRlRfRHJpdmVyUmVjICksCisgICAgc2l6ZW9mKCBUMV9GYWNlUmVjICksCisgICAgc2l6ZW9mKCBUMV9TaXplUmVjICksCisgICAgc2l6ZW9mKCBUMV9HbHlwaFNsb3RSZWMgKSwKKyAgICAKKyAgICAidHlwZTEiLAorICAgIDEsCisgICAgMiwKKworICAgIDAsICAgLyogZm9ybWF0IGludGVyZmFjZSAqLworCisgICAgKEZURHJpdmVyX2luaXREcml2ZXIpICAgICAgICAgICBUMV9Jbml0X0RyaXZlciwKKyAgICAoRlREcml2ZXJfZG9uZURyaXZlcikgICAgICAgICAgIFQxX0RvbmVfRHJpdmVyLAorICAgIChGVERyaXZlcl9nZXRJbnRlcmZhY2UpICAgICAgICAgMCwKKworICAgIChGVERyaXZlcl9pbml0RmFjZSkgICAgICAgICAgICAgVDFfSW5pdF9GYWNlLAorICAgIChGVERyaXZlcl9kb25lRmFjZSkgICAgICAgICAgICAgVDFfRG9uZV9GYWNlLAorICAgIChGVERyaXZlcl9nZXRLZXJuaW5nKSAgICAgICAgICAgMCwKKworICAgIChGVERyaXZlcl9pbml0U2l6ZSkgICAgICAgICAgICAgVDFfSW5pdF9TaXplLAorICAgIChGVERyaXZlcl9kb25lU2l6ZSkgICAgICAgICAgICAgVDFfRG9uZV9TaXplLAorICAgIChGVERyaXZlcl9zZXRDaGFyU2l6ZXMpICAgICAgICAgU2V0X0NoYXJfU2l6ZXMsCisgICAgKEZURHJpdmVyX3NldFBpeGVsU2l6ZXMpICAgICAgICBTZXRfUGl4ZWxfU2l6ZXMsCisKKyAgICAoRlREcml2ZXJfaW5pdEdseXBoU2xvdCkgICAgICAgIFQxX0luaXRfR2x5cGhTbG90LAorICAgIChGVERyaXZlcl9kb25lR2x5cGhTbG90KSAgICAgICAgVDFfRG9uZV9HbHlwaFNsb3QsCisgICAgKEZURHJpdmVyX2xvYWRHbHlwaCkgICAgICAgICAgICBUMV9Mb2FkX0dseXBoLAorCisgICAgKEZURHJpdmVyX2dldENoYXJJbmRleCkgICAgICAgICAwLAorICB9OworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogIDxGdW5jdGlvbj4gR2V0X0ZyZWVUeXBlX0RyaXZlcl9JbnRlcmZhY2UgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB3aGVuIGNvbXBpbGluZyB0aGUgVHJ1ZVR5cGUgZHJpdmVyICAgKi8KKyAgLyogICAgIGFzIGEgc2hhcmVkIGxpYnJhcnkgKC5ETEwgb3IgLnNvKS4gSXQgd2lsbCBiZSB1c2VkIGJ5IHRoZSAgKi8KKyAgLyogICAgIGhpZ2gtbGV2ZWwgbGlicmFyeSBvZiBGcmVlVHlwZSB0byByZXRyaWV2ZSB0aGUgYWRkcmVzcyBvZiAgKi8KKyAgLyogICAgIHRoZSBkcml2ZXIncyBnZW5lcmljIGludGVyZmFjZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgIEl0IHNob3VsZG4ndCBiZSBpbXBsZW1lbnRlZCBpbiBhIHN0YXRpYyBidWlsZCwgYXMgZWFjaCAgICAgKi8KKyAgLyogICAgIGRyaXZlciBtdXN0IGhhdmUgdGhlIHNhbWUgZnVuY3Rpb24gYXMgYW4gZXhwb3J0ZWQgZW50cnkgICAgKi8KKyAgLyogICAgIHBvaW50LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgIGFkZHJlc3Mgb2YgVHJ1ZVR5cGUncyBkcml2ZXIgZ2VuZXJpYyBpbnRlcmZhY2UuIFRoZSAgICAgICAgKi8KKyAgLyogICAgIGZvcm1hLXNwZWNpZmljIGludGVyZmFjZSBjYW4gdGhlbiBiZSByZXRyaWV2ZWQgdGhyb3VnaCAgICAgKi8KKyAgLyogICAgIHRoZSBtZXRob2QgaW50ZXJmYWNlLT5nZXRfZm9ybWF0X2ludGVyZmFjZS4uICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fRFlOQU1JQ19EUklWRVJTCisgIAorICBFWFBPUlRfRlVOQworICBGVF9Ecml2ZXJJbnRlcmZhY2UqICBnZXREcml2ZXJJbnRlcmZhY2UoIHZvaWQgKQorICB7CisgICAgcmV0dXJuICZ0MV9kcml2ZXJfaW50ZXJmYWNlOworICB9CisgIAorI2VuZGlmIC8qIEZUX0NPTkZJR19PUFRJT05fRFlOQU1JQ19EUklWRVJTICovCisKKwpkaWZmIC0tZ2l0IGEvc3JjL3R5cGUxL3QxZHJpdmVyLmggYi9zcmMvdHlwZTEvdDFkcml2ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWExNmIwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3R5cGUxL3QxZHJpdmVyLmgKQEAgLTAsMCArMSw3NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgdDFkcml2ZXIuaAorICoKKyAqICAgIEhpZ2gtbGV2ZWwgVHlwZTEgZHJpdmVyIGludGVyZmFjZSBmb3IgRnJlZVR5cGUgMi4wCisgKgorICogIENvcHlyaWdodCAxOTk2LTE5OTggYnkKKyAqICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAKKyAqICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBUMURSSVZFUl9ICisjZGVmaW5lIFQxRFJJVkVSX0gKKworI2luY2x1ZGUgPHQxb2Jqcy5oPgorI2luY2x1ZGUgPHQxZXJyb3JzLmg+CisKKyAgRVhQT1JUX0RFRgorICBjb25zdCAgRlRfRHJpdmVySW50ZXJmYWNlICB0MV9kcml2ZXJfaW50ZXJmYWNlOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIEhlcmUgaXMgYSB0ZW1wbGF0ZSBvZiB0aGUgY29kZSB0aGF0IHNob3VsZCBhcHBlYXIgaW4gZWFjaAorICogIGZvbnQgZHJpdmVyJ3MgX2ludGVyZmFjZV8gZmlsZSAodGhlIG9uZSBpbmNsdWRlZCBieSAiZnRpbml0LmMiKS4KKyAqCisgKiAgSXQgaXMgdXNlZCB0byBidWlsZCwgYXQgY29tcGlsZSB0aW1lLCBhIHNpbXBsZSBsaW5rZWQgbGlzdCBvZgorICogIHRoZSBpbnRlcmZhY2VzIG9mIHRoZSBkcml2ZXJzIHdoaWNoIGhhdmUgYmVlbiAjaW5jbHVkZWQgaW4gCisgKiAgImZ0aW5pdC5jIi4gU2VlIHRoZSBzb3VyY2UgY29kZSBvZiB0aGUgbGF0dGVyIGZpbGUgZm9yIGRldGFpbHMKKyAqCisgKiAgKE5vdGUgdGhhdCB0aGlzIGlzIG9ubHkgcmVxdWlyZWQgd2hlbiB5b3Ugd2FudCB5b3VyIGRyaXZlciBpbmNsdWRlZAorICogICBpbiB0aGUgc2V0IG9mIGRlZmF1bHQgZHJpdmVycyBsb2FkZWQgYnkgRlRfSW5pdF9GcmVlVHlwZS4gT3RoZXIKKyAqICAgZHJpdmVycyBjYW4gc3RpbGwgYmUgYWRkZWQgbWFudWFsbHkgYXQgcnVudGltZSB3aXRoIEZUX0FkZF9Ecml2ZXIuCisgKgorICogeworICogICAjaWZkZWYgRlRJTklUX0RSSVZFUl9DSEFJTgorICoKKyAqICAgc3RhdGljCisgKiAgIGNvbnN0IEZUX0RyaXZlckNoYWluICBmdGluaXRfPEZPUk1BVD5fZHJpdmVyX2NoYWluID0KKyAqICAgeworICogICAgIEZUX0lOSVRfTEFTVF9EUklWRVJfQ0hBSU4sCisgKiAgICAgJjxGT1JNQVQ+X2RyaXZlcl9pbnRlcmZhY2UKKyAqICAgfTsKKyAqIAorICogICAjdW5kZWYgIEZUX0lOSVRfTEFTVF9EUklWRVJfQ0hBSU4KKyAqICAgI2RlZmluZSBGVF9JTklUX0xBU1RfRFJJVkVSX0NIQUlOICAgJmZ0aW5pdF88Rk9STUFUPl9kcml2ZXJfY2hhaW4KKyAqCisgKiAgICNlbmRpZiAKKyAqIH0KKyAqCisgKiAgcmVwbGFjZSA8Rk9STUFUPiB3aXRoIHlvdXIgZHJpdmVyJ3MgcHJlZml4CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZmRlZiBGVElOSVRfRFJJVkVSX0NIQUlOCisKKyAgc3RhdGljCisgIGNvbnN0IEZUX0RyaXZlckNoYWluICBmdGluaXRfdDFfZHJpdmVyX2NoYWluID0KKyAgeworICAgIEZUX0lOSVRfTEFTVF9EUklWRVJfQ0hBSU4sCisgICAgJnQxX2RyaXZlcl9pbnRlcmZhY2UKKyAgfTsKKworI3VuZGVmICBGVF9JTklUX0xBU1RfRFJJVkVSX0NIQUlOCisjZGVmaW5lIEZUX0lOSVRfTEFTVF9EUklWRVJfQ0hBSU4gICAmZnRpbml0X3QxX2RyaXZlcl9jaGFpbgorCisjZW5kaWYgLyogRlRJTklUX0RSSVZFUl9DSEFJTiAqLyAKKworCisjZW5kaWYgLyogVDFEUklWRVJfSCAqLworCmRpZmYgLS1naXQgYS9zcmMvdHlwZTEvdDFlbmNvZGUuYyBiL3NyYy90eXBlMS90MWVuY29kZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljOTEwMjcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdHlwZTEvdDFlbmNvZGUuYwpAQCAtMCwwICsxLDMzMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgdDFlbmNvZGUuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIFR5cGUgMSBzdGFuZGFyZCBlbmNvZGluZyB0YWJsZXMgZGVmaW5pdGlvbnMgKGJvZHkpLiAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAxOTk2LTE5OTkgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCAgICAgICAgKi8KKy8qICBtb2RpZmllZCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgICovCisvKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLworLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KKy8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZpbGUgaXMgaW5jbHVkZWQgYnkgYm90aCB0aGUgVHlwZTEgYW5kIFR5cGUyIGRyaXZlci4gICAgICAgICAgICAgICovCisvKiAgSXQgc2hvdWxkIG5ldmVyIGJlIGNvbXBpbGVkIGRpcmVjdGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxmdG9ianMuaD4KKyNpbmNsdWRlIDx0MXR5cGVzLmg+CisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgdDFfc3RhbmRhcmRfc3RyaW5nczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICBUaGlzIGFycmF5IGNvbnRhaW5zIHRoZSBBZG9iZSBTdGFuZGFyZCBHbHlwaCBOYW1lcyBvcmRlcmVkIGJ5ICAgICAqLworICAvKiAgICAgU0lELiAgSXQgd2FzIHRha2VuIGZyb20gdGhlIENGRiBzcGVjaWZpY2F0aW9uLiAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIExPQ0FMX0ZVTkMKKyAgY29uc3QgVDFfU3RyaW5nKiAgdDFfc3RhbmRhcmRfc3RyaW5nc1tdID0KKyAgeworICAvKiAgIDAgKi8KKyAgICAiLm5vdGRlZiIsICJzcGFjZSIsICJleGNsYW0iLCAicXVvdGVkYmwiLCAibnVtYmVyc2lnbiIsCisgICAgImRvbGxhciIsICJwZXJjZW50IiwgImFtcGVyc2FuZCIsICJxdW90ZXJpZ2h0IiwgInBhcmVubGVmdCIsCisgIC8qICAxMCAqLworICAgICJwYXJlbnJpZ2h0IiwgImFzdGVyaXNrIiwgInBsdXMiLCAiY29tbWEiLCAiaHlwaGVuIiwKKyAgICAicGVyaW9kIiwgInNsYXNoIiwgInplcm8iLCAib25lIiwgInR3byIsCisgIC8qICAyMCAqLworICAgICJ0aHJlZSIsICJmb3VyIiwgImZpdmUiLCAic2l4IiwgInNldmVuIiwKKyAgICAiaGVpZ2h0IiwgIm5pbmUiLCAiY29sb24iLCAic2VtaWNvbG9uIiwgImxlc3MiLAorICAvKiAgMzAgKi8KKyAgICAiZXF1YWwiLCAiZ3JlYXRlciIsICJxdWVzdGlvbiIsICJhdCIsICJBIiwKKyAgICAiQiIsICJDIiwgIkQiLCAiRSIsICJGIiwKKyAgLyogIDQwICovCisgICAgIkciLCAiSCIsICJJIiwgIkoiLCAiSyIsCisgICAgIkwiLCAiTSIsICJOIiwgIk8iLCAiUCIsCisgIC8qICA1MCAqLworICAgICJRIiwgIlIiLCAiUyIsICJUIiwgIlUiLAorICAgICJWIiwgIlciLCAiWCIsICJZIiwgIloiLAorICAvKiAgNjAgKi8KKyAgICAiYnJhY2tldGxlZnQiLCAiYmFja3NsYXNoIiwgImJyYWNrZXRyaWdodCIsICJhc2NpaWNpcmN1bSIsICJ1bmRlcnNjb3JlIiwKKyAgICAicXVvdGVsZWZ0IiwgImEiLCAiYiIsICJjIiwgImQiLAorICAvKiAgNzAgKi8KKyAgICAiZSIsICJmIiwgImciLCAiaCIsICJpIiwKKyAgICAiaiIsICJrIiwgImwiLCAibSIsICJuIiwKKyAgLyogIDgwICovCisgICAgIm8iLCAicCIsICJxIiwgInIiLCAicyIsCisgICAgInQiLCAidSIsICJ2IiwgInciLCAieCIsCisgIC8qICA5MCAqLworICAgICJ5IiwgInoiLCAiYnJhY2VsZWZ0IiwgImJhciIsICJicmFjZXJpZ2h0IiwKKyAgICAiYXNjaWl0aWxkZSIsICJleGNsYW1kb3duIiwgImNlbnQiLCAic3RlcmxpbmciLCAiZnJhY3Rpb24iLAorICAvKiAxMDAgKi8KKyAgICAieWVuIiwgImZsb3JpbiIsICJzZWN0aW9uIiwgImN1cnJlbmN5IiwgInF1b3Rlc2luZ2xlIiwKKyAgICAicXVvdGVkYmxsZWZ0IiwgInF1aWxsZW1vdGxlZnQiLCAiZ3VpbHNpbmdsbGVmdCIsICJndWlsc2luZ2xyaWdodCIsICJmaSIsCisgIC8qIDExMCAqLworICAgICJmbCIsICJlbmRhc2giLCAiZGFnZ2VyIiwgImRhZ2dlcmRibCIsICJwZXJpb2RjZW50ZXIiLAorICAgICJwYXJhZ3JhcGgiLCAiYnVsbGV0IiwgInF1b3Rlc2luZ2xiYXNlIiwgInF1b3RlZGJsYmFzZSIsICJxdW90ZWRibHJpZ2h0IiwKKyAgLyogMTIwICovCisgICAgInF1aWxsZW1vdHJpZ2h0IiwgImVsbGlwc2lzIiwgInBlcnRob3VzYW5kIiwgInF1ZXN0aW9uZG93biIsICJncmF2ZSIsCisgICAgImFjdXRlIiwgImNpcmN1bWZsZXgiLCAidGlsZGUiLCAibWFjcm9uIiwgImJyZXZlIiwKKyAgLyogMTMwICovCisgICAgImRvdGFjY2VudCIsICJkaWVyZXNpcyIsICJyaW5nIiwgImNlZGlsbGEiLCAiaHVuZ2FydW1sYXV0IiwKKyAgICAib2dvbmVrIiwgImNhcm9uIiwgImVtZGFzaCIsICJBRSIsICJvcmRmZW1pbmluZSIsCisgIC8qIDE0MCAqLworICAgICJMc2xhc2giLCAiT3NsYXNoIiwgIk9FIiwgIm9yZG1hc2N1bGluZSIsICJhZSIsCisgICAiZG90bGVzc2kiLCAiSXNsYXNoIiwgIm9zbGFzaCIsICJvZSIsICJnZXJtYW5kYmxzIiwKKyAgLyogMTUwICovCisgICAgIm9uZXN1cGVyaW9yIiwgImxvZ2ljYWxub3QiLCAibXUiLCAidHJhZGVtYXJrIiwgIkV0aCIsCisgICAgIm9uZWhhbGYiLCAicGx1c21pbnVzIiwgIlRob3JuIiwgIm9uZXF1YXJ0ZXIiLCAiZGl2aWRlIiwKKyAgLyogMTYwICovCisgICAgImJyb2tlbmJhciIsICJkZWdyZWUiLCAidGhvcm4iLCAidGhyZWVxdWFydGVycyIsICJ0d29zdXBlcmlvciIsCisgICAgInJlZ2l0ZXJlZCIsICJtaW51cyIsICJldGgiLCAibXVsdGlwbHkiLCAidGhyZWVzdXBlcmlvciIsCisgIC8qIDE3MCAqLworICAgICJjb3B5cmlnaHQiLCAiQWFjdXRlIiwgIkFjaXJjdW1mbGV4IiwgIkFkaWVyZXNpcyIsICJBZ3JhdmUiLAorICAgICJBcmluZyIsICJBdGlsZGUiLCAiQ2NlZGlsbGEiLCAiRWFjdXRlIiwgIkVjaXJjdW1mbGV4IiwKKyAgLyogMTgwICovCisgICAgIkVkaWVyZXNpcyIsICJFZ3JhdmUiLCAiSWFjdXRlIiwgIkljaXJjdW1mbGV4IiwgIklkaWVyZXNpcyIsCisgICAgIklncmF2ZSIsICJOdGlsZGUiLCAiT2FjdXRlIiwgIk9jaXJjdW1mbGV4IiwgIk9kaWVyZXNpcyIsCisgIC8qIDE5MCAqLworICAgICJPZ3JhdmUiLCAiT3RpbGRlIiwgIlNjYXJvbiIsICJVYWN1dGUiLCAiVWNpcmN1bWZsZXgiLAorICAgICJVZGllcmVzaXMiLCAiVWdyYXZlIiwgIllhY3V0ZSIsICJZZGllcmVzaXMiLCAiWmNhcm9uIiwKKyAgLyogMjAwICovCisgICAgImFhY3V0ZSIsICJhY2lyY3VtZmxleCIsICJhZGllcmVzaXMiLCAiYWdyYXZlIiwgImFyaW5nIiwKKyAgICAiYXRpbGRlIiwgImNjZWRpbGxhIiwgImVhY3V0ZSIsICJlY2lyY3VtZmxleCIsICJlZGllcmVzaXMiLAorICAvKiAyMTAgKi8KKyAgICAiZWdyYXZlIiwgImlhY3V0ZSIsICJpY2lyY3VtZmxleCIsICJpZGllcmVzaXMiLCAiaWdyYXZlIiwKKyAgICAibnRpbGRlIiwgIm9hY3V0ZSIsICJvY2lyY3VtZmxleCIsICJvZGllcmVzaXMiLCAib2dyYXZlIiwKKyAgLyogMjIwICovCisgICAgIm90aWxkZSIsICJzY2Fyb24iLCAidWFjdXRlIiwgInVjaXJjdW1mbGV4IiwgInVkaWVyZXNpcyIsCisgICAgInVncmF2ZSIsICJ5YWN1dGUiLCAieWRpZXJlc2lzIiwgInpjYXJvbiIsICJleGNsYW1zbWFsbCIsCisgIC8qIDIzMCAqLworICAgICJIdW5nYXJ1bWxhdXRzbWFsbCIsICJkb2xsYXJvbGRzdHlsZSIsICJkb2xsYXJzdXBlcmlvciIsICJhbXBlcnNhbmRzbWFsbCIsCisgICAgICAiQWN1dGVzbWFsbCIsCisgICAgInBhcmVubGVmdHN1cGVyaW9yIiwgInBhcmVucmlnaHRzdXBlcmlvciIsICJ0d29kb3RlbmxlYWRlciIsCisgICAgICAib25lZG90ZW5sZWFkZXIiLCAiemVyb29sZHN0eWxlIiwKKyAgLyogMjQwICovCisgICAgIm9uZW9sZHN0eWxlIiwgInR3b29sZHN0eWxlIiwgInRocmVlb2xkc3R5bGUiLCAiZm91cm9sZHN0eWxlIiwKKyAgICAgICJmaXZlb2xkc3R5bGUiLAorICAgICJzaXhvbGRzdHlsZSIsICJzZXZlbm9sZHN0eWxlIiwgImVpZ2h0b2xkc3R5bGUiLCAibmluZW9sZHN0eWxlIiwKKyAgICAgICJjb21tYXN1cGVyaW9yIiwKKyAgLyogMjUwICovCisgICAgInRocmVlcXVhcnRlcnNlbWRhc2giLCAicGVyaW9kc3VwZXJpb3IiLCAicXVlc3Rpb25zbWFsbCIsICJhc3VwZXJpb3IiLAorICAgICAgImJzdXBlcmlvciIsCisgICAgImNlbnRzdXBlcmlvciIsICJkc3VwZXJpb3IiLCAiZXN1cGVyaW9yIiwgImlzdXBlcmlvciIsICJsc3VwZXJpb3IiLAorICAvKiAyNjAgKi8KKyAgICAibXN1cGVyaW9yIiwgIm5zdXBlcmlvciIsICJvc3VwZXJpb3IiLCAicnN1cGVyaW9yIiwgInNzdXBlcmlvciIsCisgICAgInRzdXBlcmlvciIsICJmZiIsICJmZmkiLCAiZmZsIiwgInBhcmVubGVmdGluZmVyaW9yIiwKKyAgLyogMjcwICovCisgICAgInBhcmVucmlnaHRpbmZlcmlvciIsICJDaXJjdW1mbGV4c21hbGwiLCAiaHlwaGVuc3VwZXJpb3IiLCAiR3JhdmVzbWFsbCIsCisgICAgICAiQXNtYWxsIiwKKyAgICAiQnNtYWxsIiwgIkNzbWFsbCIsICJEc21hbGwiLCAiRXNtYWxsIiwgIkZzbWFsbCIsCisgIC8qIDI4MCAqLworICAgICJHc21hbGwiLCAiSHNtYWxsIiwgIklzbWFsbCIsICJKc21hbGwiLCAiS3NtYWxsIiwKKyAgICAiTHNtYWxsIiwgIk1zbWFsbCIsICJOc21hbGwiLCAiT3NtYWxsIiwgIlBzbWFsbCIsCisgIC8qIDI5MCAqLworICAgICJRc21hbGwiLCAiUnNtYWxsIiwgIlNzbWFsbCIsICJUc21hbGwiLCAiVXNtYWxsIiwKKyAgICAiVnNtYWxsIiwgIldzbWFsbCIsICJYc21hbGwiLCAiWXNtYWxsIiwgIlpzbWFsbCIsCisgIC8qIDMwMCAqLworICAgICJjb2xvbm1vbmV0YXJ5IiwgIm9uZWZpdHRlZCIsICJydXBpYWgiLCAiVGlsZGVzbWFsbCIsICJleGNsYW1kb3duc21hbGwiLAorICAgICJjZW50b2xkc3R5bGUiLCAiTHNsYXNoc21hbGwiLCAiU2Nhcm9uc21hbGwiLCAiWmNhcm9uc21hbGwiLAorICAgICAgIkRpZXJlc2lzc21hbGwiLAorICAvKiAzMTAgKi8KKyAgICAiQnJldmVzbWFsbCIsICJDYXJvbnNtYWxsIiwgIkRvdGFjY2VudHNtYWxsIiwgIk1hY3JvbnNtYWxsIiwgImZpZ3VyZWRhc2giLAorICAgICJoeXBoZW5pbmZlcmlvciIsICJPZ29uZWtzbWFsbCIsICJSaW5nc21hbGwiLCAiQ2VkaWxsYXNtYWxsIiwKKyAgICAgICJxdWVzdGlvbmRvd25zbWFsbCIsCisgIC8qIDMyMCAqLworICAgICJvbmVlaWdodGgiLCAidGhyZWVlaWdodGhzIiwgImZpdmVlaWdodGhzIiwgInNldmVuZWlnaHRocyIsICJvbmV0aGlyZCIsCisgICAgInR3b3RoaXJkcyIsICJ6ZXJvc3VwZXJpb3IiLCAiZm91cnN1cGVyaW9yIiwgImZpdmVzdXBlcmlvciIsCisgICAgICAic2l4c3VwZXJpb3IiLAorICAvKiAzMzAgKi8KKyAgICAic2V2ZW5zdXBlcmlvciIsICJlaWdodHN1cGVyaW9yIiwgIm5pbmVzdXBlcmlvciIsICJ6ZXJvaW5mZXJpb3IiLAorICAgICAgIm9uZWluZmVyaW9yIiwKKyAgICAidHdvaW5mZXJpb3IiLCAidGhyZWVpbmZlcmlvciIsICJmb3VyaW5mZXJpb3IiLCAiZml2ZWluZmVyaW9yIiwKKyAgICAgICJzaXhpbmZlcmlvciIsCisgIC8qIDM0MCAqLworICAgICJzZXZlbmluZmVyaW9yIiwgImVpZ2h0aW5mZXJpb3IiLCAibmluZWluZmVyaW9yIiwgImNlbnRpbmZlcmlvciIsCisgICAgICAiZG9sbGFyaW5mZXJpb3IiLAorICAgICJwZXJpb2RpbmZlcmlvciIsICJjb21tYWluZmVyaW9yIiwgIkFncmF2ZXNtYWxsIiwgIkFhY3V0ZXNtYWxsIiwKKyAgICAgICJBY2lyY3VtZmxleHNtYWxsIiwKKyAgLyogMzUwICovCisgICAgIkF0aWxkZXNtYWxsIiwgIkFkaWVyZXNpc3NtYWxsIiwgIkFyaW5nc21hbGwiLCAiQUVzbWFsbCIsICJDY2VkaWxsYXNtYWxsIiwKKyAgICAiRWdyYXZlc21hbGwiLCAiRWFjdXRlc21hbGwiLCAiRWNpcmN1bWZsZXhzbWFsbCIsICJFZGllcmVzaXNzbWFsbCIsCisgICAgICAiSWdyYXZlc21hbGwiLAorICAvKiAzNjAgKi8KKyAgICAiSWFjdXRlc21hbGwiLCAiSWNpcmN1bWZsZXhzbWFsbCIsICJJZGllcmVzaXNzbWFsbCIsICJFdGhzbWFsbCIsCisgICAgICAiTnRpbGRlc21hbGwiLAorICAgICJPZ3JhdmVzbWFsbCIsICJPYWN1dGVzbWFsbCIsICJPY2lyY3VtZmxleHNtYWxsIiwgIk90aWxkZXNtYWxsIiwKKyAgICAgICJPZGllcmVzaXNzbWFsbCIsCisgIC8qIDM3MCAqLworICAgICJPRXNtYWxsIiwgIk9zbGFzaHNtYWxsIiwgIlVncmF2ZXNtYWxsIiwgIlVhY2F1dGVzbWFsbCIsCisgICAgICAiVWNpcmN1bWZsZXhzbWFsbCIsCisgICAgIlVkaWVyZXNpc3NtYWxsIiwgIllhY3V0ZXNtYWxsIiwgIlRob3Juc21hbGwiLCAiWWRpZXJlc2lzc21hbGwiLAorICAgICAgIjAwMS4wMDAiLAorICAvKiAzODAgKi8KKyAgICAiMDAxLjAwMSIsICIwMDEuMDAyIiwgIjAwMS4wMDMiLCAiQmxhY2siLCAiQm9sZCIsCisgICAgIkJvb2siLCAiTGlnaHQiLCAiTWVkaXVtIiwgIlJlZ3VsYXIiLCAiUm9tYW4iLAorICAvKiAzOTAgKi8KKyAgICAiU2VtaWJvbGQiCisgIH07CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICB0MV9zdGFuZGFyZF9lbmNvZGluZzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgIEEgc2ltcGxlIHRhYmxlIHVzZWQgdG8gZW5jb2RlIHRoZSBBZG9iZSBTdGFuZGFyZEVuY29kaW5nLiAgVGhlICAgICovCisgIC8qICAgICB0YWJsZSB2YWx1ZXMgYXJlIHRoZSBTSUQgb2YgdGhlIHN0YW5kYXJkIGdseXBoczsgdGhlIHRhYmxlIGluZGV4ICAqLworICAvKiAgICAgaXMgdGhlIGNoYXJhY3RlciBjb2RlIGZvciB0aGUgZW5jb2RpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICBFeGFtcGxlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgdDFfc3RhbmRhcmRfZW5jb2RpbmdbMzNdID09IDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgd2hpY2ggbWVhbnMgdGhhdCB0aGUgZ2x5cGggbmFtZSBmb3IgY2hhcmFjdGVyIGNvZGUgMzIgaXMgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgIHQxX3N0YW5kYXJkX3N0cmluZ3NbMl0gPT0gImV4Y2xhbSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICh0aGlzIGNvcnJlc3BvbmQgdG8gdGhlIGV4Y2xhbWF0aW9uIG1hcmsgYCEnKS4gICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBMT0NBTF9GVU5DCisgIFQxX1Nob3J0ICB0MV9zdGFuZGFyZF9lbmNvZGluZ1syNTZdID0KKyAgeworICAvKiAgIDAgKi8gCisgICAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLAorICAgICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKKyAgICAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCisgICAgICAwLCAgIDAsICAgMSwgICAyLCAgIDMsICAgNCwgICA1LCAgIDYsICAgNywgICA4LAorICAgICAgOSwgIDEwLCAgMTEsICAxMiwgIDEzLCAgMTQsICAxNSwgIDE2LCAgMTcsICAxOCwKKyAgLyogIDUwICovCisgICAgIDE5LCAgMjAsICAyMSwgIDIyLCAgMjMsICAyNCwgIDI1LCAgMjYsICAyNywgIDI4LAorICAgICAyOSwgIDMwLCAgMzEsICAzMiwgIDMzLCAgMzQsICAzNSwgIDM2LCAgMzcsICAzOCwKKyAgICAgMzksICA0MCwgIDQxLCAgNDIsICA0MywgIDQ0LCAgNDUsICA0NiwgIDQ3LCAgNDgsCisgICAgIDQ5LCAgNTAsICA1MSwgIDUyLCAgNTMsICA1NCwgIDU1LCAgNTYsICA1NywgIDU4LAorICAgICA1OSwgIDYwLCAgNjEsICA2MiwgIDYzLCAgNjQsICA2NSwgIDY2LCAgNjcsICA2OCwKKyAgLyogMTAwICovCisgICAgIDY5LCAgNzAsICA3MSwgIDcyLCAgNzMsICA3NCwgIDc1LCAgNzYsICA3NywgIDc4LAorICAgICA3OSwgIDgwLCAgODEsICA4MiwgIDgzLCAgODQsICA4NSwgIDg2LCAgODcsICA4OCwKKyAgICAgODksICA5MCwgIDkxLCAgOTIsICA5MywgIDk0LCAgOTUsICAgMCwgICAwLCAgIDAsCisgICAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLAorICAgICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKKyAgLyogMTUwICovCisgICAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLAorICAgICAgMCwgIDk2LCAgOTcsICA5OCwgIDk5LCAxMDAsIDEwMSwgMTAyLCAxMDMsIDEwNCwKKyAgICAxMDUsIDEwNiwgMTA3LCAxMDgsIDEwOSwgMTEwLCAgIDAsIDExMSwgMTEyLCAxMTMsCisgICAgMTE0LCAgIDAsIDExNSwgMTE2LCAxMTcsIDExOCwgMTE5LCAxMjAsIDEyMSwgMTIyLAorICAgICAgMCwgMTIzLCAgIDAsIDEyNCwgMTI1LCAxMjYsIDEyNywgMTI4LCAxMjksIDEzMCwKKyAgLyogMjAwICovCisgICAgMTMxLCAgIDAsIDEzMiwgMTMzLCAgIDAsIDEzNCwgMTM1LCAxMzYsIDEzNywgICAwLAorICAgICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKKyAgICAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgMTM4LCAgIDAsIDEzOSwgICAwLCAgIDAsCisgICAgICAwLCAgIDAsIDE0MCwgMTQxLCAxNDIsIDE0MywgICAwLCAgIDAsICAgMCwgICAwLAorICAgICAgMCwgMTQ0LCAgIDAsICAgMCwgICAwLCAxNDUsICAgMCwgICAwLCAxNDYsIDE0NywKKyAgLyogMjUwICovCisgICAgMTQ4LCAxNDksICAgMCwgICAwLCAgIDAsICAgMAorICB9OworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgdDFfZXhwZXJ0X2VuY29kaW5nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICBBIHNpbXBsZSB0YWJsZSB1c2VkIHRvIGVuY29kZSB0aGUgQWRvYmUgRXhwZXJ0RW5jb2RpbmcuICBUaGUgICAgICAqLworICAvKiAgICAgdGFibGUgdmFsdWVzIGFyZSB0aGUgU0lEIG9mIHRoZSBzdGFuZGFyZCBnbHlwaHM7IHRoZSB0YWJsZSBpbmRleCAgKi8KKyAgLyogICAgIGlzIHRoZSBjaGFyYWN0ZXIgY29kZSBmb3IgdGhlIGVuY29kaW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgRXhhbXBsZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgIHQxX2V4cGVydF9lbmNvZGluZ1szM10gPT0gMjI5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgIHdoaWNoIG1lYW5zIHRoYXQgdGhlIGdseXBoIG5hbWUgZm9yIGNoYXJhY3RlciBjb2RlIDMyIGlzICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICB0MV9zdGFuZGFyZF9zdHJpbmdzWzIyOV0gPT0gImV4Y2xhbXNtYWxsIiAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIExPQ0FMX0ZVTkMKKyAgVDFfU2hvcnQgIHQxX2V4cGVydF9lbmNvZGluZ1syNTZdID0KKyAgeworICAvKiAgIDAgKi8KKyAgICAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCisgICAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLAorICAgICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKKyAgICAgIDAsICAgMCwgICAxLCAyMjksIDIzMCwgICAwLCAyMzEsIDIzMiwgMjMzLCAyMzQsCisgICAgMjM1LCAyMzYsIDIzNywgMjM4LCAgMTMsICAxNCwgIDE1LCAgOTksIDIzOSwgMjQwLAorICAvKiAgNTAgKi8KKyAgICAyNDEsIDI0MiwgMjQzLCAyNDQsIDI0NSwgMjQ2LCAyNDcsIDI0OCwgIDI3LCAgMjgsCisgICAgMjQ5LCAyNTAsIDI1MSwgMjUyLCAgIDAsIDI1MywgMjU0LCAyNTUsIDI1NiwgMjU3LAorICAgICAgMCwgICAwLCAgIDAsIDI1OCwgICAwLCAgIDAsIDI1OSwgMjYwLCAyNjEsIDI2MiwKKyAgICAgIDAsICAgMCwgMjYzLCAyNjQsIDI2NSwgICAwLCAyNjYsIDEwOSwgMTEwLCAyNjcsCisgICAgMjY4LCAyNjksICAgMCwgMjcwLCAyNzEsIDI3MiwgMjczLCAyNzQsIDI3NSwgMjc2LAorICAvKiAxMDAgKi8KKyAgICAyNzcsIDI3OCwgMjc5LCAyODAsIDI4MSwgMjgyLCAyODMsIDI4NCwgMjg1LCAyODYsCisgICAgMjg3LCAyODgsIDI4OSwgMjkwLCAyOTEsIDI5MiwgMjkzLCAyOTQsIDI5NSwgMjk2LAorICAgIDI5NywgMjk4LCAyOTksIDMwMCwgMzAxLCAzMDIsIDMwMywgICAwLCAgIDAsICAgMCwKKyAgICAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCisgICAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLAorICAvKiAxNTAgKi8KKyAgICAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCisgICAgICAwLCAzMDQsIDMwNSwgMzA2LCAgIDAsICAgMCwgMzA3LCAzMDgsIDMwOSwgMzEwLAorICAgIDMxMSwgICAwLCAzMTIsICAgMCwgICAwLCAzMTIsICAgMCwgICAwLCAzMTQsIDMxNSwKKyAgICAgIDAsICAgMCwgMzE2LCAzMTcsIDMxOCwgICAwLCAgIDAsICAgMCwgMTU4LCAxNTUsCisgICAgMTYzLCAzMTksIDMyMCwgMzIxLCAzMjIsIDMyMywgMzI0LCAzMjUsICAgMCwgICAwLAorICAvKiAyMDAgKi8KKyAgICAzMjYsIDE1MCwgMTY0LCAxNjksIDMyNywgMzI4LCAzMjksIDMzMCwgMzMxLCAzMzIsCisgICAgMzMzLCAzMzQsIDMzNSwgMzM2LCAzMzcsIDMzOCwgMzM5LCAzNDAsIDM0MSwgMzQyLAorICAgIDM0MywgMzQ0LCAzNDUsIDM0NiwgMzQ3LCAzNDgsIDM0OSwgMzUwLCAzNTEsIDM1MiwKKyAgICAzNTMsIDM1NCwgMzU1LCAzNTYsIDM1NywgMzU4LCAzNTksIDM2MCwgMzYxLCAzNjIsCisgICAgMzYzLCAzNjQsIDM2NSwgMzY2LCAzNjcsIDM2OCwgMzY5LCAzNzAsIDM3MSwgMzcyLAorICAvKiAyNTAgKi8KKyAgICAzNzMsIDM3NCwgMzc1LCAzNzYsIDM3NywgMzc4CisgIH07CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICB0MV9leHBlcnRfc3Vic2V0X2VuY29kaW5nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgIEEgc2ltcGxlIHRhYmxlIHVzZWQgdG8gZW5jb2RlIHRoZSBBZG9iZSBFeHBlcnRFbmNvZGluZyBzdWJzZXQgICAgICovCisgIC8qICAgICBkZWZpbmVkIGluIHRoZSBDRkYgc3BlY2lmaWNhdGlvbi4gIEl0IHdpbGwgcHJvYmFibHkgZXZvbHZlIGludG8gICAqLworICAvKiAgICAgYW5vdGhlciBmb3JtIHNvb25lciBvciBsYXRlciwgYXMgd2UgZGVhbCB3aXRoIGNoYXJzZXRzICAgICAgICAgICAgKi8KKyAgLyogICAgIGRpZmZlcmVudGx5IHRoYW4gd2l0aCBlbmNvZGluZ3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBMT0NBTF9GVU5DCisgIEZUX1Nob3J0ICB0MV9leHBlcnRfc3Vic2V0X2VuY29kaW5nWzI1Nl0gPQorICB7CisgIC8qICAgMCAqLworICAgICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKKyAgICAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCisgICAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLAorICAgICAgMCwgICAwLCAgIDEsICAgMCwgICAwLCAgIDAsIDIzMSwgMjMyLCAgIDAsICAgMCwKKyAgICAyMzUsIDIzNiwgMjM3LCAyMzgsICAxMywgIDE0LCAgMTUsICA5OSwgMjM5LCAyNDAsCisgIC8qICA1MCAqLworICAgIDI0MSwgMjQyLCAyNDMsIDI0NCwgMjQ1LCAyNDYsIDI0NywgMjQ4LCAgMjcsICAyOCwKKyAgICAyNDksIDI1MCwgMjUxLCAyNTIsICAgMCwgMjUzLCAyNTQsIDI1NSwgMjU2LCAyNTcsCisgICAgICAwLCAgIDAsICAgMCwgMjU4LCAgIDAsICAgMCwgMjU5LCAyNjAsIDI2MSwgMjYyLAorICAgICAgMCwgICAwLCAyNjMsIDI2NCwgMjY1LCAgIDAsIDI2NiwgMTA5LCAxMTAsIDI2NywKKyAgICAyNjgsIDI2OSwgICAwLCAyNzAsICAgMCwgMjcyLCAgIDAsICAgMCwgICAwLCAgIDAsCisgIC8qIDEwMCAqLworICAgICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKKyAgICAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCisgICAgICAwLCAgIDAsICAgMCwgMzAwLCAzMDEsIDMwMiwgMzAzLCAgIDAsICAgMCwgICAwLAorICAgICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKKyAgICAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCisgIC8qIDE1MCAqLworICAgICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKKyAgICAgIDAsIDMwNCwgMzA1LCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCisgICAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsIDMxNCwgMzE1LAorICAgICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAxNTgsIDE1NSwKKyAgICAxNjMsICAgMCwgMzIwLCAzMjEsIDMyMiwgMzIzLCAzMjQsIDMyNSwgICAwLCAgIDAsCisgIC8qIDIwMCAqLworICAgIDMyNiwgMTUwLCAxNjQsIDE2OSwgMzI3LCAzMjgsIDMyOSwgMzMwLCAzMzEsIDMzMiwKKyAgICAzMzMsIDMzNCwgMzM1LCAzMzYsIDMzNywgMzM4LCAzMzksIDM0MCwgMzQxLCAzNDIsCisgICAgMzQzLCAzNDQsIDM0NSwgMzQ2LCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLAorICAgICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKKyAgICAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCisgIC8qIDI1MCAqLworICAgICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAKKyAgfTsKKworCisvKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy90eXBlMS90MWVuY29kZS5oIGIvc3JjL3R5cGUxL3QxZW5jb2RlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGE1NWFjZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90eXBlMS90MWVuY29kZS5oCkBAIC0wLDAgKzEsOTggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHQxZW5jb2RlLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBUeXBlIDEgc3RhbmRhcmQgZW5jb2RpbmcgdGFibGVzIGRlZmluaXRpb25zIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMTk5Ni0xOTk5IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQgICAgICAgICovCisvKiAgbW9kaWZpZWQgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICAqLworLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KKy8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCisvKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmaWxlIGlzIGluY2x1ZGVkIGJ5IGJvdGggdGhlIFR5cGUxIGFuZCBUeXBlMiBkcml2ZXIuICAgICAgICAgICAgICAqLworLyogIEl0IHNob3VsZCBuZXZlciBiZSBjb21waWxlZCBkaXJlY3RseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNpZm5kZWYgVDFFTkNPREVfSAorI2RlZmluZSBUMUVOQ09ERV9ICisKKyNpbmNsdWRlIDx0MXR5cGVzLmg+CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICB0MV9zdGFuZGFyZF9zdHJpbmdzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgIFRoaXMgYXJyYXkgY29udGFpbnMgdGhlIEFkb2JlIFN0YW5kYXJkIEdseXBoIE5hbWVzIG9yZGVyZWQgYnkgICAgICovCisgIC8qICAgICBTSUQuICBJdCB3YXMgdGFrZW4gZnJvbSB0aGUgQ0ZGIHNwZWNpZmljYXRpb24uICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgTE9DQUxfREVGCisgIGNvbnN0IFQxX1N0cmluZyogIHQxX3N0YW5kYXJkX3N0cmluZ3NbXTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogIHQxX3N0YW5kYXJkX2VuY29kaW5nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgQSBzaW1wbGUgdGFibGUgdXNlZCB0byBlbmNvZGUgdGhlIEFkb2JlIFN0YW5kYXJkRW5jb2RpbmcuICBUaGUgICAgKi8KKyAgLyogICAgIHRhYmxlIHZhbHVlcyBhcmUgdGhlIFNJRCBvZiB0aGUgc3RhbmRhcmQgZ2x5cGhzOyB0aGUgdGFibGUgaW5kZXggICovCisgIC8qICAgICBpcyB0aGUgY2hhcmFjdGVyIGNvZGUgZm9yIHRoZSBlbmNvZGluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgIEV4YW1wbGU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICB0MV9zdGFuZGFyZF9lbmNvZGluZ1szM10gPT0gMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICB3aGljaCBtZWFucyB0aGF0IHRoZSBnbHlwaCBuYW1lIGZvciBjaGFyYWN0ZXIgY29kZSAzMiBpcyAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgdDFfc3RhbmRhcmRfc3RyaW5nc1syXSA9PSAiZXhjbGFtIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgKHRoaXMgY29ycmVzcG9uZCB0byB0aGUgZXhjbGFtYXRpb24gbWFyayBgIScpLiAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIExPQ0FMX0RFRgorICBUMV9TaG9ydCAgdDFfc3RhbmRhcmRfZW5jb2RpbmdbMjU2XTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogIHQxX2V4cGVydF9lbmNvZGluZzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgQSBzaW1wbGUgdGFibGUgdXNlZCB0byBlbmNvZGUgdGhlIEFkb2JlIEV4cGVydEVuY29kaW5nLiAgVGhlICAgICAgKi8KKyAgLyogICAgIHRhYmxlIHZhbHVlcyBhcmUgdGhlIFNJRCBvZiB0aGUgc3RhbmRhcmQgZ2x5cGhzOyB0aGUgdGFibGUgaW5kZXggICovCisgIC8qICAgICBpcyB0aGUgY2hhcmFjdGVyIGNvZGUgZm9yIHRoZSBlbmNvZGluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgIEV4YW1wbGU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICB0MV9leHBlcnRfZW5jb2RpbmdbMzNdID09IDIyOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICB3aGljaCBtZWFucyB0aGF0IHRoZSBnbHlwaCBuYW1lIGZvciBjaGFyYWN0ZXIgY29kZSAzMiBpcyAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgdDFfc3RhbmRhcmRfc3RyaW5nc1syMjldID09ICJleGNsYW1zbWFsbCIgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBMT0NBTF9ERUYKKyAgVDFfU2hvcnQgIHQxX2V4cGVydF9lbmNvZGluZ1syNTZdOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgdDFfZXhwZXJ0X3N1YnNldF9lbmNvZGluZzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICBBIHNpbXBsZSB0YWJsZSB1c2VkIHRvIGVuY29kZSB0aGUgQWRvYmUgRXhwZXJ0RW5jb2Rpbmcgc3Vic2V0ICAgICAqLworICAvKiAgICAgZGVmaW5lZCBpbiB0aGUgQ0ZGIHNwZWNpZmljYXRpb24uICBJdCB3aWxsIHByb2JhYmx5IGV2b2x2ZSBpbnRvICAgKi8KKyAgLyogICAgIGFub3RoZXIgZm9ybSBzb29uZXIgb3IgbGF0ZXIsIGFzIHdlIGRlYWwgd2l0aCBjaGFyc2V0cyAgICAgICAgICAgICovCisgIC8qICAgICBkaWZmZXJlbnRseSB0aGFuIHdpdGggZW5jb2RpbmdzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgTE9DQUxfREVGCisgIFQxX1Nob3J0ICB0MV9leHBlcnRfc3Vic2V0X2VuY29kaW5nWzI1Nl07CisKKworI2VuZGlmIC8qIFQxRU5DT0RFX0ggKi8KKworCisvKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy90eXBlMS90MWVycm9ycy5oIGIvc3JjL3R5cGUxL3QxZXJyb3JzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFmNWU0YQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90eXBlMS90MWVycm9ycy5oCkBAIC0wLDAgKzEsNzcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIHQxZXJyb3JzLmgKKyAqCisgKiAgICBUeXBlMSBFcnJvciBJRCBkZWZpbml0aW9ucworICoKKyAqICBDb3B5cmlnaHQgMTk5Ni0xOTk4IGJ5CisgKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQKKyAqICBtb2RpZmllZCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgRlJFRVRZUEVfSAorI2Vycm9yICJEb24ndCBpbmNsdWRlIHRoaXMgZmlsZSEgVXNlIHQxZHJpdmVyLmggaW5zdGVhZC4iCisjZW5kaWYKKworI2lmbmRlZiBUMUVSUk9SU19ICisjZGVmaW5lIFQxRVJST1JTX0gKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqIGVycm9yIGNvZGVzIGRlY2xhcmF0aW9uICoqKioqKioqKioqKioqLworCisgIC8qIFRoZSBlcnJvciBjb2RlcyBhcmUgZ3JvdXBlZCBpbiAnY2xhc3NlcycgdXNlZCB0byBpbmRpY2F0ZSB0aGUgKi8KKyAgLyogJ2xldmVsJyBhdCB3aGljaCB0aGUgZXJyb3IgaGFwcGVuZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBUaGUgY2xhc3MgaXMgZ2l2ZW4gYnkgYW4gZXJyb3IgY29kZSdzIGhpZ2ggYnl0ZS4gICAgICAgICAgICAgICovCisKKworLyogLS0tLS0tLS0tLS0tLSBTdWNjZXNzIGlzIGFsd2F5cyAwIC0tLS0tLS0tICovCisKKyNkZWZpbmUgIFQxX0Vycl9PayAgICAgICAgICAgICAgICAgICAgICAgRlRfRXJyX09rCisKKy8qIC0tLS0tLS0tLS0tIGhpZ2ggbGV2ZWwgQVBJIGVycm9ycyAtLS0tLS0tLSAqLworICAKKyNkZWZpbmUgIFQxX0Vycl9JbnZhbGlkX0ZpbGVfRm9ybWF0ICAgICAgRlRfRXJyX0ludmFsaWRfRmlsZV9Gb3JtYXQKKyNkZWZpbmUgIFQxX0Vycl9JbnZhbGlkX0FyZ3VtZW50ICAgICAgICAgRlRfRXJyX0ludmFsaWRfQXJndW1lbnQKKyNkZWZpbmUgIFQxX0Vycl9JbnZhbGlkX0RyaXZlcl9IYW5kbGUgICAgRlRfRXJyX0ludmFsaWRfRHJpdmVyX0hhbmRsZQorI2RlZmluZSAgVDFfRXJyX0ludmFsaWRfRmFjZV9IYW5kbGUgICAgICBGVF9FcnJfSW52YWxpZF9GYWNlX0hhbmRsZQorI2RlZmluZSAgVDFfRXJyX0ludmFsaWRfU2l6ZV9IYW5kbGUgICAgICBGVF9FcnJfSW52YWxpZF9TaXplX0hhbmRsZQorI2RlZmluZSAgVDFfRXJyX0ludmFsaWRfR2x5cGhfSGFuZGxlICAgICBGVF9FcnJfSW52YWxpZF9TbG90X0hhbmRsZQorI2RlZmluZSAgVDFfRXJyX0ludmFsaWRfQ2hhck1hcF9IYW5kbGUgICBGVF9FcnJfSW52YWxpZF9DaGFyTWFwX0hhbmRsZQorI2RlZmluZSAgVDFfRXJyX0ludmFsaWRfR2x5cGhfSW5kZXggICAgICBGVF9FcnJfSW52YWxpZF9HbHlwaF9JbmRleAorCisjZGVmaW5lICBUMV9FcnJfVW5pbXBsZW1lbnRlZF9GZWF0dXJlICAgIEZUX0Vycl9VbmltcGxlbWVudGVkX0ZlYXR1cmUKKyNkZWZpbmUgIFQxX0Vycl9VbmF2YWlsYWJsZV9PdXRsaW5lICAgICAgRlRfRXJyX1VuYXZhaWxhYmxlX091dGxpbmUKKyNkZWZpbmUgIFQxX0Vycl9VbmF2YWlsYWJsZV9CaXRtYXAgICAgICAgRlRfRXJyX1VuYXZhaWxhYmxlX0JpdG1hcAorI2RlZmluZSAgVDFfRXJyX1VuYXZhaWxhYmxlX1BpeG1hcCAgICAgICBGVF9FcnJfVW5hdmFpbGFibGVfUGl4bWFwCisjZGVmaW5lICBUMV9FcnJfRmlsZV9Jc19Ob3RfQ29sbGVjdGlvbiAgIEZUX0Vycl9GaWxlX0lzX05vdF9Db2xsZWN0aW9uCisKKyNkZWZpbmUgIFQxX0Vycl9JbnZhbGlkX0VuZ2luZSAgICAgICAgICAgRlRfRXJyX0ludmFsaWRfRHJpdmVyX0hhbmRsZQorCisvKiAtLS0tLS0tLS0tLS0tIGludGVybmFsIGVycm9ycyAtLS0tLS0tLS0tLS0gKi8KKyAgCisjZGVmaW5lICBUMV9FcnJfT3V0X09mX01lbW9yeSAgICAgICAgICAgIEZUX0Vycl9PdXRfT2ZfTWVtb3J5CisjZGVmaW5lICBUMV9FcnJfVW5saXN0ZWRfT2JqZWN0ICAgICAgICAgIEZUX0Vycl9Vbmxpc3RlZF9PYmplY3QKKworLyogLS0tLS0tLS0tLS0tIGdlbmVyYWwgZ2x5cGggb3V0bGluZSBlcnJvcnMgLS0tLS0tICovCisKKyNkZWZpbmUgIFQxX0Vycl9Ub29fTWFueV9Qb2ludHMgICAgICAgICAgRlRfRXJyX1Rvb19NYW55X1BvaW50cworI2RlZmluZSAgVDFfRXJyX1Rvb19NYW55X0NvbnRvdXJzICAgICAgICBGVF9FcnJfVG9vX01hbnlfQ29udG91cnMKKyNkZWZpbmUgIFQxX0Vycl9Ub29fTWFueV9IaW50cyAgICAgICAgICAgRlRfRXJyX1Rvb19NYW55X0hpbnRzCisjZGVmaW5lICBUMV9FcnJfSW52YWxpZF9Db21wb3NpdGUgICAgICAgIEZUX0Vycl9JbnZhbGlkX0NvbXBvc2l0ZQorI2RlZmluZSAgVDFfRXJyX1Rvb19NYW55X0VkZ2VzICAgICAgICAgICBGVF9FcnJfVG9vX01hbnlfRWRnZXMKKyNkZWZpbmUgIFQxX0Vycl9Ub29fTWFueV9TdHJva2VzICAgICAgICAgRlRfRXJyX1Rvb19NYW55X1N0cm9rZXMKKworCisjZGVmaW5lICBUMV9FcnJfU3ludGF4X0Vycm9yICAgICAgICAgICAgIEZUX0Vycl9JbnZhbGlkX0ZpbGVfRm9ybWF0CisjZGVmaW5lICBUMV9FcnJfU3RhY2tfVW5kZXJmbG93ICAgICAgICAgIEZUX0Vycl9JbnZhbGlkX0ZpbGVfRm9ybWF0CisjZGVmaW5lICBUMV9FcnJfU3RhY2tfT3ZlcmZsb3cgICAgICAgICAgIEZUX0Vycl9JbnZhbGlkX0ZpbGVfRm9ybWF0CisKKyNlbmRpZiAvKiBUREVSUk9SU19IICovCisKKworLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvdHlwZTEvdDFnbG9hZC5jIGIvc3JjL3R5cGUxL3QxZ2xvYWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2ZiZmRjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3R5cGUxL3QxZ2xvYWQuYwpAQCAtMCwwICsxLDE1NzkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIHQxZ2xvYWQuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMAorICoKKyAqICAgIFR5cGUxIEdseXBoIExvYWRlci4KKyAqCisgKiAgQ29weXJpZ2h0IDE5OTYtMTk5OSBieQorICogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkCisgKiAgbW9kaWZpZWQgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8dDFnbG9hZC5oPgorI2luY2x1ZGUgPGZ0ZGVidWcuaD4KKyNpbmNsdWRlIDx0MWVuY29kZS5oPgorI2luY2x1ZGUgPGZ0c3RyZWFtLmg+CisKKyNpZm5kZWYgVDFfQ09ORklHX09QVElPTl9ESVNBQkxFX0hJTlRFUgorI2luY2x1ZGUgPHQxaGludGVyLmg+CisjZW5kaWYKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKi8KKyAgLyoqKioqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKiovCisgIC8qKioqKioqKioqICAgICAgICAgICBHRU5FUklDIENIQVJTVFJJTkdTIFBBUlNJTkcgICAgICAgICAgICAgKioqKioqKioqLworICAvKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKi8KKyAgLyoqKioqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiA8RnVuY3Rpb24+CisgKiAgICBUMV9Jbml0X0J1aWxkZXIKKyAqCisgKiA8RGVzY3JpcHRpb24+CisgKiAgICBJbml0aWFsaXNlIGEgZ2l2ZW4gZ2x5cGggYnVpbGRlci4KKyAqCisgKiA8SW5wdXQ+CisgKiAgICBidWlsZGVyIDo6IGdseXBoIGJ1aWxkZXIgdG8gaW5pdGlhbGlzZQorICogICAgZmFjZSAgICA6OiBjdXJyZW50IGZhY2Ugb2JqZWN0CisgKiAgICBzaXplICAgIDo6IGN1cnJlbnQgc2l6ZSBvYmplY3QKKyAqICAgIGdseXBoICAgOjogY3VycmVudCBnbHlwaCBvYmplY3QKKyAqICAgIGZ1bmNzICAgOjogZ2x5cGggYnVpbGRlciBmdW5jdGlvbnMgKG9yICJtZXRob2RzIikuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICBFWFBPUlRfRlVOQworICB2b2lkICBUMV9Jbml0X0J1aWxkZXIoIFQxX0J1aWxkZXIqICAgICAgICAgICAgIGJ1aWxkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgVDFfRmFjZSAgICAgICAgICAgICAgICAgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBUMV9TaXplICAgICAgICAgICAgICAgICBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgIFQxX0dseXBoU2xvdCAgICAgICAgICAgIGdseXBoLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQxX0J1aWxkZXJfRnVuY3MqIGZ1bmNzICkKKyAgeworICAgIGJ1aWxkZXItPmZ1bmNzICAgICAgID0gKmZ1bmNzOworICAgIGJ1aWxkZXItPnBhdGhfYmVndW4gID0gMDsKKyAgICBidWlsZGVyLT5sb2FkX3BvaW50cyA9IDE7CisKKyAgICBidWlsZGVyLT5mYWNlICAgPSBmYWNlOworICAgIGJ1aWxkZXItPnNpemUgICA9IHNpemU7CisgICAgYnVpbGRlci0+Z2x5cGggID0gZ2x5cGg7CisgICAgYnVpbGRlci0+bWVtb3J5ID0gZmFjZS0+cm9vdC5tZW1vcnk7CisKKyAgICBpZiAoZ2x5cGgpCisgICAgeworICAgICAgYnVpbGRlci0+YmFzZSAgICAgICAgID0gZ2x5cGgtPnJvb3Qub3V0bGluZTsKKyAgICAgIGJ1aWxkZXItPm1heF9wb2ludHMgICA9IGdseXBoLT5tYXhfcG9pbnRzOworICAgICAgYnVpbGRlci0+bWF4X2NvbnRvdXJzID0gZ2x5cGgtPm1heF9jb250b3VyczsKKyAgICB9CisKKyAgICBpZiAoc2l6ZSkKKyAgICB7CisgICAgICBidWlsZGVyLT5zY2FsZV94ID0gc2l6ZS0+cm9vdC5tZXRyaWNzLnhfc2NhbGU7CisgICAgICBidWlsZGVyLT5zY2FsZV95ID0gc2l6ZS0+cm9vdC5tZXRyaWNzLnlfc2NhbGU7CisgICAgfQorCisgICAgYnVpbGRlci0+cG9zX3ggPSAwOworICAgIGJ1aWxkZXItPnBvc195ID0gMDsKKworICAgIGJ1aWxkZXItPmxlZnRfYmVhcmluZy54ID0gMDsKKyAgICBidWlsZGVyLT5sZWZ0X2JlYXJpbmcueSA9IDA7CisgICAgYnVpbGRlci0+YWR2YW5jZS54ICAgICAgPSAwOworICAgIGJ1aWxkZXItPmFkdmFuY2UueSAgICAgID0gMDsKKworICAgIGJ1aWxkZXItPmJhc2Uubl9wb2ludHMgICA9IDA7CisgICAgYnVpbGRlci0+YmFzZS5uX2NvbnRvdXJzID0gMDsKKyAgICBidWlsZGVyLT5jdXJyZW50ICAgICAgICAgPSBidWlsZGVyLT5iYXNlOworCisgICAgYnVpbGRlci0+cGFzcyAgICAgICA9IDA7CisgICAgYnVpbGRlci0+aGludF9wb2ludCA9IDA7CisgIH0KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogPEZ1bmN0aW9uPgorICogICAgVDFfRG9uZV9CdWlsZGVyCisgKgorICogPERlc2NyaXB0aW9uPgorICogICAgRmluYWxpc2UgYSBnaXZlbiBnbHlwaCBidWlsZGVyLiBJdHMgY29udGVudCBjYW4gc3RpbGwgYmUKKyAqICAgIHVzZWQgYWZ0ZXIgdGhlIGNhbGwsIGJ1dCB0aGUgZnVuY3Rpb24gc2F2ZXMgaW1wb3J0YW50IGluZm9ybWF0aW9uCisgKiAgICB3aXRoaW4gdGhlIGNvcnJlc3BvbmRpbmcgZ2x5cGggc2xvdC4KKyAqCisgKiA8SW5wdXQ+CisgKiAgICBidWlsZGVyIDo6IGdseXBoIGJ1aWxkZXIgdG8gaW5pdGlhbGlzZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgRVhQT1JUX0ZVTkMKKyAgdm9pZCBUMV9Eb25lX0J1aWxkZXIoIFQxX0J1aWxkZXIqICBidWlsZGVyICkKKyAgeworICAgIFQxX0dseXBoU2xvdCAgZ2x5cGggPSBidWlsZGVyLT5nbHlwaDsKKworICAgIGlmIChnbHlwaCkKKyAgICB7CisgICAgICBnbHlwaC0+cm9vdC5vdXRsaW5lID0gYnVpbGRlci0+YmFzZTsKKyAgICAgIGdseXBoLT5tYXhfcG9pbnRzICAgPSBidWlsZGVyLT5tYXhfcG9pbnRzOworICAgICAgZ2x5cGgtPm1heF9jb250b3VycyA9IGJ1aWxkZXItPm1heF9jb250b3VyczsKKyAgICB9CisgIH0KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiA8RnVuY3Rpb24+CisgKiAgICBUMV9Jbml0X0RlY29kZXIKKyAqCisgKiA8RGVzY3JpcHRpb24+CisgKiAgICBJbml0aWFsaXNlIGEgZ2l2ZW4gVHlwZSAxIGRlY29kZXIgZm9yIHBhcnNpbmcKKyAqCisgKiA8SW5wdXQ+CisgKiAgICBkZWNvZGVyIDo6IFR5cGUgMSBkZWNvZGVyIHRvIGluaXRpYWxpc2UKKyAqICAgIGZ1bmNzICAgOjogaGludGVyIGZ1bmN0aW9ucyBpbnRlcmZhY2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIEVYUE9SVF9GVU5DCisgIHZvaWQgIFQxX0luaXRfRGVjb2RlciggVDFfRGVjb2RlciogICAgICAgICAgICAgZGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMV9IaW50ZXJfRnVuY3MqICBmdW5jcyApCisgIHsKKyAgICBkZWNvZGVyLT5oaW50ZXIgPSAqZnVuY3M7ICAgIC8qIGNvcHkgaGludGVyIGludGVyZmFjZSAqLworICAgIGRlY29kZXItPnRvcCAgICA9IDA7CisgICAgZGVjb2Rlci0+em9uZSAgID0gMDsKKworICAgIGRlY29kZXItPmZsZXhfc3RhdGUgICAgICAgPSAwOworICAgIGRlY29kZXItPm51bV9mbGV4X3ZlY3RvcnMgPSAwOworCisgICAgLyogQ2xlYXIgbG9hZGVyICovCisgICAgTUVNX1NldCggJmRlY29kZXItPmJ1aWxkZXIsIDAsIHNpemVvZihkZWNvZGVyLT5idWlsZGVyKSApOworICB9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIDxGdW5jdGlvbj4KKyAqICAgIGxvb2t1cF9nbHlwaF9ieV9zdGRjaGFyY29kZQorICoKKyAqIDxEZXNjcmlwdGlvbj4KKyAqICAgIExvb2t1cCBhIGdpdmVuIGdseXBoIGJ5IGl0cyBTdGFuZGFyZEVuY29kaW5nIGNoYXJjb2RlLiBVc2VkCisgKiAgICB0byBpbXBsZW1lbnQgdGhlIFNFQUMgVHlwZSAxIG9wZXJhdG9yLgorICoKKyAqIDxJbnB1dD4KKyAqICAgIGZhY2UgICAgIDo6IGN1cnJlbnQgZmFjZSBvYmplY3QgICAgICAgICAKKyAqICAgIGNoYXJjb2RlIDo6IGNoYXJjb2RlIHRvIGxvb2sgZm9yCisgKgorICogPFJldHVybj4KKyAqICAgIGdseXBoIGluZGV4IGluIGZvbnQgZmFjZS4gUmV0dXJucyAtMSBpZiB0aGUgY29ycmVzcG9uZGluZworICogICAgZ2x5cGggd2Fzbid0IGZvdW5kLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgc3RhdGljCisgIFQxX0ludCAgICBsb29rdXBfZ2x5cGhfYnlfc3RkY2hhcmNvZGUoIFQxX0ZhY2UgIGZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQxX0ludCAgIGNoYXJjb2RlICkKKyAgeworICAgIFQxX0ludCAgICAgICAgICAgIG47CisgICAgY29uc3QgVDFfU3RyaW5nKiAgZ2x5cGhfbmFtZTsKKyAgICAKKyAgICAvKiBjaGVjayByYW5nZSBvZiBzdGFuZGFyZCBjaGFyIGNvZGUgKi8KKyAgICBpZiAoY2hhcmNvZGUgPCAwIHx8IGNoYXJjb2RlID4gMjU1KQorICAgICAgcmV0dXJuIC0xOworICAgICAgCisgICAgZ2x5cGhfbmFtZSA9IHQxX3N0YW5kYXJkX3N0cmluZ3NbdDFfc3RhbmRhcmRfZW5jb2RpbmdbY2hhcmNvZGVdXTsKKyAgICAKKyAgICBmb3IgKCBuID0gMDsgbiA8IGZhY2UtPm51bV9nbHlwaHM7IG4rKyApCisgICAgeworICAgICAgVDFfU3RyaW5nKiAgbmFtZSA9IChUMV9TdHJpbmcqKWZhY2UtPmdseXBoX25hbWVzW25dOworICAgICAgCisgICAgICBpZiAoIG5hbWUgJiYgc3RyY21wKG5hbWUsZ2x5cGhfbmFtZSkgPT0gMCApCisgICAgICAgIHJldHVybiBuOworICAgIH0KKworICAgIHJldHVybiAtMTsKKyAgfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiA8RnVuY3Rpb24+CisgKiAgICB0MW9wZXJhdG9yX3NlYWMKKyAqCisgKiA8RGVzY3JpcHRpb24+CisgKiAgICBJbXBsZW1lbnRzIHRoZSAic2VhYyIgVHlwZSAxIG9wZXJhdG9yIGZvciBhIFR5cGUgMSBkZWNvZGVyCisgKgorICogPElucHV0PgorICogICAgZGVjb2RlciAgOjogY3VycmVudCBUeXBlIDEgZGVjb2RlcgorICogICAgYXNiICAgICAgOjogYWNjZW50J3Mgc2lkZSBiZWFyaW5nCisgKiAgICBhZHggICAgICA6OiBob3Jpem9udGFsIHBvc2l0aW9uIG9mIGFjY2VudAorICogICAgYWR5ICAgICAgOjogdmVydGljYWwgcG9zaXRpb24gb2YgYWNjZW50CisgKiAgICBiY2hhciAgICA6OiBiYXNlIGNoYXJhY3RlcidzIFN0YW5kYXJkRW5jb2RpbmcgY2hhcmNvZGUKKyAqICAgIGFjaGFyICAgIDo6IGFjY2VudCBjaGFyYWN0ZXIncyBTdGFuZGFyZEVuY29kaW5nIGNoYXJjb2RlCisgKgorICogPFJldHVybj4KKyAqICAgIEVycm9yIGNvZGUuIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICBzdGF0aWMKKyAgVDFfRXJyb3IgIHQxb3BlcmF0b3Jfc2VhYyggVDFfRGVjb2RlciogIGRlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQxX1BvcyAgICAgICBhc2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQxX1BvcyAgICAgICBhZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQxX1BvcyAgICAgICBhZHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQxX0ludCAgICAgICBiY2hhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVDFfSW50ICAgICAgIGFjaGFyICkKKyAgeworICAgIFQxX0Vycm9yICAgICBlcnJvcjsKKyAgICBUMV9GYWNlICAgICAgZmFjZSA9IGRlY29kZXItPmJ1aWxkZXIuZmFjZTsKKyAgICBUMV9JbnQgICAgICAgYmNoYXJfaW5kZXgsIGFjaGFyX2luZGV4LCBuX2Jhc2VfcG9pbnRzOworICAgIEZUX091dGxpbmUqICBjdXIgID0gJmRlY29kZXItPmJ1aWxkZXIuY3VycmVudDsKKyAgICBGVF9PdXRsaW5lKiAgYmFzZSA9ICZkZWNvZGVyLT5idWlsZGVyLmJhc2U7CisgICAgVDFfVmVjdG9yICAgIGxlZnRfYmVhcmluZywgYWR2YW5jZTsKKyAgICAKKyAgICBiY2hhcl9pbmRleCA9IGxvb2t1cF9nbHlwaF9ieV9zdGRjaGFyY29kZSggZmFjZSwgYmNoYXIgKTsKKyAgICBhY2hhcl9pbmRleCA9IGxvb2t1cF9nbHlwaF9ieV9zdGRjaGFyY29kZSggZmFjZSwgYWNoYXIgKTsKKyAgICAKKyAgICBpZiAoYmNoYXJfaW5kZXggPCAwIHx8IGFjaGFyX2luZGV4IDwgMCkKKyAgICB7CisgICAgICBGVF9FUlJPUigoICJUMS5QYXJzZV9TZWFjIDogaW52YWxpZCBzZWFjIGNoYXJhY3RlciBjb2RlIGFyZ3VtZW50c1xuIiApKTsKKyAgICAgIHJldHVybiBUMV9FcnJfU3ludGF4X0Vycm9yOworICAgIH0KKworICAgIC8qIEZpcnN0IGxvYWQgImJjaGFyIiBpbiBidWlsZGVyICovCisgICAgLyogbm93IGxvYWQgdGhlIHVuc2NhbGVkIG91dGxpbmUgKi8KKyAgICBjdXItPm5fcG9pbnRzICAgPSAwOworICAgIGN1ci0+bl9jb250b3VycyA9IDA7CisgICAgY3VyLT5wb2ludHMgICAgID0gYmFzZS0+cG9pbnRzICAgKyBiYXNlLT5uX3BvaW50czsKKyAgICBjdXItPmZsYWdzICAgICAgPSBiYXNlLT5mbGFncyAgICArIGJhc2UtPm5fcG9pbnRzOworICAgIGN1ci0+Y29udG91cnMgICA9IGJhc2UtPmNvbnRvdXJzICsgYmFzZS0+bl9jb250b3VyczsKKworICAgIGVycm9yID0gVDFfUGFyc2VfQ2hhclN0cmluZ3MoIGRlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZS0+Y2hhcnN0cmluZ3MgICAgW2JjaGFyX2luZGV4XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlLT5jaGFyc3RyaW5nc19sZW5bYmNoYXJfaW5kZXhdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2UtPm51bV9zdWJycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlLT5zdWJycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlLT5zdWJyc19sZW4gKTsKKyAgICBpZiAoZXJyb3IpIHJldHVybiBlcnJvcjsKKworICAgIG5fYmFzZV9wb2ludHMgICA9IGN1ci0+bl9wb2ludHM7CisKKyAgICAvKiBzYXZlIHRoZSBsZWZ0IGJlYXJpbmcgYW5kIHdpZHRoIG9mIHRoZSBiYXNlIGNoYXJhY3RlciAqLworICAgIC8qIGFzIHRoZXkgd2lsbCBiZSBlcmFzZSBieSB0aGUgbmV4dCBsb2FkLi4gICAgICAgICAgICAgICovCisgICAgbGVmdF9iZWFyaW5nID0gZGVjb2Rlci0+YnVpbGRlci5sZWZ0X2JlYXJpbmc7CisgICAgYWR2YW5jZSAgICAgID0gZGVjb2Rlci0+YnVpbGRlci5hZHZhbmNlOworCisgICAgZGVjb2Rlci0+YnVpbGRlci5sZWZ0X2JlYXJpbmcueCA9IDA7CisgICAgZGVjb2Rlci0+YnVpbGRlci5sZWZ0X2JlYXJpbmcueSA9IDA7ICAgIAorCisgICAgLyogTm93IGxvYWQgImFjaGFyIiBvbiB0b3Agb2YgKi8KKyAgICAvKiB0aGUgYmFzZSBvdXRsaW5lICAgICAgICAgICAqLworICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICovIAorICAgIGN1ci0+bl9wb2ludHMgICA9IDA7CisgICAgY3VyLT5uX2NvbnRvdXJzID0gMDsKKyAgICBjdXItPnBvaW50cyAgICAgPSBiYXNlLT5wb2ludHMgICArIGJhc2UtPm5fcG9pbnRzOworICAgIGN1ci0+ZmxhZ3MgICAgICA9IGJhc2UtPmZsYWdzICAgICsgYmFzZS0+bl9wb2ludHM7CisgICAgY3VyLT5jb250b3VycyAgID0gYmFzZS0+Y29udG91cnMgKyBiYXNlLT5uX2NvbnRvdXJzOworCisgICAgZXJyb3IgPSBUMV9QYXJzZV9DaGFyU3RyaW5ncyggZGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlLT5jaGFyc3RyaW5ncyAgICBbYWNoYXJfaW5kZXhdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2UtPmNoYXJzdHJpbmdzX2xlblthY2hhcl9pbmRleF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZS0+bnVtX3N1YnJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2UtPnN1YnJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2UtPnN1YnJzX2xlbiApOworICAgIGlmIChlcnJvcikgcmV0dXJuIGVycm9yOworCisgICAgLyogYWRqdXN0IGNvbnRvdXJzIGluIGFjY2VudGVkIGNoYXJhY3RlciBvdXRsaW5lICovCisgICAgeworICAgICAgVDFfSW50ICBuOworCisgICAgICBmb3IgKCBuID0gMDsgbiA8IGN1ci0+bl9jb250b3VyczsgbisrICkKKyAgICAgICAgY3VyLT5jb250b3Vyc1tuXSArPSBuX2Jhc2VfcG9pbnRzOworICAgIH0KKworICAgIC8qIHJlc3RvcmUgdGhlIGxlZnQgc2lkZSBiZWFyaW5nIGFuZCAgICovCisgICAgLyogYWR2YW5jZSB3aWR0aCBvZiB0aGUgYmFzZSBjaGFyYWN0ZXIgKi8KKyAgICBkZWNvZGVyLT5idWlsZGVyLmxlZnRfYmVhcmluZyA9IGxlZnRfYmVhcmluZzsKKyAgICBkZWNvZGVyLT5idWlsZGVyLmFkdmFuY2UgICAgICA9IGFkdmFuY2U7CisKKyAgICAvKiBGaW5hbGx5LCBtb3ZlIHRoZSBhY2NlbnQgKi8KKyAgICBGVF9UcmFuc2xhdGVfT3V0bGluZSggY3VyLCBhZHggLSBhc2IsIGFkeSApOworICAgIAorICAgICh2b2lkKWFzYjsgICAgICAgICAgIC8qIGlnbm9yZSB0aGlzIHBhcmFtZXRlciAqLworICAgIHJldHVybiBUMV9FcnJfT2s7CisgIH0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIDxGdW5jdGlvbj4KKyAqICAgIHQxb3BlcmF0b3JfZmxleAorICoKKyAqIDxEZXNjcmlwdGlvbj4KKyAqICAgIEltcGxlbWVudHMgdGhlICJmbGV4IiBUeXBlIDEgb3BlcmF0b3IgZm9yIGEgVHlwZSAxIGRlY29kZXIKKyAqCisgKiA8SW5wdXQ+CisgKiAgICBkZWNvZGVyICAgOjogY3VycmVudCBUeXBlIDEgZGVjb2RlcgorICogICAgdGhyZXNob2xkIDo6IHRocmVzaG9sZAorICogICAgZW5kX3ggICAgIDo6IHBvc2l0aW9uIG9mIGZpbmFsIGZsZXggcG9pbnQKKyAqICAgIGVuZF95ICAgICA6OiBwb3NpdGlvbiBvZiBmaW5hbCBmbGV4IHBvaW50CisgKgorICogPFJldHVybj4KKyAqICAgIEVycm9yIGNvZGUuIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICBzdGF0aWMKKyAgVDFfRXJyb3IgIHQxb3BlcmF0b3JfZmxleCggVDFfRGVjb2RlciogIGRlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQxX1BvcyAgICAgICB0aHJlc2hvbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQxX1BvcyAgICAgICBlbmRfeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVDFfUG9zICAgICAgIGVuZF95ICkKKyAgeworICAgIFQxX1ZlY3RvciAgICB2ZWM7CisgICAgVDFfVmVjdG9yKiAgIGZsZXggID0gZGVjb2Rlci0+ZmxleF92ZWN0b3JzOworICAgIFQxX0ludCAgICAgICBuOworCisgICAgLyogd2UgZG9uJ3QgZXZlbiB0cnkgdG8gdGVzdCB0aGUgdGhyZXNob2xkIGluIHRoZSBub24taGludGluZyAgKi8KKyAgICAvKiBidWlsZGVyLCBldmVuIGlmIHRoZSBmbGV4IG9wZXJhdG9yIGlzIHNhaWQgdG8gYmUgYSBwYXRoICAgICAgKi8KKyAgICAvKiBjb25zdHJ1Y3Rpb24gc3RhdGVtZW50IGluIHRoZSBzcGVjaWZpY2F0aW9uLiBUaGlzIGlzIGJldHRlciAqLworICAgIC8qIGxlZnQgdG8gdGhlIGhpbnRlci4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICBmbGV4ID0gZGVjb2Rlci0+ZmxleF92ZWN0b3JzOworICAgIHZlYyAgPSAqZmxleCsrOworCisgICAgZm9yICggbiA9IDA7IG4gPCA2OyBuKysgKQorICAgIHsKKyAgICAgIGZsZXgtPnggKz0gdmVjLng7CisgICAgICBmbGV4LT55ICs9IHZlYy55OworCisgICAgICB2ZWMgPSAqZmxleCsrOworICAgIH0KKworCisgICAgKHZvaWQpdGhyZXNob2xkOworICAgICh2b2lkKWVuZF94OworICAgICh2b2lkKWVuZF95OworCisgICAgZmxleCAgPSBkZWNvZGVyLT5mbGV4X3ZlY3RvcnM7CisKKyAgICByZXR1cm4gIGRlY29kZXItPmJ1aWxkZXIuZnVuY3MucmN1cnZlX3RvKCAmZGVjb2Rlci0+YnVpbGRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGV4WzBdLngsIGZsZXhbMF0ueSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGV4WzFdLngsIGZsZXhbMV0ueSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGV4WzJdLngsIGZsZXhbMl0ueSApIHx8CisKKyAgICAgICAgICAgIGRlY29kZXItPmJ1aWxkZXIuZnVuY3MucmN1cnZlX3RvKCAmZGVjb2Rlci0+YnVpbGRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGV4WzNdLngsIGZsZXhbM10ueSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGV4WzRdLngsIGZsZXhbNF0ueSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGV4WzVdLngsIGZsZXhbNV0ueSApOworICB9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIDxGdW5jdGlvbj4KKyAqICAgIFQxX1BhcnNlX0NoYXJTdHJpbmdzCisgKgorICogPERlc2NyaXB0aW9uPgorICogICAgUGFyc2VzIGEgZ2l2ZW4gVHlwZSAxIGNoYXJzdHJpbmdzIHByb2dyYW0KKyAqCisgKiA8SW5wdXQ+CisgKiAgICBkZWNvZGVyICAgICAgICAgIDo6IGN1cnJlbnQgVHlwZSAxIGRlY29kZXIKKyAqICAgIGNoYXJzdHJpbmdfYmFzZSAgOjogYmFzZSBvZiB0aGUgY2hhcnN0cmluZyBzdHJlYW0KKyAqICAgIGNoYXJzdHJpbmdfbGVuICAgOjogbGVuZ3RoIGluIGJ5dGVzIG9mIHRoZSBjaGFyc3RyaW5nIHN0cmVhbQorICogICAgbnVtX3N1YnJzICAgICAgICA6OiBudW1iZXIgb2Ygc3ViLXJvdXRpbmVzCisgKiAgICBzdWJyc19iYXNlICAgICAgIDo6IGFycmF5IG9mIHN1Yi1yb3V0aW5lcyBhZGRyZXNzZXMKKyAqICAgIHN1YnJzX2xlbiAgICAgICAgOjogYXJyYXkgb2Ygc3ViLXJvdXRpbmVzIGxlbmd0aHMKKyAqCisgKiA8UmV0dXJuPgorICogICAgRXJyb3IgY29kZS4gMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIEVYUE9SVF9GVU5DCisgIFQxX0Vycm9yICAgVDFfUGFyc2VfQ2hhclN0cmluZ3MoIFQxX0RlY29kZXIqICBkZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUMV9CeXRlKiAgICAgY2hhcnN0cmluZ19iYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUMV9JbnQgICAgICAgY2hhcnN0cmluZ19sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQxX0ludCAgICAgICBudW1fc3VicnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQxX0J5dGUqKiAgICBzdWJyc19iYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUMV9JbnQqICAgICAgc3VicnNfbGVuICkKKyAgeworICAgIFQxX0Vycm9yICAgICAgICAgICAgZXJyb3I7CisgICAgVDFfRGVjb2Rlcl9ab25lKiAgICB6b25lOworICAgIFQxX0J5dGUqICAgICAgICAgICAgaXA7CisgICAgVDFfQnl0ZSogICAgICAgICAgICBsaW1pdDsKKyAgICBUMV9CdWlsZGVyKiAgICAgICAgIGJ1aWxkZXIgPSAmZGVjb2Rlci0+YnVpbGRlcjsKKyAgICBUMV9CdWlsZGVyX0Z1bmNzKiAgIGJ1aWxkcyAgPSAmYnVpbGRlci0+ZnVuY3M7CisgICAgVDFfSGludGVyX0Z1bmNzKiAgICBoaW50cyAgID0gJmRlY29kZXItPmhpbnRlcjsKKworICAgIHN0YXRpYyBjb25zdCBUMV9JbnQgIGFyZ3NfY291bnRbIG9wX21heCBdID0gCisgICAgeworICAgICAgMCwgLyogbm9uZSAqLworICAgICAgMCwgLyogZW5kY2hhciAqLworICAgICAgMiwgLyogaHNidyAqLworICAgICAgNSwgLyogc2VhYyAqLworICAgICAgNCwgLyogc2J3ICovCisgICAgICAwLCAvKiBjbG9zZXBhdGggKi8KKyAgICAgIDEsIC8qIGhsaW5ldG8gKi8KKyAgICAgIDEsIC8qIGhtb3ZldG8gKi8KKyAgICAgIDQsIC8qIGh2Y3VydmV0byAqLworICAgICAgMiwgLyogcmxpbmV0byAqLworICAgICAgMiwgLyogcm1vdmV0byAqLworICAgICAgNiwgLyogcnJjdXJ2ZXRvICovCisgICAgICA0LCAvKiB2aGN1cnZldG8gKi8KKyAgICAgIDEsIC8qIHZsaW5ldG8gKi8KKyAgICAgIDEsIC8qIHZtb3ZldG8gKi8KKyAgICAgIDAsIC8qIGRvdHNlY3Rpb24gKi8KKyAgICAgIDIsIC8qIGhzdGVtICovCisgICAgICA2LCAvKiBoc3RlbTMgKi8KKyAgICAgIDIsIC8qIHZzdGVtICovCisgICAgICA2LCAvKiB2c3RlbTMgKi8KKyAgICAgIDIsIC8qIGRpdiAqLworICAgICAtMSwgLyogY2FsbG90aGVyc3ViciAqLworICAgICAgMSwgLyogY2FsbHN1YnIgKi8KKyAgICAgIDAsIC8qIHBvcCAqLworICAgICAgMCwgLyogcmV0dXJuICovCisgICAgICAyICAvKiBzZXRjdXJyZW50cG9pbnQgKi8KKyAgICB9OworCisgICAgLyogRmlyc3Qgb2YgYWxsLCBpbml0aWFsaXNlIHRoZSBkZWNvZGVyICovCisgICAgZGVjb2Rlci0+dG9wICA9IGRlY29kZXItPnN0YWNrOworICAgIGRlY29kZXItPnpvbmUgPSBkZWNvZGVyLT56b25lczsKKyAgICB6b25lICAgICAgICAgID0gZGVjb2Rlci0+em9uZXM7CisKKyAgICBidWlsZGVyLT5wYXRoX2JlZ3VuICA9IDA7CisKKyAgICB6b25lLT5iYXNlICAgICAgICAgICA9IGNoYXJzdHJpbmdfYmFzZTsKKyAgICBsaW1pdCA9IHpvbmUtPmxpbWl0ICA9IGNoYXJzdHJpbmdfYmFzZSArIGNoYXJzdHJpbmdfbGVuOworICAgIGlwICAgID0gem9uZS0+Y3Vyc29yID0gem9uZS0+YmFzZTsKKworICAgIGVycm9yID0gVDFfRXJyX09rOworCisgICAgLyogbm93LCBleGVjdXRlIGxvb3AgKi8KKyAgICB3aGlsZSAoIGlwIDwgbGltaXQgKQorICAgIHsKKyAgICAgIFQxX0ludCogICAgICB0b3AgICAgICA9IGRlY29kZXItPnRvcDsKKyAgICAgIFQxX09wZXJhdG9yICBvcCAgICAgICA9IG9wX25vbmU7CisgICAgICBUMV9Mb25nICAgICAgdmFsdWUgICAgPSAwOworCisgICAgICAvKiBGaXJzdCBvZiBhbGwsIGRlY29tcHJlc3Mgb3BlcmF0b3Igb3IgdmFsdWUgKi8KKyAgICAgIHN3aXRjaCAoKmlwKyspCisgICAgICB7CisgICAgICAgIGNhc2UgMTogIG9wID0gb3BfaHN0ZW07ICAgICBicmVhazsKKworICAgICAgICBjYXNlIDM6ICBvcCA9IG9wX3ZzdGVtOyAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNDogIG9wID0gb3Bfdm1vdmV0bzsgICBicmVhazsKKyAgICAgICAgY2FzZSA1OiAgb3AgPSBvcF9ybGluZXRvOyAgIGJyZWFrOworICAgICAgICBjYXNlIDY6ICBvcCA9IG9wX2hsaW5ldG87ICAgYnJlYWs7CisgICAgICAgIGNhc2UgNzogIG9wID0gb3BfdmxpbmV0bzsgICBicmVhazsKKyAgICAgICAgY2FzZSA4OiAgb3AgPSBvcF9ycmN1cnZldG87IGJyZWFrOworICAgICAgICBjYXNlIDk6ICBvcCA9IG9wX2Nsb3NlcGF0aDsgYnJlYWs7CisgICAgICAgIGNhc2UgMTA6IG9wID0gb3BfY2FsbHN1YnI7ICBicmVhazsKKyAgICAgICAgY2FzZSAxMTogb3AgPSBvcF9yZXR1cm47ICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMTM6IG9wID0gb3BfaHNidzsgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxNDogb3AgPSBvcF9lbmRjaGFyOyAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMjE6IG9wID0gb3Bfcm1vdmV0bzsgICBicmVhazsKKyAgICAgICAgY2FzZSAyMjogb3AgPSBvcF9obW92ZXRvOyAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMzA6IG9wID0gb3BfdmhjdXJ2ZXRvOyBicmVhazsKKyAgICAgICAgY2FzZSAzMTogb3AgPSBvcF9odmN1cnZldG87IGJyZWFrOworCisgICAgICAgIGNhc2UgMTI6CisgICAgICAgICAgeworICAgICAgICAgICAgaWYgKGlwID4gbGltaXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIEZUX0VSUk9SKCggIlQxLlBhcnNlX0NoYXJTdHJpbmdzIDogaW52YWxpZCBlc2NhcGUgKDEyK0VPRilcbiIgKSk7CisgICAgICAgICAgICAgIGdvdG8gU3ludGF4X0Vycm9yOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKCppcCsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBjYXNlIDA6ICBvcCA9IG9wX2RvdHNlY3Rpb247ICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgMTogIG9wID0gb3BfdnN0ZW0zOyAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSAyOiAgb3AgPSBvcF9oc3RlbTM7ICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIDY6ICBvcCA9IG9wX3NlYWM7ICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgNzogIG9wID0gb3Bfc2J3OyAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSAxMjogb3AgPSBvcF9kaXY7ICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIDE2OiBvcCA9IG9wX2NhbGxvdGhlcnN1YnI7ICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgMTc6IG9wID0gb3BfcG9wOyAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSAzMzogb3AgPSBvcF9zZXRjdXJyZW50cG9pbnQ7IGJyZWFrOworCisgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgRlRfRVJST1IoKCAiVDEuUGFyc2VfQ2hhclN0cmluZ3MgOiBpbnZhbGlkIGVzY2FwZSAoMTIrJWQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIGlwWy0xXSApKTsKKyAgICAgICAgICAgICAgICBnb3RvIFN5bnRheF9FcnJvcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAyNTU6ICAgIC8qIGZvdXIgYnl0ZXMgaW50ZWdlciAqLworICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChpcCs0ID4gbGltaXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIEZUX0VSUk9SKCggIlQxLlBhcnNlX0NoYXJTdHJpbmdzIDogdW5leHBlY3RlZCBFT0YgaW4gaW50ZWdlclxuIiApKTsKKyAgICAgICAgICAgICAgZ290byBTeW50YXhfRXJyb3I7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhbHVlID0gKChsb25nKWlwWzBdIDw8IDI0KSB8CisgICAgICAgICAgICAgICAgICAgICgobG9uZylpcFsxXSA8PCAxNikgfAorICAgICAgICAgICAgICAgICAgICAoKGxvbmcpaXBbMl0gPDwgOCkgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlwWzNdOworICAgICAgICAgICAgaXAgKz0gNDsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBpZiAoaXBbLTFdID49IDMyKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChpcFstMV0gPCAyNDcpCisgICAgICAgICAgICAgIHZhbHVlID0gKGxvbmcpaXBbLTFdIC0gMTM5OworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpZiAoKytpcCA+IGxpbWl0KQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlRfRVJST1IoKCAiVDEuUGFyc2VfQ2hhclN0cmluZ3MgOiB1bmV4cGVjdGVkIEVPRiBpbiBpbnRlZ2VyXG4iICkpOworICAgICAgICAgICAgICAgIGdvdG8gU3ludGF4X0Vycm9yOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgaWYgKGlwWy0yXSA8IDI1MSkKKyAgICAgICAgICAgICAgICB2YWx1ZSA9ICAoKGxvbmcpKGlwWy0yXS0yNDcpIDw8IDgpICsgaXBbLTFdICsgMTA4OworICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdmFsdWUgPSAtKCgoKGxvbmcpaXBbLTJdLTI1MSkgPDwgOCkgKyBpcFstMV0gKyAxMDggKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgIHsKKyAgICAgICAgICAgIEZUX0VSUk9SKCggIlQxLlBhcnNlX0NoYXJTdHJpbmdzIDogaW52YWxpZCBieXRlICglZClcbiIsCisgICAgICAgICAgICAgICAgICAgICBpcFstMV0gKSk7CisgICAgICAgICAgICBnb3RvIFN5bnRheF9FcnJvcjsKKyAgICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8qIHB1c2ggdmFsdWUgaWYgbmVlZGVkICovCisgICAgICBpZiAoIG9wID09IG9wX25vbmUgKQorICAgICAgeworICAgICAgICBpZiAoIHRvcCAtIGRlY29kZXItPnN0YWNrID49IFQxX01BWF9DSEFSU1RSSU5HU19PUEVSQU5EUyApCisgICAgICAgIHsKKyAgICAgICAgICBGVF9FUlJPUigoICJUMS5QYXJzZV9DaGFyU3RyaW5ncyA6IFN0YWNrIG92ZXJmbG93ICEhXG4iICkpOworICAgICAgICAgIGdvdG8gU3ludGF4X0Vycm9yOworICAgICAgICB9CisKKyAgICAgICAgKnRvcCsrICAgICAgID0gdmFsdWU7CisgICAgICAgIGRlY29kZXItPnRvcCA9IHRvcDsKKyAgICAgIH0KKworICAgICAgZWxzZSBpZiAoIG9wID09IG9wX2NhbGxvdGhlcnN1YnIgKSAvKiBjaGVjayBhcmd1bWVudHMgZGlmZmVyZW50bHkgKi8KKyAgICAgIHsKKyAgICAgICAgaWYgKCB0b3AgLSBkZWNvZGVyLT5zdGFjayA8IDIpCisgICAgICAgICAgZ290byBTdGFja19VbmRlcmZsb3c7CisKKyAgICAgICAgdG9wIC09IDI7CisKKyAgICAgICAgc3dpdGNoICh0b3BbMV0pCisgICAgICAgIHsKKyAgICAgICAgICBjYXNlIDE6ICAgLyogc3RhcnQgZmxleCBmZWF0dXJlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmICh0b3BbMF0gIT0gMCkgZ290byBVbmV4cGVjdGVkX090aGVyU3VicjsKKworICAgICAgICAgICAgICBkZWNvZGVyLT5mbGV4X3N0YXRlICAgICAgICA9IDE7CisgICAgICAgICAgICAgIGRlY29kZXItPm51bV9mbGV4X3ZlY3RvcnMgID0gMDsKKyAgICAgICAgICAgICAgZGVjb2Rlci0+ZmxleF92ZWN0b3JzWzBdLnggPSAwOworICAgICAgICAgICAgICBkZWNvZGVyLT5mbGV4X3ZlY3RvcnNbMF0ueSA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworCisgICAgICAgICAgY2FzZSAyOiAgIC8qIGFkZCBmbGV4IHZlY3RvciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIFQxX0ludCAgICAgIGluZGV4OworICAgICAgICAgICAgICBUMV9WZWN0b3IqICBmbGV4OworCisgICAgICAgICAgICAgIGlmICh0b3BbMF0gIT0gMCkgZ290byBVbmV4cGVjdGVkX090aGVyU3VicjsKKworICAgICAgICAgICAgICB0b3AgLT0gMjsKKyAgICAgICAgICAgICAgaWYgKHRvcCA8IGRlY29kZXItPnN0YWNrKSBnb3RvIFN0YWNrX1VuZGVyZmxvdzsKKworICAgICAgICAgICAgICBpbmRleCA9IGRlY29kZXItPm51bV9mbGV4X3ZlY3RvcnMrKzsKKyAgICAgICAgICAgICAgaWYgKGluZGV4ID49IDcpCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGVF9FUlJPUigoICJUMS5QYXJzZV9DaGFyU3RyaW5nczogdG9vIG1hbnkgZmxleCB2ZWN0b3JzICFcbiIgKSk7CisgICAgICAgICAgICAgICAgZ290byBTeW50YXhfRXJyb3I7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBmbGV4ID0gZGVjb2Rlci0+ZmxleF92ZWN0b3JzICsgaW5kZXg7CisgICAgICAgICAgICAgIGZsZXgtPnggKz0gdG9wWzBdOworICAgICAgICAgICAgICBmbGV4LT55ICs9IHRvcFsxXTsKKworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKworICAgICAgICAgIGNhc2UgMDogICAvKiBlbmQgZmxleCBmZWF0dXJlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICBpZiAoIGRlY29kZXItPmZsZXhfc3RhdGUgICAgICAgPT0gMCB8fAorICAgICAgICAgICAgICAgICAgIGRlY29kZXItPm51bV9mbGV4X3ZlY3RvcnMgIT0gNyApCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGVF9FUlJPUigoICJUMS5QYXJzZV9DaGFyU3RyaW5nczogdW5leHBlY3RlZCBmbGV4IGVuZFxuIiApKTsKKyAgICAgICAgICAgICAgICBnb3RvIFN5bnRheF9FcnJvcjsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGlmICh0b3BbMF0gIT0gMykgZ290byBVbmV4cGVjdGVkX090aGVyU3VicjsKKworICAgICAgICAgICAgICB0b3AgLT0gMzsKKyAgICAgICAgICAgICAgaWYgKHRvcCA8IGRlY29kZXItPnN0YWNrKSBnb3RvIFN0YWNrX1VuZGVyZmxvdzsKKworICAgICAgICAgICAgICAvKiBub3cgY29uc3VtZSB0aGUgcmVtYWluaW5nICJwb3AgcG9wIHNldGN1cnJlbnRwb2ludCIgKi8KKyAgICAgICAgICAgICAgaWYgKCBpcCs2ID4gbGltaXQgfHwKKyAgICAgICAgICAgICAgICAgICBpcFswXSAhPSAxMiAgfHwgaXBbMV0gIT0gMTcgfHwgICAvKiBwb3AgKi8KKyAgICAgICAgICAgICAgICAgICBpcFsyXSAhPSAxMiAgfHwgaXBbM10gIT0gMTcgfHwgICAvKiBwb3AgKi8KKyAgICAgICAgICAgICAgICAgICBpcFs0XSAhPSAxMiAgfHwgaXBbNV0gIT0gMzMgKSAgICAvKiBzZXRjdXJyZW50cG9pbnQgKi8KKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZUX0VSUk9SKCggIlQxLlBhcnNlX0NoYXJTdHJpbmdzOiBpbnZhbGlkIGZsZXggY2hhcnN0cmluZ1xuIiApKTsKKyAgICAgICAgICAgICAgICBnb3RvIFN5bnRheF9FcnJvcjsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGRlY29kZXItPmZsZXhfc3RhdGUgPSAwOworICAgICAgICAgICAgICBkZWNvZGVyLT50b3AgICAgICAgID0gdG9wOworCisgICAgICAgICAgICAgIGVycm9yID0gdDFvcGVyYXRvcl9mbGV4KCBkZWNvZGVyLCB0b3BbMF0sIHRvcFsxXSwgdG9wWzJdICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworCisgICAgICAgICAgY2FzZSAzOiAgLyogY2hhbmdlIGhpbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICBpZiAodG9wWzBdICE9IDEpIGdvdG8gVW5leHBlY3RlZF9PdGhlclN1YnI7CisKKyAgICAgICAgICAgICAgLyogZWF0IHRoZSBmb2xsb3dpbmcgInBvcCIgKi8KKyAgICAgICAgICAgICAgaWYgKGlwKzIgPiBsaW1pdCkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZUX0VSUk9SKCggIlQxLlBhcnNlX0NoYXJTdHJpbmdzOiBpbnZhbGlkIGVzY2FwZSAoMTIrJWQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIGlwWy0xXSApKTsKKyAgICAgICAgICAgICAgICBnb3RvIFN5bnRheF9FcnJvcjsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGlmIChpcFswXSAhPSAxMiB8fCBpcFsxXSAhPSAxNykKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZUX0VSUk9SKCggIlQxLlBhcnNlX0NoYXJTdHJpbmdzOiAncG9wJyBleHBlY3RlZCwgZm91bmQgKCVkICVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpcFswXSwgaXBbMV0gKSk7CisgICAgICAgICAgICAgICAgZ290byBTeW50YXhfRXJyb3I7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBpcCAgICArPSAyOworICAgICAgICAgICAgICBlcnJvciAgPSBoaW50cy0+Y2hhbmdlX2hpbnRzKGJ1aWxkZXIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAvKiBpbnZhbGlkIE90aGVyU3VicnMgY2FsbCAqLworICAgICAgICAgIFVuZXhwZWN0ZWRfT3RoZXJTdWJyOgorICAgICAgICAgICAgRlRfRVJST1IoKCAiVDEuUGFyc2VfQ2hhclN0cmluZ3M6IHVuZXhwZWN0ZWQgT3RoZXJTdWJycyBbJWQgJWRdXG4iLAorICAgICAgICAgICAgICAgICAgICAgdG9wWzBdLCB0b3BbMV0gKSk7CisgICAgICAgICAgICBnb3RvIFN5bnRheF9FcnJvcjsKKyAgICAgICAgfQorICAgICAgICBkZWNvZGVyLT50b3AgPSB0b3A7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIFQxX0ludCAgbnVtX2FyZ3MgPSBhcmdzX2NvdW50W29wXTsKKworICAgICAgICBpZiAoIHRvcCAtIGRlY29kZXItPnN0YWNrIDwgbnVtX2FyZ3MgKQorICAgICAgICAgIGdvdG8gU3RhY2tfVW5kZXJmbG93OworCisgICAgICAgIHRvcCAtPSBudW1fYXJnczsKKworICAgICAgICBzd2l0Y2ggKG9wKQorICAgICAgICB7CisgICAgICAgICAgY2FzZSBvcF9lbmRjaGFyOgorICAgICAgICAgICAgZXJyb3IgPSBidWlsZHMtPmVuZF9jaGFyKCBidWlsZGVyICk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2Ugb3BfaHNidzoKKyAgICAgICAgICAgIGVycm9yID0gYnVpbGRzLT5zZXRfYmVhcmluZ19wb2ludCggYnVpbGRlciwgdG9wWzBdLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wWzFdLCAwICk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2Ugb3Bfc2VhYzoKKyAgICAgICAgICAgIC8qIHJldHVybiBpbW1lZGlhdGVseSBhZnRlciB0aGUgcHJvY2Vzc2luZyAqLworICAgICAgICAgICAgcmV0dXJuIHQxb3BlcmF0b3Jfc2VhYyggZGVjb2RlciwgdG9wWzBdLCB0b3BbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3BbMl0sIHRvcFszXSwgdG9wWzRdICk7CisKKyAgICAgICAgICBjYXNlIG9wX3NidzoKKyAgICAgICAgICAgIGVycm9yID0gYnVpbGRzLT5zZXRfYmVhcmluZ19wb2ludCggYnVpbGRlciwgdG9wWzBdLCB0b3BbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcFsyXSwgdG9wWzNdICk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2Ugb3BfY2xvc2VwYXRoOgorICAgICAgICAgICAgZXJyb3IgPSBidWlsZHMtPmNsb3NlX3BhdGgoIGJ1aWxkZXIgKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBvcF9obGluZXRvOgorICAgICAgICAgICAgZXJyb3IgPSBidWlsZHMtPnJsaW5lX3RvKCBidWlsZGVyLCB0b3BbMF0sIDAgKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBvcF9obW92ZXRvOgorICAgICAgICAgICAgZXJyb3IgPSBidWlsZHMtPnJtb3ZlX3RvKCBidWlsZGVyLCB0b3BbMF0sIDAgKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBvcF9odmN1cnZldG86CisgICAgICAgICAgICBlcnJvciA9IGJ1aWxkcy0+cmN1cnZlX3RvKCBidWlsZGVyLCB0b3BbMF0sIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3BbMV0sIHRvcFsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgdG9wWzNdICk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2Ugb3BfcmxpbmV0bzoKKyAgICAgICAgICAgIGVycm9yID0gYnVpbGRzLT5ybGluZV90byggYnVpbGRlciwgdG9wWzBdLCB0b3BbMV0gKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBvcF9ybW92ZXRvOgorICAgICAgICAgICAgLyogaWdub3JlIG9wZXJhdG9yIHdoZW4gaW4gZmxleCBtb2RlICovCisgICAgICAgICAgICBpZiAoZGVjb2Rlci0+ZmxleF9zdGF0ZSA9PSAwKQorICAgICAgICAgICAgICBlcnJvciA9IGJ1aWxkcy0+cm1vdmVfdG8oIGJ1aWxkZXIsIHRvcFswXSwgdG9wWzFdICk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHRvcCArPSAyOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIG9wX3JyY3VydmV0bzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZXJyb3IgPSBidWlsZHMtPnJjdXJ2ZV90byggYnVpbGRlciwgdG9wWzBdLCB0b3BbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcFsyXSwgdG9wWzNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3BbNF0sIHRvcFs1XSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIG9wX3ZoY3VydmV0bzoKKyAgICAgICAgICAgIGVycm9yID0gYnVpbGRzLT5yY3VydmVfdG8oIGJ1aWxkZXIsICAgICAgMCwgdG9wWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wWzFdLCB0b3BbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3BbM10sICAgICAgMCApOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIG9wX3ZsaW5ldG86CisgICAgICAgICAgICBlcnJvciA9IGJ1aWxkcy0+cmxpbmVfdG8oIGJ1aWxkZXIsIDAsIHRvcFswXSApOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIG9wX3Ztb3ZldG86CisgICAgICAgICAgICBlcnJvciA9IGJ1aWxkcy0+cm1vdmVfdG8oIGJ1aWxkZXIsIDAsIHRvcFswXSApOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIG9wX2RvdHNlY3Rpb246CisgICAgICAgICAgICBlcnJvciA9IGhpbnRzLT5kb3Rfc2VjdGlvbiggYnVpbGRlciApOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIG9wX2hzdGVtOgorICAgICAgICAgICAgZXJyb3IgPSBoaW50cy0+c3RlbSggYnVpbGRlciwgdG9wWzBdLCB0b3BbMV0sIDAgKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBvcF9oc3RlbTM6CisgICAgICAgICAgICBlcnJvciA9IGhpbnRzLT5zdGVtMyggYnVpbGRlciwgdG9wWzBdLCB0b3BbMV0sIHRvcFsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3BbM10sIHRvcFs0XSwgdG9wWzVdLCAwICk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2Ugb3BfdnN0ZW06CisgICAgICAgICAgICBlcnJvciA9IGhpbnRzLT5zdGVtKCBidWlsZGVyLCB0b3BbMF0sIHRvcFsxXSwgMSApOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIG9wX3ZzdGVtMzoKKyAgICAgICAgICAgIGVycm9yID0gaGludHMtPnN0ZW0zKCBidWlsZGVyLCB0b3BbMF0sIHRvcFsxXSwgdG9wWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcFszXSwgdG9wWzRdLCB0b3BbNV0sIDEgKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBvcF9kaXY6CisgICAgICAgICAgICBpZiAodG9wWzFdKQorICAgICAgICAgICAgICAqdG9wKysgPSB0b3BbMF0gLyB0b3BbMV07CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIEZUX0VSUk9SKCggIlQxLlBhcnNlX0NIYXJTdHJpbmdzIDogZGl2aXNpb24gYnkgMFxuIiApKTsKKyAgICAgICAgICAgICAgZ290byBTeW50YXhfRXJyb3I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2Ugb3BfY2FsbHN1YnI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIFQxX0ludCAgaW5kZXggPSB0b3BbMF07CisKKyAgICAgICAgICAgICAgaWYgKCBpbmRleCA8IDAgfHwgaW5kZXggPj0gbnVtX3N1YnJzICkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZUX0VSUk9SKCggIlQxLlBhcnNlX0NoYXJTdHJpbmdzIDogaW52YWxpZCBzdWJycyBpbmRleFxuIiApKTsKKyAgICAgICAgICAgICAgICBnb3RvIFN5bnRheF9FcnJvcjsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGlmICggem9uZSAtIGRlY29kZXItPnpvbmVzID49IFQxX01BWF9TVUJSU19DQUxMUyApCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGVF9FUlJPUigoICJUMS5QYXJzZV9DaGFyU3RyaW5ncyA6IHRvbyBtYW55IG5lc3RlZCBzdWJyc1xuIiApKTsKKyAgICAgICAgICAgICAgICBnb3RvIFN5bnRheF9FcnJvcjsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIHpvbmUtPmN1cnNvciA9IGlwOyAgLyogc2F2ZSBjdXJyZW50IGluc3RydWN0aW9uIHBvaW50ZXIgKi8KKworICAgICAgICAgICAgICB6b25lKys7CisgICAgICAgICAgICAgIHpvbmUtPmJhc2UgICAgPSBzdWJyc19iYXNlW2luZGV4XTsKKyAgICAgICAgICAgICAgem9uZS0+bGltaXQgICA9IHpvbmUtPmJhc2UgKyBzdWJyc19sZW5baW5kZXhdOworICAgICAgICAgICAgICB6b25lLT5jdXJzb3IgID0gem9uZS0+YmFzZTsKKworICAgICAgICAgICAgICBpZiAoIXpvbmUtPmJhc2UpCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGVF9FUlJPUigoICJUMS5QYXJzZV9DaGFyU3RyaW5ncyA6IGludm9raW5nIGVtcHR5IHN1YnJzICEhXG4iICkpOworICAgICAgICAgICAgICAgIGdvdG8gU3ludGF4X0Vycm9yOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgZGVjb2Rlci0+em9uZSA9IHpvbmU7CisgICAgICAgICAgICAgIGlwICAgICAgICAgICAgPSB6b25lLT5iYXNlOworICAgICAgICAgICAgICBsaW1pdCAgICAgICAgID0gem9uZS0+bGltaXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2Ugb3BfcG9wOgorICAgICAgICAgICAgRlRfRVJST1IoKCAiVDEuUGFyc2VfQ2hhclN0cmluZ3MgOiB1bmV4cGVjdGVkIFBPUFxuIiApKTsKKyAgICAgICAgICAgIGdvdG8gU3ludGF4X0Vycm9yOworCisKKyAgICAgICAgICBjYXNlIG9wX3JldHVybjoKKyAgICAgICAgICAgIGlmICggem9uZSA8PSBkZWNvZGVyLT56b25lcyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIEZUX0VSUk9SKCggIlQxLlBhcnNlX0NoYXJTdHJpbmdzIDogdW5leHBlY3RlZCByZXR1cm5cbiIgKSk7CisgICAgICAgICAgICAgIGdvdG8gU3ludGF4X0Vycm9yOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB6b25lLS07CisgICAgICAgICAgICBpcCAgICAgICAgICAgID0gem9uZS0+Y3Vyc29yOworICAgICAgICAgICAgbGltaXQgICAgICAgICA9IHpvbmUtPmxpbWl0OworICAgICAgICAgICAgZGVjb2Rlci0+em9uZSA9IHpvbmU7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2Ugb3Bfc2V0Y3VycmVudHBvaW50OgorICAgICAgICAgICAgRlRfRVJST1IoKCAiVDEuUGFyc2VfQ2hhclN0cmluZ3MgOiB1bmV4cGVjdGVkIFNFVENVUlJFTlRQT0lOVFxuIiApKTsKKyAgICAgICAgICAgIGdvdG8gU3ludGF4X0Vycm9yOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgRlRfRVJST1IoKCAiVDEuUGFyc2VfQ2hhclN0cmluZ3MgOiB1bmhhbmRsZWQgb3Bjb2RlICVkXG4iLCBvcCApKTsKKyAgICAgICAgICAgIGdvdG8gU3ludGF4X0Vycm9yOworICAgICAgICB9CisKKyAgICAgICAgZGVjb2Rlci0+dG9wID0gdG9wOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBlcnJvcjsKKworICBTeW50YXhfRXJyb3I6CisgICAgcmV0dXJuIFQxX0Vycl9TeW50YXhfRXJyb3I7CisKKyAgU3RhY2tfVW5kZXJmbG93OgorICAgIHJldHVybiBUMV9FcnJfU3RhY2tfVW5kZXJmbG93OworICB9CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPEZ1bmN0aW9uPiBUMV9BZGRfUG9pbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQ2hlY2tzIHRoYXQgdGhlcmUgaXMgZW5vdWdoIHJvb20gaW4gdGhlIGN1cnJlbnQgbG9hZCBnbHlwaCBvdXRsaW5lICovCisvKiAgICB0byBhY2NlcHQgIm51bV9wb2ludHMiIGFkZGl0aW9uYWwgb3V0bGluZSBwb2ludHMuIElmIG5vdCwgdGhpcyAgICAgKi8KKy8qICAgIGZ1bmN0aW9uIGdyb3dzIHRoZSBsb2FkIG91dGxpbmUncyBhcnJheXMgYWNjb3JkaW5nbHkuLiAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIGJ1aWxkZXIgICAgOjogcG9pbnRlciB0byBnbHlwaCBidWlsZGVyIG9iamVjdCAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgbnVtX3BvaW50cyA6OiBudW1iZXIgb2YgcG9pbnRzIHRoYXQgd2lsbCBiZSBhZGRlZCBsYXRlciAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgVHlwZTEgZXJyb3IgY29kZS4gMCBtZWFucyBzdWNjZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgVGhpcyBmdW5jdGlvbiBkb2VzIE5PVCB1cGRhdGUgdGhlIHBvaW50cyBjb3VudCBpbiB0aGUgZ2x5cGggYnVpbGRlciovCisvKiAgICBUaGlzIG11c3QgYmUgZG9uZSBieSB0aGUgY2FsbGVyIGl0c2VsZiwgYWZ0ZXIgdGhpcyBmdW5jdGlvbiBpcyAgICAgKi8KKy8qICAgIGludm9rZWQuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIExPQ0FMX0ZVTkMKKyAgVDFfRXJyb3IgIFQxX0FkZF9Qb2ludHMoIFQxX0J1aWxkZXIqICBidWlsZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVDFfSW50ICAgICAgIG51bV9wb2ludHMgKQorICB7CisgICAgVDFfSW50ICAgIG5ld19wb2ludHM7CisKKyAgICBuZXdfcG9pbnRzID0gYnVpbGRlci0+YmFzZS5uX3BvaW50cyArCisgICAgICAgICAgICAgICAgIGJ1aWxkZXItPmN1cnJlbnQubl9wb2ludHMgKworICAgICAgICAgICAgICAgICBudW1fcG9pbnRzOworCisgICAgaWYgKCBuZXdfcG9pbnRzID4gYnVpbGRlci0+bWF4X3BvaW50cyApCisgICAgeworICAgICAgRlRfTWVtb3J5ICBtZW1vcnkgICAgPSBidWlsZGVyLT5tZW1vcnk7CisgICAgICBUMV9FcnJvciAgIGVycm9yOworICAgICAgVDFfSW50ICAgICBpbmNyZW1lbnQgPSBidWlsZGVyLT5jdXJyZW50LnBvaW50cyAtIGJ1aWxkZXItPmJhc2UucG9pbnRzOworICAgICAgVDFfSW50ICAgICBjdXJyZW50ICAgPSBidWlsZGVyLT5tYXhfcG9pbnRzOworCisgICAgICB3aGlsZSAoIGJ1aWxkZXItPm1heF9wb2ludHMgPCBuZXdfcG9pbnRzICkKKyAgICAgICAgYnVpbGRlci0+bWF4X3BvaW50cyArPSAxNjsKKworICAgICAgaWYgKCBSRUFMTE9DX0FSUkFZKCBidWlsZGVyLT5iYXNlLnBvaW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCwgYnVpbGRlci0+bWF4X3BvaW50cywgVDFfVmVjdG9yICkgIHx8CisgIAorICAgICAgICAgICBSRUFMTE9DX0FSUkFZKCBidWlsZGVyLT5iYXNlLmZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50LCBidWlsZGVyLT5tYXhfcG9pbnRzLCBUMV9CeXRlICkgICAgKQorICAgICAgICByZXR1cm4gZXJyb3I7CisgICAgCisgICAgICBidWlsZGVyLT5jdXJyZW50LnBvaW50cyA9IGJ1aWxkZXItPmJhc2UucG9pbnRzICsgaW5jcmVtZW50OworICAgICAgYnVpbGRlci0+Y3VycmVudC5mbGFncyAgPSBidWlsZGVyLT5iYXNlLmZsYWdzICArIGluY3JlbWVudDsKKyAgICB9CisKKyAgICByZXR1cm4gVDFfRXJyX09rOworICB9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA8RnVuY3Rpb24+IFQxX0FkZF9Db250b3VycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBDaGVja3MgdGhhdCB0aGVyZSBpcyBlbm91Z2ggcm9vbSBpbiB0aGUgY3VycmVudCBsb2FkIGdseXBoIG91dGxpbmUgKi8KKy8qICAgIHRvIGFjY2VwdCAibnVtX2NvbnRvdXJzIiBhZGRpdGlvbmFsIGNvbnRvdXJzLiBJZiBub3QsIHRoaXMgZnVuYyAgICAqLworLyogICAgdGhlIGxvYWQgb3V0bGluZSdzIGFycmF5cyBhY2NvcmRpbmdseS4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgYnVpbGRlciAgICAgICA6OiBwb2ludGVyIHRvIGdseXBoIGJ1aWxkZXIgb2JqZWN0ICAgICAgICAgICAgICAgICAgICovCisvKiAgICBudW1fY29udG91cnMgOjogbnVtYmVyIG9mIGNvbnRvdXJzIHRoYXQgd2lsbCBiZSBhZGRlZCBsYXRlciAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBUeXBlMSBlcnJvciBjb2RlLiAwIG1lYW5zIHN1Y2Nlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBUaGlzIGZ1bmN0aW9uIGRvZXMgTk9UIHVwZGF0ZSB0aGUgY29udG91cnMgY291bnQgaW4gdGhlIGxvYWQgZ2x5cGggKi8KKy8qICAgIFRoaXMgbXVzdCBiZSBkb25lIGJ5IHRoZSBjYWxsZXIgaXRzZWxmLCBhZnRlciB0aGlzIGZ1bmN0aW9uIGlzICAgICAqLworLyogICAgaW52b2tlZC4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgTE9DQUxfRlVOQworICBUMV9FcnJvciAgVDFfQWRkX0NvbnRvdXJzKCBUMV9CdWlsZGVyKiAgYnVpbGRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVDFfSW50ICAgICAgIG51bV9jb250b3VycyApCisgIHsKKyAgICBUMV9JbnQgICAgbmV3X2NvbnRvdXJzOworCisgICAgbmV3X2NvbnRvdXJzID0gYnVpbGRlci0+YmFzZS5uX2NvbnRvdXJzICsKKyAgICAgICAgICAgICAgICAgICBidWlsZGVyLT5jdXJyZW50Lm5fY29udG91cnMgKworICAgICAgICAgICAgICAgICAgIG51bV9jb250b3VyczsKKworICAgIGlmICggbmV3X2NvbnRvdXJzID4gYnVpbGRlci0+bWF4X2NvbnRvdXJzICYmIGJ1aWxkZXItPmxvYWRfcG9pbnRzICkKKyAgICB7CisgICAgICBUMV9FcnJvciAgZXJyb3I7CisgICAgICBGVF9NZW1vcnkgbWVtb3J5ID0gYnVpbGRlci0+bWVtb3J5OworICAgICAgVDFfSW50ICAgIGluY3JlbWVudCA9IGJ1aWxkZXItPmN1cnJlbnQuY29udG91cnMgLSBidWlsZGVyLT5iYXNlLmNvbnRvdXJzOworICAgICAgVDFfSW50ICAgIGN1cnJlbnQgICA9IGJ1aWxkZXItPm1heF9jb250b3VyczsKKworICAgICAgd2hpbGUgKCBidWlsZGVyLT5tYXhfY29udG91cnMgPCBuZXdfY29udG91cnMgKQorICAgICAgICBidWlsZGVyLT5tYXhfY29udG91cnMgKz0gNDsKKworICAgICAgaWYgKCBSRUFMTE9DX0FSUkFZKCBidWlsZGVyLT5iYXNlLmNvbnRvdXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50LCBidWlsZGVyLT5tYXhfY29udG91cnMsIFQxX1Nob3J0ICkgKQorICAgICAgICByZXR1cm4gZXJyb3I7CisgIAorICAgICAgYnVpbGRlci0+Y3VycmVudC5jb250b3VycyA9IGJ1aWxkZXItPmJhc2UuY29udG91cnMgKyBpbmNyZW1lbnQ7CisgICAgfQorCisgICAgcmV0dXJuIFQxX0Vycl9PazsKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKiovCisgIC8qKioqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqLworICAvKioqKioqKioqKiAgICAgICAgICAgQ09NUFVURSBUSEUgTUFYSU1VTSBBRFZBTkNFIFdJRFRIICAgICAgICoqKioqKioqKi8KKyAgLyoqKioqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKiovCisgIC8qKioqKioqKioqICAgVGhlIGZvbGxvd2luZyBjb2RlIGlzIGluIGNoYXJnZSBvZiBjb21wdXRpbmcgICAgKioqKioqKioqLworICAvKioqKioqKioqKiAgIHRoZSBtYXhpbXVtIGFkdmFuY2Ugd2lkdGggb2YgdGhlIGZvbnQuIEl0ICAgICAgICoqKioqKioqKi8KKyAgLyoqKioqKioqKiogICBxdWlja2x5IHByb2Nlc3MgZWFjaCBnbHlwaCBjaGFyc3RyaW5nIHRvICAgICAgICAqKioqKioqKiovCisgIC8qKioqKioqKioqICAgZXh0cmFjdCB0aGUgdmFsdWUgZnJvbSBlaXRoZXIgYSAic2J3IiBvciAic2VhYyIgKioqKioqKioqLworICAvKioqKioqKioqKiAgIG9wZXJhdG9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKi8KKyAgLyoqKioqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworCisgIHN0YXRpYworICBUMV9FcnJvciAgbWF4YWR2X3NidyggVDFfRGVjb2RlciogIGRlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBUMV9Qb3MgICAgICAgc2J4LAorICAgICAgICAgICAgICAgICAgICAgICAgVDFfUG9zICAgICAgIHNieSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFQxX1BvcyAgICAgICB3eCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFQxX1BvcyAgICAgICB3eSApCisgIHsKKyAgICBpZiAod3ggPiBkZWNvZGVyLT5idWlsZGVyLmFkdmFuY2UueCkKKyAgICAgIGRlY29kZXItPmJ1aWxkZXIuYWR2YW5jZS54ID0gd3g7CisKKyAgICAodm9pZClzYng7CisgICAgKHZvaWQpc2J5OworICAgICh2b2lkKXd5OworICAgIHJldHVybiAtMTsgICAgLyogcmV0dXJuIGFuIGVycm9yIGNvZGUgdG8gZXhpdCB0aGUgVHlwZSAxIHBhcnNlciAqLworICAgICAgICAgICAgICAgICAgLyogaW1tZWRpYXRlbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB9CisKKworICBzdGF0aWMKKyAgVDFfSW50ICBtYXhhZHZfZXJyb3IoIHZvaWQgKQorICB7CisgICAgLyogd2Ugc2hvdWxkIG5ldmVyIHJlYWNoIHRoaXMgY29kZSwgdW5sZXNzIHdpdGggYSBidWdneSBmb250ICovCisgICAgcmV0dXJuIC0yOworICB9CisKKyAgLyogdGhlIG1heGFkdl9nYnVpbGRlcl9pbnRlcmZhY2UgaXMgdXNlZCB3aGVuIGNvbXB1dGluZyB0aGUgbWF4aW11bSAgKi8KKyAgLyogYWR2YW5jZSB3aWR0aCBvZiBhbGwgZ2x5cGhzIGluIGEgZ2l2ZW4gZm9udC4gV2Ugb25seSBwcm9jZXNzIHRoZSAqLworICAvKiAnc2J3JyBvcGVyYXRvciBoZXJlLCBhbmQgcmV0dXJuIGFuIGVycm9yIGZvciBhbGwgb3RoZXJzLi4gICAgICAgICovCisKKyAgLyogTm90ZSB0aGF0ICJzZWFjIiBpcyBwcm9jZXNzZWQgYnkgdGhlIFQxX0RlY29kZXIgICAgICAgICAgICAgICAgICAqLworICBzdGF0aWMKKyAgY29uc3QgVDFfQnVpbGRlcl9GdW5jcyAgbWF4YWR2X2J1aWxkZXJfaW50ZXJmYWNlID0KKyAgeworICAgIChUMV9CdWlsZGVyX0VuZENoYXIpICAgICBtYXhhZHZfZXJyb3IsCisgICAgKFQxX0J1aWxkZXJfU2J3KSAgICAgICAgIG1heGFkdl9zYncsCisgICAgKFQxX0J1aWxkZXJfQ2xvc2VQYXRoKSAgIG1heGFkdl9lcnJvciwKKyAgICAoVDFfQnVpbGRlcl9STGluZVRvKSAgICAgbWF4YWR2X2Vycm9yLAorICAgIChUMV9CdWlsZGVyX1JNb3ZlVG8pICAgICBtYXhhZHZfZXJyb3IsCisgICAgKFQxX0J1aWxkZXJfUkN1cnZlVG8pICAgIG1heGFkdl9lcnJvcgorICB9OworCisKKyAgLyogdGhlIG1heGFkdl9pbnRlcmZhY2UgaXMgdXNlZCB3aGVuIGNvbXB1dGluZyB0aGUgbWF4aW11bSBhZHZhbmNlICovCisgIC8qIHdpdGggb2YgdGhlIHNldCBvZiBnbHlwaHMgaW4gYSBnaXZlbiBmb250IGZpbGUuIFdlIG9ubHkgcHJvY2VzcyAqLworICAvKiB0aGUgInNlYWMiIG9wZXJhdG9yIGFuZCByZXR1cm4gaW1tZWRpYXRlbHkuLiAgICAgICAgICAgICAgICAgICAgKi8KKyAgc3RhdGljCisgIGNvbnN0IFQxX0hpbnRlcl9GdW5jcyAgbWF4YWR2X2hpbnRlcl9pbnRlcmZhY2UgPQorICB7CisgICAgKFQxX0hpbnRlcl9Eb3RTZWN0aW9uKSAgIG1heGFkdl9lcnJvciwKKyAgICAoVDFfSGludGVyX0NoYW5nZUhpbnRzKSAgbWF4YWR2X2Vycm9yLAorICAgIChUMV9IaW50ZXJfU3RlbSkgICAgICAgICBtYXhhZHZfZXJyb3IsCisgICAgKFQxX0hpbnRlcl9TdGVtMykgICAgICAgIG1heGFkdl9lcnJvciwKKyAgfTsKKworCisKKyAgTE9DQUxfRlVOQworICBUMV9FcnJvciAgVDFfQ29tcHV0ZV9NYXhfQWR2YW5jZSggVDFfRmFjZSAgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQxX0ludCAgKm1heF9hZHZhbmNlICkKKyAgeworICAgIFQxX0Vycm9yICAgIGVycm9yOworICAgIFQxX0RlY29kZXIgIGRlY29kZXI7CisgICAgVDFfSW50ICAgICAgZ2x5cGhfaW5kZXg7CisKKyAgICAqbWF4X2FkdmFuY2UgPSAwOworCisgICAgLyogSW5pdGlhbGlzZSBsb2FkIGRlY29kZXIgKi8KKyAgICBUMV9Jbml0X0RlY29kZXIoICZkZWNvZGVyLCAmbWF4YWR2X2hpbnRlcl9pbnRlcmZhY2UgKTsKKworICAgIFQxX0luaXRfQnVpbGRlciggJmRlY29kZXIuYnVpbGRlciwgZmFjZSwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICZtYXhhZHZfYnVpbGRlcl9pbnRlcmZhY2UgKTsKKworICAgIC8qIEZvciBlYWNoIGdseXBoLCBwYXJzZSB0aGUgZ2x5cGggY2hhcnN0cmluZyBhbmQgZXh0cmFjdCAqLworICAgIC8qIHRoZSBhZHZhbmNlIHdpZHRoLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGZvciAoIGdseXBoX2luZGV4ID0gMDsgZ2x5cGhfaW5kZXggPCBmYWNlLT5udW1fZ2x5cGhzOyBnbHlwaF9pbmRleCsrICkKKyAgICB7CisgICAgICAvKiBub3cgZ2V0IGxvYWQgdGhlIHVuc2NhbGVkIG91dGxpbmUgKi8KKyAgICAgIGVycm9yID0gVDFfUGFyc2VfQ2hhclN0cmluZ3MoICZkZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZS0+Y2hhcnN0cmluZ3MgICAgW2dseXBoX2luZGV4XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2UtPmNoYXJzdHJpbmdzX2xlbltnbHlwaF9pbmRleF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlLT5udW1fc3VicnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlLT5zdWJycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2UtPnN1YnJzX2xlbiApOworICAgICAgLyogaWdub3JlIHRoZSBlcnJvciBpZiBvbmUgb2NjdXJlZCAtIHNraXAgdG8gbmV4dCBnbHlwaCAqLworICAgICAgKHZvaWQpZXJyb3I7CisgICAgfQorCisgICAgKm1heF9hZHZhbmNlID0gZGVjb2Rlci5idWlsZGVyLmFkdmFuY2UueDsKKyAgICByZXR1cm4gVDFfRXJyX09rOworICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKi8KKyAgLyoqKioqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKiovCisgIC8qKioqKioqKioqICAgICAgICAgICAgICBVTkhJTlRFRCBHTFlQSCBMT0FERVIgICAgICAgICAgICAgICAgKioqKioqKioqLworICAvKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKi8KKyAgLyoqKioqKioqKiogICBUaGUgZm9sbG93aW5nIGNvZGUgaXMgaW4gY2hhcmdlIG9mIGxvYWRpbmcgYSAgICAqKioqKioqKiovCisgIC8qKioqKioqKioqICAgc2luZ2xlIG91dGxpbmUuIEl0IGNvbXBsZXRlbHkgaWdub3JlcyBoaW50aW5nICAgKioqKioqKioqLworICAvKioqKioqKioqKiAgIGFuZCBpcyB1c2VkIHdoZW4gRlRfTE9BRF9OT19ISU5USU5HIGlzIHNldC4gICAgICoqKioqKioqKi8KKyAgLyoqKioqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKiovCisgIC8qKioqKioqKioqICAgICBUaGUgVHlwZSAxIGhpbnRlciBpcyBsb2NhdGVkIGluICJ0MWhpbnQuYyIgICAgKioqKioqKioqLworICAvKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisKKyAgc3RhdGljCisgIFQxX0Vycm9yICBjbG9zZV9vcGVuX3BhdGgoIFQxX0J1aWxkZXIqICBidWlsZGVyICkKKyAgeworICAgIFQxX0Vycm9yICAgICBlcnJvcjsKKyAgICBGVF9PdXRsaW5lKiAgY3VyID0gJmJ1aWxkZXItPmN1cnJlbnQ7CisgICAgVDFfSW50ICAgICAgIG51bV9wb2ludHM7CisgICAgVDFfSW50ICAgICAgIGZpcnN0X3BvaW50OworICAgICAgCisgICAgLyogU29tZSBmb250cywgbGlrZSBIZXJzaGV5LCBhcmUgbWFkZSBvZiAib3BlbiBwYXRocyIgd2hpY2ggYXJlICAgICovCisgICAgLyogbm93IG1hbmFnZWQgZGlyZWN0bHkgYnkgRnJlZVR5cGUuIEluIHRoaXMgY2FzZSwgaXQgaXMgbmVjZXNzYXJ5ICovCisgICAgLyogdG8gY2xvc2UgdGhlIHBhdGggYnkgZHVwbGljYXRpbmcgaXRzIHBvaW50cyBpbiByZXZlcnNlIG9yZGVyLCAgICovCisgICAgLyogd2hpY2ggaXMgcHJlY2lzZWx5IHRoZSBwdXJwb3NlIG9mIHRoaXMgZnVuY3Rpb24gICAgICAgICAgICAgICAgICovCisKKyAgICAvKiBmaXJzdCBjb21wdXRlIHRoZSBudW1iZXIgb2YgcG9pbnRzIHRvIGR1cGxpY2F0ZS4uICAgICAgICAgICAqLworICAgIGlmIChjdXItPm5fY29udG91cnMgPiAxKQorICAgICAgZmlyc3RfcG9pbnQgPSBjdXItPmNvbnRvdXJzWyBjdXItPm5fY29udG91cnMtMiBdKzE7CisgICAgZWxzZQorICAgICAgZmlyc3RfcG9pbnQgPSAwOworICAgICAgICAKKyAgICBudW1fcG9pbnRzID0gY3VyLT5uX3BvaW50cyAtIGZpcnN0X3BvaW50IC0gMjsKKyAgICBpZiAoIG51bV9wb2ludHMgPiAwICkKKyAgICB7CisgICAgICBUMV9WZWN0b3IqICBzb3VyY2VfcG9pbnQ7CisgICAgICBjaGFyKiAgICAgICBzb3VyY2VfZmxhZ3M7CisgICAgICBUMV9WZWN0b3IqICBwb2ludDsKKyAgICAgIGNoYXIqICAgICAgIGZsYWdzOworICAgICAgICAgICAgICAKKyAgICAgIGVycm9yID0gVDFfQWRkX1BvaW50cyggYnVpbGRlciwgbnVtX3BvaW50cyApOworICAgICAgaWYgKGVycm9yKSByZXR1cm4gZXJyb3I7CisKKyAgICAgIHBvaW50ID0gY3VyLT5wb2ludHMgKyBjdXItPm5fcG9pbnRzOworICAgICAgZmxhZ3MgPSBjdXItPmZsYWdzICArIGN1ci0+bl9wb2ludHM7CisgICAgICAgIAorICAgICAgc291cmNlX3BvaW50ICAgPSBwb2ludCAtIDI7CisgICAgICBzb3VyY2VfZmxhZ3MgICA9IGZsYWdzIC0gMjsKKworICAgICAgY3VyLT5uX3BvaW50cyArPSBudW1fcG9pbnRzOworCisgICAgICBpZiAoIGJ1aWxkZXItPmxvYWRfcG9pbnRzICkgIAorICAgICAgICBkbworICAgICAgICB7CisgICAgICAgICAgKnBvaW50KysgPSAqc291cmNlX3BvaW50LS07CisgICAgICAgICAgKmZsYWdzKysgPSAqc291cmNlX2ZsYWdzLS07CisgICAgICAgICAgbnVtX3BvaW50cy0tOworICAgICAgICB9CisgICAgICAgIHdoaWxlIChudW1fcG9pbnRzID4gMCk7CisgICAgfQorCisgICAgYnVpbGRlci0+cGF0aF9iZWd1biA9IDA7CisgICAgcmV0dXJuIFQxX0Vycl9PazsKKyAgfQorCisKKyAgc3RhdGljCisgIFQxX0Vycm9yICBnbG9hZF9jbG9zZXBhdGgoIFQxX0J1aWxkZXIqICBidWlsZGVyICkKKyAgeworICAgIEZUX091dGxpbmUqICBjdXIgPSAmYnVpbGRlci0+Y3VycmVudDsKKworICAgIC8qIHNhdmUgY3VycmVudCBjb250b3VyLCBpZiBhbnkgKi8KKyAgICBpZiAoIGN1ci0+bl9jb250b3VycyA+IDAgKQorICAgICAgY3VyLT5jb250b3Vyc1tjdXItPm5fY29udG91cnMtMV0gPSBjdXItPm5fcG9pbnRzLTE7CisKKyNpZm5kZWYgVDFfQ09ORklHX09QVElPTl9ESVNBQkxFX0hJTlRFUgorICAgIC8qIGhpbnQgbGF0ZXN0IHBvaW50cyBpZiBuZWVkZWQgLSB0aGlzIGlzIG5vdCBzdHJpY3RseSByZXF1aXJlZCAgICAgICovCisgICAgLyogdGhlcmUsIGJ1dCBpdCBoZWxwcyBmb3IgZGVidWdnaW5nLCBhbmQgZG9lc24ndCBhZmZlY3QgcGVyZm9ybWFuY2UgKi8KKyAgICBpZiAoIGJ1aWxkZXItPnBhc3MgPT0gMSApCisgICAgICBUMV9IaW50X1BvaW50cyggYnVpbGRlciApOworI2VuZGlmCisKKyAgICBidWlsZGVyLT5wYXRoX2JlZ3VuID0gMDsKKyAgICByZXR1cm4gVDFfRXJyX09rOworICB9CisKKworCisgIHN0YXRpYworICBUMV9FcnJvciAgZ2xvYWRfZW5kY2hhciggVDFfQnVpbGRlciogIGJ1aWxkZXIgKQorICB7CisgICAgRlRfT3V0bGluZSogIGN1ciA9ICZidWlsZGVyLT5jdXJyZW50OworICAgIFQxX0Vycm9yICAgICBlcnJvcjsKKworICAgIC8qIGNsb3NlIHBhdGggaWYgbmVlZGVkICovCisgICAgaWYgKGJ1aWxkZXItPnBhdGhfYmVndW4pCisgICAgeworICAgICAgZXJyb3IgPSBjbG9zZV9vcGVuX3BhdGgoIGJ1aWxkZXIgKTsKKyAgICAgIGlmIChlcnJvcikgcmV0dXJuIGVycm9yOworICAgIH0KKworICAgIGVycm9yID0gZ2xvYWRfY2xvc2VwYXRoKCBidWlsZGVyICk7ICAKKworICAgIGJ1aWxkZXItPmJhc2Uubl9wb2ludHMgICArPSBjdXItPm5fcG9pbnRzOworICAgIGJ1aWxkZXItPmJhc2Uubl9jb250b3VycyArPSBjdXItPm5fY29udG91cnM7CisKKyAgICByZXR1cm4gZXJyb3I7CisgIH0KKworCisKKyAgc3RhdGljCisgIFQxX0Vycm9yICBnbG9hZF9zYncoIFQxX0J1aWxkZXIqICBidWlsZGVyLAorICAgICAgICAgICAgICAgICAgICAgICBUMV9Qb3MgICAgICAgc2J4LAorICAgICAgICAgICAgICAgICAgICAgICBUMV9Qb3MgICAgICAgc2J5LAorICAgICAgICAgICAgICAgICAgICAgICBUMV9Qb3MgICAgICAgd3gsCisgICAgICAgICAgICAgICAgICAgICAgIFQxX1BvcyAgICAgICB3eSApCisgIHsKKyAgICBidWlsZGVyLT5sZWZ0X2JlYXJpbmcueCArPSBzYng7CisgICAgYnVpbGRlci0+bGVmdF9iZWFyaW5nLnkgKz0gc2J5OworICAgIGJ1aWxkZXItPmFkdmFuY2UueCAgICAgICA9IHd4OworICAgIGJ1aWxkZXItPmFkdmFuY2UueSAgICAgICA9IHd5OworCisgICAgYnVpbGRlci0+bGFzdC54ID0gc2J4OworICAgIGJ1aWxkZXItPmxhc3QueSA9IHNieTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisKKworCisgIHN0YXRpYworICBUMV9FcnJvciAgZ2xvYWRfcmxpbmV0byggVDFfQnVpbGRlciogIGJ1aWxkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUMV9Qb3MgICAgICAgZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUMV9Qb3MgICAgICAgZHkgKQorICB7CisgICAgVDFfRXJyb3IgICAgIGVycm9yOworICAgIEZUX091dGxpbmUqICBjdXIgPSAmYnVpbGRlci0+Y3VycmVudDsKKyAgICBUMV9WZWN0b3IgICAgdmVjOworCisgICAgLyogZ3JvdyBidWZmZXIgaWYgbmVjZXNzYXJ5ICovCisgICAgZXJyb3IgPSBUMV9BZGRfUG9pbnRzICAoIGJ1aWxkZXIsIDEgKTsKKyAgICBpZiAoZXJyb3IpIHJldHVybiBlcnJvcjsKKworICAgIGlmICggYnVpbGRlci0+bG9hZF9wb2ludHMgKQorICAgIHsKKyAgICAgIC8qIHNhdmUgcG9pbnQgKi8KKyAgICAgIHZlYy54ID0gYnVpbGRlci0+bGFzdC54ICsgZHg7CisgICAgICB2ZWMueSA9IGJ1aWxkZXItPmxhc3QueSArIGR5OworCisgICAgICBjdXItPnBvaW50c1tjdXItPm5fcG9pbnRzXSA9IHZlYzsKKyAgICAgIGN1ci0+ZmxhZ3MgW2N1ci0+bl9wb2ludHNdID0gRlRfQ3VydmVfVGFnX09uOworCisgICAgICBidWlsZGVyLT5sYXN0ID0gdmVjOworICAgIH0KKyAgICBjdXItPm5fcG9pbnRzKys7CisKKyAgICBidWlsZGVyLT5wYXRoX2JlZ3VuICA9IDE7CisgICAgcmV0dXJuIFQxX0Vycl9PazsKKyAgfQorCisKKyAgc3RhdGljCisgIFQxX0Vycm9yICBnbG9hZF9ybW92ZXRvKCBUMV9CdWlsZGVyKiAgYnVpbGRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFQxX1BvcyAgICAgICBkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFQxX1BvcyAgICAgICBkeSApCisgIHsKKyAgICBUMV9FcnJvciAgICAgZXJyb3I7CisgICAgRlRfT3V0bGluZSogIGN1ciA9ICZidWlsZGVyLT5jdXJyZW50OworICAgIFQxX1ZlY3RvciAgICB2ZWM7CisKKyAgICAvKiBpbiB0aGUgY2FzZSB3aGVyZSAicGF0aF9iZWd1biIgaXMgc2V0LCB3ZSBoYXZlIGEgcm1vdmV0byAgICAqLworICAgIC8qIGFmdGVyIHNvbWUgbm9ybWFsIHBhdGggZGVmaW5pdGlvbi4gV2hlbiB0aGUgZmFjZSdzIHBhaW50ICAgICovCisgICAgLyogdHlwZSBpcyBzZXQgdG8gMSwgdGhpcyBtZWFucyB0aGF0IHdlIGhhdmUgYW4gIm9wZW4gcGF0aCIsICAgKi8KKyAgICAvKiBhbHNvIGNhbGxlZCBhICdzdHJva2UnLiBUaGUgRnJlZVR5cGUgcmFzdGVyIGRvZXNuJ3Qgc3VwcG9ydCAqLworICAgIC8qIG9wZW5lZCBwYXRoLCBzbyB3ZSdsbCBjbG9zZSBpdCBleHBsaWNpdGVseSB0aGVyZS4uICAgICAgICAgICovCisgICAgaWYgKCBidWlsZGVyLT5wYXRoX2JlZ3VuICYmIGJ1aWxkZXItPmZhY2UtPnBhaW50X3R5cGUgPT0gMSApCisgICAgeworICAgICAgaWYgKCBidWlsZGVyLT5mYWNlLT5wYWludF90eXBlID09IDEgKQorICAgICAgeworICAgICAgICBlcnJvciA9IGNsb3NlX29wZW5fcGF0aCggYnVpbGRlciApOworICAgICAgICBpZiAoZXJyb3IpIHJldHVybiBlcnJvcjsKKyAgICAgIH0KKyAgICB9CisgICAgCisgICAgLyogZ3JvdyBidWZmZXIgaWYgbmVjZXNzYXJ5ICovCisgICAgZXJyb3IgPSBUMV9BZGRfQ29udG91cnMoIGJ1aWxkZXIsIDEgKSB8fAorICAgICAgICAgICAgVDFfQWRkX1BvaW50cyAgKCBidWlsZGVyLCAxICk7CisgICAgaWYgKGVycm9yKSByZXR1cm4gZXJyb3I7CisKKyAgICAvKiBzYXZlIGN1cnJlbnQgY29udG91ciwgaWYgYW55ICovCisgICAgaWYgKCBjdXItPm5fY29udG91cnMgPiAwICkKKyAgICAgIGN1ci0+Y29udG91cnNbY3VyLT5uX2NvbnRvdXJzLTFdID0gY3VyLT5uX3BvaW50cy0xOworCisgICAgaWYgKCBidWlsZGVyLT5sb2FkX3BvaW50cyApCisgICAgeworICAgICAgLyogc2F2ZSBwb2ludCAqLworICAgICAgdmVjLnggPSBidWlsZGVyLT5sYXN0LnggKyBkeDsKKyAgICAgIHZlYy55ID0gYnVpbGRlci0+bGFzdC55ICsgZHk7CisgICAgICBjdXItPnBvaW50c1tjdXItPm5fcG9pbnRzXSA9IHZlYzsKKyAgICAgIGN1ci0+ZmxhZ3MgW2N1ci0+bl9wb2ludHNdID0gRlRfQ3VydmVfVGFnX09uOworCisgICAgICBidWlsZGVyLT5sYXN0ID0gdmVjOworICAgIH0KKworICAgIGN1ci0+bl9jb250b3VycysrOworICAgIGN1ci0+bl9wb2ludHMrKzsKKworICAgIHJldHVybiBUMV9FcnJfT2s7CisgIH0KKworCisgIHN0YXRpYworICBUMV9FcnJvciAgZ2xvYWRfcnJjdXJ2ZXRvKCBUMV9CdWlsZGVyKiAgYnVpbGRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVDFfUG9zICAgICAgIGR4MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVDFfUG9zICAgICAgIGR5MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVDFfUG9zICAgICAgIGR4MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVDFfUG9zICAgICAgIGR5MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVDFfUG9zICAgICAgIGR4MywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVDFfUG9zICAgICAgIGR5MyApCisgIHsKKyAgICBUMV9FcnJvciAgICAgZXJyb3I7CisgICAgRlRfT3V0bGluZSogIGN1ciA9ICZidWlsZGVyLT5jdXJyZW50OworICAgIFQxX1ZlY3RvciAgICB2ZWM7CisgICAgVDFfVmVjdG9yKiAgIHBvaW50czsKKyAgICBjaGFyKiAgICAgICAgZmxhZ3M7CisKKyAgICAvKiBncm93IGJ1ZmZlciBpZiBuZWNlc3NhcnkgKi8KKyAgICBlcnJvciA9IFQxX0FkZF9Qb2ludHMgICggYnVpbGRlciwgMyApOworICAgIGlmIChlcnJvcikgcmV0dXJuIGVycm9yOworCisgICAgaWYgKCBidWlsZGVyLT5sb2FkX3BvaW50cyApCisgICAgeworICAgICAgLyogc2F2ZSBwb2ludCAqLworICAgICAgcG9pbnRzID0gY3VyLT5wb2ludHMgKyBjdXItPm5fcG9pbnRzOworICAgICAgZmxhZ3MgID0gY3VyLT5mbGFncyAgKyBjdXItPm5fcG9pbnRzOworCisgICAgICB2ZWMueCA9IGJ1aWxkZXItPmxhc3QueCArIGR4MTsKKyAgICAgIHZlYy55ID0gYnVpbGRlci0+bGFzdC55ICsgZHkxOworICAgICAgcG9pbnRzWzBdID0gdmVjOyAgZmxhZ3NbMF0gPSBGVF9DdXJ2ZV9UYWdfQ3ViaWM7CisKKyAgICAgIHZlYy54ICs9IGR4MjsKKyAgICAgIHZlYy55ICs9IGR5MjsKKyAgICAgIHBvaW50c1sxXSA9IHZlYzsgIGZsYWdzWzFdID0gRlRfQ3VydmVfVGFnX0N1YmljOworCisgICAgICB2ZWMueCArPSBkeDM7CisgICAgICB2ZWMueSArPSBkeTM7CisgICAgICBwb2ludHNbMl0gPSB2ZWM7ICBmbGFnc1syXSA9IEZUX0N1cnZlX1RhZ19PbjsKKworICAgICAgYnVpbGRlci0+bGFzdCA9IHZlYzsKKyAgICB9CisgICAgCisgICAgY3VyLT5uX3BvaW50cyAgICAgICs9IDM7CisgICAgYnVpbGRlci0+cGF0aF9iZWd1biA9IDE7CisgICAgcmV0dXJuIFQxX0Vycl9PazsKKyAgfQorCisKKworCisgIHN0YXRpYworICBUMV9FcnJvciAgZ2xvYWRfaWdub3JlKCB2b2lkICkKKyAgeworICAgIHJldHVybiAwOworICB9CisKKworICBzdGF0aWMKKyAgY29uc3QgVDFfQnVpbGRlcl9GdW5jcyAgZ2xvYWRfYnVpbGRlcl9pbnRlcmZhY2UgPQorICB7CisgICAgZ2xvYWRfZW5kY2hhciwKKyAgICBnbG9hZF9zYncsCisgICAgZ2xvYWRfY2xvc2VwYXRoLAorICAgIGdsb2FkX3JsaW5ldG8sCisgICAgZ2xvYWRfcm1vdmV0bywKKyAgICBnbG9hZF9ycmN1cnZldG8KKyAgfTsKKworCisgIHN0YXRpYworICBjb25zdCBUMV9CdWlsZGVyX0Z1bmNzICBnbG9hZF9idWlsZGVyX2ludGVyZmFjZV9udWxsID0KKyAgeworICAgIChUMV9CdWlsZGVyX0VuZENoYXIpICAgIGdsb2FkX2lnbm9yZSwKKyAgICAoVDFfQnVpbGRlcl9TYncpICAgICAgICBnbG9hZF9zYncsICAgICAgLyogcmVjb3JkIGxlZnQgYmVhcmluZyAqLworICAgIChUMV9CdWlsZGVyX0Nsb3NlUGF0aCkgIGdsb2FkX2lnbm9yZSwKKyAgICAoVDFfQnVpbGRlcl9STGluZVRvKSAgICBnbG9hZF9pZ25vcmUsCisgICAgKFQxX0J1aWxkZXJfUk1vdmVUbykgICAgZ2xvYWRfaWdub3JlLAorICAgIChUMV9CdWlsZGVyX1JDdXJ2ZVRvKSAgIGdsb2FkX2lnbm9yZQorICB9OworCisKKyAgc3RhdGljCisgIGNvbnN0IFQxX0hpbnRlcl9GdW5jcyAgIGdsb2FkX2hpbnRlcl9pbnRlcmZhY2UgPQorICB7CisgICAgKFQxX0hpbnRlcl9Eb3RTZWN0aW9uKSAgIGdsb2FkX2lnbm9yZSwgICAvKiBkb3RzZWN0aW9uICAgICAgICAgKi8KKyAgICAoVDFfSGludGVyX0NoYW5nZUhpbnRzKSAgZ2xvYWRfaWdub3JlLCAgIC8qIGNoYW5nZWhpbnRzICAgICAgICAqLworICAgIChUMV9IaW50ZXJfU3RlbSkgICAgICAgICBnbG9hZF9pZ25vcmUsICAgLyogaHN0ZW0gJiB2c3RlbSAgICAgICovCisgICAgKFQxX0hpbnRlcl9TdGVtMykgICAgICAgIGdsb2FkX2lnbm9yZSwgICAvKiBoc3RlbTMgJiB2ZXN0ZW0zICAgKi8KKyAgfTsKKworCisKKworICBMT0NBTF9GVU5DCisgIFQxX0Vycm9yICBUMV9Mb2FkX0dseXBoKCBUMV9HbHlwaFNsb3QgIGdseXBoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVDFfU2l6ZSAgICAgICBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVDFfSW50ICAgICAgICBnbHlwaF9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFQxX0ludCAgICAgICAgbG9hZF9mbGFncyApCisgIHsKKyAgICBUMV9FcnJvciAgICAgICAgZXJyb3I7CisgICAgVDFfRGVjb2RlciAgICAgIGRlY29kZXI7CisgICAgVDFfRmFjZSAgICAgICAgIGZhY2UgPSAoVDFfRmFjZSlnbHlwaC0+cm9vdC5mYWNlOworICAgIFQxX0Jvb2wgICAgICAgICBoaW50aW5nOworCisgICAgZ2x5cGgtPnhfc2NhbGUgPSBzaXplLT5yb290Lm1ldHJpY3MueF9zY2FsZTsKKyAgICBnbHlwaC0+eV9zY2FsZSA9IHNpemUtPnJvb3QubWV0cmljcy55X3NjYWxlOworCisgICAgZ2x5cGgtPnJvb3Qub3V0bGluZS5uX3BvaW50cyAgID0gMDsKKyAgICBnbHlwaC0+cm9vdC5vdXRsaW5lLm5fY29udG91cnMgPSAwOworCisgICAgaGludGluZyA9ICggbG9hZF9mbGFncyAmIEZUX0xPQURfTk9fU0NBTEUgICApID09IDAgJiYKKyAgICAgICAgICAgICAgKCBsb2FkX2ZsYWdzICYgRlRfTE9BRF9OT19ISU5USU5HICkgPT0gMDsKKworICAgIGdseXBoLT5yb290LmZvcm1hdCA9IGZ0X2dseXBoX2Zvcm1hdF9ub25lOworCisjaWZuZGVmIFQxX0NPTkZJR19PUFRJT05fRElTQUJMRV9ISU5URVIKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICBIaW50ZXIgb3ZlcnZpZXcgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogICAgVGhpcyBpcyBhIHR3by1wYXNzIGhpbnRlci4gT24gdGhlIGZpcnN0IHBhc3MsIHRoZSBoaW50cyAgICAqLworICAgIC8qICAgIGFyZSBhbGwgcmVjb3JkZWQgYnkgdGhlIGhpbnRlciwgYW5kIG5vIHBvaW50IGlzIGxvYWRlZCAgICAgKi8KKyAgICAvKiAgICBpbiB0aGUgb3V0bGluZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICAgIFdoZW4gdGhlIGZpcnN0IHBhc3MgaXMgZmluaXNoZWQsIGFsbCBzdGVtcyBoaW50cyBhcmUgICAgICAgKi8KKyAgICAvKiAgICBncmlkLWZpdHRlZCBhdCBvbmNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICAgIFRoZW4sIGEgc2Vjb25kIHBhc3MgaXMgcGVyZm9ybWVkIHRvIGxvYWQgdGhlIG91dGxpbmUgICAgICAgKi8KKyAgICAvKiAgICBwb2ludHMgYXMgd2VsbCBhcyBoaW50L3NjYWxlIHRoZW0gY29ycmVjdGx5LiAgICAgICAgICAgICAgICovCisgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgICAgaWYgKCBoaW50aW5nICkKKyAgICB7CisgICAgICAvKiBQYXNzIDEgLSBkb24ndCByZWNvcmQgcG9pbnRzLCBzaW1wbHkgc3RlbSBoaW50cyAqLworICAgICAgVDFfSW5pdF9EZWNvZGVyKCAmZGVjb2RlciwgJnQxX2hpbnRlcl9mdW5jcyApOworICAgICAgVDFfSW5pdF9CdWlsZGVyKCAmZGVjb2Rlci5idWlsZGVyLCBmYWNlLCBzaXplLCBnbHlwaCwKKyAgICAgICAgICAgICAgICAgICAgICAgJmdsb2FkX2J1aWxkZXJfaW50ZXJmYWNlX251bGwgKTsKKworICAgICAgZ2x5cGgtPmhpbnRzLT5ob3JpX3N0ZW1zLm51bV9zdGVtcyA9IDA7CisgICAgICBnbHlwaC0+aGludHMtPnZlcnRfc3RlbXMubnVtX3N0ZW1zID0gMDsKKworICAgICAgZXJyb3IgPSBUMV9QYXJzZV9DaGFyU3RyaW5ncyggJmRlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlLT5jaGFyc3RyaW5ncyAgICBbZ2x5cGhfaW5kZXhdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZS0+Y2hhcnN0cmluZ3NfbGVuW2dseXBoX2luZGV4XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2UtPm51bV9zdWJycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2UtPnN1YnJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZS0+c3VicnNfbGVuICk7CisKKyAgICAgIC8qIEFsbCByaWdodCwgcGFzcyAxIGlzIGZpbmlzaGVkLCBub3cgZ3JpZC1maXQgYWxsIHN0ZW0gaGludHMgKi8KKyAgICAgIFQxX0hpbnRfU3RlbXMoICZkZWNvZGVyLmJ1aWxkZXIgKTsKKworICAgICAgLyogUGFzcyAyIC0gcmVjb3JkIGFuZCBzY2FsZS9oaW50IHRoZSBwb2ludHMgKi8KKyAgICAgIFQxX0luaXRfRGVjb2RlciggJmRlY29kZXIsICZ0MV9oaW50ZXJfZnVuY3MgKTsKKyAgICAgIFQxX0luaXRfQnVpbGRlciggJmRlY29kZXIuYnVpbGRlciwgZmFjZSwgc2l6ZSwgZ2x5cGgsCisgICAgICAgICAgICAgICAgICAgICAgICZnbG9hZF9idWlsZGVyX2ludGVyZmFjZSApOworCisgICAgICBkZWNvZGVyLmJ1aWxkZXIucGFzcyA9IDE7CisKKyAgICAgIGVycm9yID0gVDFfUGFyc2VfQ2hhclN0cmluZ3MoICZkZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZS0+Y2hhcnN0cmluZ3MgICAgW2dseXBoX2luZGV4XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2UtPmNoYXJzdHJpbmdzX2xlbltnbHlwaF9pbmRleF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlLT5udW1fc3VicnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlLT5zdWJycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2UtPnN1YnJzX2xlbiApOworCisgICAgICAvKiBzYXZlIG5ldyBnbHlwaCB0YWJsZXMgKi8KKyAgICAgIFQxX0RvbmVfQnVpbGRlciggJmRlY29kZXIuYnVpbGRlciApOworICAgIH0KKyAgICBlbHNlCisjZW5kaWYKKyAgICB7CisgICAgICBUMV9Jbml0X0RlY29kZXIoICZkZWNvZGVyLCAmZ2xvYWRfaGludGVyX2ludGVyZmFjZSApOworCisgICAgICBUMV9Jbml0X0J1aWxkZXIoICZkZWNvZGVyLmJ1aWxkZXIsIGZhY2UsIHNpemUsIGdseXBoLAorICAgICAgICAgICAgICAgICAgICAgICAmZ2xvYWRfYnVpbGRlcl9pbnRlcmZhY2UgKTsKKyAgCisgICAgICAvKiBub3cgbG9hZCB0aGUgdW5zY2FsZWQgb3V0bGluZSAqLworICAgICAgZXJyb3IgPSBUMV9QYXJzZV9DaGFyU3RyaW5ncyggJmRlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlLT5jaGFyc3RyaW5ncyAgICBbZ2x5cGhfaW5kZXhdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZS0+Y2hhcnN0cmluZ3NfbGVuW2dseXBoX2luZGV4XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2UtPm51bV9zdWJycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2UtPnN1YnJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZS0+c3VicnNfbGVuICk7CisgIAorICAgICAgLyogc2F2ZSBuZXcgZ2x5cGggdGFibGVzICovCisgICAgICBUMV9Eb25lX0J1aWxkZXIoICZkZWNvZGVyLmJ1aWxkZXIgKTsKKyAgICB9CisKKworICAgIC8qIE5vdywgc2V0IHRoZSBtZXRyaWNzLi4gLSB0aGlzIGlzIHJhdGhlciBzaW1wbGUsIGFzIDogKi8KKyAgICAvKiB0aGUgbGVmdCBzaWRlIGJlYXJpbmcgaXMgdGhlIHhNaW4sIGFuZCB0aGUgdG9wIHNpZGUgICovCisgICAgLyogYmVhcmluZyB0aGUgeU1heC4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGlmICghZXJyb3IpCisgICAgeworICAgICAgRlRfQkJveCAgICAgICAgICAgY2JveDsKKyAgICAgIEZUX0dseXBoX01ldHJpY3MqIG1ldHJpY3MgPSAmZ2x5cGgtPnJvb3QubWV0cmljczsKKworICAgICAgRlRfR2V0X091dGxpbmVfQ0JveCggJmdseXBoLT5yb290Lm91dGxpbmUsICZjYm94ICk7CisKKyAgICAgIC8qIGdyaWQgZml0IHRoZSBib3VuZGluZyBib3ggaWYgbmVjZXNzYXJ5ICovCisgICAgICBpZiAoaGludGluZykKKyAgICAgIHsKKyAgICAgICAgY2JveC54TWluICY9IC02NDsKKyAgICAgICAgY2JveC55TWluICY9IC02NDsKKyAgICAgICAgY2JveC54TWF4ID0gKCBjYm94LnhNYXgrNjMgKSAmIC02NDsKKyAgICAgICAgY2JveC55TWF4ID0gKCBjYm94LnlNYXgrNjMgKSAmIC02NDsKKyAgICAgIH0KKworICAgICAgbWV0cmljcy0+d2lkdGggID0gY2JveC54TWF4IC0gY2JveC54TWluOworICAgICAgbWV0cmljcy0+aGVpZ2h0ID0gY2JveC55TWF4IC0gY2JveC55TWluOworCisgICAgICBtZXRyaWNzLT5ob3JpQmVhcmluZ1ggPSBjYm94LnhNaW47CisgICAgICBtZXRyaWNzLT5ob3JpQmVhcmluZ1kgPSBjYm94LnlNYXg7CisKKyAgICAgIC8qIGNvcHkgdGhlIF91bnNjYWxlZF8gYWR2YW5jZSB3aWR0aCAqLworICAgICAgbWV0cmljcy0+aG9yaUFkdmFuY2UgID0gZGVjb2Rlci5idWlsZGVyLmFkdmFuY2UueDsKKworICAgICAgLyogbWFrZSB1cCB2ZXJ0aWNhbCBtZXRyaWNzICovCisgICAgICBtZXRyaWNzLT52ZXJ0QmVhcmluZ1ggPSAwOworICAgICAgbWV0cmljcy0+dmVydEJlYXJpbmdZID0gMDsKKyAgICAgIG1ldHJpY3MtPnZlcnRBZHZhbmNlICA9IDA7CisKKyAgICAgIGdseXBoLT5yb290LmZvcm1hdCA9IGZ0X2dseXBoX2Zvcm1hdF9vdXRsaW5lOworCisgICAgICBnbHlwaC0+cm9vdC5vdXRsaW5lLnNlY29uZF9wYXNzICAgID0gVFJVRTsKKyAgICAgIGdseXBoLT5yb290Lm91dGxpbmUuaGlnaF9wcmVjaXNpb24gPSAoIHNpemUtPnJvb3QubWV0cmljcy55X3BwZW0gPCAyNCApOworICAgICAgZ2x5cGgtPnJvb3Qub3V0bGluZS5kcm9wb3V0X21vZGUgICA9IDI7CisKKyAgICAgIGlmICggaGludGluZyApCisgICAgICB7CisgICAgICAgIC8qIGFkanVzdCB0aGUgYWR2YW5jZSB3aWR0aCAgICAgICAgICAgICAgICAgICovCisgICAgICAgIC8qIFhYWCA6IFRPRE8gOiBjb25zaWRlciBzdGVtIGhpbnRzIGdyaWQtZml0ICovCisgICAgICAgIG1ldHJpY3MtPmhvcmlBZHZhbmNlICA9IEZUX011bEZpeCggbWV0cmljcy0+aG9yaUFkdmFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGgtPnhfc2NhbGUgKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKCAobG9hZF9mbGFncyAmIEZUX0xPQURfTk9fU0NBTEUpID09IDAgKQorICAgICAgeworICAgICAgICAvKiBzY2FsZSB0aGUgb3V0bGluZSBhbmQgdGhlIG1ldHJpY3MgKi8KKyAgICAgICAgVDFfSW50ICAgICAgIG47CisgICAgICAgIEZUX091dGxpbmUqICBjdXIgPSAmZGVjb2Rlci5idWlsZGVyLmJhc2U7CisgICAgICAgIFQxX1ZlY3RvciogICB2ZWMgPSBjdXItPnBvaW50czsKKyAgICAgICAgVDFfRml4ZWQgICAgIHhfc2NhbGUgPSBnbHlwaC0+eF9zY2FsZTsKKyAgICAgICAgVDFfRml4ZWQgICAgIHlfc2NhbGUgPSBnbHlwaC0+eV9zY2FsZTsKKworICAgICAgICAvKiBGaXJzdCBvZiBhbGwsIHNjYWxlIHRoZSBwb2ludHMgKi8KKyAgICAgICAgZm9yICggbiA9IGN1ci0+bl9wb2ludHM7IG4gPiAwOyBuLS0sIHZlYysrICkKKyAgICAgICAgeworICAgICAgICAgIHZlYy0+eCA9IEZUX011bEZpeCggdmVjLT54LCB4X3NjYWxlICk7CisgICAgICAgICAgdmVjLT55ID0gRlRfTXVsRml4KCB2ZWMtPnksIHlfc2NhbGUgKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFRoZW4gc2NhbGUgdGhlIG1ldHJpY3MgKi8KKyAgICAgICAgbWV0cmljcy0+d2lkdGggID0gRlRfTXVsRml4KCBtZXRyaWNzLT53aWR0aCwgIHhfc2NhbGUgKTsKKyAgICAgICAgbWV0cmljcy0+aGVpZ2h0ID0gRlRfTXVsRml4KCBtZXRyaWNzLT5oZWlnaHQsIHlfc2NhbGUgKTsKKworICAgICAgICBtZXRyaWNzLT5ob3JpQmVhcmluZ1ggPSBGVF9NdWxGaXgoIG1ldHJpY3MtPmhvcmlCZWFyaW5nWCwgeF9zY2FsZSApOworICAgICAgICBtZXRyaWNzLT5ob3JpQmVhcmluZ1kgPSBGVF9NdWxGaXgoIG1ldHJpY3MtPmhvcmlCZWFyaW5nWSwgeV9zY2FsZSApOworICAgICAgICBtZXRyaWNzLT5ob3JpQWR2YW5jZSAgPSBGVF9NdWxGaXgoIG1ldHJpY3MtPmhvcmlBZHZhbmNlLCAgeF9zY2FsZSApOworCisgICAgICAgIG1ldHJpY3MtPnZlcnRCZWFyaW5nWCA9IEZUX011bEZpeCggbWV0cmljcy0+dmVydEJlYXJpbmdYLCB4X3NjYWxlICk7CisgICAgICAgIG1ldHJpY3MtPnZlcnRCZWFyaW5nWSA9IEZUX011bEZpeCggbWV0cmljcy0+dmVydEJlYXJpbmdZLCB5X3NjYWxlICk7CisgICAgICAgIG1ldHJpY3MtPnZlcnRBZHZhbmNlICA9IEZUX011bEZpeCggbWV0cmljcy0+dmVydEFkdmFuY2UsICB4X3NjYWxlICk7CisKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gZXJyb3I7CisgIH0KKwpkaWZmIC0tZ2l0IGEvc3JjL3R5cGUxL3QxZ2xvYWQuaCBiL3NyYy90eXBlMS90MWdsb2FkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjYzNWI4MQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90eXBlMS90MWdsb2FkLmgKQEAgLTAsMCArMSw0MzYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIHQxZ2xvYWQuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMAorICoKKyAqICAgIFR5cGUxIEdseXBoIExvYWRlci4KKyAqCisgKiAgQ29weXJpZ2h0IDE5OTYtMTk5OCBieQorICogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkCisgKiAgbW9kaWZpZWQgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKgorICogIFRoZSBUeXBlIDEgZ2x5cGggbG9hZGVyIHVzZXMgdGhyZWUgZGlzdGluY3Qgb2JqZWN0cyB0byBidWlsZAorICogIHNjYWxlZCBhbmQgaGludGVkIG91dGxpbmVzIGZyb20gYSBjaGFyc3RyaW5ncyBwcm9ncmFtLiBUaGVzZSBhcmUgOgorICoKKyAqICAtIGEgZ2x5cGggYnVpbGRlciwgVDFfQnVpbGRlciwgdXNlZCB0byBzdG9yZSB0aGUgYnVpbHQgb3V0bGluZQorICoKKyAqICAtIGEgZ2x5cGggaGludGVyLCBUMV9IaW50ZXIsIHVzZWQgdG8gcmVjb3JkIGFuZCBhcHBseSB0aGUgc3RlbQorICogICAgaGludHMKKyAqCisgKiAgLSBhIGNoYXJzdHJpbmdzIGludGVycHJldGVyLCBUMV9EZWNvZGVyLCB1c2VkIHRvIHBhcnNlIHRoZQorICogICAgVHlwZSAxIGNoYXJzdHJpbmdzIHN0cmVhbSwgbWFuYWdlIGEgc3RhY2sgYW5kIGNhbGwgdGhlIGJ1aWxkZXIKKyAqICAgIGFuZC9vciBoaW50ZXIgZGVwZW5kaW5nIG9uIHRoZSBvcGNvZGVzLgorICoKKyAqICBJZGVhbGx5LCBhIFR5cGUgMiBnbHlwaCBsb2FkZXIgd291bGQgb25seSBuZWVkIHRvIGhhdmUgaXRzIG93bgorICogIFQyX0RlY29kZXIgb2JqZWN0IChhc3N1bWluZyB0aGUgaGludGVyIGlzIGFibGUgdG8gbWFuYWdlIGFsbAorICogIGtpbmRzIG9mIGhpbnRzKS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIFQxR0xPQURfSAorI2RlZmluZSBUMUdMT0FEX0gKKworI2luY2x1ZGUgPHQxb2Jqcy5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKKyAgZXh0ZXJuICJDIiB7CisjZW5kaWYKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPFN0cnVjdHVyZT4gVDFfQnVpbGRlcl9GdW5jcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgIGEgc3RydWN0dXJlIHVzZWQgdG8gc3RvcmUgdGhlIGFkZHJlc3Mgb2YgdmFyaW91cyBmdW5jdGlvbnMgICAgICAgICovCisvKiAgICAgdXNlZCBieSBhIGdseXBoIGJ1aWxkZXIgdG8gaW1wbGVtZW50IHRoZSBvdXRsaW5lJ3MgInBhdGggICAgICAgICAgKi8KKy8qICAgICBjb25zdHJ1Y3Rpb24iLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBzdHJ1Y3QgVDFfQnVpbGRlcl8gIFQxX0J1aWxkZXI7CisKKyAgdHlwZWRlZiBUMV9FcnJvciAgKCpUMV9CdWlsZGVyX0VuZENoYXIpKCBUMV9CdWlsZGVyKiAgbG9hZGVyICk7CisKKyAgdHlwZWRlZiBUMV9FcnJvciAgKCpUMV9CdWlsZGVyX1NidykgICAgKCBUMV9CdWlsZGVyKiAgbG9hZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQxX1BvcyAgICAgICBzYngsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVDFfUG9zICAgICAgIHNieSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUMV9Qb3MgICAgICAgd3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVDFfUG9zICAgICAgIHd5ICk7CisKKyAgdHlwZWRlZiBUMV9FcnJvciAgKCpUMV9CdWlsZGVyX0Nsb3NlUGF0aCkoIFQxX0J1aWxkZXIqICBsb2FkZXIgKTsKKworICB0eXBlZGVmIFQxX0Vycm9yICAoKlQxX0J1aWxkZXJfUkxpbmVUbykoIFQxX0J1aWxkZXIqICBsb2FkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVDFfUG9zICAgICAgIGR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQxX1BvcyAgICAgICBkeSApOworCisgIHR5cGVkZWYgVDFfRXJyb3IgICgqVDFfQnVpbGRlcl9STW92ZVRvKSggVDFfQnVpbGRlciogIGxvYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUMV9Qb3MgICAgICAgZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVDFfUG9zICAgICAgIGR5ICk7CisKKyAgdHlwZWRlZiBUMV9FcnJvciAgKCpUMV9CdWlsZGVyX1JDdXJ2ZVRvKSggVDFfQnVpbGRlciogIGxvYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVDFfUG9zICAgICAgIGR4MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVDFfUG9zICAgICAgIGR5MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVDFfUG9zICAgICAgIGR4MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVDFfUG9zICAgICAgIGR5MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVDFfUG9zICAgICAgIGR4MywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVDFfUG9zICAgICAgIGR5MyApOworCisgIHR5cGVkZWYgc3RydWN0IFQxX0J1aWxkZXJfRnVuY3NfCisgIHsKKyAgICBUMV9CdWlsZGVyX0VuZENoYXIgICAgZW5kX2NoYXI7CisgICAgVDFfQnVpbGRlcl9TYncgICAgICAgIHNldF9iZWFyaW5nX3BvaW50OworICAgIFQxX0J1aWxkZXJfQ2xvc2VQYXRoICBjbG9zZV9wYXRoOworICAgIFQxX0J1aWxkZXJfUkxpbmVUbyAgICBybGluZV90bzsKKyAgICBUMV9CdWlsZGVyX1JNb3ZlVG8gICAgcm1vdmVfdG87CisgICAgVDFfQnVpbGRlcl9SQ3VydmVUbyAgIHJjdXJ2ZV90bzsKKworICB9IFQxX0J1aWxkZXJfRnVuY3M7CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPFN0cnVjdHVyZT4gVDFfQnVpbGRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgIGEgc3RydWN0dXJlIHVzZWQgZHVyaW5nIGdseXBoIGxvYWRpbmcgdG8gc3RvcmUgaXRzIG91dGxpbmUuICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgc3lzdGVtIDo6IGN1cnJlbnQgc3lzdGVtIG9iamVjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBmYWNlICAgOjogY3VycmVudCBmYWNlIG9iamVjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIHNpemUgICA6OiBjdXJyZW50IHNpemUgb2JqZWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgZ2x5cGggIDo6IGN1cnJlbnQgZ2x5cGggc2xvdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIGN1cnJlbnQgOjogY3VycmVudCBnbHlwaCBvdXRsaW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgYmFzZSAgICA6OiBiYXNlIGdseXBoIG91dGxpbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIG1heF9wb2ludHMgICA6OiBtYXhpbXVtIHBvaW50cyBpbiBidWlsZGVyIG91dGxpbmUgICAgICAgICAgICAgICAgICAqLworLyogICAgbWF4X2NvbnRvdXJzIDo6IG1heGltdW0gY29udG91cnMgaW4gYnVpbGRlciBvdXRsaW5lICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIGxhc3QgICAgIDo6IGxhc3QgcG9pbnQgcG9zaXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBzY2FsZV94ICA6OiBob3Jpem9udGFsIHNjYWxlICggRlVuaXRzIHRvIHN1Yi1waXhlbHMgKSAgICAgICAgICAgICAgKi8KKy8qICAgIHNjYWxlX3kgIDo6IHZlcnRpY2FsIHNjYWxlICAgKCBGVW5pdHMgdG8gc3ViLXBpeGVscyApICAgICAgICAgICAgICAqLworLyogICAgcG9zX3ggICAgOjogaG9yaXpvbnRhbCB0cmFuc2xhdGlvbiAoY29tcG9zaXRlIGdseXBocykgICAgICAgICAgICAgICovCisvKiAgICBwb3NfeSAgICA6OiB2ZXJ0aWNhbCB0cmFuc2xhdGlvbiAgIChjb21wb3NpdGUgZ2x5cGgpICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgbGVmdF9iZWFyaW5nICA6OiBsZWZ0IHNpZGUgYmVhcmluZyBwb2ludCAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBhZHZhbmNlICAgICAgIDo6IGhvcml6b250YWwgYWR2YW5jZSB2ZWN0b3IgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgcGF0aF9iZWd1biAgICA6OiBmbGFnLCBpbmRpY2F0ZXMgdGhhdCBhIG5ldyBwYXRoIGhhcyBiZWd1biAgICAgICAgICovCisvKiAgICBsb2FkX3BvaW50cyAgIDo6IGZsYWcsIGlmIG5vdCBzZXQsIG5vIHBvaW50cyBhcmUgbG9hZGVkICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgcGFzcyAgICAgOjogcGFzcyBudW1iZXIgZm9yIG11bHRpLXBhc3MgaGludGVycyAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIGZ1bmNzICAgIDo6IHRhYmxlIG9mIGJ1aWxkZXIgZnVuY3Rpb25zIHVzZWQgdG8gcGVyZm9ybSAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgdGhlIG91dGxpbmUncyBwYXRoIGNvbnN0cnVjdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIGhpbnRfcG9pbnQgOjogaW5kZXggb2YgbmV4dCBwb2ludCB0byBoaW50Li4gICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgc3RydWN0IFQxX0J1aWxkZXJfCisgIHsKKyAgICBGVF9NZW1vcnkgICAgIG1lbW9yeTsKKyAgICBUMV9GYWNlICAgICAgIGZhY2U7CisgICAgVDFfU2l6ZSAgICAgICBzaXplOworICAgIFQxX0dseXBoU2xvdCAgZ2x5cGg7CisKKyAgICBGVF9PdXRsaW5lICAgIGN1cnJlbnQ7ICAgICAgIC8qIHRoZSBjdXJyZW50IGdseXBoIG91dGxpbmUgICAqLworICAgIEZUX091dGxpbmUgICAgYmFzZTsgICAgICAgICAgLyogdGhlIGNvbXBvc2l0ZSBnbHlwaCBvdXRsaW5lICovCisKKyAgICBUMV9JbnQgICAgICAgIG1heF9wb2ludHM7ICAgIC8qIGNhcGFjaXR5IG9mIGJhc2Ugb3V0bGluZSBpbiBwb2ludHMgICAqLworICAgIFQxX0ludCAgICAgICAgbWF4X2NvbnRvdXJzOyAgLyogY2FwYWNpdHkgb2YgYmFzZSBvdXRsaW5lIGluIGNvbnRvdXJzICovCisKKyAgICBUMV9WZWN0b3IgICAgIGxhc3Q7CisKKyAgICBUMV9GaXhlZCAgICAgIHNjYWxlX3g7CisgICAgVDFfRml4ZWQgICAgICBzY2FsZV95OworCisgICAgVDFfUG9zICAgICAgICBwb3NfeDsKKyAgICBUMV9Qb3MgICAgICAgIHBvc195OworCisgICAgVDFfVmVjdG9yICAgICBsZWZ0X2JlYXJpbmc7CisgICAgVDFfVmVjdG9yICAgICBhZHZhbmNlOworCisgICAgVDFfQkJveCAgICAgICBiYm94OyAgICAgICAgICAvKiBib3VuZGluZyBib3ggKi8KKyAgICBUMV9Cb29sICAgICAgIHBhdGhfYmVndW47CisgICAgVDFfQm9vbCAgICAgICBsb2FkX3BvaW50czsKKworICAgIFQxX0ludCAgICAgICAgcGFzczsKKyAgICBUMV9JbnQgICAgICAgIGhpbnRfcG9pbnQ7CisKKyAgICAvKiBwYXRoIGNvbnN0cnVjdGlvbiBmdW5jdGlvbiBpbnRlcmZhY2UgKi8KKyAgICBUMV9CdWlsZGVyX0Z1bmNzICBmdW5jczsKKyAgfTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPFN0cnVjdHVyZT4gVDFfSGludGVyX0Z1bmNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgIGEgc3RydWN0dXJlIHVzZWQgdG8gc3RvcmUgdGhlIGFkZHJlc3Mgb2YgdmFyaW91cyBmdW5jdGlvbnMgICAgICAgICovCisvKiAgICAgdXNlZCBieSBhIFR5cGUgMSBoaW50ZXIgdG8gcGVyZm9ybSBvdXRsaW5lIGhpbnRpbmcuICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworIAorICB0eXBlZGVmIFQxX0Vycm9yICAoKlQxX0hpbnRlcl9DaGFuZ2VIaW50cykoIFQxX0J1aWxkZXIqICBidWlsZGVyICk7CisKKyAgdHlwZWRlZiBUMV9FcnJvciAgKCpUMV9IaW50ZXJfRG90U2VjdGlvbikoIFQxX0J1aWxkZXIqICBidWlsZGVyICk7CisKKyAgdHlwZWRlZiBUMV9FcnJvciAgKCpUMV9IaW50ZXJfU3RlbSkoIFQxX0J1aWxkZXIqICBidWlsZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVDFfUG9zICAgICAgIHBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQxX1BvcyAgICAgICB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQxX0Jvb2wgICAgICB2ZXJ0aWNhbCApOworCisKKyAgdHlwZWRlZiBUMV9FcnJvciAgKCpUMV9IaW50ZXJfU3RlbTMpKCBUMV9CdWlsZGVyKiAgYnVpbGRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUMV9Qb3MgICAgICAgcG9zMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUMV9Qb3MgICAgICAgd2lkdGgwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQxX1BvcyAgICAgICBwb3MxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQxX1BvcyAgICAgICB3aWR0aDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVDFfUG9zICAgICAgIHBvczIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVDFfUG9zICAgICAgIHdpZHRoMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUMV9Cb29sICAgICAgdmVydGljYWwgKTsKKworICB0eXBlZGVmIHN0cnVjdCBUMV9IaW50ZXJfRnVuY18KKyAgeworICAgIFQxX0hpbnRlcl9DaGFuZ2VIaW50cyAgICAgY2hhbmdlX2hpbnRzOworICAgIFQxX0hpbnRlcl9Eb3RTZWN0aW9uICAgICAgZG90X3NlY3Rpb247CisgICAgVDFfSGludGVyX1N0ZW0gICAgICAgICAgICBzdGVtOworICAgIFQxX0hpbnRlcl9TdGVtMyAgICAgICAgICAgc3RlbTM7CisKKyAgfSBUMV9IaW50ZXJfRnVuY3M7CisKKworCisgIHR5cGVkZWYgZW51bSBUMV9PcGVyYXRvcl8KKyAgeworICAgIG9wX25vbmUgPSAwLAorICAgIG9wX2VuZGNoYXIsCisgICAgb3BfaHNidywKKyAgICBvcF9zZWFjLAorICAgIG9wX3NidywKKyAgICBvcF9jbG9zZXBhdGgsCisgICAgb3BfaGxpbmV0bywKKyAgICBvcF9obW92ZXRvLAorICAgIG9wX2h2Y3VydmV0bywKKyAgICBvcF9ybGluZXRvLAorICAgIG9wX3Jtb3ZldG8sCisgICAgb3BfcnJjdXJ2ZXRvLAorICAgIG9wX3ZoY3VydmV0bywKKyAgICBvcF92bGluZXRvLAorICAgIG9wX3Ztb3ZldG8sCisgICAgb3BfZG90c2VjdGlvbiwKKyAgICBvcF9oc3RlbSwKKyAgICBvcF9oc3RlbTMsCisgICAgb3BfdnN0ZW0sCisgICAgb3BfdnN0ZW0zLAorICAgIG9wX2RpdiwKKyAgICBvcF9jYWxsb3RoZXJzdWJyLAorICAgIG9wX2NhbGxzdWJyLAorICAgIG9wX3BvcCwKKyAgICBvcF9yZXR1cm4sCisgICAgb3Bfc2V0Y3VycmVudHBvaW50LAorCisgICAgb3BfbWF4ICAgIC8qIG5ldmVyIHJlbW92ZSB0aGlzIG9uZSAqLworCisgIH0gVDFfT3BlcmF0b3I7CisKKworCisKKyAgLyogZXhlY3V0aW9uIGNvbnRleHQgY2hhcnN0cmluZyB6b25lICovCisgIHR5cGVkZWYgc3RydWN0IFQxX0RlY29kZXJfWm9uZV8KKyAgeworICAgIFQxX0J5dGUqICBiYXNlOworICAgIFQxX0J5dGUqICBsaW1pdDsKKyAgICBUMV9CeXRlKiAgY3Vyc29yOworCisgIH0gVDFfRGVjb2Rlcl9ab25lOworCisKKyAgdHlwZWRlZiBzdHJ1Y3QgVDFfRGVjb2Rlcl8KKyAgeworICAgIFQxX0J1aWxkZXIgICAgICAgICBidWlsZGVyOworICAgIFQxX0hpbnRlcl9GdW5jcyAgICBoaW50ZXI7CisKKyAgICBUMV9JbnQgICAgICAgICAgICAgc3RhY2tbIFQxX01BWF9DSEFSU1RSSU5HU19PUEVSQU5EUyBdOworICAgIFQxX0ludCogICAgICAgICAgICB0b3A7CisKKyAgICBUMV9EZWNvZGVyX1pvbmUgICAgem9uZXNbIFQxX01BWF9TVUJSU19DQUxMUysxIF07CisgICAgVDFfRGVjb2Rlcl9ab25lKiAgIHpvbmU7CisKKyAgICBUMV9JbnQgICAgICAgICAgICAgZmxleF9zdGF0ZTsKKyAgICBUMV9JbnQgICAgICAgICAgICAgbnVtX2ZsZXhfdmVjdG9yczsKKyAgICBUMV9WZWN0b3IgICAgICAgICAgZmxleF92ZWN0b3JzWzddOworCisgIH0gVDFfRGVjb2RlcjsKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiA8RnVuY3Rpb24+CisgKiAgICBUMV9Jbml0X0J1aWxkZXIKKyAqCisgKiA8RGVzY3JpcHRpb24+CisgKiAgICBJbml0aWFsaXNlIGEgZ2l2ZW4gZ2x5cGggYnVpbGRlci4KKyAqCisgKiA8SW5wdXQ+CisgKiAgICBidWlsZGVyIDo6IGdseXBoIGJ1aWxkZXIgdG8gaW5pdGlhbGlzZQorICogICAgZmFjZSAgICA6OiBjdXJyZW50IGZhY2Ugb2JqZWN0CisgKiAgICBzaXplICAgIDo6IGN1cnJlbnQgc2l6ZSBvYmplY3QKKyAqICAgIGdseXBoICAgOjogY3VycmVudCBnbHlwaCBvYmplY3QKKyAqICAgIGZ1bmNzICAgOjogZ2x5cGggYnVpbGRlciBmdW5jdGlvbnMgKG9yICJtZXRob2RzIikuCisgKgorICogPE5vdGU+CisgKiAgICBUaGlzIGZ1bmN0aW9uIGlzIGV4cG9ydGVkIGZvciBub3cgYmVjYXVzZSBpdCBpcyB1c2VkIGJ5IHRoZQorICogICAgInQxZHVtcCIgdXRpbGl0eS4gTGF0ZXIsIGl0IHdpbGwgYmUgYWNjZXNzZWQgdGhyb3VnaCBhCisgKiAgICBmb3JtYXQtc3BlY2lmaWMgZXh0ZW5zaW9uCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICBFWFBPUlRfREVGCisgIHZvaWQgIFQxX0luaXRfQnVpbGRlciggVDFfQnVpbGRlciogICAgICAgICAgICAgYnVpbGRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBUMV9GYWNlICAgICAgICAgICAgICAgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgIFQxX1NpemUgICAgICAgICAgICAgICAgIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgVDFfR2x5cGhTbG90ICAgICAgICAgICAgZ2x5cGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDFfQnVpbGRlcl9GdW5jcyogZnVuY3MgKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIDxGdW5jdGlvbj4KKyAqICAgIFQxX0RvbmVfQnVpbGRlcgorICoKKyAqIDxEZXNjcmlwdGlvbj4KKyAqICAgIEZpbmFsaXNlIGEgZ2l2ZW4gZ2x5cGggYnVpbGRlci4gSXRzIGNvbnRlbnQgY2FuIHN0aWxsIGJlCisgKiAgICB1c2VkIGFmdGVyIHRoZSBjYWxsLCBidXQgdGhlIGZ1bmN0aW9uIHNhdmVzIGltcG9ydGFudCBpbmZvcm1hdGlvbgorICogICAgd2l0aGluIHRoZSBjb3JyZXNwb25kaW5nIGdseXBoIHNsb3QuCisgKgorICogPElucHV0PgorICogICAgYnVpbGRlciA6OiBnbHlwaCBidWlsZGVyIHRvIGluaXRpYWxpc2UKKyAqCisgKiA8Tm90ZT4KKyAqICAgIFRoaXMgZnVuY3Rpb24gaXMgZXhwb3J0ZWQgZm9yIG5vdyBiZWNhdXNlIGl0IGlzIHVzZWQgYnkgdGhlCisgKiAgICAidDFkdW1wIiB1dGlsaXR5LiBMYXRlciwgaXQgd2lsbCBiZSBhY2Nlc3NlZCB0aHJvdWdoIGEKKyAqICAgIGZvcm1hdC1zcGVjaWZpYyBleHRlbnNpb24KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIEVYUE9SVF9ERUYKKyAgdm9pZCBUMV9Eb25lX0J1aWxkZXIoIFQxX0J1aWxkZXIqICBidWlsZGVyICk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIDxGdW5jdGlvbj4KKyAqICAgIFQxX0luaXRfRGVjb2RlcgorICoKKyAqIDxEZXNjcmlwdGlvbj4KKyAqICAgIEluaXRpYWxpc2UgYSBnaXZlbiBUeXBlIDEgZGVjb2RlciBmb3IgcGFyc2luZworICoKKyAqIDxJbnB1dD4KKyAqICAgIGRlY29kZXIgOjogVHlwZSAxIGRlY29kZXIgdG8gaW5pdGlhbGlzZQorICogICAgZnVuY3MgICA6OiBoaW50ZXIgZnVuY3Rpb25zIGludGVyZmFjZQorICoKKyAqIDxOb3RlPgorICogICAgVGhpcyBmdW5jdGlvbiBpcyBleHBvcnRlZCBmb3Igbm93IGJlY2F1c2UgaXQgaXMgdXNlZCBieSB0aGUKKyAqICAgICJ0MWR1bXAiIHV0aWxpdHkuIExhdGVyLCBpdCB3aWxsIGJlIGFjY2Vzc2VkIHRocm91Z2ggYQorICogICAgZm9ybWF0LXNwZWNpZmljIGV4dGVuc2lvbgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgRVhQT1JUX0RFRgorICB2b2lkICBUMV9Jbml0X0RlY29kZXIoIFQxX0RlY29kZXIqICAgICAgICAgICAgIGRlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDFfSGludGVyX0Z1bmNzKiAgZnVuY3MgKTsKKworCisKKyAgLyogQ29tcHV0ZSB0aGUgbWF4aW11bSBhZHZhbmNlIHdpZHRoIG9mIGEgZm9udCB0aHJvdWdoIHF1aWNrIHBhcnNpbmcgKi8KKyAgTE9DQUxfREVGCisgIFQxX0Vycm9yICBUMV9Db21wdXRlX01heF9BZHZhbmNlKCBUMV9GYWNlICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVDFfSW50ICAqbWF4X2FkdmFuY2UgKTsKKworCisgIC8qIFRoaXMgZnVuY3Rpb24gaXMgZXhwb3J0ZWQsIGJlY2F1c2UgaXQgaXMgdXNlZCBieSB0aGUgVDFEdW1wIHV0aWxpdHkgKi8KKyAgRVhQT1JUX0RFRgorICBUMV9FcnJvciAgIFQxX1BhcnNlX0NoYXJTdHJpbmdzKCBUMV9EZWNvZGVyKiAgZGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVDFfQnl0ZSogICAgIGNoYXJzdHJpbmdfYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVDFfSW50ICAgICAgIGNoYXJzdHJpbmdfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUMV9JbnQgICAgICAgbnVtX3N1YnJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUMV9CeXRlKiogICAgc3VicnNfYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVDFfSW50KiAgICAgIHN1YnJzX2xlbiApOworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIDxGdW5jdGlvbj4gVDFfQWRkX1BvaW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIENoZWNrcyB0aGF0IHRoZXJlIGlzIGVub3VnaCByb29tIGluIHRoZSBjdXJyZW50IGxvYWQgZ2x5cGggb3V0bGluZSAqLworLyogICAgdG8gYWNjZXB0ICJudW1fcG9pbnRzIiBhZGRpdGlvbmFsIG91dGxpbmUgcG9pbnRzLiBJZiBub3QsIHRoaXMgICAgICovCisvKiAgICBmdW5jdGlvbiBncm93cyB0aGUgbG9hZCBvdXRsaW5lJ3MgYXJyYXlzIGFjY29yZGluZ2x5Li4gICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBidWlsZGVyICAgIDo6IHBvaW50ZXIgdG8gZ2x5cGggYnVpbGRlciBvYmplY3QgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIG51bV9wb2ludHMgOjogbnVtYmVyIG9mIHBvaW50cyB0aGF0IHdpbGwgYmUgYWRkZWQgbGF0ZXIgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIFR5cGUxIGVycm9yIGNvZGUuIDAgbWVhbnMgc3VjY2VzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIFRoaXMgZnVuY3Rpb24gZG9lcyBOT1QgdXBkYXRlIHRoZSBwb2ludHMgY291bnQgaW4gdGhlIGdseXBoIGxvYWRlciAqLworLyogICAgVGhpcyBtdXN0IGJlIGRvbmUgYnkgdGhlIGNhbGxlciBpdHNlbGYsIGFmdGVyIHRoaXMgZnVuY3Rpb24gaXMgICAgICovCisvKiAgICBpbnZva2VkLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBMT0NBTF9ERUYKKyAgVDFfRXJyb3IgIFQxX0FkZF9Qb2ludHMoIFQxX0J1aWxkZXIqICBidWlsZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVDFfSW50ICAgICAgIG51bV9wb2ludHMgKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIDxGdW5jdGlvbj4gVDFfQWRkX0NvbnRvdXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIENoZWNrcyB0aGF0IHRoZXJlIGlzIGVub3VnaCByb29tIGluIHRoZSBjdXJyZW50IGxvYWQgZ2x5cGggb3V0bGluZSAqLworLyogICAgdG8gYWNjZXB0ICJudW1fY29udG91cnMiIGFkZGl0aW9uYWwgY29udG91cnMuIElmIG5vdCwgdGhpcyBmdW5jICAgICovCisvKiAgICB0aGUgbG9hZCBvdXRsaW5lJ3MgYXJyYXlzIGFjY29yZGluZ2x5Li4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBidWlsZGVyICAgICAgOjogcG9pbnRlciB0byBnbHlwaCBidWlsZGVyIG9iamVjdCAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIG51bV9jb250b3VycyA6OiBudW1iZXIgb2YgY29udG91cnMgdGhhdCB3aWxsIGJlIGFkZGVkIGxhdGVyICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIFR5cGUxIGVycm9yIGNvZGUuIDAgbWVhbnMgc3VjY2VzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIFRoaXMgZnVuY3Rpb24gZG9lcyBOT1QgdXBkYXRlIHRoZSBjb250b3VycyBjb3VudCBpbiB0aGUgbG9hZCBnbHlwaCAqLworLyogICAgVGhpcyBtdXN0IGJlIGRvbmUgYnkgdGhlIGNhbGxlciBpdHNlbGYsIGFmdGVyIHRoaXMgZnVuY3Rpb24gaXMgICAgICovCisvKiAgICBpbnZva2VkLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBMT0NBTF9ERUYKKyAgVDFfRXJyb3IgIFQxX0FkZF9Db250b3VycyggVDFfQnVpbGRlciogIGJ1aWxkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQxX0ludCAgICAgICBudW1fY29udG91cnMgKTsKKworCisgIExPQ0FMX0RFRgorICBUMV9FcnJvciAgVDFfTG9hZF9HbHlwaCggVDFfR2x5cGhTbG90ICBnbHlwaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFQxX1NpemUgICAgICAgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFQxX0ludCAgICAgICAgZ2x5cGhfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUMV9JbnQgICAgICAgIGxvYWRfZmxhZ3MgKTsKKworCisjaWZkZWYgX19jcGx1c3BsdXMKKyAgfQorI2VuZGlmCisKKyNlbmRpZiAvKiBUMUdMT0FEX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy90eXBlMS90MWhpbnRlci5jIGIvc3JjL3R5cGUxL3QxaGludGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2UyZDBhYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90eXBlMS90MWhpbnRlci5jCkBAIC0wLDAgKzEsMTI2OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgdDFoaW50ZXIuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjIKKyAqCisgKiAgICBUeXBlMSBoaW50ZXIuICAgICAgICAgCisgKgorICogIENvcHlyaWdodCAxOTk2LTE5OTkgYnkKKyAqICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZAorICogIG1vZGlmaWVkIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICoKKyAqICBUaGUgSGludGVyIGlzIGluIGNoYXJnZSBvZiBmaXR0aW5nIHRoIHNjYWxlZCBvdXRsaW5lIHRvIHRoZQorICogIHBpeGVsIGdyaWQgaW4gb3JkZXIgdG8gY29uc2lkZXJhYmx5IGltcHJvdmUgdGhlIHF1YWxpdHkgb2YKKyAqICB0aGUgVHlwZSAxIGZvbnQgZHJpdmVyJ3Mgb3V0cHV0Li4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8ZnRkZWJ1Zy5oPgorI2luY2x1ZGUgPHQxb2Jqcy5oPgorI2luY2x1ZGUgPHQxaGludGVyLmg+CisKKyN1bmRlZiAgRlRfQ09NUE9ORU5UCisjZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfdDFoaW50ICAgIC8qIGZvciBkZWJ1Z2dpbmcvdHJhY2luZyAqLworCisKKyN1bmRlZiAgT05FX1BJWEVMCisjZGVmaW5lIE9ORV9QSVhFTCAgNjQKKworI3VuZGVmICBST1VORAorI2RlZmluZSBST1VORCh4KSAgICgoIHggKyBPTkVfUElYRUwvMiApICYgLU9ORV9QSVhFTCkKKworI3VuZGVmICBTQ0FMRQorI2RlZmluZSBTQ0FMRSh2YWwpICAgRlRfTXVsRml4KCB2YWwsIHNjYWxlICkKKworLyogdmFyaW91cyBjb25zdGFudHMgdXNlZCB0byBkZXNjcmliZSB0aGUgYWxpZ25tZW50IG9mIGEgaG9yaXpvbnRhbCAqLworLyogc3RlbSB3aXRoIHJlZ2FyZHMgdG8gdGhlIGJsdWUgem9uZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUMV9BTElHTl9OT05FICAgIDAKKyNkZWZpbmUgVDFfQUxJR05fQk9UVE9NICAxCisjZGVmaW5lIFQxX0FMSUdOX1RPUCAgICAgMgorI2RlZmluZSBUMV9BTElHTl9CT1RIICAgIDMKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogPEZ1bmN0aW9uPgorICogICAgdDFfc2V0X2JsdWVfem9uZXMKKyAqCisgKiA8RGVzY3JpcHRpb24+CisgKiAgICBTZXQgYSBzaXplIG9iamVjdCdzIGJsdWUgem9uZXMgZHVyaW5nIHJlc2V0LiBUaGlzIHdpbGwgY29tcHV0ZQorICogICAgdGhlICJzbmFwIiB6b25lIGNvcnJlc3BvbmRpbmcgdG8gZWFjaCBibHVlIHpvbmUuCisgKgorICogPElucHV0PgorICogICAgc2l6ZSAgOjogaGFuZGxlIHRvIHRhcmdldCBzaXplIG9iamVjdAorICoKKyAqIDxSZXR1cm4+CisgKiAgICBFcnJvciBjb2RlLiAwIG1lYW5zIHN1Y2Nlc3MKKyAqCisgKiA8Tm90ZT4KKyAqICAgIFRoaXMgZnVuY3Rpb25zIGRvZXMgdGhlIGZvbGxvd2luZyA6CisgKgorICogICAgICAxLiBJdCBleHRyYWN0cyB0aGUgYm90dG9tIGFuZCB0b3AgYmx1ZSB6b25lcyBmcm9tIHRoZQorICogICAgICAgICBmYWNlIG9iamVjdC4KKyAqCisgKiAgICAgIDIuIEVhY2ggem9uZSBpcyB0aGVuIGdyb3duIGJ5ICBCbHVlRnV6eiwgb3ZlcmxhcHBpbmcgCisgKiAgICAgICAgIGlzIGVsaW1pbmF0ZWQgYnkgYWRqdXN0aW5nIHRoZSB6b25lIGVkZ2VzIGFwcHJvcHJpYXRlbHkKKyAqCisgKiAgICAgIDMuIEZvciBlYWNoIHpvbmUsIHdlIGtlZXAgaXRzIG9yaWdpbmFsIGZvbnQgdW5pdHMgcG9zaXRpb24sIGl0cworICogICAgICAgICBvcmlnaW5hbCBzY2FsZWQgcG9zaXRpb24sIGFzIHdlbGwgYXMgaXRzIGdyb3duL2FkanVzdGVkCisgKiAgICAgICAgIGVkZ2VzLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICAgIC8qIHVsdHJhIHNpbXBsZSBidWJibGUgc29ydCAobm90IGEgbG90IG9mIGVsZW1lbnRzLCBtb3N0bHkgKi8KKyAgICAgIC8qIHByZS1zb3J0ZWQsIG5vIG5lZWQgZm9yIHF1aWNrc29ydCkgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgIHN0YXRpYworICAgICAgdm9pZCAgdDFfc29ydF9ibHVlcyggVDFfSW50KiAgYmx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUMV9JbnQgICBjb3VudCApCisgICAgICB7CisgICAgICAgIFQxX0ludCAgaSwgc3dhcDsKKyAgICAgICAgVDFfSW50KiBjdXI7CisgICAgCisgICAgICAgIGZvciAoIGkgPSAyOyBpIDwgY291bnQ7IGkgKz0gMiApCisgICAgICAgIHsKKyAgICAgICAgICBjdXIgPSBibHVlcyArIGk7CisgICAgICAgICAgZG8KKyAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIGN1clstMV0gPCBjdXJbMF0gKQorICAgICAgICAgICAgICBicmVhazsKKyAgICAKKyAgICAgICAgICAgIHN3YXAgPSBjdXJbLTJdOyBjdXJbLTJdID0gY3VyWzBdOyBjdXJbMF0gPSBzd2FwOworICAgICAgICAgICAgc3dhcCA9IGN1clstMV07IGN1clstMV0gPSBjdXJbMV07IGN1clsxXSA9IHN3YXA7CisgICAgICAgICAgICBjdXIgLT0gMjsKKyAgICAgICAgICB9CisgICAgICAgICAgd2hpbGUgKCBjdXIgPiBibHVlcyApOworICAgICAgICB9CisgICAgICB9CisKKworICBzdGF0aWMKKyAgVDFfRXJyb3IgIHQxX3NldF9ibHVlX3pvbmVzKCBUMV9TaXplICBzaXplICkKKyAgeworICAgIFQxX0ZhY2UgICAgICAgICAgZmFjZSA9IChUMV9GYWNlKXNpemUtPnJvb3QuZmFjZTsKKyAgICBUMV9Qcml2YXRlKiAgICAgIHByaXYgPSAmZmFjZS0+cHJpdmF0ZV9kaWN0OworICAgIFQxX0ludCAgICAgICAgICAgbjsKKyAgICBUMV9JbnQgICAgICAgICAgIGJsdWVzWzI0XTsKKyAgICBUMV9JbnQgICAgICAgICAgIG51bV9ib3R0b207CisgICAgVDFfSW50ICAgICAgICAgICBudW1fdG9wOworICAgIFQxX0ludCAgICAgICAgICAgbnVtX2JsdWVzOworICAgIFQxX1NpemVfSGludHMqICAgaGludHMgPSBzaXplLT5oaW50czsKKyAgICBUMV9TbmFwX1pvbmUqICAgIHpvbmU7CisgICAgVDFfUG9zICAgICAgICAgICBwaXgsIG9ydXM7CisgICAgVDFfUG9zICAgICAgICAgICBtaW4sIG1heCwgdGhyZXNob2xkOworICAgIFQxX0ZpeGVkICAgICAgICAgc2NhbGU7CisgICAgVDFfQm9vbCAgICAgICAgICBpc19ib3R0b207CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgQ09QWSBCT1RUT00gQU5EIFRPUCBCTFVFIFpPTkVTIElOIExPQ0FMIEFSUkFZUyAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICAgIC8qIEZpcnN0IG9mIGFsbCwgY2hlY2sgdGhlIHNpemVzIG9mIHRoZSAvQmx1ZVZhbHVlcyBhbmQgL090aGVyQmx1ZXMgKi8KKyAgICAvKiB0YWJsZXMuIFRoZXkgYWxsIG11c3QgY29udGFpbiBhbiBldmVuIG51bWJlciBvZiBhcmd1bWVudHMgICAgICAgICovCisgICAgaWYgKCBwcml2LT5udW1fb3RoZXJfYmx1ZXMgJiAxIHx8CisgICAgICAgICBwcml2LT5udW1fYmx1ZXMgICAgICAgJiAxICkKKyAgICB7CisgICAgICBGVF9FUlJPUigoICJUMS5Db3B5X0JsdWVzIDogb2RkIG51bWJlciBvZiBibHVlIHZhbHVlc1xuIiApKTsKKyAgICAgIHJldHVybiBUMV9FcnJfU3ludGF4X0Vycm9yOworICAgIH0KKworICAgIC8qIGNvcHkgdGhlIGJvdHRvbSBibHVlIHpvbmVzIGZyb20gL090aGVyQmx1ZXMgICAgICAgICAgICovCisgICAgbnVtX3RvcCAgICA9IDA7CisgICAgbnVtX2JvdHRvbSA9IHByaXYtPm51bV9vdGhlcl9ibHVlczsKKworICAgIGZvciAoIG4gPSAwOyBuIDwgbnVtX2JvdHRvbTsgbiArKyApCisgICAgICBibHVlc1tuXSA9IHByaXYtPm90aGVyX2JsdWVzW25dOworCisgICAgLyogQWRkIHRoZSBmaXJzdCBibHVlIHpvbmUgaW4gL0JsdWVWYWx1ZXMgdG8gdGhlIHRhYmxlICovCisgICAgbnVtX3RvcCA9IHByaXYtPm51bV9ibHVlcyAtIDI7CisgICAgaWYgKCBudW1fdG9wID49IDAgKQorICAgIHsKKyAgICAgIGJsdWVzWyBudW1fYm90dG9tIF0gPSBwcml2LT5ibHVlX3ZhbHVlc1swXTsKKyAgICAgIGJsdWVzW251bV9ib3R0b20rMV0gPSBwcml2LT5ibHVlX3ZhbHVlc1sxXTsKKworICAgICAgbnVtX2JvdHRvbSArPSAyOworICAgIH0KKworICAgIC8qIHNvcnQgdGhlIGJvdHRvbSBibHVlIHpvbmVzICovCisgICAgdDFfc29ydF9ibHVlcyggYmx1ZXMsIG51bV9ib3R0b20gKTsKKworICAgIGhpbnRzLT5udW1fYm90dG9tX3pvbmVzID0gbnVtX2JvdHRvbSA+PiAxOworCisgICAgLyogbm93IGNvcHkgdGhlIC9CbHVlVmFsdWVzIHRvIHRoZSB0b3Agb2YgdGhlIGJsdWVzIGFycmF5ICovCisgICAgaWYgKCBudW1fdG9wID4gMCApCisgICAgeworICAgICAgZm9yICggbiA9IDA7IG4gPCBudW1fdG9wOyBuKysgKQorICAgICAgICBibHVlc1sgbnVtX2JvdHRvbStuIF0gPSBwcml2LT5ibHVlX3ZhbHVlc1tuKzJdOworCisgICAgICAvKiBzb3J0IHRoZSB0b3AgYmx1ZSB6b25lcyAqLworICAgICAgdDFfc29ydF9ibHVlcyggYmx1ZXMgKyBudW1fYm90dG9tLCBudW1fdG9wICk7CisgICAgfQorICAgIGVsc2UKKyAgICAgIG51bV90b3AgPSAwOworCisgICAgbnVtX2JsdWVzICAgICAgICAgICAgID0gbnVtX3RvcCArIG51bV9ib3R0b207CisgICAgaGludHMtPm51bV9ibHVlX3pvbmVzID0gKCBudW1fYmx1ZXMgKSA+PiAxOworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogICAgQlVJTEQgQkxVRSBTTkFQIFpPTkVTIEZST00gVEhFIExPQ0FMIEJMVUVTIEFSUkFZUyAgICAgICAgICAgICAgICovCisgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICBzY2FsZSAgICAgPSBzaXplLT5yb290Lm1ldHJpY3MueV9zY2FsZTsKKyAgICB6b25lICAgICAgPSBoaW50cy0+Ymx1ZV96b25lczsKKyAgICB0aHJlc2hvbGQgPSBPTkVfUElYRUwvNDsgICAvKiAwLjI1IHBpeGVscyAqLworCisgICAgZm9yICggbiA9IDA7IG4gPCBudW1fYmx1ZXM7IG4gKz0gMiwgem9uZSArKyApCisgICAgeworICAgICAgaXNfYm90dG9tID0gKCBuIDwgbnVtX2JvdHRvbSA/IDEgOiAwICk7CisKKyAgICAgIG9ydXMgPSBibHVlc1tuK2lzX2JvdHRvbV07ICAvKiBnZXQgYWxpZ25lbWVudCBjb29yZGluYXRlICovCisgICAgICBwaXggID0gU0NBTEUoIG9ydXMgKTsgICAgICAgLyogc2NhbGUgaXQgICAgICAgICAgICAgICAgICAqLworCisgICAgICBtaW4gID0gU0NBTEUoIGJsdWVzWyBuIF0gLSBwcml2LT5ibHVlX2Z1enogKTsKKyAgICAgIG1heCAgPSBTQ0FMRSggYmx1ZXNbbisxXSArIHByaXYtPmJsdWVfZnV6eiApOworCisgICAgICBpZiAoIG1pbiA+IHBpeCAtIHRocmVzaG9sZCApIG1pbiA9IHBpeCAtIHRocmVzaG9sZDsKKyAgICAgIGlmICggbWF4IDwgcGl4ICsgdGhyZXNob2xkICkgbWF4ID0gcGl4ICsgdGhyZXNob2xkOworCisgICAgICB6b25lLT5vcnVzID0gb3J1czsKKyAgICAgIHpvbmUtPnBpeCAgPSBwaXg7CisgICAgICB6b25lLT5taW4gID0gbWluOworICAgICAgem9uZS0+bWF4ICA9IG1heDsKKyAgICB9CisKKyAgICAvKiBhZGp1c3QgZWRnZXMgaW4gY2FzZSBvZiBvdmVybGFwICovCisgICAgem9uZSA9IGhpbnRzLT5ibHVlX3pvbmVzOworICAgIGZvciAoIG4gPSAwOyBuIDwgbnVtX2JsdWVzLTI7IG4gKz0gMiwgem9uZSArKyApCisgICAgeworICAgICAgaWYgKCBuICE9IG51bV9ib3R0b20tMiAgICAgICAgICYmCisgICAgICAgICAgIHpvbmVbMF0ubWF4ID4gem9uZVsxXS5taW4gKQorICAgICAgeworICAgICAgICB6b25lWzBdLm1heCA9IHpvbmVbMV0ubWluID0gKHpvbmVbMF0ucGl4K3pvbmVbMV0ucGl4KS8yOworICAgICAgfQorICAgIH0KKworICAgIAorICAgIC8qIENvbXBhcmUgdGhlIGN1cnJlbnQgcGl4ZWwgc2l6ZSB3aXRoIHRoZSBCbHVlU2NhbGUgdmFsdWUgKi8KKyAgICAvKiB0byBrbm93IHdldGhlciB0byBzdXByZXNzIG92ZXJzaG9vdHMuLiAgICAgICAgICAgICAgICAgICovCisgICAgCisgICAgaGludHMtPnN1cHJlc3Nfb3ZlcnNob290cyA9IAorICAgICAgKCBzaXplLT5yb290Lm1ldHJpY3MueV9wcGVtIDwgRlRfTXVsRml4KDEwMDAscHJpdi0+Ymx1ZV9zY2FsZSkgKTsKKworICAgIC8qIE5vdyBwcmludCB0aGUgbmV3IGJsdWUgdmFsdWVzIGluIHRyYWNpbmcgbW9kZSAqLworI2lmZGVmIEZUX0RFQlVHX0xFVkVMX1RSQUNFCisgICAgCisgICAgRlRfVFJBQ0UyKCggIkJsdWUgWm9uZXMgZm9yIHNpemUgb2JqZWN0IGF0ICQlMDhseCA6XG4iLCAobG9uZylzaXplICkpOworICAgIEZUX1RSQUNFMigoICIgICBvcnVzICAgIHBpeCAgICBtaW4gICBtYXhcbiIgKSk7CisgICAgRlRfVFJBQ0UyKCggIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIgKSk7CisgICAgCisgICAgem9uZSA9IGhpbnRzLT5ibHVlX3pvbmVzOworICAgIGZvciAoIG4gPSAwOyBuIDwgaGludHMtPm51bV9ibHVlX3pvbmVzOyBuKysgKQorICAgIHsKKyAgICAgIEZUX1RSQUNFMigoICIgICAgJTNkICAgJS4yZiAgICUuMmYgICUuMmZcbiIsCisgICAgICAgICAgICAgICAgem9uZS0+b3J1cywgCisgICAgICAgICAgICAgICAgem9uZS0+cGl4LzY0LjAsCisgICAgICAgICAgICAgICAgem9uZS0+bWluLzY0LjAsIAorICAgICAgICAgICAgICAgIHpvbmUtPm1heC82NC4wICkpOworICAgICAgem9uZSsrOworICAgIH0KKyAgICBGVF9UUkFDRTIoKCAiXG5PdmVyIHNob290cyBhcmUgJXNcblxuIiwKKyAgICAgICAgICAgICAgaGludHMtPnN1cHJlc3Nfb3ZlcnNob290cyA/ICJzdXByZXNzZWQiIDogImFjdGl2ZSIgKSk7CisKKyNlbmRpZiAvKiBERUJVR19MRVZFTF9UUkFDRSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIHJldHVybiBUMV9FcnJfT2s7CisgIH0KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiA8RnVuY3Rpb24+CisgKiAgICB0MV9zZXRfc25hcF96b25lcworICoKKyAqIDxEZXNjcmlwdGlvbj4KKyAqICAgIFRoaXMgZnVuY3Rpb24gc2V0IGEgc2l6ZSBvYmplY3QncyBzdGVtIHNuYXAgem9uZXMuCisgKgorICogPElucHV0PgorICogICAgc2l6ZSA6OiBoYW5kbGUgdG8gdGFyZ2V0IHNpemUgb2JqZWN0CisgKgorICogPFJldHVybj4KKyAqICAgIEVycm9yIGNvZGUuIDAgbWVhbnMgc3VjY2VzcworICoKKyAqIDxOb3RlPgorICogICAgVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyB0aGUgZm9sbG93aW5nIDoKKyAqCisgKiAgICAgIDEuIEl0IHJlYWRzIGFuZCBzY2FsZXMgdGhlIHN0ZW0gc25hcCB3aWR0aHMgZnJvbSB0aGUgcGFyZW50IGZhY2UKKyAqICAgICAKKyAqICAgICAgMi4gQSAic25hcCB6b25lIiBpcyBjb21wdXRlZCBmb3IgZWFjaCBzbmFwIHdpZHRoLCBieSAiZ3Jvd2luZyIKKyAqICAgICAgICAgaXQgd2l0aCBhIHRocmVzaG9sZCBvZiBhIDEvMiBwaXhlbC4gT3ZlcmxhcHBpbmcgaXMgYXZvaWRlZAorICogICAgICAgICB0aHJvdWdoIHByb3BlciBlZGdlIGFkanVzdG1lbnQuCisgKgorICogICAgICAzLiBFYWNoIHdpZHRoIHdob3NlIHpvbmUgY29udGFpbiB0aGUgc2NhbGVkIHN0YW5kYXJkIHNldCB3aWR0aAorICogICAgICAgICBpcyByZW1vdmVkIGZyb20gdGhlIHRhYmxlCisgKgorICogICAgICA0LiBGaW5hbGx5LCB0aGUgc3RhbmRhcmQgc2V0IHdpZHRoIGlzIHNjYWxlZCwgYW5kIGl0cyBjb3JyZXBvbmRpbmcKKyAqICAgICAgICAgInNuYXAgem9uZSIgaXMgaW5zZXJ0ZWQgaW50byB0aGUgc29ydGVkIHNuYXAgem9uZXMgdGFibGUKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIHN0YXRpYworICBUMV9FcnJvciAgdDFfc2V0X3NuYXBfem9uZXMoIFQxX1NpemUgIHNpemUgKQorICB7CisgICAgVDFfSW50ICAgICAgICAgbiwgZGlyZWN0aW9uLCBuX3pvbmVzLCBudW1fem9uZXM7CisgICAgVDFfU25hcF9ab25lKiAgem9uZTsKKyAgICBUMV9TbmFwX1pvbmUqICBiYXNlX3pvbmU7CisgICAgVDFfU2hvcnQqICAgICAgb3JnczsKKyAgICBUMV9Qb3MgICAgICAgICBzdGFuZGFyZF93aWR0aDsKKyAgICBUMV9GaXhlZCAgICAgICBzY2FsZTsKKworICAgIFQxX0ZhY2UgICAgICAgICAgZmFjZSA9IChUMV9GYWNlKXNpemUtPnJvb3QuZmFjZTsKKyAgICBUMV9Qcml2YXRlKiAgICAgIHByaXYgPSAmZmFjZS0+cHJpdmF0ZV9kaWN0OworICAgIFQxX1NpemVfSGludHMqICBoaW50cyA9IHNpemUtPmhpbnRzOworCisgICAgLyogc3RhcnQgd2l0aCBob3Jpem9udGFsIHNuYXAgem9uZXMgKi8KKyAgICBkaXJlY3Rpb24gICAgICA9IDA7CisgICAgc3RhbmRhcmRfd2lkdGggPSBwcml2LT5zdGFuZGFyZF93aWR0aDsKKyAgICBuX3pvbmVzICAgICAgICA9IHByaXYtPm51bV9zbmFwX3dpZHRoczsKKyAgICBiYXNlX3pvbmUgICAgICA9IGhpbnRzLT5zbmFwX3dpZHRoczsKKyAgICBvcmdzICAgICAgICAgICA9IHByaXYtPnN0ZW1fc25hcF93aWR0aHM7CisgICAgc2NhbGUgICAgICAgICAgPSBzaXplLT5yb290Lm1ldHJpY3MueF9zY2FsZTsKKyAgICAKKyAgICB3aGlsZSAoZGlyZWN0aW9uIDwgMikKKyAgICB7CisgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAvKiAgUmVhZCBhbmQgc2NhbGUgc3RlbSBzbmFwIHdpZHRocyB0YWJsZSBmcm9tIHRoZSBwaHlzaWNhbCAgICAgICovCisgICAgICAvKiAgZm9udCByZWNvcmQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICBUMV9Qb3MgIHByZXYsIG9ydXMsIHBpeCwgbWluLCBtYXgsIHRocmVzaG9sZDsKKyAgICAgIAorICAgICAgdGhyZXNob2xkID0gT05FX1BJWEVMLzQ7CisgICAgICB6b25lICAgICAgPSBiYXNlX3pvbmU7CisKKyAgICAgIGlmICggbl96b25lcyA+IDAgKQorICAgICAgeworICAgICAgICBvcnVzID0gKm9yZ3MrKzsKKyAgICAgICAgcGl4ICA9IFNDQUxFKCBvcnVzICk7CisgICAgICAgIG1pbiAgPSBwaXgtdGhyZXNob2xkOworICAgICAgICBtYXggID0gcGl4K3RocmVzaG9sZDsKKworICAgICAgICB6b25lLT5vcnVzID0gb3J1czsKKyAgICAgICAgem9uZS0+cGl4ICA9IHBpeDsKKyAgICAgICAgem9uZS0+bWluICA9IG1pbjsKKyAgICAgICAgcHJldiAgICAgICA9IHBpeDsKKworICAgICAgICBmb3IgKCBuID0gMTsgbiA8IG5fem9uZXM7IG4rKyApCisgICAgICAgIHsKKyAgICAgICAgICBvcnVzID0gKm9yZ3MrKzsKKyAgICAgICAgICBwaXggID0gU0NBTEUoIG9ydXMgKTsKKworICAgICAgICAgIGlmICggcGl4LXByZXYgPCAyKnRocmVzaG9sZCApCisgICAgICAgICAgeworICAgICAgICAgICAgbWluID0gbWF4ID0gKHBpeCtwcmV2KS8yOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBtaW4gPSBwaXgtdGhyZXNob2xkOworCisgICAgICAgICAgem9uZS0+bWF4ID0gbWF4OworICAgICAgICAgIHpvbmUrKzsKKyAgICAgICAgICB6b25lLT5vcnVzID0gb3J1czsKKyAgICAgICAgICB6b25lLT5waXggID0gcGl4OworICAgICAgICAgIHpvbmUtPm1pbiAgPSBtaW47CisKKyAgICAgICAgICBtYXggID0gcGl4K3RocmVzaG9sZDsKKyAgICAgICAgICBwcmV2ID0gcGl4OworICAgICAgICB9CisgICAgICAgIHpvbmUtPm1heCA9IG1heDsKKyAgICAgIH0KKworICAgICAgLyogcHJpbnQgdGhlIHNjYWxlZCBzdGVtIHNuYXAgdmFsdWVzIGluIHRyYWNpbmcgbW9kZXMgKi8KKyNpZmRlZiBGVF9ERUJVR19MRVZFTF9UUkFDRQorICAgICAgCisgICAgICBGVF9UUkFDRTIoKCAiU2V0X1NuYXBfWm9uZXMgOiBmaXJzdCAlcyBwYXNzXG4iLCAKKyAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPyAidmVydGljYWwiIDogImhvcml6b250YWwiICkpOworICAgICAgICAgICAgICAgIAorICAgICAgRlRfVFJBQ0UyKCggIlNjYWxlZCBvcmlnaW5hbCBzdGVtIHNuYXAgem9uZXMgOlxuIiApKTsKKyAgICAgIEZUX1RSQUNFMigoICIgICBvcnVzICAgcGl4ICAgbWluICAgbWF4XG4iICkpOworICAgICAgRlRfVFJBQ0UyKCggIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iICkpOworICAgICAgCisgICAgICB6b25lID0gYmFzZV96b25lOworICAgICAgZm9yICggbiA9IDA7IG4gPCBuX3pvbmVzOyBuKyssIHpvbmUrKyApCisgICAgICAgIEZUX1RSQUNFMigoICIgICUzZCAgJS4yZiAgJS4yZiAgJS4yZlxuIiwKKyAgICAgICAgICAgICAgICAgIHpvbmUtPm9ydXMsCisgICAgICAgICAgICAgICAgICB6b25lLT5waXgvNjQuMCwKKyAgICAgICAgICAgICAgICAgIHpvbmUtPm1pbi82NC4wLAorICAgICAgICAgICAgICAgICAgem9uZS0+bWF4LzY0LjAgKSk7CisgICAgICBGVF9UUkFDRTIoKCAiXG4iICkpOworICAgICAgCisgICAgICBGVF9UUkFDRTIoKCAiU3RhbmRhcmQgd2lkdGggPSAlZFxuIiwgc3RhbmRhcmRfd2lkdGggKSk7CisjZW5kaWYKKworICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgLyogIE5vdywgZWFjaCBzbmFwIHdpZHRoIHdoaWNoIGlzIGluIHRoZSByYW5nZSBvZiB0aGUgc3RhbmRhcmQgICAqLworICAgICAgLyogIHNldCB3aWR0aCB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGUgbGlzdC4uICAgICAgICAgICAgICAgICAgICAqLworICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgICAgICBpZiAoIHN0YW5kYXJkX3dpZHRoID4gMCApCisgICAgICB7CisgICAgICAgIFQxX1NuYXBfWm9uZSogIHBhcmVudDsKKyAgICAgICAgVDFfUG9zICAgICAgICAgc3RkX3BpeCwgc3RkX21pbiwgc3RkX21heDsKKworICAgICAgICBzdGRfcGl4ID0gU0NBTEUoIHN0YW5kYXJkX3dpZHRoICk7ICAgICAgICAKKworICAgICAgICBzdGRfbWluID0gc3RkX3BpeC10aHJlc2hvbGQ7CisgICAgICAgIHN0ZF9tYXggPSBzdGRfcGl4K3RocmVzaG9sZDsKKworICAgICAgICBudW1fem9uZXMgPSAwOworICAgICAgICB6b25lICAgICAgPSBiYXNlX3pvbmU7CisgICAgICAgIHBhcmVudCAgICA9IGJhc2Vfem9uZTsKKworICAgICAgICBmb3IgKCBuID0gMDsgbiA8IG5fem9uZXM7IG4rKyApCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoIHpvbmUtPnBpeCA+PSBzdGRfbWluICYmIHpvbmUtPnBpeCA8PSBzdGRfbWF4ICkKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKiB0aGlzIHpvbmUgbXVzdCBiZSByZW1vdmVkIGZyb20gdGhlIGxpc3QgKi8KKyAgICAgICAgICAgIGlmICggc3RkX21pbiA+IHpvbmUtPm1pbiApIHN0ZF9taW4gPSB6b25lLT5taW47CisgICAgICAgICAgICBpZiAoIHN0ZF9tYXggPCB6b25lLT5tYXggKSBzdGRfbWF4ID0gem9uZS0+bWF4OworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgeworICAgICAgICAgICAgKnBhcmVudCsrID0gKnpvbmU7CisgICAgICAgICAgICBudW1fem9uZXMrKzsKKyAgICAgICAgICB9CisgICAgICAgICAgem9uZSsrOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgLyogIE5vdywgaW5zZXJ0IHRoZSBzdGFuZGFyZCB3aWR0aCB6b25lICAgICAgICovCisgICAgICAgIAorICAgICAgICB6b25lID0gYmFzZV96b25lK251bV96b25lczsKKyAgICAgICAgd2hpbGUgKCB6b25lID4gYmFzZV96b25lICYmIHpvbmVbLTFdLnBpeCA+IHN0ZF9tYXggKQorICAgICAgICB7CisgICAgICAgICAgem9uZVswXSA9IHpvbmVbLTFdOworICAgICAgICAgIHpvbmUgLS07CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8qIGNoZWNrIGJvcmRlciB6b25lcyAqLworICAgICAgICBpZiAoIHpvbmUgPiBiYXNlX3pvbmUgJiYgem9uZVstMV0ubWF4ID4gc3RkX21pbiApCisgICAgICAgICAgem9uZVstMV0ubWF4ID0gc3RkX21pbjsKKyAgICAgICAgICAKKyAgICAgICAgaWYgKCB6b25lIDwgYmFzZV96b25lK251bV96b25lcyAmJiB6b25lWzFdLm1pbiA8IHN0ZF9tYXggKQorICAgICAgICAgIHpvbmVbMV0ubWluID0gc3RkX21heDsKKyAgICAgICAgCisgICAgICAgIHpvbmUtPm9ydXMgPSBzdGFuZGFyZF93aWR0aDsKKyAgICAgICAgem9uZS0+cGl4ICA9IHN0ZF9waXg7CisgICAgICAgIHpvbmUtPm1pbiAgPSBzdGRfbWluOworICAgICAgICB6b25lLT5tYXggID0gc3RkX21heDsKKyAgICAgICAgCisgICAgICAgIG51bV96b25lcysrOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICBudW1fem9uZXMgPSBuX3pvbmVzOworCisgICAgICAvKiBzYXZlIHRvdGFsIG51bWJlciBvZiBzdGVtIHNuYXBzIG5vdyAqLworICAgICAgaWYgKGRpcmVjdGlvbikgaGludHMtPm51bV9zbmFwX2hlaWdodHMgPSBudW1fem9uZXM7CisgICAgICAgICAgICAgICAgZWxzZSBoaW50cy0+bnVtX3NuYXBfd2lkdGhzICA9IG51bV96b25lczsKKworICAgICAgLyogcHJpbnQgdGhlIHNjYWxlZCBzdGVtIHNuYXAgdmFsdWVzIGluIHRyYWNpbmcgbW9kZXMgKi8KKyNpZmRlZiBGVF9ERUJVR19MRVZFTF9UUkFDRQorICAgICAgCisgICAgICBGVF9UUkFDRTIoKCAiU2V0X1NuYXBfWm9uZXMgOiBzZWNvbmQgJXMgcGFzc1xuIiwgCisgICAgICAgICAgICAgICAgZGlyZWN0aW9uID8gInZlcnRpY2FsIiA6ICJob3Jpem9udGFsIiApKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgIEZUX1RSQUNFMigoICJTY2FsZWQgY2xpcHBlZCBzdGVtIHNuYXAgem9uZXMgOlxuIiApKTsKKyAgICAgIEZUX1RSQUNFMigoICIgICBvcnVzICAgcGl4ICAgbWluICAgbWF4XG4iICkpOworICAgICAgRlRfVFJBQ0UyKCggIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iICkpOworICAgICAgCisgICAgICB6b25lID0gYmFzZV96b25lOworICAgICAgZm9yICggbiA9IDA7IG4gPCBudW1fem9uZXM7IG4rKywgem9uZSsrICkKKyAgICAgICAgRlRfVFJBQ0UyKCggIiAgJTNkICAlLjJmICAlLjJmICAlLjJmXG4iLAorICAgICAgICAgICAgICAgICAgem9uZS0+b3J1cywKKyAgICAgICAgICAgICAgICAgIHpvbmUtPnBpeC82NC4wLAorICAgICAgICAgICAgICAgICAgem9uZS0+bWluLzY0LjAsCisgICAgICAgICAgICAgICAgICB6b25lLT5tYXgvNjQuMCApKTsKKyAgICAgIEZUX1RSQUNFMigoICJcbiIgKSk7CisgICAgICAKKyAgICAgIEZUX1RSQUNFMigoICJTdGFuZGFyZCB3aWR0aCA9ICVkXG4iLCBzdGFuZGFyZF93aWR0aCApKTsKKyNlbmRpZgorICAgICAKKyAgICAgIC8qIGNvbnRpbnVlIHdpdGggdmVydGljYWwgc25hcCB6b25lICovCisgICAgICBkaXJlY3Rpb24rKzsKKyAgICAgIHN0YW5kYXJkX3dpZHRoID0gcHJpdi0+c3RhbmRhcmRfaGVpZ2h0OworICAgICAgbl96b25lcyAgICAgICAgPSBwcml2LT5udW1fc25hcF9oZWlnaHRzOworICAgICAgYmFzZV96b25lICAgICAgPSBoaW50cy0+c25hcF9oZWlnaHRzOworICAgICAgb3JncyAgICAgICAgICAgPSBwcml2LT5zdGVtX3NuYXBfaGVpZ2h0czsKKyAgICAgIHNjYWxlICAgICAgICAgID0gc2l6ZS0+cm9vdC5tZXRyaWNzLnlfc2NhbGU7CisgICAgfQorCisgICAgcmV0dXJuIFQxX0Vycl9PazsKKyAgfQorICAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIDxGdW5jdGlvbj4KKyAqICAgIFQxX05ld19TaXplX0hpbnRlcgorICoKKyAqIDxEZXNjcmlwdGlvbj4KKyAqICAgIEFsbG9jYXRlcyBhIG5ldyBoaW50ZXIgc3RydWN0dXJlIGZvciBhIGdpdmVuIHNpemUgb2JqZWN0CisgKgorICogPElucHV0PgorICogICAgc2l6ZSA6OiBoYW5kbGUgdG8gdGFyZ2V0IHNpemUgb2JqZWN0CisgKgorICogPFJldHVybj4KKyAqICAgIEVycm9yIGNvZGUuIDAgbWVhbnMgc3VjY2VzcworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgTE9DQUxfRlVOQworICBUMV9FcnJvciAgVDFfTmV3X1NpemVfSGludGVyKCBUMV9TaXplICBzaXplICkKKyAgeworICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gc2l6ZS0+cm9vdC5mYWNlLT5tZW1vcnk7CisgICAgCisgICAgcmV0dXJuIE1FTV9BbGxvYyggc2l6ZS0+aGludHMsIHNpemVvZigqc2l6ZS0+aGludHMpICk7CisgIH0KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogPEZ1bmN0aW9uPgorICogICAgVDFfRG9uZV9TaXplX0hpbnRlcgorICoKKyAqIDxEZXNjcmlwdGlvbj4KKyAqICAgIFJlbGVhc2VzIGEgZ2l2ZW4gc2l6ZSBvYmplY3QncyBoaW50ZXIgc3RydWN0dXJlCisgKgorICogPElucHV0PgorICogICAgc2l6ZSA6OiBoYW5kbGUgdG8gdGFyZ2V0IHNpemUgb2JqZWN0CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICBMT0NBTF9GVU5DCisgIHZvaWQgICAgICBUMV9Eb25lX1NpemVfSGludGVyKCBUMV9TaXplICBzaXplICkKKyAgeworICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gc2l6ZS0+cm9vdC5mYWNlLT5tZW1vcnk7CisKKyAgICBGUkVFKCBzaXplLT5oaW50cyApOworICB9CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogPEZ1bmN0aW9uPgorICogICAgVDFfUmVzZXRfU2l6ZV9IaW50ZXIKKyAqCisgKiA8RGVzY3JpcHRpb24+CisgKiAgICBSZWNvbXB1dGVzIGhpbnRpbmcgaW5mb3JtYXRpb24gd2hlbiBhIGdpdmVuIHNpemUgb2JqZWN0IGhhcworICogICAgY2hhbmdlZCBpdHMgcmVzb2x1dGlvbnMvY2hhciBzaXplcy9waXhlbCBzaXplcworICoKKyAqIDxJbnB1dD4KKyAqICAgIHNpemUgOjogaGFuZGxlIHRvIHNpemUgb2JqZWN0CisgKgorICogPFJldHVybj4KKyAqICAgIEVycm9yIGNvZGUuIDAgbWVhbnMgc3VjY2VzcworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgTE9DQUxfRlVOQworICBUMV9FcnJvciAgVDFfUmVzZXRfU2l6ZV9IaW50ZXIoIFQxX1NpemUgIHNpemUgKQorICB7CisgICAgcmV0dXJuIHQxX3NldF9ibHVlX3pvbmVzKHNpemUpIHx8IHQxX3NldF9zbmFwX3pvbmVzKHNpemUpOworICB9CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogPEZ1bmN0aW9uPgorICogICAgVDFfTmV3X0dseXBoX0hpbnRlcgorICoKKyAqIDxEZXNjcmlwdGlvbj4KKyAqICAgIEFsbG9jYXRlcyBhIG5ldyBoaW50ZXIgc3RydWN0dXJlIGZvciBhIGdpdmVuIGdseXBoIHNsb3QKKyAqCisgKiA8SW5wdXQ+CisgKiAgICBnbHlwaCA6OiBoYW5kbGUgdG8gdGFyZ2V0IGdseXBoIHNsb3QKKyAqCisgKiA8UmV0dXJuPgorICogICAgRXJyb3IgY29kZS4gMCBtZWFucyBzdWNjZXNzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICBMT0NBTF9GVU5DCisgIFQxX0Vycm9yICBUMV9OZXdfR2x5cGhfSGludGVyKCBUMV9HbHlwaFNsb3QgIGdseXBoICkKKyAgeworICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gZ2x5cGgtPnJvb3QuZmFjZS0+bWVtb3J5OworICAgIAorICAgIHJldHVybiBNRU1fQWxsb2MoIGdseXBoLT5oaW50cywgc2l6ZW9mKCpnbHlwaC0+aGludHMpICk7CisgIH0KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogPEZ1bmN0aW9uPgorICogICAgVDFfRG9uZV9HbHlwaF9IaW50ZXIKKyAqCisgKiA8RGVzY3JpcHRpb24+CisgKiAgICBSZWxlYXNlcyBhIGdpdmVuIGdseXBoIHNsb3QncyBoaW50ZXIgc3RydWN0dXJlCisgKgorICogPElucHV0PgorICogICAgZ2x5cGggOjogaGFuZGxlIHRvIGdseXBoIHNsb3QKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIExPQ0FMX0ZVTkMKKyAgdm9pZCAgVDFfRG9uZV9HbHlwaF9IaW50ZXIoIFQxX0dseXBoU2xvdCAgZ2x5cGggKQorICB7CisgICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBnbHlwaC0+cm9vdC5mYWNlLT5tZW1vcnk7CisKKyAgICBGUkVFKCBnbHlwaC0+aGludHMgKTsKKyAgfQorCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKi8KKyAgLyoqKioqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKiovCisgIC8qKioqKioqKioqICAgICAgICAgICAgICBISU5URUQgR0xZUEggTE9BREVSICAgICAgICAgICAgICAgICAgKioqKioqKioqLworICAvKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKi8KKyAgLyoqKioqKioqKiogICBUaGUgZm9sbG93aW5nIGNvZGUgaXMgaW4gY2hhcmdlIG9mIHRoZSBmaXJzdCAgICAqKioqKioqKiovCisgIC8qKioqKioqKioqICAgYW5kIHNlY29uZCBwYXNzIHdoZW4gbG9hZGluZyBhIHNpbmdsZSBvdXRsaW5lICAgKioqKioqKioqLworICAvKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICBzdGF0aWMKKyAgVDFfRXJyb3IgICB0MV9oaW50ZXJfaWdub3JlKCB2b2lkICkKKyAgeworICAgIC8qIGRvIG5vdGhpbmcsIHVzZWQgZm9yICJkb3RzZWN0aW9uIiB3aGljaCBpcyB1bnN1cHBvcnRlZCBmb3Igbm93ICovCisgICAgcmV0dXJuIDA7CisgIH0KKworICBzdGF0aWMKKyAgVDFfRXJyb3IgICB0MV9oaW50ZXJfc3RlbSggVDFfQnVpbGRlciogIGJ1aWxkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQxX1BvcyAgICAgICBwb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQxX0ludCAgICAgICB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVDFfQm9vbCAgICAgIHZlcnRpY2FsICkKKyAgeworICAgIFQxX1N0ZW1fVGFibGUqICAgc3RlbV90YWJsZTsKKyAgICBUMV9TdGVtX0hpbnQqICAgIHN0ZW1zOworICAgIFQxX1N0ZW1fSGludCogICAgY3VyX3N0ZW07CisgICAgVDFfSW50ICAgICAgICAgICBtaW4sIG1heCwgbiwgbnVtX3N0ZW1zOworICAgIFQxX0Jvb2wgICAgICAgICAgbmV3X3N0ZW07CisgICAgVDFfR2x5cGhfSGludHMqICBoaW50ZXIgPSBidWlsZGVyLT5nbHlwaC0+aGludHM7CisKKyAgICAvKiBzZWxlY3QgdGhlIGFwcHJvcHJpYXRlIHN0ZW0gYXJyYXkgKi8KKyAgICBzdGVtX3RhYmxlID0gdmVydGljYWwgPyAmaGludGVyLT52ZXJ0X3N0ZW1zIDogJmhpbnRlci0+aG9yaV9zdGVtczsKKyAgICBzdGVtcyAgICAgID0gc3RlbV90YWJsZS0+c3RlbXM7CisgICAgbnVtX3N0ZW1zICA9IHN0ZW1fdGFibGUtPm51bV9zdGVtczsKKworICAgIC8qIENvbXB1dGUgbWluaW11bSBhbmQgbWF4aW11bSBvcnVzIGZvciB0aGUgc3RlbSAqLworICAgIG1pbiA9IHBvcyArICggdmVydGljYWwKKyAgICAgICAgICAgICAgICA/IGJ1aWxkZXItPmxlZnRfYmVhcmluZy54CisgICAgICAgICAgICAgICAgOiBidWlsZGVyLT5sZWZ0X2JlYXJpbmcueSApOworCisgICAgaWYgKCB3aWR0aCA+PSAwICkKKyAgICAgIG1heCA9IG1pbiArIHdpZHRoOworICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBhIG5lZ2F0aXZlIHdpZHRoIGluZGljYXRlcyBhIGdob3N0IHN0ZW0gKi8KKyAgICAgIGlmICggd2lkdGggPT0gLTIxICkKKyAgICAgICAgbWluICs9IHdpZHRoOworCisgICAgICBtYXggPSBtaW47CisgICAgfQorCisgICAgLyogbm93IHNjYW4gdGhlIGFycmF5LiBJZiB3ZSBmaW5kIGEgc3RlbSB3aXRoIHRoZSBzYW1lIGJvcmRlcnMgKi8KKyAgICAvKiBzaW1wbHkgYWN0aXZhdGUgaXQuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGN1cl9zdGVtID0gc3RlbXM7CisgICAgbmV3X3N0ZW0gPSAxOworCisgICAgZm9yICggbiA9IDA7IG4gPCBudW1fc3RlbXM7IG4rKywgY3VyX3N0ZW0rKyApCisgICAgeworICAgICAgaWYgKCBjdXJfc3RlbS0+bWluX2VkZ2Uub3J1cyA9PSBtaW4gJiYKKyAgICAgICAgICAgY3VyX3N0ZW0tPm1heF9lZGdlLm9ydXMgPT0gbWF4ICkKKyAgICAgIHsKKyAgICAgICAgLyogVGhpcyBzdGVtIGlzIGFscmVhZHkgaW4gdGhlIHRhYmxlLCBzaW1wbHkgYWN0aXZhdGUgaXQgKi8KKyAgICAgICAgaWYgKCAoY3VyX3N0ZW0tPmhpbnRfZmxhZ3MgJiBUMV9ISU5UX0ZMQUdfQUNUSVZFKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgY3VyX3N0ZW0tPmhpbnRfZmxhZ3MgIHw9IFQxX0hJTlRfRkxBR19BQ1RJVkU7CisgICAgICAgICAgc3RlbV90YWJsZS0+bnVtX2FjdGl2ZSArKzsKKyAgICAgICAgfQorICAgICAgICBuZXdfc3RlbSA9IDA7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKworICAgIC8qIGFkZCBhIG5ldyBzdGVtIHRvIHRoZSBhcnJheSB3aGVuIG5lY2Vzc2FyeSAqLworICAgIGlmIChuZXdfc3RlbSkKKyAgICB7CisgICAgICBpZiAoY3VyX3N0ZW0gPj0gc3RlbXMgKyBUMV9ISU5URVJfTUFYX0VER0VTKQorICAgICAgeworICAgICAgICBGVF9FUlJPUigoICJUMS5IaW50ZXIgOiB0b28gbWFueSBzdGVtcyBpbiBnbHlwaCBjaGFyc3RyaW5nXG4iICkpOworICAgICAgICByZXR1cm4gVDFfRXJyX1N5bnRheF9FcnJvcjsKKyAgICAgIH0KKworICAgICAgLyogb24gdGhlIGZpcnN0IHBhc3MsIHdlIHJlY29yZCB0aGUgc3RlbSwgb3RoZXJ3aXNlLCB0aGlzIGlzICovCisgICAgICAvKiBhIGJ1ZyBpbiB0aGUgZ2x5cGggbG9hZGVyICEhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgIGlmICggYnVpbGRlci0+cGFzcyA9PSAwICkKKyAgICAgIHsKKyAgICAgICAgY3VyX3N0ZW0tPm1pbl9lZGdlLm9ydXMgPSBtaW47CisgICAgICAgIGN1cl9zdGVtLT5tYXhfZWRnZS5vcnVzID0gbWF4OworICAgICAgICBjdXJfc3RlbS0+aGludF9mbGFncyAgICA9IFQxX0hJTlRfRkxBR19BQ1RJVkU7CisKKyAgICAgICAgc3RlbV90YWJsZS0+bnVtX3N0ZW1zKys7CisgICAgICAgIHN0ZW1fdGFibGUtPm51bV9hY3RpdmUrKzsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgRlRfRVJST1IoKCAiVDEuSGludGVyIDogZmF0YWwgZ2x5cGggbG9hZGVyIGJ1ZyAtIHBhc3MyLXN0ZW1cbiIgKSk7CisgICAgICAgIHJldHVybiBUMV9FcnJfU3ludGF4X0Vycm9yOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBUMV9FcnJfT2s7CisgIH0KKworCisgIHN0YXRpYworICBUMV9FcnJvciAgIHQxX2hpbnRlcl9zdGVtMyggVDFfQnVpbGRlciogIGJ1aWxkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUMV9Qb3MgICAgICAgcG9zMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQxX0ludCAgICAgICB3aWR0aDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUMV9Qb3MgICAgICAgcG9zMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQxX0ludCAgICAgICB3aWR0aDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUMV9Qb3MgICAgICAgcG9zMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQxX0ludCAgICAgICB3aWR0aDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUMV9Cb29sICAgICAgdmVydGljYWwgKQorICB7CisgICAgLyogRm9yIG5vdywgZG9uJ3QgYmUgZWxpdGlzdCBhbmQgc2ltcGx5IGNhbGwgInN0ZW0iIDMgdGltZXMgKi8KKyAgICByZXR1cm4gdDFfaGludGVyX3N0ZW0oIGJ1aWxkZXIsIHBvczAsIHdpZHRoMCwgdmVydGljYWwgKSB8fAorICAgICAgICAgICB0MV9oaW50ZXJfc3RlbSggYnVpbGRlciwgcG9zMSwgd2lkdGgxLCB2ZXJ0aWNhbCApIHx8CisgICAgICAgICAgIHQxX2hpbnRlcl9zdGVtKCBidWlsZGVyLCBwb3MyLCB3aWR0aDIsIHZlcnRpY2FsICk7CisgIH0KKworCisgIHN0YXRpYworICBUMV9FcnJvciAgdDFfaGludGVyX2NoYW5nZWhpbnRzKCBUMV9CdWlsZGVyKiAgYnVpbGRlciApCisgIHsKKyAgICBUMV9JbnQgICAgICAgICAgIGRpbWVuc2lvbjsKKyAgICBUMV9TdGVtX1RhYmxlKiAgIHN0ZW1fdGFibGU7CisgICAgVDFfR2x5cGhfSGludHMqICBoaW50ZXIgPSBidWlsZGVyLT5nbHlwaC0+aGludHM7CisKKyAgICAvKiBpZiB3ZSdyZSBpbiB0aGUgc2Vjb25kIHBhc3Mgb2YgZ2x5cGggaGludGluZywgd2UgbXVzdCAgICAqLworICAgIC8qIGNhbGwgdGhlIGZ1bmN0aW9uIFQxX0hpbnRfUG9pbnRzIG9uIHRoZSBidWlsZGVyIGluIG9yZGVyICovCisgICAgLyogdG8gZm9yY2UgdGhlIGZpdCB0aGUgbGF0ZXN0IHBvaW50cyB0byB0aGUgcGl4ZWwgZ3JpZCAgICAgKi8KKyAgICBpZiAoIGJ1aWxkZXItPnBhc3MgPT0gMSApCisgICAgICBUMV9IaW50X1BvaW50cyggYnVpbGRlciApOworCisgICAgLyogU2ltcGx5IGRlLWFjdGl2YXRlIGFsbCBoaW50cyBpbiBhbGwgYXJyYXlzICovCisgICAgc3RlbV90YWJsZSA9ICZoaW50ZXItPmhvcmlfc3RlbXM7CisKKyAgICBmb3IgKCBkaW1lbnNpb24gPSAyOyBkaW1lbnNpb24gPiAwOyBkaW1lbnNpb24tLSApCisgICAgeworICAgICAgVDFfU3RlbV9IaW50KiAgY3VyICAgPSBzdGVtX3RhYmxlLT5zdGVtczsKKyAgICAgIFQxX1N0ZW1fSGludCogIGxpbWl0ID0gY3VyICsgc3RlbV90YWJsZS0+bnVtX3N0ZW1zOworCisgICAgICBmb3IgKCA7IGN1ciA8IGxpbWl0OyBjdXIrKyApCisgICAgICAgIGN1ci0+aGludF9mbGFncyAmPSB+VDFfSElOVF9GTEFHX0FDVElWRTsKKworICAgICAgc3RlbV90YWJsZS0+bnVtX2FjdGl2ZSA9IDA7CisgICAgICBzdGVtX3RhYmxlID0gJmhpbnRlci0+dmVydF9zdGVtczsKKyAgICB9CisKKyAgICByZXR1cm4gVDFfRXJyX09rOworICB9CisKKworICBMT0NBTF9GVU5DCisgIGNvbnN0IFQxX0hpbnRlcl9GdW5jcyAgdDFfaGludGVyX2Z1bmNzID0KKyAgeworICAgIChUMV9IaW50ZXJfQ2hhbmdlSGludHMpICB0MV9oaW50ZXJfY2hhbmdlaGludHMsCisgICAgKFQxX0hpbnRlcl9Eb3RTZWN0aW9uKSAgIHQxX2hpbnRlcl9pZ25vcmUsCisgICAgKFQxX0hpbnRlcl9TdGVtKSAgICAgICAgIHQxX2hpbnRlcl9zdGVtLAorICAgIChUMV9IaW50ZXJfU3RlbTMpICAgICAgICB0MV9oaW50ZXJfc3RlbTMKKyAgfTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqLworICAvKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKi8KKyAgLyoqKioqKioqKiogICAgICAgICAgICAgIFNURU0gSElOVFMgTUFOQUdFTUVOVCAgICAgICAgICAgICAgICAqKioqKioqKiovCisgIC8qKioqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqLworICAvKioqKioqKioqKiAgIFRoZSBmb2xsb3dpbmcgY29kZSBpcyBpbiBjaGFyZ2Ugb2YgY29tcHV0aW5nICAgICoqKioqKioqKi8KKyAgLyoqKioqKioqKiogICB0aGUgcGxhY2VtZW50IG9mIGVhY2ggc2NhbGVkIHN0ZW0gaGludC4uICAgICAgICAqKioqKioqKiovCisgIC8qKioqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogPEZ1bmN0aW9uPgorICogICAgdDFfc29ydF9oaW50cworICoKKyAqIDxEZXNjcmlwdGlvbj4KKyAqICAgIFNvcnQgdGhlIGxpc3Qgb2YgYWN0aXZlIHN0ZW1zIGluIGluY3JlYXNpbmcgb3JkZXIsIHRocm91Z2gKKyAqICAgIHRoZSAic29ydCIgaW5kZXhpbmcgdGFibGUKKyAqCisgKiA8SW5wdXQ+CisgKiAgICB0YWJsZSAgOjogYSBzdGVtIGhpbnRzIHRhYmxlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICBzdGF0aWMKKyAgdm9pZCAgdDFfc29ydF9oaW50cyggVDFfU3RlbV9UYWJsZSogIHRhYmxlICkKKyAgeworICAgIFQxX0ludCAgICAgICAgIG51bV9zdGVtcyAgID0gdGFibGUtPm51bV9zdGVtczsKKyAgICBUMV9JbnQgICAgICAgICBudW1fYWN0aXZlICA9IDA7CisgICAgVDFfSW50KiAgICAgICAgc29ydCAgICAgICAgPSB0YWJsZS0+c29ydDsKKyAgICBUMV9TdGVtX0hpbnQqICBzdGVtcyAgICAgICA9IHRhYmxlLT5zdGVtczsKKyAgICBUMV9JbnQgICAgICAgICBuOworCisgICAgLyogcmVjb3JkIGFjdGl2ZSBzdGVtcyBpbiBzb3J0IHRhYmxlICovCisgICAgZm9yICggbiA9IDA7IG4gPCBudW1fc3RlbXM7IG4rKyApCisgICAgeworICAgICAgaWYgKCBzdGVtc1tuXS5oaW50X2ZsYWdzICYgVDFfSElOVF9GTEFHX0FDVElWRSApCisgICAgICAgIHNvcnRbbnVtX2FjdGl2ZSsrXSA9IG47CisgICAgfQorCisgICAgLyogbm93IHNvcnQgdGhlIGluZGljZXMuIFRoZXJlIGFyZSB1c3VhbGx5IHZlcnkgZmV3IHN0ZW1zLCAqLworICAgIC8qIGFuZCB0aGV5IGFyZSBwcmUtc29ydGVkIGluIDkwJSBjYXNlcywgc28gd2UgY2hvb3NlIGEgICAgKi8KKyAgICAvKiBzaW1wbGUgYnViYmxlIHNvcnQgKHF1aWNrc29ydCB3b3VsZCBiZSBzbG93ZXIpLi4gICAgICAgICovCisgICAgZm9yICggbiA9IDE7IG4gPCBudW1fYWN0aXZlOyBuKysgKQorICAgIHsKKyAgICAgIFQxX0ludCAgICAgICAgcCAgID0gbi0xOworICAgICAgVDFfU3RlbV9IaW50KiBjdXIgPSBzdGVtcyArIHNvcnRbbl07CisKKyAgICAgIGRvCisgICAgICB7CisgICAgICAgIFQxX0ludCAgICAgICAgIHN3YXA7CisgICAgICAgIFQxX1N0ZW1fSGludCogIHByZXYgPSBzdGVtcyArIHNvcnRbcF07CisKKyAgICAgICAgLyogbm90ZSB0aGF0IGJ5IGRlZmluaXRpb24sIHRoZSBhY3RpdmUgc3RlbXMgY2Fubm90IG92ZXJsYXAgICAgKi8KKyAgICAgICAgLyogc28gd2Ugc2ltcGx5IGNvbXBhcmUgdGhlaXIgIm1pbiIgdG8gc29ydCB0aGVtLi4gICAgICAgICAgICAgKi8KKyAgICAgICAgLyogKHdlIGNvdWxkIGNvbXBhcmUgdGhlaXIgbWF4LCB0aGlzIHdvdWxkbid0IGNoYW5nZSBhbnl0aGluZykgKi8KKyAgICAgICAgaWYgKCBwcmV2LT5taW5fZWRnZS5vcnVzIDw9IGN1ci0+bWluX2VkZ2Uub3J1cyApCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLyogc3dhcCBlbGVtZW50cyAqLworICAgICAgICBzd2FwICAgICAgPSBzb3J0WyBwIF07CisgICAgICAgIHNvcnRbIHAgXSA9IHNvcnRbcCsxXTsKKyAgICAgICAgc29ydFtwKzFdID0gc3dhcDsKKyAgICAgICAgcC0tOworICAgICAgfQorICAgICAgd2hpbGUgKCBwID49IDAgKTsKKyAgICB9CisKKyAgICB0YWJsZS0+bnVtX2FjdGl2ZSA9IG51bV9hY3RpdmU7CisgIH0KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogPEZ1bmN0aW9uPgorICogICAgdDFfaGludF9ob3Jpem9udGFsX3N0ZW1zCisgKgorICogPERlc2NyaXB0aW9uPgorICogICAgQ29tcHV0ZSB0aGUgbG9jYXRpb24gb2YgZWFjaCBzY2FsZWQgaG9yaXpvbnRhbCBzdGVtIGhpbnQuCisgKiAgICBUaGlzIHRha2VzIGNhcmUgb2YgdGhlIGJsdWUgem9uZXMgYW5kIHRoZSBob3Jpem9udGFsIHN0ZW0KKyAqICAgIHNuYXAgdGFibGUKKyAqCisgKiA8SW5wdXQ+CisgKiAgICB0YWJsZSAgICAgOjogdGhlIGhvcml6b250YWwgc3RlbSBoaW50cyB0YWJsZQorICogICAgaGludHMgICAgIDo6IHRoZSBjdXJyZW50IHNpemUncyBoaW50IHN0cnVjdHVyZQorICogICAgYmx1ZVNoaWZ0IDo6IHRoZSB2YWx1ZSBvZiB0aGUgL0JsdWVTaGlmdCBhcyB0YWtlbiBmcm9tIHRoZQorICogICAgICAgICAgICAgICAgIGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgIHNjYWxlICAgICA6OiB0aGUgMTYuMTYgc2NhbGUgdXNlZCB0byBjb252ZXJ0IG91dGxpbmUKKyAqICAgICAgICAgICAgICAgICB1bml0cyB0byAyNi42IHBpeGVscworICoKKyAqIDxOb3RlPgorICogICAgRm9yIG5vdywgYWxsIHN0ZW1zIGFyZSBoaW50ZWQgaW5kZXBlbmRlbnRseSBmcm9tIGVhY2ggb3RoZXIuCisgKiAgICBJdCBtaWdodCBiZSBuZWNlc3NhcnksIGZvciBiZXR0ZXIgcGVyZm9ybWFuY2UsIHRvIGludHJvZHVjZQorICogICAgdGhlIG5vdGlvbiBvZiAiY29udHJvbGxlZCIgaGludHMgZGVzY3JpYmluZyB0aGluZ3MgbGlrZQorICogICAgY291bnRlci1zdGVtcywgc3RlbTMgYXMgd2VsbCBhcyBvdmVybGFwcGluZyBzdGVtcyBjb250cm9sLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgc3RhdGljCisgIHZvaWQgIHQxX2hpbnRfaG9yaXpvbnRhbF9zdGVtcyggVDFfU3RlbV9UYWJsZSogIHRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQxX1NpemVfSGludHMqICBoaW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUMV9Qb3MgICAgICAgICAgYmx1ZVNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQxX0ZpeGVkICAgICAgICBzY2FsZSApCisgIHsKKyAgICBUMV9TdGVtX0hpbnQqICBzdGVtICAgICAgPSB0YWJsZS0+c3RlbXM7CisgICAgVDFfU3RlbV9IaW50KiAgbGltaXQgICAgID0gc3RlbSArIHRhYmxlLT5udW1fc3RlbXM7CisKKyAgICAvKiBmaXJzdCBvZiBhbGwsIHNjYWxlIHRoZSBibHVlU2hpZnQgKi8KKyAgICBibHVlU2hpZnQgPSBTQ0FMRShibHVlU2hpZnQpOworCisgICAgLyogdGhlbiBzY2FuIHRoZSBob3Jpem9udGFsIHN0ZW0gdGFibGUgKi8KKyAgICBmb3IgKCA7IHN0ZW0gPCBsaW1pdDsgc3RlbSsrICkKKyAgICB7CisgICAgICBUMV9Qb3MgIGJvdHRvbV9vcnVzID0gc3RlbS0+bWluX2VkZ2Uub3J1czsKKyAgICAgIFQxX1BvcyAgdG9wX29ydXMgICAgPSBzdGVtLT5tYXhfZWRnZS5vcnVzOworCisgICAgICBUMV9Qb3MgIHRvcF9waXggICAgID0gU0NBTEUoIHRvcF9vcnVzICk7CisgICAgICBUMV9Qb3MgIGJvdHRvbV9waXggID0gU0NBTEUoIGJvdHRvbV9vcnVzICk7CisgICAgICBUMV9Qb3MgIHdpZHRoX3BpeCAgID0gdG9wX3BpeCAtIGJvdHRvbV9waXg7CisKKyAgICAgIFQxX1BvcyAgYm90dG9tICAgICAgPSBib3R0b21fcGl4OworICAgICAgVDFfUG9zICB0b3AgICAgICAgICA9IHRvcF9waXg7CisgICAgICBUMV9JbnQgIGFsaWduICAgICAgID0gVDFfQUxJR05fTk9ORTsKKworICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgIC8qIFNuYXAgcGl4ZWwgd2lkdGggaWYgaW4gc3RlbSBzbmFwIHJhbmdlICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICB7CisgICAgICAgIFQxX1NuYXBfWm9uZSogIHpvbmUgICAgICAgPSBoaW50cy0+c25hcF9oZWlnaHRzOworICAgICAgICBUMV9TbmFwX1pvbmUqICB6b25lX2xpbWl0ID0gem9uZSArIGhpbnRzLT5udW1fc25hcF9oZWlnaHRzOworCisgICAgICAgIGZvciAoIDsgem9uZSA8IHpvbmVfbGltaXQ7IHpvbmUrKyApCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoIHdpZHRoX3BpeCA8IHpvbmUtPm1pbiApCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGlmICggd2lkdGhfcGl4IDw9IHpvbmUtPm1heCApCisgICAgICAgICAgeworICAgICAgICAgICAgd2lkdGhfcGl4ID0gem9uZS0+cGl4OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAvKiByb3VuZCB3aWR0aCAtIG1pbmltdW0gMSBwaXhlbCBpZiB0aGlzIGlzbid0IGEgZ2hvc3Qgc3RlbSAgICAgICAqLworICAgICAgaWYgKCB3aWR0aF9waXggPiAwICkKKyAgICAgICAgd2lkdGhfcGl4ID0gKCB3aWR0aF9waXggPCBPTkVfUElYRUwgPyBPTkVfUElYRUwgOiBST1VORCh3aWR0aF9waXgpICk7CisKKworICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgIC8qIE5vdyBjaGVjayBmb3IgYm90dG9tIGJsdWUgem9uZXMgYWxpZ25lbWVudCAgICAgICAgICAgICAgICAgICAgICovCisgICAgICB7CisgICAgICAgIFQxX0ludCAgICAgICAgIG51bV9ibHVlcyAgPSBoaW50cy0+bnVtX2JvdHRvbV96b25lczsKKyAgICAgICAgVDFfU25hcF9ab25lKiAgYmx1ZSAgICAgICA9IGhpbnRzLT5ibHVlX3pvbmVzOworICAgICAgICBUMV9TbmFwX1pvbmUqICBibHVlX2xpbWl0ID0gYmx1ZSArIG51bV9ibHVlczsKKworICAgICAgICBmb3IgKCA7IGJsdWUgPCBibHVlX2xpbWl0OyBibHVlKysgKQorICAgICAgICB7CisgICAgICAgICAgaWYgKCBib3R0b21fcGl4IDwgYmx1ZS0+bWluICkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgaWYgKCBib3R0b21fcGl4IDw9IGJsdWUtPm1heCApCisgICAgICAgICAgeworICAgICAgICAgICAgYWxpZ24gID0gVDFfQUxJR05fQk9UVE9NOworICAgICAgICAgICAgYm90dG9tID0gUk9VTkQoIGJsdWUtPnBpeCApOworCisgICAgICAgICAgICAvKiBpbXBsZW1lbnRzIGJsdWUgc2hpZnQgKi8KKyAgICAgICAgICAgIGlmICghaGludHMtPnN1cHJlc3Nfb3ZlcnNob290cykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgVDFfUG9zICBkZWx0YSA9IGJsdWUtPnBpeCAtIGJvdHRvbV9waXg7CisgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBkZWx0YSAgID0gKCBkZWx0YSA8IGJsdWVTaGlmdCA/IDAgOiBST1VORCggZGVsdGEgKSApOworICAgICAgICAgICAgICBib3R0b20gLT0gZGVsdGE7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisKKworICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgIC8qIENoZWNrIGZvciB0b3AgYmx1ZSB6b25lcyBhbGlnbmVtZW50ICovCisgICAgICB7CisgICAgICAgIFQxX0ludCAgICAgICAgIG51bV9ibHVlcyAgPSBoaW50cy0+bnVtX2JsdWVfem9uZXMgLSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpbnRzLT5udW1fYm90dG9tX3pvbmVzOworCisgICAgICAgIFQxX1NuYXBfWm9uZSogIGJsdWUgICAgICAgPSBoaW50cy0+Ymx1ZV96b25lcyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaW50cy0+bnVtX2JvdHRvbV96b25lczsKKworICAgICAgICBUMV9TbmFwX1pvbmUqICBibHVlX2xpbWl0ID0gYmx1ZSArIG51bV9ibHVlczsKKworICAgICAgICBmb3IgKCA7IGJsdWUgPCBibHVlX2xpbWl0OyBibHVlKysgKQorICAgICAgICB7CisgICAgICAgICAgaWYgKCB0b3BfcGl4IDwgYmx1ZS0+bWluICkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgaWYgKCB0b3BfcGl4IDw9IGJsdWUtPm1heCApCisgICAgICAgICAgeworICAgICAgICAgICAgYWxpZ24gIHw9IFQxX0FMSUdOX1RPUDsKKyAgICAgICAgICAgIHRvcCAgICAgPSBST1VORCggYmx1ZS0+cGl4ICk7CisKKyAgICAgICAgICAgIC8qIGltcGxlbWVudHMgYmx1ZSBzaGlmdCAqLworICAgICAgICAgICAgaWYgKCFoaW50cy0+c3VwcmVzc19vdmVyc2hvb3RzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBUMV9Qb3MgIGRlbHRhID0gdG9wIC0gYmx1ZS0+cGl4OworICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgZGVsdGEgID0gKCBkZWx0YSA8IGJsdWVTaGlmdCA/IDAgOiBST1VORCggZGVsdGEgKSApOworICAgICAgICAgICAgICB0b3AgICArPSBkZWx0YTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworCisgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgLyogY29tcHV0ZSB0aGUgaGludGVkIHN0ZW0gcG9zaXRpb24sIGFjY29yZGluZyB0byBpdHMgYWxpZ25tZW50ICAgKi8KKyAgICAgIHN3aXRjaCAoYWxpZ24pCisgICAgICB7CisgICAgICAgIGNhc2UgVDFfQUxJR05fQk9UVE9NOiAgLyogYm90dG9tIHpvbmUgYWxpZ25lbWVudCAqLworICAgICAgICAgIGJvdHRvbV9waXggPSBib3R0b207CisgICAgICAgICAgdG9wX3BpeCAgICA9IGJvdHRvbSArIHdpZHRoX3BpeDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgICAKKyAgICAgICAgY2FzZSBUMV9BTElHTl9UT1A6ICAvKiB0b3Agem9uZSBhbGlnbmVtZW50ICovCisgICAgICAgICAgdG9wX3BpeCAgICA9IHRvcDsKKyAgICAgICAgICBib3R0b21fcGl4ID0gdG9wIC0gd2lkdGhfcGl4OworICAgICAgICAgIAorICAgICAgICAgIGJyZWFrOworICAgICAgICAgIAorICAgICAgICBjYXNlIFQxX0FMSUdOX0JPVEg6ICAvKiBib3R0b20rdG9wIHpvbmUgYWxpZ25lbWVudCAqLworICAgICAgICAgIGJvdHRvbV9waXggPSBib3R0b207CisgICAgICAgICAgdG9wX3BpeCAgICA9IHRvcDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgICAKKyAgICAgICAgZGVmYXVsdDogIC8qIG5vIGFsaWduZW1lbnQgKi8KKworICAgICAgICAgIC8qIFhYWFggOiBUT0RPIDogQWRkIG1hbmFnZW1lbnQgb2YgY29udHJvbGxlZCBzdGVtcyAqLyAgICAgICAgCisgICAgICAgICAgYm90dG9tID0gKCBTQ0FMRShib3R0b21fb3J1cyt0b3Bfb3J1cykgLSB3aWR0aF9waXggKS8yOworICAgICAgICAKKyAgICAgICAgICBib3R0b21fcGl4ID0gUk9VTkQoYm90dG9tKTsKKyAgICAgICAgICB0b3BfcGl4ICAgID0gYm90dG9tX3BpeCArIHdpZHRoX3BpeDsKKyAgICAgIH0KKyAgICAgIAorICAgICAgc3RlbS0+bWluX2VkZ2UucGl4ID0gYm90dG9tX3BpeDsKKyAgICAgIHN0ZW0tPm1heF9lZGdlLnBpeCA9IHRvcF9waXg7CisgICAgfQorICB9CisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiA8RnVuY3Rpb24+CisgKiAgICB0MV9oaW50X3ZlcnRpY2FsX3N0ZW1zCisgKgorICogPERlc2NyaXB0aW9uPgorICogICAgQ29tcHV0ZSB0aGUgbG9jYXRpb24gb2YgZWFjaCBzY2FsZWQgdmVydGljYWwgc3RlbSBoaW50LgorICogICAgVGhpcyB0YWtlcyBjYXJlIG9mIHRoZSB2ZXJ0aWNhbCBzdGVtIHNuYXAgdGFibGUKKyAqCisgKiA8SW5wdXQ+CisgKiAgICB0YWJsZSAgICAgOjogdGhlIHZlcnRpY2FsIHN0ZW0gaGludHMgdGFibGUKKyAqICAgIGhpbnRzICAgICA6OiB0aGUgY3VycmVudCBzaXplJ3MgaGludCBzdHJ1Y3R1cmUKKyAqICAgIHNjYWxlICAgICA6OiB0aGUgMTYuMTYgc2NhbGUgdXNlZCB0byBjb252ZXJ0IG91dGxpbmUKKyAqICAgICAgICAgICAgICAgICB1bml0cyB0byAyNi42IHBpeGVscworICoKKyAqIDxOb3RlPgorICogICAgRm9yIG5vdywgYWxsIHN0ZW1zIGFyZSBoaW50ZWQgaW5kZXBlbmRlbnRseSBmcm9tIGVhY2ggb3RoZXIuCisgKiAgICBJdCBtaWdodCBiZSBuZWNlc3NhcnksIGZvciBiZXR0ZXIgcGVyZm9ybWFuY2UsIHRvIGludHJvZHVjZQorICogICAgdGhlIG5vdGlvbiBvZiAiY29udHJvbGxlZCIgaGludHMgZGVzY3JpYmluZyB0aGluZ3MgbGlrZQorICogICAgY291bnRlci1zdGVtcywgc3RlbTMgYXMgd2VsbCBhcyBvdmVybGFwcGluZyBzdGVtcyBjb250cm9sLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgLyogY29tcHV0ZSB0aGUgbG9jYXRpb24gb2YgZWFjaCBzY2FsZWQgdmVydGljYWwgc3RlbSBoaW50LiAqLworICAvKiBUYWtlIGNhcmUgb2YgYmx1ZSB6b25lcyBhbmQgc3RlbSBzbmFwIHRhYmxlICAgICAgICAgICAgICovCisgIHN0YXRpYworICB2b2lkICB0MV9oaW50X3ZlcnRpY2FsX3N0ZW1zKCBUMV9TdGVtX1RhYmxlKiAgdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQxX1NpemVfSGludHMqICBoaW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVDFfRml4ZWQgICAgICAgIHNjYWxlICkKKyAgeworICAgIFQxX1N0ZW1fSGludCogIHN0ZW0gID0gdGFibGUtPnN0ZW1zOworICAgIFQxX1N0ZW1fSGludCogIGxpbWl0ID0gc3RlbSArIHRhYmxlLT5udW1fc3RlbXM7CisKKyAgICBmb3IgKCA7IHN0ZW0gPCBsaW1pdDsgc3RlbSsrICkKKyAgICB7CisgICAgICBUMV9Qb3MgIHN0ZW1fbGVmdCAgPSBzdGVtLT5taW5fZWRnZS5vcnVzOworICAgICAgVDFfUG9zICBzdGVtX3JpZ2h0ID0gc3RlbS0+bWF4X2VkZ2Uub3J1czsKKyAgICAgIFQxX1BvcyAgd2lkdGhfcGl4LCBsZWZ0OworCisgICAgICB3aWR0aF9waXggPSBTQ0FMRSggc3RlbV9yaWdodCAtIHN0ZW1fbGVmdCApOworCisgICAgICAvKiBTbmFwIHBpeGVsIHdpZHRoIGlmIGluIHN0ZW0gc25hcCByYW5nZSAqLworICAgICAgeworICAgICAgICBUMV9TbmFwX1pvbmUqICB6b25lICAgICAgID0gaGludHMtPnNuYXBfd2lkdGhzOworICAgICAgICBUMV9TbmFwX1pvbmUqICB6b25lX2xpbWl0ID0gem9uZSArIGhpbnRzLT5udW1fc25hcF93aWR0aHM7CisKKyAgICAgICAgZm9yICggOyB6b25lIDwgem9uZV9saW1pdDsgem9uZSsrICkKKyAgICAgICAgeworICAgICAgICAgIGlmICggd2lkdGhfcGl4IDwgem9uZS0+bWluICkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgaWYgKCB3aWR0aF9waXggPD0gem9uZS0+bWF4ICkKKyAgICAgICAgICB7CisgICAgICAgICAgICB3aWR0aF9waXggPSB6b25lLT5waXg7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgIAorICAgICAgLyogcm91bmQgd2lkdGggLSBtaW5pbXVtIDEgcGl4ZWwgaWYgdGhpcyBpc24ndCBhIGdob3N0IHN0ZW0gKi8KKyAgICAgIGlmICggd2lkdGhfcGl4ID4gMCApCisgICAgICAgIHdpZHRoX3BpeCA9ICggd2lkdGhfcGl4IDwgT05FX1BJWEVMID8gT05FX1BJWEVMIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBST1VORCggd2lkdGhfcGl4ICkgKTsKKworICAgICAgLyogbm93IHBsYWNlIHRoZSBzbmFwcGVkIGFuZCByb3VuZGVkIHN0ZW0gICAqLworCisgICAgICAvKiBYWFhYIDogVE9ETyA6IGltcGxlbWVudCBjb250cm9sbGVkIHN0ZW1zIGZvciB0aGUgb3ZlcmxhcHBpbmcgKi8KKyAgICAgIC8qICAgICAgICAgICAgICAgY2FzZXMuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgICAgICBsZWZ0ID0gKCBTQ0FMRShzdGVtX2xlZnQrc3RlbV9yaWdodCkgLSB3aWR0aF9waXggKS8yOworCisgICAgICBzdGVtLT5taW5fZWRnZS5waXggPSBST1VORChsZWZ0KTsKKyAgICAgIHN0ZW0tPm1heF9lZGdlLnBpeCA9IHN0ZW0tPm1pbl9lZGdlLnBpeCArIHdpZHRoX3BpeDsKKyAgICB9CisgIH0KKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIDxGdW5jdGlvbj4KKyAqICAgIHQxX2hpbnRfcG9pbnQKKyAqCisgKiA8RGVzY3JpcHRpb24+CisgKiAgICBHcmlkLWZpdCBhIGNvb3JkaW5hdGUgd2l0aCByZWdhcmRzIHRvIGEgZ2l2ZW4gc3RlbSBoaW50cyB0YWJsZQorICoKKyAqIDxJbnB1dD4KKyAqICAgIHRhYmxlICA6OiB0aGUgc291cmNlIHN0ZW0gaGludHMgdGFibGUKKyAqICAgIGNvb3JkICA6OiBvcmlnaW5hbCBjb29yZGluYXRlLCBleHByZXNzZWQgaW4gZm9udCB1bml0cworICogICAgc2NhbGUgIDo6IHRoZSAxNi4xNiBzY2FsZSB1c2VkIHRvIGNvbnZlcnQgZm9udCB1bml0cyBpbnRvCisgKiAgICAgICAgICAgICAgMjYuNiBwaXhlbHMKKyAqCisgKiA8UmV0dXJuPgorICogICAgdGhlIGhpbnRlZC9zY2FsZWQgdmFsdWUgaW4gMjYuNiBwaXhlbHMKKyAqCisgKiA8Tm90ZT4KKyAqICAgIEZvciBub3csIGFsbCBzdGVtcyBhcmUgaGludGVkIGluZGVwZW5kZW50bHkgZnJvbSBlYWNoIG90aGVyLgorICogICAgSXQgbWlnaHQgYmUgbmVjZXNzYXJ5LCBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlLCB0byBpbnRyb2R1Y2UKKyAqICAgIHRoZSBub3Rpb24gb2YgImNvbnRyb2xsZWQiIGhpbnRzIGRlc2NyaWJpbmcgdGhpbmdzIGxpa2UKKyAqICAgIGNvdW50ZXItc3RlbXMsIHN0ZW0zIGFzIHdlbGwgYXMgb3ZlcmxhcHBpbmcgc3RlbXMgY29udHJvbC4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIHN0YXRpYworICBUMV9Qb3MgIHQxX2hpbnRfcG9pbnQoIFQxX1N0ZW1fVGFibGUqICB0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBUMV9Qb3MgICAgICAgICAgY29vcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgVDFfRml4ZWQgICAgICAgIHNjYWxlICkKKyAgeworICAgIFQxX0ludCAgICAgICAgIG51bV9hY3RpdmUgPSB0YWJsZS0+bnVtX2FjdGl2ZTsKKyAgICBUMV9JbnQgICAgICAgICBuOworICAgIFQxX1N0ZW1fSGludCogIHByZXYgPSAwOworICAgIFQxX1N0ZW1fSGludCogIGN1ciAgPSAwOworICAgIFQxX0VkZ2UqICAgICAgIG1pbjsKKyAgICBUMV9FZGdlKiAgICAgICBtYXg7CisgICAgVDFfUG9zICAgICAgICAgZGVsdGE7CisKKyAgICAvKiBvbmx5IGhpbnQgd2hlbiB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgc3RlbSBkZWZpbmVkICovCisgICAgaWYgKG51bV9hY3RpdmUgPD0gMCkKKyAgICAgIHJldHVybiBTQ0FMRShjb29yZCk7CisKKyAgICAvKiBzY2FuIHRoZSBzdGVtIHRhYmxlIHRvIGRldGVybWluZSBwbGFjZW1lbnQgb2YgY29vcmRpbmF0ZSAqLworICAgIC8qIHJlbGF0aXZlIHRvIHRoZSBsaXN0IG9mIHNvcnRlZCBhbmQgc3RlbXMgICAgICAgICAgICAgICAgICovCisgICAgZm9yICggbiA9IDA7IG4gPCBudW1fYWN0aXZlOyBuKyssIHByZXYgPSBjdXIgKQorICAgIHsKKyAgICAgIGN1ciA9IHRhYmxlLT5zdGVtcyArIHRhYmxlLT5zb3J0W25dOworCisgICAgICAvKiBpcyBpdCBvbiB0aGUgbGVmdCBvZiB0aGUgY3VycmVudCBlZGdlID8gKi8KKyAgICAgIGRlbHRhID0gY3VyLT5taW5fZWRnZS5vcnVzIC0gY29vcmQ7CisgICAgICBpZiAoIGRlbHRhID09IDAgKSByZXR1cm4gY3VyLT5taW5fZWRnZS5waXg7CisKKyAgICAgIGlmIChkZWx0YSA+IDApCisgICAgICB7CisgICAgICAgIC8qIGlmIHRoaXMgaXMgdGhlIGxlZnQgb2YgdGhlIGZpcnN0IGVkZ2UsIHNpbXBseSBzaGlmdCAqLworICAgICAgICBpZiAoIXByZXYpIHJldHVybiBjdXItPm1pbl9lZGdlLnBpeCAtIFNDQUxFKGRlbHRhKTsKKworICAgICAgICAvKiBvdGhlcndpc2UsIGludGVycG9sYXRlIGJldHdlZW4gdGhlIG1heGltdW0gb2YgdGhlICovCisgICAgICAgIC8qIHByZXZpb3VzIHN0ZW0sIGFuZCB0aGUgbWluaW11bSBvZiB0aGUgY3VycmVudCBvbmUgKi8KKyAgICAgICAgbWluID0gJnByZXYtPm1heF9lZGdlOworICAgICAgICBtYXggPSAmY3VyLT5taW5fZWRnZTsKKyAgICAgICAgZ290byBJbnRlcnBvbGF0ZTsKKyAgICAgIH0KKworICAgICAgLyogaXMgaXQgd2l0aGluIHRoZSBjdXJyZW50IGVkZ2UgPyAqLworICAgICAgZGVsdGEgPSBjdXItPm1heF9lZGdlLm9ydXMgLSBjb29yZDsKKyAgICAgIGlmICggZGVsdGEgPT0gMCApIHJldHVybiBjdXItPm1heF9lZGdlLnBpeDsKKworICAgICAgaWYgKGRlbHRhID4gMCkKKyAgICAgIHsKKyAgICAgICAgLyogaW50ZXJwb2xhdGUgd2l0aGluIHRoZSBzdGVtICovCisgICAgICAgIG1pbiA9ICZjdXItPm1pbl9lZGdlOworICAgICAgICBtYXggPSAmY3VyLT5tYXhfZWRnZTsKKyAgICAgICAgZ290byBJbnRlcnBvbGF0ZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBhcHBhcmVudGx5LCB0aGlzIGNvb3JkaW5hdGUgaXMgb24gdGhlIHJpZ2h0IG9mIHRoZSBsYXN0IHN0ZW0gKi8KKyAgICBkZWx0YSA9IGNvb3JkIC0gY3VyLT5tYXhfZWRnZS5vcnVzOworICAgIHJldHVybiBjdXItPm1heF9lZGdlLnBpeCArIFNDQUxFKGRlbHRhKTsKKworICBJbnRlcnBvbGF0ZToKKyAgICByZXR1cm4gbWluLT5waXggKworICAgICAgICAgICAgRlRfTXVsRGl2KCBjb29yZCAgICAgLSBtaW4tPm9ydXMsCisgICAgICAgICAgICAgICAgICAgICAgIG1heC0+cGl4ICAtIG1pbi0+cGl4LAorICAgICAgICAgICAgICAgICAgICAgICBtYXgtPm9ydXMgLSBtaW4tPm9ydXMgKTsKKyAgfQorCisKKworCisKKworI2lmIDEKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIDxGdW5jdGlvbj4KKyAqICAgVDFfSGludF9Qb2ludHMKKyAqCisgKiA8RGVzY3JpcHRpb24+CisgKiAgIHRoaXMgZnVuY3Rpb24gZ3JpZC1maXRzIHNldmVyYWwgcG9pbnRzIGluIGEgZ2l2ZW4gVHlwZSAxIGJ1aWxkZXIKKyAqICAgYXQgb25jZS4gCisgKgorICogPElucHV0PgorICogICBidWlsZGVyICA6OiBoYW5kbGUgdG8gdGFyZ2V0IFR5cGUgMSBidWlsZGVyCisgKiAgIGZpcnN0ICAgIDo6IGZpcnN0IHBvaW50IHRvIGhpbnQgaW4gYnVpbGRlcidzIGN1cnJlbnQgb3V0bGluZQorICogICBsYXN0ICAgICA6OiBsYXN0IHBvaW50IHRvIGhpbnQgaW4gYnVpbGRlcidzIGN1cnJlbnQgb3V0bGluZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgTE9DQUxfRlVOQworICB2b2lkICBUMV9IaW50X1BvaW50cyggVDFfQnVpbGRlciogIGJ1aWxkZXIgKQorICB7CisgICAgVDFfSW50ICAgIGZpcnN0ICAgPSBidWlsZGVyLT5oaW50X3BvaW50OworICAgIFQxX0ludCAgICBsYXN0ICAgID0gYnVpbGRlci0+Y3VycmVudC5uX3BvaW50cy0xOworCisgICAgVDFfU2l6ZSAgIHNpemUgICAgPSBidWlsZGVyLT5zaXplOworICAgIFQxX0ZpeGVkICBzY2FsZV94ID0gc2l6ZS0+cm9vdC5tZXRyaWNzLnhfc2NhbGU7CisgICAgVDFfRml4ZWQgIHNjYWxlX3kgPSBzaXplLT5yb290Lm1ldHJpY3MueV9zY2FsZTsKKworICAgIFQxX0dseXBoX0hpbnRzKiAgaGludHMgICAgICA9IGJ1aWxkZXItPmdseXBoLT5oaW50czsKKyAgICBUMV9TdGVtX1RhYmxlKiAgIGhvcmlfc3RlbXMgPSAmaGludHMtPmhvcmlfc3RlbXM7CisgICAgVDFfU3RlbV9UYWJsZSogICB2ZXJ0X3N0ZW1zID0gJmhpbnRzLT52ZXJ0X3N0ZW1zOworCisgICAgVDFfVmVjdG9yKiAgY3VyICAgPSBidWlsZGVyLT5jdXJyZW50LnBvaW50cyArIGZpcnN0OworICAgIFQxX1ZlY3RvciogIGxpbWl0ID0gY3VyICsgbGFzdCAtIGZpcnN0ICsgMTsKKworICAgIC8qIGZpcnN0IG9mIGFsbCwgc29ydCB0aGUgYWN0aXZlIHN0ZW0gaGludHMgKi8KKyAgICB0MV9zb3J0X2hpbnRzKCBob3JpX3N0ZW1zICk7CisgICAgdDFfc29ydF9oaW50cyggdmVydF9zdGVtcyApOworCisgICAgZm9yICggOyBjdXIgPCBsaW1pdDsgY3VyKysgKQorICAgIHsKKyAgICAgIGN1ci0+eCA9IHQxX2hpbnRfcG9pbnQoIHZlcnRfc3RlbXMsIGN1ci0+eCwgc2NhbGVfeCApOworICAgICAgY3VyLT55ID0gdDFfaGludF9wb2ludCggaG9yaV9zdGVtcywgY3VyLT55LCBzY2FsZV95ICk7CisgICAgfQorCisgICAgYnVpbGRlci0+aGludF9wb2ludCA9IGJ1aWxkZXItPmN1cnJlbnQubl9wb2ludHM7CisgIH0KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogPEZ1bmN0aW9uPgorICogICAgVDFfSGludF9TdGVtcworICoKKyAqIDxEZXNjcmlwdGlvbj4KKyAqICAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBjb21wdXRlIHRoZSBsb2NhdGlvbiBvZiBlYWNoIHN0ZW0gaGludAorICogICAgYmV0d2VlbiB0aGUgZmlyc3QgYW5kIHNlY29uZCBwYXNzZXMgb2YgdGhlIGdseXBoIGxvYWRlciBvbiB0aGUKKyAqICAgIGNoYXJzdHJpbmcuCisgKgorICogPElucHV0PgorICogICAgYnVpbGRlciA6OiBoYW5kbGUgdG8gdGFyZ2V0IGJ1aWxkZXIKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIExPQ0FMX0ZVTkMKKyAgdm9pZCAgVDFfSGludF9TdGVtcyggVDFfQnVpbGRlciogIGJ1aWxkZXIgKQorICB7CisgICAgVDFfR2x5cGhfSGludHMqICBoaW50cyA9IGJ1aWxkZXItPmdseXBoLT5oaW50czsKKyAgICBUMV9Qcml2YXRlKiAgICAgIHByaXYgID0gJmJ1aWxkZXItPmZhY2UtPnByaXZhdGVfZGljdDsKKworICAgIFQxX1NpemUgICBzaXplICAgID0gYnVpbGRlci0+c2l6ZTsKKyAgICBUMV9GaXhlZCAgc2NhbGVfeCA9IHNpemUtPnJvb3QubWV0cmljcy54X3NjYWxlOworICAgIFQxX0ZpeGVkICBzY2FsZV95ID0gc2l6ZS0+cm9vdC5tZXRyaWNzLnlfc2NhbGU7CisKKyAgICB0MV9oaW50X2hvcml6b250YWxfc3RlbXMoICZoaW50cy0+aG9yaV9zdGVtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXItPnNpemUtPmhpbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpdi0+Ymx1ZV9zaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlX3kgKTsKKworICAgIHQxX2hpbnRfdmVydGljYWxfc3RlbXMoICZoaW50cy0+dmVydF9zdGVtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLT5zaXplLT5oaW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZV94ICk7CisgIH0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvdHlwZTEvdDFoaW50ZXIuaCBiL3NyYy90eXBlMS90MWhpbnRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiZjc1M2EKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdHlwZTEvdDFoaW50ZXIuaApAQCAtMCwwICsxLDM4MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgdDFoaW50ZXIuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjIKKyAqCisgKiAgICBUeXBlMSBoaW50ZXIuICAgICAgICAgCisgKgorICogIENvcHlyaWdodCAxOTk2LTE5OTkgYnkKKyAqICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZAorICogIG1vZGlmaWVkIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICoKKyAqICBUaGUgSGludGVyIGlzIGluIGNoYXJnZSBvZiBmaXR0aW5nIHRoIHNjYWxlZCBvdXRsaW5lIHRvIHRoZQorICogIHBpeGVsIGdyaWQgaW4gb3JkZXIgdG8gY29uc2lkZXJhYmx5IGltcHJvdmUgdGhlIHF1YWxpdHkgb2YKKyAqICB0aGUgVHlwZSAxIGZvbnQgZHJpdmVyJ3Mgb3V0cHV0Li4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIFQxSElOVEVSX0gKKyNkZWZpbmUgVDFISU5URVJfSAorCisjaW5jbHVkZSA8dDFvYmpzLmg+CisjaW5jbHVkZSA8dDFnbG9hZC5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKKyAgZXh0ZXJuICJDIiB7CisjZW5kaWYKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogPFN0cnVjdD4KKyAqICAgVDFfU25hcF9ab25lCisgKgorICogPERlc2NyaXB0aW9uPgorICogICBBICJzbmFwIHpvbmUiIGlzIHVzZWQgdG8gbW9kZWwgZWl0aGVyIGEgYmx1ZSB6b25lIG9yIGEgc3RlbSB3aWR0aAorICogICBhdCBhIGdpdmVuIGNoYXJhY3RlciBzaXplLiBJdCBpcyBtYWRlIG9mIGEgbWluaW11bSBhbmQgbWF4aW11bQorICogICBlZGdlLCBkZWZpbmVkIGluIDI2LjYgcGl4ZWxzLCBhcyB3ZWxsIGFzIG9uZSAib3JpZ2luYWwiIGFuZAorICogICAic2NhbGVkIiBwb3NpdGlvbi4KKyAqCisgKiAgIHRoZSBwb3NpdGlvbiBjb3JyZXNwb25kcyB0byB0aGUgc3RlbSB3aWR0aCAoZm9yIHN0ZW0gc25hcCB6b25lcykKKyAqICAgb3IgdG8gdGhlIGJsdWUgcG9zaXRpb24gKGZvciBibHVlIHpvbmVzKQorICoKKyAqIDxGaWVsZHM+CisgKiAgIG9ydXMgIDo6IG9yaWdpbmFsIHBvc2l0aW9uIGluIGZvbnQgdW5pdHMKKyAqICAgcGl4ICAgOjogY3VycmVudCBwb3NpdGlvbiBpbiBzdWItcGl4ZWwgdW5pdHMKKyAqICAgbWluICAgOjogbWluaW11bSBib3VuZGFyeSBpbiBzdWItcGl4ZWwgdW5pdHMKKyAqICAgbWF4ICAgOjogbWF4aW1pbSBib3VuZGFyeSBpbiBzdWItcGl4ZWwgdW5pdHMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIHR5cGVkZWYgc3RydWN0IFQxX1NuYXBfWm9uZV8KKyAgeworICAgIFQxX1BvcyAgb3J1czsKKyAgICBUMV9Qb3MgIHBpeDsgCisgICAgVDFfUG9zICBtaW47IAorICAgIFQxX1BvcyAgbWF4OyAgCisgIAorICB9IFQxX1NuYXBfWm9uZTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogPFN0cnVjdD4KKyAqICAgVDFfRWRnZQorICoKKyAqIDxEZXNjcmlwdGlvbj4KKyAqICAgQSB2ZXJ5IHNpbXBseSBzdHJ1Y3R1cmUgdXNlZCB0byBtb2RlbCBhbiBzdGVtIGVkZ2UKKyAqCisgKiA8RmllbGRzPgorICogICBvcnVzICA6OiBvcmlnaW5hbCBlZGdlIHBvc2l0aW9uIGluIGZvbnQgdW5pdHMKKyAqICAgcGl4ICAgOjogc2NhbGVkIGVkZ2UgcG9zaXRpb24gaW4gc3ViLXBpeGVsIHVuaXRzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICB0eXBlZGVmIHN0cnVjdCBUMV9FZGdlXworICB7CisgICAgVDFfUG9zICBvcnVzOworICAgIFQxX1BvcyAgcGl4OyAgCisgIAorICB9IFQxX0VkZ2U7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIDxTdHJ1Y3Q+CisgKiAgICBUMV9TdGVtX0hpbnQKKyAqCisgKiA8RGVzY3JpcHRpb24+CisgKiAgICBBIHNpbXBsZSBzdHJ1Y3R1cmUgdXNlZCB0byBtb2RlbCBhIHN0ZW0gaGludAorICoKKyAqIDxGaWVsZHM+CisgKiAgICBtaW5fZWRnZSAgIDo6IHRoZSBoaW50J3MgbWluaW11bSBlZGdlCisgKiAgICBtYXhfZWRnZSAgIDo6IHRoZSBoaW50J3MgbWF4aW11bSBlZGdlCisgKiAgICBoaW50X2ZsYWdzIDo6IHNvbWUgZmxhZ3MgZGVzY3JpYmluZyB0aGUgc3RlbSBwcm9wZXJ0aWVzCisgKgorICogPE5vdGU+CisgKiAgICB0aGUgbWluIGFuZCBtYXggZWRnZXMgb2YgYSBnaG9zdCBzdGVtIGhhdmUgdGhlIHNhbWUgcG9zaXRpb24sCisgKiAgICBldmVuIGlmIHRoZXkncmUgY29kZWQgaW4gYSB3ZWlyZCB3YXkgaW4gdGhlIGNoYXJzdHJpbmdzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICB0eXBlZGVmIHN0cnVjdCBUMV9TdGVtX0hpbnRfCisgIHsKKyAgICBUMV9FZGdlICBtaW5fZWRnZTsKKyAgICBUMV9FZGdlICBtYXhfZWRnZTsKKyAgICBUMV9JbnQgICBoaW50X2ZsYWdzOworCisgIH0gVDFfU3RlbV9IaW50OworCisKKyNkZWZpbmUgVDFfSElOVF9GTEFHX0FDVElWRSAgICAgIDEgICAgLyogaW5kaWNhdGVzIGFuIGFjdGl2ZSBzdGVtICovCisjZGVmaW5lIFQxX0hJTlRfRkxBR19NSU5fQk9SREVSICAyICAgIC8qIHVudXNlZCBmb3Igbm93Li4gICAgICAgICAqLworI2RlZmluZSBUMV9ISU5UX0ZMQUdfTUFYX0JPUkRFUiAgNCAgICAvKiB1bnVzZWQgZm9yIG5vdy4uICAgICAgICAgKi8KKworCisvKiBoaW50ZXIncyBjb25maWd1cmF0aW9uIGNvbnN0YW50cyAqLworI2RlZmluZSBUMV9ISU5URVJfTUFYX0JMVUVTICAgIDI0ICAgIC8qIG1heGltdW0gbnVtYmVyIG9mIGJsdWUgem9uZXMgICAgICAqLworI2RlZmluZSBUMV9ISU5URVJfTUFYX1NOQVBTICAgIDE2ICAgIC8qIG1heGltdW0gbnVtYmVyIG9mIHN0ZW0gc25hcCB6b25lcyAqLworI2RlZmluZSBUMV9ISU5URVJfTUFYX0VER0VTICAgIDY0ICAgIC8qIG1heGltdW0gbnVtYmVyIG9mIHN0ZW0gaGludHMgICAgICAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiA8U3RydWN0PgorICogICBUMV9TaXplX0hpbnRzCisgKgorICogPERlc2NyaXB0aW9uPgorICogICBBIHN0cnVjdHVyZSB1c2VkIHRvIG1vZGVsIHRoZSBoaW50aW5nIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8KKyAqICAgYSBzaXplIG9iamVjdAorICoKKyAqIDxGaWVsZHM+CisgKiAgIHN1cHJlc3Nfb3ZlcnNob290cyA6OiBhIGJvb2xlYW4gZmxhZyB0byB0ZWxsIHdoZW4gb3ZlcnNob290CisgKiAgICAgICAgICAgICAgICAgICAgICAgICBzdXByZXNzaW9uIHNob3VsZCBvY2N1ci4KKyAqCisgKiAgIG51bV9ibHVlX3pvbmVzICAgICA6OiB0aGUgdG90YWwgbnVtYmVyIG9mIGJsdWUgem9uZXMgKHRvcCtib3R0b20pCisgKiAgIG51bV9ib3R0b21fem9uZXMgICA6OiB0aGUgbnVtYmVyIG9mIGJvdHRvbSB6b25lcworICoKKyAqICAgYmx1ZV96b25lcyAgICAgICAgIDo6IHRoZSBibHVlIHpvbmVzIHRhYmxlLiBib3R0b20gem9uZXMgYXJlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZWQgZmlyc3QgaW4gdGhlIHRhYmxlLCBmb2xsb3dlZCBieQorICogICAgICAgICAgICAgICAgICAgICAgICAgYWxsIHRvcCB6b25lcworICoKKyAqICAgbnVtX3N0ZW1fc25hcEggICAgIDo6IG51bWJlciBvZiBob3Jpem9udGFsIHN0ZW0gc25hcCB6b25lcworICogICBzdGVtX3NuYXBIICAgICAgICAgOjogaG9yaXpvbnRhbCBzdGVtIHNuYXAgem9uZXMKKyAqCisgKiAgIG51bV9zdGVtX3NuYXBWICAgICA6OiBudW1iZXIgb2YgdmVydGljYWwgc3RlbSBzbmFwIHpvbmVzCisgKiAgIHN0ZW1fc25hcFYgICAgICAgICA6OiB2ZXJ0aWNhbCBzdGVtIHNuYXAgem9uZXMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIHN0cnVjdCBUMV9TaXplX0hpbnRzXworICB7CisgICAgVDFfQm9vbCAgICAgICBzdXByZXNzX292ZXJzaG9vdHM7CisKKyAgICBUMV9JbnQgICAgICAgIG51bV9ibHVlX3pvbmVzOworICAgIFQxX0ludCAgICAgICAgbnVtX2JvdHRvbV96b25lczsKKyAgICBUMV9TbmFwX1pvbmUgIGJsdWVfem9uZXNbIFQxX0hJTlRFUl9NQVhfQkxVRVMgXTsKKworICAgIFQxX0ludCAgICAgICAgbnVtX3NuYXBfd2lkdGhzOworICAgIFQxX1NuYXBfWm9uZSAgc25hcF93aWR0aHNbIFQxX0hJTlRFUl9NQVhfU05BUFMgXTsKKworICAgIFQxX0ludCAgICAgICAgbnVtX3NuYXBfaGVpZ2h0czsKKyAgICBUMV9TbmFwX1pvbmUgIHNuYXBfaGVpZ2h0c1sgVDFfSElOVEVSX01BWF9TTkFQUyBdOworICB9OworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIDxTdHJ1Y3Q+CisgKiAgICBUMV9TdGVtX1RhYmxlCisgKgorICogPERlc2NyaXB0aW9uPgorICogICAgQSBzaW1wbGUgc3RydWN0dXJlIHVzZWQgdG8gbW9kZWwgYSBzZXQgb2Ygc3RlbSBoaW50cyBpbiBhCisgKiAgICBzaW5nbGUgZGlyZWN0aW9uIGR1cmluZyB0aGUgbG9hZGluZyBvZiBhIGdpdmVuIGdseXBoIG91dGxpbmUuCisgKiAgICBOb3QgYWxsIHN0ZW0gaGludHMgYXJlIGFjdGl2ZSBhdCBhIHRpbWUuIE1vcmVvdmVyLCBzdGVtcyBtdXN0CisgKiAgICBiZSBzb3J0ZWQgcmVndWxhcmx5CisgKgorICogPEZpZWxkcz4KKyAqICAgIG51bV9zdGVtcyAgIDo6IHRvdGFsIG51bWJlciBvZiBzdGVtcyBpbiB0YWJsZQorICogICAgbnVtX2FjdGl2ZSAgOjogbnVtYmVyIG9mIGFjdGl2ZSBzdGVtcyBpbiB0YWJsZQorICoKKyAqICAgIHN0ZW1zICAgICAgIDo6IHRoZSB0YWJsZSBvZiBhbGwgc3RlbXMKKyAqICAgIHNvcnQgICAgICAgIDo6IGEgdGFibGUgb2YgaW5kaWNlcyBpbnRvIHRoZSBzdGVtcyB0YWJsZSwgdXNlZAorICogICAgICAgICAgICAgICAgICAgdG8ga2VlcCBhIHNvcnRlZCBsaXN0IG9mIHRoZSBhY3RpdmUgc3RlbXMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIHR5cGVkZWYgc3RydWN0IFQxX1N0ZW1fVGFibGVfCisgIHsKKyAgICBUMV9JbnQgICAgICAgIG51bV9zdGVtczsKKyAgICBUMV9JbnQgICAgICAgIG51bV9hY3RpdmU7CisKKyAgICBUMV9TdGVtX0hpbnQgIHN0ZW1zWyBUMV9ISU5URVJfTUFYX0VER0VTIF07CisgICAgVDFfSW50ICAgICAgICBzb3J0IFsgVDFfSElOVEVSX01BWF9FREdFUyBdOworCisgIH0gVDFfU3RlbV9UYWJsZTsKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiA8U3RydWN0PgorICogICBUMV9HbHlwaF9IaW50cworICoKKyAqIDxEZXNjcmlwdGlvbj4KKyAqICAgQSBzdHJ1Y3R1cmUgdXNlZCB0byBtb2RlbCB0aGUgc3RlbSBoaW50cyBvZiBhIGdpdmVuIGdseXBoIG91dGxpbmUKKyAqICAgZHVyaW5nIGdseXBoIGxvYWRpbmcuIAorICoKKyAqIDxGaWVsZHM+CisgKiAgIGhvcmlfc3RlbXMgIDo6IGhvcml6b250YWwgc3RlbSBoaW50cyB0YWJsZQorICogICB2ZXJ0X3N0ZW1zICA6OiB2ZXJ0aWNhbCBzdGVtIGhpbnRzIHRhYmxlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICBzdHJ1Y3QgVDFfR2x5cGhfSGludHNfCisgIHsKKyAgICBUMV9TdGVtX1RhYmxlICBob3JpX3N0ZW1zOworICAgIFQxX1N0ZW1fVGFibGUgIHZlcnRfc3RlbXM7CisgIH07CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogPERhdGE+CisgKiAgICB0MV9oaW50ZXJfZnVuY3MKKyAqCisgKiA8RGVzY3JpcHRpb24+CisgKiAgICBBIHRhYmxlIGNvbnRhaW5pbmcgdGhlIGFkZHJlc3Mgb2YgdmFyaW91cyBmdW5jdGlvbnMgdXNlZCBkdXJpbmcKKyAqICAgIHRoZSBsb2FkaW5nIG9mIGFuIGhpbnRlZCBzY2FsZWQgb3V0bGluZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgTE9DQUxfREVGCisgIGNvbnN0IFQxX0hpbnRlcl9GdW5jcyAgdDFfaGludGVyX2Z1bmNzOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiA8RnVuY3Rpb24+CisgKiAgICBUMV9OZXdfU2l6ZV9IaW50ZXIKKyAqCisgKiA8RGVzY3JpcHRpb24+CisgKiAgICBBbGxvY2F0ZXMgYSBuZXcgaGludGVyIHN0cnVjdHVyZSBmb3IgYSBnaXZlbiBzaXplIG9iamVjdAorICoKKyAqIDxJbnB1dD4KKyAqICAgIHNpemUgOjogaGFuZGxlIHRvIHRhcmdldCBzaXplIG9iamVjdAorICoKKyAqIDxSZXR1cm4+CisgKiAgICBFcnJvciBjb2RlLiAwIG1lYW5zIHN1Y2Nlc3MKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIExPQ0FMX0RFRgorICBUMV9FcnJvciAgVDFfTmV3X1NpemVfSGludGVyKCBUMV9TaXplICBzaXplICk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIDxGdW5jdGlvbj4KKyAqICAgIFQxX0RvbmVfU2l6ZV9IaW50ZXIKKyAqCisgKiA8RGVzY3JpcHRpb24+CisgKiAgICBSZWxlYXNlcyBhIGdpdmVuIHNpemUgb2JqZWN0J3MgaGludGVyIHN0cnVjdHVyZQorICoKKyAqIDxJbnB1dD4KKyAqICAgIHNpemUgOjogaGFuZGxlIHRvIHRhcmdldCBzaXplIG9iamVjdAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgTE9DQUxfREVGCisgIHZvaWQgICAgICBUMV9Eb25lX1NpemVfSGludGVyKCBUMV9TaXplICBzaXplICk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIDxGdW5jdGlvbj4KKyAqICAgIFQxX1Jlc2V0X1NpemVfSGludGVyCisgKgorICogPERlc2NyaXB0aW9uPgorICogICAgUmVjb21wdXRlcyBoaW50aW5nIGluZm9ybWF0aW9uIHdoZW4gYSBnaXZlbiBzaXplIG9iamVjdCBoYXMKKyAqICAgIGNoYW5nZWQgaXRzIHJlc29sdXRpb25zL2NoYXIgc2l6ZXMvcGl4ZWwgc2l6ZXMKKyAqCisgKiA8SW5wdXQ+CisgKiAgICBzaXplIDo6IGhhbmRsZSB0byBzaXplIG9iamVjdAorICoKKyAqIDxSZXR1cm4+CisgKiAgICBFcnJvciBjb2RlLiAwIG1lYW5zIHN1Y2Nlc3MKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIExPQ0FMX0RFRgorICBUMV9FcnJvciAgVDFfUmVzZXRfU2l6ZV9IaW50ZXIoIFQxX1NpemUgIHNpemUgKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogPEZ1bmN0aW9uPgorICogICAgVDFfTmV3X0dseXBoX0hpbnRlcgorICoKKyAqIDxEZXNjcmlwdGlvbj4KKyAqICAgIEFsbG9jYXRlcyBhIG5ldyBoaW50ZXIgc3RydWN0dXJlIGZvciBhIGdpdmVuIGdseXBoIHNsb3QKKyAqCisgKiA8SW5wdXQ+CisgKiAgICBnbHlwaCA6OiBoYW5kbGUgdG8gdGFyZ2V0IGdseXBoIHNsb3QKKyAqCisgKiA8UmV0dXJuPgorICogICAgRXJyb3IgY29kZS4gMCBtZWFucyBzdWNjZXNzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICBMT0NBTF9ERUYKKyAgVDFfRXJyb3IgIFQxX05ld19HbHlwaF9IaW50ZXIoIFQxX0dseXBoU2xvdCAgZ2x5cGggKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogPEZ1bmN0aW9uPgorICogICAgVDFfRG9uZV9HbHlwaF9IaW50ZXIKKyAqCisgKiA8RGVzY3JpcHRpb24+CisgKiAgICBSZWxlYXNlcyBhIGdpdmVuIGdseXBoIHNsb3QncyBoaW50ZXIgc3RydWN0dXJlCisgKgorICogPElucHV0PgorICogICAgZ2x5cGggOjogaGFuZGxlIHRvIGdseXBoIHNsb3QKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIExPQ0FMX0RFRgorICB2b2lkICAgICAgVDFfRG9uZV9HbHlwaF9IaW50ZXIoIFQxX0dseXBoU2xvdCAgZ2x5cGggKTsKKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIDxGdW5jdGlvbj4KKyAqICAgVDFfSGludF9Qb2ludHMKKyAqCisgKiA8RGVzY3JpcHRpb24+CisgKiAgIHRoaXMgZnVuY3Rpb24gZ3JpZC1maXRzIHNldmVyYWwgcG9pbnRzIGluIGEgZ2l2ZW4gVHlwZSAxIGJ1aWxkZXIKKyAqICAgYXQgb25jZS4gCisgKgorICogPElucHV0PgorICogICBidWlsZGVyICA6OiBoYW5kbGUgdG8gdGFyZ2V0IFR5cGUgMSBidWlsZGVyCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICBMT0NBTF9ERUYKKyAgdm9pZCAgVDFfSGludF9Qb2ludHMoIFQxX0J1aWxkZXIqICBidWlsZGVyICk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIDxGdW5jdGlvbj4KKyAqICAgIFQxX0hpbnRfU3RlbXMKKyAqCisgKiA8RGVzY3JpcHRpb24+CisgKiAgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gY29tcHV0ZSB0aGUgbG9jYXRpb24gb2YgZWFjaCBzdGVtIGhpbnQKKyAqICAgIGJldHdlZW4gdGhlIGZpcnN0IGFuZCBzZWNvbmQgcGFzc2VzIG9mIHRoZSBnbHlwaCBsb2FkZXIgb24gdGhlCisgKiAgICBjaGFyc3RyaW5nLgorICoKKyAqIDxJbnB1dD4KKyAqICAgIGJ1aWxkZXIgOjogaGFuZGxlIHRvIHRhcmdldCBidWlsZGVyCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICBMT0NBTF9ERUYKKyAgdm9pZCAgVDFfSGludF9TdGVtcyggVDFfQnVpbGRlciogIGJ1aWxkZXIgKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCisgIH0KKyNlbmRpZgorCisjZW5kaWYgLyogVDFISU5URVJfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3R5cGUxL3QxbG9hZC5jIGIvc3JjL3R5cGUxL3QxbG9hZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlNWEzNDcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdHlwZTEvdDFsb2FkLmMKQEAgLTAsMCArMSwxNDU4IEBACisjaW5jbHVkZSA8ZnRkZWJ1Zy5oPgorCisjaW5jbHVkZSA8dDF0eXBlcy5oPgorI2luY2x1ZGUgPHQxZW5jb2RlLmg+CisjaW5jbHVkZSA8dDF0b2tlbnMuaD4KKyNpbmNsdWRlIDx0MWNvbmZpZy5oPgorI2luY2x1ZGUgPHQxcGFyc2UuaD4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyN1bmRlZiAgRlRfQ09NUE9ORU5UCisjZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfdDFsb2FkCisKKyAgdHlwZWRlZiAgVDFfRXJyb3IgICgqVDFfUGFyc2VfRnVuYykoIFQxX1BhcnNlciogIHBhcnNlciApOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA8RnVuY3Rpb24+IEluaXRfVDFfUGFyc2VyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJbml0aWFsaXNlIGEgZ2l2ZW4gcGFyc2VyIG9iamVjdCB0byBidWlsZCBhIGdpdmVuIFQxX0ZhY2UgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBwYXJzZXIgIDo6IGhhbmRsZSB0byB0aGUgbmV3bHkgYnVpbHQgcGFyc2VyIG9iamVjdCAgICAgICAgICAgICAgICAgKi8KKy8qICAgIGZhY2UgICAgOjogaGFuZGxlIHRvIHRhcmdldCBUMSBmYWNlIG9iamVjdCAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIExPQ0FMX0ZVTkMKKyAgdm9pZCAgSW5pdF9UMV9QYXJzZXIoIFQxX1BhcnNlciogICAgcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgVDFfRmFjZSAgICAgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgVDFfVG9rZW5pemVyICB0b2tlbml6ZXIgKQorICB7CisgICAgcGFyc2VyLT5lcnJvciAgICAgPSAwOworICAgIHBhcnNlci0+ZmFjZSAgICAgID0gZmFjZTsKKyAgICBwYXJzZXItPnRva2VuaXplciA9IHRva2VuaXplcjsKKyAgICBwYXJzZXItPnRvcCAgICAgICA9IHBhcnNlci0+c3RhY2s7CisgICAgcGFyc2VyLT5saW1pdCAgICAgPSBwYXJzZXItPnN0YWNrICsgVDFfTUFYX1NUQUNLX0RFUFRIOworCisgICAgcGFyc2VyLT5zdGF0ZV9pbmRleCAgICA9IDA7CisgICAgcGFyc2VyLT5zdGF0ZV9zdGFja1swXSA9IGRpY3Rfbm9uZTsKKworCXBhcnNlci0+ZW5jb2RpbmdfdHlwZSAgICA9IGVuY29kaW5nX25vbmU7CisgICAgcGFyc2VyLT5lbmNvZGluZ19uYW1lcyAgID0gMDsKKyAgICBwYXJzZXItPmVuY29kaW5nX29mZnNldHMgPSAwOworICAgIHBhcnNlci0+ZW5jb2RpbmdfbGVuZ3RocyA9IDA7CisKKyAgICBwYXJzZXItPmR1bXBfdG9rZW5zICAgICAgPSAwOworICAgIGZhY2UtPnByaXZhdGVfZGljdC5sZW5JViA9IDQ7ICAvKiBYWFggOiBpcyBpdCBzdXJlID8/ICovCisgIH0KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA8RnVuY3Rpb24+IE5leHRfVDFfVG9rZW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBncmFicyB0aGUgbmV4dCBzaWduaWZpY2FudCB0b2tlbiBmcm9tIGEgcGFyc2VyJ3MgaW5wdXQgc3RyZWFtLiAgICAgKi8KKy8qICAgIHRoaXMgZnVuY3Rpb24gaWdub3JlcyBhIG51bWJlciBvZiB0b2tlbnMsIGFuZCB0cmFuc2xhdGVzICAgICAgICAgICAqLworLyogICAgYWx0ZXJuYXRlIGZvcm1zIGludG8gdGhlaXIgY29tbW9uIG9uZXMuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgcGFyc2VyICA6OiBoYW5kbGUgdG8gc291cmNlIHBhcnNlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgdG9rZW4gICA6OiB0aGUgZXh0cmFjdGVkIHRva2VuIGRlc2NyaXB0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRXJyb3IgY29kZS4gMCBtZWFucyBzdWNjZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgTE9DQUxfRlVOQworICBUMV9FcnJvciAgTmV4dF9UMV9Ub2tlbiggVDFfUGFyc2VyKiAgcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVDFfVG9rZW4qICAgdG9rZW4gKQorICB7CisgICAgVDFfRXJyb3IgICAgICBlcnJvcjsKKyAgICBUMV9Ub2tlbml6ZXIgIHRva3plciA9IHBhcnNlci0+dG9rZW5pemVyOworCisgIEwxOgorICAgIGVycm9yID0gUmVhZF9Ub2tlbiggdG9remVyICk7CisgICAgaWYgKGVycm9yKSByZXR1cm4gZXJyb3I7CisKKyAgICAvKiBXZSBub3cgbXVzdCBpZ25vcmUgYSBudW1iZXIgb2YgdG9rZW5zIGxpa2UgImR1cCIsICJleGVjdXRlb25seSIsICovCisgICAgLyogInJlYWRvbmx5IiwgZXRjLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICp0b2tlbiA9IHRva3plci0+dG9rZW47CisgICAgaWYgKCB0b2tlbi0+a2luZCA9PSB0b2tfa2V5d29yZCApCisgICAgICBzd2l0Y2goIHRva2VuLT5raW5kMiApCisgICAgICB7CisgICAgICAgIGNhc2Uga2V5X2R1cDoKKyAgICAgICAgY2FzZSBrZXlfZXhlY29ubHk6CisgICAgICAgIGNhc2Uga2V5X3JlYWRvbmx5OgorICAgICAgICBjYXNlIGtleV9ub2FjY2VzczoKKyAgICAgICAgY2FzZSBrZXlfdXNlcmRpY3Q6CisgICAgICAgICAgLyogZG8gbm90aGluZyAtIGxvb3AgKi8KKyAgICAgICAgICBnb3RvIEwxOworCisgICAgICAgIC8qIFdlIGFsc28gdHJhbnNsYXRlIHNvbWUgb3RoZXIga2V5d29yZHMgZnJvbSB0aGVpciBhbHRlcm5hdGl2ZSAqLworICAgICAgICAvKiB0byB0aGVpciAibm9ybWFsIiBmb3JtLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICAgICAgICBjYXNlIGtleV9OUF9hbHRlcm5hdGU6CisgICAgICAgICAgdG9rZW4tPmtpbmQyID0ga2V5X05QOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2Uga2V5X1JEX2FsdGVybmF0ZToKKyAgICAgICAgICB0b2tlbi0+a2luZDIgPSBrZXlfUkQ7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBrZXlfTkRfYWx0ZXJuYXRlOgorICAgICAgICAgIHRva2VuLT5raW5kMiA9IGtleV9ORDsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIDsKKyAgICAgIH0KKworICAgIC8qIER1bXAgdGhlIHRva2VuIHdoZW4gcmVxdWVzdGVkLiBUaGlzIGZlYXR1cmUgaXMgb25seSBhdmFpbGFibGUgKi8KKyAgICAvKiBpbiB0aGUgJ2Vycm9yJyBhbmQgJ3RyYWNlJyBkZWJ1ZyBsZXZlbHMuLiAgICAgICAgICAgICAgICAgICAgICovCisjaWYgZGVmaW5lZCggRlRfREVCVUdfTEVWRUxfRVJST1IgKSB8fCBkZWZpbmVkKCBGVF9ERUJVR19MRVZFTF9UUkFDRSApCisgICAgaWYgKCBwYXJzZXItPmR1bXBfdG9rZW5zICkKKyAgICB7CisgICAgICBUMV9TdHJpbmcgIHRlbXBfc3RyaW5nWzEyOF07CisgICAgICBUMV9JbnQgICAgIGxlbjsKKworICAgICAgbGVuID0gdG9rZW4tPmxlbjsKKyAgICAgIGlmICggbGVuID4gMTI3ICkgbGVuID0gMTI3OworICAgICAgc3RybmNweSggdGVtcF9zdHJpbmcsCisgICAgICAgICAgICAgICAoVDFfU3RyaW5nKil0b2t6ZXItPmJhc2UgKyB0b2tlbi0+c3RhcnQsCisgICAgICAgICAgICAgICBsZW4gKTsKKyAgICAgIHRlbXBfc3RyaW5nW2xlbl0gPSAnXDAnOworICAgICAgRlRfRVJST1IoKCAiJXNcbiIsIHRlbXBfc3RyaW5nICkpOworICAgIH0KKyNlbmRpZgorCisgICAgcmV0dXJuIFQxX0Vycl9PazsKKyAgfQorCisKKworICBzdGF0aWMKKyAgVDFfRXJyb3IgIEV4cGVjdF9LZXl3b3JkKCBUMV9QYXJzZXIqICAgIHBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUMV9Ub2tlblR5cGUgIGtleXdvcmQgKQorICB7CisgICAgVDFfVG9rZW4gIHRva2VuOworICAgIFQxX0Vycm9yICBlcnJvcjsKKworICAgIGVycm9yID0gTmV4dF9UMV9Ub2tlbiggcGFyc2VyLCAmdG9rZW4gKTsKKyAgICBpZiAoZXJyb3IpIGdvdG8gRXhpdDsKKworICAgIGlmICggdG9rZW4ua2luZCAgIT0gdG9rX2tleXdvcmQgfHwKKyAgICAgICAgIHRva2VuLmtpbmQyICE9IGtleXdvcmQgICAgICkKKyAgICB7CisgICAgICBlcnJvciA9IFQxX0Vycl9TeW50YXhfRXJyb3I7CisgICAgICBGVF9FUlJPUigoICJUMS5QYXJzZToga2V5d29yZCAnJXMnIGV4cGVjdGVkLlxuIiwKKyAgICAgICAgICAgICAgIHQxX2tleXdvcmRzWyBrZXl3b3JkIC0ga2V5X2ZpcnN0XyBdICkpOworICAgIH0KKworICBFeGl0OgorICAgIHJldHVybiBlcnJvcjsKKyAgfQorCisKKworICBzdGF0aWMKKyAgVDFfRXJyb3IgIEV4cGVjdF9LZXl3b3JkMiggVDFfUGFyc2VyKiAgICBwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQxX1Rva2VuVHlwZSAga2V5d29yZDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQxX1Rva2VuVHlwZSAga2V5d29yZDIgKQorICB7CisgICAgVDFfVG9rZW4gIHRva2VuOworICAgIFQxX0Vycm9yICBlcnJvcjsKKworICAgIGVycm9yID0gTmV4dF9UMV9Ub2tlbiggcGFyc2VyLCAmdG9rZW4gKTsKKyAgICBpZiAoZXJyb3IpIGdvdG8gRXhpdDsKKworICAgIGlmICggdG9rZW4ua2luZCAgIT0gdG9rX2tleXdvcmQgIHx8CisgICAgICAgICAoIHRva2VuLmtpbmQyICE9IGtleXdvcmQxICYmCisgICAgICAgICAgIHRva2VuLmtpbmQyICE9IGtleXdvcmQyICkgKQorICAgIHsKKyAgICAgIGVycm9yID0gVDFfRXJyX1N5bnRheF9FcnJvcjsKKyAgICAgIEZUX0VSUk9SKCggIlQxLlBhcnNlOiBrZXl3b3JkICclcycgb3IgJyVzJyBleHBlY3RlZC5cbiIsCisgICAgICAgICAgICAgICB0MV9rZXl3b3Jkc1sga2V5d29yZDEgLSBrZXlfZmlyc3RfIF0sCisgICAgICAgICAgICAgICB0MV9rZXl3b3Jkc1sga2V5d29yZDIgLSBrZXlfZmlyc3RfIF0gKSk7CisgICAgfQorCisgIEV4aXQ6CisgICAgcmV0dXJuIGVycm9yOworICB9CisKKworCisgIHN0YXRpYworICB2b2lkICBQYXJzZV9FbmNvZGluZyggVDFfUGFyc2VyKiAgcGFyc2VyICkKKyAgeworCVQxX1Rva2VuKiAgICAgdG9rZW4gID0gcGFyc2VyLT50b3ArMTsKKwlGVF9NZW1vcnkgICAgIG1lbW9yeSA9IHBhcnNlci0+ZmFjZS0+cm9vdC5tZW1vcnk7CisJVDFfRW5jb2RpbmcqICBlbmNvZGUgPSAmcGFyc2VyLT5mYWNlLT5lbmNvZGluZzsKKwlUMV9FcnJvciAgICAgIGVycm9yICA9IDA7CisKKwlpZiAodG9rZW4tPmtpbmQgID09IHRva19rZXl3b3JkICYmCisgICAgICAgICh0b2tlbi0+a2luZDIgPT0ga2V5X1N0YW5kYXJkRW5jb2RpbmcgfHwKKyAgICAgICAgIHRva2VuLT5raW5kMiA9PSBrZXlfRXhwZXJ0RW5jb2RpbmcgICApICApCisJeworCSAgZW5jb2RlLT5udW1fY2hhcnMgID0gMjU2OworCSAgZW5jb2RlLT5jb2RlX2ZpcnN0ID0gMzI7CisJICBlbmNvZGUtPmNvZGVfbGFzdCAgPSAyNTU7CisKKwkgIGlmICggQUxMT0NfQVJSQVkoIGVuY29kZS0+Y2hhcl9pbmRleCwgMjU2LCBUMV9TaG9ydCApICkKKwkJZ290byBFeGl0OworCisJICBlbmNvZGUtPmNoYXJfbmFtZSA9IDA7ICAvKiBubyBuZWVkIHRvIHN0b3JlIGdseXBoIG5hbWVzICovCisKKwkgIC8qIE5vdyBjb3B5IHRoZSBlbmNvZGluZyAqLworCSAgc3dpdGNoICh0b2tlbi0+a2luZDIpCisJICB7CisJCSAgY2FzZSBrZXlfRXhwZXJ0RW5jb2RpbmcgOiBwYXJzZXItPmVuY29kaW5nX3R5cGUgPSBlbmNvZGluZ19leHBlcnQ7CisJCSAgZGVmYXVsdCAgICAgICAgICAgICAgICAgOiBwYXJzZXItPmVuY29kaW5nX3R5cGUgPSBlbmNvZGluZ19zdGFuZGFyZDsgYnJlYWs7CisJICB9CisgICAgfQorCWVsc2UKKwl7CisJICBGVF9FUlJPUigoICJUMS5QYXJzZV9FbmNvZGluZzogaW52YWxpZCBlbmNvZGluZyB0eXBlXG4iICkpOworCSAgZXJyb3IgPSBUMV9FcnJfU3ludGF4X0Vycm9yOworICAgIH0KKworICBFeGl0OgorICAgIHBhcnNlci0+ZXJyb3IgPSBlcnJvcjsKKyAgfQorCisKKworCisKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICBJTVBMRU1FTlRBVElPTiBPRiBUSEUgIkRFRiIgS0VZV09SRCBERVBFTkRJTkcgT04gICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgIENVUlJFTlQgRElDVElPTkFSWSBTVEFURSAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA8RnVuY3Rpb24+IERvX0RlZl9Gb250ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGEgJ2RlZicgd2hlbiBpbiB0aGUgRm9udCBkaWN0aW9uYXJ5ICAgICAgICAgICovCisvKiAgICBJdHMgcHVycG9zZSBpcyB0byBidWlsZCB0aGUgVDFfRmFjZSBhdHRyaWJ1dGVzIGRpcmVjdGx5IGZyb20gICAgICAgICovCisvKiAgICB0aGUgc3RyZWFtLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBwYXJzZXIgOjogaGFuZGxlIHRvIGN1cnJlbnQgcGFyc2VyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBFcnJvciBjb2RlLiAwIG1lYW5zIHN1Y2Nlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0YXRpYworICBUMV9FcnJvciAgRG9fRGVmX0ZvbnQoIFQxX1BhcnNlciogIHBhcnNlciApCisgIHsKKyAgICBUMV9Ub2tlbiogIHRvcCAgID0gcGFyc2VyLT50b3A7CisgICAgVDFfRmFjZSAgICBmYWNlICA9IHBhcnNlci0+ZmFjZTsKKworICAgIHN3aXRjaCAoIHRvcFswXS5raW5kMiApCisgICAgeworICAgICAgY2FzZSBpbW1fRm9udE5hbWU6CisgICAgICAgIC8qIGluIHNvbWUgY2FzZXMsIHRoZSAvRm9udE5hbWUgaXMgYW4gaW1tZWRpYXRlIGxpa2UgICovCisgICAgICAgIC8qIC9UaW1lc05ld1JvbWFuLiBJbiB0aGlzIGNhc2UsIHdlIHNpbXBseSBjb3B5IHRoZSAgICovCisgICAgICAgIC8qIHRva2VuIHN0cmluZyAod2l0aG91dCB0aGUgLykuLiAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgIGlmICh0b3BbMV0ua2luZCA9PSB0b2tfaW1tZWRpYXRlKQorICAgICAgICB7CisgICAgICAgICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBwYXJzZXItPnRva2VuaXplci0+bWVtb3J5OworICAgICAgICAgIFQxX0Vycm9yICAgZXJyb3I7CisgICAgICAgICAgVDFfSW50ICAgICBsZW4gPSB0b3BbMV0ubGVuOworCisgICAgICAgICAgaWYgKCBBTExPQyggZmFjZS0+Zm9udF9uYW1lLCBsZW4rMSApICkKKyAgICAgICAgICB7CisgICAgICAgICAgICBwYXJzZXItPmVycm9yID0gZXJyb3I7CisgICAgICAgICAgICByZXR1cm4gZXJyb3I7CisgICAgICAgICAgfQorCisgICAgICAgICAgTUVNX0NvcHkoIGZhY2UtPmZvbnRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgcGFyc2VyLT50b2tlbml6ZXItPmJhc2UgKyB0b3BbMV0uc3RhcnQsCisgICAgICAgICAgICAgICAgICAgIGxlbiApOworICAgICAgICAgIGZhY2UtPmZvbnRfbmFtZVtsZW5dID0gJ1wwJzsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgZmFjZS0+Zm9udF9uYW1lID0gQ29weVN0cmluZyggcGFyc2VyICk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIGltbV9FbmNvZGluZzoKKyAgICAgICAgUGFyc2VfRW5jb2RpbmcoIHBhcnNlciApOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBpbW1fUGFpbnRUeXBlOgorICAgICAgICBmYWNlLT5wYWludF90eXBlID0gKFQxX0J5dGUpQ29weUludGVnZXIoIHBhcnNlciApOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBpbW1fRm9udFR5cGU6CisgICAgICAgIGZhY2UtPmZvbnRfdHlwZSA9IChUMV9CeXRlKUNvcHlJbnRlZ2VyKCBwYXJzZXIgKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgaW1tX0ZvbnRNYXRyaXg6CisgICAgICAgIENvcHlNYXRyaXgoIHBhcnNlciwgJmZhY2UtPmZvbnRfbWF0cml4ICk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIGltbV9Gb250QkJveDoKKyAgICAgICAgQ29weUJCb3goIHBhcnNlciwgJmZhY2UtPmZvbnRfYmJveCApOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBpbW1fVW5pcXVlSUQ6CisgICAgICAgIGZhY2UtPnVuaXF1ZV9pZCA9IENvcHlJbnRlZ2VyKCBwYXJzZXIgKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgaW1tX1N0cm9rZVdpZHRoOgorICAgICAgICBmYWNlLT5zdHJva2Vfd2lkdGggPSBDb3B5SW50ZWdlciggcGFyc2VyICk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIGltbV9Gb250SUQ6CisgICAgICAgIGZhY2UtPmZvbnRfaWQgPSBDb3B5SW50ZWdlciggcGFyc2VyICk7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICAvKiBpZ25vcmUgYWxsIG90aGVyIHRoaW5ncyAqLworICAgICAgICBwYXJzZXItPmVycm9yID0gVDFfRXJyX09rOworICAgIH0KKyAgICByZXR1cm4gcGFyc2VyLT5lcnJvcjsKKyAgfQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPEZ1bmN0aW9uPiBEb19EZWZfRm9udEluZm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBhICdkZWYnIHdoZW4gaW4gdGhlIEZvbnRJbmZvIGRpY3Rpb25hcnkgICAgICAqLworLyogICAgSXRzIHB1cnBvc2UgaXMgdG8gYnVpbGQgdGhlIFQxX0ZvbnRJbmZvIHN0cnVjdHVyZSBkaXJlY3RseSBmcm9tICAgICAqLworLyogICAgdGhlIHN0cmVhbS4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgcGFyc2VyIDo6IGhhbmRsZSB0byBjdXJyZW50IHBhcnNlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRXJyb3IgY29kZS4gMCBtZWFucyBzdWNjZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBzdGF0aWMKKyAgVDFfRXJyb3IgIERvX0RlZl9Gb250SW5mbyggVDFfUGFyc2VyKiAgcGFyc2VyICkKKyAgeworICAgIFQxX1Rva2VuKiAgICAgdG9wICAgPSBwYXJzZXItPnRvcDsKKyAgICBUMV9Gb250SW5mbyogIGluZm8gID0gJnBhcnNlci0+ZmFjZS0+Zm9udF9pbmZvOworCisgICAgc3dpdGNoICggdG9wWzBdLmtpbmQyICkKKyAgICB7CisgICAgICBjYXNlIGltbV92ZXJzaW9uOgorICAgICAgICBpbmZvLT52ZXJzaW9uID0gQ29weVN0cmluZyggcGFyc2VyICk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIGltbV9Ob3RpY2U6CisgICAgICAgIGluZm8tPm5vdGljZSA9IENvcHlTdHJpbmcoIHBhcnNlciApOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBpbW1fRnVsbE5hbWU6CisgICAgICAgIGluZm8tPmZ1bGxfbmFtZSA9IENvcHlTdHJpbmcoIHBhcnNlciApOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBpbW1fRmFtaWx5TmFtZToKKyAgICAgICAgaW5mby0+ZmFtaWx5X25hbWUgPSBDb3B5U3RyaW5nKCBwYXJzZXIgKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgaW1tX1dlaWdodDoKKyAgICAgICAgaW5mby0+d2VpZ2h0ID0gQ29weVN0cmluZyggcGFyc2VyICk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIGltbV9JdGFsaWNBbmdsZToKKyAgICAgICAgaW5mby0+aXRhbGljX2FuZ2xlID0gQ29weUludGVnZXIoIHBhcnNlciApOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBpbW1faXNGaXhlZFBpdGNoOgorICAgICAgICBpbmZvLT5pc19maXhlZF9waXRjaCA9IENvcHlCb29sZWFuKCBwYXJzZXIgKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgaW1tX1VuZGVybGluZVBvc2l0aW9uOgorICAgICAgICBpbmZvLT51bmRlcmxpbmVfcG9zaXRpb24gPSAoVDFfU2hvcnQpQ29weUludGVnZXIoIHBhcnNlciApOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBpbW1fVW5kZXJsaW5lVGhpY2tuZXNzOgorICAgICAgICBpbmZvLT51bmRlcmxpbmVfdGhpY2tuZXNzID0gKFQxX1Nob3J0KUNvcHlJbnRlZ2VyKCBwYXJzZXIgKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIC8qIGlnbm9yZSBhbGwgb3RoZXIgdGhpbmdzICovCisgICAgICAgIHBhcnNlci0+ZXJyb3IgPSBUMV9FcnJfT2s7CisgICAgfQorICAgIHJldHVybiBwYXJzZXItPmVycm9yOworICB9CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA8RnVuY3Rpb24+IERvX0RlZl9Qcml2YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGEgJ2RlZicgd2hlbiBpbiB0aGUgUHJpdmF0ZSBkaWN0aW9uYXJ5ICAgICAgICovCisvKiAgICBJdHMgcHVycG9zZSBpcyB0byBidWlsZCB0aGUgVDFfUHJpdmF0ZSBzdHJ1Y3R1cmUgZGlyZWN0bHkgZnJvbSAgICAgICovCisvKiAgICB0aGUgc3RyZWFtLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBwYXJzZXIgOjogaGFuZGxlIHRvIGN1cnJlbnQgcGFyc2VyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBFcnJvciBjb2RlLiAwIG1lYW5zIHN1Y2Nlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0YXRpYworICBUMV9FcnJvciAgRG9fRGVmX1ByaXZhdGUoIFQxX1BhcnNlciogIHBhcnNlciApCisgIHsKKyAgICBUMV9Ub2tlbiogICAgIHRvcCAgID0gcGFyc2VyLT50b3A7CisgICAgVDFfUHJpdmF0ZSogICBwcml2ICA9ICZwYXJzZXItPmZhY2UtPnByaXZhdGVfZGljdDsKKworICAgIHN3aXRjaCAoIHRvcFswXS5raW5kMiApCisgICAgeworICAgICAgY2FzZSBpbW1fUkQ6IGNhc2UgaW1tX1JEX2FsdGVybmF0ZTogICAgLyogSWdub3JlIHRoZSBkZWZpbml0aW9ucyAgKi8KKyAgICAgIGNhc2UgaW1tX05EOiBjYXNlIGltbV9ORF9hbHRlcm5hdGU6ICAgIC8qIG9mIFJELCBOUCwgTkQgYW5kIHRoZWlyICovCisgICAgICBjYXNlIGltbV9OUDogY2FzZSBpbW1fTlBfYWx0ZXJuYXRlOiAgICAvKiBhbHRlcm5hdGUgZm9ybXMgLi4uICAgICAqLworICAgICAgICBwYXJzZXItPmVycm9yID0gVDFfRXJyX09rOworICAgICAgICBicmVhazsKKworCisgICAgICBjYXNlIGltbV9CbHVlVmFsdWVzOgorICAgICAgICBDb3B5QXJyYXkoIHBhcnNlciwgJnByaXYtPm51bV9ibHVlcywKKyAgICAgICAgICAgICAgICAgICBwcml2LT5ibHVlX3ZhbHVlcywgMTQgKTsKKyAgICAgICAgYnJlYWs7CisKKworICAgICAgY2FzZSBpbW1fT3RoZXJCbHVlczoKKyAgICAgICAgQ29weUFycmF5KCBwYXJzZXIsICZwcml2LT5udW1fb3RoZXJfYmx1ZXMsCisgICAgICAgICAgICAgICAgICAgcHJpdi0+b3RoZXJfYmx1ZXMsIDEwICk7CisgICAgICAgIGJyZWFrOworCisKKyAgICAgIGNhc2UgaW1tX0ZhbWlseUJsdWVzOgorICAgICAgICBDb3B5QXJyYXkoIHBhcnNlciwgJnByaXYtPm51bV9mYW1pbHlfYmx1ZXMsCisgICAgICAgICAgICAgICAgICAgcHJpdi0+ZmFtaWx5X2JsdWVzLCAxNCApOworICAgICAgICBicmVhazsKKworCisgICAgICBjYXNlIGltbV9GYW1pbHlPdGhlckJsdWVzOgorICAgICAgICBDb3B5QXJyYXkoIHBhcnNlciwgJnByaXYtPm51bV9mYW1pbHlfb3RoZXJfYmx1ZXMsCisgICAgICAgICAgICAgICAgICAgcHJpdi0+ZmFtaWx5X290aGVyX2JsdWVzLCAxMCApOworICAgICAgICBicmVhazsKKworCisgICAgICBjYXNlIGltbV9CbHVlU2NhbGU6CisgICAgICAgIHByaXYtPmJsdWVfc2NhbGUgPSBDb3B5RmxvYXQoIHBhcnNlciwgMHgxMDAwMCApOworICAgICAgICBicmVhazsKKworCisgICAgICBjYXNlIGltbV9CbHVlU2hpZnQ6CisgICAgICAgIHByaXYtPmJsdWVfc2hpZnQgPSBDb3B5SW50ZWdlciggcGFyc2VyICk7CisgICAgICAgIGJyZWFrOworCisKKyAgICAgIGNhc2UgaW1tX0JsdWVGdXp6OgorICAgICAgICBwcml2LT5ibHVlX2Z1enogPSBDb3B5SW50ZWdlciggcGFyc2VyICk7CisgICAgICAgIGJyZWFrOworCisKKyAgICAgIGNhc2UgaW1tX1N0ZEhXOgorICAgICAgICBDb3B5QXJyYXkoIHBhcnNlciwgMCwgKFQxX1Nob3J0KikmcHJpdi0+c3RhbmRhcmRfd2lkdGgsIDEgKTsKKyAgICAgICAgYnJlYWs7CisKKworICAgICAgY2FzZSBpbW1fU3RkVlc6CisgICAgICAgIENvcHlBcnJheSggcGFyc2VyLCAwLCAoVDFfU2hvcnQqKSZwcml2LT5zdGFuZGFyZF9oZWlnaHQsIDEgKTsKKyAgICAgICAgYnJlYWs7CisKKworICAgICAgY2FzZSBpbW1fU3RlbVNuYXBIOgorICAgICAgICBDb3B5QXJyYXkoIHBhcnNlciwgJnByaXYtPm51bV9zbmFwX3dpZHRocywKKyAgICAgICAgICAgICAgICAgICBwcml2LT5zdGVtX3NuYXBfd2lkdGhzLCAxMiApOworICAgICAgICBicmVhazsKKworCisgICAgICBjYXNlIGltbV9TdGVtU25hcFY6CisgICAgICAgIENvcHlBcnJheSggcGFyc2VyLCAmcHJpdi0+bnVtX3NuYXBfaGVpZ2h0cywKKyAgICAgICAgICAgICAgICAgICBwcml2LT5zdGVtX3NuYXBfaGVpZ2h0cywgMTIgKTsKKyAgICAgICAgYnJlYWs7CisKKworICAgICAgY2FzZSBpbW1fRm9yY2VCb2xkOgorICAgICAgICBwcml2LT5mb3JjZV9ib2xkID0gQ29weUJvb2xlYW4oIHBhcnNlciApOworICAgICAgICBicmVhazsKKworCisgICAgICBjYXNlIGltbV9MYW5ndWFnZUdyb3VwOgorICAgICAgICBwcml2LT5sYW5ndWFnZV9ncm91cCA9IENvcHlJbnRlZ2VyKCBwYXJzZXIgKTsKKyAgICAgICAgYnJlYWs7CisKKworICAgICAgY2FzZSBpbW1fcGFzc3dvcmQ6CisgICAgICAgIHByaXYtPnBhc3N3b3JkID0gQ29weUludGVnZXIoIHBhcnNlciApOworICAgICAgICBicmVhazsKKworCisgICAgICBjYXNlIGltbV9VbmlxdWVJRDoKKyAgICAgICAgcHJpdi0+dW5pcXVlX2lkID0gQ29weUludGVnZXIoIHBhcnNlciApOworICAgICAgICBicmVhazsKKworCisgICAgICBjYXNlIGltbV9sZW5JVjoKKyAgICAgICAgcHJpdi0+bGVuSVYgPSBDb3B5SW50ZWdlciggcGFyc2VyICk7CisgICAgICAgIGJyZWFrOworCisKKyAgICAgIGNhc2UgaW1tX01pbkZlYXR1cmU6CisgICAgICAgIENvcHlBcnJheSggcGFyc2VyLCAwLCBwcml2LT5taW5fZmVhdHVyZSwgMiApOworICAgICAgICBicmVhazsKKworCisgICAgICBkZWZhdWx0OgorICAgICAgICAvKiBpZ25vcmUgYWxsIG90aGVyIHRoaW5ncyAqLworICAgICAgICBwYXJzZXItPmVycm9yID0gVDFfRXJyX09rOworICAgIH0KKyAgICByZXR1cm4gcGFyc2VyLT5lcnJvcjsKKyAgfQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPEZ1bmN0aW9uPiBEb19EZWZfRXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgc2ltcGxlIHN5bnRheCBlcnJvciB3aGVuIGludm9rZWQuIEl0IGlzICAgICAqLworLyogICAgdWVkIGZvciB0aGUgImRlZiIga2V5d29yZCB3aGVuIGluIHRoZSAiZW5jb2RpbmciLCAic3VicnMiLCAgICAgICAgICAqLworLyogICAgIm90aGVyc3VicnMiIGFuZCAiY2hhcnN0cmluZ3MiIGRpY3Rpb25hcnkgc3RhdGVzLi4gICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgcGFyc2VyIDo6IGhhbmRsZSB0byBjdXJyZW50IHBhcnNlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRXJyb3IgY29kZS4gMCBtZWFucyBzdWNjZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBzdGF0aWMKKyAgVDFfRXJyb3IgIERvX0RlZl9FcnJvciggVDFfUGFyc2VyKiAgcGFyc2VyICkKKyAgeworICAgIEZUX0VSUk9SKCggIlQxLkxvYWQgOiAnZGVmJyBrZXl3b3JkIGVuY291bnRlcmVkIGluIGJhZCBkaWN0aW9uYXJ5L2FycmF5XG4iICkpOworICAgIHBhcnNlci0+ZXJyb3IgPSBUMV9FcnJfU3ludGF4X0Vycm9yOworICAgIHJldHVybiBwYXJzZXItPmVycm9yOworICB9CisKKworICBzdGF0aWMKKyAgVDFfRXJyb3IgIERvX0RlZl9JZ25vcmUoIFQxX1BhcnNlciogIHBhcnNlciApCisgIHsKKyAgICAodm9pZClwYXJzZXI7CisgICAgcmV0dXJuIFQxX0Vycl9PazsKKyAgfQorCisgIHN0YXRpYworICBUMV9QYXJzZV9GdW5jICAgZGVmX2Z1bmNzWyBkaWN0X21heCBdID0KKyAgeworICAgIERvX0RlZl9FcnJvciwKKyAgICBEb19EZWZfRm9udCwKKyAgICBEb19EZWZfRm9udEluZm8sCisgICAgRG9fRGVmX0lnbm9yZSwKKyAgICBEb19EZWZfUHJpdmF0ZSwKKyAgICBEb19EZWZfSWdub3JlLAorICAgIERvX0RlZl9JZ25vcmUsCisgICAgRG9fRGVmX0lnbm9yZSwKKyAgICBEb19EZWZfSWdub3JlLAorICAgIERvX0RlZl9JZ25vcmUsCisgICAgRG9fRGVmX0lnbm9yZSwKKyAgfTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICBJTVBMRU1FTlRBVElPTiBPRiBUSEUgIlBVVCIgS0VZV09SRCBERVBFTkRJTkcgT04gICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgIENVUlJFTlQgRElDVElPTkFSWSBTVEFURSAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPEZ1bmN0aW9uPiBEb19QdXRfRW5jb2RpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBhICdwdXQnIHdoZW4gaW4gdGhlIEVuY29kaW5nIGFycmF5ICAgICAgICAgICAqLworLyogICAgVGhlIGdseXBoIG5hbWUgaXMgY29waWVkIGludG8gdGhlIFQxIHJlY29yZGVyLCBhbmQgdGhlIGNoYXJjb2RlICAgICAqLworLyogICAgYW5kIGdseXBoIG5hbWUgcG9pbnRlciBhcmUgd3JpdHRlbiBpbnRvIHRoZSBmYWNlIG9iamVjdCBlbmNvZGluZyAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgcGFyc2VyIDo6IGhhbmRsZSB0byBjdXJyZW50IHBhcnNlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRXJyb3IgY29kZS4gMCBtZWFucyBzdWNjZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBzdGF0aWMKKyAgVDFfRXJyb3IgIERvX1B1dF9FbmNvZGluZyggVDFfUGFyc2VyKiAgcGFyc2VyICkKKyAgeworICAgIFQxX0Vycm9yICAgICAgZXJyb3IgID0gVDFfRXJyX09rOworICAgIFQxX0ZhY2UgICAgICAgZmFjZSAgID0gcGFyc2VyLT5mYWNlOworICAgIFQxX1Rva2VuKiAgICAgdG9wICAgID0gcGFyc2VyLT50b3A7CisgICAgVDFfRW5jb2RpbmcqICBlbmNvZGUgPSAmZmFjZS0+ZW5jb2Rpbmc7CisgICAgVDFfSW50ICAgICAgICBpbmRleDsKKworICAgIC8qIHJlY29yZCBhbmQgY2hlY2sgdGhlIGNoYXJhY3RlciBjb2RlICovCisgICAgaWYgKCB0b3BbMF0ua2luZCAhPSB0b2tfbnVtYmVyICkKKyAgICB7CisgICAgICBGVF9UUkFDRTQoKCAiVDEuUGFyc2UucHV0OiBudW1iZXIgZXhwZWN0ZWRcbiIgKSk7CisgICAgICBnb3RvIFN5bnRheF9FcnJvcjsKKyAgICB9CisgICAgaW5kZXggPSAoVDFfSW50KUNvcHlJbnRlZ2VyKCBwYXJzZXIgKTsKKyAgICBpZiAocGFyc2VyLT5lcnJvcikgcmV0dXJuIHBhcnNlci0+ZXJyb3I7CisKKyAgICBpZiAoIGluZGV4IDwgMCB8fCBpbmRleCA+PSBlbmNvZGUtPm51bV9jaGFycyApCisgICAgeworICAgICAgRlRfVFJBQ0U0KCggIlQxLlBhcnNlLnB1dDogaW52YWxpZCBjaGFyYWN0ZXIgY29kZVxuIiApKTsKKyAgICAgIGdvdG8gU3ludGF4X0Vycm9yOworICAgIH0KKworICAgIC8qIHJlY29yZCB0aGUgaW1tZWRpYXRlIG5hbWUgKi8KKyAgICBpZiAoIHRvcFsxXS5raW5kICE9IHRva19pbW1lZGlhdGUgKQorICAgIHsKKyAgICAgIEZUX1RSQUNFNCgoICJUMS5QYXJzZS5wdXQ6IGltbWVkaWF0ZSBuYW1lIGV4cGVjdGVkXG4iICkpOworICAgICAgZ290byBTeW50YXhfRXJyb3I7CisgICAgfQorCisgICAgLyogaWYgdGhlIGdseXBoIG5hbWUgaXMgJy5ub3RkZWYnLCBzdG9yZSBhIE5VTEwgY2hhciBuYW1lICovCisgICAgLyogb3RoZXJ3aXNlLCByZWNvcmQgdGhlIGdseXBoIG5hbWUuLiAgICAgICAgICAgICAgICAgICAgICovCisgICAgaWYgKCB0b3BbMV0ua2luZCA9PSBpbW1fbm90ZGVmICkKKyAgICB7CisgICAgICBwYXJzZXItPnRhYmxlLmVsZW1lbnRzWyBpbmRleCBdID0gMDsKKyAgICAgIHBhcnNlci0+dGFibGUubGVuZ3RocyBbIGluZGV4IF0gPSAwOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgVDFfU3RyaW5nICB0ZW1wX25hbWVbMTI4XTsKKyAgICAgIFQxX1Rva2VuKiAgdG9rZW4gPSB0b3ArMTsKKyAgICAgIFQxX0ludCAgICAgbGVuICAgPSB0b2tlbi0+bGVuLTE7CisKKyAgICAgIC8qIGNvcHkgaW1tZWRpYXRlIG5hbWUgKi8KKyAgICAgIGlmIChsZW4gPiAxMjcpIGxlbiA9IDEyNzsKKyAgICAgIE1FTV9Db3B5KCB0ZW1wX25hbWUsIHBhcnNlci0+dG9rZW5pemVyLT5iYXNlICsgdG9rZW4tPnN0YXJ0KzEsIGxlbiApOworICAgICAgdGVtcF9uYW1lW2xlbl0gPSAnXDAnOworCisgICAgICBlcnJvciA9IFQxX0FkZF9UYWJsZSggJnBhcnNlci0+dGFibGUsIGluZGV4LCAoVDFfQnl0ZSopdGVtcF9uYW1lLCBsZW4rMSApOworCisJICAvKiBhZGp1c3QgY29kZV9maXJzdCBhbmQgY29kZV9sYXN0ICovCisJICBpZiAoIGluZGV4IDwgZW5jb2RlLT5jb2RlX2ZpcnN0ICkgIGVuY29kZS0+Y29kZV9maXJzdCA9IGluZGV4OworCSAgaWYgKCBpbmRleCA+IGVuY29kZS0+Y29kZV9sYXN0ICApICBlbmNvZGUtPmNvZGVfbGFzdCAgPSBpbmRleDsKKyAgICB9CisgICAgcmV0dXJuIGVycm9yOworCisgIFN5bnRheF9FcnJvcjoKKyAgICAvKiBpZ25vcmUgdGhlIGVycm9yLCBhbmQgc2ltcGx5IGNsZWFyIHRoZSBzdGFjayAqLworICAgIEZUX1RSQUNFNCgoICJUMS5QdXQuRW5jb2Rpbmc6IGludmFsaWQgc3ludGF4IGVuY291bnRlcmVkXG4iICkpOworICAgIHBhcnNlci0+dG9wID0gcGFyc2VyLT5zdGFjazsKKyAgICByZXR1cm4gVDFfRXJyX09rOworICB9CisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgIElNUExFTUVOVEFUSU9OIE9GIFRIRSAiUkQiIEtFWVdPUkQgREVQRU5ESU5HIE9OICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgQ1VSUkVOVCBESUNUSU9OQVJZIFNUQVRFICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA8RnVuY3Rpb24+IERvX1JEX1N1YnJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGEgJ1JEJyB3aGVuIGluIHRoZSBTdWJycyBkaWN0aW9uYXJ5ICAgICAgICAgICovCisvKiAgICBJdCBzaW1wbHkgcmVjb3JkcyB0aGUgYXJyYXkgb2YgYnl0ZWNvZGVzL2NoYXJzdHJpbmdzIGNvcnJlc3BvbmRpbmcgICovCisvKiAgICB0byB0aGUgc3ViLXJvdXRpbmUuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBwYXJzZXIgOjogaGFuZGxlIHRvIGN1cnJlbnQgcGFyc2VyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBFcnJvciBjb2RlLiAwIG1lYW5zIHN1Y2Nlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0YXRpYworICBUMV9FcnJvciAgRG9fUkRfU3VicnMoIFQxX1BhcnNlciogIHBhcnNlciApCisgIHsKKyAgICBUMV9FcnJvciAgICAgIGVycm9yICA9IFQxX0Vycl9PazsKKyAgICBUMV9GYWNlICAgICAgIGZhY2UgICA9IHBhcnNlci0+ZmFjZTsKKyAgICBUMV9Ub2tlbiogICAgIHRvcCAgICA9IHBhcnNlci0+dG9wOworICAgIFQxX1Rva2VuaXplciAgdG9remVyID0gcGFyc2VyLT50b2tlbml6ZXI7CisgICAgVDFfSW50ICAgICAgICBpbmRleCwgY291bnQ7CisKKyAgICAvKiByZWNvcmQgYW5kIGNoZWNrIHRoZSBjaGFyYWN0ZXIgY29kZSAqLworICAgIGlmICggdG9wWzBdLmtpbmQgIT0gdG9rX251bWJlciB8fAorICAgICAgICAgdG9wWzFdLmtpbmQgIT0gdG9rX251bWJlciApCisgICAgeworICAgICAgRlRfRVJST1IoKCAiVDEuUGFyc2UucHV0OiBudW1iZXIgZXhwZWN0ZWRcbiIgKSk7CisgICAgICBnb3RvIFN5bnRheF9FcnJvcjsKKyAgICB9CisgICAgaW5kZXggPSAoVDFfSW50KUNvcHlJbnRlZ2VyKCBwYXJzZXIgKTsKKyAgICBlcnJvciA9IHBhcnNlci0+ZXJyb3I7IGlmIChlcnJvcikgZ290byBFeGl0OworCisgICAgY291bnQgPSAoVDFfSW50KUNvcHlJbnRlZ2VyKCBwYXJzZXIgKTsKKyAgICBlcnJvciA9IHBhcnNlci0+ZXJyb3I7IGlmIChlcnJvcikgZ290byBFeGl0OworCisgICAgaWYgKCBpbmRleCA8IDAgfHwgaW5kZXggPj0gZmFjZS0+bnVtX3N1YnJzICkKKyAgICB7CisgICAgICBGVF9FUlJPUigoICJUMS5QYXJzZS5wdXQ6IGludmFsaWQgY2hhcmFjdGVyIGNvZGVcbiIgKSk7CisgICAgICBnb3RvIFN5bnRheF9FcnJvcjsKKyAgICB9CisKKyAgICAvKiBkZWNyeXB0IGNoYXJzdHJpbmcgYW5kIHNraXAgdGhlbSAqLworICAgIHsKKyAgICAgIFQxX0J5dGUqICBiYXNlID0gdG9remVyLT5iYXNlICsgdG9remVyLT5jdXJzb3I7CisKKyAgICAgIHQxX2RlY3J5cHQoIGJhc2UsIGNvdW50LCA0MzMwICk7CisgICAgICB0b2t6ZXItPmN1cnNvciArPSBjb3VudDsKKworICAgICAgYmFzZSAgKz0gZmFjZS0+cHJpdmF0ZV9kaWN0LmxlbklWOworICAgICAgY291bnQgLT0gZmFjZS0+cHJpdmF0ZV9kaWN0LmxlbklWOworCisgICAgICBlcnJvciA9IFQxX0FkZF9UYWJsZSggJnBhcnNlci0+dGFibGUsIGluZGV4LCBiYXNlLCBjb3VudCApOworICAgIH0KKworICAgIC8qIGNvbnN1bWUgdGhlIGNsb3NpbmcgTlAgb3IgJ3B1dCcgKi8KKyAgICBlcnJvciA9IEV4cGVjdF9LZXl3b3JkMiggcGFyc2VyLCBrZXlfTlAsIGtleV9wdXQgKTsKKworICBFeGl0OgorICAgIHJldHVybiBlcnJvcjsKKworICBTeW50YXhfRXJyb3I6CisgICAgcmV0dXJuIFQxX0Vycl9TeW50YXhfRXJyb3I7CisgIH0KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA8RnVuY3Rpb24+IERvX1JEX0NoYXJTdHJpbmdzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGEgJ1JEJyB3aGVuIGluIHRoZSBDaGFyU3RyaW5ncyBkaWN0aW9uYXJ5ICAgICovCisvKiAgICBJdCBzaW1wbHkgcmVjb3JkcyB0aGUgYXJyYXkgb2YgYnl0ZWNvZGVzL2NoYXJzdHJpbmdzIGNvcnJlc3BvbmRpbmcgICovCisvKiAgICB0byB0aGUgZ2x5cGggcHJvZ3JhbSBzdHJpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBwYXJzZXIgOjogaGFuZGxlIHRvIGN1cnJlbnQgcGFyc2VyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBFcnJvciBjb2RlLiAwIG1lYW5zIHN1Y2Nlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0YXRpYworICBUMV9FcnJvciAgRG9fUkRfQ2hhcnN0cmluZ3MoIFQxX1BhcnNlciogIHBhcnNlciApCisgIHsKKyAgICBUMV9FcnJvciAgICAgIGVycm9yID0gVDFfRXJyX09rOworICAgIFQxX0ZhY2UgICAgICAgZmFjZSAgPSBwYXJzZXItPmZhY2U7CisgICAgVDFfVG9rZW4qICAgICB0b3AgICA9IHBhcnNlci0+dG9wOworICAgIFQxX1Rva2VuaXplciAgdG9remVyID0gcGFyc2VyLT50b2tlbml6ZXI7CisgICAgVDFfSW50ICAgICAgICBpbmRleCwgY291bnQ7CisKKyAgICAvKiBjaGVjayB0aGUgY2hhcmFjdGVyIG5hbWUgYXJndW1lbnQgKi8KKyAgICBpZiAoIHRvcFswXS5raW5kICE9IHRva19pbW1lZGlhdGUgKQorICAgIHsKKyAgICAgIEZUX0VSUk9SKCggIlQxLlBhcnNlLlJEOiBpbW1lZGlhdGUgY2hhcmFjdGVyIG5hbWUgZXhwZWN0ZWRcbiIgKSk7CisgICAgICBnb3RvIFN5bnRheF9FcnJvcjsKKyAgICB9CisKKyAgICAvKiBjaGVjayB0aGUgY291bnQgYXJndW1lbnQgKi8KKyAgICBpZiAoIHRvcFsxXS5raW5kICE9IHRva19udW1iZXIgKQorICAgIHsKKyAgICAgIEZUX0VSUk9SKCggIlQxLlBhcnNlLnB1dDogbnVtYmVyIGV4cGVjdGVkXG4iICkpOworICAgICAgZ290byBTeW50YXhfRXJyb3I7CisgICAgfQorCXBhcnNlci0+YXJncysrOworICAgIGNvdW50ID0gKFQxX0ludClDb3B5SW50ZWdlciggcGFyc2VyICk7CisgICAgZXJyb3IgPSBwYXJzZXItPmVycm9yOyBpZiAoZXJyb3IpIGdvdG8gRXhpdDsKKworICAgIC8qIHJlY29yZCB0aGUgZ2x5cGggbmFtZSBhbmQgZ2V0IHRoZSBjb3JyZXNwb25kaW5nIGdseXBoIGluZGV4ICovCisgICAgaWYgKCB0b3BbMF0ua2luZDIgPT0gaW1tX25vdGRlZiApCisgICAgICBpbmRleCA9IDA7CisgICAgZWxzZQorICAgIHsKKyAgICAgIFQxX1N0cmluZyAgdGVtcF9uYW1lWzEyOF07CisgICAgICBUMV9Ub2tlbiogIHRva2VuID0gdG9wOworICAgICAgVDFfSW50ICAgICBsZW4gICA9IHRva2VuLT5sZW4tMTsKKworICAgICAgLyogY29weSBpbW1lZGlhdGUgbmFtZSAqLworICAgICAgaWYgKGxlbiA+IDEyNykgbGVuID0gMTI3OworICAgICAgTUVNX0NvcHkoIHRlbXBfbmFtZSwgcGFyc2VyLT50b2tlbml6ZXItPmJhc2UgKyB0b2tlbi0+c3RhcnQrMSwgbGVuICk7CisgICAgICB0ZW1wX25hbWVbbGVuXSA9ICdcMCc7CisKKyAgICAgIGluZGV4ID0gcGFyc2VyLT5jdXJfbmFtZSsrOworICAgICAgZXJyb3IgPSBUMV9BZGRfVGFibGUoICZwYXJzZXItPnRhYmxlLCBpbmRleCoyLCAoVDFfQnl0ZSopdGVtcF9uYW1lLCBsZW4rMSApOworICAgICAgaWYgKGVycm9yKSBnb3RvIEV4aXQ7CisgICAgfQorCisgICAgLyogZGVjcnlwdCBhbmQgcmVjb3JkIGNoYXJzdHJpbmcsIHRoZW4gc2tpcCB0aGVtICovCisgICAgeworICAgICAgVDFfQnl0ZSogIGJhc2UgPSB0b2t6ZXItPmJhc2UgKyB0b2t6ZXItPmN1cnNvcjsKKworICAgICAgdDFfZGVjcnlwdCggYmFzZSwgY291bnQsIDQzMzAgKTsKKyAgICAgIHRva3plci0+Y3Vyc29yICs9IGNvdW50OyAgLyogc2tpcCAqLworCisgICAgICBiYXNlICArPSBmYWNlLT5wcml2YXRlX2RpY3QubGVuSVY7CisgICAgICBjb3VudCAtPSBmYWNlLT5wcml2YXRlX2RpY3QubGVuSVY7CisKKyAgICAgIGVycm9yID0gVDFfQWRkX1RhYmxlKCAmcGFyc2VyLT50YWJsZSwgaW5kZXgqMisxLCBiYXNlLCBjb3VudCApOworICAgIH0KKworICAgIC8qIGNvbnN1bWUgdGhlIGNsb3NpbmcgTkQgKi8KKyAgICBpZiAoIWVycm9yKQorICAgICAgZXJyb3IgPSBFeHBlY3RfS2V5d29yZCggcGFyc2VyLCBrZXlfTkQgKTsKKworICBFeGl0OgorICAgIHJldHVybiBlcnJvcjsKKworICBTeW50YXhfRXJyb3I6CisgICAgcmV0dXJuIFQxX0Vycl9TeW50YXhfRXJyb3I7CisgIH0KKworCisKKworCisKKyAgc3RhdGljCisgIFQxX0Vycm9yICBFeHBlY3RfRGljdF9Bcmd1bWVudHMoIFQxX1BhcnNlciogICAgcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUMV9JbnQgICAgICAgIG51bV9hcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUMV9Ub2tlblR5cGUgIGltbWVkaWF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVDFfRGljdFN0YXRlICBuZXdfc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQxX0ludCAgICAgICAqY291bnQgKQorICB7CisgICAgLyogY2hlY2sgdGhhdCB3ZSBoYXZlIGVub3VnaCBhcmd1bWVudHMgaW4gdGhlIHN0YWNrLCBpbmNsdWRpbmcgKi8KKyAgICAvKiB0aGUgJ2RpY3QnIGtleXdvcmQuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGlmICggcGFyc2VyLT50b3AgLSBwYXJzZXItPnN0YWNrIDwgbnVtX2FyZ3MgKQorICAgIHsKKyAgICAgIEZUX0VSUk9SKCggIlQxLlBhcnNlLkRpY3QgOiBleHBlY3RpbmcgYXQgbGVhc3QgJWQgYXJndW1lbnRzIiwKKyAgICAgICAgICAgICAgIG51bV9hcmdzICkpOworICAgICAgZ290byBTeW50YXhfRXJyb3I7CisgICAgfQorCisgICAgLyogY2hlY2sgdGhhdCB3ZSBoYXZlIHRoZSBjb3JyZWN0IGltbWVkaWF0ZSwgaWYgbmVlZGVkICovCisgICAgaWYgKCBudW1fYXJncyA9PSAyICkKKyAgICB7CisgICAgICBpZiAoIHBhcnNlci0+dG9wWy0yXS5raW5kICAhPSB0b2tfaW1tZWRpYXRlIHx8CisgICAgICAgICAgIHBhcnNlci0+dG9wWy0yXS5raW5kMiAhPSBpbW1lZGlhdGUgICAgICkKKyAgICAgIHsKKyAgICAgICAgRlRfRVJST1IoKCAiVDEuUGFyc2UuRGljdCA6IGV4cGVjdGluZyAnLyVzJyBkaWN0aW9uYXJ5XG4iLAorICAgICAgICAgICAgICAgICB0MV9pbW1lZGlhdGVzWyBpbW1lZGlhdGUgLSBpbW1fZmlyc3RfIF0gKSk7CisgICAgICAgIGdvdG8gU3ludGF4X0Vycm9yOworICAgICAgfQorICAgIH0KKworCXBhcnNlci0+YXJncyA9IHBhcnNlci0+dG9wLTE7CisKKyAgICAvKiBjaGVjayB0aGF0IHRoZSBjb3VudCBhcmd1bWVudCBpcyBhIG51bWJlciAqLworICAgIGlmICggcGFyc2VyLT5hcmdzLT5raW5kICE9IHRva19udW1iZXIgKQorICAgIHsKKyAgICAgIEZUX0VSUk9SKCggIlQxLlBhcnNlLkRpY3QgOiBleHBlY3RpbmcgbnVtZXJpY2FsIGNvdW50IGFyZ3VtZW50IGZvciAnZGljdCdcbiIgKSk7CisgICAgICBnb3RvIFN5bnRheF9FcnJvcjsKKyAgICB9CisgICAgaWYgKGNvdW50KQorICAgIHsKKyAgICAgICpjb3VudCA9IENvcHlJbnRlZ2VyKCBwYXJzZXIgKTsKKyAgICAgIGlmIChwYXJzZXItPmVycm9yKSByZXR1cm4gcGFyc2VyLT5lcnJvcjsKKyAgICB9CisKKyAgICAvKiBzYXZlIHRoZSBkaWN0aW9uYXJ5IHN0YXRlICovCisgICAgcGFyc2VyLT5zdGF0ZV9zdGFja1sgKytwYXJzZXItPnN0YXRlX2luZGV4IF0gPSBuZXdfc3RhdGU7CisKKyAgICAvKiBjb25zdW1lIHRoZSAnYmVnaW4nIGtleXdvcmQsIGFuZCBjbGVhciB0aGUgc3RhY2sgKi8KKyAgICBwYXJzZXItPnRvcCAtPSBudW1fYXJnczsKKyAgICByZXR1cm4gRXhwZWN0X0tleXdvcmQoIHBhcnNlciwga2V5X2JlZ2luICk7CisKKyAgU3ludGF4X0Vycm9yOgorICAgIHJldHVybiBUMV9FcnJfU3ludGF4X0Vycm9yOworICB9CisKKworCisKKworICBzdGF0aWMKKyAgVDFfRXJyb3IgIEV4cGVjdF9BcnJheV9Bcmd1bWVudHMoIFQxX1BhcnNlciogIHBhcnNlciApCisgIHsKKyAgICBUMV9Ub2tlbiogICAgIHRvcCAgID0gcGFyc2VyLT50b3A7CisgICAgVDFfRXJyb3IgICAgICBlcnJvciA9IFQxX0Vycl9PazsKKyAgICBUMV9EaWN0U3RhdGUgIG5ld19zdGF0ZTsKKyAgICBUMV9JbnQgICAgICAgIGNvdW50OworICAgIFQxX0ZhY2UgICAgICAgZmFjZSAgID0gcGFyc2VyLT5mYWNlOworICAgIEZUX01lbW9yeSAgICAgbWVtb3J5ID0gZmFjZS0+cm9vdC5tZW1vcnk7CisKKyAgICAvKiBDaGVjayBhcmd1bWVudHMgZm9ybWF0ICovCisgICAgaWYgKCB0b3AgLSBwYXJzZXItPnN0YWNrIDwgMiApCisgICAgeworICAgICAgRlRfRVJST1IoKCAiVDEuUGFyc2UuYXJyYXk6IHR3byBhcmd1bWVudHMgZXhwZWN0ZWRcbiIgKSk7CisgICAgICBlcnJvciA9IFQxX0Vycl9TdGFja19VbmRlcmZsb3c7CisgICAgICBnb3RvIEV4aXQ7CisgICAgfQorCisgICAgcGFyc2VyLT50b3AgLT0gMjsKKyAgICB0b3AgICAgICAgICAtPSAyOworCXBhcnNlci0+YXJncyA9IHRvcCArIDE7CisKKyAgICBpZiAoIHRvcFswXS5raW5kICE9IHRva19pbW1lZGlhdGUgKQorICAgIHsKKyAgICAgIEZUX0VSUk9SKCggIlQxLlBhcnNlLmFycmF5OiBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIGFuIGltbWVkaWF0ZSBuYW1lXG4iICkpOworICAgICAgZ290byBTeW50YXhfRXJyb3I7CisgICAgfQorCisgICAgaWYgKCB0b3BbMV0ua2luZCAhPSB0b2tfbnVtYmVyICkKKyAgICB7CisgICAgICBGVF9FUlJPUigoICJUMS5QYXJzZS5hcnJheTogc2Vjb25kIGFyZ3VtZW50IG11c3QgYmUgYSBudW1iZXJcbiIgKSk7CisgICAgICBnb3RvIFN5bnRheF9FcnJvcjsKKyAgICB9CisgICAgY291bnQgPSAoVDFfSW50KUNvcHlJbnRlZ2VyKCBwYXJzZXIgKTsKKworICAgIC8qIElzIHRoaXMgYW4gYXJyYXkgd2Uga25vdyBhYm91dCA/PyAqLworICAgIHN3aXRjaCAoIHRvcFswXS5raW5kMiApCisgICAgeworICAgICAgY2FzZSBpbW1fRW5jb2Rpbmc6CisgICAgICAgIHsKKyAgICAgICAgICBUMV9FbmNvZGluZyogIGVuY29kZSA9ICZmYWNlLT5lbmNvZGluZzsKKworICAgICAgICAgIG5ld19zdGF0ZSA9IGRpY3RfZW5jb2Rpbmc7CisKKyAgICAgICAgICBlbmNvZGUtPmNvZGVfZmlyc3QgPSBjb3VudDsKKyAgICAgICAgICBlbmNvZGUtPmNvZGVfbGFzdCAgPSAwOworICAgICAgICAgIGVuY29kZS0+bnVtX2NoYXJzICA9IGNvdW50OworCisgICAgICAgICAgLyogYWxsb2NhdGUgdGhlIHRhYmxlIG9mIGNoYXJhY3RlciBpbmRleGVzLiBUaGUgdGFibGUgb2YgKi8KKyAgICAgICAgICAvKiBjaGFyYWN0ZXIgbmFtZXMgaXMgYWxsb2NhdGVkIHRocm91Z2ggaW5pdF90MV9yZWNvcmRlciAqLworICAgICAgICAgIGlmICggQUxMT0NfQVJSQVkoIGVuY29kZS0+Y2hhcl9pbmRleCwgY291bnQsIFQxX1Nob3J0ICAgKSApCisgICAgICAgICAgICByZXR1cm4gZXJyb3I7CisKKyAgICAgICAgICBlcnJvciA9IFQxX05ld19UYWJsZSggJnBhcnNlci0+dGFibGUsIGNvdW50LCBtZW1vcnkgKTsKKyAgICAgICAgICBpZiAoZXJyb3IpIGdvdG8gRXhpdDsKKworCQkgIHBhcnNlci0+ZW5jb2RpbmdfdHlwZSA9IGVuY29kaW5nX2FycmF5OworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisKKyAgICAgIGNhc2UgaW1tX1N1YnJzOgorICAgICAgICB7CisgICAgICAgICAgbmV3X3N0YXRlICAgICAgID0gZGljdF9zdWJyczsKKyAgICAgICAgICBmYWNlLT5udW1fc3VicnMgPSBjb3VudDsKKworICAgICAgICAgIGVycm9yID0gVDFfTmV3X1RhYmxlKCAmcGFyc2VyLT50YWJsZSwgY291bnQsIG1lbW9yeSApOworICAgICAgICAgIGlmIChlcnJvcikgZ290byBFeGl0OworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisKKyAgICAgIGNhc2UgaW1tX0NoYXJTdHJpbmdzOgorICAgICAgICBuZXdfc3RhdGUgICAgICAgID0gZGljdF9jaGFyc3RyaW5nczsKKyAgICAgICAgYnJlYWs7CisKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgbmV3X3N0YXRlID0gZGljdF91bmtub3duX2FycmF5OworICAgIH0KKyAgICBwYXJzZXItPnN0YXRlX3N0YWNrWyArK3BhcnNlci0+c3RhdGVfaW5kZXggXSA9IG5ld19zdGF0ZTsKKworICBFeGl0OgorICAgIHJldHVybiBlcnJvcjsKKworICBTeW50YXhfRXJyb3I6CisgICAgcmV0dXJuIFQxX0Vycl9TeW50YXhfRXJyb3I7CisgIH0KKworCisKKworICBzdGF0aWMKKyAgVDFfRXJyb3IgIEZpbmFsaXNlX1BhcnNpbmcoIFQxX1BhcnNlciogIHBhcnNlciApCisgIHsKKyAgICBUMV9GYWNlICAgIGZhY2UgICAgICAgPSBwYXJzZXItPmZhY2U7CisgICAgRlRfTWVtb3J5ICBtZW1vcnkgICAgID0gZmFjZS0+cm9vdC5tZW1vcnk7CisgICAgVDFfVGFibGUqICBzdHJpbmdzICAgID0gJnBhcnNlci0+dGFibGU7CisJVDFfSW50ICAgICBudW1fZ2x5cGhzOworCVQxX0ludCAgICAgbjsKKwlUMV9FcnJvciAgIGVycm9yOworCisgICAgbnVtX2dseXBocyA9IGZhY2UtPm51bV9nbHlwaHMgPSBwYXJzZXItPmN1cl9uYW1lOworCisJLyogYWxsb2NhdGUgZ2x5cGggbmFtZXMgYW5kIGNoYXJzdHJpbmdzIGFycmF5cyAqLworCWlmICggQUxMT0NfQVJSQVkoIGZhY2UtPmdseXBoX25hbWVzICAgICwgbnVtX2dseXBocywgVDFfU3RyaW5nKiApIHx8CisJCSBBTExPQ19BUlJBWSggZmFjZS0+Y2hhcnN0cmluZ3MgICAgLCBudW1fZ2x5cGhzLCBUMV9CeXRlKiApICAgfHwKKwkgICAgIEFMTE9DX0FSUkFZKCBmYWNlLT5jaGFyc3RyaW5nc19sZW4sIG51bV9nbHlwaHMsIFQxX0ludCogICkgICApCisJICByZXR1cm4gZXJyb3I7CisKKwkvKiBjb3B5IGdseXBoIG5hbWVzIGFuZCBjaGFyc3RyaW5ncyBvZmZzZXRzIGFuZCBsZW5ndGhzICovCisgICAgZmFjZS0+Y2hhcnN0cmluZ3NfYmxvY2sgPSBzdHJpbmdzLT5ibG9jazsKKwlmb3IgKCBuID0gMDsgbiA8IG51bV9nbHlwaHM7IG4rKyApCisJeworCSAgZmFjZS0+Z2x5cGhfbmFtZXNbbl0gICAgID0gKFQxX1N0cmluZyopc3RyaW5ncy0+ZWxlbWVudHNbMipuXTsKKwkgIGZhY2UtPmNoYXJzdHJpbmdzW25dICAgICA9IHN0cmluZ3MtPmVsZW1lbnRzWzIqbisxXTsKKwkgIGZhY2UtPmNoYXJzdHJpbmdzX2xlbltuXSA9IHN0cmluZ3MtPmxlbmd0aHMgWzIqbisxXTsKKyAgICB9CisKKwkvKiBub3cgZnJlZSB0aGUgb2xkIHRhYmxlcyAqLworCUZSRUUoIHN0cmluZ3MtPmVsZW1lbnRzICk7CisJRlJFRSggc3RyaW5ncy0+bGVuZ3RocyApOworCisJLyogQ29tcHV0ZSBlbmNvZGluZyBpZiByZXF1aXJlZC4gKi8KKwlpZiAocGFyc2VyLT5lbmNvZGluZ190eXBlID09IGVuY29kaW5nX25vbmUpCisgICAgeworCSAgRlRfRVJST1IoKCAiVDEuUGFyc2UuRmluYWxpc2UgOiBubyBlbmNvZGluZyBzcGVjaWZpZWQgaW4gZm9udCBmaWxlXG4iICkpOworCSAgcmV0dXJuIFQxX0Vycl9TeW50YXhfRXJyb3I7CisgICAgfQorCisJeworCSAgVDFfSW50ICAgICAgICBuOworCSAgVDFfRW5jb2RpbmcqICBlbmNvZGUgPSAmZmFjZS0+ZW5jb2Rpbmc7CisKKwkgIGVuY29kZS0+Y29kZV9maXJzdCA9IGVuY29kZS0+bnVtX2NoYXJzLTE7CisJICBlbmNvZGUtPmNvZGVfbGFzdCAgPSAwOworCisJICBmb3IgKCBuID0gMDsgbiA8IGVuY29kZS0+bnVtX2NoYXJzOyBuKysgKQorCSAgeworCQlUMV9TdHJpbmcqKiBuYW1lczsKKwkJVDFfSW50ICAgICAgaW5kZXg7CisJCVQxX0ludCAgICAgIG07CisKKwkJc3dpdGNoIChwYXJzZXItPmVuY29kaW5nX3R5cGUpCisJCXsKKwkJICBjYXNlIGVuY29kaW5nX3N0YW5kYXJkOgorCQkJICBpbmRleCA9IHQxX3N0YW5kYXJkX2VuY29kaW5nW25dOworCQkJICBuYW1lcyA9IChUMV9TdHJpbmcqKil0MV9zdGFuZGFyZF9zdHJpbmdzOworCQkJICBicmVhazsKKworCQkgIGNhc2UgZW5jb2RpbmdfZXhwZXJ0OgorCQkJICBpbmRleCA9IHQxX2V4cGVydF9lbmNvZGluZ1tuXTsKKwkJCSAgbmFtZXMgPSAoVDFfU3RyaW5nKiopdDFfc3RhbmRhcmRfc3RyaW5nczsKKwkJCSAgYnJlYWs7CisKKwkJICBkZWZhdWx0OgorCQkgICAgICBpbmRleCA9IG47CisJCQkgIG5hbWVzID0gKFQxX1N0cmluZyoqKXBhcnNlci0+ZW5jb2Rpbmdfb2Zmc2V0czsKKwkJfQorCQllbmNvZGUtPmNoYXJfaW5kZXhbbl0gPSAwOworCQlpZiAoaW5kZXgpCisJCXsKKwkJICBUMV9TdHJpbmcqICBuYW1lID0gbmFtZXNbaW5kZXhdOworCisJCSAgaWYgKCBuYW1lICkKKwkJICB7CisgICAgICAgICAgICBUMV9JbnQgIGxlbiA9IHN0cmxlbihuYW1lKTsKKworICAgICAgICAgICAgLyogbG9va3VwIGdseXBoIGluZGV4IGZyb20gbmFtZSAqLworICAgICAgICAgICAgZm9yICggbSA9IDA7IG0gPCBudW1fZ2x5cGhzOyBtKysgKQorICAgCQkgICAgeworCQkgIAkgIGlmICggc3RybmNtcCggZmFjZS0+Z2x5cGhfbmFtZXNbbV0sIG5hbWUsIGxlbiApID09IDAgKQorCQkJICB7CisJCQkgICAgZW5jb2RlLT5jaGFyX2luZGV4W25dID0gbTsKKwkJCSAgICBicmVhazsKKwkJICAgICAgfQorCQkgICAgfQorCisJCSAgICBpZiAoIG4gPCBlbmNvZGUtPmNvZGVfZmlyc3QgKSBlbmNvZGUtPmNvZGVfZmlyc3QgPSBuOworCQkgICAgaWYgKCBuID4gZW5jb2RlLT5jb2RlX2xhc3QgICkgZW5jb2RlLT5jb2RlX2xhc3QgID0gbjsKKwkgICAgICB9CisJICAgIH0KKwkgIH0KKworCSAgcGFyc2VyLT5lbmNvZGluZ190eXBlID0gZW5jb2Rpbmdfbm9uZTsKKwkgIEZSRUUoIHBhcnNlci0+ZW5jb2RpbmdfbmFtZXMgKTsKKwkgIEZSRUUoIHBhcnNlci0+ZW5jb2RpbmdfbGVuZ3RocyApOworCSAgRlJFRSggcGFyc2VyLT5lbmNvZGluZ19vZmZzZXRzICk7CisgICAgfQorCisgICAgcmV0dXJuIFQxX0Vycl9PazsKKyAgfQorCisKKworCisKKyAgTE9DQUxfRlVOQworICBUMV9FcnJvciAgUGFyc2VfVDFfRm9udFByb2dyYW0oIFQxX1BhcnNlciogIHBhcnNlciApCisgIHsKKyAgICBUMV9FcnJvciAgZXJyb3I7CisKKyAgICBmb3IgKDs7KQorICAgIHsKKyAgICAgIFQxX1Rva2VuICAgICAgdG9rZW47CisgICAgICBUMV9Ub2tlbiogICAgIHRvcDsKKyAgICAgIFQxX0RpY3RTdGF0ZSAgZGljdF9zdGF0ZTsKKyAgICAgIFQxX0ludCAgICAgICAgZGljdF9pbmRleDsKKworICAgICAgZXJyb3IgICAgICA9IE5leHRfVDFfVG9rZW4oIHBhcnNlciwgJnRva2VuICk7CisgICAgICB0b3AgICAgICAgID0gcGFyc2VyLT50b3A7CisgICAgICBkaWN0X2luZGV4ID0gcGFyc2VyLT5zdGF0ZV9pbmRleDsKKyAgICAgIGRpY3Rfc3RhdGUgPSBwYXJzZXItPnN0YXRlX3N0YWNrWyBkaWN0X2luZGV4IF07CisKKyAgICAgIHN3aXRjaCAoIHRva2VuLmtpbmQgKQorICAgICAgeworICAgICAgICAvKiBBIGtleXdvcmQgd2FzIGRldGVjdGVkICovCisgICAgICAgIGNhc2UgdG9rX2tleXdvcmQ6CisgICAgICAgICAgc3dpdGNoICh0b2tlbi5raW5kMikKKyAgICAgICAgICB7CisgICAgICAgICAgICBjYXNlIGtleV9kaWN0OgorCisgICAgICAgICAgICAgIHN3aXRjaCAoZGljdF9zdGF0ZSkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgZGljdF9ub25lOgorICAgICAgICAgICAgICAgICAgIC8qIEFsbCByaWdodCwgd2UncmUgYmVnZ2luaW5nIHRoZSBmb250IGRpY3Rpb25hcnkgICAgKi8KKyAgICAgICAgICAgICAgICAgICAvKiBjaGVjayB0aGF0IHdlIG9ubHkgaGF2ZSBvbmUgbnVtYmVyIGFyZ3VtZW50LCB0aGVuICovCisgICAgICAgICAgICAgICAgICAgLyogY29uc3VtZSB0aGUgJ2JlZ2luJyBhbmQgY2hhbmdlIHRvICdkaWN0X2ZvbnQnICAgICAqLworICAgICAgICAgICAgICAgICAgIC8qIHN0YXRlLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICBlcnJvciA9IEV4cGVjdF9EaWN0X0FyZ3VtZW50cyggcGFyc2VyLCAxLCB0b2tfZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpY3RfZm9udCwgMCApOworICAgICAgICAgICAgICAgICAgIGlmIChlcnJvcikgZ290byBFeGl0OworICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgIC8qIGNsZWFyIHN0YWNrIGZyb20gYWxsIHRoZSBwcmV2aW91cyBjb250ZW50LiBUaGlzICAgKi8KKyAgICAgICAgICAgICAgICAgICAvKiBjb3VsZCBiZSBzb21lIHN0dXBpZCBQb3N0c2NyaXB0IGNvZGUgLi4uICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgcGFyc2VyLT50b3AgPSBwYXJzZXItPnN0YWNrOworICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisKKyAgICAgICAgICAgICAgICBjYXNlIGRpY3RfZm9udDoKKyAgICAgICAgICAgICAgICAgICAvKiBUaGlzIG11c3QgYmUgdGhlIC9Gb250SW5mbyBkaWN0aW9uYXJ5LCBzbyBjaGVjayAqLworICAgICAgICAgICAgICAgICAgIC8qIFRoYXQgd2UgaGF2ZSBhdCBsZWFzdCB0d28gYXJndW1lbnRzLCB0aGF0IHRoZXkgICovCisgICAgICAgICAgICAgICAgICAgLyogYXJlICIvRm9udEluZm8iIGFuZCBhIG51bWJlciwgdGhlbiBjaGFuZ2UgdGhlICAgKi8KKyAgICAgICAgICAgICAgICAgICAvKiBkaWN0aW9uYXJ5IHN0YXRlLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgIGVycm9yID0gRXhwZWN0X0RpY3RfQXJndW1lbnRzKCBwYXJzZXIsIDIsIGltbV9Gb250SW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGljdF9mb250aW5mbywgMCApOworICAgICAgICAgICAgICAgICAgIGlmIChlcnJvcikgZ290byBFeGl0OworICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisKKyAgICAgICAgICAgICAgICBjYXNlIGRpY3Rfbm9uZTI6CisgICAgICAgICAgICAgICAgICAgZXJyb3IgPSBFeHBlY3RfRGljdF9Bcmd1bWVudHMoIHBhcnNlciwgMiwgaW1tX1ByaXZhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpY3RfcHJpdmF0ZSwgMCApOworICAgICAgICAgICAgICAgICAgIGlmIChlcnJvcikgZ290byBFeGl0OworICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisKKyAgICAgICAgICAgICAgICBjYXNlIGRpY3RfcHJpdmF0ZToKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgVDFfRmFjZSAgZmFjZSA9IHBhcnNlci0+ZmFjZTsKKyAgICAgICAgICAgICAgICAgICAgVDFfSW50ICAgY291bnQ7CisKKyAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSBFeHBlY3RfRGljdF9Bcmd1bWVudHMoIHBhcnNlciwgMiwgaW1tX0NoYXJTdHJpbmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGljdF9jaGFyc3RyaW5ncywgJmNvdW50ICk7CisgICAgICAgICAgICAgICAgICAgIGlmIChlcnJvcikgZ290byBFeGl0OworCisgICAgICAgICAgICAgICAgICAgIGZhY2UtPm51bV9nbHlwaHMgPSBjb3VudDsKKyAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSBUMV9OZXdfVGFibGUoICZwYXJzZXItPnRhYmxlLCBjb3VudCoyLCBmYWNlLT5yb290Lm1lbW9yeSApOworICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3IpIGdvdG8gRXhpdDsKKworICAgICAgICAgICAgICAgICAgICAvKiByZWNvcmQgJy5ub3RkZWYnIGFzIHRoZSBmaXJzdCBnbHlwaCBpbiB0aGUgZm9udCAqLworICAgICAgICAgICAgICAgICAgICBlcnJvciA9IFQxX0FkZF9UYWJsZSggJnBhcnNlci0+dGFibGUsIDAsIChUMV9CeXRlKikiLm5vdGRlZiIsIDggKTsKKyAgICAgICAgICAgICAgICAgICAgcGFyc2VyLT5jdXJfbmFtZSA9IDE7CisgICAgICAgICAgICAgICAgICAgIC8qIFhYWFhYIDogRE8gU09NRVRISU5HIEhFUkUgKi8KKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAvKiBBbGwgb3RoZXIgdXNlcyBhcmUgaW52YWxpZCAqLworICAgICAgICAgICAgICAgICAgIEZUX0VSUk9SKCggIlQxLlBhcnNlOiBpbnZhbGlkIHVzZSBvZiB0aGUgJ2RpY3QnIGtleXdvcmRcbiIgKSk7CisgICAgICAgICAgICAgICAgICAgZ290byBTeW50YXhfRXJyb3I7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgYnJlYWs7CisKKworICAgICAgICAgICAgY2FzZSBrZXlfYXJyYXk6CisgICAgICAgICAgICAgIC8qIEFyZSB3ZSBpbiBhbiBhcnJheSB5ZXQgPyBJcyBzbywgcmFpc2UgYW4gZXJyb3IgKi8KKyAgICAgICAgICAgICAgc3dpdGNoIChkaWN0X3N0YXRlKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBkaWN0X2VuY29kaW5nOiAgIGNhc2UgZGljdF9zdWJyczoKKyAgICAgICAgICAgICAgICBjYXNlIGRpY3Rfb3RoZXJzdWJyczogY2FzZSBkaWN0X2NoYXJzdHJpbmdzOgorICAgICAgICAgICAgICAgIGNhc2UgZGljdF91bmtub3duX2FycmF5OgorICAgICAgICAgICAgICAgICAgRlRfRVJST1IoKCAiVDEuUGFyc2UuYXJyYXk6IG5lc3RlZCBhcnJheSBkZWZpbml0aW9uc1xuIiApKTsKKyAgICAgICAgICAgICAgICAgIGdvdG8gU3ludGF4X0Vycm9yOworCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBlcnJvciA9IEV4cGVjdF9BcnJheV9Bcmd1bWVudHMoIHBhcnNlciApOworICAgICAgICAgICAgICBpZiAoZXJyb3IpIGdvdG8gRXhpdDsKKyAgICAgICAgICAgICAgYnJlYWs7CisKKworICAgICAgICAgICAgY2FzZSBrZXlfTkQ6CisgICAgICAgICAgICBjYXNlIGtleV9OUDoKKyAgICAgICAgICAgIGNhc2Uga2V5X2RlZjoKKyAgICAgICAgICAgICAgLyogQXJlIHdlIGluIGFuIGFycmF5ID8gSWYgc28sIGZpbmFsaXNlIGl0Li4gKi8KKyAgICAgICAgICAgICAgc3dpdGNoICggZGljdF9zdGF0ZSApCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIGRpY3RfZW5jb2Rpbmc6ICAgIC8qIGZpbmlzaCBlbmNvZGluZyBhcnJheSAqLworICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiBjb3B5IHRhYmxlIG5hbWVzIHRvIHRoZSBmYWNlIG9iamVjdCAqLworICAgICAgICAgICAgICAgICAgICBUMV9Eb25lX1RhYmxlKCAmcGFyc2VyLT50YWJsZSApOworCisgICAgICAgICAgICAgICAgICAgIHBhcnNlci0+ZW5jb2RpbmdfbmFtZXMgICA9IHBhcnNlci0+dGFibGUuYmxvY2s7CisgICAgICAgICAgICAgICAgICAgIHBhcnNlci0+ZW5jb2RpbmdfbGVuZ3RocyA9IHBhcnNlci0+dGFibGUubGVuZ3RoczsKKyAgICAgICAgICAgICAgICAgICAgcGFyc2VyLT5lbmNvZGluZ19vZmZzZXRzID0gcGFyc2VyLT50YWJsZS5lbGVtZW50czsKKworICAgICAgICAgICAgICAgICAgICBwYXJzZXItPnN0YXRlX2luZGV4LS07CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICBicmVhazsKKworCisgICAgICAgICAgICAgICAgY2FzZSBkaWN0X3N1YnJzOgorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBUMV9GYWNlICBmYWNlID0gcGFyc2VyLT5mYWNlOworCisgICAgICAgICAgICAgICAgICAgIC8qIGNvcHkgcmVjb3JkZXIgc3ViLXJvdXRpbmVzICovCisgICAgICAgICAgICAgICAgICAgIFQxX0RvbmVfVGFibGUoICZwYXJzZXItPnRhYmxlICk7CisKKyAgICAgICAgICAgICAgICAgICAgcGFyc2VyLT5zdWJycyAgID0gcGFyc2VyLT50YWJsZS5ibG9jazsKKyAgICAgICAgICAgICAgICAgICAgZmFjZS0+c3VicnMgICAgID0gcGFyc2VyLT50YWJsZS5lbGVtZW50czsKKyAgICAgICAgICAgICAgICAgICAgZmFjZS0+c3VicnNfbGVuID0gcGFyc2VyLT50YWJsZS5sZW5ndGhzOworCisgICAgICAgICAgICAgICAgICAgIHBhcnNlci0+c3RhdGVfaW5kZXgtLTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBkaWN0X2NoYXJzdHJpbmdzOgorICAgICAgICAgICAgICAgIGNhc2UgZGljdF9vdGhlcnN1YnJzOgorICAgICAgICAgICAgICAgIGNhc2UgZGljdF91bmtub3duX2FycmF5OgorICAgICAgICAgICAgICAgICAgRlRfRVJST1IoKCAiVDEuUGFyc2VyLmRlZjogdW5zdXBwb3J0ZWQgYXJyYXlcbiIgKSk7CisgICAgICAgICAgICAgICAgICBnb3RvIFN5bnRheF9FcnJvcjsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgZGVmYXVsdDogICAvKiBub3JtYWwgJ2RlZicgcHJvY2Vzc2luZyAqLworICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiBDaGVjayB0aGF0IHdlIGhhdmUgc3VmZmljaWVudCBvcGVyYW5kcyBpbiB0aGUgc3RhY2sgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKCB0b3AgPj0gcGFyc2VyLT5zdGFjaysyICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgIC8qIE5vdyBjaGVjayB0aGF0IHRoZSBmaXJzdCBvcGVyYW5kIGlzIGFuIGltbWVkaWF0ZSAqLworICAgICAgICAgICAgICAgICAgICAgIC8qIElmIHNvLCBjYWxsIHRoZSBhcHByb3ByaWF0ZSAiZGVmIiByb3V0aW5lIGJhc2VkICAqLworICAgICAgICAgICAgICAgICAgICAgIC8qIG9uIHRoZSBjdXJyZW50IHBhcnNlciBzdGF0ZS4uICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgIGlmICggdG9wWy0yXS5raW5kID09IHRva19pbW1lZGlhdGUgKQorICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci0+dG9wIC09IDI7CisJCQkJCQlwYXJzZXItPmFyZ3MgPSBwYXJzZXItPnRvcCArIDE7CisgICAgICAgICAgICAgICAgICAgICAgICBlcnJvciA9IGRlZl9mdW5jc1tkaWN0X3N0YXRlXShwYXJzZXIpOworICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogVGhpcyBpcyBhbiBlcnJvciwgYnV0IHNvbWUgZm9udHMgY29udGFpbiBzb21lICovCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdHVwaWQgUG9zdHNjcmlwdCBjb2RlLiBXZSBzaW1wbHkgaWdub3JlICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFuIGludmFsaWQgJ2RlZicgYnkgY2xlYXJpbmcgdGhlIHN0YWNrICAgICAgICAqLworI2lmIDAKKyAgICAgICAgICAgICAgICAgICAgICAgIEZUX0VSUk9SKCggIlQxLlBhcnNlLmRlZjogaW1tZWRpYXRlIGV4cGVjdGVkXG4iICkpOworICAgICAgICAgICAgICAgICAgICAgICAgZ290byBTeW50YXhfRXJyb3I7CisjZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLT50b3AgPSBwYXJzZXItPnN0YWNrOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgIEZUX0VSUk9SKCggIlQxLlBhcnNlLmRlZjogbm90IGVub3VnaCBhcmd1bWVudHNcbiIgKSk7CisgICAgICAgICAgICAgICAgICAgICAgZ290byBTdGFja19VbmRlcmZsb3c7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBicmVhazsKKworCisKKyAgICAgICAgICAgIGNhc2Uga2V5X2luZGV4OgorICAgICAgICAgICAgICBpZiAoIHRvcCA8PSBwYXJzZXItPnN0YWNrICkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZUX0VSUk9SKCggIlQxLlBhcnNlLmluZGV4OiBub3QgZW5vdWdoIGFyZ3VtZW50c1xuIiApKTsKKyAgICAgICAgICAgICAgICBnb3RvIFN0YWNrX1VuZGVyZmxvdzsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIC8qIHNpbXBseSBpZ25vcmUgPz8gKi8KKyAgICAgICAgICAgICAgcGFyc2VyLT50b3AgLS07CisgICAgICAgICAgICAgIGJyZWFrOworCisKKyAgICAgICAgICAgIGNhc2Uga2V5X3B1dDoKKyAgICAgICAgICAgICAgLyogQ2hlY2sgdGhhdCB3ZSBoYXZlIHN1ZmZpY2llbnQgb3BlcmFuZHMgaW4gc3RhY2sgKi8KKyAgICAgICAgICAgICAgaWYgKCB0b3AgPCBwYXJzZXItPnN0YWNrKzIgKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlRfRVJST1IoKCAiVDEuUGFyc2UucHV0OiBub3QgZW5vdWdoIGFyZ3VtZW50c1xuIiApKTsKKyAgICAgICAgICAgICAgICBnb3RvIFN0YWNrX1VuZGVyZmxvdzsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIHBhcnNlci0+dG9wIC09IDI7CisJCQkgIHBhcnNlci0+YXJncyA9IHBhcnNlci0+dG9wOworICAgICAgICAgICAgICBzd2l0Y2ggKGRpY3Rfc3RhdGUpCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIGRpY3RfZW5jb2Rpbmc6CisgICAgICAgICAgICAgICAgICBlcnJvciA9IERvX1B1dF9FbmNvZGluZyggcGFyc2VyICk7CisgICAgICAgICAgICAgICAgICBpZiAoZXJyb3IpIGdvdG8gRXhpdDsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBkaWN0X3Vua25vd25fYXJyYXk6ICAgLyogaWdub3JlIHRoZSBwdXQgKi8KKyAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyNpZiAwCisgICAgICAgICAgICAgICAgICBGVF9FUlJPUigoICJUMS5QYXJzZS5wdXQ6IGludmFsaWQgY29udGV4dFxuIiApKTsKKyAgICAgICAgICAgICAgICAgIGdvdG8gU3ludGF4X0Vycm9yOworI2Vsc2UKKyAgICAgICAgICAgICAgICAgIC8qIGludmFsaWQgY29udGV4dCwgc2ltcGx5IGlnbm9yZSB0aGUgcHV0IGFuZCAqLworICAgICAgICAgICAgICAgICAgLyogY2xlYXIgdGhlIHN0YWNrIChzdHVwaWQgUG9zdHNjcmlwdCBjb2RlLi4pICovCisgICAgICAgICAgICAgICAgICBGVF9UUkFDRTQoKCAiVDEuUGFyc2UucHV0OiBpbnZhbGlkIGNvbnRleHQuIGlnbm9yZWQuXG4iICkpOworICAgICAgICAgICAgICAgICAgcGFyc2VyLT50b3AgPSBwYXJzZXItPnN0YWNrOworI2VuZGlmCisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgYnJlYWs7CisKKworCisgICAgICAgICAgICBjYXNlIGtleV9SRDoKKyAgICAgICAgICAgICAgLyogQ2hlY2sgdGhhdCB3ZSBoYXZlIHN1ZmZpY2llbnQgb3BlcmFuZHMgaW4gc3RhY2sgKi8KKyAgICAgICAgICAgICAgaWYgKCB0b3AgPCBwYXJzZXItPnN0YWNrKzIgKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlRfRVJST1IoKCAiVDEuUGFyc2UuUkQ6IG5vdCBlbm91Z2ggYXJndW1lbnRzXG4iICkpOworICAgICAgICAgICAgICAgIGdvdG8gU3RhY2tfVW5kZXJmbG93OworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgcGFyc2VyLT50b3AgLT0gMjsKKwkJCSAgcGFyc2VyLT5hcmdzID0gcGFyc2VyLT50b3A7CisgICAgICAgICAgICAgIHN3aXRjaCAoZGljdF9zdGF0ZSkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgZGljdF9zdWJyczoKKyAgICAgICAgICAgICAgICAgIGVycm9yID0gRG9fUkRfU3VicnMoIHBhcnNlciApOworICAgICAgICAgICAgICAgICAgaWYgKGVycm9yKSBnb3RvIEV4aXQ7CisgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgZGljdF9jaGFyc3RyaW5nczoKKyAgICAgICAgICAgICAgICAgIGVycm9yID0gRG9fUkRfQ2hhcnN0cmluZ3MoIHBhcnNlciApOworICAgICAgICAgICAgICAgICAgaWYgKGVycm9yKSBnb3RvIEV4aXQ7CisgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICBGVF9FUlJPUigoICJUMS5QYXJzZS5SRDogaW52YWxpZCBjb250ZXh0XG4iICkpOworICAgICAgICAgICAgICAgICAgZ290byBTeW50YXhfRXJyb3I7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgYnJlYWs7CisKKworCisgICAgICAgICAgICBjYXNlIGtleV9lbmQ6CisgICAgICAgICAgICAgIC8qIFdlcmUgd2UgaW4gYSBkaWN0aW9uYXJ5IG9yIGluIGFuIGFycmF5ID8gKi8KKyAgICAgICAgICAgICAgaWYgKCBkaWN0X2luZGV4IDw9IDAgKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRlRfRVJST1IoKCAiVDEuUGFyc2UuZW5kOiBubyBkaWN0aW9uYXJ5IGRlZmluZWRcbiIgKSk7CisgICAgICAgICAgICAgICAgZ290byBTeW50YXhfRXJyb3I7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBzd2l0Y2ggKGRpY3Rfc3RhdGUpCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBKdW1wIHRvIHRoZSBwcml2YXRlIGRpY3Rpb25hcnkgaWYgd2UncmUgY2xvc2luZyB0aGUgKi8KKyAgICAgICAgICAgICAgICAvKiAvRm9udCBkaWN0aW9uYXJ5Li4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBjYXNlIGRpY3RfZm9udDoKKyAgICAgICAgICAgICAgICAgIGdvdG8gT3Blbl9Qcml2YXRlOworCisgICAgICAgICAgICAgICAgLyogRXhpdCB0aGUgcGFyc2VyIHdoZW4gY2xvc2luZyB0aGUgQ2hhclN0cmluZ3MgZGljdGlvbmFyeSAqLworICAgICAgICAgICAgICAgIGNhc2UgZGljdF9jaGFyc3RyaW5nczoKKyAgICAgICAgICAgICAgICAgIHJldHVybiBGaW5hbGlzZV9QYXJzaW5nKCBwYXJzZXIgKTsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAvKiBQb3AgdGhlIGN1cnJlbnQgZGljdGlvbmFyeSBzdGF0ZSBhbmQgcmV0dXJuIHRvIHByZXZpb3VzICovCisgICAgICAgICAgICAgICAgICAvKiBvbmUuIENvbnN1bWUgdGhlICJkZWYiLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgICAgICAgIC8qIEJlY2F1c2Ugc29tZSBidWdneSBmb250cyAoQml0U3RyZWFtKSBoYXZlIGluY29ycmVjdCAgICAgKi8KKyAgICAgICAgICAgICAgICAgIC8qIHN5bnRheCwgd2UgbmV2ZXIgZXNjYXBlIGZyb20gdGhlIHByaXZhdGUgZGljdGlvbmFyeSAgICAgKi8KKyAgICAgICAgICAgICAgICAgIGlmIChkaWN0X3N0YXRlICE9IGRpY3RfcHJpdmF0ZSkKKyAgICAgICAgICAgICAgICAgICAgcGFyc2VyLT5zdGF0ZV9pbmRleC0tOworICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICBlcnJvciA9IEV4cGVjdF9LZXl3b3JkMiggcGFyc2VyLCBrZXlfZGVmLCBrZXlfcHV0ICk7CisgICAgICAgICAgICAgICAgICBpZiAoZXJyb3IpIGdvdG8gRXhpdDsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBicmVhazsKKworCisKKyAgICAgICAgICAgIGNhc2Uga2V5X2ZvcjoKKyAgICAgICAgICAgICAgLyogY2hlY2sgdGhhdCB3ZSBoYXZlIGZvdXIgYXJndW1lbnRzLCBhbmQgc2ltcGx5ICovCisgICAgICAgICAgICAgIC8qIGlnbm9yZSB0aGVtLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICBpZiAoIHRvcCAtIHBhcnNlci0+c3RhY2sgPCA0ICkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZUX0VSUk9SKCggIlQxLlBhcnNlLmZvcjogbm90IGVub3VnaCBhcmd1bWVudHNcbiIgKSk7CisgICAgICAgICAgICAgICAgZ290byBTdGFja19VbmRlcmZsb3c7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBwYXJzZXItPnRvcCAtPSA0OworICAgICAgICAgICAgICBicmVhazsKKworCisKKyAgICAgICAgICAgIGNhc2Uga2V5X2N1cnJlbnRkaWN0OgorCisgICAgICAgICAgT3Blbl9Qcml2YXRlOgorICAgICAgICAgICAgICAgcGFyc2VyLT5zdGF0ZV9pbmRleCAgICA9IDA7CisgICAgICAgICAgICAgICBwYXJzZXItPnN0YXRlX3N0YWNrWzBdID0gZGljdF9ub25lMjsKKyAgICAgICAgICAgICAgIGVycm9yID0gT3Blbl9Qcml2YXRlRGljdCggcGFyc2VyLT50b2tlbml6ZXIgKTsKKyAgICAgICAgICAgICAgIGlmIChlcnJvcikgZ290byBFeGl0OworICAgICAgICAgICAgICAgYnJlYWs7CisKKworICAgICAgICAgICAgY2FzZSBrZXlfdHJ1ZToKKyAgICAgICAgICAgIGNhc2Uga2V5X2ZhbHNlOgorCQkJY2FzZSBrZXlfU3RhbmRhcmRFbmNvZGluZzoKKwkJCWNhc2Uga2V5X0V4cGVydEVuY29kaW5nOgorICAgICAgICAgICAgICBnb3RvIFB1c2hfRWxlbWVudDsKKworCisgICAgICAgICAgICBkZWZhdWx0OgorCQkJICBGVF9FUlJPUigoICJUMS5QYXJzZXI6IGludmFsaWQga2V5d29yZCBpbiBjb250ZXh0XG4iICkpOworICAgICAgICAgICAgICBlcnJvciA9IFQxX0Vycl9TeW50YXhfRXJyb3I7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIC8qIEEgbnVtYmVyIHdhcyBkZXRlY3RlZCAqLworICAgICAgICBjYXNlIHRva19zdHJpbmc6CisgICAgICAgIGNhc2UgdG9rX3Byb2dyYW06CisgICAgICAgIGNhc2UgdG9rX2ltbWVkaWF0ZToKKyAgICAgICAgY2FzZSB0b2tfYXJyYXk6CisgICAgICAgIGNhc2UgdG9rX2hleGFycmF5OgorICAgICAgICBjYXNlIHRva19hbnk6CisgICAgICAgIGNhc2UgdG9rX251bWJlcjogICAgICAgICAgICAgICAgICAgICAgICAvKiBwdXNoIG51bWJlciBvbiBzdGFjayAqLworCisgICAgIFB1c2hfRWxlbWVudDoKKyAgICAgICAgICBpZiAoIHRvcCA+PSBwYXJzZXItPmxpbWl0ICkKKyAgICAgICAgICB7CisgICAgICAgICAgICBlcnJvciA9IFQxX0Vycl9TdGFja19PdmVyZmxvdzsKKyAgICAgICAgICAgIGdvdG8gRXhpdDsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgKnBhcnNlci0+dG9wKysgPSB0b2tlbjsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICAvKiBhbnl0aGluZyBlbHNlIGlzIGFuIGVycm9yIHBlciBzZSB0aGUgc3BlYywgYnV0IHdlICAgICAqLworICAgICAgICAvKiBmcmVxdWVudGx5IGVuY291bnRyZSBzdHVwaWQgcG9zdHNjcmlwdCBjb2RlIGluIGZvbnRzLCAqLworICAgICAgICAvKiBzbyBqdXN0IGlnbm9yZSB0aGVtLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGVycm9yID0gVDFfRXJyX09rOyAgLyogaWdub3JlIHRva2VuICovCisgICAgICB9CisKKyAgICAgIGlmIChlcnJvcikKKyAgICAgICAgcmV0dXJuIGVycm9yOworICAgIH0KKyAgRXhpdDoKKyAgICByZXR1cm4gZXJyb3I7CisKKyAgU3ludGF4X0Vycm9yOgorICAgIHJldHVybiBUMV9FcnJfU3ludGF4X0Vycm9yOworCisgIFN0YWNrX1VuZGVyZmxvdzoKKyAgICByZXR1cm4gVDFfRXJyX1N0YWNrX1VuZGVyZmxvdzsKKyAgfQorCmRpZmYgLS1naXQgYS9zcmMvdHlwZTEvdDFsb2FkLmggYi9zcmMvdHlwZTEvdDFsb2FkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWUwZWU0NwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90eXBlMS90MWxvYWQuaApAQCAtMCwwICsxLDcyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICB0MWxvYWQuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjAKKyAqCisgKiAgICBUeXBlMSBMb2FkZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqCisgKiAgQ29weXJpZ2h0IDE5OTYtMTk5OCBieQorICogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkCisgKiAgbW9kaWZpZWQgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIFQxTE9BRF9ICisjZGVmaW5lIFQxTE9BRF9ICisKKyNpbmNsdWRlIDxmdHN0cmVhbS5oPgorI2luY2x1ZGUgPHQxcGFyc2UuaD4KKworI2lmZGVmIF9fY3BsdXNwbHVzCisgIGV4dGVybiAiQyIgeworI2VuZGlmCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+IEluaXRfVDFfUGFyc2VyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBJbml0aWFsaXNlIGEgZ2l2ZW4gcGFyc2VyIG9iamVjdCB0byBidWlsZCBhIGdpdmVuIFQxX0ZhY2UgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBwYXJzZXIgIDo6IGhhbmRsZSB0byB0aGUgbmV3bHkgYnVpbHQgcGFyc2VyIG9iamVjdCAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZmFjZSAgICA6OiBoYW5kbGUgdG8gdGFyZ2V0IFQxIGZhY2Ugb2JqZWN0ICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgTE9DQUxfREVGCisgICB2b2lkICBJbml0X1QxX1BhcnNlciggVDFfUGFyc2VyKiAgICBwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgVDFfRmFjZSAgICAgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgIFQxX1Rva2VuaXplciAgdG9rZW5pemVyICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gUGFyc2VfVDFfRm9udFByb2dyYW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFBhcnNlcyBhIGdpdmVuIFR5cGUgMSBmb250IGZpbGUgYW5kIGJ1aWxkcyBpdHMgZmFjZSBvYmplY3QgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHBhcnNlciAgOjogaGFuZGxlIHRvIHRhcmdldCBwYXJzZXIgb2JqZWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEVycm9yIGNvZGUuIDAgbWVhbnMgc3VjY2Vzcy4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoZSBwYXJzZXIgY29udGFpbnMgYSBoYW5kbGUgdG8gdGhlIHRhcmdldCBmYWNlIG9iamVjdC4gICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgIExPQ0FMX0RFRgorICAgVDFfRXJyb3IgIFBhcnNlX1QxX0ZvbnRQcm9ncmFtKCBUMV9QYXJzZXIqICBwYXJzZXIgKTsKKworCisjaWZkZWYgX19jcGx1c3BsdXMKKyAgfQorI2VuZGlmCisKKyNlbmRpZiAvKiBUMUxPQURfSCAqLworCisKKy8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3R5cGUxL3Qxb2Jqcy5jIGIvc3JjL3R5cGUxL3Qxb2Jqcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4ZDc3ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdHlwZTEvdDFvYmpzLmMKQEAgLTAsMCArMSw0MTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIHQxb2Jqcy5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjAKKyAqCisgKiAgICBUeXBlMSBPYmplY3RzIG1hbmFnZXIuICAgICAgICAKKyAqCisgKiAgQ29weXJpZ2h0IDE5OTYtMTk5OCBieQorICogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkCisgKiAgbW9kaWZpZWQgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8ZnRkZWJ1Zy5oPgorI2luY2x1ZGUgPGZ0c3RyZWFtLmg+CisKKyNpbmNsdWRlIDx0MWdsb2FkLmg+CisjaW5jbHVkZSA8dDFsb2FkLmg+CisKKyNpZm5kZWYgVDFfQ09ORklHX09QVElPTl9ESVNBQkxFX0hJTlRFUgorI2luY2x1ZGUgPHQxaGludGVyLmg+CisjZW5kaWYKKworLyogUmVxdWlyZWQgYnkgdHJhY2luZyBtb2RlICovCisjdW5kZWYgICBGVF9DT01QT05FTlQKKyNkZWZpbmUgIEZUX0NPTVBPTkVOVCAgdHJhY2VfdDFvYmpzCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgU0laRSAgRlVOQ1RJT05TICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogPEZ1bmN0aW9uPiAgVDFfRG9uZV9TaXplCisgKgorICogPERlc2NyaXB0aW9uPgorICogICAgVGhlIFRydWVEb2MgaW5zdGFuY2Ugb2JqZWN0IGRlc3RydWN0b3IuIFVzZWQgdG8gZGlzY2FyZAorICogICAgYSBnaXZlbiBpbnN0YW5jZSBvYmplY3QuLgorICoKKyAqIDxJbnB1dD4KKyAqICAgIGluc3RhbmNlICAgOjogaGFuZGxlIHRvIHRoZSB0YXJnZXQgaW5zdGFuY2Ugb2JqZWN0CisgKgorICogPFJldHVybj4KKyAqICAgIFRydWVEb2MgZXJyb3IgY29kZS4gMCBtZWFucyBzdWNjZXNzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICBMT0NBTF9GVU5DCisgIHZvaWQgIFQxX0RvbmVfU2l6ZSggVDFfU2l6ZSAgc2l6ZSApCisgIHsKKyAgICBpZiAoc2l6ZSkKKyAgICB7CisjaWZuZGVmIFQxX0NPTkZJR19PUFRJT05fRElTQUJMRV9ISU5URVIKKyAgICAgIFQxX0RvbmVfU2l6ZV9IaW50ZXIoIHNpemUgKTsKKyNlbmRpZgorICAgICAgc2l6ZS0+dmFsaWQgPSAwOworICAgIH0KKyAgfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIDxGdW5jdGlvbj4gVDFfSW5pdF9TaXplCisgKgorICogIDxEZXNjcmlwdGlvbj4KKyAqICAgICBUaGUgaW5zdGFuY2Ugb2JqZWN0IGNvbnN0cnVjdG9yCisgKgorICogIDxJbnB1dD4KKyAqICAgICBpbnN0YW5jZSAgOiBoYW5kbGUgdG8gbmV3IGluc3RhbmNlIG9iamVjdAorICogICAgIGZhY2UgICAgICA6IHBvaW50ZXIgdG8gcGFyZW50IGZhY2Ugb2JqZWN0CisgKgorICogIDxSZXR1cm4+CisgKiAgICAgVHJ1ZURvYyBlcnJvciBjb2RlLiAwIG1lYW5zIHN1Y2Nlc3MuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICBMT0NBTF9ERUYKKyAgVDFfRXJyb3IgIFQxX0luaXRfU2l6ZSggVDFfU2l6ZSAgc2l6ZSApCisgIHsKKyAgICBUMV9FcnJvciAgICBlcnJvcjsKKyAgICAgIAorICAgIHNpemUtPnZhbGlkID0gMDsKKyAgICAKKyNpZm5kZWYgVDFfQ09ORklHX09QVElPTl9ESVNBQkxFX0hJTlRFUgorICAgIGVycm9yID0gVDFfTmV3X1NpemVfSGludGVyKCBzaXplICk7CisgICAgcmV0dXJuIGVycm9yOworI2Vsc2UKKyAgICAodm9pZCllcnJvcjsKKyAgICByZXR1cm4gVDFfRXJyX09rOworI2VuZGlmCisgIH0KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICA8RnVuY3Rpb24+IFQxX1Jlc2V0X1NpemUKKyAqCisgKiAgPERlc2NyaXB0aW9uPgorICogICAgIFJlc2V0cyBhbiBpbnN0YW5jZSB0byBhIG5ldyBwb2ludHNpemUvdHJhbnNmb3JtLgorICogICAgIFRoaXMgZnVuY3Rpb24gaXMgaW4gY2hhcmdlIG9mIHJlc2V0dGluZyB0aGUgYmx1ZSB6b25lcywKKyAqICAgICBBcyB3ZWxsIGFzIHRoZSBzdGVtIHNuYXAgdGFibGVzIGZvciBhIGdpdmVuIHNpemUuLgorICoKKyAqICA8SW5wdXQ+CisgKiAgICAgaW5zdGFuY2UgICB0aGUgaW5zdGFuY2Ugb2JqZWN0IHRvIGRlc3Ryb3kKKyAqCisgKiAgPE91dHB1dD4KKyAqICAgICBFcnJvciBjb2RlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCisgIExPQ0FMX0ZVTkMKKyAgVDFfRXJyb3IgIFQxX1Jlc2V0X1NpemUoIFQxX1NpemUgIHNpemUgKQorICB7CisjaWZuZGVmIFQxX0NPTkZJR19PUFRJT05fRElTQUJMRV9ISU5URVIKKyAgICByZXR1cm4gVDFfUmVzZXRfU2l6ZV9IaW50ZXIoIHNpemUgKTsKKyNlbHNlCisgICAgKHZvaWQpc2l6ZTsKKyAgICByZXR1cm4gMDsKKyNlbmRpZgorICB9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBGQUNFICBGVU5DVElPTlMgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgPEZ1bmN0aW9uPiBUMV9Eb25lX0ZhY2UKKyAqCisgKiAgPERlc2NyaXB0aW9uPgorICogICAgIFRoZSBmYWNlIG9iamVjdCBkZXN0cnVjdG9yLgorICoKKyAqICA8SW5wdXQ+CisgKiAgICAgZmFjZSAgOjogdHlwZWxlc3MgcG9pbnRlciB0byB0aGUgZmFjZSBvYmplY3QgdG8gZGVzdHJveQorICoKKyAqICA8UmV0dXJuPgorICogICAgIEVycm9yIGNvZGUuICAgICAgICAgICAgICAgICAgICAgICAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIExPQ0FMX0ZVTkMKKyAgdm9pZCAgVDFfRG9uZV9GYWNlKCBUMV9GYWNlICBmYWNlICkKKyAgeworICAgIEZUX01lbW9yeSAgbWVtb3J5OworCisgICAgaWYgKGZhY2UpCisgICAgeworICAgICAgbWVtb3J5ID0gZmFjZS0+cm9vdC5tZW1vcnk7CisgICAgICAvKiBYWFhYIDogVE8gRE8gKi8KKyAgICB9CisgIH0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgPEZ1bmN0aW9uPiAgVDFfSW5pdF9GYWNlCisgKgorICogIDxEZXNjcmlwdGlvbj4KKyAqICAgICBUaGUgZmFjZSBvYmplY3QgY29uc3RydWN0b3IuCisgKgorICogIDxJbnB1dD4KKyAqICAgICBmYWNlICA6OiAgZmFjZSByZWNvcmQgdG8gYnVpbGQKKyAqICAgICBJbnB1dCA6OiAgaW5wdXQgc3RyZWFtIHdoZXJlIHRvIGxvYWQgZm9udCBkYXRhCisgKgorICogIDxSZXR1cm4+CisgKiAgICAgRXJyb3IgY29kZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIExPQ0FMX0ZVTkMKKyAgVDFfRXJyb3IgIFQxX0luaXRfRmFjZSggRlRfU3RyZWFtICBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgZmFjZV9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVDFfRmFjZSAgICBmYWNlICkKKyAgeworICAgIFQxX1Rva2VuaXplciAgdG9rZW5pemVyOworICAgIFQxX0Vycm9yICAgICAgZXJyb3I7CisKKyAgICAodm9pZClmYWNlX2luZGV4OworICAgICh2b2lkKWZhY2U7CisKKyAgICBmYWNlLT5yb290Lm51bV9mYWNlcyA9IDE7CisKKyAgICAvKiBvcGVuIHRoZSB0b2tlbml6ZXIsIHRoaXMgd2lsbCBhbHNvIGNoZWNrIHRoZSBmb250IGZvcm1hdCAqLworICAgIGVycm9yID0gTmV3X1Rva2VuaXplciggc3RyZWFtLCAmdG9rZW5pemVyICk7CisgICAgaWYgKGVycm9yKSBnb3RvIEZhaWw7CisKKyAgICAvKiBpZiB3ZSBqdXN0IHdhbnRlZCB0byBjaGVjayB0aGUgZm9ybWF0LCBsZWF2ZSBzdWNjZXNzZnVsbHkgbm93ICovCisgICAgaWYgKGZhY2VfaW5kZXggPCAwKQorICAgICAgZ290byBMZWF2ZTsKKworICAgIC8qIGNoZWNrIHRoZSBmYWNlIGluZGV4ICovCisgICAgaWYgKCBmYWNlX2luZGV4ICE9IDAgKQorICAgIHsKKyAgICAgIEZUX0VSUk9SKCggIlQxLkluaXRfRmFjZSA6IGludmFsaWQgZmFjZSBpbmRleFxuIiApKTsKKyAgICAgIGVycm9yID0gVDFfRXJyX0ludmFsaWRfQXJndW1lbnQ7CisgICAgICBnb3RvIExlYXZlOworICAgIH0KKworICAgIC8qIE5vdywgbG9hZCB0aGUgZm9udCBwcm9ncmFtIGludG8gdGhlIGZhY2Ugb2JqZWN0ICovCisgICAgeworICAgICAgVDFfUGFyc2VyICBwYXJzZXI7CisKKyAgICAgIEluaXRfVDFfUGFyc2VyKCAmcGFyc2VyLCBmYWNlLCB0b2tlbml6ZXIgKTsKKyAgICAgIGVycm9yID0gUGFyc2VfVDFfRm9udFByb2dyYW0oICZwYXJzZXIgKTsKKyAgICAgIGlmIChlcnJvcikgZ290byBMZWF2ZTsKKworICAgICAgLyogSW5pdCB0aGUgZmFjZSBvYmplY3QgZmllbGRzICovCisgICAgICAvKiBOb3cgc2V0IHVwIHJvb3QgZmFjZSBmaWVsZHMgKi8KKyAgICAgIHsKKyAgICAgICAgRlRfRmFjZSAgcm9vdCA9IChGVF9GYWNlKSZmYWNlLT5yb290OworICAgICAgICAKKyAgICAgICAgcm9vdC0+bnVtX2dseXBocyAgID0gZmFjZS0+bnVtX2dseXBoczsKKyAgICAgICAgcm9vdC0+bnVtX2NoYXJtYXBzID0gMTsKKyAgCisgICAgICAgIHJvb3QtPmZhY2VfaW5kZXggPSBmYWNlX2luZGV4OworICAgICAgICByb290LT5mYWNlX2ZsYWdzID0gRlRfRkFDRV9GTEFHX1NDQUxBQkxFOworICAgICAgICAKKyAgICAgICAgcm9vdC0+ZmFjZV9mbGFncyB8PSBGVF9GQUNFX0ZMQUdfSE9SSVpPTlRBTDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBpZiAoIGZhY2UtPmZvbnRfaW5mby5pc19maXhlZF9waXRjaCApCisgICAgICAgICAgcm9vdC0+ZmFjZV9mbGFncyB8PSBGVF9GQUNFX0ZMQUdfRklYRURfV0lEVEg7CisKKyAgICAgICAgLyogWFhYIDogVE8gRE8gLSBhZGQga2VybmluZyB3aXRoIC5hZm0gc3VwcG9ydCAqLworCisgICAgICAgIC8qIGdldCBzdHlsZSBuYW1lIC0gYmUgY2FyZWZ1bCwgc29tZSBicm9rZW4gZm9udHMgb25seSAqLworICAgICAgICAvKiBoYXZlIGEgL0ZvbnROYW1lIGRpY3Rpb25hcnkgZW50cnkgLi4gISEgICAgICAgICAgICAgKi8KKyAgICAgICAgcm9vdC0+ZmFtaWx5X25hbWUgPSBmYWNlLT5mb250X2luZm8uZmFtaWx5X25hbWU7CisgICAgICAgIGlmIChyb290LT5mYW1pbHlfbmFtZSkKKyAgICAgICAgeworICAgICAgICAgIGNoYXIqICBmdWxsICAgPSBmYWNlLT5mb250X2luZm8uZnVsbF9uYW1lOworICAgICAgICAgIGNoYXIqICBmYW1pbHkgPSByb290LT5mYW1pbHlfbmFtZTsKKyAgICAgICAgICAKKyAgICAgICAgICB3aGlsZSAoICpmYW1pbHkgJiYgKmZ1bGwgPT0gKmZhbWlseSApCisgICAgICAgICAgeworICAgICAgICAgICAgZmFtaWx5Kys7CisgICAgICAgICAgICBmdWxsKys7CisgICAgICAgICAgfQorICAgICAgICAgIAorICAgICAgICAgIHJvb3QtPnN0eWxlX25hbWUgPSAoICpmdWxsID09ICcgJyA/IGZ1bGwrMSA6ICJSZWd1bGFyIiApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIC8qIGRvIHdlIGhhdmUgYSAvRm9udE5hbWUgPz8gKi8KKyAgICAgICAgICBpZiAoZmFjZS0+Zm9udF9uYW1lKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIHJvb3QtPmZhbWlseV9uYW1lID0gZmFjZS0+Zm9udF9uYW1lOworICAgICAgICAgICAgcm9vdC0+c3R5bGVfbmFtZSAgPSAiUmVndWxhciI7CisgICAgICAgICAgfQorICAgICAgICB9CisgIAorICAgICAgICAvKiBubyBlbWJlZGRlZCBiaXRtYXAgc3VwcG9ydCAqLworICAgICAgICByb290LT5udW1fZml4ZWRfc2l6ZXMgPSAwOworICAgICAgICByb290LT5hdmFpbGFibGVfc2l6ZXMgPSAwOworICAKKyAgICAgICAgcm9vdC0+YmJveCAgICAgICAgID0gZmFjZS0+Zm9udF9iYm94OworICAgICAgICByb290LT51bml0c19wZXJfRU0gPSAxMDAwOworICAgICAgICByb290LT5hc2NlbmRlciAgICAgPSAgKFQxX1Nob3J0KWZhY2UtPmZvbnRfYmJveC55TWF4OworICAgICAgICByb290LT5kZXNjZW5kZXIgICAgPSAtKFQxX1Nob3J0KWZhY2UtPmZvbnRfYmJveC55TWluOworICAgICAgICByb290LT5oZWlnaHQgICAgICAgPSAoKHJvb3QtPmFzY2VuZGVyICsgcm9vdC0+ZGVzY2VuZGVyKSoxMikvMTA7CisgIAorICAgICAgICAvKiBub3cgY29tcHV0ZSB0aGUgbWF4aW11bSBhZHZhbmNlIHdpZHRoICovCisKKyAgICAgICAgcm9vdC0+bWF4X2FkdmFuY2Vfd2lkdGggPSBmYWNlLT5wcml2YXRlX2RpY3Quc3RhbmRhcmRfd2lkdGg7CisKKyAgICAgICAgLyogY29tcHV0ZSBtYXggYWR2YW5jZSB3aWR0aCBmb3IgcHJvcG9ydGlvbmFsIGZvbnRzICovCisgICAgICAgIGlmICghZmFjZS0+Zm9udF9pbmZvLmlzX2ZpeGVkX3BpdGNoKQorICAgICAgICB7CisgICAgICAgICAgVDFfSW50ICBtYXhfYWR2YW5jZTsKKworICAgICAgICAgIGVycm9yID0gVDFfQ29tcHV0ZV9NYXhfQWR2YW5jZSggZmFjZSwgJm1heF9hZHZhbmNlICk7CisKKyAgICAgICAgICAvKiBpbiBjYXNlIG9mIGVycm9yLCBrZWVwIHRoZSBzdGFuZGFyZCB3aWR0aCAqLworICAgICAgICAgIGlmICghZXJyb3IpCisgICAgICAgICAgICByb290LT5tYXhfYWR2YW5jZV93aWR0aCA9IG1heF9hZHZhbmNlOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGVycm9yID0gMDsgICAvKiBjbGVhciBlcnJvciAqLworICAgICAgICB9CisKKyAgICAgICAgcm9vdC0+bWF4X2FkdmFuY2VfaGVpZ2h0ID0gcm9vdC0+aGVpZ2h0OworICAgICAgICAKKyAgICAgICAgcm9vdC0+dW5kZXJsaW5lX3Bvc2l0aW9uICA9IGZhY2UtPmZvbnRfaW5mby51bmRlcmxpbmVfcG9zaXRpb247CisgICAgICAgIHJvb3QtPnVuZGVybGluZV90aGlja25lc3MgPSBmYWNlLT5mb250X2luZm8udW5kZXJsaW5lX3RoaWNrbmVzczsKKyAgCisgICAgICAgIHJvb3QtPm1heF9wb2ludHMgICA9IDA7CisgICAgICAgIHJvb3QtPm1heF9jb250b3VycyA9IDA7CisgICAgICB9CisgICAgfQorCisgIExlYXZlOgorICAgIERvbmVfVG9rZW5pemVyKCB0b2tlbml6ZXIgKTsKKworICBGYWlsOgorICAgIHJldHVybiBlcnJvcjsKKyAgfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIEZ1bmN0aW9uICAgIDogIEdseXBoX0Rlc3Ryb3kKKyAqCisgKiAgRGVzY3JpcHRpb24gOiAgVGhlIGdseXBoIG9iamVjdCBkZXN0cnVjdG9yLgorICoKKyAqICBJbnB1dCAgOiAgX2dseXBoICB0eXBlbGVzcyBwb2ludGVyIHRvIHRoZSBnbHlwaCByZWNvcmQgdG8gZGVzdHJveQorICoKKyAqICBPdXRwdXQgOiAgRXJyb3IgY29kZS4gICAgICAgICAgICAgICAgICAgICAgIAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgTE9DQUxfRlVOQworICB2b2lkICBUMV9Eb25lX0dseXBoU2xvdCggVDFfR2x5cGhTbG90ICBnbHlwaCApCisgIHsKKyAgICBGVF9NZW1vcnkgIG1lbW9yeSAgPSBnbHlwaC0+cm9vdC5mYWNlLT5tZW1vcnk7CisgICAgRlRfTGlicmFyeSBsaWJyYXJ5ID0gZ2x5cGgtPnJvb3QuZmFjZS0+ZHJpdmVyLT5saWJyYXJ5OworCisjaWZuZGVmIFQxX0NPTkZJR19PUFRJT05fRElTQUJMRV9ISU5URVIKKyAgICBUMV9Eb25lX0dseXBoX0hpbnRlciggZ2x5cGggKTsKKyNlbmRpZgorCS8qIHRoZSBiaXRtYXBzIGFyZSBjcmVhdGVkIG9uIGRlbWFuZCAqLworCUZSRUUoIGdseXBoLT5yb290LmJpdG1hcC5idWZmZXIgKTsKKyAgICBGVF9Eb25lX091dGxpbmUoIGxpYnJhcnksICZnbHlwaC0+cm9vdC5vdXRsaW5lICk7CisgICAgcmV0dXJuOworICB9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgRnVuY3Rpb24gICAgOiAgR2x5cGhfQ3JlYXRlCisgKgorICogIERlc2NyaXB0aW9uIDogIFRoZSBnbHlwaCBvYmplY3QgY29uc3RydWN0b3IuCisgKgorICogIElucHV0ICA6ICBnbHlwaCAgIGdseXBoIHJlY29yZCB0byBidWlsZC4KKyAqICAgICAgICAgICAgZmFjZSAgICB0aGUgZ2x5cGgncyBwYXJlbnQgZmFjZS4gICAgICAgICAgICAgIAorICoKKyAqICBPdXRwdXQgOiAgRXJyb3IgY29kZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIExPQ0FMX0ZVTkMKKyAgVDFfRXJyb3IgIFQxX0luaXRfR2x5cGhTbG90KCBUMV9HbHlwaFNsb3QgIGdseXBoICkKKyAgeworICAgIEZUX0xpYnJhcnkgIGxpYnJhcnkgPSBnbHlwaC0+cm9vdC5mYWNlLT5kcml2ZXItPmxpYnJhcnk7CisgICAgVDFfRXJyb3IgICAgZXJyb3I7CisKKyAgICBnbHlwaC0+bWF4X3BvaW50cyAgICAgICAgID0gMDsKKyAgICBnbHlwaC0+bWF4X2NvbnRvdXJzICAgICAgID0gMDsKKyAgICBnbHlwaC0+cm9vdC5iaXRtYXAuYnVmZmVyID0gMDsKKworICAgIGVycm9yID0gRlRfTmV3X091dGxpbmUoIGxpYnJhcnksIDAsIDAsICZnbHlwaC0+cm9vdC5vdXRsaW5lICk7CisgICAgaWYgKGVycm9yKSByZXR1cm4gZXJyb3I7CisKKyNpZm5kZWYgVDFfQ09ORklHX09QVElPTl9ESVNBQkxFX0hJTlRFUgorICAgIGVycm9yID0gVDFfTmV3X0dseXBoX0hpbnRlciggZ2x5cGggKTsKKyAgICBpZiAoZXJyb3IpCisgICAgICBGVF9Eb25lX091dGxpbmUoIGxpYnJhcnksICZnbHlwaC0+cm9vdC5vdXRsaW5lICk7CisjZW5kaWYKKworICAgIHJldHVybiBlcnJvcjsKKyAgfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIDxGdW5jdGlvbj4gIFQxX0luaXRfRHJpdmVyCisgKgorICogIDxEZXNjcmlwdGlvbj4KKyAqICAgICBJbml0aWFsaXNlIGEgZ2l2ZW4gVHlwZSAxIGRyaXZlciBvYmplY3QKKyAqCisgKiAgPElucHV0PgorICogICAgIGRyaXZlciA6OiAgaGFuZGxlIHRvIHRhcmdldCBkcml2ZXIgb2JqZWN0CisgKgorICogIDxSZXR1cm4+CisgKiAgICAgRXJyb3IgY29kZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIExPQ0FMX0ZVTkMKKyAgVDFfRXJyb3IgIFQxX0luaXRfRHJpdmVyKCBUMV9Ecml2ZXIgIGRyaXZlciApCisgIHsKKyAgICAodm9pZClkcml2ZXI7CisgICAgcmV0dXJuIFQxX0Vycl9PazsKKyAgfQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgPEZ1bmN0aW9uPiBUMV9Eb25lX0RyaXZlcgorICoKKyAqICA8RGVzY3JpcHRpb24+CisgKiAgICAgZmluYWxpc2UgYSBnaXZlbiBUeXBlIDEgZHJpdmVyCisgKgorICogIDxJbnB1dD4KKyAqICAgICBkcml2ZXIgIDo6IGhhbmRsZSB0byB0YXJnZXQgVHlwZSAxIGRyaXZlcgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgTE9DQUxfREVGCisgIHZvaWQgIFQxX0RvbmVfRHJpdmVyKCBUMV9Ecml2ZXIgIGRyaXZlciApCisgIHsKKyAgICAodm9pZClkcml2ZXI7CisgIH0KKworCisvKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy90eXBlMS90MW9ianMuaCBiL3NyYy90eXBlMS90MW9ianMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTdhZTUzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3R5cGUxL3Qxb2Jqcy5oCkBAIC0wLDAgKzEsMzAyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICB0MW9ianMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjAKKyAqCisgKiAgICBUeXBlMSBvYmplY3RzIGRlZmluaXRpb24uICAgICAgICAgCisgKgorICogIENvcHlyaWdodCAxOTk2LTE5OTkgYnkKKyAqICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZAorICogIG1vZGlmaWVkIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBUMU9CSlNfSAorI2RlZmluZSBUMU9CSlNfSAorCisjaW5jbHVkZSA8ZnRvYmpzLmg+CisjaW5jbHVkZSA8dDFjb25maWcuaD4KKyNpbmNsdWRlIDx0MWVycm9ycy5oPgorI2luY2x1ZGUgPHQxdHlwZXMuaD4KKworI2lmZGVmIF9fY3BsdXNwbHVzCisgIGV4dGVybiAiQyIgeworI2VuZGlmCisKKyAgLyogVGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmVzIG11c3QgYmUgZGVmaW5lZCBieSB0aGUgaGludGVyICovCisgIHR5cGVkZWYgc3RydWN0IFQxX1NpemVfSGludHNfICAgVDFfU2l6ZV9IaW50czsKKyAgdHlwZWRlZiBzdHJ1Y3QgVDFfR2x5cGhfSGludHNfICBUMV9HbHlwaF9IaW50czsKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFR5cGU+IFQxX0RyaXZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSBoYW5kbGUgdG8gYSBUeXBlIDEgZHJpdmVyIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgc3RydWN0IFQxX0RyaXZlclJlY18gICAqVDFfRHJpdmVyOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxUeXBlPiBUMV9TaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgaGFuZGxlIHRvIGEgVHlwZSAxIHNpemUgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHN0cnVjdCBUMV9TaXplUmVjXyogIFQxX1NpemU7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFR5cGU+IFQxX0dseXBoU2xvdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSBoYW5kbGUgdG8gYSBUeXBlIDEgZ2x5cGggc2xvdCBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgc3RydWN0IFQxX0dseXBoU2xvdFJlY18qICBUMV9HbHlwaFNsb3Q7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFR5cGU+IFQxX0NoYXJNYXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSBoYW5kbGUgdG8gYSBUeXBlIDEgY2hhcmFjdGVyIG1hcHBpbmcgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhlIFR5cGUgMSBmb3JtYXQgZG9lc24ndCB1c2UgYSBjaGFybWFwIGJ1dCBhbiBlbmNvZGluZyB0YWJsZS4gICAqLworICAvKiAgICBUaGUgZHJpdmVyIGlzIHJlc3BvbnNpYmxlIGZvciBtYWtpbmcgdXAgY2hhcm1hcCBvYmplY3RzICAgICAgICAgICovCisgIC8qICAgIGNvcnJlc3BvbmRpbmcgdG8gdGhlc2UgdGFibGVzLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHN0cnVjdCBUMV9DaGFyTWFwUmVjXyogICBUMV9DaGFyTWFwOworCisKKworIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgLyogICAgTk9XIEJFR0lOUyBUSEUgVFlQRTEgU1BFQ0lGSUMgU1RVRkYgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uICAqLworIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogIFQxX1NpemUgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVHlwZSAxIHNpemUgcmVjb3JkLi4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgCisgIHR5cGVkZWYgc3RydWN0IFQxX1NpemVSZWNfCisgIHsKKyAgICBGVF9TaXplUmVjICAgICAgcm9vdDsKKyAgICBUMV9Cb29sICAgICAgICAgdmFsaWQ7CisgICAgVDFfU2l6ZV9IaW50cyogIGhpbnRzOyAgLyogZGVmaW5lZCBpbiB0aGUgaGludGVyLiBUaGlzIGFsbG93cyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHVzIHRvIGV4cGVyaW1lbnQgd2l0aCBkaWZmZXJlbnQgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBoaW50aW5nIHNjaGVtZXMgd2l0aG91dCBoYXZpbmcgdG8gICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY2hhbmdlICd0MW9ianMnIGVhY2ggdGltZS4uICAgICAgICAqLworICB9IFQxX1NpemVSZWM7CisKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICBUMV9HbHlwaFNsb3QgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRydWVEb2MgZ2x5cGggcmVjb3JkLi4gICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIAorICB0eXBlZGVmIHN0cnVjdCBUMV9HbHlwaFNsb3RSZWNfCisgIHsKKyAgICBGVF9HbHlwaFNsb3RSZWMgIHJvb3Q7CisKKyAgICBUMV9Cb29sICAgICAgICAgIGhpbnQ7CisgICAgVDFfQm9vbCAgICAgICAgICBzY2FsZWQ7CisgICAgCisgICAgVDFfSW50ICAgICAgICAgICBtYXhfcG9pbnRzOworICAgIFQxX0ludCAgICAgICAgICAgbWF4X2NvbnRvdXJzOworCisgICAgRlRfRml4ZWQgICAgICAgICB4X3NjYWxlOworICAgIEZUX0ZpeGVkICAgICAgICAgeV9zY2FsZTsKKworICAgIFQxX0dseXBoX0hpbnRzKiAgaGludHM7ICAvKiBkZWZpbmVkIGluIHRoZSBoaW50ZXIgKi8KKworICB9IFQxX0dseXBoU2xvdFJlYzsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICA8RnVuY3Rpb24+ICBUMV9Jbml0X0ZhY2UKKyAqCisgKiAgPERlc2NyaXB0aW9uPgorICogICAgIEluaXRpYWxpc2UgYSBnaXZlbiBUeXBlIDEgZmFjZSBvYmplY3QKKyAqCisgKiAgPElucHV0PgorICogICAgIGZhY2VfaW5kZXggOjogaW5kZXggb2YgZm9udCBmYWNlIGluIHJlc291cmNlCisgKiAgICAgcmVzb3VyY2UgICA6OiBzb3VyY2UgZm9udCByZXNvdXJjZQorICogICAgIGZhY2UgICAgICAgOjogIGZhY2UgcmVjb3JkIHRvIGJ1aWxkCisgKgorICogIDxSZXR1cm4+CisgKiAgICAgRXJyb3IgY29kZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIExPQ0FMX0RFRgorICBUMV9FcnJvciAgVDFfSW5pdF9GYWNlKCBGVF9TdHJlYW0gICAgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgZmFjZV9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVDFfRmFjZSAgICAgIGZhY2UgKTsKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIDxGdW5jdGlvbj4gVDFfRG9uZV9GYWNlCisgKgorICogIDxEZXNjcmlwdGlvbj4KKyAqICAgICBGaW5hbGlzZSBhIGdpdmVuIGZhY2Ugb2JqZWN0CisgKgorICogIDxJbnB1dD4KKyAqICAgICBmYWNlICA6OiBoYW5kbGUgIHRvIHRoZSBmYWNlIG9iamVjdCB0byBkZXN0cm95CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICBMT0NBTF9ERUYKKyAgdm9pZCAgVDFfRG9uZV9GYWNlKCBUMV9GYWNlICBmYWNlICk7CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICA8RnVuY3Rpb24+IFQxX0luaXRfU2l6ZQorICoKKyAqICA8RGVzY3JpcHRpb24+CisgKiAgICAgSW5pdGlhbGlzZSBhIG5ldyBUeXBlIDEgc2l6ZSBvYmplY3QKKyAqCisgKiAgPElucHV0PgorICogICAgIHNpemUgIDo6IGhhbmRsZSB0byBzaXplIG9iamVjdAorICoKKyAqICA8UmV0dXJuPgorICogICAgIFR5cGUgMSBlcnJvciBjb2RlLiAwIG1lYW5zIHN1Y2Nlc3MuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICBMT0NBTF9ERUYKKyAgVDFfRXJyb3IgIFQxX0luaXRfU2l6ZSggVDFfU2l6ZSAgc2l6ZSApOworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiA8RnVuY3Rpb24+ICBUMV9Eb25lX1NpemUKKyAqCisgKiA8RGVzY3JpcHRpb24+CisgKiAgICBUaGUgVHlwZSAxIHNpemUgb2JqZWN0IGZpbmFsaXNlci4KKyAqCisgKiA8SW5wdXQ+CisgKiAgICBzaXplICAgOjogaGFuZGxlIHRvIHRoZSB0YXJnZXQgc2l6ZSBvYmplY3QuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICBMT0NBTF9ERUYKKyAgdm9pZCAgVDFfRG9uZV9TaXplKCBUMV9TaXplICBzaXplICk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiA8RnVuY3Rpb24+ICBUMV9SZXNldF9TaXplCisgKgorICogPERlc2NyaXB0aW9uPgorICogICAgUmVzZXQgYSBUeXBlIDEgc2l6ZSB3aGVuIHJlc29sdXRpb25zIGFuZCBjaGFyYWN0ZXIgZGltZW5zaW9ucworICogICAgaGF2ZSBiZWVuIGNoYW5nZWQuLgorICoKKyAqIDxJbnB1dD4KKyAqICAgIHNpemUgICA6OiBoYW5kbGUgdG8gdGhlIHRhcmdldCBzaXplIG9iamVjdC4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIExPQ0FMX0RFRgorICBUMV9FcnJvciAgVDFfUmVzZXRfU2l6ZSggVDFfU2l6ZSAgc2l6ZSApOworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgPEZ1bmN0aW9uPiBUMV9Jbml0X0dseXBoU2xvdAorICoKKyAqICA8RGVzY3JpcHRpb24+IFRoZSBUcnVlVHlwZSBnbHlwaCBzbG90IGluaXRpYWxpc2VyCisgKgorICogIDxJbnB1dD4gIGdseXBoIDo6ICBnbHlwaCByZWNvcmQgdG8gYnVpbGQuCisgKgorICogIDxPdXRwdXQ+IEVycm9yIGNvZGUuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICBMT0NBTF9ERUYKKyAgVDFfRXJyb3IgIFQxX0luaXRfR2x5cGhTbG90KCBUMV9HbHlwaFNsb3QgIHNsb3QgKTsKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIDxGdW5jdGlvbj4gVDFfRG9uZV9HbHlwaFNsb3QKKyAqCisgKiAgPERlc2NyaXB0aW9uPiBUaGUgVHlwZSAxIGdseXBoIHNsb3QgZmluYWxpc2VyCisgKgorICogIDxJbnB1dD4gIGdseXBoICA6OiBoYW5kbGUgdG8gZ2x5cGggc2xvdCBvYmplY3QKKyAqCisgKiAgPE91dHB1dD4gIEVycm9yIGNvZGUuICAgICAgICAgICAgICAgICAgICAgICAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIExPQ0FMX0RFRgorICB2b2lkICBUMV9Eb25lX0dseXBoU2xvdCggVDFfR2x5cGhTbG90ICBzbG90ICk7CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICA8RnVuY3Rpb24+ICBUMV9Jbml0X0RyaXZlcgorICoKKyAqICA8RGVzY3JpcHRpb24+CisgKiAgICAgSW5pdGlhbGlzZSBhIGdpdmVuIFR5cGUgMSBkcml2ZXIgb2JqZWN0CisgKgorICogIDxJbnB1dD4KKyAqICAgICBkcml2ZXIgOjogIGhhbmRsZSB0byB0YXJnZXQgZHJpdmVyIG9iamVjdAorICoKKyAqICA8UmV0dXJuPgorICogICAgIEVycm9yIGNvZGUuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICBMT0NBTF9ERUYKKyAgVDFfRXJyb3IgIFQxX0luaXRfRHJpdmVyKCBUMV9Ecml2ZXIgIGRyaXZlciApOworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgPEZ1bmN0aW9uPiBUMV9Eb25lX0RyaXZlcgorICoKKyAqICA8RGVzY3JpcHRpb24+CisgKiAgICAgZmluYWxpc2UgYSBnaXZlbiBUeXBlIDEgZHJpdmVyCisgKgorICogIDxJbnB1dD4KKyAqICAgICBkcml2ZXIgIDo6IGhhbmRsZSB0byB0YXJnZXQgVHlwZSAxIGRyaXZlcgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgTE9DQUxfREVGCisgIHZvaWQgIFQxX0RvbmVfRHJpdmVyKCBUMV9Ecml2ZXIgIGRyaXZlciApOworCisjaWZkZWYgX19jcGx1c3BsdXMKKyAgfQorI2VuZGlmCisKKyNlbmRpZiAvKiBUMU9CSlNfSCAqLworCisKKy8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3R5cGUxL3QxcGFyc2UuYyBiL3NyYy90eXBlMS90MXBhcnNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM3MTBiMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90eXBlMS90MXBhcnNlLmMKQEAgLTAsMCArMSw2NjUgQEAKKyNpbmNsdWRlIDxmdGRlYnVnLmg+CisjaW5jbHVkZSA8dDF0eXBlcy5oPgorI2luY2x1ZGUgPHQxcGFyc2UuaD4KKworI2luY2x1ZGUgPHN0ZGlvLmg+ICAvKiBmb3Igc3NjYW5mICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA8RnVuY3Rpb24+IFQxX05ld19UYWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJbml0aWFsaXNlIGEgVDFfVGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICB0YWJsZSAgOjogYWRkcmVzcyBvZiB0YXJnZXQgdGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIGNvdW50ICA6OiB0YWJsZSBzaXplID0gbWF4aW11bSBudW1iZXIgb2YgZWxlbWVudHMgICAgICAgICAgICAgICAgICAqLworLyogICAgbWVtb3J5IDo6IG1lbW9yeSBvYmplY3QgdG8gdXNlIGZvciBhbGwgc3Vic2VxdWVudCByZWFsbG9jYXRpb25zICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRXJyb3IgY29kZS4gMCBtZWFucyBzdWNjZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICBMT0NBTF9GVU5DCisgIFQxX0Vycm9yICBUMV9OZXdfVGFibGUoIFQxX1RhYmxlKiAgdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFQxX0ludCAgICAgY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX01lbW9yeSAgbWVtb3J5ICkKKyAgeworCSBUMV9FcnJvciAgZXJyb3I7CisKKwkgdGFibGUtPm1lbW9yeSA9IG1lbW9yeTsKKwkgaWYgKCBBTExPQ19BUlJBWSggdGFibGUtPmVsZW1lbnRzLCBjb3VudCwgVDFfQnl0ZSogKSApCisJCSByZXR1cm4gZXJyb3I7CisKKwkgaWYgKCBBTExPQ19BUlJBWSggdGFibGUtPmxlbmd0aHMsIGNvdW50LCBUMV9CeXRlKiApICkKKwkgeworCSAgIEZSRUUoIHRhYmxlLT5lbGVtZW50cyApOworCSAgIHJldHVybiBlcnJvcjsKKwl9CisKKwl0YWJsZS0+bWF4X2VsZW1zID0gY291bnQ7CisJdGFibGUtPm51bV9lbGVtcyA9IDA7CisKKwl0YWJsZS0+YmxvY2sgICAgICAgID0gMDsKKwl0YWJsZS0+Y2FwYWNpdHkgICAgID0gMDsKKwl0YWJsZS0+Y3Vyc29yICAgICAgID0gMDsKKworCXJldHVybiBlcnJvcjsKKyAgfQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIDxGdW5jdGlvbj4gVDFfQWRkX1RhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFkZHMgYW4gb2JqZWN0IHRvIGEgVDFfVGFibGUsIHBvc3NpYmx5IGdyb3dpbmcgaXRzIG1lbW9yeSBibG9jayAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIHRhYmxlICA6OiB0YXJnZXQgdGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgaW5kZXggIDo6IGluZGV4IG9mIG9iamVjdCBpbiB0YWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBvYmplY3QgOjogYWRkcmVzcyBvZiBvYmplY3QgdG8gY29weSBpbiBtZW1vcnkgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIGxlbmd0aCA6OiBsZW5ndGggaW4gYnl0ZXMgb2Ygc291cmNlIG9iamVjdCAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEVycm9yIGNvZGUuIDAgbWVhbnMgc3VjY2Vzcy4gQW4gZXJyb3IgaXMgcmV0dXJuZWQgd2hlbiBhICAgICAgICAgICAqLworLyogICAgcmVhbGxvYyBmYWlsZWQuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICAgICAgc3RhdGljCisgICAgICBUMV9FcnJvciAgcmVhbGxvY2F0ZV90MV90YWJsZSggVDFfVGFibGUqICB0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUMV9JbnQgICAgIG5ld19zaXplICkKKyAgICAgIHsKKyAgICAgICAgRlRfTWVtb3J5ICBtZW1vcnkgICA9IHRhYmxlLT5tZW1vcnk7CisgICAgICAgIFQxX0J5dGUqICAgb2xkX2Jhc2UgPSB0YWJsZS0+YmxvY2s7CisgICAgICAgIFQxX0Vycm9yICAgZXJyb3I7CisKKyAgICAgICAgLyogcmVhbGxvYyB0aGUgYmFzZSBibG9jayAqLworICAgICAgICBpZiAoIFJFQUxMT0MoIHRhYmxlLT5ibG9jaywgdGFibGUtPmNhcGFjaXR5LCBuZXdfc2l6ZSApICkKKyAgICAgICAgICByZXR1cm4gZXJyb3I7CisgICAgICAgIHRhYmxlLT5jYXBhY2l0eSA9IG5ld19zaXplOworCisgICAgICAgIC8qIHNoaWZ0IGFsbCBvZmZzZXRzIHdoZW4gbmVlZGVkICovCisgICAgICAgIGlmIChvbGRfYmFzZSkKKyAgICAgICAgeworICAgICAgICAgIFQxX0xvbmcgICBkZWx0YSAgPSB0YWJsZS0+YmxvY2sgLSBvbGRfYmFzZTsKKyAgICAgICAgICBUMV9CeXRlKiogb2Zmc2V0ID0gdGFibGUtPmVsZW1lbnRzOworICAgICAgICAgIFQxX0J5dGUqKiBsaW1pdCAgPSBvZmZzZXQgKyB0YWJsZS0+bWF4X2VsZW1zOworCisgICAgICAgICAgaWYgKGRlbHRhKQorICAgICAgICAgICAgZm9yICggOyBvZmZzZXQgPCBsaW1pdDsgb2Zmc2V0ICsrICkKKyAgICAgICAgICAgICAgaWYgKG9mZnNldFswXSkKKyAgICAgICAgICAgICAgICBvZmZzZXRbMF0gKz0gZGVsdGE7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gVDFfRXJyX09rOworICAgICAgfQorCisKKyAgTE9DQUxfRlVOQworICBUMV9FcnJvciAgVDFfQWRkX1RhYmxlKCBUMV9UYWJsZSogIHRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUMV9JbnQgICAgIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgIG9iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVDFfSW50ICAgICBsZW5ndGggKQorICB7CisJaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+IHRhYmxlLT5tYXhfZWxlbXMpCisgICAgeworCSAgRlRfRVJST1IoKCAiVDEuQWRkX1RhYmxlOiBpbnZhbGlkIGluZGV4XG4iICkpOworCSAgcmV0dXJuIFQxX0Vycl9TeW50YXhfRXJyb3I7CisgICAgfQorCisgICAgLyogZ3JvdyB0aGUgYmFzZSBibG9jayBpZiBuZWVkZWQgKi8KKyAgICBpZiAoIHRhYmxlLT5jdXJzb3IgKyBsZW5ndGggPiB0YWJsZS0+Y2FwYWNpdHkgKQorICAgIHsKKyAgICAgIFQxX0Vycm9yICBlcnJvcjsKKyAgICAgIFQxX0ludCAgICBuZXdfc2l6ZSA9IHRhYmxlLT5jYXBhY2l0eTsKKworICAgICAgd2hpbGUgKCBuZXdfc2l6ZSA8IHRhYmxlLT5jdXJzb3IrbGVuZ3RoICkKKyAgICAgICAgbmV3X3NpemUgKz0gMTAyNDsKKworICAgICAgZXJyb3IgPSByZWFsbG9jYXRlX3QxX3RhYmxlKCB0YWJsZSwgbmV3X3NpemUgKTsKKyAgICAgIGlmIChlcnJvcikgcmV0dXJuIGVycm9yOworICAgIH0KKworICAgIC8qIGFkZCB0aGUgb2JqZWN0IHRvIHRoZSBiYXNlIGJsb2NrIGFuZCBhZGp1c3Qgb2Zmc2V0ICovCisgICAgdGFibGUtPmVsZW1lbnRzWyBpbmRleCBdID0gdGFibGUtPmJsb2NrICsgdGFibGUtPmN1cnNvcjsKKyAgICB0YWJsZS0+bGVuZ3RocyBbIGluZGV4IF0gPSBsZW5ndGg7CisgICAgTUVNX0NvcHkoIHRhYmxlLT5ibG9jayArIHRhYmxlLT5jdXJzb3IsIG9iamVjdCwgbGVuZ3RoICk7CisKKyAgICB0YWJsZS0+Y3Vyc29yICs9IGxlbmd0aDsKKyAgICByZXR1cm4gVDFfRXJyX09rOworICB9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIDxGdW5jdGlvbj4gVDFfRG9uZV9UYWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZpbmFsaXNlIGEgVDFfVGFibGUuIChyZWFsbG9jIGl0IHRvIGl0cyBjdXJyZW50IGN1cnNvcikuICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIHRhYmxlIDo6IHRhcmdldCB0YWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIFRoaXMgZnVuY3Rpb24gZG9lcyBOT1QgcmVsZWFzZSB0aGUgaGVhcCdzIG1lbW9yeSBibG9jay4gSXQgaXMgdXAgICAqLworLyogICAgdG8gdGhlIGNhbGxlciB0byBjbGVhbiBpdCwgb3IgcmVmZXJlbmNlIGl0IGluIGl0cyBvd24gc3RydWN0dXJlcy4gICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgTE9DQUxfRlVOQworICB2b2lkICBUMV9Eb25lX1RhYmxlKCBUMV9UYWJsZSogIHRhYmxlICkKKyAgeworICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gdGFibGUtPm1lbW9yeTsKKyAgICBUMV9FcnJvciAgIGVycm9yOworICAgIFQxX0J5dGUqICAgb2xkX2Jhc2U7CisKKyAgICAvKiBzaG91bGQgbmV2ZXIgZmFpbCwgYXMgcmVjLmN1cnNvciA8PSByZWMuc2l6ZSAqLworICAgIG9sZF9iYXNlID0gdGFibGUtPmJsb2NrOworICAgIGlmICghb2xkX2Jhc2UpCisgICAgICByZXR1cm47CisgICAgCisgICAgKHZvaWQpUkVBTExPQyggdGFibGUtPmJsb2NrLCB0YWJsZS0+Y2FwYWNpdHksIHRhYmxlLT5jdXJzb3IgKTsKKyAgICB0YWJsZS0+Y2FwYWNpdHkgPSB0YWJsZS0+Y3Vyc29yOworICAgIAorICAgIGlmIChvbGRfYmFzZSAhPSB0YWJsZS0+YmxvY2spCisgICAgeworICAgICAgVDFfTG9uZyAgIGRlbHRhICAgPSB0YWJsZS0+YmxvY2sgLSBvbGRfYmFzZTsKKyAgICAgIFQxX0J5dGUqKiBlbGVtZW50ID0gdGFibGUtPmVsZW1lbnRzOworICAgICAgVDFfQnl0ZSoqIGxpbWl0ICAgPSBlbGVtZW50ICsgdGFibGUtPm1heF9lbGVtczsKKyAgICAgIAorICAgICAgZm9yICggOyBlbGVtZW50IDwgbGltaXQ7IGVsZW1lbnQrKyApCisgICAgICAgIGlmIChlbGVtZW50WzBdKQorICAgICAgICAgIGVsZW1lbnRbMF0gKz0gZGVsdGE7CisgICAgfQorICB9CisKKworICBMT0NBTF9GVU5DCisgIFQxX1N0cmluZyogICBDb3B5U3RyaW5nKCBUMV9QYXJzZXIqICBwYXJzZXIgKQorICB7CisgICAgVDFfU3RyaW5nKiAgc3RyaW5nID0gTlVMTDsKKyAgICBUMV9Ub2tlbiogICB0b2tlbiAgPSBwYXJzZXItPmFyZ3MrKzsKKyAgICBGVF9NZW1vcnkgICBtZW1vcnkgPSBwYXJzZXItPnRva2VuaXplci0+bWVtb3J5OworICAgIFQxX0Vycm9yICAgIGVycm9yOworCisgICAgaWYgKCB0b2tlbi0+a2luZCA9PSB0b2tfc3RyaW5nICkKKyAgICB7CisgICAgICBpbnQgIGxlbiA9IHRva2VuLT5sZW4tMjsKKworICAgICAgaWYgKCBBTExPQyggc3RyaW5nLCBsZW4rMSApICkKKyAgICAgIHsKKyAgICAgICAgcGFyc2VyLT5lcnJvciA9IGVycm9yOworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKworICAgICAgTUVNX0NvcHkoIHN0cmluZywgcGFyc2VyLT50b2tlbml6ZXItPmJhc2UgKyB0b2tlbi0+c3RhcnQrMSwgbGVuICk7CisgICAgICBzdHJpbmdbbGVuXSA9ICdcMCc7CisKKyAgICAgIHBhcnNlci0+ZXJyb3IgPSBUMV9FcnJfT2s7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBGVF9FUlJPUigoICJUMS5Db3B5U3RyaW5nIDogc3ludGF4IGVycm9yLCBzdHJpbmcgdG9rZW4gZXhwZWN0ZWQgIVxuIiApKTsKKyAgICAgIHBhcnNlci0+ZXJyb3IgPSBUMV9FcnJfU3ludGF4X0Vycm9yOworICAgIH0KKyAgICByZXR1cm4gc3RyaW5nOworICB9CisKKworCisgIHN0YXRpYworICBUMV9FcnJvciAgcGFyc2VfaW50KCBUMV9CeXRlKiAgYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgVDFfQnl0ZSogIGxpbWl0LAorICAgICAgICAgICAgICAgICAgICAgICBUMV9Mb25nKiAgcmVzdWx0ICkKKyAgeworICAgIFQxX0Jvb2wgIHNpZ24gPSAwOworICAgIFQxX0xvbmcgIHN1bSAgPSAwOworCisgICAgaWYgKGJhc2UgPj0gbGltaXQpCisgICAgICBnb3RvIEZhaWw7CisKKyAgICAvKiBjaGVjayBzaWduICovCisgICAgaWYgKCAqYmFzZSA9PSAnKycgKQorICAgICAgYmFzZSsrOworCisgICAgZWxzZSBpZiAoICpiYXNlID09ICctJyApCisgICAgeworICAgICAgc2lnbisrOworICAgICAgYmFzZSsrOworICAgIH0KKworICAgIC8qIHBhcnNlIGRpZ2l0cyAqLworICAgIGlmICggYmFzZSA+PSBsaW1pdCApCisgICAgICBnb3RvIEZhaWw7CisKKyAgICBkbworICAgIHsKKyAgICAgIHN1bSA9ICggMTAqc3VtICsgKCpiYXNlKysgLSAnMCcpICk7CisKKyAgICB9IHdoaWxlIChiYXNlIDwgbGltaXQpOworCisgICAgaWYgKHNpZ24pCisgICAgICBzdW0gPSAtc3VtOworCisgICAgKnJlc3VsdCA9IHN1bTsKKyAgICByZXR1cm4gVDFfRXJyX09rOworCisgIEZhaWw6CisgICAgRlRfRVJST1IoKCAiVDEucGFyc2VfaW50ZWdlciA6IGludGVnZXIgZXhwZWN0ZWRcbiIgKSk7CisgICAgKnJlc3VsdCA9IDA7CisgICAgcmV0dXJuIFQxX0Vycl9TeW50YXhfRXJyb3I7CisgIH0KKworCisKKworICBzdGF0aWMKKyAgVDFfRXJyb3IgIHBhcnNlX2Zsb2F0KCBUMV9CeXRlKiAgYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBUMV9CeXRlKiAgbGltaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgVDFfSW50ICAgIHNjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgIFQxX0xvbmcqICByZXN1bHQgKQorICB7CisjaWYgMQorICAgIC8qIFhYWCA6IFdlJ3JlIHNpbXBseSBtdWNoIHRvbyBsYXp5IHRvIGNvZGUgdGhpcyBmdW5jdGlvbiAgKi8KKyAgICAvKiAgICAgICBwcm9wZXJseSBmb3Igbm93Li4gV2UnbGwgZG8gdGhhdCB3aGVuIHRoZSByZXN0IG9mICovCisgICAgLyogICAgICAgdGhlIGRyaXZlciB3b3JrcyBwcm9wZXJseS4uICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGNoYXIgICAgdGVtcFszMl07CisgICAgaW50ICAgICBsZW4gPSBsaW1pdC1iYXNlOworICAgIGRvdWJsZSAgdmFsdWU7CisKKyAgICBpZiAobGVuID4gMzEpIGdvdG8gRmFpbDsKKworICAgIHN0cm5jcHkoIHRlbXAsIChjaGFyKiliYXNlLCBsZW4gKTsKKyAgICB0ZW1wW2xlbl0gPSAnXDAnOworICAgIGlmICggc3NjYW5mKCB0ZW1wLCAiJWxmIiwgJnZhbHVlICkgIT0gMSApCisgICAgICBnb3RvIEZhaWw7CisKKyAgICAqcmVzdWx0ID0gKFQxX0xvbmcpKHNjYWxlKnZhbHVlKTsKKyAgICByZXR1cm4gMDsKKworI2Vsc2UKKyAgVDFfQnl0ZSogIGN1cjsKKyAgVDFfQm9vbCAgIHNpZ24gICAgICAgID0gMDsgIC8qIHNpZ24gICAgICAgICAgICAgICAgICAgICAgICAqLworICBUMV9Mb25nICAgbnVtYmVyX2ludCAgPSAwOyAgLyogaW50ZWdlciBwYXJ0ICAgICAgICAgICAgICAgICovCisgIFQxX0xvbmcgICBudW1iZXJfZnJhYyA9IDA7ICAvKiBmcmFjdGlvbmFsIHBhcnQgICAgICAgICAgICAgKi8KKyAgVDFfTG9uZyAgIGV4cG9uZW50ICAgID0gMDsgIC8qIGV4cG9uZW50IHZhbHVlICAgICAgICAgICAgICAqLworICBUMV9JbnQgICAgbnVtX2ZyYWMgICAgPSAwOyAgLyogbnVtYmVyIG9mIGZyYWN0aW9uYWwgZGlnaXRzICovCisKKyAgLyogY2hlY2sgc2lnbiAqLworICBpZiAoKmJhc2UgPT0gJysnKQorICAgIGJhc2UrKzsKKworICBlbHNlIGlmICgqYmFzZSA9PSAnLScpCisgIHsKKyAgICBzaWduKys7CisgICAgYmFzZSsrOworICB9CisKKyAgLyogZmluZCBpbnRlZ2VyIHBhcnQgKi8KKyAgY3VyID0gYmFzZTsKKyAgd2hpbGUgKCBjdXIgPCBsaW1pdCApCisgIHsKKyAgICBUMV9CeXRlICBjID0gKmN1cjsKKyAgICBpZiAoIGMgPT0gJy4nIHx8IGMgPT0gJ2UnIHx8IGMgPT0gJ0UnICkKKyAgICAgIGJyZWFrOworCisgICAgY3VyKys7CisgIH0KKworICBpZiAoIGN1ciA+IGJhc2UgKQorICB7CisgICAgZXJyb3IgPSBwYXJzZV9pbnRlZ2VyKCBiYXNlLCBjdXIsICZudW1iZXJfaW50ICk7CisgICAgaWYgKGVycm9yKSBnb3RvIEZhaWw7CisgIH0KKworICAvKiByZWFkIGZyYWN0aW9uYWwgcGFydCwgaWYgYW55ICovCisgIGlmICggKmN1ciA9PSAnLicgKQorICB7CisgICAgY3VyKys7CisgICAgYmFzZSA9IGN1cjsKKyAgICB3aGlsZSAoIGN1ciA8IGxpbWl0ICkKKyAgICB7CisgICAgICBUMV9CeXRlICBjID0gKmN1cjsKKyAgICAgIGlmICggYyA9PSAnZScgfHwgYyA9PSAnRScgKQorICAgICAgICBicmVhazsKKyAgICAgIGN1cisrOworICAgIH0KKworICAgIG51bV9mcmFjID0gY3VyIC0gYmFzZTsKKworICAgIGlmICggY3VyID4gYmFzZSApCisgICAgeworICAgICAgZXJyb3IgPSBwYXJzZV9pbnRlZ2VyKCBiYXNlLCBjdXIsICZudW1iZXJfZnJhYyApOworICAgICAgaWYgKGVycm9yKSBnb3RvIEZhaWw7CisgICAgICBiYXNlID0gY3VyOworICAgIH0KKyAgfQorCisgIC8qIHJlYWQgZXhwb25lbnQsIGlmIGFueSAqLworICBpZiAoICpjdXIgPT0gJ2UnIHx8ICpjdXIgPT0gJ0UnICkKKyAgeworICAgIGN1cisrOworICAgIGJhc2UgPSBjdXI7CisgICAgZXJyb3IgPSBwYXJzZV9pbnRlZ2VyKCBiYXNlLCBsaW1pdCwgJmV4cG9uZW50ICk7CisgICAgaWYgKGVycm9yKSBnb3RvIEZhaWw7CisKKyAgICAvKiBub3cgY2hlY2sgdGhhdCBleHBvbmVudCBpcyB3aXRoaW4gJ2NvcnJlY3QgYm91bmRzJyAqLworICAgIC8qIGkuZS4gYmV0d2VlbiAtNiBhbmQgNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgaWYgKCBleHBvbmVudCA8IC02IHx8IGV4cG9uZW50ID4gNiApCisgICAgICBnb3RvIEZhaWw7CisgIH0KKworICAvKiBub3cgYWRqdXN0IGludGVnZXIgdmFsdWUgYW5kIGV4cG9uZW50IGZvciBmcmFjdGlvbmFsIHBhcnQgKi8KKyAgd2hpbGUgKCBudW1fZnJhYyA+IDAgKQorICB7CisgICAgbnVtYmVyX2ludCAqPSAxMDsKKyAgICBleHBvbmVudCAgIC0tOworICAgIG51bV9mcmFjLS07CisgIH0KKworICBudW1iZXJfaW50ICs9IG51bV9mcmFjOworCisgIC8qIHNraXAgcG9pbnQgaWYgYW55LCByZWFkIGZyYWN0aW9uYWwgcGFydCAqLworICBpZiAoIGN1cisxIDwgbGltaXQgKQorICB7CisgICAgaWYgKCpjdXIKKyAgfQorCisgIC8qIG5vdyBjb21wdXRlIHNjYWxlZCBmbG9hdCB2YWx1ZSAqLworICAvKiBYWFhYWCA6IGluY29tcGxldGUgISEhICAgICAgICAgKi8KKyNlbmRpZgorCisgIEZhaWw6CisgICAgRlRfRVJST1IoKCAiVDEucGFyc2VfZmxvYXQgOiBzeW50YXggZXJyb3IgIVxuIiApKTsKKyAgICByZXR1cm4gVDFfRXJyX1N5bnRheF9FcnJvcjsKKyAgfQorCisKKworICBzdGF0aWMKKyAgVDFfRXJyb3IgIHBhcnNlX2ludGVnZXIoIFQxX0J5dGUqICBiYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVDFfQnl0ZSogIGxpbWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVDFfTG9uZyogIHJlc3VsdCApCisgIHsKKyAgICBUMV9CeXRlKiAgY3VyOworCisgICAgLyogdGhlIGxleGljYWwgYW5hbHlzZXIgYWNjZXB0cyBmbG9hdHMgYXMgd2VsbCBhcyBpbnRlZ2VycyAqLworICAgIC8qIG5vdywgY2hlY2sgdGhhdCB3ZSByZWFsbHkgaGF2ZSBhbiBpbnQgaW4gdGhpcyB0b2tlbiAgICAgKi8KKyAgICBjdXIgPSBiYXNlOworICAgIHdoaWxlICggY3VyIDwgbGltaXQgKQorICAgIHsKKyAgICAgIFQxX0J5dGUgIGMgPSAqY3VyKys7CisKKyAgICAgIGlmICggYyA9PSAnLicgfHwgYyA9PSAnZScgfHwgYyA9PSAnRScgKQorICAgICAgICBnb3RvIEZsb2F0X051bWJlcjsKKyAgICB9CisKKyAgICAvKiBub3cgcmVhZCB0aGUgbnVtYmVyJ3MgdmFsdWUgKi8KKyAgICByZXR1cm4gcGFyc2VfaW50KCBiYXNlLCBsaW1pdCwgcmVzdWx0ICk7CisKKyAgRmxvYXRfTnVtYmVyOgorICAgIC8qIFdlIHJlYWxseSBoYXZlIGEgZmxvYXQgdGhlcmUsIHNpbXBseSBjYWxsIHBhcnNlX2Zsb2F0IGluIHRoaXMgKi8KKyAgICAvKiBjYXNlIHdpdGggYSBzY2FsZSBvZiAnMTAnIHRvIHBlcmZvcm0gcm91bmQuLiAgICAgICAgICAgICAgICAqLworICAgIHsKKyAgICAgIFQxX0Vycm9yIGVycm9yOworCisgICAgICBlcnJvciA9IHBhcnNlX2Zsb2F0KCBiYXNlLCBsaW1pdCwgMTAsIHJlc3VsdCApOworICAgICAgaWYgKCFlcnJvcikKKyAgICAgIHsKKyAgICAgICAgaWYgKCpyZXN1bHQgPj0gMCkgKnJlc3VsdCA9ICgqcmVzdWx0KzUpLzEwOyAgICAgIC8qIHJvdW5kIHZhbHVlICovCisgICAgICAgICAgICAgICAgICAgIGVsc2UgICpyZXN1bHQgPSAtKCg1LSpyZXN1bHQpLzEwKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBlcnJvcjsKKyAgICB9CisgIH0KKworCisgIExPQ0FMX0ZVTkMKKyAgVDFfTG9uZyAgQ29weUludGVnZXIoIFQxX1BhcnNlciogIHBhcnNlciApCisgIHsKKyAgICBUMV9Mb25nICAgc3VtICAgPSAwOworICAgIFQxX1Rva2VuKiB0b2tlbiA9IHBhcnNlci0+YXJncysrOworCisgICAgaWYgKCB0b2tlbi0+a2luZCA9PSB0b2tfbnVtYmVyICkKKyAgICB7CisgICAgICBUMV9CeXRlKiAgYmFzZSAgPSBwYXJzZXItPnRva2VuaXplci0+YmFzZSArIHRva2VuLT5zdGFydDsKKyAgICAgIFQxX0J5dGUqICBsaW1pdCA9IGJhc2UgKyB0b2tlbi0+bGVuOworCisgICAgICAvKiBub3cgcmVhZCB0aGUgbnVtYmVyJ3MgdmFsdWUgKi8KKyAgICAgIHBhcnNlci0+ZXJyb3IgPSBwYXJzZV9pbnRlZ2VyKCBiYXNlLCBsaW1pdCwgJnN1bSApOworICAgICAgcmV0dXJuIHN1bTsKKyAgICB9CisKKyAgICBGVF9FUlJPUigoICJUMS5Db3B5SW50ZWdlciA6IG51bWJlciBleHBlY3RlZFxuIiApKTsKKyAgICBwYXJzZXItPmFyZ3MtLTsKKyAgICBwYXJzZXItPmVycm9yID0gVDFfRXJyX1N5bnRheF9FcnJvcjsKKyAgICByZXR1cm4gMDsKKyAgfQorCisKKworICBMT0NBTF9GVU5DCisgIFQxX0Jvb2wgICBDb3B5Qm9vbGVhbiggVDFfUGFyc2VyKiAgcGFyc2VyICkKKyAgeworICAgIFQxX0Vycm9yICBlcnJvciAgPSBUMV9FcnJfT2s7CisgICAgVDFfQm9vbCAgIHJlc3VsdCA9IDA7CisgICAgVDFfVG9rZW4qIHRva2VuICA9IHBhcnNlci0+YXJncysrOworCisgICAgaWYgKCB0b2tlbi0+a2luZCA9PSB0b2tfa2V5d29yZCApCisgICAgeworICAgICAgaWYgKCB0b2tlbi0+a2luZDIgPT0ga2V5X2ZhbHNlICkKKyAgICAgICAgcmVzdWx0ID0gMDsKKworICAgICAgZWxzZSBpZiAoIHRva2VuLT5raW5kMiA9PSBrZXlfdHJ1ZSApCisgICAgICAgIHJlc3VsdCA9ICEwOworCisgICAgICBlbHNlCisgICAgICAgIGdvdG8gRmFpbDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIEZhaWw6CisgICAgICAgIEZUX0VSUk9SKCggIlQxLkNvcHlCb29sZWFuIDogc3ludGF4IGVycm9yLCAnZmFsc2UnIG9yICd0cnVlJyBleHBlY3RlZFxuIiApKTsKKyAgICAgICAgZXJyb3IgPSBUMV9FcnJfU3ludGF4X0Vycm9yOworICAgIH0KKyAgICBwYXJzZXItPmVycm9yID0gZXJyb3I7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisKKworCisgIExPQ0FMX0ZVTkMKKyAgVDFfTG9uZyAgIENvcHlGbG9hdCggVDFfUGFyc2VyKiAgcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICBUMV9JbnQgICAgICBzY2FsZSApCisgIHsKKyAgICBUMV9FcnJvciAgZXJyb3I7CisgICAgVDFfTG9uZyAgIHN1bSA9IDA7CisgICAgVDFfVG9rZW4qIHRva2VuID0gcGFyc2VyLT5hcmdzKys7CisKKyAgICBpZiAoIHRva2VuLT5raW5kID09IHRva19udW1iZXIgKQorICAgIHsKKyAgICAgIFQxX0J5dGUqICBiYXNlICA9IHBhcnNlci0+dG9rZW5pemVyLT5iYXNlICsgdG9rZW4tPnN0YXJ0OworICAgICAgVDFfQnl0ZSogIGxpbWl0ID0gYmFzZSArIHRva2VuLT5sZW47CisKKyAgICAgIGVycm9yID0gcGFyc2VyLT5lcnJvciA9IHBhcnNlX2Zsb2F0KCBiYXNlLCBsaW1pdCwgc2NhbGUsICZzdW0gKTsKKyAgICAgIGlmIChlcnJvcikgZ290byBGYWlsOworCisgICAgICByZXR1cm4gc3VtOworICAgIH0KKworICBGYWlsOgorICAgIEZUX0VSUk9SKCggIlQxLkNvcHlGbG9hdCA6IHN5bnRheCBlcnJvciAhXG4iICkpOworICAgIHBhcnNlci0+ZXJyb3IgPSBUMV9FcnJfU3ludGF4X0Vycm9yOworICAgIHJldHVybiAwOworICB9CisKKworCisKKworCisgIExPQ0FMX0ZVTkMKKyAgdm9pZCAgQ29weUJCb3goIFQxX1BhcnNlciogIHBhcnNlciwKKyAgICAgICAgICAgICAgICAgIFQxX0JCb3gqICAgIGJib3ggKQorICB7CisgICAgVDFfVG9rZW4qIHRva2VuID0gcGFyc2VyLT5hcmdzKys7CisgICAgVDFfSW50ICAgIG47CisgICAgVDFfRXJyb3IgIGVycm9yOworCisgICAgaWYgKCB0b2tlbi0+a2luZCA9PSB0b2tfcHJvZ3JhbSB8fAorICAgICAgICAgdG9rZW4tPmtpbmQgPT0gdG9rX2FycmF5ICAgKQorICAgIHsKKyAgICAgIC8qIGdldCByaWQgb2YgJ1snLyddJywgb3IgJ3snLyd9JyAqLworICAgICAgVDFfQnl0ZSogIGJhc2UgID0gcGFyc2VyLT50b2tlbml6ZXItPmJhc2UgKyB0b2tlbi0+c3RhcnQgKyAxOworICAgICAgVDFfQnl0ZSogIGxpbWl0ID0gYmFzZSArIHRva2VuLT5sZW4gLSAxOworICAgICAgVDFfQnl0ZSogIGN1cjsKKyAgICAgIFQxX0J5dGUqICBzdGFydDsKKworICAgICAgLyogcmVhZCBlYWNoIHBhcmFtZXRlciBpbmRlcGVuZGVudGx5ICovCisgICAgICBjdXIgPSBiYXNlOworICAgICAgZm9yICggbiA9IDA7IG4gPCA0OyBuKysgKQorICAgICAgeworICAgICAgICBUMV9Mb25nKiAgcmVzdWx0OworCisgICAgICAgIC8qIHNraXAgd2hpdGVzcGFjZSAqLworICAgICAgICB3aGlsZSAoY3VyIDwgbGltaXQgJiYgKmN1ciA9PSAnICcpIGN1cisrOworCisgICAgICAgIC8qIHNraXAgbnVtYmVycyAqLworICAgICAgICBzdGFydCA9IGN1cjsKKyAgICAgICAgd2hpbGUgKGN1ciA8IGxpbWl0ICYmICpjdXIgIT0gJyAnKSBjdXIrKzsKKworICAgICAgICAvKiBjb21wdXRlIHJlc3VsdCBhZGRyZXNzICovCisgICAgICAgIHN3aXRjaCAobikKKyAgICAgICAgeworICAgICAgICAgIGNhc2UgMCA6IHJlc3VsdCA9ICZiYm94LT54TWluOyBicmVhazsKKyAgICAgICAgICBjYXNlIDEgOiByZXN1bHQgPSAmYmJveC0+eU1pbjsgYnJlYWs7CisgICAgICAgICAgY2FzZSAyIDogcmVzdWx0ID0gJmJib3gtPnhNYXg7IGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6IHJlc3VsdCA9ICZiYm94LT55TWF4OworICAgICAgICB9CisKKyAgICAgICAgZXJyb3IgPSBwYXJzZV9pbnRlZ2VyKCBzdGFydCwgY3VyLCByZXN1bHQgKTsKKyAgICAgICAgaWYgKGVycm9yKSBnb3RvIEZhaWw7CisgICAgICB9CisgICAgICBwYXJzZXItPmVycm9yID0gMDsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgRmFpbDoKKyAgICBGVF9FUlJPUigoICJUMS5Db3B5QkJveCA6IHN5bnRheCBlcnJvciAhXG4iICkpOworICAgIHBhcnNlci0+ZXJyb3IgPSBUMV9FcnJfU3ludGF4X0Vycm9yOworICB9CisKKworCisKKyAgTE9DQUxfRlVOQworICB2b2lkICBDb3B5TWF0cml4KCBUMV9QYXJzZXIqICBwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgIFQxX01hdHJpeCogIG1hdHJpeCApCisgIHsKKyAgICBUMV9Ub2tlbiogdG9rZW4gPSBwYXJzZXItPmFyZ3MrKzsKKyAgICBUMV9FcnJvciAgZXJyb3I7CisKKyAgICBpZiAoIHRva2VuLT5raW5kID09IHRva19hcnJheSApCisgICAgeworICAgICAgLyogZ2V0IHJpZCBvZiAnWycgYW5kICddJyAqLworICAgICAgVDFfQnl0ZSogIGJhc2UgID0gcGFyc2VyLT50b2tlbml6ZXItPmJhc2UgKyB0b2tlbi0+c3RhcnQgKyAxOworICAgICAgVDFfQnl0ZSogIGxpbWl0ID0gYmFzZSArIHRva2VuLT5sZW4gLSAxOworICAgICAgVDFfQnl0ZSogIGN1cjsKKyAgICAgIFQxX0J5dGUqICBzdGFydDsKKyAgICAgIFQxX0ludCAgICBuOworCisgICAgICAvKiByZWFkIGVhY2ggcGFyYW1ldGVyIGluZGVwZW5kZW50bHkgKi8KKyAgICAgIGN1ciA9IGJhc2U7CisgICAgICBmb3IgKCBuID0gMDsgbiA8IDQ7IG4rKyApCisgICAgICB7CisgICAgICAgIFQxX0xvbmcqICByZXN1bHQ7CisKKyAgICAgICAgLyogc2tpcCB3aGl0ZXNwYWNlICovCisgICAgICAgIHdoaWxlIChjdXIgPCBsaW1pdCAmJiAqY3VyID09ICcgJykgY3VyKys7CisKKyAgICAgICAgLyogc2tpcCBudW1iZXJzICovCisgICAgICAgIHN0YXJ0ID0gY3VyOworICAgICAgICB3aGlsZSAoY3VyIDwgbGltaXQgJiYgKmN1ciAhPSAnICcpIGN1cisrOworCisgICAgICAgIC8qIGNvbXB1dGUgcmVzdWx0IGFkZHJlc3MgKi8KKyAgICAgICAgc3dpdGNoIChuKQorICAgICAgICB7CisgICAgICAgICAgY2FzZSAwIDogcmVzdWx0ID0gJm1hdHJpeC0+eHg7IGJyZWFrOworICAgICAgICAgIGNhc2UgMSA6IHJlc3VsdCA9ICZtYXRyaXgtPnh5OyBicmVhazsKKyAgICAgICAgICBjYXNlIDIgOiByZXN1bHQgPSAmbWF0cml4LT55eDsgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDogcmVzdWx0ID0gJm1hdHJpeC0+eXk7CisgICAgICAgIH0KKworICAgICAgICBlcnJvciA9IHBhcnNlX2Zsb2F0KCBzdGFydCwgY3VyLCA2NTUzNjAwMCwgcmVzdWx0ICk7CisgICAgICAgIGlmIChlcnJvcikgZ290byBGYWlsOworICAgICAgfQorICAgICAgcGFyc2VyLT5lcnJvciA9IDA7CisgICAgICByZXR1cm47CisgICAgfQorCisgIEZhaWw6CisgICAgRlRfRVJST1IoKCAiVDEuQ29weU1hdHJpeCA6IHN5bnRheCBlcnJvciAhXG4iICkpOworICAgIHBhcnNlci0+ZXJyb3IgPSBUMV9FcnJfU3ludGF4X0Vycm9yOworICB9CisKKworCisgIExPQ0FMX0ZVTkMKKyAgdm9pZCAgQ29weUFycmF5KCBUMV9QYXJzZXIqICBwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgVDFfQnl0ZSogICAgbnVtX2VsZW1lbnRzLAorICAgICAgICAgICAgICAgICAgIFQxX1Nob3J0KiAgIGVsZW1lbnRzLAorICAgICAgICAgICAgICAgICAgIFQxX0ludCAgICAgIG1heF9lbGVtZW50cyApCisgIHsKKyAgICBUMV9Ub2tlbiogdG9rZW4gPSBwYXJzZXItPmFyZ3MrKzsKKyAgICBUMV9FcnJvciAgZXJyb3I7CisKKyAgICBpZiAoIHRva2VuLT5raW5kID09IHRva19hcnJheSAgIHx8CisgICAgICAgICB0b2tlbi0+a2luZCA9PSB0b2tfcHJvZ3JhbSApICAgLyogaW4gdGhlIGNhc2Ugb2YgTWluRmVhdHVyZSAqLworICAgIHsKKyAgICAgIC8qIGdldCByaWQgb2YgJ1snLyddJywgb3IgJ3snLyd9JyAqLworICAgICAgVDFfQnl0ZSogIGJhc2UgID0gcGFyc2VyLT50b2tlbml6ZXItPmJhc2UgKyB0b2tlbi0+c3RhcnQgKyAxOworICAgICAgVDFfQnl0ZSogIGxpbWl0ID0gYmFzZSArIHRva2VuLT5sZW4gLSAyOworICAgICAgVDFfQnl0ZSogIGN1cjsKKyAgICAgIFQxX0J5dGUqICBzdGFydDsKKyAgICAgIFQxX0ludCAgICBuOworCisgICAgICAvKiByZWFkIGVhY2ggcGFyYW1ldGVyIGluZGVwZW5kZW50bHkgKi8KKyAgICAgIGN1ciA9IGJhc2U7CisgICAgICBmb3IgKCBuID0gMDsgbiA8IG1heF9lbGVtZW50czsgbisrICkKKyAgICAgIHsKKyAgICAgICAgVDFfTG9uZyAgcmVzdWx0OworCisgICAgICAgIC8qIHRlc3QgZW5kIG9mIHN0cmluZyAqLworICAgICAgICBpZiAoY3VyID49IGxpbWl0KQorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIC8qIHNraXAgd2hpdGVzcGFjZSAqLworICAgICAgICB3aGlsZSAoY3VyIDwgbGltaXQgJiYgKmN1ciA9PSAnICcpIGN1cisrOworCisgICAgICAgIC8qIGVuZCBvZiBsaXN0ID8gKi8KKyAgICAgICAgaWYgKGN1ciA+PSBsaW1pdCkKKyAgICAgICAgICBicmVhazsKKworICAgICAgICAvKiBza2lwIG51bWJlcnMgKi8KKyAgICAgICAgc3RhcnQgPSBjdXI7CisgICAgICAgIHdoaWxlIChjdXIgPCBsaW1pdCAmJiAqY3VyICE9ICcgJykgY3VyKys7CisKKyAgICAgICAgZXJyb3IgPSBwYXJzZV9pbnRlZ2VyKCBzdGFydCwgY3VyLCAmcmVzdWx0ICk7CisgICAgICAgIGlmIChlcnJvcikgZ290byBGYWlsOworCisgICAgICAgICplbGVtZW50cyArKyA9IChUMV9TaG9ydClyZXN1bHQ7CisgICAgICB9CisKKyAgICAgIGlmIChudW1fZWxlbWVudHMpCisgICAgICAgICpudW1fZWxlbWVudHMgPSAoVDFfQnl0ZSluOworCisgICAgICBwYXJzZXItPmVycm9yID0gMDsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgRmFpbDoKKyAgICBGVF9FUlJPUigoICJUMS5Db3B5QXJyYXkgOiBzeW50YXggZXJyb3IgIVxuIiApKTsKKyAgICBwYXJzZXItPmVycm9yID0gVDFfRXJyX1N5bnRheF9FcnJvcjsKKyAgfQorCmRpZmYgLS1naXQgYS9zcmMvdHlwZTEvdDFwYXJzZS5oIGIvc3JjL3R5cGUxL3QxcGFyc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmI3MTgxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3R5cGUxL3QxcGFyc2UuaApAQCAtMCwwICsxLDI5NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgdDFwYXJzZS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4wCisgKgorICogICAgVHlwZTEgcGFyc2VyLgorICoKKyAqICBDb3B5cmlnaHQgMTk5Ni0xOTk4IGJ5CisgKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQKKyAqICBtb2RpZmllZCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqCisgKiAgVGhlIFR5cGUxIHBhcnNlciBjb21wb25lbnQgaXMgaW4gY2hhcmdlIG9mIHNpbXBseSBwYXJzaW5nCisgKiAgdGhlIGZvbnQgaW5wdXQgc3RyZWFtIGFuZCBjb252ZXJ0IHNpbXBsZSB0b2tlbnMgYW5kIGVsZW1lbnRzCisgKiAgaW50byBpbnRlZ2VycywgZmxvYXRzLCBtYXRyaWNlcywgc3RyaW5ncywgZXRjLi4KKyAqCisgKiAgSXQgaXMgdXNlZCBieSB0aGUgVHlwZTEgbG9hZGVyLi4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIFQxUEFSU0VfSAorI2RlZmluZSBUMVBBUlNFX0gKKworI2luY2x1ZGUgPGZ0c3RyZWFtLmg+CisjaW5jbHVkZSA8dDF0b2tlbnMuaD4KKworI2lmZGVmIF9fY3BsdXNwbHVzCisgIGV4dGVybiAiQyIgeworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogPEVudW0+IFQxX0RpY3RTdGF0ZQorICoKKyAqIDxEZXNjcmlwdGlvbj4KKyAqICAgIEFuIGVudW1lcmF0aW9uIHVzZWQgdG8gZGVzY3JpYmUgdGhlIFR5cGUgMSBwYXJzZXIncyBzdGF0ZSwgaS5lLgorICogICAgd2hpY2ggZGljdGlvbmFyeSAob3IgYXJyYXkpIGl0IGlzIHNjYW5uaW5nIGFuZCBwcm9jZXNzaW5nIGF0IHRoZQorICogICAgY3VycmVudCBtb21lbnQuLgorICoKKyAqLworICB0eXBlZGVmIGVudW0gIFQxX0RpY3RTdGF0ZV8KKyAgeworICAgIGRpY3Rfbm9uZSA9IDAsCisgICAgZGljdF9mb250LCAgICAgICAgICAvKiBwYXJzaW5nIHRoZSBmb250IGRpY3Rpb25hcnkgICAgICAgICAgICAgICovCisgICAgZGljdF9mb250aW5mbywgICAgICAvKiBwYXJzaW5nIHRoZSBmb250IGluZm8gZGljdGlvbmFyeSAgICAgICAgICovCisgICAgZGljdF9ub25lMiwgICAgICAgICAvKiBiZWdpbm5pbmcgdG8gcGFyc2UgdGhlIGVuY3J5cHRlZCBzZWN0aW9uICovCisgICAgZGljdF9wcml2YXRlLCAgICAgICAvKiBwYXJzaW5nIHRoZSBwcml2YXRlIGRpY3Rpb25hcnkgICAgICAgICAgICovCisgICAgZGljdF9lbmNvZGluZywgICAgICAvKiBwYXJzaW5nIHRoZSBlbmNvZGluZyBhcnJheSAgICAgICAgICAgICAgICovCisgICAgZGljdF9zdWJycywgICAgICAgICAvKiBwYXJzaW5nIHRoZSBzdWJycyBhcnJheSAgICAgICAgICAgICAgICAgICovCisgICAgZGljdF9vdGhlcnN1YnJzLCAgICAvKiBwYXJzaW5nIHRoZSBvdGhlcnN1YnJzIGFycmF5ICg/KSAgICAgICAgICovCisgICAgZGljdF9jaGFyc3RyaW5ncywgICAvKiBwYXJzaW5nIHRoZSBjaGFyc3RyaW5ncyBkaWN0aW9uYXJ5ICAgICAgICovCisgICAgZGljdF91bmtub3duX2FycmF5LCAvKiBwYXJzaW5nL2lnbm9yaW5nIGFuIHVua25vd24gYXJyYXkgICAgICAgICovCisgICAgZGljdF91bmtub3duX2RpY3QsICAvKiBwYXJzaW5nL2lnbm9yaW5nIGFuIHVua25vd24gZGljdGlvbmFyeSAgICovCisKKyAgICBkaWN0X21heCAgICAvKiBkbyBub3QgcmVtb3ZlIGZyb20gbGlzdCAqLworCisgIH0gVDFfRGljdFN0YXRlOworCisKKyAgdHlwZWRlZiBlbnVtIFQxX0VuY29kaW5nVHlwZV8KKyAgeworCWVuY29kaW5nX25vbmUgPSAwLAorCWVuY29kaW5nX2FycmF5LAorCWVuY29kaW5nX3N0YW5kYXJkLAorCWVuY29kaW5nX2V4cGVydAorCisgIH0gVDFfRW5jb2RpbmdUeXBlOworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiA8U3RydWN0PiBUMV9UYWJsZQorICoKKyAqIDxEZXNjcmlwdGlvbj4KKyAqICAgIEEgVDFfVGFibGUgaXMgYSBzaW1wbGUgb2JqZWN0IHVzZWQgdG8gc3RvcmUgYW4gYXJyYXkgb2Ygb2JqZWN0cworICogICAgaW4gYSBzaW5nbGUgbWVtb3J5IGJsb2NrLgorICoKKyAqIDxGaWVsZHM+CisgKiAgICBibG9jayAgICAgOjogYWRkcmVzcyBpbiBtZW1vcnkgb2YgdGhlIGdyb3doZWFwJ3MgYmxvY2suIFRoaXMKKyAqICAgICAgICAgICAgICAgICBjYW4gY2hhbmdlIGJldHdlZW4gdHdvIG9iamVjdCBhZGRzLCBkdWUgdG8gdGhlIHVzZQorICogICAgICAgICAgICAgICAgIG9mICdyZWFsbG9jJy4KKyAqCisgKiAgICBjdXJzb3IgICAgOjogY3VycmVudCB0b3Agb2YgdGhlIGdyb3cgaGVhcCB3aXRoaW4gaXRzIGJsb2NrCisgKgorICogICAgY2FwYWNpdHkgIDo6IGN1cnJlbnQgc2l6ZSBvZiB0aGUgaGVhcCBibG9jay4gSW5jcmVtZW50cyBieSAxIEtiCisgKgorICogICAgbWF4X2VsZW1zIDo6IG1heGltdW0gbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRhYmxlCisgKiAgICBudW1fZWxlbXMgOjogY3VycmVudCBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGFibGUKKyAqCisgKiAgICBlbGVtZW50cyAgOjogdGFibGUgb2YgZWxlbWVudCBhZGRyZXNzZXMgd2l0aGluIHRoZSBibG9jaworICogICAgbGVuZ3RocyAgIDo6IHRhYmxlIG9mIGVsZW1lbnQgc2l6ZXMgd2l0aGluIHRoZSBibG9jaworICoKKyAqICAgIHN5c3RlbSAgIDo6IHN5c3RlbSBvYmplY3QgdXNlZCBmb3IgbWVtb3J5IG9wZXJhdGlvbnMgKGFsbG9jL3JlYWxsb2MpCisgKi8KKworICB0eXBlZGVmIHN0cnVjdCBUMV9UYWJsZV8KKyAgeworICAgIFQxX0J5dGUqICAgYmxvY2s7ICAgICAgICAgIC8qIGN1cnJlbnQgbWVtb3J5IGJsb2NrICAgICAgICAgICAqLworICAgIFQxX0ludCAgICAgY3Vyc29yOyAgICAgICAgIC8qIGN1cnJlbnQgY3Vyc29yIGluIG1lbW9yeSBibG9jayAqLworICAgIFQxX0ludCAgICAgY2FwYWNpdHk7ICAgICAgIC8qIGN1cnJlbnQgc2l6ZSBvZiBtZW1vcnkgYmxvY2sgICAqLworCisgICAgVDFfSW50ICAgICBtYXhfZWxlbXM7CisgICAgVDFfSW50ICAgICBudW1fZWxlbXM7CisgICAgVDFfQnl0ZSoqICBlbGVtZW50czsgICAgICAgLyogYWRkcmVzc2VzIG9mIHRhYmxlIGVsZW1lbnRzICovCisgICAgVDFfSW50KiAgICBsZW5ndGhzOyAgICAgICAgLyogbGVuZ3RocyBvZiB0YWJsZSBlbGVtZW50cyAgICovCisKKyAgICBGVF9NZW1vcnkgIG1lbW9yeTsKKworICB9IFQxX1RhYmxlOworCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPFN0cnVjdD4gVDFfUGFyc2VyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQSBUeXBlIDEgcGFyc2VyLiBUaGlzIG9iamVjdCBpcyBpbiBjaGFyZ2Ugb2YgcGFyc2luZyBUeXBlIDEgICAgICAgICovCisvKiAgICBBU0NJSSBzdHJlYW1zIGFuZCBidWlsZHMgZGljdGlvbmFyaWVzIGZvciBhIFQxX0ZhY2Ugb2JqZWN0LiAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBlcnJvciA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgIGN1cnJlbnQgZXJyb3IgY29kZS4gMCBtZWFucyBzdWNjZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBmYWNlICA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgIHRoZSB0YXJnZXQgVDFfRmFjZSBvYmplY3QgYmVpbmcgYnVpbHQgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICB0b2tlbml6ZXIgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgIHRoZSB0b2tlbml6ZXIgKGxleGljYWwgYW5hbHlzZXIpIHVzZWQgZm9yIHByb2Nlc3NpbmcgdGhlICAgICAgICAqLworLyogICAgICAgaW5wdXQgc3RyZWFtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIHN0YWNrIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgdGhlIGN1cnJlbnQgdG9rZW4gc3RhY2suIE5vdGUgdGhhdCB3ZSBkb24ndCB1c2UgaW50ZXJtZWRpYXRlICAgICovCisvKiAgICAgICBQb3N0c2NyaXB0IG9iamVjdHMgaGVyZSAhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgdG9wIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICBjdXJyZW50IHRvcCBvZiB0b2tlbiBzdGFjayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgbGltaXQgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICBjdXJyZW50IHVwcGVyIGJvdW5kIG9mIHRoZSB0b2tlbiBzdGFjay4gVXNlZCBmb3Igb3ZlcmZsb3cgICAgICAgKi8KKy8qICAgICAgIGNoZWNrcy4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBhcmdzIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgIGFyZ3VtZW50cyBvZiBhIGdpdmVuIG9wZXJhdG9yLiB1c2VkIGFuZCBpbmNyZWFzZWQgYnkgdGhlICAgICAgICAqLworLyogICAgICAgQ29weS4uLi4gZnVuY3Rpb25zLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIHN0YXRlX2luZGV4IDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgaW5kZXggb2YgdG9wIG9mIHRoZSBkaWN0aW9uYXJ5IHN0YXRlIHN0YWNrICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIHN0YXRlX3N0YWNrIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgZGljdGlvbmFyeSBzdGF0ZXMgc3RhY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIHRhYmxlIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgYSBUMV9UYWJsZSBvYmplY3QgdXNlZCB0byByZWNvcmQgdmFyaW91cyBraW5kcyBvZiAgICAgICAgICAgICAgICovCisvKiAgICAgICBkaWN0aW9uYXJpZXMgb3IgYXJyYXlzIChsaWtlIC9FbmNvZGluZywgL1N1YnJzLCAvQ2hhclN0cmluZ3MpICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgIHN0cnVjdCAgVDFfUGFyc2VyXworICB7CisgICAgVDFfRXJyb3IgICAgICBlcnJvcjsKKyAgICBUMV9GYWNlICAgICAgIGZhY2U7CisKKyAgICBUMV9Ub2tlbml6ZXIgIHRva2VuaXplcjsKKyAgICBUMV9Cb29sICAgICAgIGR1bXBfdG9rZW5zOworCisgICAgVDFfVG9rZW4gICAgICBzdGFja1sgVDFfTUFYX1NUQUNLX0RFUFRIIF07CisgICAgVDFfVG9rZW4qICAgICB0b3A7CisgICAgVDFfVG9rZW4qICAgICBsaW1pdDsKKyAgICBUMV9Ub2tlbiogICAgIGFyZ3M7CisKKyAgICBUMV9JbnQgICAgICAgIHN0YXRlX2luZGV4OworICAgIFQxX0RpY3RTdGF0ZSAgc3RhdGVfc3RhY2tbIFQxX01BWF9ESUNUX0RFUFRIIF07CisKKwlUMV9UYWJsZSAgICAgIHRhYmxlOworCisJVDFfSW50ICAgICAgICBjdXJfbmFtZTsKKworCVQxX0VuY29kaW5nVHlwZSAgZW5jb2RpbmdfdHlwZTsKKyAgICBUMV9CeXRlKiAgICAgICAgIGVuY29kaW5nX25hbWVzOworICAgIFQxX0ludCogICAgICAgICAgZW5jb2RpbmdfbGVuZ3RoczsKKyAgICBUMV9CeXRlKiogICAgICAgIGVuY29kaW5nX29mZnNldHM7CisKKyAgICBUMV9CeXRlKiAgICAgIHN1YnJzOworICAgIFQxX0J5dGUqICAgICAgY2hhcnN0cmluZ3M7CisKKyAgfSBUMV9QYXJzZXI7CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPEZ1bmN0aW9uPiBUMV9OZXdfVGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSW5pdGlhbGlzZSBhIFQxX1RhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgdGFibGUgIDo6IGFkZHJlc3Mgb2YgdGFyZ2V0IHRhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBjb3VudCAgOjogdGFibGUgc2l6ZSA9IG1heGltdW0gbnVtYmVyIG9mIGVsZW1lbnRzICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIHN5c3RlbSA6OiBzeXN0ZW0gb2JqZWN0IHRvIHVzZSBmb3IgYWxsIHN1YnNlcXVlbnQgcmVhbGxvY2F0aW9ucyAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEVycm9yIGNvZGUuIDAgbWVhbnMgc3VjY2VzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIExPQ0FMX0RFRgorICBUMV9FcnJvciAgVDFfTmV3X1RhYmxlKCBUMV9UYWJsZSogIHRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUMV9JbnQgICAgIGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9NZW1vcnkgIG1lbW9yeSApOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA8RnVuY3Rpb24+IFQxX0FkZF9UYWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBZGRzIGFuIG9iamVjdCB0byBhIFQxX1RhYmxlLCBwb3NzaWJseSBncm93aW5nIGl0cyBtZW1vcnkgYmxvY2sgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICB0YWJsZSAgOjogdGFyZ2V0IHRhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIGluZGV4ICA6OiBpbmRleCBvZiBvYmplY3QgaW4gdGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgb2JqZWN0IDo6IGFkZHJlc3Mgb2Ygb2JqZWN0IHRvIGNvcHkgaW4gbWVtb3J5ICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBsZW5ndGggOjogbGVuZ3RoIGluIGJ5dGVzIG9mIHNvdXJjZSBvYmplY3QgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBFcnJvciBjb2RlLiAwIG1lYW5zIHN1Y2Nlc3MuIEFuIGVycm9yIGlzIHJldHVybmVkIHdoZW4gYSAgICAgICAgICAgKi8KKy8qICAgIHJlYWxsb2MgZmFpbGVkLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIExPQ0FMX0RFRgorICBUMV9FcnJvciAgVDFfQWRkX1RhYmxlKCBUMV9UYWJsZSogIHRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUMV9JbnQgICAgIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgIG9iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVDFfSW50ICAgICBsZW5ndGggKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPEZ1bmN0aW9uPiBUMV9Eb25lX1RhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRmluYWxpc2UgYSBUMV9UYWJsZS4gKHJlYWxsb2MgaXQgdG8gaXRzIGN1cnJlbnQgY3Vyc29yKS4gICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgdGFibGUgOjogdGFyZ2V0IHRhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgVGhpcyBmdW5jdGlvbiBkb2VzIE5PVCByZWxlYXNlIHRoZSBoZWFwJ3MgbWVtb3J5IGJsb2NrLiBJdCBpcyB1cCAgICovCisvKiAgICB0byB0aGUgY2FsbGVyIHRvIGNsZWFuIGl0LCBvciByZWZlcmVuY2UgaXQgaW4gaXRzIG93biBzdHJ1Y3R1cmVzLiAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBMT0NBTF9ERUYKKyAgdm9pZCAgVDFfRG9uZV9UYWJsZSggVDFfVGFibGUqICB0YWJsZSApOworCisKKworCisgIExPQ0FMX0RFRgorICBUMV9TdHJpbmcqICAgQ29weVN0cmluZyggVDFfUGFyc2VyKiAgcGFyc2VyICk7CisKKworICBMT0NBTF9ERUYKKyAgVDFfTG9uZyAgICAgIENvcHlJbnRlZ2VyKCBUMV9QYXJzZXIqICBwYXJzZXIgKTsKKworCisgIExPQ0FMX0RFRgorICBUMV9Cb29sICAgICAgQ29weUJvb2xlYW4oIFQxX1BhcnNlciogIHBhcnNlciApOworCisKKyAgTE9DQUxfREVGCisgIFQxX0xvbmcgICAgICBDb3B5RmxvYXQoIFQxX1BhcnNlciogIHBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVDFfSW50ICAgICAgc2NhbGUgKTsKKworICBMT0NBTF9ERUYKKyAgdm9pZCAgICAgICAgIENvcHlCQm94KCBUMV9QYXJzZXIqICBwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgVDFfQkJveCogICAgYmJveCApOworCisgIExPQ0FMX0RFRgorICB2b2lkICAgICAgICAgQ29weU1hdHJpeCggVDFfUGFyc2VyKiAgcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVDFfTWF0cml4KiAgbWF0cml4ICk7CisKKyAgTE9DQUxfREVGCisgIHZvaWQgIENvcHlBcnJheSggVDFfUGFyc2VyKiAgcGFyc2VyLAorICAgICAgICAgICAgICAgICAgIFQxX0J5dGUqICAgIG51bV9lbGVtZW50cywKKyAgICAgICAgICAgICAgICAgICBUMV9TaG9ydCogICBlbGVtZW50cywKKyAgICAgICAgICAgICAgICAgICBUMV9JbnQgICAgICBtYXhfZWxlbWVudHMgKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCisgIH0KKyNlbmRpZgorCisjZW5kaWYgLyogVDFQQVJTRV9IICovCisKKworLyogRU5EICovCisKZGlmZiAtLWdpdCBhL3NyYy90eXBlMS90MXRva2Vucy5jIGIvc3JjL3R5cGUxL3QxdG9rZW5zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA2OWQ2OQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90eXBlMS90MXRva2Vucy5jCkBAIC0wLDAgKzEsOTk0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICB0MXRva2Vucy5jCisgKgorICogIFR5cGUgMSB0b2tlbml6ZXIKKyAqCisgKiAgQ29weXJpZ2h0IDE5OTYgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZAorICogIG1vZGlmaWVkIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSBvciBkaXN0cmlidXRlCisgKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqCisgKiAgVGhlIHRva2VuaXplciBpcyBpbiBjaGFyZ2Ugb2YgbG9hZGluZyBhbmQgcmVhZGluZyBhIFR5cGUxIGZvbnQKKyAqICBmaWxlIChlaXRoZXIgaW4gUEZCIG9yIFBGQSBmb3JtYXQpLCBhbmQgZXh0cmFjdCBzdWNjZXNzaXZlIHRva2VucworICogIGFuZCBrZXl3b3JkcyBmcm9tIGl0cyB0d28gc3RyZWFtcyAoaS5lLiB0aGUgZm9udCBwcm9ncmFtLCBhbmQgdGhlCisgKiAgcHJpdmF0ZSBkaWN0aW9uYXJ5KS4KKyAqCisgKiAgRWV4ZWMgZGVjcnlwdGlvbiBpcyBwZXJmb3JtZWQgYXV0b21hdGljYWxseSB3aGVuIGVudGVyaW5nIHRoZQorICogIHByaXZhdGUgZGljdGlvbmFyeSwgb3Igd2hlbiByZXRyaWV2aW5nIGNoYXIgc3RyaW5ncy4uCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGZ0c3RyZWFtLmg+CisjaW5jbHVkZSA8ZnRkZWJ1Zy5oPgorCisjaW5jbHVkZSA8dDF0b2tlbnMuaD4KKyNpbmNsdWRlIDx0MWxvYWQuaD4KKworI3VuZGVmICBSRUFEX0JVRkZFUl9JTkNSRU1FTlQKKyNkZWZpbmUgUkVBRF9CVUZGRVJfSU5DUkVNRU5UICAweDQwMAorCisjdW5kZWYgIEZUX0NPTVBPTkVOVAorI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX3QxbG9hZAorCisgIC8qIGFycmF5IG9mIFR5cGUxIGtleXdvcmRzIHN1cHBvcnRlZCBieSB0aGlzIGVuZ2luZS4gVGhpcyB0YWJsZSBwbGFjZXMgKi8KKyAgLyogdGhlIGtleXdvcmQgaW4gbGV4aWNvZ3JhcGhpY2FsIG9yZGVyLiBJdCBzaG91bGQgYWx3YXlzIGNvcnJlc3BvbmQgICAqLworICAvKiB0byB0aGUgZW51bXMga2V5X1hYWFggISEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgY29uc3QgIGNoYXIqICB0MV9rZXl3b3Jkc1sga2V5X21heCAtIGtleV9maXJzdF8gXSA9CisgIHsKKyAgICAiLXwiLCAiRXhwZXJ0RW5jb2RpbmciLCAiTkQiLCAiTlAiLCAiUkQiLCAiU3RhbmRhcmRFbmNvZGluZyIsICJhcnJheSIsCisJImJlZ2luIiwgImNsb3NlZmlsZSIsICJjdXJyZW50ZGljdCIsICJjdXJyZW50ZmlsZSIsICJkZWYiLCAiZGljdCIsICJkdXAiLAorCSJlZXhlYyIsICJlbmQiLCAiZXhlY3V0ZW9ubHkiLCAiZmFsc2UiLCAiZm9yIiwgImluZGV4IiwJIm5vYWNjZXNzIiwKKwkicHV0IiwgInJlYWRvbmx5IiwgInRydWUiLCAidXNlcmRpY3QiLCAifCIsICJ8LSIKKyAgfTsKKworCisKKyAgY29uc3QgIGNoYXIqICB0MV9pbW1lZGlhdGVzWyBpbW1fbWF4IC0gaW1tX2ZpcnN0XyBdID0KKyAgeworICAgICItfCIsICIubm90ZGVmIiwgIkJsdWVGdXp6IiwgIkJsdWVTY2FsZSIsICJCbHVlU2hpZnQiLCAiQmx1ZVZhbHVlcyIsCisgICAgIkNoYXJTdHJpbmdzIiwgIkVuY29kaW5nIiwgIkZhbWlseUJsdWVzIiwgIkZhbWlseU5hbWUiLCAiRmFtaWx5T3RoZXJCbHVlcyIsCisgICAgIkZJRCIsICJGb250QkJveCIsICJGb250SUQiLCAiRm9udEluZm8iLCAiRm9udE1hdHJpeCIsICJGb250TmFtZSIsCisgICAgIkZvbnRUeXBlIiwgIkZvcmNlQm9sZCIsICJGdWxsTmFtZSIsICJJdGFsaWNBbmdsZSIsICJMYW5ndWFnZUdyb3VwIiwKKyAgICAiTWV0cmljcyIsICJNaW5GZWF0dXJlIiwgIk5EIiwgIk5QIiwgIk5vdGljZSIsICJPdGhlckJsdWVzIiwgIk90aGVyU3VicnMiLAorICAgICJQYWludFR5cGUiLCAiUHJpdmF0ZSIsICJSRCIsICJSbmRTdGVtVXAiLCAiU3RkSFciLCAiU3RkVlciLCAiU3RlbVNuYXBIIiwKKyAgICAiU3RlbVNuYXBWIiwgIlN0cm9rZVdpZHRoIiwgIlN1YnJzIiwgIlVuZGVybGluZVBvc2l0aW9uIiwKKyAgICAiVW5kZXJsaW5lVGhpY2tuZXNzIiwgIlVuaXF1ZUlEIiwgIldlaWdodCIsICJpc0ZpeGVkUGl0Y2giLCAibGVuSVYiLAorICAgICJwYXNzd29yZCIsICJ2ZXJzaW9uIiwgInwiLCAifC0iCisgIH07CisKKworICAvKiBsZXhpY29ncmFwaGljIGNvbXBhcmlzb24gb2YgdHdvIHN0cmluZ3MgKi8KKyAgc3RhdGljCisgIGludCAgbGV4aWNvX3N0cmNtcCggY29uc3QgY2hhciogIHN0cjEsCisgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgIHN0cjFfbGVuLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICBzdHIyICkKKyAgeworICAgIGludCAgYzIgPSAwOworCisgICAgZm9yICggOyBzdHIxX2xlbiA+IDA7IHN0cjFfbGVuLS0gKQorICAgIHsKKyAgICAgIGludCBjMSwgZGlmZjsKKworICAgICAgYzEgPSAqc3RyMSsrOworICAgICAgYzIgPSAqc3RyMisrOworCisgICAgICBkaWZmID0gYzEgLSBjMjsKKyAgICAgIGlmIChkaWZmKSByZXR1cm4gZGlmZjsKKyAgICB9OworICAgIHJldHVybiAtKnN0cjI7CisgIH0KKworCisgIC8qIEZpbmQgYSBnaXZlbiB0b2tlbi9uYW1lLCBwZXJmb3JtIGJpbmFyeSBzZWFyY2ggKi8KKyAgc3RhdGljCisgIGludCAgRmluZF9OYW1lKCBjaGFyKiAgYmFzZSwgaW50ICBsZW5ndGgsCisgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiogdGFibGUsIGludCAgdGFibGVfbGVuICkKKyAgeworICAgIC8qIHBlcmZvcm1zIGEgYmluYXJ5IHNlYXJjaCAqLworCisgICAgVDFfSW50ICBsZWZ0LCByaWdodDsKKworICAgIGxlZnQgID0gMDsKKyAgICByaWdodCA9IHRhYmxlX2xlbi0xOworCisgICAgd2hpbGUgKCByaWdodC1sZWZ0ID4gMSApCisgICAgeworICAgICAgVDFfSW50ICBtaWRkbGUgPSBsZWZ0ICsgKCggcmlnaHQtbGVmdCApID4+IDEpOworICAgICAgVDFfSW50ICBjbXA7CisKKyAgICAgIGNtcCA9IGxleGljb19zdHJjbXAoIGJhc2UsIGxlbmd0aCwgdGFibGVbbWlkZGxlXSApOworICAgICAgaWYgKCFjbXApIHJldHVybiBtaWRkbGU7CisKKyAgICAgIGlmICggY21wIDwgMCApCisgICAgICAgIHJpZ2h0ID0gbWlkZGxlOworICAgICAgZWxzZQorICAgICAgICBsZWZ0ICA9IG1pZGRsZTsKKyAgICB9CisKKyAgICBpZiAoICFsZXhpY29fc3RyY21wKCBiYXNlLCBsZW5ndGgsIHRhYmxlW2xlZnQgXSApICkgcmV0dXJuIGxlZnQ7CisgICAgaWYgKCAhbGV4aWNvX3N0cmNtcCggYmFzZSwgbGVuZ3RoLCB0YWJsZVtyaWdodF0gKSApIHJldHVybiByaWdodDsKKworICAgIHJldHVybiAtMTsKKyAgfQorCisKKyAgLyogcmVhZCB0aGUgc21hbGwgUEZCIHNlY3Rpb24gaGVhZGVyICovCisgIHN0YXRpYworICBUMV9FcnJvciAgUmVhZF9QRkJfVGFnKCBGVF9TdHJlYW0gIHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVDFfVVNob3J0KiBhdGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUMV9VTG9uZyogIGFzaXplICkKKyAgeworICAgIFQxX1VTaG9ydCB0YWc7CisgICAgVDFfVUxvbmcgIHNpemU7CisgICAgVDFfRXJyb3IgIGVycm9yOworCisgICAgRlRfVFJBQ0UyKCggIlJlYWRfUEZCX1RhZyA6IHJlYWRpbmdcbiIgKSk7CisKKyAgICBpZiAoIEFDQ0VTU19GcmFtZSggNkwgKSApIHJldHVybiBlcnJvcjsKKworICAgIHRhZyAgPSBHRVRfVVNob3J0KCk7CisgICAgc2l6ZSA9IEdFVF9VTG9uZygpOworCisgICAgRk9SR0VUX0ZyYW1lKCk7CisKKyAgICAqYXRhZyAgPSB0YWc7CisgICAgKmFzaXplID0gKCAgKHNpemUgICAgICAgICYgMHhGRikgPDwgMjQgKSB8CisgICAgICAgICAgICAgKCAoKHNpemUgPj4gOCkgICYgMHhGRikgPDwgMTYgKSB8CisgICAgICAgICAgICAgKCAoKHNpemUgPj4gMTYpICYgMHhGRikgPDwgOCApICB8CisgICAgICAgICAgICAgKCAoKHNpemUgPj4gMjQpICYgMHhGRikgKTsKKworICAgIEZUX1RSQUNFMigoICIgIHRhZyAgPSAlMDR4XG4iLCB0YWcgICAgKSk7CisgICAgRlRfVFJBQ0U0KCggIiAgYXN6ZSA9ICUwOHhcbiIsIHNpemUgICApKTsKKyAgICBGVF9UUkFDRTIoKCAiICBzaXplID0gJTA4eFxuIiwgKmFzaXplICkpOworCisgICAgcmV0dXJuIFQxX0Vycl9PazsKKyAgfQorCisKKworICBzdGF0aWMKKyAgVDFfRXJyb3IgIGdyb3coIFQxX1Rva2VuaXplciAgdG9remVyICkKKyAgeworICAgIFQxX0Vycm9yICAgZXJyb3I7CisgICAgVDFfTG9uZyAgICBsZWZ0X2J5dGVzOworICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gdG9remVyLT5tZW1vcnk7CisKKyAgICBsZWZ0X2J5dGVzID0gdG9remVyLT5tYXggLSB0b2t6ZXItPmxpbWl0OworCisgICAgaWYgKCBsZWZ0X2J5dGVzID4gMCApCisgICAgeworICAgICAgRlRfU3RyZWFtIHN0cmVhbSA9IHRva3plci0+c3RyZWFtOworCisgICAgICBpZiAoIGxlZnRfYnl0ZXMgPiBSRUFEX0JVRkZFUl9JTkNSRU1FTlQgKQorICAgICAgICBsZWZ0X2J5dGVzID0gUkVBRF9CVUZGRVJfSU5DUkVNRU5UOworCisgICAgICBGVF9UUkFDRTIoKCAiR3Jvd2luZyB0b2tlbml6ZXIgYnVmZmVyIGJ5ICVkIGJ5dGVzXG4iLCBsZWZ0X2J5dGVzICkpOworCisgICAgICAodm9pZClzdHJlYW07ICAvKiB1bnVzZWQgaW4gbm9uIHJlZW50cmFudCBtb2RlICovCisKKyAgICAgIGlmICggIVJFQUxMT0MoIHRva3plci0+YmFzZSwgdG9remVyLT5saW1pdCwgCisgICAgICAgICAgICAgICAgICAgICB0b2t6ZXItPmxpbWl0ICsgbGVmdF9ieXRlcyApICAgICAgICAgICAgICAgICAmJgorICAgICAgICAgICAhRklMRV9SZWFkKCB0b2t6ZXItPmJhc2UgKyB0b2t6ZXItPmxpbWl0LCBsZWZ0X2J5dGVzICkgKQorICAgICAgICB0b2t6ZXItPmxpbWl0ICs9IGxlZnRfYnl0ZXM7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBGVF9FUlJPUigoICJVbmV4cGVjdGVkIGVuZCBvZiBUeXBlMSBmcmFnbWVudCAhIVxuIiApKTsKKyAgICAgIGVycm9yID0gVDFfRXJyX0ludmFsaWRfRmlsZV9Gb3JtYXQ7CisgICAgfQorCisgICAgdG9remVyLT5lcnJvciA9IGVycm9yOworICAgIHJldHVybiBlcnJvcjsKKyAgfQorCisKKworCisgIExPQ0FMX0ZVTkMKKyAgdm9pZCAgdDFfZGVjcnlwdCggVDFfQnl0ZSogICBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgIFQxX0ludCAgICAgbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICBUMV9VU2hvcnQgIHNlZWQgKQorICB7CisgICAgd2hpbGUgKCBsZW5ndGggPiAwICkKKyAgICB7CisgICAgICBUMV9CeXRlICBwbGFpbjsKKworICAgICAgcGxhaW4gICAgID0gKCpidWZmZXIgXiAoc2VlZCA+PiA4KSk7CisgICAgICBzZWVkICAgICAgPSAoKmJ1ZmZlcitzZWVkKSo1Mjg0NSsyMjcxOTsKKyAgICAgICpidWZmZXIrKyA9IHBsYWluOworICAgICAgbGVuZ3RoLS07CisgICAgfQorICB9CisKKworIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworIC8qICA8RnVuY3Rpb24+IE5ld19Ub2tlbml6ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworIC8qICA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworIC8qICAgICBDcmVhdGVzIGEgbmV3IHRva2VuaXplciBmcm9tIGEgZ2l2ZW4gaW5wdXQgc3RyZWFtLiBUaGlzIGZ1bmN0aW9uICAqLworIC8qICAgICBhdXRvbWF0aWNhbGx5IHJlY29nbml6ZXMgInBmYSIgb3IgInBmYiIgZmlsZXMuIFRoZSBmdW5jdGlvbiAgICAgICAqLworIC8qICAgICAiUmVhZF9Ub2tlbiIgY2FuIHRoZW4gYmUgdXNlZCB0byBleHRyYWN0IHN1Y2Nlc3NpdmUgdG9rZW5zIGZyb20gICAqLworIC8qICAgICB0aGUgc3RyZWFtLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworIC8qICA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworIC8qICAgICBzdHJlYW0gIDo6IGlucHV0IHN0cmVhbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworIC8qICA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworIC8qICAgICB0b2tlbml6ZXIgOjogaGFuZGxlIHRvIG5ldyB0b2tlbml6ZXIgb2JqZWN0Li4gICAgICAgICAgICAgICAgICAgICAqLworIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworIC8qICA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworIC8qICAgICBUeXBlMSBlcnJvciBjb2RlLiAwIG1lYW5zIHN1Y2Nlc3MuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworIC8qICA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworIC8qICAgICBUaGlzIGZ1bmN0aW9uIGNvcGllcyB0aGUgc3RyZWFtIGhhbmRsZSB3aXRoaW4gdGhlIG9iamVjdC4gQ2FsbGVycyAqLworIC8qICAgICBzaG91bGQgbm90IGRpc2NhcmQgInN0cmVhbSIuIFRoaXMgaXMgZG9uZSBieSB0aGUgRG9uZV9Ub2tlbml6ZXIgICAqLworIC8qICAgICBmdW5jdGlvbi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgTE9DQUxfRlVOQworIFQxX0Vycm9yICBOZXdfVG9rZW5pemVyKCBGVF9TdHJlYW0gICAgICBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFQxX1Rva2VuaXplciogIHRva2VuaXplciApCisgeworICAgRlRfTWVtb3J5ICAgICBtZW1vcnkgPSBzdHJlYW0tPm1lbW9yeTsKKyAgIFQxX1Rva2VuaXplciAgdG9remVyOworICAgVDFfRXJyb3IgICAgICBlcnJvcjsKKyAgIFQxX1VTaG9ydCAgICAgdGFnOworICAgVDFfVUxvbmcgICAgICBzaXplOworCisgICBUMV9CeXRlKiAgICAgIHRva19iYXNlOworICAgVDFfVUxvbmcgICAgICB0b2tfbGltaXQ7CisgICBUMV9VTG9uZyAgICAgIHRva19tYXg7CisKKyAgICp0b2tlbml6ZXIgPSAwOworCisgICAvKiBhbGxvY2F0ZSBvYmplY3QgKi8KKyAgIGlmICggRklMRV9TZWVrKCAwTCApICAgICAgICAgICAgICAgICAgICAgfHwKKyAgICAgICAgQUxMT0MoIHRva3plciwgc2l6ZW9mKCp0b2t6ZXIpICkgKQorICAgICByZXR1cm4gZXJyb3I7CisKKyAgIHRva3plci0+c3RyZWFtID0gc3RyZWFtOworICAgdG9remVyLT5tZW1vcnkgPSBzdHJlYW0tPm1lbW9yeTsKKworICAgdG9remVyLT5pbl9wZmIgICAgID0gMDsKKyAgIHRva3plci0+aW5fcHJpdmF0ZSA9IDA7CisKKyAgIHRva19iYXNlICA9IDA7CisgICB0b2tfbGltaXQgPSAwOworICAgdG9rX21heCAgID0gc3RyZWFtLT5zaXplOworCisgICBlcnJvciA9IFJlYWRfUEZCX1RhZyggc3RyZWFtLCAmdGFnLCAmc2l6ZSApOworICAgaWYgKGVycm9yKSBnb3RvIEZhaWw7CisKKyAgIGlmICggdGFnICE9IDB4ODAwMSApCisgICB7CisgICAgIC8qIGFzc3VtZSB0aGF0IGl0IGlzIGEgUEZBIGZpbGUgLSBhbiBlcnJvciB3aWxsIGJlIHByb2R1Y2VkIGxhdGVyICovCisgICAgIC8qIGlmIGEgY2hhcmFjdGVyIHdpdGggdmFsdWUgPiAxMjcgaXMgZW5jb3VudGVyZWQuLiAgICAgICAgICAgICAgICovCisKKyAgICAgLyogcmV3aW5kIHRvIHN0YXJ0IG9mIGZpbGUgKi8KKyAgICAgaWYgKCBGSUxFX1NlZWsoMEwpICkgZ290byBGYWlsOworCisgICAgIHNpemUgPSBzdHJlYW0tPnNpemU7CisgICB9CisgICBlbHNlCisgICAgIHRva3plci0+aW5fcGZiID0gMTsKKworICAgLyogaWYgaXQncyBhIG1lbW9yeS1iYXNlZCByZXNvdXJjZSwgc2V0IHVwIHBvaW50ZXIgKi8KKyAgIGlmICggIXN0cmVhbS0+cmVhZCApCisgICB7CisgICAgIHRva19iYXNlICA9IChUMV9CeXRlKilzdHJlYW0tPmJhc2UgKyBzdHJlYW0tPnBvczsKKyAgICAgdG9rX2xpbWl0ID0gc2l6ZTsKKyAgICAgdG9rX21heCAgID0gc2l6ZTsKKworICAgICAvKiBjaGVjayB0aGF0IHRoZSAic2l6ZSIgZmllbGQgaXMgdmFsaWQgKi8KKyAgICAgaWYgKCBGSUxFX1NraXAoc2l6ZSkgKSBnb3RvIEZhaWw7CisgICB9CisgICBlbHNlIGlmICggdGFnID09IDB4ODAwMSApCisgICB7CisgICAgIC8qIHJlYWQgc2VnbWVudCBpbiBtZW1vcnkgKi8KKyAgICAgaWYgKCBBTExPQyggdG9rX2Jhc2UsIHNpemUgKSApCisgICAgICAgZ290byBGYWlsOworCisgICAgIGlmICggRklMRV9SZWFkKCB0b2tfYmFzZSwgc2l6ZSApICkKKyAgICAgeworICAgICAgIEZSRUUoIHRva19iYXNlICk7CisgICAgICAgZ290byBGYWlsOworICAgICB9CisKKyAgICAgdG9rX2xpbWl0ID0gc2l6ZTsKKyAgICAgdG9rX21heCAgID0gc2l6ZTsKKyAgIH0KKworICAgdG9remVyLT5iYXNlICAgPSB0b2tfYmFzZTsKKyAgIHRva3plci0+bGltaXQgID0gdG9rX2xpbWl0OworICAgdG9remVyLT5tYXggICAgPSB0b2tfbWF4OworICAgdG9remVyLT5jdXJzb3IgPSAwOworCisgICAqdG9rZW5pemVyID0gdG9remVyOworICAgCisgICAvKiBOb3cgY2hlY2sgZm9udCBmb3JtYXQsIHdlIG11c3Qgc2VlIGEgJyUhUFMtQWRvYmVGb250LTEnICovCisgICAvKiBvciBhICclIUZvbnRUeXBlJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICB7CisgICAgIGlmICggMTYgPiB0b2t6ZXItPmxpbWl0ICkKKyAgICAgICBncm93KCB0b2t6ZXIgKTsKKyAgICAgICAKKyAgICAgaWYgKCB0b2t6ZXItPmxpbWl0IDw9IDE2IHx8CisgICAgICAgICAgKCBzdHJuY21wKCAoY29uc3QgY2hhciopdG9remVyLT5iYXNlLCAiJSFQUy1BZG9iZUZvbnQtMSIsIDE2ICkgJiYKKyAgICAgICAgICAgIHN0cm5jbXAoIChjb25zdCBjaGFyKil0b2t6ZXItPmJhc2UsICIlIUZvbnRUeXBlIiwgMTAgKSAgICAgICApICkKKyAgICAgeworICAgICAgIEZUX1RSQUNFMigoICJOb3QgYSBUeXBlMSBmb250XG4iICkpOworICAgICAgIGVycm9yID0gVDFfRXJyX0ludmFsaWRfRmlsZV9Gb3JtYXQ7CisgICAgICAgZ290byBGYWlsOworICAgICB9CisgICB9CisgICByZXR1cm4gVDFfRXJyX09rOworCisgRmFpbDoKKyAgIEZSRUUoIHRva3plciApOworICAgcmV0dXJuIGVycm9yOworIH0KKworCisKKyAvKiByZXR1cm4gdGhlIHZhbHVlIG9mIGFuIGhleGFkZWNpbWFsIGRpZ2l0ICovCisgc3RhdGljCisgaW50ICBoZXhhX3ZhbHVlKCBjaGFyIGMgKQorIHsKKyAgIHVuc2lnbmVkIGludCAgZDsKKworICAgZCA9ICh1bnNpZ25lZCBpbnQpKGMtJzAnKTsKKyAgIGlmICggZCA8PSA5ICkgcmV0dXJuIChpbnQpZDsKKworICAgZCA9ICh1bnNpZ25lZCBpbnQpKGMtJ2EnKTsKKyAgIGlmICggZCA8PSA1ICkgcmV0dXJuIChpbnQpKGQrMTApOworCisgICBkID0gKHVuc2lnbmVkIGludCkoYy0nQScpOworICAgaWYgKCBkIDw9IDUgKSByZXR1cm4gKGludCkoZCsxMCk7CisKKyAgIHJldHVybiAtMTsKKyB9CisKKworIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworIC8qICA8RnVuY3Rpb24+IERvbmVfVG9rZW5pemVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworIC8qICA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworIC8qICAgICBDbG9zZXMgYSBnaXZlbiB0b2tlbml6ZXIuIFRoaXMgZnVuY3Rpb24gd2lsbCBhbHNvIGNsb3NlIHRoZSAgICAgICAqLworIC8qICAgICBzdHJlYW0gZW1iZWRkZWQgaW4gdGhlIG9iamVjdC4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworIC8qICA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworIC8qICAgICB0b2tlbml6ZXIgOjogdGFyZ2V0IHRva2VuaXplciBvYmplY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworIC8qICA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworIC8qICAgICBUeXBlMSBlcnJvciBjb2RlLiAwIG1lYW5zIHN1Y2Nlc3MuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgTE9DQUxfRlVOQworIFQxX0Vycm9yICBEb25lX1Rva2VuaXplciggVDFfVG9rZW5pemVyICB0b2tlbml6ZXIgKQorIHsKKyAgIEZUX01lbW9yeSAgbWVtb3J5ID0gdG9rZW5pemVyLT5tZW1vcnk7CisKKyAgIC8qIGNsZWFyIHJlYWQgYnVmZmVyIGlmIG5lZWRlZCAoZGlzay1iYXNlZCByZXNvdXJjZXMpICovCisgICBpZiAoIHRva2VuaXplci0+aW5fcHJpdmF0ZSB8fCAhdG9rZW5pemVyLT5zdHJlYW0tPmJhc2UgKQorICAgICBGUkVFKCB0b2tlbml6ZXItPmJhc2UgKTsKKworICAgRlJFRSggdG9rZW5pemVyICk7CisgICByZXR1cm4gVDFfRXJyX09rOworIH0KKworCisKKyAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAvKiAgPEZ1bmN0aW9uPiBPcGVuX1ByaXZhdGVEaWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAvKiAgPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAvKiAgICAgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCB0byBzZXQgdGhlIHRva2VuaXplciB0byB0aGUgcHJpdmF0ZSAgKi8KKyAvKiAgICAgc2VjdGlvbiBvZiB0aGUgVHlwZTEgZmlsZS4gSXQgcmVjb2duaXplcyBhdXRvbWF0aWNhbGx5IHRoZSAgICAgICAgKi8KKyAvKiAgICAgdGhlIGtpbmQgb2YgZWV4ZWMgZW5jcnlwdGlvbiB1c2VkIChhc2NpaSBvciBiaW5hcnkpLi4gICAgICAgICAgICAgKi8KKyAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAvKiAgPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAvKiAgICAgdG9rZW5pemVyIDo6IHRhcmdldCB0b2tlbml6ZXIgb2JqZWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAvKiAgICAgbGVuSVYgICAgIDo6IHZhbHVlIG9mIHRoZSAibGVuSVYiIHZhcmlhYmxlLi4gICAgICAgICAgICAgICAgICAgICAgKi8KKyAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAvKiAgPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAvKiAgICAgVHlwZTEgZXJyb3IgY29kZS4gMCBtZWFucyBzdWNjZXNzLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworIExPQ0FMX0ZVTkMKKyBUMV9FcnJvciAgT3Blbl9Qcml2YXRlRGljdCggVDFfVG9rZW5pemVyICB0b2tlbml6ZXIgKQorIHsKKyAgIFQxX1Rva2VuaXplciAgdG9remVyID0gdG9rZW5pemVyOworICAgRlRfU3RyZWFtICAgICBzdHJlYW0gPSB0b2t6ZXItPnN0cmVhbTsKKyAgIEZUX01lbW9yeSAgICAgbWVtb3J5ID0gdG9remVyLT5tZW1vcnk7CisgICBUMV9FcnJvciAgICAgIGVycm9yID0gMDsKKworICAgVDFfVVNob3J0ICAgICB0YWc7CisgICBUMV9VTG9uZyAgICAgIHNpemU7CisKKyAgIFQxX0J5dGUqICAgICAgcHJpdmF0ZTsKKworICAgLyogYXJlIHdlIGFscmVhZHkgaW4gdGhlIHByaXZhdGUgZGljdGlvbmFyeSA/ICovCisgICBpZiAoIHRva3plci0+aW5fcHJpdmF0ZSApCisgICAgIHJldHVybiAwOworCisgICBpZiAoIHRva3plci0+aW5fcGZiICkKKyAgIHsKKyAgICAgLyogaW4gdGhlIGNhc2Ugb2YgdGhlIFBGQiBmb3JtYXQsIHRoZSBwcml2YXRlIGRpY3Rpb25hcnkgY2FuIGJlICAqLworICAgICAvKiBtYWRlIG9mIHNldmVyYWwgc2VnbWVudHMuIFdlIHRodXMgZmlyc3QgcmVhZCB0aGUgbnVtYmVyIG9mICAgICovCisgICAgIC8qIHNlZ21lbnRzIHRvIGNvbXB1dGUgdGhlIHRvdGFsIHNpemUgb2YgdGhlIHByaXZhdGUgZGljdGlvbmFyeSAgKi8KKyAgICAgLyogdGhlbiByZS1yZWFkIHRoZW0gaW50byBtZW1vcnkuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICBUMV9Mb25nICBzdGFydF9wb3MgICAgPSBGSUxFX1BvcygpOworICAgICBUMV9VTG9uZyBwcml2YXRlX3NpemUgPSAwOworCisgICAgIGRvCisgICAgIHsKKyAgICAgICBlcnJvciA9IFJlYWRfUEZCX1RhZyggc3RyZWFtLCAmdGFnLCAmc2l6ZSApOworICAgICAgIGlmIChlcnJvciB8fCB0YWcgIT0gMHg4MDAyKSBicmVhazsKKworICAgICAgIHByaXZhdGVfc2l6ZSArPSBzaXplOworCisgICAgICAgaWYgKCBGSUxFX1NraXAoc2l6ZSkgKQorICAgICAgICAgZ290byBGYWlsOworICAgICB9CisgICAgIHdoaWxlICgxKTsKKworICAgICAvKiBDaGVjayB0aGF0IHdlIGhhdmUgYSBwcml2YXRlIGRpY3Rpb25hcnkgdGhlcmUgKi8KKyAgICAgLyogYW5kIGFsbG9jYXRlIHByaXZhdGUgZGljdGlvbmFyeSBidWZmZXIgICAgICAgICovCisgICAgIGlmICggcHJpdmF0ZV9zaXplID09IDAgKQorICAgICB7CisgICAgICAgRlRfRVJST1IoKCAiVDEuT3Blbl9Qcml2YXRlOiBpbnZhbGlkIHByaXZhdGUgZGljdGlvbmFyeSBzZWN0aW9uXG4iICkpOworICAgICAgIGVycm9yID0gVDFfRXJyX0ludmFsaWRfRmlsZV9Gb3JtYXQ7CisgICAgICAgZ290byBGYWlsOworICAgICB9CisKKyAgICAgaWYgKCBBTExPQyggcHJpdmF0ZSwgcHJpdmF0ZV9zaXplICkgKQorICAgICAgIGdvdG8gRmFpbDsKKworICAgICAvKiByZWFkIGFsbCBzZWN0aW9ucyBpbnRvIGJ1ZmZlciAqLworICAgICBpZiAoIEZJTEVfU2Vlayggc3RhcnRfcG9zICkgKQorICAgICAgIGdvdG8gRmFpbF9Qcml2YXRlOworCisgICAgIHByaXZhdGVfc2l6ZSA9IDA7CisgICAgIGRvCisgICAgIHsKKyAgICAgICBlcnJvciA9IFJlYWRfUEZCX1RhZyggc3RyZWFtLCAmdGFnLCAmc2l6ZSApOworICAgICAgIGlmIChlcnJvciB8fCB0YWcgIT0gMHg4MDAyKSB7IGVycm9yID0gMDsgYnJlYWs7IH0KKworICAgICAgIGlmICggRklMRV9SZWFkKCBwcml2YXRlICsgcHJpdmF0ZV9zaXplLCBzaXplICkgKQorICAgICAgICAgZ290byBGYWlsX1ByaXZhdGU7CisKKyAgICAgICBwcml2YXRlX3NpemUgKz0gc2l6ZTsKKyAgICAgfQorICAgICB3aGlsZSAoMSk7CisKKyAgICAgdG9remVyLT5iYXNlICAgPSBwcml2YXRlOworICAgICB0b2t6ZXItPmN1cnNvciA9IDA7CisgICAgIHRva3plci0+bGltaXQgID0gcHJpdmF0ZV9zaXplOworICAgICB0b2t6ZXItPm1heCAgICA9IHByaXZhdGVfc2l6ZTsKKyAgIH0KKyAgIGVsc2UKKyAgIHsKKyAgICAgY2hhciogIGJhc2U7CisKKyAgICAgLyogd2UncmUgaW4gYSBQRkEgZmlsZSwgcmVhZCBlYWNoIHRva2VuIHVudGlsIHdlIGZpbmQgImVleGVjIiAqLworICAgICB3aGlsZSAoIHRva3plci0+dG9rZW4ua2luZDIgIT0ga2V5X2VleGVjICkKKyAgICAgeworICAgICAgIGVycm9yID0gUmVhZF9Ub2tlbiggdG9remVyICk7CisgICAgICAgaWYgKGVycm9yKSBnb3RvIEZhaWw7CisgICAgIH0KKworICAgICAvKiBub3cgZGV0ZXJtaW5lIHdldGhlciB0aGUgcHJpdmF0ZSBkaWN0aW9uYXJ5IGlzIGVuY29kZWQgaW4gYmluYXJ5ICovCisgICAgIC8qIG9yIGhleGFkZWNpbWFsIEFTQ0lJIGZvcm1hdC4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICAgICAvKiB3ZSBuZWVkIHRvIGFjY2VzcyB0aGUgbmV4dCA0IGJ5dGVzIChhZnRlciB0aGUgZmluYWwgXHIgZm9sbG93aW5nICovCisgICAgIC8qIHRoZSAnZWV4ZWMnIGtleXdvcmQuLikgaWYgdGhleSBhbGwgYXJlIGhleGFkZWNpbWFsIGRpZ2l0cywgdGhlbiAgKi8KKyAgICAgLyp3ZSBoYXZlIGEgY2FzZSBvZiBBU0NJSSBzdG9yYWdlLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICB3aGlsZSAoIHRva3plci0+Y3Vyc29yKzUgPiB0b2t6ZXItPmxpbWl0ICkKKyAgICAgeworICAgICAgIGVycm9yID0gZ3JvdyggdG9remVyICk7CisgICAgICAgaWYgKGVycm9yKSBnb3RvIEZhaWw7CisgICAgIH0KKworICAgICAvKiBza2lwIHdoaXRlc3BhY2UvbGluZSBmZWVkIGFmdGVyICJlZXhlYyIgKi8KKyAgICAgYmFzZSA9IChjaGFyKil0b2t6ZXItPmJhc2UgKyB0b2t6ZXItPmN1cnNvciArIDE7CisgICAgIGlmICggKCBoZXhhX3ZhbHVlKCBiYXNlWzBdICkgfCBoZXhhX3ZhbHVlKCBiYXNlWzFdICkgfAorICAgICAgICAgICAgaGV4YV92YWx1ZSggYmFzZVsyXSApIHwgaGV4YV92YWx1ZSggYmFzZVszXSApICkgPCAwICkKKyAgICAgeworICAgICAgIC8qIGJpbmFyeSBlbmNvZGluZyAtICJzaW1wbHkiIHJlYWQgdGhlIHN0cmVhbSAqLworCisgICAgICAgLyogaWYgaXQncyBhIG1lbW9yeS1iYXNlZCByZXNvdXJjZSwgd2UgbmVlZCB0byBhbGxvY2F0ZSBhIG5ldyAqLworICAgICAgIC8qIHN0b3JhZ2UgYnVmZmVyIGZvciB0aGUgcHJpdmF0ZSBkaWN0aW9uYXJ5LCBhcyBpdCBuZWVkcyB0byAgKi8KKyAgICAgICAvKiBiZSBkZWNyeXB0ZWQgbGF0ZXIuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgaWYgKCBzdHJlYW0tPmJhc2UgKQorICAgICAgIHsKKyAgICAgICAgIHNpemUgPSBzdHJlYW0tPnNpemUgLSB0b2t6ZXItPmN1cnNvci0xOyAvKiByZW1haW5pbmcgYnl0ZXMgKi8KKworICAgICAgICAgaWYgKCBBTExPQyggcHJpdmF0ZSwgc2l6ZSApICkgIC8qIGFsbG9jYXRlIHByaXZhdGUgZGljdCBidWZmZXIgKi8KKyAgICAgICAgICAgZ290byBGYWlsOworCisgICAgICAgICAvKiBjb3B5IGVleGVjLWVuY3J5cHRlZCBieXRlcyAqLworICAgICAgICAgTUVNX0NvcHkoIHByaXZhdGUsIHRva3plci0+YmFzZSArIHRva3plci0+Y3Vyc29yKzEsIHNpemUgKTsKKworICAgICAgICAgLyogcmVzZXQgcG9pbnRlcnMgLSBmb3JnZXQgYWJvdXQgZmlsZSBtYXBwaW5nICovCisgICAgICAgICB0b2t6ZXItPmJhc2UgICA9IHByaXZhdGU7CisgICAgICAgICB0b2t6ZXItPmxpbWl0ICA9IHNpemU7CisgICAgICAgICB0b2t6ZXItPm1heCAgICA9IHNpemU7CisgICAgICAgICB0b2t6ZXItPmN1cnNvciA9IDA7CisgICAgICAgfQorICAgICAgIC8qIG9uIHRoZSBvcHBvc2l0ZSwgZm9yIGRpc2sgYmFzZWQgcmVzb3VyY2VzLCB3ZSBzaW1wbHkgZ3JvdyAgKi8KKyAgICAgICAvKiB0aGUgY3VycmVudCBidWZmZXIgdW50aWwgaXRzIGNvbXBsZXRpb24sIGFuZCBkZWNyeXB0IHRoZSAgICovCisgICAgICAgLyogYnl0ZXMgd2l0aGluIGl0LiBJbiBhbGwgY2FzZXMsIHRoZSAiYmFzZSIgYnVmZmVyIHdpbGwgYmUgICAqLworICAgICAgIC8qIGRpc2NhcmRlZCBvbiBEb25lVG9rZW5pemVyIGlmIHdlJ3JlIGluIHRoZSBwcml2YXRlIGRpY3QuLiAgKi8KKyAgICAgICBlbHNlCisgICAgICAgeworICAgICAgICAgLyogZ3JvdyB0aGUgcmVhZCBidWZmZXIgdG8gdGhlIGZ1bGwgZmlsZS4uICovCisgICAgICAgICB3aGlsZSAoIHRva3plci0+bGltaXQgPCB0b2t6ZXItPm1heCApCisgICAgICAgICB7CisgICAgICAgICAgIGVycm9yID0gZ3JvdyggdG9rZW5pemVyICk7CisgICAgICAgICAgIGlmIChlcnJvcikgZ290byBGYWlsOworICAgICAgICAgfQorCisgICAgICAgICAvKiBzZXQgdXAgY3Vyc29yIHRvIGZpcnN0IGVuY3J5cHRlZCBieXRlICovCisgICAgICAgICB0b2t6ZXItPmN1cnNvcisrOworICAgICAgIH0KKyAgICAgfQorICAgICBlbHNlCisgICAgIHsKKyAgICAgICAvKiBBU0NJSSBoZXhhZGVjaW1hbCBlbmNvZGluZy4uIFRoaXMgc3Vja3MuLiAqLworICAgICAgIFQxX0J5dGUqICB3cml0ZTsKKyAgICAgICBUMV9CeXRlKiAgY3VyOworICAgICAgIFQxX0J5dGUqICBsaW1pdDsKKyAgICAgICBUMV9JbnQgICAgY291bnQ7CisKKyAgICAgICAvKiBBbGxvY2F0ZSBhIGJ1ZmZlciwgcmVhZCBlYWNoIG9uZSBieXRlIGF0IGEgdGltZSAuLiAqLworICAgICAgIGNvdW50ID0gKCBzdHJlYW0tPnNpemUgLSB0b2t6ZXItPmN1cnNvciApOworICAgICAgIHNpemUgID0gY291bnQvMjsKKworICAgICAgIGlmICggQUxMT0MoIHByaXZhdGUsIHNpemUgKSApICAgLyogYWxsb2NhdGUgcHJpdmF0ZSBkaWN0IGJ1ZmZlciAqLworICAgICAgICAgZ290byBGYWlsOworCisgICAgICAgd3JpdGUgPSBwcml2YXRlOworICAgICAgIGN1ciAgID0gdG9remVyLT5iYXNlICsgdG9remVyLT5jdXJzb3I7CisgICAgICAgbGltaXQgPSB0b2t6ZXItPmJhc2UgKyB0b2t6ZXItPmxpbWl0OworCisgICAgICAgLyogcmVhZCBlYWNoIGJ5dGVzICovCisgICAgICAgd2hpbGUgKCBjb3VudCA+IDAgKQorICAgICAgIHsKKyAgICAgICAgIC8qIGVuc3VyZSB0aGF0IHdlIGNhbiByZWFkIHRoZSBuZXh0IDIgYnl0ZXMgISEgKi8KKyAgICAgICAgIHdoaWxlICggY3VyKzIgPiBsaW1pdCApCisgICAgICAgICB7CisgICAgICAgICAgIGludCAgY3Vyc29yID0gY3VyIC0gdG9remVyLT5iYXNlOworICAgICAgICAgICBlcnJvciA9IGdyb3coIHRva3plciApOworICAgICAgICAgICBpZiAoZXJyb3IpIGdvdG8gRmFpbF9Qcml2YXRlOworICAgICAgICAgICBjdXIgICA9IHRva3plci0+YmFzZSArIGN1cnNvcjsKKyAgICAgICAgICAgbGltaXQgPSB0b2t6ZXItPmJhc2UgKyB0b2t6ZXItPmxpbWl0OworICAgICAgICAgfQorCisgICAgICAgICAvKiBjaGVjayBmb3IgbmV3IGxpbmUgKi8KKyAgICAgICAgIGlmICggY3VyWzBdID09ICdccicgfHwgY3VyWzBdID09ICdcbicgKQorICAgICAgICAgeworICAgICAgICAgICBjdXIrKzsKKyAgICAgICAgICAgY291bnQtLTsKKyAgICAgICAgIH0KKyAgICAgICAgIGVsc2UKKyAgICAgICAgIHsKKyAgICAgICAgICAgaW50ICBoZXgxID0gaGV4YV92YWx1ZShjdXJbMF0pOworCisgICAgICAgICAgIC8qIGV4aXQgaWYgd2UgaGF2ZSBhIG5vbiBoZXhhLWRlY2ltYWwgZGlnaXQgd2hpY2ggaXNuJ3QgKi8KKyAgICAgICAgICAgLyogYSBuZXctbGluZSBjaGFyYWN0ZXIuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICBpZiAoaGV4MSA8IDApCisgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgLyogb3RoZXJ3aXNlLCBzdG9yZSBieXRlICovCisgICAgICAgICAgICp3cml0ZSsrID0gKCBoZXgxIDw8IDQgKSB8IGhleGFfdmFsdWUoIGN1clsxXSApOworICAgICAgICAgICBjdXIgKz0gMjsKKyAgICAgICAgICAgY291bnQgLT0gMjsKKyAgICAgICAgIH0KKyAgICAgICB9CisKKyAgICAgICAvKiBnZXQgcmlkIG9mIG9sZCBidWZmZXIgaW4gdGhlIGNhc2Ugb2YgZGlzay1iYXNlZCByZXNvdXJjZXMgKi8KKyAgICAgICBpZiAoICFzdHJlYW0tPmJhc2UgKQorICAgICAgICAgRlJFRSggdG9remVyLT5iYXNlICk7CisKKyAgICAgICAvKiBzZXQgdXAgcG9pbnRlcnMgKi8KKyAgICAgICB0b2t6ZXItPmJhc2UgICA9IHByaXZhdGU7CisgICAgICAgdG9remVyLT5saW1pdCAgPSBzaXplOworICAgICAgIHRva3plci0+bWF4ICAgID0gc2l6ZTsKKyAgICAgICB0b2t6ZXItPmN1cnNvciA9IDA7CisgICAgIH0KKyAgIH0KKworICAgLyogZmluYWxseSwgZGVjcnlwdCB0aGUgcHJpdmF0ZSBkaWN0aW9uYXJ5IC0gYW5kIHNraXAgdGhlIGxlbklWIGJ5dGVzICovCisgICB0MV9kZWNyeXB0KCB0b2t6ZXItPmJhc2UsIHRva3plci0+bGltaXQsIDU1NjY1ICk7CisgICB0b2t6ZXItPmN1cnNvciArPSA0OworCisgRmFpbDoKKyAgIHJldHVybiBlcnJvcjsKKworIEZhaWxfUHJpdmF0ZToKKyAgIEZSRUUoIHByaXZhdGUgKTsKKyAgIGdvdG8gRmFpbDsKKyB9CisKKworIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworIC8qICA8RnVuY3Rpb24+IFJlYWRfVG9rZW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworIC8qICA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworIC8qICAgICBSZWFkIGEgbmV3IHRva2VuIGZyb20gdGhlIGN1cnJlbnQgaW5wdXQgc3RyZWFtLiBUaGlzIGZ1bmN0aW9uICAgICAqLworIC8qICAgICBleHRyYWN0cyBhIHRva2VuIGZyb20gdGhlIGZvbnQgcHJvZ3JhbSB1bnRpbCAiT3Blbl9Qcml2YXRlRGljdCIgICAqLworIC8qICAgICBoYXMgYmVlbiBjYWxsZWQuIEFmdGVyIHRoaXMsIGl0IHJldHVybnMgdG9rZW5zIGZyb20gdGhlICAgICAgICAgICAqLworIC8qICAgICAoZWV4ZWMtZW5jcnlwdGVkKSBwcml2YXRlIGRpY3Rpb25uYXJ5Li4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworIC8qICA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworIC8qICAgICB0b2tlbml6ZXIgOjogdGFyZ2V0IHRva2VuaXplciBvYmplY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworIC8qICA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworIC8qICAgICBUeXBlMSBlcnJvciBjb2RlLiAwIG1lYW5zIHN1Y2Nlc3MuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworIC8qICA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworIC8qICAgICBPbmUgc2hvdWxkIHVzZSB0aGUgZnVuY3Rpb24gUmVhZF9DaGFyU3RyaW5ncyB0byByZWFkIHRoZSBiaW5hcnkgICAqLworIC8qICAgICBjaGFyc3RyaW5ncyBmcm9tIHRoZSBwcml2YXRlIGRpY3QuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworIExPQ0FMX0ZVTkMKKyBUMV9FcnJvciAgUmVhZF9Ub2tlbiggVDFfVG9rZW5pemVyICB0b2tlbml6ZXIgKQorIHsKKyAgIFQxX1Rva2VuaXplciB0b2sgPSB0b2tlbml6ZXI7CisgICBUMV9Mb25nICAgICAgY3VyLCBsaW1pdDsKKyAgIFQxX0J5dGUqICAgICBiYXNlOworICAgY2hhciAgICAgICAgIGMsIHN0YXJ0ZXIsIGVuZGVyOworICAgVDFfQm9vbCAgICAgIHRva2VuX3N0YXJ0ZWQ7CisKKyAgIFQxX1Rva2VuVHlwZSAga2luZDsKKworICAgdG9rLT5lcnJvciAgICAgID0gVDFfRXJyX09rOworICAgdG9rLT50b2tlbi5raW5kID0gdG9rX2FueTsKKworICAgYmFzZSAgPSB0b2stPmJhc2U7CisgICBsaW1pdCA9IHRvay0+bGltaXQ7CisgICBjdXIgICA9IHRvay0+Y3Vyc29yOworCisgICB0b2tlbl9zdGFydGVkID0gMDsKKworICAgZm9yICg7OykKKyAgIHsKKyAgICAgaWYgKCBjdXIgPj0gbGltaXQgKQorICAgICB7CisgICAgICAgaWYgKCBncm93KCB0b2sgKSApIGdvdG8gRXhpdDsKKyAgICAgICBiYXNlICA9IHRvay0+YmFzZTsKKyAgICAgICBsaW1pdCA9IHRvay0+bGltaXQ7CisgICAgIH0KKworICAgICBjID0gKGNoYXIpYmFzZVtjdXIrK107CisKKyAgICAgLyogY2hlY2sgdGhhdCB3ZSBoYXZlIGFuIEFTQ0lJIGNoYXJhY3RlciAqLworICAgICBpZiAoIChUMV9CeXRlKWMgPiAxMjcgKQorICAgICB7CisgICAgICAgRlRfRVJST1IoKCAiVW5leHBlY3RlZCBiaW5hcnkgZGF0YSBpbiBUeXBlMSBmcmFnbWVudCAhIVxuIiApKTsKKyAgICAgICB0b2stPmVycm9yID0gVDFfRXJyX0ludmFsaWRfRmlsZV9Gb3JtYXQ7CisgICAgICAgZ290byBFeGl0OworICAgICB9CisKKyAgICAgc3dpdGNoIChjKQorICAgICB7CisgICAgICAgY2FzZSAnXHInIDoKKyAgICAgICBjYXNlICdcbicgOgorICAgICAgIGNhc2UgJyAnICA6CisgICAgICAgY2FzZSAnXHQnIDogLyogc2tpcCBpbml0aWFsIHdoaXRlc3BhY2UgPT4gc2tpcCB0byBuZXh0ICovCisgICAgICAgICBpZiAodG9rZW5fc3RhcnRlZCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgLyogcG9zc2libHkgYSBuYW1lLCBrZXl3b3JkLCB3YXRoZXZlciAqLworICAgICAgICAgICB0b2stPnRva2VuLmtpbmQgPSB0b2tfYW55OworICAgICAgICAgICB0b2stPnRva2VuLmxlbiAgPSBjdXItdG9rLT50b2tlbi5zdGFydC0xOworICAgICAgICAgICBnb3RvIEV4aXQ7CisgICAgICAgICB9CisgICAgICAgICAvKiBvdGhlcndpc2UsIHNraXAgZXZlcnl0aGluZyAqLworICAgICAgICAgYnJlYWs7CisKKworICAgICAgIGNhc2UgJyUnIDogLyogdGhpcyBpcyBhIGNvbW1lbnQgLSBza2lwIGV2ZXJ5dGhpbmcgKi8KKyAgICAgICAgIGZvciAoOzspCisgICAgICAgICB7CisgICAgICAgICAgIFQxX0ludCAgbGVmdCA9IGxpbWl0IC0gY3VyOworCisgICAgICAgICAgIHdoaWxlIChsZWZ0ID4gMCkKKyAgICAgICAgICAgeworICAgICAgICAgICAgIGMgPSAoY2hhciliYXNlW2N1cisrXTsKKyAgICAgICAgICAgICBpZiAoIGMgPT0gJ1xyJyB8fCBjID09ICdcbicgKQorICAgICAgICAgICAgICAgZ290byBOZXh0OworICAgICAgICAgICAgIGxlZnQtLTsKKyAgICAgICAgICAgfQorICAgICAgICAgICBpZiAoIGdyb3coIHRva2VuaXplciApICkgZ290byBFeGl0OworICAgICAgICAgICBiYXNlICA9IHRvay0+YmFzZTsKKyAgICAgICAgICAgbGltaXQgPSB0b2stPmxpbWl0OworICAgICAgICAgfQorCisKKyAgICAgICBjYXNlICcoJyA6IC8qIGEgUG9zdHNjcmlwdCBzdHJpbmcgKi8KKyAgICAgICAgIGtpbmQgID0gdG9rX3N0cmluZzsKKyAgICAgICAgIGVuZGVyID0gJyknOworCisgICAgICAgTDE6CisgICAgICAgICBpZiAoIXRva2VuX3N0YXJ0ZWQpCisgICAgICAgICB7CisgICAgICAgICAgIHRva2VuX3N0YXJ0ZWQgICAgPSAxOworICAgICAgICAgICB0b2stPnRva2VuLnN0YXJ0ID0gY3VyLTE7CisgICAgICAgICB9CisKKyAgICAgICAgIHsKKyAgICAgICAgICAgVDFfSW50ICBuZXN0X2xldmVsID0gMTsKKworICAgICAgICAgICBzdGFydGVyID0gYzsKKyAgICAgICAgICAgZm9yICg7OykKKyAgICAgICAgICAgeworICAgICAgICAgICAgIFQxX0ludCAgbGVmdCA9IGxpbWl0LWN1cjsKKyAgICAgICAgICAgICB3aGlsZSAobGVmdCA+IDApCisgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgYyA9IChjaGFyKWJhc2VbY3VyKytdOworCisgICAgICAgICAgICAgICBpZiAoIGMgPT0gc3RhcnRlciApCisgICAgICAgICAgICAgICAgIG5lc3RfbGV2ZWwrKzsKKworICAgICAgICAgICAgICAgZWxzZSBpZiAoIGMgPT0gZW5kZXIgKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICBuZXN0X2xldmVsLS07CisgICAgICAgICAgICAgICAgIGlmIChuZXN0X2xldmVsIDw9IDApCisgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICB0b2stPnRva2VuLmtpbmQgPSBraW5kOworICAgICAgICAgICAgICAgICAgIHRvay0+dG9rZW4ubGVuICA9IGN1ciAtIHRvay0+dG9rZW4uc3RhcnQ7CisgICAgICAgICAgICAgICAgICAgZ290byBFeGl0OworICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICBsZWZ0LS07CisgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgaWYgKCBncm93KCB0b2sgKSApIGdvdG8gRXhpdDsKKyAgICAgICAgICAgICBiYXNlICA9IHRvay0+YmFzZTsKKyAgICAgICAgICAgICBsaW1pdCA9IHRvay0+bGltaXQ7CisgICAgICAgICAgIH0KKyAgICAgICAgIH0KKworCisgICAgIGNhc2UgJ1snIDogLyogYSBQb3N0c2NyaXB0IGFycmF5ICovCisgICAgICAgaWYgKHRva2VuX3N0YXJ0ZWQpCisgICAgICAgICBnb3RvIEFueV9Ub2tlbjsKKworICAgICAgIGtpbmQgID0gdG9rX2FycmF5OworICAgICAgIGVuZGVyID0gJ10nOworICAgICAgIGdvdG8gTDE7CisgICAgICAgYnJlYWs7CisKKworICAgICBjYXNlICd7JyA6IC8qIGEgUG9zdHNjcmlwdCBwcm9ncmFtICovCisgICAgICAgaWYgKHRva2VuX3N0YXJ0ZWQpCisgICAgICAgICBnb3RvIEFueV9Ub2tlbjsKKworICAgICAgIGtpbmQgID0gdG9rX3Byb2dyYW07CisgICAgICAgZW5kZXIgPSAnfSc7CisgICAgICAgZ290byBMMTsKKyAgICAgICBicmVhazsKKworCisgICAgIGNhc2UgJzwnIDogLyogYSBQb3N0c2NyaXB0IGhleCBieXRlIGFycmF5ID8/ICovCisgICAgICAgaWYgKHRva2VuX3N0YXJ0ZWQpCisgICAgICAgICBnb3RvIEFueV9Ub2tlbjsKKworICAgICAgIGtpbmQgID0gdG9rX2hleGFycmF5OworICAgICAgIGVuZGVyID0gJz4nOworICAgICAgIGdvdG8gTDE7CisgICAgICAgYnJlYWs7CisKKworICAgICBjYXNlICcwJzogIC8qIGFueSBudW1iZXIgKi8KKyAgICAgY2FzZSAnMSc6CisgICAgIGNhc2UgJzInOgorICAgICBjYXNlICczJzoKKyAgICAgY2FzZSAnNCc6CisgICAgIGNhc2UgJzUnOgorICAgICBjYXNlICc2JzoKKyAgICAgY2FzZSAnNyc6CisgICAgIGNhc2UgJzgnOgorICAgICBjYXNlICc5JzoKKyAgICAgICBpZiAodG9rZW5fc3RhcnRlZCkKKyAgICAgICAgIGdvdG8gTmV4dDsKKworICAgICAgIHRvay0+dG9rZW4ua2luZCA9IHRva19udW1iZXI7CisgICAgICAgdG9rZW5fc3RhcnRlZCAgICA9IDE7CisgICAgICAgdG9rLT50b2tlbi5zdGFydCA9IGN1ci0xOworICAgICBMMjoKKyAgICAgICBmb3IgKDs7KQorICAgICAgIHsKKyAgICAgICAgIFQxX0ludCAgbGVmdCA9IGxpbWl0LWN1cjsKKyAgICAgICAgIHdoaWxlIChsZWZ0ID4gMCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgYyA9IChjaGFyKWJhc2VbY3VyKytdOworCisgICAgICAgICAgIHN3aXRjaCAoYykKKyAgICAgICAgICAgeworICAgICAgICAgICAgIGNhc2UgJ1snOgorICAgICAgICAgICAgIGNhc2UgJ3snOgorICAgICAgICAgICAgIGNhc2UgJygnOgorICAgICAgICAgICAgIGNhc2UgJzwnOgorICAgICAgICAgICAgIGNhc2UgJy8nOgorICAgICAgICAgICAgICAgZ290byBBbnlfVG9rZW47ICAgICAgICAgICAKKworICAgICAgICAgICAgIGNhc2UgICcgJzoKKyAgICAgICAgICAgICBjYXNlICdccic6CisgICAgICAgICAgICAgY2FzZSAnXHQnOgorICAgICAgICAgICAgIGNhc2UgJ1xuJzoKKyAgICAgICAgICAgICAgIHRvay0+dG9rZW4ubGVuID0gY3VyIC0gdG9rLT50b2tlbi5zdGFydCAtIDE7CisgICAgICAgICAgICAgICBnb3RvIEV4aXQ7CisKKyAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgOworICAgICAgICAgICB9CisgICAgICAgICAgIGxlZnQtLTsKKyAgICAgICAgIH0KKyAgICAgICAgIGlmIChncm93KCB0b2sgKSkgZ290byBFeGl0OworICAgICAgICAgYmFzZSAgPSB0b2stPmJhc2U7CisgICAgICAgICBsaW1pdCA9IHRvay0+bGltaXQ7CisgICAgICAgfQorCisKKyAgICAgY2FzZSAnLic6ICAgLyogbWF5YmUgYSBudW1iZXIgKi8KKyAgICAgY2FzZSAnLSc6CisgICAgIGNhc2UgJysnOgorICAgICAgIGlmICh0b2tlbl9zdGFydGVkKQorICAgICAgICAgZ290byBOZXh0OworICAgICAgICAgCisgICAgICAgdG9rZW5fc3RhcnRlZCAgICA9IDE7CisgICAgICAgdG9rLT50b2tlbi5zdGFydCA9IGN1ci0xOworICAgICAgIGZvciAoOzspCisgICAgICAgeworICAgICAgICAgVDFfSW50ICBsZWZ0ID0gbGltaXQtY3VyOworICAgICAgICAgaWYgKCBsZWZ0ID4gMCApCisgICAgICAgICB7CisgICAgICAgICAgIC8qIHRlc3QgZm9yIGFueSBmb2xsb3dpbmcgZGlnaXQsIGludGVycHJldGVkIGFzIG51bWJlciAqLworICAgICAgICAgICBjID0gKGNoYXIpYmFzZVtjdXJdOworICAgICAgICAgICB0b2stPnRva2VuLmtpbmQgPSAoIGMgPj0gJzAnICYmIGMgPD0gJzknID8gdG9rX251bWJlciA6IHRva19hbnkgKTsKKyAgICAgICAgICAgZ290byBMMjsKKyAgICAgICAgIH0KKyAgICAgICAgIGlmIChncm93KCB0b2sgKSkgZ290byBFeGl0OworICAgICAgICAgYmFzZSAgPSB0b2stPmJhc2U7CisgICAgICAgICBsaW1pdCA9IHRvay0+bGltaXQ7CisgICAgICAgfQorCisgICAgIGNhc2UgJy8nOiAgLyogbWF5YmUgYW4gaW1tZWRpYXRlIG5hbWUgKi8KKyAgICAgICBpZiAoIXRva2VuX3N0YXJ0ZWQpCisgICAgICAgeworICAgICAgICAgdG9rZW5fc3RhcnRlZCAgICA9IDE7CisgICAgICAgICB0b2stPnRva2VuLnN0YXJ0ID0gY3VyLTE7CisKKyAgICAgICAgIGZvciAoOzspCisgICAgICAgICB7CisgICAgICAgICAgIFQxX0ludCAgbGVmdCA9IGxpbWl0LWN1cjsKKyAgICAgICAgICAgaWYgKCBsZWZ0ID4gMCApCisgICAgICAgICAgIHsKKyAgICAgICAgICAgICAvKiB0ZXN0IGZvciBzaW5nbGUgJy8nLCBpbnRlcnByZXRlZCBhcyBnYXJiYWdlICovCisgICAgICAgICAgICAgYyA9IChjaGFyKWJhc2VbY3VyXTsKKyAgICAgICAgICAgICB0b2stPnRva2VuLmtpbmQgPSAoIGMgPT0gJyAnICB8fCBjID09ICdcdCcgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPT0gJ1xyJyB8fCBjID09ICdcbicgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rX2FueSA6IHRva19pbW1lZGlhdGUgKTsKKyAgICAgICAgICAgICBnb3RvIEwyOworICAgICAgICAgICB9CisgICAgICAgICAgIGlmIChncm93KCB0b2sgKSkgZ290byBFeGl0OworICAgICAgICAgICBiYXNlICA9IHRvay0+YmFzZTsKKyAgICAgICAgICAgbGltaXQgPSB0b2stPmxpbWl0OworICAgICAgICAgfQorICAgICAgIH0KKyAgICAgICBlbHNlCisgICAgICAgeworICAgQW55X1Rva2VuOiAgICAgICAgLyogcG9zc2libHkgYSBuYW1lIG9yIHdhdGhldmVyICovCisgICAgICAgICBjdXItLTsKKyAgICAgICAgIHRvay0+dG9rZW4ubGVuID0gY3VyIC0gdG9rLT50b2tlbi5zdGFydDsKKyAgICAgICAgIGdvdG8gRXhpdDsKKyAgICAgICB9CisKKyAgICAgZGVmYXVsdDoKKyAgICAgICBpZiAoIXRva2VuX3N0YXJ0ZWQpCisgICAgICAgeworICAgICAgICAgdG9rZW5fc3RhcnRlZCAgICA9IDE7CisgICAgICAgICB0b2stPnRva2VuLnN0YXJ0ID0gY3VyLTE7CisgICAgICAgfQorICAgICB9CisKKyBOZXh0OgorICAgOworICAgfQorCisgRXhpdDoKKyAgIHRvay0+Y3Vyc29yID0gY3VyOworCisgICBpZiAoIXRvay0+ZXJyb3IpCisgICB7CisgICAgIC8qIG5vdywgdHJpZXMgdG8gbWF0Y2gga2V5d29yZHMgYW5kIGltbWVkaWF0ZSBuYW1lcyAqLworICAgICBUMV9JbnQgIGluZGV4OworCisgICAgIHN3aXRjaCAoIHRvay0+dG9rZW4ua2luZCApCisgICAgIHsKKyAgICAgICBjYXNlIHRva19pbW1lZGlhdGUgOiAgLyogaW1tZWRpYXRlIG5hbWUgKi8KKyAgICAgICAgIGluZGV4ID0gRmluZF9OYW1lKCAoY2hhciopKHRvay0+YmFzZSArIHRvay0+dG9rZW4uc3RhcnQrMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rLT50b2tlbi5sZW4tMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0MV9pbW1lZGlhdGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltbV9tYXggLSBpbW1fZmlyc3RfICk7CisgICAgICAgICB0b2stPnRva2VuLmtpbmQyID0gKCBpbmRleCA+PSAwID8gaW1tX2ZpcnN0XyArIGluZGV4IDogMCApOworICAgICAgICAgYnJlYWs7CisKKworICAgICAgIGNhc2UgdG9rX2FueSA6IC8qIHRlc3QgZm9yIGtleXdvcmQgKi8KKyAgICAgICAgIGluZGV4ID0gRmluZF9OYW1lKCAoY2hhciopKHRvay0+YmFzZSArIHRvay0+dG9rZW4uc3RhcnQpLAorICAgICAgICAgICAgICAgIAkgICAgdG9rLT50b2tlbi5sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdDFfa2V5d29yZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5X21heCAtIGtleV9maXJzdF8gKTsKKyAgICAgICAgIGlmICggaW5kZXggPj0gMCApCisgICAgICAgICB7CisgICAgICAgICAgIHRvay0+dG9rZW4ua2luZCAgPSB0b2tfa2V5d29yZDsKKyAgICAgICAgICAgdG9rLT50b2tlbi5raW5kMiA9IGtleV9maXJzdF8gKyBpbmRleDsKKyAgICAgICAgIH0KKyAgICAgICAgIGVsc2UKKyAgICAgICAgICAgdG9rLT50b2tlbi5raW5kMiA9IDA7CisgICAgICAgICBicmVhazsKKworICAgICAgIGRlZmF1bHQ6CisgICAgICAgICB0b2stPnRva2VuLmtpbmQyID0gMDsKKyAgICAgfQorICAgfQorICAgcmV0dXJuIHRva2VuaXplci0+ZXJyb3I7CisgfQorCisKKyAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAvKiAgPEZ1bmN0aW9uPiBSZWFkX0NoYXJTdHJpbmdzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAvKiAgPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAvKiAgICAgUmVhZCBhIGNoYXJzdHJpbmdzIGZyb20gdGhlIGN1cnJlbnQgaW5wdXQgc3RyZWFtLiBUaGVzZSBhcmUgICAgICAgKi8KKyAvKiAgICAgYmluYXJ5IGJ5dGVzIHRoYXQgZW5jb2RlIGVhY2ggaW5kaXZpZHVhbCBnbHlwaCBvdXRsaW5lLiAgICAgICAgICAgKi8KKyAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAvKiAgICAgVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3Igc2tpcHBpbmcgdGhlICJsZW5JViIgYnl0ZXMgYXQgICAgICAgKi8KKyAvKiAgICAgdGhlIHN0YXJ0IG9mIHRoZSByZWNvcmQuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAvKiAgPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAvKiAgICAgdG9rZW5pemVyIDo6IHRhcmdldCB0b2tlbml6ZXIgb2JqZWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAvKiAgICAgbnVtX2NoYXJzIDo6IG51bWJlciBvZiBiaW5hcnkgYnl0ZXMgdG8gcmVhZCAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAvKiAgPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAvKiAgICAgYnVmZmVyICAgIDo6IHRhcmdldCBhcnJheSBvZiBieXRlcy4gVGhlc2UgYXJlIGVleGVjLWRlY3J5cHRlZC4uICAgKi8KKyAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAvKiAgPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAvKiAgICAgVHlwZTEgZXJyb3IgY29kZS4gMCBtZWFucyBzdWNjZXNzLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAvKiAgPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAvKiAgICAgT25lIHNob3VsZCB1c2UgdGhlIGZ1bmN0aW9uIFJlYWRfQ2hhclN0cmluZ3MgdG8gcmVhZCB0aGUgYmluYXJ5ICAgKi8KKyAvKiAgICAgY2hhcnN0cmluZ3MgZnJvbSB0aGUgcHJpdmF0ZSBkaWN0Li4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyBMT0NBTF9GVU5DCisgVDFfRXJyb3IgIFJlYWRfQ2hhclN0cmluZ3MoIFQxX1Rva2VuaXplciAgdG9rZW5pemVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUMV9JbnQgICAgICAgIG51bV9jaGFycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVDFfQnl0ZSogICAgICBidWZmZXIgKQorIHsKKyAgIGZvciAoOzspCisgICB7CisgICAgIFQxX0ludCAgbGVmdCA9IHRva2VuaXplci0+bGltaXQgLSB0b2tlbml6ZXItPmN1cnNvcjsKKworICAgICBpZiAoIGxlZnQgPj0gbnVtX2NoYXJzICkKKyAgICAgeworICAgICAgIE1FTV9Db3B5KCBidWZmZXIsIHRva2VuaXplci0+YmFzZSArIHRva2VuaXplci0+Y3Vyc29yLCBudW1fY2hhcnMgKTsKKyAgICAgICB0MV9kZWNyeXB0KCBidWZmZXIsIG51bV9jaGFycywgNDMzMCApOworICAgICAgIHRva2VuaXplci0+Y3Vyc29yICs9IG51bV9jaGFyczsKKyAgICAgICByZXR1cm4gVDFfRXJyX09rOworICAgICB9CisKKyAgICAgaWYgKCBncm93KHRva2VuaXplcikgKSByZXR1cm4gdG9rZW5pemVyLT5lcnJvcjsKKyAgIH0KKyB9CisKZGlmZiAtLWdpdCBhL3NyYy90eXBlMS90MXRva2Vucy5oIGIvc3JjL3R5cGUxL3QxdG9rZW5zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDgzMTQ4YgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90eXBlMS90MXRva2Vucy5oCkBAIC0wLDAgKzEsMzUyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICB0MXRva2Vucy5oCisgKgorICogIFR5cGUgMSB0b2tlbml6ZXIKKyAqCisgKiAgQ29weXJpZ2h0IDE5OTYgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZAorICogIG1vZGlmaWVkIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSBvciBkaXN0cmlidXRlCisgKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqICBUaGUgdG9rZW5pemVyIGlzIGluIGNoYXJnZSBvZiBsb2FkaW5nIGFuZCByZWFkaW5nIGEgVHlwZTEgZm9udAorICogIGZpbGUgKGVpdGhlciBpbiBQRkIgb3IgUEZBIGZvcm1hdCksIGFuZCBleHRyYWN0IHN1Y2Nlc3NpdmUgdG9rZW5zCisgKiAgYW5kIGtleXdvcmRzIGZyb20gaXRzIHR3byBzdHJlYW1zIChpLmUuIHRoZSBmb250IHByb2dyYW0sIGFuZCB0aGUKKyAqICBwcml2YXRlIGRpY3Rpb25hcnkpLgorICoKKyAqICBFZXhlYyBkZWNyeXB0aW9uIGlzIHBlcmZvcm1lZCBhdXRvbWF0aWNhbGx5IHdoZW4gZW50ZXJpbmcgdGhlCisgKiAgcHJpdmF0ZSBkaWN0aW9uYXJ5LCBvciB3aGVuIHJldHJpZXZpbmcgY2hhciBzdHJpbmdzLi4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIFQxVE9LRU5TX0gKKyNkZWZpbmUgVDFUT0tFTlNfSAorCisjaW5jbHVkZSA8dDFvYmpzLmg+CisKKy8qIGVudW0gdmFsdWUgb2YgZmlyc3Qga2V5d29yZCAqLworI2RlZmluZSBrZXlfZmlyc3RfICAgICAxMDAKKworLyogZW51bSB2YWx1ZSBvZiBmaXJzdCBpbW1lZGlhdGUgbmFtZSAqLworI2RlZmluZSBpbW1fZmlyc3RfICAgICAyMDAKKworICB0eXBlZGVmICBlbnVtIFQxX1Rva2VuVHlwZV8KKyAgeworICAgIHRva19lcnJvciA9IDAsCisKKyAgICB0b2tfZW9mLCAgICAgICAgICAgICAvKiBlbmQgb2YgZmlsZSAgICAgICAgICAgICAgKi8KKworICAgIC8qIHNpbXBsZSB0b2tlbiB0eXBlcyAqLworCisgICAgdG9rX2tleXdvcmQsICAgICAgICAgLyoga2V5d29yZCAgICAgICAgICAgICAgICAgICAgICAqLworICAgIHRva19udW1iZXIsICAgICAgICAgIC8qIG51bWJlciAoaW50ZWdlciBvciByZWFsKSAgICAgKi8KKyAgICB0b2tfc3RyaW5nLCAgICAgICAgICAvKiBwb3N0c2NyaXB0IHN0cmluZyAgICAgICAgICAgICovCisgICAgdG9rX3Byb2dyYW0sICAgICAgICAgLyogcG9zdHNjcmlwdCBwcm9ncmFtICAgICAgICAgICAqLworICAgIHRva19pbW1lZGlhdGUsICAgICAgIC8qIGFueSBpbW1lZGlhdGUgbmFtZSAgICAgICAgICAgKi8KKyAgICB0b2tfYXJyYXksICAgICAgICAgICAvKiBtYXRyaXgsIGFycmF5LCBldGMuLiAgICAgICAgICovCisgICAgdG9rX2hleGFycmF5LCAgICAgICAgLyogYXJyYXkgb2YgaGV4YWRlY2ltYWwgbmliYmxlcyAqLworICAgIHRva19hbnksICAgICAgICAgICAgIC8qIGFueXRoaW5nIGVsc2UgICAgICAgICAgICAgICAgKi8KKworICAgIC8qIFBvc3RzY3JpcHQga2V5d29yZHMgLSBwbGFjZWQgaW4gbGV4aWNvZ3JhcGhpY2FsIG9yZGVyICovCisKKyAgICBrZXlfUkRfYWx0ZXJuYXRlID0ga2V5X2ZpcnN0XywgICAgICAvKiAiLXwiID0gYWx0ZXJuYXRlIGZvcm0gb2YgUkQgKi8KKwlrZXlfRXhwZXJ0RW5jb2RpbmcsCisgICAga2V5X05ELAorICAgIGtleV9OUCwKKyAgICBrZXlfUkQsCisJa2V5X1N0YW5kYXJkRW5jb2RpbmcsCisgICAga2V5X2FycmF5LAorICAgIGtleV9iZWdpbiwKKyAgICBrZXlfY2xvc2VmaWxlLAorICAgIGtleV9jdXJyZW50ZGljdCwKKyAgICBrZXlfY3VycmVudGZpbGUsCisgICAga2V5X2RlZiwKKyAgICBrZXlfZGljdCwKKyAgICBrZXlfZHVwLAorICAgIGtleV9lZXhlYywKKyAgICBrZXlfZW5kLAorICAgIGtleV9leGVjb25seSwKKyAgICBrZXlfZmFsc2UsCisgICAga2V5X2ZvciwKKyAgICBrZXlfaW5kZXgsCisgICAga2V5X25vYWNjZXNzLAorICAgIGtleV9wdXQsCisgICAga2V5X3JlYWRvbmx5LAorICAgIGtleV90cnVlLAorICAgIGtleV91c2VyZGljdCwKKyAgICBrZXlfTlBfYWx0ZXJuYXRlLCAgICAgICAgICAgICAgICAgICAvKiAifCIgPSBhbHRlcm5hdGUgZm9ybSBvZiBOUCAgKi8KKyAgICBrZXlfTkRfYWx0ZXJuYXRlLCAgICAgICAgICAgICAgICAgICAvKiAifC0iID0gYWx0ZXJuYXRlIGZvcm0gb2YgTkQgKi8KKworICAgIGtleV9tYXgsICAgLyogYWx3YXlzIGtlZXAgdGhpcyB2YWx1ZSB0aGVyZSAqLworCisgICAgLyogUG9zdHNjcmlwdCBpbW1lZGlhdGUgbmFtZXMgLSBvdGhlciBuYW1lcyB3aWxsIGJlIGlnbm9yZWQsIGV4Y2VwdCAqLworICAgIC8qIGluIGNoYXJzdHJpbmdzLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICAgIGltbV9SRF9hbHRlcm5hdGUgPSBpbW1fZmlyc3RfLCAgICAgIC8qICItfCIgPSBhbHRlcm5hdGUgZm9ybSBvZiBSRCAqLworICAgIGltbV9ub3RkZWYsICAgICAgICAgICAgICAgICAgICAgICAgIC8qICIvLm5vdGRlZiIgaW1tZWRpYXRlICAgICAgICAqLworICAgIGltbV9CbHVlRnV6eiwKKyAgICBpbW1fQmx1ZVNjYWxlLAorICAgIGltbV9CbHVlU2hpZnQsCisgICAgaW1tX0JsdWVWYWx1ZXMsCisgICAgaW1tX0NoYXJTdHJpbmdzLAorICAgIGltbV9FbmNvZGluZywKKyAgICBpbW1fRmFtaWx5Qmx1ZXMsCisgICAgaW1tX0ZhbWlseU5hbWUsCisgICAgaW1tX0ZhbWlseU90aGVyQmx1ZXMsCisgICAgaW1tX0ZJRCwKKyAgICBpbW1fRm9udEJCb3gsCisgICAgaW1tX0ZvbnRJRCwKKyAgICBpbW1fRm9udEluZm8sCisgICAgaW1tX0ZvbnRNYXRyaXgsCisgICAgaW1tX0ZvbnROYW1lLAorICAgIGltbV9Gb250VHlwZSwKKyAgICBpbW1fRm9yY2VCb2xkLAorICAgIGltbV9GdWxsTmFtZSwKKyAgICBpbW1fSXRhbGljQW5nbGUsCisgICAgaW1tX0xhbmd1YWdlR3JvdXAsCisgICAgaW1tX01ldHJpY3MsCisgICAgaW1tX01pbkZlYXR1cmUsCisgICAgaW1tX05ELAorICAgIGltbV9OUCwKKyAgICBpbW1fTm90aWNlLAorICAgIGltbV9PdGhlckJsdWVzLAorICAgIGltbV9PdGhlclN1YnJzLAorICAgIGltbV9QYWludFR5cGUsCisgICAgaW1tX1ByaXZhdGUsCisgICAgaW1tX1JELAorICAgIGltbV9SbmRTdGVtVXAsCisgICAgaW1tX1N0ZEhXLAorICAgIGltbV9TdGRWVywKKyAgICBpbW1fU3RlbVNuYXBILAorICAgIGltbV9TdGVtU25hcFYsCisgICAgaW1tX1N0cm9rZVdpZHRoLAorICAgIGltbV9TdWJycywKKyAgICBpbW1fVW5kZXJsaW5lUG9zaXRpb24sCisgICAgaW1tX1VuZGVybGluZVRoaWNrbmVzcywKKyAgICBpbW1fVW5pcXVlSUQsCisgICAgaW1tX1dlaWdodCwKKworICAgIGltbV9pc0ZpeGVkUGl0Y2gsCisgICAgaW1tX2xlbklWLAorICAgIGltbV9wYXNzd29yZCwKKyAgICBpbW1fdmVyc2lvbiwKKworICAgIGltbV9OUF9hbHRlcm5hdGUsICAgICAgICAgICAgICAgICAgIC8qICJ8IiAgPSBhbHRlcm5hdGUgZm9ybSBvZiBOUCAgKi8KKyAgICBpbW1fTkRfYWx0ZXJuYXRlLCAgICAgICAgICAgICAgICAgICAvKiAifC0iID0gYWx0ZXJuYXRlIGZvcm0gb2YgTkQgICovCisKKyAgICBpbW1fbWF4ICAgLyogYWx3YXlzIGtlZXAgdGhpcyB2YWx1ZSBoZXJlICovCisKKyAgfSBUMV9Ub2tlblR5cGU7CisKKworICAvKiB0aGVzZSBhcnJheXMgYXJlIHZpc2libGUgZm9yIGRlYnVnZ2luZyBwdXJwb3Nlcy4uICovCisgIGV4dGVybiBjb25zdCAgY2hhciogIHQxX2tleXdvcmRzW107CisgIGV4dGVybiBjb25zdCAgY2hhciogIHQxX2ltbWVkaWF0ZXNbXTsKKworCisgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgLyogIDxTdHJ1Y3Q+IFQxX1Rva2VuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgLyogIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgLyogICAgIEEgc3RydWN0dXJlIHVzZWQgdG8gZGVzY3JpYmUgYSB0b2tlbiBpbiB0aGUgY3VycmVudCBpbnB1dCAgICAgICAgICovCisgLyogICAgIHN0cmVhbS4gTm90ZSB0aGF0IHRoZSBUeXBlMSBkcml2ZXIgZG9lc24ndCB0cnkgdG8gaW50ZXJwcmV0ICAgICAgICovCisgLyogICAgIHRva2VucyB1bnRpbCBpdCByZWFsbHkgbmVlZHMgdG8uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgLyogIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgLyogICAgIGtpbmQgIDo6IHRva2VuIHR5cGUuIERlc2NyaWJlcyB0aGUgdG9rZW4gdG8gdGhlIGxvYWRlciAgICAgICAgICAgICovCisgLyogICAgIGtpbmQyIDo6IGRldGFpbGVkIHRva2VuIHR5cGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgLyogICAgIHN0YXJ0IDo6ICBpbmRleCBvZiBmaXJzdCBjaGFyYWN0ZXIgb2YgdG9rZW4gaW4gaW5wdXQgc3RyZWFtICAgICAgICovCisgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgLyogICAgIGxlbiAgIDo6ICBsZW5ndGggb2YgdG9rZW4gaW4gY2hhcmFjdGVycy4gICAgICAgICAgICAgICAgICAgICAgICAgICovCisgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgc3RydWN0IFQxX1Rva2VuXworICB7CisgICAgVDFfVG9rZW5UeXBlICAga2luZDsgICAgIC8qIHNpbXBsZSB0eXBlICAgICAgICAgICAgICAgICAgICAqLworICAgIFQxX1Rva2VuVHlwZSAgIGtpbmQyOyAgICAvKiBkZXRhaWxlZCB0eXBlICAgICAgICAgICAgICAgICAgKi8KKyAgICBUMV9JbnQgICAgICAgICBzdGFydDsgICAgLyogaW5kZXggb2YgZmlyc3QgdG9rZW4gY2hhcmFjdGVyICovCisgICAgVDFfSW50ICAgICAgICAgbGVuOyAgICAgIC8qIGxlbmd0aCBvZiB0b2tlbiBpbiBjaGFycyAgICAgICAqLworCisgIH0gVDFfVG9rZW47CisKKworCisKKyAgdHlwZWRlZiAgc3RydWN0ICBUMV9Ub2tlblBhcnNlcl8KKyAgeworICAgIEZUX01lbW9yeSAgIG1lbW9yeTsKKyAgICBGVF9TdHJlYW0gICBzdHJlYW07CisKKyAgICBUMV9Cb29sICAgICBpbl9wZmI7ICAgICAgLyogdHJ1ZSBpZiBQRkIgZmlsZSwgUEZBIG90aGVyd2lzZSAqLworICAgIFQxX0Jvb2wgICAgIGluX3ByaXZhdGU7ICAvKiB0cnVlIGlmIGluIHByaXZhdGUgZGljdGlvbmFyeSAgICovCisKKyAgICBUMV9CeXRlKiAgICBiYXNlOyAgICAgICAgLyogYmFzZSBhZGRyZXNzIG9mIGN1cnJlbnQgcmVhZCBidWZmZXIgKi8KKyAgICBUMV9Mb25nICAgICBjdXJzb3I7ICAgICAgLyogY3VycmVudCBwb3NpdGlvbiBpbiByZWFkIGJ1ZmZlciAgICAgKi8KKyAgICBUMV9Mb25nICAgICBsaW1pdDsgICAgICAgLyogbGltaXQgb2YgY3VycmVudCByZWFkIGJ1ZmZlciAgICAgICAgKi8KKyAgICBUMV9Mb25nICAgICBtYXg7ICAgICAgICAgLyogbWF4aW11bSBzaXplIG9mIHJlYWQgYnVmZmVyICAgICAgICAgKi8KKworICAgIFQxX0Vycm9yICAgIGVycm9yOyAgICAgICAvKiBsYXN0IGVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIFQxX1Rva2VuICAgIHRva2VuOyAgICAgICAvKiBsYXN0IHRva2VuIHJlYWQgICAgICAgICAgICAgICAgICAgICAqLworCisgIH0gVDFfVG9rZW5QYXJzZXI7CisKKworCisgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgLyogIDxUeXBlPiBUMV9Ub2tlbml6ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgLyogIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgLyogICAgIEEgaGFuZGxlIHRvIGFuIG9iamVjdCB1c2VkIHRvIGV4dHJhY3QgdG9rZW5zIGZyb20gdGhlIGlucHV0LiAgICAgICovCisgLyogICAgIFRoZSBvYmplY3QgaXMgYWJsZSB0byBwZXJmb3JtIFBGQS9QRkIgcmVjb2duaXRpb24sIGVleGVjICAgICAgICAgICovCisgLyogICAgIGRlY3J5cHRpb24gb2YgdGhlIHByaXZhdGUgZGljdGlvbmFyeSwgYXMgd2VsbCBhcyBlZXhlYyBkZWNyeXB0aW9uICovCisgLyogICAgIG9mIHRoZSBjaGFyc3RyaW5ncy4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgIFQxX1Rva2VuUGFyc2VyKiAgICBUMV9Ub2tlbml6ZXI7CisKKworIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworIC8qICA8RnVuY3Rpb24+IE5ld19Ub2tlbml6ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworIC8qICA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworIC8qICAgICBDcmVhdGVzIGEgbmV3IHRva2VuaXplciBmcm9tIGEgZ2l2ZW4gaW5wdXQgc3RyZWFtLiBUaGlzIGZ1bmN0aW9uICAqLworIC8qICAgICBhdXRvbWF0aWNhbGx5IHJlY29nbml6ZXMgInBmYSIgb3IgInBmYiIgZmlsZXMuIFRoZSBmdW5jdGlvbiAgICAgICAqLworIC8qICAgICAiUmVhZF9Ub2tlbiIgY2FuIHRoZW4gYmUgdXNlZCB0byBleHRyYWN0IHN1Y2Nlc3NpdmUgdG9rZW5zIGZyb20gICAqLworIC8qICAgICB0aGUgc3RyZWFtLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworIC8qICA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworIC8qICAgICBzdHJlYW0gIDo6IGlucHV0IHN0cmVhbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworIC8qICA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworIC8qICAgICB0b2tlbml6ZXIgOjogaGFuZGxlIHRvIG5ldyB0b2tlbml6ZXIgb2JqZWN0Li4gICAgICAgICAgICAgICAgICAgICAqLworIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworIC8qICA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworIC8qICAgICBUeXBlMSBlcnJvciBjb2RlLiAwIG1lYW5zIHN1Y2Nlc3MuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworIC8qICA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworIC8qICAgICBUaGlzIGZ1bmN0aW9uIGNvcGllcyB0aGUgc3RyZWFtIGhhbmRsZSB3aXRoaW4gdGhlIG9iamVjdC4gQ2FsbGVycyAqLworIC8qICAgICBzaG91bGQgbm90IGRpc2NhcmQgInN0cmVhbSIuIFRoaXMgaXMgZG9uZSBieSB0aGUgRG9uZV9Ub2tlbml6ZXIgICAqLworIC8qICAgICBmdW5jdGlvbi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworIExPQ0FMX0RFRgorIFQxX0Vycm9yICBOZXdfVG9rZW5pemVyKCBGVF9TdHJlYW0gICAgICBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFQxX1Rva2VuaXplciogIHRva2VuaXplciApOworCisKKworIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworIC8qICA8RnVuY3Rpb24+IERvbmVfVG9rZW5pemVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworIC8qICA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworIC8qICAgICBDbG9zZXMgYSBnaXZlbiB0b2tlbml6ZXIuIFRoaXMgZnVuY3Rpb24gd2lsbCBhbHNvIGNsb3NlIHRoZSAgICAgICAqLworIC8qICAgICBzdHJlYW0gZW1iZWRkZWQgaW4gdGhlIG9iamVjdC4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworIC8qICA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworIC8qICAgICB0b2tlbml6ZXIgOjogdGFyZ2V0IHRva2VuaXplciBvYmplY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworIC8qICA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworIC8qICAgICBUeXBlMSBlcnJvciBjb2RlLiAwIG1lYW5zIHN1Y2Nlc3MuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworIExPQ0FMX0RFRgorIFQxX0Vycm9yICBEb25lX1Rva2VuaXplciggVDFfVG9rZW5pemVyICB0b2tlbml6ZXIgKTsKKworCisKKyAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAvKiAgPEZ1bmN0aW9uPiBPcGVuX1ByaXZhdGVEaWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAvKiAgPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAvKiAgICAgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCB0byBzZXQgdGhlIHRva2VuaXplciB0byB0aGUgcHJpdmF0ZSAgKi8KKyAvKiAgICAgc2VjdGlvbiBvZiB0aGUgVHlwZTEgZmlsZS4gSXQgcmVjb2duaXplcyBhdXRvbWF0aWNhbGx5IHRoZSAgICAgICAgKi8KKyAvKiAgICAgdGhlIGtpbmQgb2YgZWV4ZWMgZW5jcnlwdGlvbiB1c2VkIChhc2NpaSBvciBiaW5hcnkpLi4gICAgICAgICAgICAgKi8KKyAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAvKiAgPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAvKiAgICAgdG9rZW5pemVyIDo6IHRhcmdldCB0b2tlbml6ZXIgb2JqZWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAvKiAgICAgbGVuSVYgICAgIDo6IHZhbHVlIG9mIHRoZSAibGVuSVYiIHZhcmlhYmxlLi4gICAgICAgICAgICAgICAgICAgICAgKi8KKyAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAvKiAgPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAvKiAgICAgVHlwZTEgZXJyb3IgY29kZS4gMCBtZWFucyBzdWNjZXNzLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyBMT0NBTF9ERUYKKyBUMV9FcnJvciAgT3Blbl9Qcml2YXRlRGljdCggVDFfVG9rZW5pemVyICB0b2tlbml6ZXIgKTsKKworCisKKyAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAvKiAgPEZ1bmN0aW9uPiBSZWFkX1Rva2VuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAvKiAgPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAvKiAgICAgUmVhZCBhIG5ldyB0b2tlbiBmcm9tIHRoZSBjdXJyZW50IGlucHV0IHN0cmVhbS4gVGhpcyBmdW5jdGlvbiAgICAgKi8KKyAvKiAgICAgZXh0cmFjdHMgYSB0b2tlbiBmcm9tIHRoZSBmb250IHByb2dyYW0gdW50aWwgIk9wZW5fUHJpdmF0ZURpY3QiICAgKi8KKyAvKiAgICAgaGFzIGJlZW4gY2FsbGVkLiBBZnRlciB0aGlzLCBpdCByZXR1cm5zIHRva2VucyBmcm9tIHRoZSAgICAgICAgICAgKi8KKyAvKiAgICAgKGVleGVjLWVuY3J5cHRlZCkgcHJpdmF0ZSBkaWN0aW9ubmFyeS4uICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAvKiAgPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAvKiAgICAgdG9rZW5pemVyIDo6IHRhcmdldCB0b2tlbml6ZXIgb2JqZWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAvKiAgPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAvKiAgICAgVHlwZTEgZXJyb3IgY29kZS4gMCBtZWFucyBzdWNjZXNzLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAvKiAgPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAvKiAgICAgT25lIHNob3VsZCB1c2UgdGhlIGZ1bmN0aW9uIFJlYWRfQ2hhclN0cmluZ3MgdG8gcmVhZCB0aGUgYmluYXJ5ICAgKi8KKyAvKiAgICAgY2hhcnN0cmluZ3MgZnJvbSB0aGUgcHJpdmF0ZSBkaWN0Li4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyBMT0NBTF9ERUYKKyBUMV9FcnJvciAgUmVhZF9Ub2tlbiggVDFfVG9rZW5pemVyICB0b2tlbml6ZXIgKTsKKworCisKKyAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAvKiAgPEZ1bmN0aW9uPiBSZWFkX0NoYXJTdHJpbmdzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAvKiAgPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAvKiAgICAgUmVhZCBhIGNoYXJzdHJpbmdzIGZyb20gdGhlIGN1cnJlbnQgaW5wdXQgc3RyZWFtLiBUaGVzZSBhcmUgICAgICAgKi8KKyAvKiAgICAgYmluYXJ5IGJ5dGVzIHRoYXQgZW5jb2RlIGVhY2ggaW5kaXZpZHVhbCBnbHlwaCBvdXRsaW5lLiAgICAgICAgICAgKi8KKyAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAvKiAgPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAvKiAgICAgdG9rZW5pemVyIDo6IHRhcmdldCB0b2tlbml6ZXIgb2JqZWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAvKiAgICAgbnVtX2NoYXJzIDo6IG51bWJlciBvZiBiaW5hcnkgYnl0ZXMgdG8gcmVhZCAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAvKiAgPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAvKiAgICAgYnVmZmVyICAgIDo6IHRhcmdldCBhcnJheSBvZiBieXRlcy4gVGhlc2UgYXJlIGVleGVjLWRlY3J5cHRlZC4uICAgKi8KKyAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAvKiAgPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAvKiAgICAgVHlwZTEgZXJyb3IgY29kZS4gMCBtZWFucyBzdWNjZXNzLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAvKiAgPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAvKiAgICAgT25lIHNob3VsZCB1c2UgdGhlIGZ1bmN0aW9uIFJlYWRfQ2hhclN0cmluZ3MgdG8gcmVhZCB0aGUgYmluYXJ5ICAgKi8KKyAvKiAgICAgY2hhcnN0cmluZ3MgZnJvbSB0aGUgcHJpdmF0ZSBkaWN0Li4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyBMT0NBTF9ERUYKKyBUMV9FcnJvciAgUmVhZF9DaGFyU3RyaW5ncyggVDFfVG9rZW5pemVyICB0b2tlbml6ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQxX0ludCAgICAgICAgbnVtX2NoYXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUMV9CeXRlKiAgICAgIGJ1ZmZlciApOworCisKKyAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAvKiAgPEZ1bmN0aW9uPiB0MV9kZWNyeXB0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAvKiAgPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAvKiAgICAgUGVyZm9ybXMgdGhlIFR5cGUgMSBjaGFyc3RyaW5nIGRlY3J5cHRpb24gcHJvY2Vzcy4uICAgICAgICAgICAgICAgKi8KKyAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAvKiAgPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAvKiAgICAgYnVmZmVyICA6OiBiYXNlIGFkZHJlc3Mgb2YgZGF0YSB0byBkZWNyeXB0ICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAvKiAgICAgbGVuZ3RoICA6OiBudW1iZXIgb2YgYnl0ZXMgdG8gZGVjcnlwdCBmcm9tIGJhc2UgYWRkcmVzcyAgICAgICAgICAgKi8KKyAvKiAgICAgc2VlZCAgICA6OiBlY25yeXB0aW9uIHNlZWQgKDQzMzAgZm9yIGNoYXJzdHJpbmdzKS4gICAgICAgICAgICAgICAgKi8KKyAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgTE9DQUxfREVGCisgIHZvaWQgIHQxX2RlY3J5cHQoIFQxX0J5dGUqICAgYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICBUMV9JbnQgICAgIGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgVDFfVVNob3J0ICBzZWVkICk7CisKKyNlbmRpZiAvKiBUMVRPS0VOU19IICovCmRpZmYgLS1naXQgYS9zcmMvdHlwZTEvdHlwZTEuYyBiL3NyYy90eXBlMS90eXBlMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3MDU4ZDAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdHlwZTEvdHlwZTEuYwpAQCAtMCwwICsxLDUwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICB0eXBlMS5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEZyZWVUeXBlIFR5cGUgMSBkcml2ZXIgY29tcG9uZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDE5OTYtMTk5OCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkICAgICAgICAqLworLyogIG1vZGlmaWVkIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAgKi8KKy8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCisvKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLworLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgZmlsZSBpcyB1c2VkIHRvIGNvbXBpbGUgdGhlIEZyZWVUeXBlIFR5cGUgMSAgZm9udCBkcml2ZXIuICAgICAgICAgKi8KKy8qICBJdCByZWxpZXMgb24gYWxsIGNvbXBvbmVudHMgaW5jbHVkZWQgaW4gdGhlICJiYXNlIiBsYXllciAoc2VlICAgICAgICAgICovCisvKiAgdGhlIGZpbGUgImZ0YmFzZS5jIikuIFNvdXJjZSBjb2RlIGlzIGxvY2F0ZWQgaW4gImZyZWV0eXBlL3R0bGliIiAgICAgICAqLworLyogIGFuZCBjb250YWlucyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgLSBhIGRyaXZlciBpbnRlcmZhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgIC0gYW4gb2JqZWN0IG1hbmFnZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAtIGEgdGFibGUgbG9hZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgLSBhIGdseXBoIGxvYWRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgIC0gYSBnbHlwaCBoaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKworI2lmIDAKKyNkZWZpbmUgRlRfTUFLRV9PUFRJT05fU0lOR0xFX09CSkVDVAorI2luY2x1ZGUgPHQxZHJpdmVyLmM+ICAgLyogZHJpdmVyIGludGVyZmFjZSAgKi8KKyNpbmNsdWRlIDx0MW9ianMuYz4gICAgIC8qIG9iamVjdCBtYW5hZ2VyICAgICovCisjaW5jbHVkZSA8dDFsb2FkLmM+ICAgICAvKiB0YWJsZSBsb2FkZXIgICAgICAqLworI2luY2x1ZGUgPHQxaGludC5jPiAgICAgLyogaGludGVyICAgICAgICAgICAgKi8KKyNpbmNsdWRlIDx0MWdsb2FkLmM+ICAgIC8qIGdseXBoIGxvYWRlciAgICAgICovCisjZW5kaWYKKworI2luY2x1ZGUgPHQxZHJpdmVyLmM+CisjaW5jbHVkZSA8dDFvYmpzLmM+CisjaW5jbHVkZSA8dDFsb2FkLmM+ICAgICAvKiB0YWJsZSBsb2FkZXIgICAgICAqLworI2luY2x1ZGUgPHQxZ2xvYWQuYz4KKworI2luY2x1ZGUgPHQxdG9rZW5zLmM+CisjaW5jbHVkZSA8dDFwYXJzZS5jPgorI2luY2x1ZGUgPHQxZW5jb2RlLmM+CisjaW5jbHVkZSA8dDFoaW50ZXIuYz4KKwo=