LyogJElkOiBnNzIyMS5oIDM1NTMgMjAxMS0wNS0wNSAwNjoxNDoxOVogbmFuYW5nICQgKi8KLyogCiAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQogKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwOCBCZW5ueSBQcmlqb25vIDxiZW5ueUBwcmlqb25vLm9yZz4KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKICovCiNpZm5kZWYgX19QSk1FRElBX0NPREVDU19HNzIyMV9IX18KI2RlZmluZSBfX1BKTUVESUFfQ09ERUNTX0c3MjIxX0hfXwoKLyoqCiAqIEBmaWxlIHBqbWVkaWEtY29kZWMvZzcyMjEuaAogKiBAYnJpZWYgRzcyMi4xIGNvZGVjLgogKi8KCiNpbmNsdWRlIDxwam1lZGlhLWNvZGVjL3R5cGVzLmg+CgovKioKICogQGRlZmdyb3VwIFBKTUVEX0c3MjIxX0NPREVDIEcuNzIyLjEgQ29kZWMgKFNpcmVuNy9TaXJlbjE0KQogKiBAaW5ncm91cCBQSk1FRElBX0NPREVDX0NPREVDUwogKiBAYnJpZWYgSW1wbGVtZW50YXRpb24gb2YgRy43MjIuMSBjb2RlYwogKiBAewogKgogKiA8Yj5HLjcyMi4xIGxpY2Vuc2VkIGZyb20gUG9seWNvba48L2I+PGJyIC8+CiAqIDxiPkcuNzIyLjEgQW5uZXggQyBsaWNlbnNlZCBmcm9tIFBvbHljb22uPC9iPgogKgogKiBUaGlzIHNlY3Rpb24gZGVzY3JpYmVzIGZ1bmN0aW9ucyB0byBpbml0aWFsaXplIGFuZCByZWdpc3RlciBHLjcyMi4xIGNvZGVjCiAqIGZhY3RvcnkgdG8gdGhlIGNvZGVjIG1hbmFnZXIuIEFmdGVyIHRoZSBjb2RlYyBmYWN0b3J5IGhhcyBiZWVuIHJlZ2lzdGVyZWQsCiAqIGFwcGxpY2F0aW9uIGNhbiB1c2UgQHJlZiBQSk1FRElBX0NPREVDIEFQSSB0byBtYW5pcHVsYXRlIHRoZSBjb2RlYy4KICoKICogUEpNRURJQSBHNzIyLjEgY29kZWMgaW1wbGVtZW50YXRpb24gaXMgYmFzZWQgb24gSVRVLVQgUmVjb21tZW5kYXRpb24gCiAqIEcuNzIyLjEgKDA1LzIwMDUpIEMgZml4ZWQgcG9pbnQgaW1wbGVtZW50YXRpb24gaW5jbHVkaW5nIGl0cyBBbm5leCBDLgogKgogKiBHLjcyMi4xIGlzIGEgbG93IGNvbXBsZXhpdHkgY29kZWMgdGhhdCBzdXBwb3J0cyA3a0h6IGFuZCAxNGtIeiBhdWRpbyAKICogYmFuZHdpZHRoIHdvcmtpbmcgYXQgYml0cmF0ZXMgcmFuZ2luZyBmcm9tIDE2a2JwcyB0byA0OGticHMuIEl0IG1heSBiZQogKiB1c2VkIHdpdGggc3BlZWNoIG9yIG11c2ljIGlucHV0cy4KICoKICoKICogXHNlY3Rpb24gY29kZWNfc2V0dGluZyBDb2RlYyBTZXR0aW5ncwogKgogKiBcc3Vic2VjdGlvbiBnZW5lcmFsX3NldHRpbmcgR2VuZXJhbCBTZXR0aW5ncwogKgogKiBHZW5lcmFsIGNvZGVjIHNldHRpbmdzIGZvciB0aGlzIGNvZGVjIHN1Y2ggYXMgVkFEIGFuZCBQTEMgY2FuIGJlIAogKiBtYW5pcHVsYXRlZCB0aHJvdWdoIHRoZSA8dHQ+c2V0dGluZzwvdHQ+IGZpZWxkIGluICNwam1lZGlhX2NvZGVjX3BhcmFtLiAKICogUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnRhdGlvbiBvZiAjcGptZWRpYV9jb2RlY19wYXJhbSBmb3IgbW9yZSBpbmZvLgogKgogKiBcc3Vic2VjdGlvbiBzcGVjaWZpY19zZXR0aW5nIENvZGVjIFNwZWNpZmljIFNldHRpbmdzCiAqCiAqIFRoZSBmb2xsb3dpbmcgc2V0dGluZ3MgYXJlIGFwcGxpY2FibGUgZm9yIHRoaXMgY29kZWMuCiAqCiAqIFxzdWJzdWJzZWN0aW9uIGJpdHJhdGUgQml0cmF0ZQogKgogKiBUaGUgY29kZWMgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgc3RhbmRhcmQgYW5kIG5vbi1zdGFuZGFyZCBiaXRyYXRlcy4KICogVXNlICNwam1lZGlhX2NvZGVjX2c3MjIxX3NldF9tb2RlKCkgdG8gZW5hYmxlIG9yIGRpc2FibGUgdGhlIGJpdHJhdGVzLgogKgogKiBCeSBkZWZhdWx0LCBvbmx5IHN0YW5kYXJkIGJpdHJhdGVzIGFyZSBlbmFibGVkIHVwb24gaW5pdGlhbGl6YXRpb246CiAqIC0gZm9yIDdrSHogYXVkaW8gYmFuZHdpZHRoICgxNmtIeiBzYW1wbGluZyByYXRlKTogMjRrYnBzIGFuZCAzMmticHMsCiAqIC0gZm9yIDE0a0h6IGF1ZGlvIGJhbmR3aWR0aCAoMzJrSHogc2FtcGxpbmcgcmF0ZSk6IDI0a2JwcywgMzJrYnBzLCBhbmQKICogICA0OGticHMuCiAqCiAqIFRoZSB1c2FnZSBvZiBub24tc3RhbmRhcmQgYml0cmF0ZXMgbXVzdCBmb2xsb3cgdGhlc2UgcmVxdWlyZW1lbnRzOgogKiAtIGZvciA3a0h6IGF1ZGlvIGJhbmR3aWR0aCAoMTZrSHogc2FtcGxpbmcgcmF0ZSk6IDE2MDAwIHRvIDMyMDAwIGJwcywgCiAqICAgbXVsdGlwbGljYXRpb24gb2YgNDAwCiAqIC0gZm9yIDE0a0h6IGF1ZGlvIGJhbmR3aWR0aCAoMzJrSHogc2FtcGxpbmcgcmF0ZSk6IDI0MDAwIHRvIDQ4MDAwIGJwcywKICogICBtdWx0aXBsaWNhdGlvbiBvZiA0MDAKICoKICogXG5vdGUKICogQ3VycmVudGx5IG9ubHkgdXAgdG8gdHdvIG5vbi1zdGFuZGFyZCBtb2RlcyBjYW4gYmUgZW5hYmxlZC4KICoKICogXHJlbWFyawogKiBUaGVyZSBpcyBhIGZsYXcgaW4gdGhlIGNvZGVjIG1hbmFnZXIgYXMgY3VycmVudGx5IGl0IGNvdWxkIG5vdAogKiBkaWZmZXJlbnRpYXRlIEcuNzIyLjEgY29kZWNzIGJ5IGJpdHJhdGVzLCBoZW5jZSBpbnZva2luZyAKICogI3BqbWVkaWFfY29kZWNfbWdyX3NldF9kZWZhdWx0X3BhcmFtKCkgbWF5IG9ubHkgYWZmZWN0IGEgRy43MjIuMSBjb2RlYwogKiB3aXRoIHRoZSBoaWdoZXN0IHByaW9yaXR5IChvciBmaXJzdCBpbmRleCBmb3VuZCBpbiBjb2RlYyBlbnVtZXJhdGlvbiAKICogd2hlbiB0aGV5IGhhdmUgc2FtZSBwcmlvcml0eSkgYW5kIGludm9raW5nCiAqICNwam1lZGlhX2NvZGVjX21ncl9zZXRfY29kZWNfcHJpb3JpdHkoKSB3aWxsIHNldCBwcmlvcml0eSBvZiBhbGwgRy43MjIuMQogKiBjb2RlY3Mgd2l0aCBzYW1wbGluZyByYXRlIGFzIHNwZWNpZmllZC4KICovCgpQSl9CRUdJTl9ERUNMCgovKioKICogSW5pdGlhbGl6ZSBhbmQgcmVnaXN0ZXIgRy43MjIuMSBjb2RlYyBmYWN0b3J5IHRvIHBqbWVkaWEgZW5kcG9pbnQuCiAqCiAqIEBwYXJhbSBlbmRwdAkgICAgVGhlIHBqbWVkaWEgZW5kcG9pbnQuCiAqCiAqIEByZXR1cm4JICAgIFBKX1NVQ0NFU1Mgb24gc3VjY2Vzcy4KICovClBKX0RFQ0wocGpfc3RhdHVzX3QpIHBqbWVkaWFfY29kZWNfZzcyMjFfaW5pdCggcGptZWRpYV9lbmRwdCAqZW5kcHQgKTsKCgovKioKICogRW5hYmxlIGFuZCBkaXNhYmxlIEcuNzIyLjEgbW9kZS4gQnkgZGVmYXVsdCwgdGhlIHN0YW5kYXJkIG1vZGVzIGFyZSAKICogZW5hYmxlZCB1cG9uIGluaXRpYWxpemF0aW9uLCBpLmUuOgogKiAtIHNhbXBsaW5nIHJhdGUgMTZrSHosIGJpdHJhdGUgMjRrYnBzIGFuZCAzMmticHMuCiAqIC0gc2FtcGxpbmcgcmF0ZSAzMmtIeiwgYml0cmF0ZSAyNGticHMsIDMya2JwcywgYW5kIDQ4a2Jwcy4KICogVGhpcyBmdW5jdGlvbiBjYW4gYWxzbyBiZSB1c2VkIGZvciBlbmFibGluZyBub24tc3RhbmRhcmQgbW9kZXMuCiAqIE5vdGUgdGhhdCBjdXJyZW50bHkgb25seSB1cCB0byB0d28gbm9uLXN0YW5kYXJkIG1vZGVzIGNhbiBiZSBlbmFibGVkCiAqIGF0IG9uZSB0aW1lLgogKgogKiBAcGFyYW0gc2FtcGxlX3JhdGUJUENNIHNhbXBsaW5nIHJhdGUsIGluIEh6LCB2YWxpZCB2YWx1ZXMgYXJlIG9ubHkgCiAqCQkJMTYwMDAgYW5kIDMyMDAwLgogKiBAcGFyYW0gYml0cmF0ZQlHNzIyLjEgYml0cmF0ZSwgaW4gYnBzLCB0aGUgdmFsaWQgdmFsdWVzIGFyZQogKgkJCXN0YW5kYXJkIGFuZCBub24tc3RhbmRhcmQgYml0cmF0ZXMgYXMgZGVzY3JpYmVkIAogKgkJCWFib3ZlLgogKiBAcGFyYW0gZW5hYmxlZAlQSl9UUlVFIGZvciBlbmFibGluZyBzcGVjaWZpZWQgbW9kZS4KICoKICogQHJldHVybgkJUEpfU1VDQ0VTUyBvbiBzdWNjZXNzLgogKi8KUEpfREVDTChwal9zdGF0dXNfdCkgcGptZWRpYV9jb2RlY19nNzIyMV9zZXRfbW9kZSh1bnNpZ25lZCBzYW1wbGVfcmF0ZSwgCgkJCQkJCSAgdW5zaWduZWQgYml0cmF0ZSwgCgkJCQkJCSAgcGpfYm9vbF90IGVuYWJsZWQpOwoKLyoqCiAqIFNldCB0aGUgRy43MjIuMSBjb2RlYyBlbmNvZGVyIGFuZCBkZWNvZGVyIGxldmVsIGFkanVzdG1lbnQuIAogKiBJZiB0aGUgdmFsdWUgaXMgbm9uLXplcm8sIHRoZW4gUENNIGlucHV0IHNhbXBsZXMgdG8gdGhlIGVuY29kZXIgd2lsbCAKICogYmUgc2hpZnRlZCByaWdodCBieSB0aGlzIHZhbHVlLCBhbmQgc2ltaWxhcmx5IFBDTSBvdXRwdXQgc2FtcGxlcyBmcm9tCiAqIHRoZSBkZWNvZGVyIHdpbGwgYmUgc2hpZnRlZCBsZWZ0IGJ5IHRoaXMgdmFsdWUuCiAqCiAqIFxub3RlCiAqIFRoaXMgZnVuY3Rpb24gaXMgYWxzbyBhcHBsaWNhYmxlIGZvciBHNzIyLjEgaW1wbGVtZW50YXRpb24gd2l0aCBJUFAKICogYmFjay1lbmQuCiAqCiAqIERlZmF1bHQgdmFsdWUgaXMgUEpNRURJQV9HNzIyMV9ERUZBVUxUX1BDTV9TSElGVC4KICoKICogQHBhcmFtIHZhbAkJVGhlIHZhbHVlCiAqCiAqIEByZXR1cm4JCVBKX1NVQ0NFU1Mgb24gc3VjY2Vzcy4KICovClBKX0RFQ0wocGpfc3RhdHVzX3QpIHBqbWVkaWFfY29kZWNfZzcyMjFfc2V0X3BjbV9zaGlmdChpbnQgdmFsKTsKCgoKLyoqCiAqIFVucmVnaXN0ZXIgRy43MjIuMSBjb2RlY3MgZmFjdG9yeSBmcm9tIHBqbWVkaWEgZW5kcG9pbnQuCiAqCiAqIEByZXR1cm4JICAgIFBKX1NVQ0NFU1Mgb24gc3VjY2Vzcy4KICovClBKX0RFQ0wocGpfc3RhdHVzX3QpIHBqbWVkaWFfY29kZWNfZzcyMjFfZGVpbml0KHZvaWQpOwoKClBKX0VORF9ERUNMCgoKLyoqCiAqIEB9CiAqLwoKI2VuZGlmCS8qIF9fUEpNRURJQV9DT0RFQ1NfRzcyMjFfSF9fICovCgo=