IyBBYXAgcmVjaXBlIGZvciBGcmVuY2ggVmltIHNwZWxsIGZpbGVzLgoKIyBVc2UgYSBmcmVzaGx5IGNvbXBpbGVkIFZpbSBpZiBpdCBleGlzdHMuCkBpZiBvcy5wYXRoLmV4aXN0cygnLi4vLi4vLi4vc3JjL3ZpbScpOgogICAgVklNID0gLi4vLi4vLi4vc3JjL3ZpbQpAZWxzZToKICAgIDpwcm9nc2VhcmNoIFZJTSB2aW0KClNQRUxMRElSID0gLi4KRklMRVMgICAgPSBmcl9GUi5hZmYgZnJfRlIuZGljCgphbGw6ICRTUEVMTERJUi9mci5sYXRpbjEuc3BsICRTUEVMTERJUi9mci51dGYtOC5zcGwgLi4vUkVBRE1FX2ZyLnR4dAoKIyBUaGUgc3BlbGwgZmlsZSBpcyBpc28tODg1OS0xNSwgYnV0IFZpbSBub3JtYWxseSB1c2VzICJsYXRpbjEiIGZvciB0aGlzLgojIFRoaXMgaXMgT0sgZm9yIHRoZSB1dGYtOCBmaWxlcywgYnV0IGZvciBsYXRpbjEgd2UgbmVlZCB0byBhdm9pZCB0aGUgIm9lIgojIGNoYXJhY3Rlci4gIFdoZW4gdW5wYWNraW5nIHdlIGNyZWF0ZSBmb3VyIGZpbGVzOgojICAgIGZyX0ZSX2xhdGluMS5hZmYgICAgbW9kaWZpZWQgZmlsZQojICAgIGZyX0ZSX2xhdGluMS5kaWMgICAgbW9kaWZpZWQgZmlsZQojICAgIGZyX0ZSX2lzbzE1LmFmZiAgICAgb3JpZ2luYWwgZmlsZSAoYWZ0ZXIgYXBwbHlpbmcgZGlmZikKIyAgICBmcl9GUl9pc28xNS5kaWMgICAgIG9yaWdpbmFsIGZpbGUgKGFmdGVyIGFwcGx5aW5nIGRpZmYpCiMgSnVzdCBiZWZvcmUgdXNpbmcgdGhlIGRpY3Rpb25hcnkgZmlsZXMsIHRoZSByaWdodCBvbmVzIGFyZSBjb3BpZWQgdG8KIyAgICBmcl9GUi5hZmYKIyAgICBmcl9GUi5kaWMKCiRTUEVMTERJUi9mci5sYXRpbjEuc3BsIDogJEZJTEVTCiAgICAgICAgOmNvcHkge2ZvcmNlfSBmcl9GUl9sYXRpbjEuYWZmIGZyX0ZSLmFmZgogICAgICAgIDpjb3B5IHtmb3JjZX0gZnJfRlJfbGF0aW4xLmRpYyBmcl9GUi5kaWMKICAgICAgICA6c3lzIGVudiBMQU5HPWZyX0ZSLklTTy04ODU5LTE1QGV1cm8KCQkkVklNIC11IE5PTkUgLWUgLWMgIm1rc3BlbGwhICRTUEVMTERJUi9mciBmcl9GUiIgLWMgcQoKJFNQRUxMRElSL2ZyLnV0Zi04LnNwbCA6ICRGSUxFUwogICAgICAgIDpjb3B5IHtmb3JjZX0gZnJfRlJfaXNvMTUuYWZmIGZyX0ZSLmFmZgogICAgICAgIDpjb3B5IHtmb3JjZX0gZnJfRlJfaXNvMTUuZGljIGZyX0ZSLmRpYwogICAgICAgIDpzeXMgZW52IExBTkc9ZnJfRlIuVVRGLTgKCQkkVklNIC11IE5PTkUgLWUgLWMgIm1rc3BlbGwhICRTUEVMTERJUi9mciBmcl9GUiIgLWMgcQoKLi4vUkVBRE1FX2ZyLnR4dCA6IFJFQURNRV9mcl9GUi50eHQKICAgICAgICA6Y2F0ICRzb3VyY2UgPiEkdGFyZ2V0CgojCiMgVXNlZCB0byBmZXRjaCB0aGUgZmlsZXMgZnJvbSBPcGVuT2ZmaWNlLm9yZy4gIFRob3NlIGFyZSBvbGQuCiMgTGF0ZXIgdmVyc2lvbnMgYXJlIGVsc2V3aGVyZS4KIwojT09ESVIgPSBodHRwOi8vZnRwLnNlcnZpY2VzLm9wZW5vZmZpY2Uub3JnL3B1Yi9PcGVuT2ZmaWNlLm9yZy9jb250cmliL2RpY3Rpb25hcmllcwpaSVBGSUxFID0gaHR0cDovL2RpY28uc2F2YW50LmZyZWUuZnIvX2Rvd25sb2FkL2ZyX0ZSXzEtMS02LnppcAoKOmF0dHIge2ZldGNoID0gJFpJUEZJTEV9IGZyX0ZSLnppcAoKIyBUaGUgZmlsZXMgZG9uJ3QgZGVwZW5kIG9uIHRoZSAuemlwIGZpbGUgc28gdGhhdCB3ZSBjYW4gZGVsZXRlIGl0LgojIE9ubHkgZG93bmxvYWQgdGhlIHppcCBmaWxlIGlmIHRoZSB0YXJnZXRzIGRvbid0IGV4aXN0Lgpmcl9GUi5hZmYgZnJfRlIuZGljOiB7YnVpbGRjaGVjaz19CiAgICAgICAgOmFzc2VydHBrZyB1bnppcCBwYXRjaAogICAgICAgIDpmZXRjaCBmcl9GUi56aXAKICAgICAgICA6c3lzICRVTlpJUCBmcl9GUi56aXAKICAgICAgICA6ZGVsZXRlIGZyX0ZSLnppcAogICAgICAgIEBpZiBub3Qgb3MucGF0aC5leGlzdHMoJ2ZyX0ZSLm9yaWcuYWZmJyk6CiAgICAgICAgICAgIDpjb3B5IGZyX0ZSLmFmZiBmcl9GUi5vcmlnLmFmZgogICAgICAgIEBpZiBub3Qgb3MucGF0aC5leGlzdHMoJ2ZyX0ZSLm9yaWcuZGljJyk6CiAgICAgICAgICAgIDpjb3B5IGZyX0ZSLmRpYyBmcl9GUi5vcmlnLmRpYwogICAgICAgIEBpZiBvcy5wYXRoLmV4aXN0cygnZnJfRlIuZGlmZicpOgogICAgICAgICAgICA6c3lzIHBhdGNoIDxmcl9GUi5kaWZmCgogICAgICAgICMgS2VlcCB0aGUgdW5tb2RpZmllZCBmaWxlcyAoYWZ0ZXIgZGlmZikgZm9yIElTTy04ODU5LTE1LgogICAgICAgIDpjb3B5IGZyX0ZSLmFmZiBmcl9GUl9pc28xNS5hZmYKICAgICAgICA6Y29weSBmcl9GUi5kaWMgZnJfRlJfaXNvMTUuZGljCiAgICAgICAgIyBGb3IgdGhlIGxhdGluMSAuZGljIGZpbGUgY2hhbmdlIGFsbCB0aGUgIm9lIiBjaGFyYWN0ZXJzIHRvIHRoZSB0d28KICAgICAgICAjIGNoYXJhY3RlcnMgIm9lIi4KICAgICAgICA6c3lzICRWSU0gLXUgTk9ORSAtZSAtYyAic2V0IGVuYz1sYXRpbjEiCiAgICAgICAgICAgICAgICAgICAgLWMgImUgZnJfRlIuZGljIgogICAgICAgICAgICAgICAgICAgIC1jICIlcy+9L29lL2ciCiAgICAgICAgICAgICAgICAgICAgLWMgInchIGZyX0ZSX2xhdGluMS5kaWMiCiAgICAgICAgICAgICAgICAgICAgLWMgcQogICAgICAgICMgRm9yIHRoZSBsYXRpbjEgLmFmZiBmaWxlIGRlbGV0ZSBhbGwgdGhlICJvZSIgYW5kICJPRSIgY2hhcmFjdGVycyBhbmQKICAgICAgICAjIGRlbGV0ZSB0aGUgUkVQIGxpbmVzIHdpdGggdGhvc2UgY2hhcmFjdGVycy4KICAgICAgICA6c3lzICRWSU0gLXUgTk9ORSAtZSAtYyAic2V0IGVuYz1sYXRpbjEiCiAgICAgICAgICAgICAgICAgICAgLWMgImUgZnJfRlIuYWZmIgogICAgICAgICAgICAgICAgICAgIC1jICIlcy+9Ly9nIgogICAgICAgICAgICAgICAgICAgIC1jICIlcy+8Ly9nIgogICAgICAgICAgICAgICAgICAgIC1jICIlZy9SRVAuKm9lL2QiCiAgICAgICAgICAgICAgICAgICAgLWMgInchIGZyX0ZSX2xhdGluMS5hZmYiCiAgICAgICAgICAgICAgICAgICAgLWMgcQoKCiMgR2VuZXJhdGUgZGlmZiBmaWxlcywgc28gdGhhdCBvdGhlcnMgY2FuIGdldCB0aGUgT3Blbk9mZmljZSBmaWxlcyBhbmQgYXBwbHkKIyB0aGUgZGlmZnMgdG8gZ2V0IHRoZSBWaW0gdmVyc2lvbnMuCiMgVGhpcyB1c2VzIHRoZSBpc28tODg1OS0xNSBmaWxlcy4KZGlmZjoKICAgICAgICA6YXNzZXJ0cGtnIGRpZmYKICAgICAgICA6Y29weSB7Zm9yY2V9IGZyX0ZSX2lzbzE1LmFmZiBmcl9GUi5hZmYKICAgICAgICA6Y29weSB7Zm9yY2V9IGZyX0ZSX2lzbzE1LmRpYyBmcl9GUi5kaWMKICAgICAgICA6c3lzIHtmb3JjZX0gZGlmZiAtYSAtQyAxIGZyX0ZSLm9yaWcuYWZmIGZyX0ZSLmFmZiA+ZnJfRlIuZGlmZgogICAgICAgIDpzeXMge2ZvcmNlfSBkaWZmIC1hIC1DIDEgZnJfRlIub3JpZy5kaWMgZnJfRlIuZGljID4+ZnJfRlIuZGlmZgoKIyBEZWxldGUgYWxsIHRoZSB1bnBhY2tlZCBhbmQgZ2VuZXJhdGVkIGZpbGVzLCBpbmNsdWRpbmcgdGhlICJvcmlnIiBmaWxlcy4KY2xlYW46CiAgICAgICAgOmRlbGV0ZSB7Zm9yY2V9IGZyX0ZSLnppcCBmcl9GUi5hZmYgZnJfRlIuZGljCiAgICAgICAgICAgICAgICAgICAgICAgIGZyX0ZSLmFmZi5vcmlnIGZyX0ZSLmRpYy5vcmlnCiAgICAgICAgICAgICAgICAgICAgICAgIGZyX0ZSLm9yaWcuYWZmIGZyX0ZSLm9yaWcuZGljCiAgICAgICAgICAgICAgICAgICAgICAgIGZyX0ZSX2xhdGluMS5hZmYgZnJfRlJfbGF0aW4xLmRpYwogICAgICAgICAgICAgICAgICAgICAgICBmcl9GUl9pc28xNS5hZmYgZnJfRlJfaXNvMTUuZGljCiAgICAgICAgICAgICAgICAgICAgICAgIFJFQURNRV9mcl9GUi50eHQKCiMgQ2hlY2sgZm9yIHVwZGF0ZWQgT3Blbk9mZmljZSBzcGVsbCBmaWxlcy4gIFdoZW4gdGhlcmUgYXJlIGNoYW5nZXMgdGhlCiMgIi5uZXcuYWZmIiBhbmQgIi5uZXcuZGljIiBmaWxlcyBhcmUgbGVmdCBiZWhpbmQgZm9yIG1hbnVhbCBpbnNwZWN0aW9uLgoKY2hlY2s6CiAgICAgICAgOmFzc2VydHBrZyB1bnppcCBkaWZmCiAgICAgICAgOmZldGNoIGZyX0ZSLnppcAogICAgICAgIDpta2RpciB0bXAKICAgICAgICA6Y2QgdG1wCiAgICAgICAgQHRyeToKICAgICAgICAgICAgQGltcG9ydCBzdGF0CiAgICAgICAgICAgIDpzeXMgJFVOWklQIC4uL2ZyX0ZSLnppcAogICAgICAgICAgICA6c3lzIHtmb3JjZX0gZGlmZiAuLi9mcl9GUi5vcmlnLmFmZiBmcl9GUi5hZmYgPmQKICAgICAgICAgICAgQGlmIG9zLnN0YXQoJ2QnKVtzdGF0LlNUX1NJWkVdID4gMDoKICAgICAgICAgICAgICAgIDpjb3B5IGZyX0ZSLmFmZiAuLi9mcl9GUi5uZXcuYWZmCiAgICAgICAgICAgIDpzeXMge2ZvcmNlfSBkaWZmIC4uL2ZyX0ZSLm9yaWcuZGljIGZyX0ZSLmRpYyA+ZAogICAgICAgICAgICBAaWYgb3Muc3RhdCgnZCcpW3N0YXQuU1RfU0laRV0gPiAwOgogICAgICAgICAgICAgICAgOmNvcHkgZnJfRlIuZGljIC4uL2ZyX0ZSLm5ldy5kaWMKICAgICAgICBAZmluYWxseToKICAgICAgICAgICAgOmNkIC4uCiAgICAgICAgICAgIDpkZWxldGUge3J9e2Z9e3F9IHRtcAogICAgICAgICAgICA6ZGVsZXRlIGZyX0ZSLnppcAoKCiMgdmltOiBzZXQgc3RzPTQgc3c9NCA6Cg==