CiAgICAgICAgICAgICAgICAgICBIb3cgRnJlZVR5cGUncyByYXN0ZXJpemVyIHdvcmsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgRGF2aWQgVHVybmVyCgogICAgICAgICAgICAgICAgICAgICAgICBSZXZpc2VkIDIwMDMtRGVjLTA4CgoKVGhpcyBmaWxlICBpcyBhbiAgYXR0ZW1wdCB0byBleHBsYWluICB0aGUgaW50ZXJuYWxzIG9mICB0aGUgRnJlZVR5cGUKcmFzdGVyaXplci4gIFRoZSAgcmFzdGVyaXplciBpcyBvZiAgcXVpdGUgZ2VuZXJhbCBwdXJwb3NlICBhbmQgY291bGQKZWFzaWx5IGJlIGludGVncmF0ZWQgaW50byBvdGhlciBwcm9ncmFtcy4KCgogIEkuIEludHJvZHVjdGlvbgoKIElJLiBSZW5kZXJpbmcgVGVjaG5vbG9neQogICAgIDEuIFJlcXVpcmVtZW50cwogICAgIDIuIFByb2ZpbGVzIGFuZCBTcGFucwogICAgICAgIGEuIFN3ZWVwaW5nIHRoZSBTaGFwZQogICAgICAgIGIuIERlY29tcG9zaW5nIE91dGxpbmVzIGludG8gUHJvZmlsZXMKICAgICAgICBjLiBUaGUgUmVuZGVyIFBvb2wKICAgICAgICBkLiBDb21wdXRpbmcgUHJvZmlsZXMgRXh0ZW50cwogICAgICAgIGUuIENvbXB1dGluZyBQcm9maWxlcyBDb29yZGluYXRlcwogICAgICAgIGYuIFN3ZWVwaW5nIGFuZCBTb3J0aW5nIHRoZSBTcGFucwoKCkkuIEludHJvZHVjdGlvbgo9PT09PT09PT09PT09PT0KCiAgQSAgcmFzdGVyaXplciBpcyAgYSBsaWJyYXJ5ICBpbiBjaGFyZ2UgIG9mIGNvbnZlcnRpbmcgIGEgdmVjdG9yaWFsCiAgcmVwcmVzZW50YXRpb24gb2YgYSBzaGFwZSAgaW50byBhIGJpdG1hcC4gIFRoZSBGcmVlVHlwZSByYXN0ZXJpemVyCiAgaGFzICBiZWVuICBvcmlnaW5hbGx5IGRldmVsb3BlZCAgdG8gIHJlbmRlciAgdGhlICBnbHlwaHMgZm91bmQgIGluCiAgVHJ1ZVR5cGUgIGZpbGVzLCBtYWRlICB1cCAgb2Ygc2VnbWVudHMgIGFuZCBzZWNvbmQtb3JkZXIgIELpemllcnMuCiAgTWVhbndoaWxlIGl0IGhhcyBiZWVuIGV4dGVuZGVkIHRvIHJlbmRlciB0aGlyZC1vcmRlciBC6XppZXIgY3VydmVzCiAgYWxzby4gICBUaGlzICBkb2N1bWVudCAgaXMgICBhbiAgZXhwbGFuYXRpb24gIG9mICBpdHMgIGRlc2lnbiAgYW5kCiAgaW1wbGVtZW50YXRpb24uCgogIFdoaWxlICB0aGVzZSBleHBsYW5hdGlvbnMgc3RhcnQgIGZyb20gdGhlICBiYXNpY3MsIGEgIGtub3dsZWRnZSBvZgogIGNvbW1vbiByYXN0ZXJpemF0aW9uIHRlY2huaXF1ZXMgaXMgYXNzdW1lZC4KCgpJSS4gUmVuZGVyaW5nIFRlY2hub2xvZ3kKPT09PT09PT09PT09PT09PT09PT09PT09CgoxLiBSZXF1aXJlbWVudHMKLS0tLS0tLS0tLS0tLS0tCgogIFdlICBhc3N1bWUgdGhhdCAgYWxsIHNjYWxpbmcsICByb3RhdGluZywgaGludGluZywgIGV0Yy4sICBoYXMgYmVlbgogIGFscmVhZHkgZG9uZS4gIFRoZSBnbHlwaCBpcyB0aHVzICBkZXNjcmliZWQgYnkgYSBsaXN0IG9mIHBvaW50cyBpbgogIHRoZSBkZXZpY2Ugc3BhY2UuCgogIC0gQWxsIHBvaW50IGNvb3JkaW5hdGVzICBhcmUgaW4gdGhlIDI2LjYgZml4ZWQgIGZsb2F0IGZvcm1hdC4gIFRoZQogICAgdXNlZCBvcmllbnRhdGlvbiBpczoKCgogICAgICAgXiB5CiAgICAgICB8ICAgICAgICAgcmVmZXJlbmNlIG9yaWVudGF0aW9uCiAgICAgICB8CiAgICAgICAqLS0tLT4geAogICAgICAwCgoKICAgIGAyNi42JyBtZWFucyAgdGhhdCAyNiBiaXRzICBhcmUgdXNlZCBmb3IgIHRoZSBpbnRlZ2VyIHBhcnQgIG9mIGEKICAgIHZhbHVlICAgYW5kICA2ICAgYml0cyAgYXJlICAgdXNlZCAgZm9yICAgdGhlICAgZnJhY3Rpb25hbCAgcGFydC4KICAgIENvbnNlcXVlbnRseSwgdGhlIGBkaXN0YW5jZScgIGJldHdlZW4gdHdvIG5laWdoYm91cmluZyBwaXhlbHMgaXMKICAgIDY0IGB1bml0cycgKDEgdW5pdCA9IDEvNjR0aCBvZiBhIHBpeGVsKS4KCiAgICBOb3RlICB0aGF0LCBmb3IgIHRoZSByYXN0ZXJpemVyLCAgcGl4ZWwgY2VudGVycyAgYXJlICBsb2NhdGVkIGF0CiAgICBpbnRlZ2VyICAgY29vcmRpbmF0ZXMuICAgVGhlICAgVHJ1ZVR5cGUgICBieXRlY29kZSAgaW50ZXJwcmV0ZXIsCiAgICBob3dldmVyLCBhc3N1bWVzIHRoYXQgIHRoZSBsb3dlciBsZWZ0IGVkZ2Ugb2YgIGEgcGl4ZWwgKHdoaWNoIGlzCiAgICB0YWtlbiAgdG8gYmUgIGEgc3F1YXJlICB3aXRoICBhIGxlbmd0aCAgb2YgMSAgdW5pdCkgaGFzICBpbnRlZ2VyCiAgICBjb29yZGluYXRlcy4KCgogICAgICAgIF4geSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeIHkKICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogICAgICAgIHwgICAgICAgICAgICAoMSwxKSAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgKDAuNSwwLjUpCiAgICAgICAgKy0tLS0tLS0tLS0tKyAgICAgICAgICAgICAgICAgICAgICAgICstLS0tLSstLS0tLSsKICAgICAgICB8ICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCAgICAgfAogICAgICAgIHwgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8ICAgICB8CiAgICAgICAgfCAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIG8tLS0tLSstLS0tLT4geAogICAgICAgIHwgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICB8ICAgKDAsMCkgICB8CiAgICAgICAgfCAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwKICAgICAgICBvLS0tLS0tLS0tLS0rLS0tLS0+IHggICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tKwogICAgICAoMCwwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjUsLTAuNSkKCiAgIFRydWVUeXBlIGJ5dGVjb2RlIGludGVycHJldGVyICAgICAgICAgIEZyZWVUeXBlIHJhc3Rlcml6ZXIKCgogICAgQSBwaXhlbCBsaW5lIGluIHRoZSB0YXJnZXQgYml0bWFwIGlzIGNhbGxlZCBhIGBzY2FubGluZScuCgogIC0gQSAgZ2x5cGggIGlzICB1c3VhbGx5ICBtYWRlICBvZiBzZXZlcmFsICBjb250b3VycywgIGFsc28gIGNhbGxlZAogICAgYG91dGxpbmVzJy4gIEEgY29udG91ciBpcyBzaW1wbHkgYSBjbG9zZWQgY3VydmUgdGhhdCBkZWxpbWl0cyBhbgogICAgb3V0ZXIgb3IgaW5uZXIgcmVnaW9uIG9mIHRoZSBnbHlwaC4gIEl0IGlzIGRlc2NyaWJlZCBieSBhIHNlcmllcwogICAgb2Ygc3VjY2Vzc2l2ZSBwb2ludHMgb2YgdGhlIHBvaW50cyB0YWJsZS4KCiAgICBFYWNoIHBvaW50ICBvZiB0aGUgZ2x5cGggIGhhcyBhbiBhc3NvY2lhdGVkIGZsYWcgIHRoYXQgaW5kaWNhdGVzCiAgICB3aGV0aGVyICBpdCBpcyAgYG9uJyBvciAgYG9mZicgdGhlICBjdXJ2ZS4gIFR3byAgc3VjY2Vzc2l2ZSBgb24nCiAgICBwb2ludHMgaW5kaWNhdGUgYSBsaW5lIHNlZ21lbnQgam9pbmluZyB0aGUgdHdvIHBvaW50cy4KCiAgICBPbmUgYG9mZicgcG9pbnQgYW1pZHN0IHR3byBgb24nIHBvaW50cyBpbmRpY2F0ZXMgYSBzZWNvbmQtZGVncmVlCiAgICAoY29uaWMpICBC6XppZXIgcGFyYW1ldHJpYyAgYXJjLCBkZWZpbmVkICBieSB0aGVzZSAgdGhyZWUgcG9pbnRzCiAgICAodGhlIGBvZmYnIHBvaW50IGJlaW5nIHRoZSAgY29udHJvbCBwb2ludCwgYW5kIHRoZSBgb24nIG9uZXMgdGhlCiAgICBzdGFydCBhbmQgZW5kIHBvaW50cykuICBTaW1pbGFybHksIGEgdGhpcmQtZGVncmVlIChjdWJpYykgQul6aWVyCiAgICBjdXJ2ZSAgaXMgZGVzY3JpYmVkICBieSBmb3VyICBwb2ludHMgKHR3byAgYG9mZicgIGNvbnRyb2wgcG9pbnRzCiAgICBiZXR3ZWVuIHR3byBgb24nIHBvaW50cykuCgogICAgRmluYWxseSwgIGZvciAgc2Vjb25kLW9yZGVyIGN1cnZlcyAgb25seSwgIHR3byBzdWNjZXNzaXZlICBgb2ZmJwogICAgcG9pbnRzICBmb3JjZXMgdGhlICByYXN0ZXJpemVyIHRvICBjcmVhdGUsIGR1cmluZyAgcmVuZGVyaW5nLCBhbgogICAgYG9uJyAgcG9pbnQgYW1pZHN0IHRoZW0sICBhdCB0aGVpciAgZXhhY3QgbWlkZGxlLiAgIFRoaXMgZ3JlYXRseQogICAgZmFjaWxpdGF0ZXMgdGhlICBkZWZpbml0aW9uIG9mICBzdWNjZXNzaXZlIELpemllciBhcmNzLgoKICBUaGUgcGFyYW1ldHJpYyBmb3JtIG9mIGEgc2Vjb25kLW9yZGVyIELpemllciBjdXJ2ZSBpczoKCiAgICAgIFAodCkgPSAoMS10KV4yKlAxICsgMip0KigxLXQpKlAyICsgdF4yKlAzCgogICAgICAoUDEgYW5kIFAzIGFyZSB0aGUgZW5kIHBvaW50cywgUDIgdGhlIGNvbnRyb2wgcG9pbnQuKQoKICBUaGUgcGFyYW1ldHJpYyBmb3JtIG9mIGEgdGhpcmQtb3JkZXIgQul6aWVyIGN1cnZlIGlzOgoKICAgICAgUCh0KSA9ICgxLXQpXjMqUDEgKyAzKnQqKDEtdCleMipQMiArIDMqdF4yKigxLXQpKlAzICsgdF4zKlA0CgogICAgICAoUDEgYW5kIFA0IGFyZSB0aGUgZW5kIHBvaW50cywgUDIgYW5kIFAzIHRoZSBjb250cm9sIHBvaW50cy4pCgogIEZvciBib3RoIGZvcm11bGFlLCB0IGlzIGEgcmVhbCBudW1iZXIgaW4gdGhlIHJhbmdlIFswLi4xXS4KCiAgTm90ZSAgdGhhdCB0aGUgcmFzdGVyaXplciAgZG9lcyBub3QgIHVzZSB0aGVzZSAgZm9ybXVsYWUgZGlyZWN0bHkuCiAgVGhleSBleGhpYml0LCAgaG93ZXZlciwgb25lIHZlcnkgIHVzZWZ1bCBwcm9wZXJ0eSBvZiAgQul6aWVyIGFyY3M6CiAgRWFjaCAgcG9pbnQgb2YgIHRoZSBjdXJ2ZSAgaXMgYSAgd2VpZ2h0ZWQgYXZlcmFnZSAgb2YgIHRoZSBjb250cm9sCiAgcG9pbnRzLgoKICBBcyBhbGwgd2VpZ2h0cyAgYXJlIHBvc2l0aXZlIGFuZCBhbHdheXMgc3VtIHVwICB0byAxLCB3aGF0ZXZlciB0aGUKICB2YWx1ZSAgb2YgdCwgIGVhY2ggYXJjICBwb2ludCBsaWVzICB3aXRoaW4gdGhlICB0cmlhbmdsZSAocG9seWdvbikKICBkZWZpbmVkIGJ5IHRoZSBhcmMncyB0aHJlZSAoZm91cikgY29udHJvbCBwb2ludHMuCgogIEluICB0aGUgZm9sbG93aW5nLCAgb25seSBzZWNvbmQtb3JkZXIgIGN1cnZlcyBhcmUgIGRpc2N1c3NlZCBzaW5jZQogIHJhc3Rlcml6YXRpb24gb2YgdGhpcmQtb3JkZXIgY3VydmVzIGlzIGNvbXBsZXRlbHkgaWRlbnRpY2FsLgoKICBIZXJlIHNvbWUgc2FtcGxlcyBmb3Igc2Vjb25kLW9yZGVyIGN1cnZlcy4KCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICMgb24gY3VydmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIG9mZiBjdXJ2ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX18tLS1fXwogICAgICAgICMtX18gICAgICAgICAgICAgICAgICAgICAgXy0tICAgICAgIC1fCiAgICAgICAgICAgIC0tX18gICAgICAgICAgICAgICAgXy0gICAgICAgICAgICAtCiAgICAgICAgICAgICAgICAtLV9fICAgICAgICAgICAjICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgIC0tX18gICAgICAgICAgICAgICAgICAgICAgICAjCiAgICAgICAgICAgICAgICAgICAgICAgIC0jCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR3byBgb24nIHBvaW50cwogICAgICAgICBUd28gYG9uJyBwb2ludHMgICAgICAgYW5kIG9uZSBgb2ZmJyBwb2ludAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmV0d2VlbiB0aGVtCgogICAgICAgICAgICAgICAgICAgICAgKgogICAgICAgICMgICAgICAgICAgICBfXyAgICAgIFR3byBgb24nIHBvaW50cyB3aXRoIHR3byBgb2ZmJwogICAgICAgICBcICAgICAgICAgIC0gIC0gICAgIHBvaW50cyBiZXR3ZWVuIHRoZW0uIFRoZSBwb2ludAogICAgICAgICAgXCAgICAgICAgLyAgICBcICAgIG1hcmtlZCBgMCcgaXMgdGhlIG1pZGRsZSBvZiB0aGUKICAgICAgICAgICAtICAgICAgMCAgICAgIFwgICBgb2ZmJyBwb2ludHMsIGFuZCBpcyBhIGB2aXJ0dWFsCiAgICAgICAgICAgIC1fICBfLSAgICAgICAjICAgb24nIHBvaW50IHdoZXJlIHRoZSBjdXJ2ZSBwYXNzZXMuCiAgICAgICAgICAgICAgLS0gICAgICAgICAgICAgSXQgZG9lcyBub3QgYXBwZWFyIGluIHRoZSBwb2ludAogICAgICAgICAgICAgICogICAgICAgICAgICAgIGxpc3QuCgoKMi4gUHJvZmlsZXMgYW5kIFNwYW5zCi0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICBUaGUgZm9sbG93aW5nIGlzIGEgYmFzaWMgZXhwbGFuYXRpb24gb2YgdGhlIF9raW5kXyBvZiBjb21wdXRhdGlvbnMKICBtYWRlICBieSAgdGhlICAgcmFzdGVyaXplciAgdG8gIGJ1aWxkICBhICBiaXRtYXAgICBmcm9tICBhICB2ZWN0b3IKICByZXByZXNlbnRhdGlvbi4gIE5vdGUgIHRoYXQgdGhlIGFjdHVhbCAgaW1wbGVtZW50YXRpb24gaXMgc2xpZ2h0bHkKICBkaWZmZXJlbnQsIGR1ZSB0byBwZXJmb3JtYW5jZSB0dW5pbmcgYW5kIG90aGVyIGZhY3RvcnMuCgogIEhvd2V2ZXIsIHRoZSBmb2xsb3dpbmcgaWRlYXMgcmVtYWluICBpbiB0aGUgc2FtZSBjYXRlZ29yeSwgYW5kIGFyZQogIG1vcmUgY29udmVuaWVudCB0byB1bmRlcnN0YW5kLgoKCiAgYS4gU3dlZXBpbmcgdGhlIFNoYXBlCgogICAgVGhlIGJlc3Qgd2F5IHRvIGZpbGwgYSBzaGFwZSBpcyB0byBkZWNvbXBvc2UgaXQgaW50byBhIG51bWJlciBvZgogICAgc2ltcGxlICBob3Jpem9udGFsIHNlZ21lbnRzLCAgdGhlbiB0dXJuICB0aGVtIG9uICBpbiAgdGhlIHRhcmdldAogICAgYml0bWFwLiAgVGhlc2Ugc2VnbWVudHMgYXJlIGNhbGxlZCBgc3BhbnMnLgoKICAgICAgICAgICAgICAgIF9fLS0tX18KICAgICAgICAgICAgIF8tLSAgICAgICAtXwogICAgICAgICAgIF8tICAgICAgICAgICAgLQogICAgICAgICAgLSAgICAgICAgICAgICAgIFwKICAgICAgICAgLyAgICAgICAgICAgICAgICAgXAogICAgICAgIC8gICAgICAgICAgICAgICAgICAgXAogICAgICAgfCAgICAgICAgICAgICAgICAgICAgIFwKCiAgICAgICAgICAgICAgICBfXy0tLV9fICAgICAgICAgRXhhbXBsZTogZmlsbGluZyBhIHNoYXBlCiAgICAgICAgICAgICBfLS0tLS0tLS0tLV8gICAgICAgICAgICAgICAgd2l0aCBzcGFucy4KICAgICAgICAgICBfLS0tLS0tLS0tLS0tLS0KICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS1cCiAgICAgICAgIC8tLS0tLS0tLS0tLS0tLS0tLVwgICAgVGhpcyBpcyB0eXBpY2FsbHkgZG9uZSBmcm9tIHRoZSB0b3AKICAgICAgICAvICAgICAgICAgICAgICAgICAgIFwgICB0byB0aGUgYm90dG9tIG9mIHRoZSBzaGFwZSwgaW4gYQogICAgICAgfCAgICAgICAgICAgfCAgICAgICAgIFwgIG1vdmVtZW50IGNhbGxlZCBhIGBzd2VlcCcuCiAgICAgICAgICAgICAgICAgICBWCgogICAgICAgICAgICAgICAgX18tLS1fXwogICAgICAgICAgICAgXy0tLS0tLS0tLS1fCiAgICAgICAgICAgXy0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tXAogICAgICAgICAvLS0tLS0tLS0tLS0tLS0tLS1cCiAgICAgICAgLy0tLS0tLS0tLS0tLS0tLS0tLS1cCiAgICAgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tXAoKCiAgICBJbiAgb3JkZXIgIHRvIGRyYXcgIGEgIHNwYW4sICB0aGUgIHJhc3Rlcml6ZXIgbXVzdCAgY29tcHV0ZSAgaXRzCiAgICBjb29yZGluYXRlcywgd2hpY2ggIGFyZSBzaW1wbHkgdGhlIHggY29vcmRpbmF0ZXMgIG9mIHRoZSBzaGFwZSdzCiAgICBjb250b3VycywgdGFrZW4gb24gdGhlIHkgc2NhbmxpbmVzLgoKCiAgICAgICAgICAgICAgICAgICAvLS0tLyAgICB8LS0tfCAgIE5vdGUgdGhhdCB0aGVyZSBhcmUgdXN1YWxseQogICAgICAgICAgICAgICAgICAvLS0tLyAgICAgfC0tLXwgICBzZXZlcmFsIHNwYW5zIHBlciBzY2FubGluZS4KICAgICAgICB8ICAgICAgICAvLS0tLyAgICAgIHwtLS18CiAgICAgICAgfCAgICAgICAvLS0tL19fX19fX198LS0tfCAgIFdoZW4gcmVuZGVyaW5nIHRoaXMgc2hhcGUgdG8gdGhlCiAgICAgICAgViAgICAgIC8tLS0tLS0tLS0tLS0tLS0tfCAgIGN1cnJlbnQgc2NhbmxpbmUgeSwgd2UgbXVzdAogICAgICAgICAgICAgIC8tLS0tLS0tLS0tLS0tLS0tLXwgICBjb21wdXRlIHRoZSB4IHZhbHVlcyBvZiB0aGUKICAgICAgICAgICBhIC8tLS0tfCAgICAgICAgIHwtLS18ICAgcG9pbnRzIGEsIGIsIGMsIGFuZCBkLgogICAgICAtIC0gLSAqICAgICAqIC0gLSAtIC0gKiAgICogLSAtIHkgLQogICAgICAgICAgIC8gICAgIC8gYiAgICAgICBjfCAgIHxkCgoKICAgICAgICAgICAgICAgICAgIC8tLS0vICAgIHwtLS18CiAgICAgICAgICAgICAgICAgIC8tLS0vICAgICB8LS0tfCAgQW5kIHRoZW4gdHVybiBvbiB0aGUgc3BhbnMgYS1iCiAgICAgICAgICAgICAgICAgLy0tLS8gICAgICB8LS0tfCAgYW5kIGMtZC4KICAgICAgICAgICAgICAgIC8tLS0vX19fX19fX3wtLS18CiAgICAgICAgICAgICAgIC8tLS0tLS0tLS0tLS0tLS0tfAogICAgICAgICAgICAgIC8tLS0tLS0tLS0tLS0tLS0tLXwKICAgICAgICAgICBhIC8tLS0tfCAgICAgICAgIHwtLS18CiAgICAgIC0gLSAtICMjIyMjIyMgLSAtIC0gLSAjIyMjIyAtIC0geSAtCiAgICAgICAgICAgLyAgICAgLyBiICAgICAgIGN8ICAgfGQKCgogIGIuIERlY29tcG9zaW5nIE91dGxpbmVzIGludG8gUHJvZmlsZXMKCiAgICBGb3IgIGVhY2ggIHNjYW5saW5lIGR1cmluZyAgdGhlICBzd2VlcCwgIHdlICBuZWVkIHRoZSAgZm9sbG93aW5nCiAgICBpbmZvcm1hdGlvbjoKCiAgICBvIFRoZSAgbnVtYmVyIG9mICBzcGFucyBvbiAgdGhlIGN1cnJlbnQgIHNjYW5saW5lLCBnaXZlbiAgYnkgdGhlCiAgICAgIG51bWJlciBvZiAgc2hhcGUgcG9pbnRzICBpbnRlcnNlY3RpbmcgdGhlIHNjYW5saW5lICAodGhlc2UgYXJlCiAgICAgIHRoZSBwb2ludHMgYSwgYiwgYywgYW5kIGQgaW4gdGhlIGFib3ZlIGV4YW1wbGUpLgoKICAgIG8gVGhlIHggY29vcmRpbmF0ZXMgb2YgdGhlc2UgcG9pbnRzLgoKICAgIHggY29vcmRpbmF0ZXMgYXJlICBjb21wdXRlZCBiZWZvcmUgdGhlIHN3ZWVwLCBpbiAgYSBwaGFzZSBjYWxsZWQKICAgIGBkZWNvbXBvc2l0aW9uJyB3aGljaCBjb252ZXJ0cyB0aGUgZ2x5cGggaW50byAqcHJvZmlsZXMqLgoKICAgIFB1dCBpdCBzaW1wbHksIGEgYHByb2ZpbGUnICBpcyBhIGNvbnRvdXIncyBwb3J0aW9uIHRoYXQgY2FuIG9ubHkKICAgIGJlIGVpdGhlciBhc2NlbmRpbmcgb3IgZGVzY2VuZGluZywgIGkuZS4sIGl0IGlzIG1vbm90b25pYyBpbiB0aGUKICAgIHZlcnRpY2FsIGRpcmVjdGlvbiAod2UgYWxzbyBzYXkgIHktbW9ub3RvbmljKS4gIFRoZXJlIGlzIG5vIHN1Y2gKICAgIHRoaW5nIGFzIGEgaG9yaXpvbnRhbCBwcm9maWxlLCBhcyB3ZSBzaGFsbCBzZWUuCgogICAgSGVyZSBhcmUgYSBmZXcgZXhhbXBsZXM6CgoKICAgICAgdGhpcyBzcXVhcmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgIDIKICAgICAgICAgLS0tLT4tLS0tICAgICBpcyBtYWRlIG9mIHR3bwogICAgICAgIHwgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgfAogICAgICAgIHwgICAgICAgICB8ICAgICAgIHByb2ZpbGVzICAgICAgICB8ICAgICAgICAgfAogICAgICAgIF4gICAgICAgICB2ICAgICAgICAgICAgICAgICAgICAgICBeICAgICsgICAgdgogICAgICAgIHwgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgfAogICAgICAgIHwgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgfAogICAgICAgICAtLS0tPC0tLS0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXAgICAgICAgIGRvd24KCgogICAgICB0aGlzIHRyaWFuZ2xlCgogICAgICAgICAgICAgUDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgMgoKICAgICAgICAgICAgIHxcICAgICAgICBpcyBtYWRlIG9mIHR3byAgICAgICB8ICAgICAgICAgXAogICAgICAgICAgXiAgfCBcICBcICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgXAogICAgICAgICAgfCB8ICAgXCAgXCAgICAgIHByb2ZpbGVzICAgICAgICAgfCAgICAgICAgICAgIFwgICAgICB8CiAgICAgICAgIHwgIHwgICAgXCAgdiAgICAgICAgICAgICAgICAgIF4gICB8ICAgICAgICAgICAgIFwgICAgIHwKICAgICAgICAgICB8ICAgICAgXCAgICAgICAgICAgICAgICAgICAgfCAgfCAgICAgICAgICsgICAgIFwgICAgdgogICAgICAgICAgIHwgICAgICAgXCAgICAgICAgICAgICAgICAgICB8ICB8ICAgICAgICAgICAgICAgIFwKICAgICAgICBQMSAtLS1fX18gICBcICAgICAgICAgICAgICAgICAgICAgLS0tX19fICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgIC0tLV9cICAgICAgICAgICAgICAgICAgICAgICAgICAtLS1fICAgICAgICAgXAogICAgICAgICAgICAgPC0tX18gICAgIFAzICAgICAgICAgICAgICAgICAgIHVwICAgICAgICAgICBkb3duCgoKCiAgICAgIEEgbW9yZSBnZW5lcmFsIGNvbnRvdXIgY2FuIGJlIG1hZGUgb2YgbW9yZSB0aGFuIHR3byBwcm9maWxlczoKCiAgICAgICAgICAgICAgX18gICAgIF4KICAgICAgICAgICAgIC8gIHwgICAvICBfX18gICAgICAgICAgLyAgICB8CiAgICAgICAgICAgIC8gICB8ICAgICAvICAgfCAgICAgICAgLyAgICAgfCAgICAgICAvICAgICB8CiAgICAgICAgICAgfCAgICB8ICAgIC8gICAvICAgID0+ICB8ICAgICAgdiAgICAgIC8gICAgIC8KICAgICAgICAgICB8ICAgIHwgICB8ICAgfCAgICAgICAgIHwgICAgICB8ICAgICBeICAgICB8CiAgICAgICAgXiAgfCAgICB8X19ffCAgIHwgIHwgICAgICBeICAgKyAgfCAgKyAgfCAgKyAgdgogICAgICAgIHwgIHwgICAgICAgICAgIHwgICB2ICAgICAgfCAgICAgICAgICAgICAgICAgfAogICAgICAgICAgIHwgICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICAgdXAgICAgfAogICAgICAgICAgIHxfX19fX19fX19fX3wgICAgICAgICAgfCAgICBkb3duICAgICAgICAgfAoKICAgICAgICAgICAgICAgIDwtLSAgICAgICAgICAgICAgIHVwICAgICAgICAgICAgICBkb3duCgoKICAgIFN1Y2Nlc3NpdmUgIHByb2ZpbGVzIGFyZSAgYWx3YXlzIGpvaW5lZCAgYnkgIGhvcml6b250YWwgc2VnbWVudHMKICAgIHRoYXQgYXJlIG5vdCBwYXJ0IG9mIHRoZSBwcm9maWxlcyB0aGVtc2VsdmVzLgoKICAgIEZvciAgdGhlICByYXN0ZXJpemVyLCAgYSAgcHJvZmlsZSAgaXMgIHNpbXBseSAgYW4gICphcnJheSogIHRoYXQKICAgIGFzc29jaWF0ZXMgIG9uZSAgaG9yaXpvbnRhbCAqcGl4ZWwqICBjb29yZGluYXRlICB0byBlYWNoICBiaXRtYXAKICAgICpzY2FubGluZSogIGNyb3NzZWQgIGJ5ICB0aGUgIGNvbnRvdXIncyBzZWN0aW9uICBjb250YWluaW5nICB0aGUKICAgIHByb2ZpbGUuICBOb3RlIHRoYXQgcHJvZmlsZXMgYXJlICpvcmllbnRlZCogdXAgb3IgZG93biBhbG9uZyB0aGUKICAgIGdseXBoJ3Mgb3JpZ2luYWwgZmxvdyBvcmllbnRhdGlvbi4KCiAgICBJbiBvdGhlciBncmFwaGljcyBsaWJyYXJpZXMsIHByb2ZpbGVzIGFyZSBhbHNvIGNhbGxlZCBgZWRnZXMnIG9yCiAgICBgZWRnZWxpc3RzJy4KCgogIGMuIFRoZSBSZW5kZXIgUG9vbAoKICAgIEZyZWVUeXBlICBoYXMgYmVlbiBkZXNpZ25lZCAgdG8gYmUgIGFibGUgdG8gIHJ1biB3ZWxsICBvbiBfdmVyeV8KICAgIGxpZ2h0IHN5c3RlbXMsIGluY2x1ZGluZyBlbWJlZGRlZCBzeXN0ZW1zIHdpdGggdmVyeSBmZXcgbWVtb3J5LgoKICAgIEEgcmVuZGVyIHBvb2wgIHdpbGwgYmUgYWxsb2NhdGVkIG9uY2U7IHRoZSAgcmFzdGVyaXplciB1c2VzIHRoaXMKICAgIHBvb2wgZm9yIGFsbCAgaXRzIG5lZWRzIGJ5IG1hbmFnaW5nIHRoaXMgIG1lbW9yeSBkaXJlY3RseSBpbiBpdC4KICAgIFRoZSAgYWxnb3JpdGhtcyB0aGF0IGFyZSAgdXNlZCBmb3IgIHByb2ZpbGUgY29tcHV0YXRpb24gIG1ha2UgaXQKICAgIHBvc3NpYmxlIHRvIHVzZSAgdGhlIHBvb2wgYXMgYSBzaW1wbGUgIGdyb3dpbmcgaGVhcC4gIFRoaXMgbWVhbnMKICAgIHRoYXQgdGhpcyAgbWVtb3J5IG1hbmFnZW1lbnQgaXMgIGFjdHVhbGx5IHF1aXRlIGVhc3kgIGFuZCBmYXN0ZXIKICAgIHRoYW4gYW55IGtpbmQgb2YgbWFsbG9jKCkvZnJlZSgpIGNvbWJpbmF0aW9uLgoKICAgIE1vcmVvdmVyLCAgd2UnbGwgc2VlICBsYXRlciB0aGF0ICB0aGUgcmFzdGVyaXplciAgaXMgIGFibGUsIHdoZW4KICAgIGRlYWxpbmcgd2l0aCBwcm9maWxlcyB0b28gbGFyZ2UgIGFuZCBudW1lcm91cyB0byBsaWUgYWxsIGF0IG9uY2UKICAgIGluICB0aGUgcmVuZGVyICBwb29sLCB0byAgaW1tZWRpYXRlbHkgZGVjb21wb3NlICByZWN1cnNpdmVseSB0aGUKICAgIHJlbmRlcmluZyBwcm9jZXNzICBpbnRvIGluZGVwZW5kZW50IHN1Yi10YXNrcywgIGVhY2ggdGFraW5nIGxlc3MKICAgIG1lbW9yeSB0byBiZSBwZXJmb3JtZWQgKHNlZSBgc3ViLWJhbmRpbmcnIGJlbG93KS4KCiAgICBUaGUgIHJlbmRlciBwb29sIGRvZXNuJ3QgIG5lZWQgdG8gIGJlIGxhcmdlLiAgIEEgNEtCeXRlICBwb29sIGlzCiAgICBlbm91Z2ggZm9yIG5lYXJseSBhbGwgcmVuZGl0aW9ucywgdGhvdWdoIG5lYXJseSAxMDAlIHNsb3dlciB0aGFuCiAgICBhIG1vcmUgY29uZm9ydGFibGUgMTZLQnl0ZSBvciAzMktCeXRlIHBvb2wgKHRoYXQgd2FzIHRlc3RlZCB3aXRoCiAgICBjb21wbGV4IGdseXBocyBhdCBzaXplcyBvdmVyIDUwMCBwaXhlbHMpLgoKCiAgZC4gQ29tcHV0aW5nIFByb2ZpbGVzIEV4dGVudHMKCiAgICBSZW1lbWJlciB0aGF0IGEgcHJvZmlsZSBpcyBhbiBhcnJheSwgYXNzb2NpYXRpbmcgYSBfc2NhbmxpbmVfIHRvCiAgICB0aGUgeCBwaXhlbCBjb29yZGluYXRlIG9mIGl0cyBpbnRlcnNlY3Rpb24gd2l0aCBhIGNvbnRvdXIuCgogICAgVGhvdWdoIGl0J3Mgbm90IGV4YWN0bHkgaG93IHRoZSBGcmVlVHlwZSByYXN0ZXJpemVyIHdvcmtzLCBpdCBpcwogICAgY29udmVuaWVudCAgdG8gdGhpbmsgIHRoYXQgIHdlIG5lZWQgIGEgIHByb2ZpbGUncyBoZWlnaHQgIGJlZm9yZQogICAgYWxsb2NhdGluZyBpdCBpbiB0aGUgcG9vbCBhbmQgY29tcHV0aW5nIGl0cyBjb29yZGluYXRlcy4KCiAgICBUaGUgcHJvZmlsZSdzIGhlaWdodCAgaXMgdGhlIG51bWJlciBvZiBzY2FubGluZXMgIGNyb3NzZWQgYnkgdGhlCiAgICB5LW1vbm90b25pYyBzZWN0aW9uIG9mIGEgY29udG91ci4gIFdlIHRodXMgbmVlZCB0byBjb21wdXRlIHRoZXNlCiAgICBzZWN0aW9ucyBmcm9tICB0aGUgdmVjdG9yaWFsIGRlc2NyaXB0aW9uLiAgSW4gb3JkZXIgIHRvIGRvIHRoYXQsCiAgICB3ZSBhcmUgIG9ibGlnZWQgdG8gY29tcHV0ZSBhbGwgIChsb2NhbCBhbmQgZ2xvYmFsKSAgeSBleHRyZW1hIG9mCiAgICB0aGUgZ2x5cGggKG1pbmltYSBhbmQgbWF4aW1hKS4KCgogICAgICAgICAgIFAyICAgICAgICAgICAgIEZvciBpbnN0YW5jZSwgdGhpcyB0cmlhbmdsZSBoYXMgb25seQogICAgICAgICAgICAgICAgICAgICAgICAgIHR3byB5LWV4dHJlbWEsIHdoaWNoIGFyZSBzaW1wbHkKICAgICAgICAgICB8XAogICAgICAgICAgIHwgXCAgICAgICAgICAgICAgIFAyLnkgIGFzIGEgdmVydGljYWwgbWF4aW11bQogICAgICAgICAgfCAgIFwgICAgICAgICAgICAgIFAzLnkgIGFzIGEgdmVydGljYWwgbWluaW11bQogICAgICAgICAgfCAgICBcCiAgICAgICAgIHwgICAgICBcICAgICAgICAgICAgUDEueSBpcyBub3QgYSB2ZXJ0aWNhbCBleHRyZW11bSAodGhvdWdoCiAgICAgICAgIHwgICAgICAgXCAgICAgICAgICAgaXQgaXMgYSBob3Jpem9udGFsIG1pbmltdW0sIHdoaWNoIHdlCiAgICAgIFAxIC0tLV9fXyAgIFwgICAgICAgICAgZG9uJ3QgbmVlZCkuCiAgICAgICAgICAgICAgIC0tLV9cCiAgICAgICAgICAgICAgICAgICAgIFAzCgoKICAgIE5vdGUgIHRoYXQgdGhlICBleHRyZW1hIGFyZSAgZXhwcmVzc2VkICBpbiBwaXhlbCAgdW5pdHMsIG5vdCAgaW4KICAgIHNjYW5saW5lcy4gICBUaGUgdHJpYW5nbGUncyAgaGVpZ2h0ICBpcyBjZXJ0YWlubHkgIChQMy55LVAyLnkrMSkKICAgIHBpeGVsICB1bml0cywgICBidXQgIGl0cyAgcHJvZmlsZXMnICBoZWlnaHRzICAgYXJlICBjb21wdXRlZCAgaW4KICAgIHNjYW5saW5lcy4gIFRoZSBleGFjdCBjb252ZXJzaW9uIGlzIHNpbXBsZToKCiAgICAgIC0gbWluIHNjYW5saW5lID0gRkxPT1IgICggbWluIHkgKQogICAgICAtIG1heCBzY2FubGluZSA9IENFSUxJTkcoIG1heCB5ICkKCiAgICBBIHByb2JsZW0gIGFyaXNlcyB3aXRoIELpemllciAgQXJjcy4gIFdoaWxlIGEgc2VnbWVudCAgaXMgYWx3YXlzCiAgICBuZWNlc3NhcmlseSB5LW1vbm90b25pYyAoaS5lLiwgIGZsYXQsIGFzY2VuZGluZywgb3IgZGVzY2VuZGluZyksCiAgICB3aGljaCBtYWtlcyBleHRyZW1hIGNvbXB1dGF0aW9ucyBlYXN5LCAgdGhlIGFzY2VudCBvZiBhbiBhcmMgY2FuCiAgICB2YXJ5IGJldHdlZW4gaXRzIGNvbnRyb2wgcG9pbnRzLgoKCiAgICAgICAgICAgICAgICAgICAgICAgICAgUDIKICAgICAgICAgICAgICAgICAgICAgICAgICoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBvbiBjdXJ2ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIG9mZiBjdXJ2ZQogICAgICAgICAgICAgICAgICAgX18teC0tXwogICAgICAgICAgICAgICAgXy0tICAgICAgIC1fCiAgICAgICAgICBQMSAgXy0gICAgICAgICAgICAtICAgICAgICAgIEEgbm9uIHktbW9ub3RvbmljIELpemllciBhcmMuCiAgICAgICAgICAgICAjICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtICAgICAgICBUaGUgYXJjIGdvZXMgZnJvbSBQMSB0byBQMy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcICBQMwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjCgoKICAgIFdlIGZpcnN0ICBuZWVkIHRvIGJlICBhYmxlIHRvIGVhc2lseSBkZXRlY3QgIG5vbi1tb25vdG9uaWMgYXJjcywKICAgIGFjY29yZGluZyB0byAgdGhlaXIgY29udHJvbCBwb2ludHMuICBJIHdpbGwgIHN0YXRlIGhlcmUsIHdpdGhvdXQKICAgIHByb29mLCB0aGF0IHRoZSBtb25vdG9ueSBjb25kaXRpb24gY2FuIGJlIGV4cHJlc3NlZCBhczoKCiAgICAgIFAxLnkgPD0gUDIueSA8PSBQMy55ICAgZm9yIGFuIGV2ZXItYXNjZW5kaW5nIGFyYwoKICAgICAgUDEueSA+PSBQMi55ID49IFAzLnkgICBmb3IgYW4gZXZlci1kZXNjZW5kaW5nIGFyYwoKICAgIHdpdGggdGhlIHNwZWNpYWwgY2FzZSBvZgoKICAgICAgUDEueSA9IFAyLnkgPSBQMy55ICAgICB3aGVyZSB0aGUgYXJjIGlzIHNhaWQgdG8gYmUgYGZsYXQnLgoKICAgIEFzICB5b3UgY2FuICBzZWUsIHRoZXNlICBjb25kaXRpb25zIGNhbiAgYmUgdmVyeSAgZWFzaWx5IHRlc3RlZC4KICAgIFRoZXkgYXJlLCBob3dldmVyLCBleHRyZW1lbHkgaW1wb3J0YW50LCBhcyBhbnkgYXJjIHRoYXQgZG9lcyBub3QKICAgIHNhdGlzZnkgdGhlbSBuZWNlc3NhcmlseSBjb250YWlucyBhbiBleHRyZW11bS4KCiAgICBOb3RlICBhbHNvIHRoYXQgIGEgbW9ub3RvbmljICBhcmMgY2FuICBjb250YWluIGFuICBleHRyZW11bSB0b28sCiAgICB3aGljaCBpcyB0aGVuIG9uZSBvZiBpdHMgYG9uJyBwb2ludHM6CgoKICAgICAgICBQMSAgICAgICAgICAgUDIKICAgICAgICAgICMtLS1fXyAgICogICAgICAgICBQMVAyUDMgaXMgZXZlci1kZXNjZW5kaW5nLCBidXQgUDEKICAgICAgICAgICAgICAgIC1fICAgICAgICAgICBpcyBhbiB5LWV4dHJlbXVtLgogICAgICAgICAgICAgICAgICAtCiAgICAgICAgICAgLS0tXyAgICBcCiAgICAgICAgICAgICAgIC0+ICAgXAogICAgICAgICAgICAgICAgICAgICBcICBQMwogICAgICAgICAgICAgICAgICAgICAgIwoKCiAgICBMZXQncyBnbyBiYWNrIHRvIG91ciBwcmV2aW91cyBleGFtcGxlOgoKCiAgICAgICAgICAgICAgICAgICAgICAgICAgUDIKICAgICAgICAgICAgICAgICAgICAgICAgICoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBvbiBjdXJ2ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIG9mZiBjdXJ2ZQogICAgICAgICAgICAgICAgICAgX18teC0tXwogICAgICAgICAgICAgICAgXy0tICAgICAgIC1fCiAgICAgICAgICBQMSAgXy0gICAgICAgICAgICAtICAgICAgICAgIEEgbm9uLXktbW9ub3RvbmljIELpemllciBhcmMuCiAgICAgICAgICAgICAjICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtICAgICAgICBIZXJlIHdlIGhhdmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwgICAgICAgICAgICAgIFAyLnkgPj0gUDEueSAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwgIFAzICAgICAgICAgUDIueSA+PSBQMy55ICAgICAgKCEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMKCgogICAgV2UgbmVlZCB0byAgY29tcHV0ZSB0aGUgdmVydGljYWwgbWF4aW11bSBvZiB0aGlzICBhcmMgdG8gYmUgYWJsZQogICAgdG8gY29tcHV0ZSBhIHByb2ZpbGUncyBoZWlnaHQgKHRoZSBwb2ludCBtYXJrZWQgYnkgYW4gYHgnKS4gIFRoZQogICAgYXJjJ3MgZXF1YXRpb24gaW5kaWNhdGVzIHRoYXQgIGEgZGlyZWN0IGNvbXB1dGF0aW9uIGlzIHBvc3NpYmxlLAogICAgYnV0ICB3ZSByZWx5ICBvbiBhICBkaWZmZXJlbnQgdGVjaG5pcXVlLCAgd2hpY2ggdXNlICB3aWxsIGJlY29tZQogICAgYXBwYXJlbnQgc29vbi4KCiAgICBC6XppZXIgIGFyY3MgaGF2ZSAgdGhlICBzcGVjaWFsIHByb3BlcnR5ICBvZiAgYmVpbmcgdmVyeSAgZWFzaWx5CiAgICBkZWNvbXBvc2VkIGludG8gdHdvIHN1Yi1hcmNzLCAgd2hpY2ggYXJlIHRoZW1zZWx2ZXMgQul6aWVyIGFyY3MuCiAgICBNb3Jlb3ZlciwgaXQgaXMgZWFzeSB0byBwcm92ZSB0aGF0IHRoZXJlIGlzIGF0IG1vc3Qgb25lIHZlcnRpY2FsCiAgICBleHRyZW11bSBvbiAgZWFjaCBC6XppZXIgYXJjIChmb3IgIHNlY29uZC1kZWdyZWUgY3VydmVzOyBzaW1pbGFyCiAgICBjb25kaXRpb25zIGNhbiBiZSBmb3VuZCBmb3IgdGhpcmQtb3JkZXIgYXJjcykuCgogICAgRm9yIGluc3RhbmNlLCAgdGhlIGZvbGxvd2luZyBhcmMgIFAxUDJQMyBjYW4gYmUgIGRlY29tcG9zZWQgaW50bwogICAgdHdvIHN1Yi1hcmNzIFExUTJRMyBhbmQgUjFSMlIzOgoKCiAgICAgICAgICAgICAgICAgICAgUDIKICAgICAgICAgICAgICAgICAgICoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBvbiAgY3VydmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBvZmYgY3VydmUKCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbCBC6XppZXIgYXJjIFAxUDJQMy4KICAgICAgICAgICAgICAgIF9fLS0tX18KICAgICAgICAgICAgIF8tLSAgICAgICAtLV8KICAgICAgICAgICBfLSAgICAgICAgICAgICAtXwogICAgICAgICAgLSAgICAgICAgICAgICAgICAgLQogICAgICAgICAvICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAvICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIyAgICAgICAgICAgICAgICAgICAgICAgIwogICAgIFAxICAgICAgICAgICAgICAgICAgICAgICAgIFAzCgoKCiAgICAgICAgICAgICAgICAgICAgUDIKICAgICAgICAgICAgICAgICAgICoKCgoKICAgICAgICAgICAgICAgICAgIFEzICAgICAgICAgICAgICAgICBEZWNvbXBvc2VkIGludG8gdHdvIHN1YmFyY3MKICAgICAgICAgIFEyICAgICAgICAgICAgICAgIFIyICAgICAgICBRMVEyUTMgYW5kIFIxUjJSMwogICAgICAgICAgICAqICAgX18tIy1fXyAgICoKICAgICAgICAgICAgIF8tLSAgICAgICAtLV8KICAgICAgICAgICBfLSAgICAgICBSMSAgICAtXyAgICAgICAgICBRMSA9IFAxICAgICAgICAgUjMgPSBQMwogICAgICAgICAgLSAgICAgICAgICAgICAgICAgLSAgICAgICAgIFEyID0gKFAxK1AyKS8yICBSMiA9IChQMitQMykvMgogICAgICAgICAvICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAvICAgICAgICAgICAgICAgICAgICAgXCAgICAgICAgICAgIFEzID0gUjEgPSAoUTIrUjIpLzIKICAgICAgICMgICAgICAgICAgICAgICAgICAgICAgICMKICAgICBRMSAgICAgICAgICAgICAgICAgICAgICAgICBSMyAgICBOb3RlIHRoYXQgUTIsIFIyLCBhbmQgUTM9UjEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmUgb24gYSBzaW5nbGUgbGluZSB3aGljaCBpcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhbmdlbnQgdG8gdGhlIGN1cnZlLgoKCiAgICBXZSBoYXZlIHRoZW4gZGVjb21wb3NlZCAgYSBub24teS1tb25vdG9uaWMgQul6aWVyIGN1cnZlIGludG8gdHdvCiAgICBzbWFsbGVyIHN1Yi1hcmNzLiAgTm90ZSB0aGF0IGluIHRoZSBhYm92ZSBkcmF3aW5nLCBib3RoIHN1Yi1hcmNzCiAgICBhcmUgbW9ub3RvbmljLCBhbmQgdGhhdCB0aGUgZXh0cmVtdW0gaXMgdGhlbiBRMz1SMS4gIEhvd2V2ZXIsIGluCiAgICBhICBtb3JlIGdlbmVyYWwgIGNhc2UsICBvbmx5ICBvbmUgc3ViLWFyYyAgaXMgIGd1YXJhbnRlZWQgdG8gIGJlCiAgICBtb25vdG9uaWMuICBHZXR0aW5nIGJhY2sgdG8gb3VyIGZvcm1lciBleGFtcGxlOgoKCiAgICAgICAgICAgICAgICAgICAgUTIKICAgICAgICAgICAgICAgICAgICoKCiAgICAgICAgICAgICAgICAgICBfXy14LS1fIFIxCiAgICAgICAgICAgICAgICBfLS0gICAgICAgI18KICAgICAgICAgIFExICBfLSAgICAgICAgUTMgIC0gICBSMgogICAgICAgICAgICAgIyAgICAgICAgICAgICAgIFwgKgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCAgUjMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIwoKCiAgICBIZXJlLCB3ZSBzZWUgdGhhdCwgIHRob3VnaCBRMVEyUTMgaXMgc3RpbGwgbm9uLW1vbm90b25pYywgUjFSMlIzCiAgICBpcyBldmVyICBkZXNjZW5kaW5nOiBXZSAgdGh1cyBrbm93IHRoYXQgIGl0IGRvZXNuJ3QgIGNvbnRhaW4gdGhlCiAgICBleHRyZW11bS4gIFdlIGNhbiB0aGVuIHJlLXN1YmRpdmlkZSBRMVEyUTMgaW50byB0d28gc3ViLWFyY3MgYW5kCiAgICBnbyAgb24gcmVjdXJzaXZlbHksICBzdG9wcGluZyAgd2hlbiB3ZSAgZW5jb3VudGVyIHR3byAgbW9ub3RvbmljCiAgICBzdWJhcmNzLCBvciB3aGVuIHRoZSBzdWJhcmNzIGJlY29tZSBzaW1wbHkgdG9vIHNtYWxsLgoKICAgIFdlICB3aWxsIGZpbmFsbHkgIGZpbmQgIHRoZSB2ZXJ0aWNhbCAgZXh0cmVtdW0uICAgTm90ZSB0aGF0ICB0aGUKICAgIGl0ZXJhdGl2ZSBwcm9jZXNzIG9mIGZpbmRpbmcgYW4gZXh0cmVtdW0gaXMgY2FsbGVkIGBmbGF0dGVuaW5nJy4KCgogIGUuIENvbXB1dGluZyBQcm9maWxlcyBDb29yZGluYXRlcwoKICAgIE9uY2Ugd2UgaGF2ZSB0aGUgaGVpZ2h0IG9mIGVhY2ggcHJvZmlsZSwgd2UgYXJlIGFibGUgdG8gYWxsb2NhdGUKICAgIGl0IGluIHRoZSByZW5kZXIgcG9vbC4gICBUaGUgbmV4dCB0YXNrIGlzIHRvIGNvbXB1dGUgY29vcmRpbmF0ZXMKICAgIGZvciBlYWNoIHNjYW5saW5lLgoKICAgIEluICB0aGUgY2FzZSAgb2Ygc2VnbWVudHMsICB0aGUgY29tcHV0YXRpb24gIGlzIHN0cmFpZ2h0Zm9yd2FyZCwKICAgIHVzaW5nICB0aGUgIEV1Y2xpZGlhbiAgIGFsZ29yaXRobSAgKGFsc28gIGtub3duICBhcyAgQnJlc2VuaGFtKS4KICAgIEhvd2V2ZXIsIGZvciBC6XppZXIgYXJjcywgdGhlIGpvYiBpcyBhIGxpdHRsZSBtb3JlIGNvbXBsaWNhdGVkLgoKICAgIFdlIGFzc3VtZSAgdGhhdCBhbGwgQul6aWVycyB0aGF0ICBhcmUgcGFydCBvZiBhICBwcm9maWxlIGFyZSB0aGUKICAgIHJlc3VsdCBvZiAgZmxhdHRlbmluZyB0aGUgY3VydmUsICB3aGljaCBtZWFucyB0aGF0IHRoZXkgIGFyZSBhbGwKICAgIHktbW9ub3RvbmljIChhc2NlbmRpbmcgIG9yIGRlc2NlbmRpbmcsIGFuZCBuZXZlciAgZmxhdCkuICBXZSBub3cKICAgIGhhdmUgIHRvIGNvbXB1dGUgdGhlICBpbnRlcnNlY3Rpb25zIG9mICBhcmNzIHdpdGggIHRoZSBwcm9maWxlJ3MKICAgIHNjYW5saW5lcy4gIE9uZSAgd2F5IGlzICB0byB1c2UgYSAgc2ltaWxhciBzY2hlbWUgIHRvIGZsYXR0ZW5pbmcKICAgIGNhbGxlZCBgc3RlcHBpbmcnLgoKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnNpZGVyIHRoaXMgYXJjLCBnb2luZyBmcm9tIFAxIHRvCiAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgIFAzLiAgU3VwcG9zZSB0aGF0IHdlIG5lZWQgdG8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcHV0ZSBpdHMgaW50ZXJzZWN0aW9ucyB3aXRoIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3biBzY2FubGluZXMuICBBcyBhbHJlYWR5CiAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgIG1lbnRpb25lZCB0aGlzIGNhbiBiZSBkb25lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGx5LCBidXQgdGhlIGludm9sZWQgYWxnb3JpdGhtCiAgICAgICAgICAqIFAyICAgICAgICAgXy0tLSMgUDMgIGlzIGZhciB0b28gc2xvdy4KICAgICAgLS0tLS0tLS0tLS0tLSBfLS0gIC0tCiAgICAgICAgICAgICAgICAgIF8tCiAgICAgICAgICAgICAgICBfLyAgICAgICAgICAgICAgIEluc3RlYWQsIGl0IGlzIHN0aWxsIHBvc3NpYmxlIHRvCiAgICAgIC0tLS0tLS0tLS8tLS0tLS0tLS0tLSAgICAgIHVzZSB0aGUgZGVjb21wb3NpdGlvbiBwcm9wZXJ0eSBpbgogICAgICAgICAgICAgIC8gICAgICAgICAgICAgICAgICB0aGUgc2FtZSByZWN1cnNpdmUgd2F5LCBpLmUuLAogICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICBzdWJkaXZpZGUgdGhlIGFyYyBpbnRvIHN1YmFyY3MKICAgICAgLS0tLS0tfC0tLS0tLS0tLS0tLS0tICAgICAgdW50aWwgdGhlc2UgZ2V0IHRvbyBzbWFsbCB0byBjcm9zcwogICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICBtb3JlIHRoYW4gb25lIHNjYW5saW5lIQogICAgICAgICAgIHwKICAgICAgLS0tLS18LS0tLS0tLS0tLS0tLS0tICAgICAgVGhpcyBpcyB2ZXJ5IGVhc2lseSBkb25lIHVzaW5nIGEKICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgcmFzdGVyaXplci1tYW5hZ2VkIHN0YWNrIG9mCiAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIHN1YmFyY3MuCiAgICAgICAgICAjIFAxCgoKICBmLiBTd2VlcGluZyBhbmQgU29ydGluZyB0aGUgU3BhbnMKCiAgICBPbmNlIGFsbCBvdXIgcHJvZmlsZXMgaGF2ZSAgYmVlbiBjb21wdXRlZCwgd2UgYmVnaW4gdGhlIHN3ZWVwIHRvCiAgICBidWlsZCAoYW5kIGZpbGwpIHRoZSBzcGFucy4KCiAgICBBcyBib3RoIHRoZSAgVHJ1ZVR5cGUgYW5kIFR5cGUgMSBzcGVjaWZpY2F0aW9ucyAgdXNlIHRoZSB3aW5kaW5nCiAgICBmaWxsICBydWxlIChidXQgIHdpdGggb3Bwb3NpdGUgIGRpcmVjdGlvbnMpLCB3ZSAgcGxhY2UsICBvbiBlYWNoCiAgICBzY2FubGluZSwgdGhlIHByZXNlbnQgcHJvZmlsZXMgaW4gdHdvIHNlcGFyYXRlIGxpc3RzLgoKICAgIE9uZSAgbGlzdCwgIGNhbGxlZCAgdGhlICBgbGVmdCcgIG9uZSwgIG9ubHkgIGNvbnRhaW5zICBhc2NlbmRpbmcKICAgIHByb2ZpbGVzLCB3aGlsZSAgdGhlIG90aGVyIGByaWdodCcgbGlzdCAgY29udGFpbnMgdGhlIGRlc2NlbmRpbmcKICAgIHByb2ZpbGVzLgoKICAgIEFzICBlYWNoIGdseXBoICBpcyBtYWRlICBvZiAgY2xvc2VkIGN1cnZlcywgIGEgc2ltcGxlICBnZW9tZXRyaWMKICAgIHByb3BlcnR5IGVuc3VyZXMgdGhhdCAgdGhlIHR3byBsaXN0cyBjb250YWluIHRoZSAgc2FtZSBudW1iZXIgb2YKICAgIGVsZW1lbnRzLgoKICAgIENyZWF0aW5nIHNwYW5zIGlzIHRodXMgc3RyYWlnaHRmb3J3YXJkOgoKICAgIDEuIFdlIHNvcnQgZWFjaCBsaXN0IGluIGluY3JlYXNpbmcgaG9yaXpvbnRhbCBvcmRlci4KCiAgICAyLiBXZSBwYWlyICBlYWNoIHZhbHVlIG9mICB0aGUgbGVmdCBsaXN0IHdpdGggIGl0cyBjb3JyZXNwb25kaW5nCiAgICAgICB2YWx1ZSBpbiB0aGUgcmlnaHQgbGlzdC4KCgogICAgICAgICAgICAgICAgICAgLyAgICAgLyAgfCAgIHwgICAgICAgICAgRm9yIGV4YW1wbGUsIHdlIGhhdmUgaGVyZQogICAgICAgICAgICAgICAgICAvICAgICAvICAgfCAgIHwgICAgICAgICAgZm91ciBwcm9maWxlcy4gIFR3byBvZgogICAgICAgICAgICAgICAgPi8gICAgIC8gICAgfCAgIHwgIHwgICAgICAgdGhlbSBhcmUgYXNjZW5kaW5nICgxICYKICAgICAgICAgICAgICAxLy8gICAgIC8gICBeIHwgICB8ICB8IDIgICAgIDMpLCB3aGlsZSB0aGUgdHdvIG90aGVycwogICAgICAgICAgICAgIC8vICAgICAvLyAgM3wgfCAgIHwgIHYgICAgICAgYXJlIGRlc2NlbmRpbmcgKDIgJiA0KS4KICAgICAgICAgICAgICAvICAgICAvLzQgICB8IHwgICB8ICAgICAgICAgIE9uIHRoZSBnaXZlbiBzY2FubGluZSwKICAgICAgICAgICBhIC8gICAgIC88ICAgICAgIHwgICB8ICAgICAgICAgIHRoZSBsZWZ0IGxpc3QgaXMgKDEsMyksCiAgICAgIC0gLSAtICotLS0tLSogLSAtIC0gLSAqLS0tKiAtIC0geSAtICBhbmQgdGhlIHJpZ2h0IG9uZSBpcwogICAgICAgICAgIC8gICAgIC8gYiAgICAgICBjfCAgIHxkICAgICAgICAgKDQsMikgKHNvcnRlZCkuCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZXJlIGFyZSB0aGVuIHR3byBzcGFucywgam9pbmluZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgdG8gNCAoaS5lLiBhLWIpIGFuZCAzIHRvIDIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaS5lLiBjLWQpIQoKCiAgICBTb3J0aW5nIGRvZXNuJ3QgbmVjZXNzYXJpbHkgIHRha2UgbXVjaCB0aW1lLCBhcyBpbiAgOTkgY2FzZXMgb3V0CiAgICBvZiAxMDAsIHRoZSBsaXN0cycgb3JkZXIgaXMgIGtlcHQgZnJvbSBvbmUgc2NhbmxpbmUgdG8gdGhlIG5leHQuCiAgICBXZSBjYW4gIHRodXMgaW1wbGVtZW50IGl0ICB3aXRoIHR3byBzaW1wbGUgIHNpbmdseS1saW5rZWQgbGlzdHMsCiAgICBzb3J0ZWQgYnkgYSBjbGFzc2ljIGJ1YmJsZS1zb3J0LCB3aGljaCB0YWtlcyBhIG1pbmltdW0gYW1vdW50IG9mCiAgICB0aW1lIHdoZW4gdGhlIGxpc3RzIGFyZSBhbHJlYWR5IHNvcnRlZC4KCiAgICBBICBwcmV2aW91cyAgdmVyc2lvbiAgb2YgIHRoZSAgcmFzdGVyaXplciAgdXNlZCAgbW9yZSAgZWxhYm9yYXRlCiAgICBzdHJ1Y3R1cmVzLCBsaWtlIGFycmF5cyB0byAgcGVyZm9ybSBgZmFzdGVyJyBzb3J0aW5nLiAgSXQgdHVybmVkCiAgICBvdXQgdGhhdCAgdGhpcyBvbGQgc2NoZW1lIGlzICBub3QgZmFzdGVyIHRoYW4gIHRoZSBvbmUgZGVzY3JpYmVkCiAgICBhYm92ZS4KCiAgICBPbmNlIHRoZSBzcGFucyAgaGF2ZSBiZWVuIGBjcmVhdGVkJywgd2UgY2FuICBzaW1wbHkgZHJhdyB0aGVtIGluCiAgICB0aGUgdGFyZ2V0IGJpdG1hcC4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKQ29weXJpZ2h0IDIwMDMgYnkKRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgoKVGhpcyAgZmlsZSAgaXMgIHBhcnQgIG9mIHRoZSAgRnJlZVR5cGUgIHByb2plY3QsIGFuZCBtYXkgIG9ubHkgYmUgIHVzZWQsCm1vZGlmaWVkLCAgYW5kICBkaXN0cmlidXRlZCAgdW5kZXIgIHRoZSAgdGVybXMgb2YgIHRoZSBGcmVlVHlwZSAgcHJvamVjdApsaWNlbnNlLCBMSUNFTlNFLlRYVC4gICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlIHRoaXMKZmlsZSB5b3UgIGluZGljYXRlIHRoYXQgIHlvdSBoYXZlICByZWFkIHRoZSAgbGljZW5zZSBhbmQgdW5kZXJzdGFuZCAgYW5kCmFjY2VwdCBpdCBmdWxseS4KCgotLS0gZW5kIG9mIHJhc3Rlci50eHQgLS0tCgpMb2NhbCBWYXJpYWJsZXM6CmNvZGluZzogbGF0aW4tMQpFbmQ6Cg==