LyoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIENvcHlyaWdodCCpIHsxOTk2LTIwMDF9LCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBGaWxlIHVub3JtLmgKKgoqIENyZWF0ZWQgYnk6IFZsYWRpbWlyIFdlaW5zdGVpbiAxMjA1MjAwMAoqCiovCiNpZm5kZWYgVU5PUk1fSAojZGVmaW5lIFVOT1JNX0gKCiNpbmNsdWRlICJ1bmljb2RlL3V0eXBlcy5oIgoKLyoqCiAqIEBuYW1lIFVuaWNvZGUgbm9ybWFsaXphdGlvbiBBUEkKICoKICogPHR0PnVfbm9ybWFsaXplPC90dD4gdHJhbnNmb3JtcyBVbmljb2RlIHRleHQgaW50byBhbiBlcXVpdmFsZW50IGNvbXBvc2VkIG9yCiAqIGRlY29tcG9zZWQgZm9ybSwgYWxsb3dpbmcgZm9yIGVhc2llciBzb3J0aW5nIGFuZCBzZWFyY2hpbmcgb2YgdGV4dC4KICogPHR0PnVfbm9ybWFsaXplPC90dD4gc3VwcG9ydHMgdGhlIHN0YW5kYXJkIG5vcm1hbGl6YXRpb24gZm9ybXMgZGVzY3JpYmVkIGluCiAqIDxhIGhyZWY9Imh0dHA6Ly93d3cudW5pY29kZS5vcmcvdW5pY29kZS9yZXBvcnRzL3RyMTUvIiB0YXJnZXQ9InVuaWNvZGUiPgogKiBVbmljb2RlIFRlY2huaWNhbCBSZXBvcnQgIzE1PC9hPi4KICogPHA+CiAqIENoYXJhY3RlcnMgd2l0aCBhY2NlbnRzIG9yIG90aGVyIGFkb3JubWVudHMgY2FuIGJlIGVuY29kZWQgaW4KICogc2V2ZXJhbCBkaWZmZXJlbnQgd2F5cyBpbiBVbmljb2RlLiAgRm9yIGV4YW1wbGUsIHRha2UgdGhlIGNoYXJhY3RlciAiwSIKICogKEEtYWN1dGUpLiAgIEluIFVuaWNvZGUsIHRoaXMgY2FuIGJlIGVuY29kZWQgYXMgYSBzaW5nbGUgY2hhcmFjdGVyICh0aGUKICogImNvbXBvc2VkIiBmb3JtKToKICogPHByZT4KICogICAgICAwMEMxICAgIExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBBQ1VURTwvcHJlPgogKiBvciBhcyB0d28gc2VwYXJhdGUgY2hhcmFjdGVycyAodGhlICJkZWNvbXBvc2VkIiBmb3JtKToKICogPHByZT4KICogICAgICAwMDQxICAgIExBVElOIENBUElUQUwgTEVUVEVSIEEKICogICAgICAwMzAxICAgIENPTUJJTklORyBBQ1VURSBBQ0NFTlQ8L3ByZT4KICogPHA+CiAqIFRvIGEgdXNlciBvZiB5b3VyIHByb2dyYW0sIGhvd2V2ZXIsIGJvdGggb2YgdGhlc2Ugc2VxdWVuY2VzIHNob3VsZCBiZQogKiB0cmVhdGVkIGFzIHRoZSBzYW1lICJ1c2VyLWxldmVsIiBjaGFyYWN0ZXIgIsEiLiAgV2hlbiB5b3UgYXJlIHNlYXJjaGluZyBvcgogKiBjb21wYXJpbmcgdGV4dCwgeW91IG11c3QgZW5zdXJlIHRoYXQgdGhlc2UgdHdvIHNlcXVlbmNlcyBhcmUgdHJlYXRlZCAKICogZXF1aXZhbGVudGx5LiAgSW4gYWRkaXRpb24sIHlvdSBtdXN0IGhhbmRsZSBjaGFyYWN0ZXJzIHdpdGggbW9yZSB0aGFuIG9uZQogKiBhY2NlbnQuICBTb21ldGltZXMgdGhlIG9yZGVyIG9mIGEgY2hhcmFjdGVyJ3MgY29tYmluaW5nIGFjY2VudHMgaXMKICogc2lnbmlmaWNhbnQsIHdoaWxlIGluIG90aGVyIGNhc2VzIGFjY2VudCBzZXF1ZW5jZXMgaW4gZGlmZmVyZW50IG9yZGVycyBhcmUKICogcmVhbGx5IGVxdWl2YWxlbnQuCiAqIDxwPgogKiBTaW1pbGFybHksIHRoZSBzdHJpbmcgImZmaSIgY2FuIGJlIGVuY29kZWQgYXMgdGhyZWUgc2VwYXJhdGUgbGV0dGVyczoKICogPHByZT4KICogICAgICAwMDY2ICAgIExBVElOIFNNQUxMIExFVFRFUiBGCiAqICAgICAgMDA2NiAgICBMQVRJTiBTTUFMTCBMRVRURVIgRgogKiAgICAgIDAwNjkgICAgTEFUSU4gU01BTEwgTEVUVEVSIEk8L3ByZT4KICogb3IgYXMgdGhlIHNpbmdsZSBjaGFyYWN0ZXIKICogPHByZT4KICogICAgICBGQjAzICAgIExBVElOIFNNQUxMIExJR0FUVVJFIEZGSTwvcHJlPgogKiA8cD4KICogVGhlIGZmaSBsaWdhdHVyZSBpcyBub3QgYSBkaXN0aW5jdCBzZW1hbnRpYyBjaGFyYWN0ZXIsIGFuZCBzdHJpY3RseSBzcGVha2luZwogKiBpdCBzaG91bGRuJ3QgYmUgaW4gVW5pY29kZSBhdCBhbGwsIGJ1dCBpdCB3YXMgaW5jbHVkZWQgZm9yIGNvbXBhdGliaWxpdHkKICogd2l0aCBleGlzdGluZyBjaGFyYWN0ZXIgc2V0cyB0aGF0IGFscmVhZHkgcHJvdmlkZWQgaXQuICBUaGUgVW5pY29kZSBzdGFuZGFyZAogKiBpZGVudGlmaWVzIHN1Y2ggY2hhcmFjdGVycyBieSBnaXZpbmcgdGhlbSAiY29tcGF0aWJpbGl0eSIgZGVjb21wb3NpdGlvbnMKICogaW50byB0aGUgY29ycmVzcG9uZGluZyBzZW1hbnRpYyBjaGFyYWN0ZXJzLiAgV2hlbiBzb3J0aW5nIGFuZCBzZWFyY2hpbmcsIHlvdQogKiB3aWxsIG9mdGVuIHdhbnQgdG8gdXNlIHRoZXNlIG1hcHBpbmdzLgogKiA8cD4KICogPHR0PnVfbm9ybWFsaXplPC90dD4gaGVscHMgc29sdmUgdGhlc2UgcHJvYmxlbXMgYnkgdHJhbnNmb3JtaW5nIHRleHQgaW50byB0aGUKICogY2Fub25pY2FsIGNvbXBvc2VkIGFuZCBkZWNvbXBvc2VkIGZvcm1zIGFzIHNob3duIGluIHRoZSBmaXJzdCBleGFtcGxlIGFib3ZlLiAgCiAqIEluIGFkZGl0aW9uLCB5b3UgY2FuIGhhdmUgaXQgcGVyZm9ybSBjb21wYXRpYmlsaXR5IGRlY29tcG9zaXRpb25zIHNvIHRoYXQgCiAqIHlvdSBjYW4gdHJlYXQgY29tcGF0aWJpbGl0eSBjaGFyYWN0ZXJzIHRoZSBzYW1lIGFzIHRoZWlyIGVxdWl2YWxlbnRzLgogKiBGaW5hbGx5LCA8dHQ+dV9ub3JtYWxpemU8L3R0PiByZWFycmFuZ2VzIGFjY2VudHMgaW50byB0aGUgcHJvcGVyIGNhbm9uaWNhbAogKiBvcmRlciwgc28gdGhhdCB5b3UgZG8gbm90IGhhdmUgdG8gd29ycnkgYWJvdXQgYWNjZW50IHJlYXJyYW5nZW1lbnQgb24geW91cgogKiBvd24uCiAqIDxwPgogKiA8dHQ+dV9ub3JtYWxpemU8L3R0PiBhZGRzIG9uZSBvcHRpb25hbCBiZWhhdmlvciwge0BsaW5rICNVQ09MX0lHTk9SRV9IQU5HVUx9LAogKiB0aGF0IGRpZmZlcnMgZnJvbQogKiB0aGUgc3RhbmRhcmQgVW5pY29kZSBOb3JtYWxpemF0aW9uIEZvcm1zLiAKICoqLwoKICAvKioKICAgICogVUNPTF9OT19OT1JNQUxJWkFUSU9OIDogQWNjZW50ZWQgY2hhcmFjdGVycyB3aWxsIG5vdCBiZSBkZWNvbXBvc2VkIGZvciBzb3J0aW5nLiAgCiAgICAqIFVDT0xfREVDT01fQ0FOICAgICAgICAgIDogQ2hhcmFjdGVycyB0aGF0IGFyZSBjYW5vbmljYWwgdmFyaWFudHMgYWNjb3JkaW5nIAogICAgKiB0byBVbmljb2RlIDIuMCB3aWxsIGJlIGRlY29tcG9zZWQgZm9yIHNvcnRpbmcuIAogICAgKiBVQ09MX0RFQ09NUF9DT01QQVQgICAgOiBDaGFyYWN0ZXJzIHRoYXQgYXJlIGNvbXBhdGliaWxpdHkgdmFyaWFudHMgd2lsbCBiZQogICAgKiBkZWNvbXBvc2VkIGZvciBzb3J0aW5nLiBUaGlzIGlzIHRoZSBkZWZhdWx0IG5vcm1hbGl6YXRpb24gbW9kZSB1c2VkLgogICAgKiBVQ09MX0RFQ09NUF9DQU5fQ09NUF9DT01QQVQgOiBDYW5vbmljYWwgZGVjb21wb3NpdGlvbiBmb2xsb3dlZCBieSBjYW5vbmljYWwgY29tcG9zaXRpb24gCiAgICAqIFVDT0xfREVDT01QX0NPTVBBVF9DT01QX0NBTiA6IENvbXBhdGliaWxpdHkgZGVjb21wb3NpdGlvbiBmb2xsb3dlZCBieSBjYW5vbmljYWwgY29tcG9zaXRpb24KICAgICoKICAgICoqLwoKdHlwZWRlZiBlbnVtIHsKICAvKiogTm8gZGVjb21wb3NpdGlvbi9jb21wb3NpdGlvbiAqLwogIFVDT0xfTk9fTk9STUFMSVpBVElPTiA9IDEsCiAgLyoqIENhbm9uaWNhbCBkZWNvbXBvc2l0aW9uICovCiAgVUNPTF9ERUNPTVBfQ0FOID0gMiwKICAvKiogQ29tcGF0aWJpbGl0eSBkZWNvbXBvc2l0aW9uICovCiAgVUNPTF9ERUNPTVBfQ09NUEFUID0gMywKICAvKiogRGVmYXVsdCBub3JtYWxpemF0aW9uICovCiAgVUNPTF9ERUZBVUxUX05PUk1BTElaQVRJT04gPSBVQ09MX0RFQ09NUF9DT01QQVQsIAogIC8qKiBDYW5vbmljYWwgZGVjb21wb3NpdGlvbiBmb2xsb3dlZCBieSBjYW5vbmljYWwgY29tcG9zaXRpb24gKi8KICBVQ09MX0RFQ09NUF9DQU5fQ09NUF9DT01QQVQgPSA0LAogIC8qKiBDb21wYXRpYmlsaXR5IGRlY29tcG9zaXRpb24gZm9sbG93ZWQgYnkgY2Fub25pY2FsIGNvbXBvc2l0aW9uICovCiAgVUNPTF9ERUNPTVBfQ09NUEFUX0NPTVBfQ0FOID01LAogIC8qKiBObyBkZWNvbXBvc2l0aW9uL2NvbXBvc2l0aW9uICovCiAgVU5PUk1fTk9ORSA9IDEsIAogIC8qKiBDYW5vbmljYWwgZGVjb21wb3NpdGlvbiAqLwogIFVOT1JNX05GRCA9IDIsCiAgLyoqIENvbXBhdGliaWxpdHkgZGVjb21wb3NpdGlvbiAqLwogIFVOT1JNX05GS0QgPSAzLAogIC8qKiBDYW5vbmljYWwgZGVjb21wb3NpdGlvbiBmb2xsb3dlZCBieSBjYW5vbmljYWwgY29tcG9zaXRpb24gKi8KICBVTk9STV9ORkMgPSA0LAogIC8qKiBEZWZhdWx0IG5vcm1hbGl6YXRpb24gKi8KICBVTk9STV9ERUZBVUxUID0gVU5PUk1fTkZDLCAKICAvKiogQ29tcGF0aWJpbGl0eSBkZWNvbXBvc2l0aW9uIGZvbGxvd2VkIGJ5IGNhbm9uaWNhbCBjb21wb3NpdGlvbiAqLwogIFVOT1JNX05GS0MgPTUsCgogIFVOT1JNX01PREVfQ09VTlQsCgogIC8qKiBEbyBub3Qgbm9ybWFsaXplIEhhbmd1bCAqLwogIFVDT0xfSUdOT1JFX0hBTkdVTCAgICA9IDE2LAogIFVOT1JNX0lHTk9SRV9IQU5HVUwgICAgPSAxNgp9IFVOb3JtYWxpemF0aW9uTW9kZTsKCi8qKiBQb3NzaWJsZSBub3JtYWxpemF0aW9uIG9wdGlvbnMgKi8KdHlwZWRlZiBVTm9ybWFsaXphdGlvbk1vZGUgVU5vcm1hbGl6YXRpb25PcHRpb247CgovKioKICogTm9ybWFsaXplIGEgc3RyaW5nLgogKiBUaGUgc3RyaW5nIHdpbGwgYmUgbm9ybWFsaXplZCBhY2NvcmRpbmcgdGhlIHRoZSBzcGVjaWZpZWQgbm9ybWFsaXphdGlvbiBtb2RlCiAqIGFuZCBvcHRpb25zLgogKiBAcGFyYW0gc291cmNlIFRoZSBzdHJpbmcgdG8gbm9ybWFsaXplLgogKiBAcGFyYW0gc291cmNlTGVuZ3RoIFRoZSBsZW5ndGggb2Ygc291cmNlLCBvciAtMSBpZiBudWxsLXRlcm1pbmF0ZWQuCiAqIEBwYXJhbSBtb2RlIFRoZSBub3JtYWxpemF0aW9uIG1vZGU7IG9uZSBvZiBVQ09MX05PX05PUk1BTElaQVRJT04sIAogKiBVQ09MX0NBTl9ERUNPTVAsIFVDT0xfQ09NUEFUX0RFQ09NUCwgVUNPTF9DQU5fREVDT01QX0NPTVBBVF9DT01QLCAKICogVUNPTF9DT01QQVRfREVDT01QX0NBTl9DT01QLCBVQ09MX0RFRkFVTFRfTk9STUFMSVpBVElPTgogKiBAcGFyYW0gb3B0aW9ucyBUaGUgbm9ybWFsaXphdGlvbiBvcHRpb25zLCBPUmVkIHRvZ2V0aGVyOyBwb3NzaWJsZSB2YWx1ZXMKICogYXJlIFVDT0xfSUdOT1JFX0hBTkdVTAogKiBAcGFyYW0gcmVzdWx0IEEgcG9pbnRlciB0byBhIGJ1ZmZlciB0byByZWNlaXZlIHRoZSBhdHRyaWJ1dGUuCiAqIEBwYXJhbSByZXN1bHRMZW5ndGggVGhlIG1heGltdW0gc2l6ZSBvZiByZXN1bHQuCiAqIEBwYXJhbSBzdGF0dXMgQSBwb2ludGVyIHRvIGFuIFVFcnJvckNvZGUgdG8gcmVjZWl2ZSBhbnkgZXJyb3JzCiAqIEByZXR1cm4gVGhlIHRvdGFsIGJ1ZmZlciBzaXplIG5lZWRlZDsgaWYgZ3JlYXRlciB0aGFuIHJlc3VsdExlbmd0aCwKICogdGhlIG91dHB1dCB3YXMgdHJ1bmNhdGVkLgogKiBAc3RhYmxlCiAqLwpVX0NBUEkgaW50MzJfdAp1X25vcm1hbGl6ZShjb25zdCBVQ2hhciogICAgICAgICAgIHNvdXJjZSwKICAgICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICBzb3VyY2VMZW5ndGgsIAogICAgICAgIFVOb3JtYWxpemF0aW9uTW9kZSAgICAgIG1vZGUsIAogICAgICAgIGludDMyX3QgICAgICAgICAgICBvcHRpb25zLAogICAgICAgIFVDaGFyKiAgICAgICAgICAgICAgICAgIHJlc3VsdCwKICAgICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICByZXN1bHRMZW5ndGgsCiAgICAgICAgVUVycm9yQ29kZSogICAgICAgICAgICAgc3RhdHVzKTsgICAgCgojZW5kaWYK