VW4gYXBlcmN1IGR1IGxheW91dCBkZXMgZmljaGllcnMgc291cmNlcyBkZSBGcmVlVHlwZSAyOgoKICBkb2NzLyAgICAgICAgICAgIC0gZG9jdW1lbnRhdGlvbgogICAgICBodG1sLyAgICAgICAgLSBkb2N1bWVudGF0aW9uIGF1IGZvcm1hdCBodG1sCiAgICAgIAogICAgICB0eHQvICAgICAgICAgLSBkb2N1bWVudGF0aW9uIGF1IGZvcm1hdCB0ZXh0ZQogICAgCiAgICAKICBpbmNsdWRlLyAgICAgICAgIC0gbGVzIGhlYWRlcnMgcHVibGlxdWVzIGRlIGxhIGxpYnJhaXJpZSwgY2Ugc29udCBjZXV4CiAgICAgICAgICAgICAgICAgICAgIHF1aSBzb250IGluc3RhbGxlcyBhdmVjIGxlIHBhcXVldCBmcmVldHlwZS1kZXZlbC5ycG0KCiAgY29uZmlnLyAgICAgICAgICAtIGxlIHJlcGVydG9pcmUgZGUgY29uZmlndXJhdGlvbi4KICAgICAgYW5zaS8gICAgICAgCiAgICAgICAgZnRfY29uZi5oICAtIGZpY2hpZXIgZGUgY29uZmlndXJhdGlvbgoJZnRzeXMuYyAgICAtIGZpY2hpZXIgaW1wbGVtZW50YXRpb24gYmFzLW5pdmVhdQoKICAgICAgdW5peC8KICAgICAgCiAgICAgIG9zMi8KICAgICAgCiAgICAgIGRvcy8KICAgICAgCiAgICAgIGFtaWdhLwogICAgICAKICAgICAgZGVidWcvCiAgICAgIAogICAgICAKICBzcmMvICAgICAgICAgICAgICAtIHNvdXJjZXMgZGUgbGEgbGlicmFpcmllCiAgICAgIGJhc2UvICAgICAgICAgLSBjb3VjaGUgZGUgYmFzZSAoc2VydmljZXMgZ2VuZXJpcXVlcyArIEFQSSkKICAgICAgCiAgICAgIHRydWV0eXBlLyAgICAgLSBwaWxvdGUgdHJ1ZXR5cGUKICAgICAgICAgIG9wdGlvbnMvICAtIG9wdGlvbnMgZHUgcGlsb3RlIHRydWV0eXBlCiAgICAgICAgICBleHRlbmQvICAgLSBleHRlbnNpb25zIGR1IHBpbG90ZSB0cnVldHlwZQogICAgICAKICAgICAgdHlwZTEvICAgICAgICAtIHBpbG90ZSB0eXBlIDEKICAgICAgICAgIG9wdGlvbnMvICAtIG9wdGlvbnMgZHUgcGlsb3RlIHR5cGUgMQoJICBleHRlbmQvICAgLSBleHRlbnNpb25zIGR1IHBpbG90ZSB0eXBlIDEKICAgICAgCiAgICAgIHR5cGUyLyAgICAgICAgLSBwaWxvdGUgdHlwZSAyCiAgICAgIAogICAgICBzcGVlZG8vICAgICAgIC0gcGlsb3RlIHNwZWVkbwogICAgICAKICAgICAgc2hhcmVkLyAgICAgICAtIHNvdXJjZXMgcGFydGFnZWVzIHBhciBwbHVzaWV1cnMgcGlsb3RlcwogICAgICAKCiAgdGVzdHMvICAgICAgICAgICAgLSBwcm9ncmFtbWVzIGRlIHRlc3QKICAgICAgZGF0YS8gICAgICAgICAtIGRvbm5lZXMgZGVzIHRlc3RzID0gZmljaGllcnMgZGUgcG9saWNlID0+IGNvcGllcyBkYW5zIGJpbgogICAgICB0ZXN0MS8gICAgICAgIC0gc291cmNlIGR1IHRlc3QgbnVtZXJvIDEKICAgICAgdGVzdDIvICAgICAgICAtIHNvdXJjZSBkdSB0ZXN0IG51bWVybyAyCiAgICAgIHRlc3QzLyAgICAgICAgLSAuLi4KICAgICAgLi4uCgogIG9iai8gICAgICAgICAgICAgIC0gZW1wbGFjZW1lbnQgZGVzIGZpY2hpZXJzIG9iamV0cyBjb21waWxlcyArIGxpYnJhaXJpZSA/CiAgYmluLyAgICAgICAgICAgICAgLSBlbXBsYWNlbWVudCBkZXMgZXhlY3V0YWJsZXMgKGRlbW9zK3Rlc3RzKQogIAogIGRlbW9zLyAgICAgICAgICAgIC0gcHJvZ3JhbW1lcyBkZSBkZW1vbnN0cmF0aW9uCiAgICAgIGdyYXBoLyAgICAgICAgLSBzb3VzLXN5c3RlbWUgZ3JhcGhpcXVlIGRlcyBwcm9ncmFtbWVzIGRlIGRlbW8KICAgICAgCiAgCiAgY29udHJpYi8gICAgICAgICAgLSBjb250cmlidXRpb25zIGRlIHRvdXRlcyBzb3J0ZXMuLgoKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClF1ZWxxdWVzIGF1dHJlcyBpZGVlcyBhdSBoYXNhcmQgOgoKLSB2aXJlciBsZSBjb250cm9sZSBkZXMgdGhyZWFkcywgb24gcydlbiB0YXBlIG1hZ2lzdHJhbGVtZW50CgotIHNlcGFyZXIgbCdhbGxvY2F0aW9uIG1lbW9pcmUgZGUgbCdhY2NlcyBkaXNxdWUgKCtmbGV4aWJsZSkKCi0gbCdhcGkgZGUgYmFzZSBkb2l0IHBlcm1ldHRyZSAiZCdvdXZyaXIiIHVuIGZpY2hpZXIgZGUgcG9saWNlIHNlIHRyb3V2YW50CiAgZGVqYSBlbiBtZW1vaXJlLi4gIAogIAotIGV4cGxpcXVlciBsZXMgZGlmZmVyZW50cyB0eXBlcyBkZSBkaWN0aW9ubmFpcmVzIDoKCiAgICBjaGFyX2NvZGUgICAgLT4gIGdseXBoX2luZGV4ICAgICAgICAgY2hhcm1hcCAgICAodHJ1ZXR5cGUpCiAgICBjaGFyX2NvZGUgICAgLT4gIGdseXBoX25hbWUgICAgICAgICAgZW5jb2RpbmcgICAodHlwZSAxKQogICAgZ2x5cGhfaW5kZXggIC0+ICBnbHlwaF9uYW1lICAgICAgICAgIHJlcGVydG9pcmUgKC4uLikKCi0gcGx1c2lldXJzICJyYXN0ZXIiIHBvc3NpYmxlcyAobGUgcmFzdGVyIHBhciBkZWZhdXQgcGV1dCBldHJlIGTpdGVybWlu6SDgIGxhIGNvbXBpbGF0aW9uLAogIHNpbm9uIGwnYWpvdXQgc2UgZmFpdCBzaW1wbGVtZW50IGVuIHBhc3NhbnQgdW4gcG9pbnRldXIgZCdpbnRlcmZhY2UuLikKCgotIGwnYXBpIGRlIGJhc2UgZG9pdCBldHJlIHNpbXBsaWZpZWUuIExhIHBsdXBhcnQgZGVzIGRldmVsb3BwZXVycyBuZSB2ZXVsZW50CiAgcGFzIHNhdm9pciBjZSBxdSdlc3QgdW5lICJzaXplIiwgdW4gImdseXBoX3Nsb3QiLCBldGMuLiwgb24gY29uc2VpbGxlIGRvbmMKICBkJ2VuIGNyZWVyIHVuZSBwYXIgZGVmYXV0LCBsb3JzIGRlIGwnYXBwZWwgZGUgOgogIAogICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0gaW5pdGlhbGlzYXRpb24gZXQgbGVjdHVyZSBkZXMgcG9saWNlcyAtLS0tLS0tLS0tLS0KICAKICAgICBGVF9Jbml0X0ZyZWVUeXBlKCAmbGlicmFyeSApOwogICAgIAogICAgIEZUX1NldF9NZW1vcnlfTWFuYWdlciggbGlicmFyeSwgJm1lbV9tYW5hZ2VyX3JlYyApOwogICAgIAogICAgIEZUX1NldF9JT19NYW5hZ2VyKCBsaWJyYXJ5LCAmaW9fbWFuYWdlcl9yZWMgKTsKICAKICAKICAgICBGVF9OZXdfRmFjZSggbGlicmFyeSwgZmlsZV9wYXRobmFtZSwgZmFjZV9pbmRleCwgJmZhY2UgKTsKICAgICAKICAgICBGVF9OZXdfTWVtb3J5X0ZhY2UoIGxpYnJhcnksIGZpcnN0X2J5dGUsIGxlbmd0aCwgZmFjZV9pbmRleCwgJmZhY2UgKTsKCiAgICAgb3UgZW5jb3JlOgogICAgIAogICAgICAgRlRfTmV3X0ZhY2UoIGxpYnJhcnksICZuZXdfZmFjZV9yZWMsICZmYWNlICk7CiAgICAgICAKICAgICAgIGF2ZWMgbmV3X2ZhY2VfcmVjIDo6CiAgICAgICAKICAgICAgICAgIGZhY2VfaW5kZXgKICAgICAgIAogICAgICAgICAgcGF0aG5hbWUKCSAgCgkgIG1lbW9yeV9hZGRyZXNzCgkgIGJ5dGVzX3NpemUKICAgICAKCiAgICAgRlRfRmx1c2hfRmFjZSggZmFjZSApOyAgIC8vIGZlcm1lIGxlIHN0cmVhbSBjb3JyZXNwb25kYW50Li4KCgogICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBjaGFuZ2VtZW50IGRlIHRhaWxsZSAtLS0tLS0KICAgICAKICAgICBGVF9TZXRfU2l6ZSggZmFjZSwgJmZhY2Vfc2l6ZV9yZWMgKTsKICAgICAKICAgICAgIGZhY2Vfc2l6ZV9yZWMgOjoKICAgICAgICAgY2hhcl9oZWlnaHQKCSBjaGFyX3dpZHRoCgkgaG9yel9yZXNvbHV0aW9uCgkgdmVydF9yZXNvbHV0aW9uCiAgICAgCiAgICAgRlRfU2V0X1BpeGVsX1NpemVzKCBmYWNlLCA2NCwgNjQgKTsKCgogICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHNlbGVjdGlvbiBkZSBsYSBjaGFybWFwIC0tLS0KICAgICAKICAgICBGVF9TZWxlY3RfQ2hhcm1hcCggZmFjZSwgZnRfY2hhcm1hcF91bmljb2RlICk7CiAgICAgCiAgICAgRlRfU2VsZWN0X0NoYXJtYXBfSW5kZXgoIGZhY2UsIGluZGV4ICk7CiAgICAgCiAgICAgRlRfTGlzdF9DaGFybWFwcyggZmFjZSwgYnVmZmVyLCBtYXgsIGZpcnN0ICk7CgogICAgIGZhY2UtPmNoYXJtYXAgPT4gcG9pbnRlIHZlcnMgbGEgY2hhcm1hcCBhY3R1ZWxsZS4uCgoKICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBjaGFyZ2VtZW50IGRlcyBnbHlwaGVzIC0tLS0tLS0tCiAgICAgCiAgICAgRlRfTG9hZF9HbHlwaCggZmFjZSwgZ2x5cGhfaW5kZXggKTsgCiAgICAgCiAgICAgRlRfTG9hZF9DaGFyKCBmYWNlLCBjaGFyX2NvZGUgKTsKICAgICAKICAgICBGVF9UcmFuc2Zvcm1fR2x5cGgoIGZhY2UtPmdseXBoLCAmdHJhbnMgKTsKICAgICAKICAgICAKICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHJlbmR1IGZpbmFsIC0tLS0tLS0tLS0tCiAgICAgCiAgICAgRlRfR2V0X091dGxpbmVfQml0bWFwKCBsaWJyYXJ5LCBmYWNlLT5nbHlwaCwgJmJpdCApOwogICAgIAogICAgIEZUX1NldF9SYXN0ZXIoIGxpYnJhcnksICJkZWZhdWx0IiApOwogICAgIAogICAgIEZUX1NldF9SYXN0ZXJfTW9kZSggbGlicmFyeSwgbWFqb3JfbW9kZSwgbWlub3JfbW9kZSApOwogICAgIAogICAgIAogICAgIAogICAgIAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KClN5c3TobWUgZGUgY29uZmlndXJhdGlvbiBhdXRvbWF0aXF1ZQoKIGZyZWV0eXBlMi8KICAgICBNYWtlZmlsZQogICAgIGNvbmZpZy8KICAgICAgICAgYW5zaS8KICAgICAgICAgICAgY29uZmlnLm1rCgogIG1ha2Ugc2V0dXAgID0+IGF1dG9kZXRlY3Rpb24gZHUgc3lzdOhtZSArIGNvcGllIGRlIGZpY2hpZXIgaW5jbHVkZSA/Pz8KCiAgbWFrZQo=