IiBMYW5ndWFnZTogICAgT0NhbWwKIiBNYWludGFpbmVyOiAgRGF2aWQgQmFlbGRlICAgICAgICA8Zmlyc3RuYW1lLm5hbWVAZW5zLWx5b24ub3JnPgoiICAgICAgICAgICAgICBNaWtlIExlYXJ5ICAgICAgICAgIDxsZWFyeUBud2xpbmsuY29tPgoiICAgICAgICAgICAgICBNYXJrdXMgTW90dGwgICAgICAgIDxtYXJrdXMubW90dGxAZ21haWwuY29tPgoiICAgICAgICAgICAgICBTdGVmYW5vIFphY2NoaXJvbGkgIDx6YWNrQGJvbm9uaWEuaXQ+CiIgICAgICAgICAgICAgIFZpbmNlbnQgQXJhdmFudGlub3MgPGZpcnN0bmFtZS5uYW1lQGltYWcuZnI+CiIgVVJMOiAgICAgICAgIGh0dHA6Ly93d3cub2NhbWwuaW5mby92aW0vZnRwbHVnaW4vb2NhbWwudmltCiIgTGFzdCBDaGFuZ2U6IDIwMDggSnVsIDE3IC0gQnVnZml4IHJlbGF0ZWQgdG8gZm5hbWVlc2NhcGUgKFZBKQoiICAgICAgICAgICAgICAyMDA3IFNlcCAwOSAtIEFkZGVkIC5hbm5vdCBzdXBwb3J0IGZvciBvY2FtbGJ1aWxkLCBweXRob24gbm90IAoiICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZCBhbnltb3JlIChWQSkKIiAgICAgICAgICAgICAgMjAwNiBNYXkgMDEgLSBBZGRlZCAuYW5ub3Qgc3VwcG9ydCBmb3IgZmlsZS53aGF0ZXZlcmV4dCAoU1opCiIJICAgICAgICAgICAgIDIwMDYgQXByIDExIC0gRml4ZWQgYW4gaW5pdGlhbGl6YXRpb24gYnVnOyBmaXhlZCBBU1MgYWJicmV2IChNTSkKIiAgICAgICAgICAgICAgMjAwNSBPY3QgMTMgLSByZW1vdmVkIEdQTDsgYmV0dGVyIG1hdGNoaXQgc3VwcG9ydCAoTU0sIFNaKQoiCmlmIGV4aXN0cygiYjpkaWRfZnRwbHVnaW4iKQogIGZpbmlzaAplbmRpZgpsZXQgYjpkaWRfZnRwbHVnaW49MQoKIiBzb21lIG1hY3JvCmlmIGV4aXN0cygnKmZuYW1lZXNjYXBlJykKICBmdW5jdGlvbiEgczpGbmFtZWVzY2FwZShzKQogICAgcmV0dXJuIGZuYW1lZXNjYXBlKGE6cykKICBlbmRmdW4KZWxzZQogIGZ1bmN0aW9uISBzOkZuYW1lZXNjYXBlKHMpCiAgICByZXR1cm4gZXNjYXBlKGE6cywiIFx0XG4qP1t7YCRcXCUjJ1wifCE8IikKICBlbmRmdW4KZW5kaWYKCiIgRXJyb3IgaGFuZGxpbmcgLS0gaGVscHMgbW92aW5nIHdoZXJlIHRoZSBjb21waWxlciB3YW50cyB5b3UgdG8gZ28KbGV0IHM6Y3Bvc2V0PSZjcG9wdGlvbnMKc2V0IGNwby09QwpzZXRsb2NhbCBlZm09CiAgICAgIFwlRUZpbGVcIFwiJWZcIlxcLFwgbGluZVwgJWxcXCxcIGNoYXJhY3RlcnNcICVjLSUqXFxkOiwKICAgICAgXCVFRmlsZVwgXCIlZlwiXFwsXCBsaW5lXCAlbFxcLFwgY2hhcmFjdGVyXCAlYzolbSwKICAgICAgXCUrRVJlZmVyZW5jZVwgdG9cIHVuYm91bmRcIHJlZ2V4cFwgbmFtZVwgJW0sCiAgICAgIFwlRW9jYW1seWFjYzpcIGVcIC1cIGxpbmVcICVsXCBvZlwgXCIlZlwiXFwsXCAlbSwKICAgICAgXCVXb2NhbWx5YWNjOlwgd1wgLVwgJW0sCiAgICAgIFwlLVptYWtlJS4lIywKICAgICAgXCVDJW0sCiAgICAgIFwlRCUqXFxhWyUqXFxkXTpcIEVudGVyaW5nXCBkaXJlY3RvcnlcIGAlZicsCiAgICAgIFwlWCUqXFxhWyUqXFxkXTpcIExlYXZpbmdcIGRpcmVjdG9yeVwgYCVmJywKICAgICAgXCVEJSpcXGE6XCBFbnRlcmluZ1wgZGlyZWN0b3J5XCBgJWYnLAogICAgICBcJVglKlxcYTpcIExlYXZpbmdcIGRpcmVjdG9yeVwgYCVmJywKICAgICAgXCVETWFraW5nXCAlKlxcYVwgaW5cICVmCgoiIEFkZCBtYXBwaW5ncywgdW5sZXNzIHRoZSB1c2VyIGRpZG4ndCB3YW50IHRoaXMuCmlmICFleGlzdHMoIm5vX3BsdWdpbl9tYXBzIikgJiYgIWV4aXN0cygibm9fb2NhbWxfbWFwcyIpCiAgIiAodW4pY29tbWVudGluZwogIGlmICFoYXNtYXB0bygnPFBsdWc+Q29tbWVudCcpCiAgICBubWFwIDxidWZmZXI+IDxMb2NhbExlYWRlcj5jIDxQbHVnPkxVbmNvbU9uCiAgICB2bWFwIDxidWZmZXI+IDxMb2NhbExlYWRlcj5jIDxQbHVnPkJVbmNvbU9uCiAgICBubWFwIDxidWZmZXI+IDxMb2NhbExlYWRlcj5DIDxQbHVnPkxVbmNvbU9mZgogICAgdm1hcCA8YnVmZmVyPiA8TG9jYWxMZWFkZXI+QyA8UGx1Zz5CVW5jb21PZmYKICBlbmRpZgoKICBubm9yZW1hcCA8YnVmZmVyPiA8UGx1Zz5MVW5jb21PbiBtejBpKCogPEVTQz4kQSAqKTxFU0M+YHoKICBubm9yZW1hcCA8YnVmZmVyPiA8UGx1Zz5MVW5jb21PZmYgOnMvXihcKiBcKC4qXCkgXCopL1wxLzxDUj46bm9oPENSPgogIHZub3JlbWFwIDxidWZmZXI+IDxQbHVnPkJVbmNvbU9uIDxFU0M+Oic8LCc+PENSPmA8TzxFU0M+MGkoKjxFU0M+YD5vPEVTQz4waSopPEVTQz5gPAogIHZub3JlbWFwIDxidWZmZXI+IDxQbHVnPkJVbmNvbU9mZiA8RVNDPjonPCwnPjxDUj5gPGRkYD5kZGA8CgogIGlmICFoYXNtYXB0bygnPFBsdWc+QWJicmV2JykKICAgIGlhYmJyZXYgPGJ1ZmZlcj4gQVNTIChhc3NlcnQgKDA9MSkgKCogWFhYICopKQogIGVuZGlmCmVuZGlmCgoiIExldCAlIGp1bXAgYmV0d2VlbiBzdHJ1Y3R1cmUgZWxlbWVudHMgKGR1ZSB0byBJc3NhYyBUcm90dHMpCmxldCBiOm13ID0gJycKbGV0IGI6bXcgPSBiOm13IC4gJyxcPGxldFw+Olw8YW5kXD46XChcPGluXD5cfDs7XCknCmxldCBiOm13ID0gYjptdyAuICcsXDxpZlw+Olw8dGhlblw+Olw8ZWxzZVw+JwpsZXQgYjptdyA9IGI6bXcgLiAnLFw8XChmb3JcfHdoaWxlXClcPjpcPGRvXD46XDxkb25lXD4sJwpsZXQgYjptdyA9IGI6bXcgLiAnLFw8XChvYmplY3RcfHNpZ1x8c3RydWN0XHxiZWdpblwpXD46XDxlbmRcPicKbGV0IGI6bXcgPSBiOm13IC4gJyxcPFwobWF0Y2hcfHRyeVwpXD46XDx3aXRoXD4nCmxldCBiOm1hdGNoX3dvcmRzID0gYjptdwoKbGV0IGI6bWF0Y2hfaWdub3JlY2FzZT0wCgoiIHN3aXRjaGluZyBiZXR3ZWVuIGludGVyZmFjZXMgKC5tbGkpIGFuZCBpbXBsZW1lbnRhdGlvbnMgKC5tbCkKaWYgIWV4aXN0cygiZzpkaWRfb2NhbWxfc3dpdGNoIikKICBsZXQgZzpkaWRfb2NhbWxfc3dpdGNoID0gMQogIG1hcCA8TG9jYWxMZWFkZXI+cyA6Y2FsbCBPQ2FtbF9zd2l0Y2goMCk8Q1I+CiAgbWFwIDxMb2NhbExlYWRlcj5TIDpjYWxsIE9DYW1sX3N3aXRjaCgxKTxDUj4KICBmdW4gT0NhbWxfc3dpdGNoKG5ld3dpbikKICAgIGlmIChtYXRjaChidWZuYW1lKCIiKSwgIlxcLm1saSQiKSA+PSAwKQogICAgICBsZXQgZm5hbWUgPSBzOkZuYW1lZXNjYXBlKHN1YnN0aXR1dGUoYnVmbmFtZSgiIiksICJcXC5tbGkkIiwgIi5tbCIsICIiKSkKICAgICAgaWYgKGE6bmV3d2luID09IDEpCiAgICAgICAgZXhlYyAibmV3ICIgLiBmbmFtZQogICAgICBlbHNlCiAgICAgICAgZXhlYyAiYXJnZSAiIC4gZm5hbWUKICAgICAgZW5kaWYKICAgIGVsc2VpZiAobWF0Y2goYnVmbmFtZSgiIiksICJcXC5tbCQiKSA+PSAwKQogICAgICBsZXQgZm5hbWUgPSBzOkZuYW1lZXNjYXBlKGJ1Zm5hbWUoIiIpKSAuICJpIgogICAgICBpZiAoYTpuZXd3aW4gPT0gMSkKICAgICAgICBleGVjICJuZXcgIiAuIGZuYW1lCiAgICAgIGVsc2UKICAgICAgICBleGVjICJhcmdlICIgLiBmbmFtZQogICAgICBlbmRpZgogICAgZW5kaWYKICBlbmRmdW4KZW5kaWYKCiIgRm9sZGluZyBzdXBwb3J0CgoiIEdldCB0aGUgbW9kZWxpbmUgYmVjYXVzZSBmb2xkaW5nIGRlcGVuZHMgb24gaW5kZW50YXRpb24KbGV0IHM6cyA9IGxpbmUyYnl0ZShsaW5lKCcuJykpK2NvbCgnLicpLTEKaWYgc2VhcmNoKCdeXHMqKFwqOm9cP2NhbWw6JykKICBsZXQgczptb2RlbGluZSA9IGdldGxpbmUoIi4iKQplbHNlCiAgbGV0IHM6bW9kZWxpbmUgPSAiIgplbmRpZgppZiBzOnMgPiAwCiAgZXhlICdnb3RvJyBzOnMKZW5kaWYKCiIgR2V0IHRoZSBpbmRlbnRhdGlvbiBwYXJhbXMKbGV0IHM6bSA9IG1hdGNoc3RyKHM6bW9kZWxpbmUsJ2RlZmF1bHRccyo9XHMqXGRcKycpCmlmIHM6bSAhPSAiIgogIGxldCBzOmlkZWYgPSBtYXRjaHN0cihzOm0sJ1xkXCsnKQplbHNlaWYgZXhpc3RzKCJnOm9tbGV0X2luZGVudCIpCiAgbGV0IHM6aWRlZiA9IGc6b21sZXRfaW5kZW50CmVsc2UKICBsZXQgczppZGVmID0gMgplbmRpZgpsZXQgczptID0gbWF0Y2hzdHIoczptb2RlbGluZSwnc3RydWN0XHMqPVxzKlxkXCsnKQppZiBzOm0gIT0gIiIKICBsZXQgczppID0gbWF0Y2hzdHIoczptLCdcZFwrJykKZWxzZWlmIGV4aXN0cygiZzpvbWxldF9pbmRlbnRfc3RydWN0IikKICBsZXQgczppID0gZzpvbWxldF9pbmRlbnRfc3RydWN0CmVsc2UKICBsZXQgczppID0gczppZGVmCmVuZGlmCgoiIFNldCB0aGUgZm9sZGluZyBtZXRob2QKaWYgZXhpc3RzKCJnOm9jYW1sX2ZvbGRpbmciKQogIHNldGxvY2FsIGZvbGRtZXRob2Q9ZXhwcgogIHNldGxvY2FsIGZvbGRleHByPU9NTGV0Rm9sZExldmVsKHY6bG51bSkKZW5kaWYKCiIgLSBPbmx5IGRlZmluaXRpb25zIGJlbG93LCBleGVjdXRlZCBvbmNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmlmIGV4aXN0cygiKk9NTGV0Rm9sZExldmVsIikKICBmaW5pc2gKZW5kaWYKCmZ1bmN0aW9uIHM6dG9waW5kZW50KGxudW0pCiAgbGV0IGwgPSBhOmxudW0KICB3aGlsZSBsID4gMAogICAgaWYgZ2V0bGluZShsKSA9fiAnXHMqXCUoXDxzdHJ1Y3RcPlx8XDxzaWdcPlx8XDxvYmplY3RcPlwpJwogICAgICByZXR1cm4gaW5kZW50KGwpCiAgICBlbmRpZgogICAgbGV0IGwgPSBsLTEKICBlbmR3aGlsZQogIHJldHVybiAtczppCmVuZGZ1bmN0aW9uCgpmdW5jdGlvbiBPTUxldEZvbGRMZXZlbChsKQoKICAiIFRoaXMgaXMgZm9yIG5vdCBtZXJnaW5nIGJsYW5rIGxpbmVzIGFyb3VuZCBmb2xkcyB0byB0aGVtCiAgaWYgZ2V0bGluZShhOmwpICF+ICdcUycKICAgIHJldHVybiAtMQogIGVuZGlmCgogICIgV2Ugc3RhcnQgZm9sZHMgZm9yIG1vZHVsZXMsIGNsYXNzZXMsIGFuZCBldmVyeSB0b3BsZXZlbCBkZWZpbml0aW9uCiAgaWYgZ2V0bGluZShhOmwpID1+ICdeXHMqXCUoXDx2YWxcPlx8XDxtb2R1bGVcPlx8XDxjbGFzc1w+XHxcPHR5cGVcPlx8XDxtZXRob2RcPlx8XDxpbml0aWFsaXplclw+XHxcPGluaGVyaXRcPlx8XDxleGNlcHRpb25cPlx8XDxleHRlcm5hbFw+XCknCiAgICBleGUgJ3JldHVybiAiPicgKGluZGVudChhOmwpL3M6aSkrMSAnIicKICBlbmRpZgoKICAiIFRvcGxldmVsIGxldCBhcmUgZGV0ZWN0ZWQgdGhhbmtzIHRvIHRoZSBpbmRlbnRhdGlvbgogIGlmIGdldGxpbmUoYTpsKSA9fiAnXlxzKmxldFw+JyAmJiBpbmRlbnQoYTpsKSA9PSBzOmkrczp0b3BpbmRlbnQoYTpsKQogICAgZXhlICdyZXR1cm4gIj4nIChpbmRlbnQoYTpsKS9zOmkpKzEgJyInCiAgZW5kaWYKCiAgIiBXZSBjbG9zZSBmb2xkIG9uIGVuZCB3aGljaCBhcmUgYXNzb2NpYXRlZCB0byBzdHJ1Y3QsIHNpZyBvciBvYmplY3QuCiAgIiBXZSB1c2Ugc3ludGF4IGluZm9ybWF0aW9uIHRvIGRvIHRoYXQuCiAgaWYgZ2V0bGluZShhOmwpID1+ICdeXHMqZW5kXD4nICYmIHN5bklEYXR0cihzeW5JRChhOmwsIGluZGVudChhOmwpKzEsIDApLCAibmFtZSIpICE9ICJvY2FtbEtleXdvcmQiCiAgICByZXR1cm4gKGluZGVudChhOmwpL3M6aSkrMQogIGVuZGlmCgogICIgRm9sZHMgZW5kIG9uIDs7CiAgaWYgZ2V0bGluZShhOmwpID1+ICdeXHMqOzsnCiAgICBleGUgJ3JldHVybiAiPCcgKGluZGVudChhOmwpL3M6aSkrMSAnIicKICBlbmRpZgoKICAiIENvbW1lbnRzIGFyb3VuZCBmb2xkcyBhcmVuJ3QgbWVyZ2VkIHRvIHRoZW0uCiAgaWYgc3luSURhdHRyKHN5bklEKGE6bCwgaW5kZW50KGE6bCkrMSwgMCksICJuYW1lIikgPT0gIm9jYW1sQ29tbWVudCIKICAgIHJldHVybiAtMQogIGVuZGlmCgogIHJldHVybiAnPScKZW5kZnVuY3Rpb24KCiIgVmltIHN1cHBvcnQgZm9yIE9DYW1sIC5hbm5vdCBmaWxlcwoiCiIgTGFzdCBDaGFuZ2U6IDIwMDcgSnVsIDE3CiIgTWFpbnRhaW5lcjogIFZpbmNlbnQgQXJhdmFudGlub3MgPHZpbmNlbnQuYXJhdmFudGlub3NAZ21haWwuY29tPgoiIExpY2Vuc2U6ICAgICBwdWJsaWMgZG9tYWluCiIKIiBPcmlnaW5hbGx5IGluc3BpcmVkIGJ5ICdvY2FtbC1kdHlwZXMudmltJyBieSBTdGVmYW5vIFphY2NoaXJvbGkuCiIgVGhlIHNvdXJjZSBjb2RlIGlzIHF1aXRlIHJhZGljYWxseSBkaWZmZXJlbnQgZm9yIHdlIG5vdCB1c2UgcHl0aG9uIGFueW1vcmUuCiIgSG93ZXZlciB0aGlzIHBsdWdpbiBzaG91bGQgaGF2ZSB0aGUgZXhhY3Qgc2FtZSBiZWhhdmlvdXIsIHRoYXQncyB3aHkgdGhlCiIgZm9sbG93aW5nIGxpbmVzIGFyZSB0aGUgcXVpdGUgZXhhY3QgY29weSBvZiBTdGVmYW5vJ3Mgb3JpZ2luYWwgcGx1Z2luIDoKIgoiIDw8CiIgRXhlY3V0aW5nIE9jYW1sX3ByaW50X3R5cGUoPG1vZGU+KSBmdW5jdGlvbiB3aWxsIGRpc3BsYXkgaW4gdGhlIFZpbSBib3R0b20KIiBsaW5lKHMpIHRoZSB0eXBlIG9mIGFuIG9jYW1sIHZhbHVlIGdldHRpbmcgaXQgZnJvbSB0aGUgY29ycmVzcG9uZGluZyAuYW5ub3QKIiBmaWxlIChpZiBhbnkpLiAgSWYgVmltIGlzIGluIHZpc3VhbCBtb2RlLCA8bW9kZT4gc2hvdWxkIGJlICJ2aXN1YWwiIGFuZCB0aGUKIiBzZWxlY3RlZCBvY2FtbCB2YWx1ZSBjb3JyZXNwb25kIHRvIHRoZSBoaWdobGlnaHRlZCB0ZXh0LCBvdGhlcndpc2UgKDxtb2RlPgoiIGNhbiBiZSBhbnl0aGluZyBlbHNlKSBpdCBjb3JyZXNwb25kcyB0byB0aGUgbGl0ZXJhbCBmb3VuZCBhdCB0aGUgY3VycmVudAoiIGN1cnNvciBwb3NpdGlvbi4KIgoiIFR5cGluZyAnPExvY2FsTGVhZGVyPnQnIChMb2NhbExlYWRlciBkZWZhdWx0cyB0byAnXCcsIHNlZSA6aCBMb2NhbExlYWRlcikKIiB3aWxsIGNhdXNlICIgT2NhbWxfcHJpbnRfdHlwZSBmdW5jdGlvbiB0byBiZSBpbnZva2VkIHdpdGggdGhlIHJpZ2h0IAoiIGFyZ3VtZW50IGRlcGVuZGluZyBvbiB0aGUgY3VycmVudCBtb2RlICh2aXN1YWwgb3Igbm90KS4KIiA+PgoiCiIgSWYgeW91IGZpbmQgc29tZXRoaW5nIG5vdCBtYXRjaGluZyB0aGlzIGJlaGF2aW91ciwgcGxlYXNlIHNpZ25hbCBpdC4KIgoiIERpZmZlcmVuY2VzIGFyZToKIiAgIC0gbm8gbmVlZCBmb3IgcHl0aG9uIHN1cHBvcnQKIiAgICAgKyBwbHVzIDogbW9yZSBwb3J0YWJsZQoiICAgICArIG1pbnVzOiBubyBtb3JlIGxhenkgcGFyc2luZywgaXQgbG9va3MgdmVyeSBmYXN0IGhvd2V2ZXIKIiAgICAgCiIgICAtIG9jYW1sYnVpbGQgc3VwcG9ydCwgaWUuCiIgICAgICsgdGhlIHBsdWdpbiBmaW5kcyB0aGUgX2J1aWxkIGRpcmVjdG9yeSBhbmQgbG9va3MgZm9yIHRoZSAKIiAgICAgICBjb3JyZXNwb25kaW5nIGZpbGUgaW5zaWRlOwoiICAgICArIGlmIHRoZSB1c2VyIGRlY2lkZXMgdG8gY2hhbmdlIHRoZSBuYW1lIG9mIHRoZSBfYnVpbGQgZGlyZWN0b3J5IHRoYW5rcwoiICAgICAgIHRvIHRoZSAnLWJ1aWxkLWRpcicgb3B0aW9uIG9mIG9jYW1sYnVpbGQsIHRoZSBwbHVnaW4gd2lsbCBtYW5hZ2UgaW4KIiAgICAgICBtb3N0IGNhc2VzIHRvIGZpbmQgaXQgb3V0IChtb3N0IGNhc2VzID0gaWYgdGhlIHNvdXJjZSBmaWxlIGhhcyBhIHVuaXF1ZQoiICAgICAgIG5hbWUgYW1vbmcgeW91ciB3aG9sZSBwcm9qZWN0KTsKIiAgICAgKyBpZiBvY2FtbGJ1aWxkIGlzIG5vdCB1c2VkLCB0aGUgdXN1YWwgYmVoYXZpb3VyIGhvbGRzOyBpZS4gdGhlIC5hbm5vdAoiICAgICAgIGZpbGUgc2hvdWxkIGJlIGluIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyB0aGUgc291cmNlIGZpbGU7CiIgICAgICsgZm9yIHZpbSBwbHVnaW4gcHJvZ3JhbW1lcnM6CiIgICAgICAgdGhlIHZhcmlhYmxlICdiOl9idWlsZF9kaXInIGNvbnRhaW5zIHRoZSBpbmZlcnJlZCBwYXRoIHRvIHRoZSBidWlsZCAKIiAgICAgICBkaXJlY3RvcnksIGV2ZW4gaWYgdGhpcyBvbmUgaXMgbm90IG5hbWVkICdfYnVpbGQnLgoiCiIgQm9udXMgOgoiICAgLSBsYXRpbjEgYWNjZW50cyBhcmUgaGFuZGxlZAoiICAgLSBsaXN0cyBhcmUgaGFuZGxlZCwgZXZlbiBvbiBtdWx0aXBsZSBsaW5lcywgeW91IGRvbid0IG5lZWQgdGhlIHZpc3VhbCBtb2RlCiIgICAgICh0aGUgY3Vyc29yIG11c3QgYmUgb24gdGhlIGZpcnN0IGJyYWNrZXQpCiIgICAtIHBhcmVudGhlc2l6ZWQgZXhwcmVzc2lvbnMsIGFycmF5cywgYW5kIHN0cnVjdHVyZXMgKGllLiAnKC4uLiknLCAnW3wuLi58XScsCiIgICAgIGFuZCAney4uLn0nKSBhcmUgaGFuZGxlZCB0aGUgc2FtZSB3YXkKCiAgIiBDb3BpZWQgZnJvbSBTdGVmYW5vJ3Mgb3JpZ2luYWwgcGx1Z2luIDoKICAiIDw8CiAgIiAgICAgIC5hbm5vdCBvY2FtbCBmaWxlIHJlcHJlc2VudGF0aW9uCiAgIgogICIgICAgICBGaWxlIGZvcm1hdCAoY29waWVkIHZlcmJhdGltIGZyb20gY2FtbC10eXBlcy5lbCkKICAiCiAgIiAgICAgIGZpbGUgOjo9IGJsb2NrICoKICAiICAgICAgYmxvY2sgOjo9IHBvc2l0aW9uIDxTUD4gcG9zaXRpb24gPExGPiBhbm5vdGF0aW9uICoKICAiICAgICAgcG9zaXRpb24gOjo9IGZpbGVuYW1lIDxTUD4gbnVtIDxTUD4gbnVtIDxTUD4gbnVtCiAgIiAgICAgIGFubm90YXRpb24gOjo9IGtleXdvcmQgb3Blbi1wYXJlbiA8TEY+IDxTUD4gPFNQPiBkYXRhIDxMRj4gY2xvc2UtcGFyZW4KICAiCiAgIiAgICAgIDxTUD4gaXMgYSBzcGFjZSBjaGFyYWN0ZXIgKEFTQ0lJIDB4MjApCiAgIiAgICAgIDxMRj4gaXMgYSBsaW5lLWZlZWQgY2hhcmFjdGVyIChBU0NJSSAweDBBKQogICIgICAgICBudW0gaXMgYSBzZXF1ZW5jZSBvZiBkZWNpbWFsIGRpZ2l0cwogICIgICAgICBmaWxlbmFtZSBpcyBhIHN0cmluZyB3aXRoIHRoZSBsZXhpY2FsIGNvbnZlbnRpb25zIG9mIE8nQ2FtbAogICIgICAgICBvcGVuLXBhcmVuIGlzIGFuIG9wZW4gcGFyZW50aGVzaXMgKEFTQ0lJIDB4MjgpCiAgIiAgICAgIGNsb3NlLXBhcmVuIGlzIGEgY2xvc2VkIHBhcmVudGhlc2lzIChBU0NJSSAweDI5KQogICIgICAgICBkYXRhIGlzIGFueSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIHdoZXJlIDxMRj4gaXMgYWx3YXlzIGZvbGxvd2VkIGJ5CiAgIiAgICAgICAgICAgYXQgbGVhc3QgdHdvIHNwYWNlIGNoYXJhY3RlcnMuCiAgIgogICIgICAgICAtIGluIGVhY2ggYmxvY2ssIHRoZSB0d28gcG9zaXRpb25zIGFyZSByZXNwZWN0aXZlbHkgdGhlIHN0YXJ0IGFuZCB0aGUKICAiICAgICAgICBlbmQgb2YgdGhlIHJhbmdlIGRlc2NyaWJlZCBieSB0aGUgYmxvY2suCiAgIiAgICAgIC0gaW4gYSBwb3NpdGlvbiwgdGhlIGZpbGVuYW1lIGlzIHRoZSBuYW1lIG9mIHRoZSBmaWxlLCB0aGUgZmlyc3QgbnVtCiAgIiAgICAgICAgaXMgdGhlIGxpbmUgbnVtYmVyLCB0aGUgc2Vjb25kIG51bSBpcyB0aGUgb2Zmc2V0IG9mIHRoZSBiZWdpbm5pbmcKICAiICAgICAgICBvZiB0aGUgbGluZSwgdGhlIHRoaXJkIG51bSBpcyB0aGUgb2Zmc2V0IG9mIHRoZSBwb3NpdGlvbiBpdHNlbGYuCiAgIiAgICAgIC0gdGhlIGNoYXIgbnVtYmVyIHdpdGhpbiB0aGUgbGluZSBpcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB0aGlyZAogICIgICAgICAgIGFuZCBzZWNvbmQgbnVtcy4KICAiCiAgIiAgICAgIEZvciB0aGUgbW9tZW50LCB0aGUgb25seSBwb3NzaWJsZSBrZXl3b3JkIGlzIFwidHlwZVwiLiIKICAiID4+CgoKIiAxLiBGaW5kaW5nIHRoZSBhbm5vdGF0aW9uIGZpbGUgZXZlbiBpZiB3ZSB1c2Ugb2NhbWxidWlsZAoKICAgICIgSW46ICB0d28gc3RyaW5ncyByZXByZXNlbnRpbmcgcGF0aHMKICAgICIgT3V0OiBvbmUgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgY29tbW9uIHByZWZpeCBiZXR3ZWVuIHRoZSB0d28gcGF0aHMKICBmdW5jdGlvbiEgczpGaW5kX2NvbW1vbl9wYXRoIChwMSxwMikKICAgIGxldCB0ZW1wID0gYTpwMgogICAgd2hpbGUgbWF0Y2hzdHIoYTpwMSx0ZW1wKSA9PSAnJwogICAgICBsZXQgdGVtcCA9IHN1YnN0aXR1dGUodGVtcCwnL1teL10qJCcsJycsJycpCiAgICBlbmR3aGlsZQogICAgcmV0dXJuIHRlbXAKICBlbmRmdW4KCiAgICAiIEFmdGVyIGNhbGw6CiAgICAiIC0gYjphbm5vdF9maWxlX3BhdGggOiAKICAgICIgICAgICAgICAgICAgICAgICAgICAgIHBhdGggdG8gdGhlIC5hbm5vdCBmaWxlIGNvcnJlc3BvbmRpbmcgdG8gdGhlCiAgICAiICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UgZmlsZSAoZGVhbGluZyB3aXRoIG9jYW1sYnVpbGQgc3R1ZmYpCiAgICAiIC0gYjpfYnVpbGRfcGF0aDogCiAgICAiICAgICAgICAgICAgICAgICAgICAgICBwYXRoIHRvIHRoZSBidWlsZCBkaXJlY3RvcnkgZXZlbiBpZiB0aGlzIG9uZSBpcwogICAgIiAgICAgICAgICAgICAgICAgICAgICAgbm90IG5hbWVkICdfYnVpbGQnCiAgICAiIC0gYjpzb3VyY2VfZmlsZV9yZWxhdGl2ZV9wYXRoIDoKICAgICIgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aXZlIHBhdGggb2YgdGhlIHNvdXJjZSBmaWxlICppbiogdGhlIGJ1aWxkCiAgICAiICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3RvcnkgOyB0aGlzIGlzIGhvdyBpdCBpcyByZWZmZXJlZCB0byBpbiB0aGUKICAgICIgICAgICAgICAgICAgICAgICAgICAgIC5hbm5vdCBmaWxlCiAgZnVuY3Rpb24hIHM6TG9jYXRlX2Fubm90YXRpb24oKQogICAgaWYgIWI6YW5ub3RhdGlvbl9maWxlX2xvY2F0ZWQKCiAgICAgIHNpbGVudCBleGUgJ2NkJyBzOkZuYW1lZXNjYXBlKGV4cGFuZCgnJTpwOmgnKSkKCiAgICAgIGxldCBhbm5vdF9maWxlX25hbWUgPSBzOkZuYW1lZXNjYXBlKGV4cGFuZCgnJTpyJykpLicuYW5ub3QnCgogICAgICAiIDFzdCBjYXNlIDogdGhlIGFubm90IGZpbGUgaXMgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHRoZSBidWZmZXIgKG5vIG9jYW1sYnVpbGQpCiAgICAgIGxldCBiOmFubm90X2ZpbGVfcGF0aCA9IGZpbmRmaWxlKGFubm90X2ZpbGVfbmFtZSwnLicpCiAgICAgIGlmIGI6YW5ub3RfZmlsZV9wYXRoICE9ICcnCiAgICAgICAgbGV0IGI6YW5ub3RfZmlsZV9wYXRoID0gZ2V0Y3dkKCkuJy8nLmI6YW5ub3RfZmlsZV9wYXRoCiAgICAgICAgbGV0IGI6X2J1aWxkX3BhdGggPSAnJwogICAgICAgIGxldCBiOnNvdXJjZV9maWxlX3JlbGF0aXZlX3BhdGggPSBzOkZuYW1lZXNjYXBlKGV4cGFuZCgnJScpKQogICAgICBlbHNlCiAgICAgICAgIiAybmQgY2FzZSA6IHRoZSBidWZmZXIgYW5kIHRoZSBfYnVpbGQgZGlyZWN0b3J5IGFyZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkKICAgICAgICAiICAgICAgLi4KICAgICAgICAiICAgICAvICBcCiAgICAgICAgIiAgICAvICAgIFwKICAgICAgICAiIF9idWlsZCAgLm1sCiAgICAgICAgIgogICAgICAgIGxldCBiOl9idWlsZF9wYXRoID0gZmluZGRpcignX2J1aWxkJywnLicpCiAgICAgICAgaWYgYjpfYnVpbGRfcGF0aCAhPSAnJwogICAgICAgICAgbGV0IGI6X2J1aWxkX3BhdGggPSBnZXRjd2QoKS4nLycuYjpfYnVpbGRfcGF0aAogICAgICAgICAgbGV0IGI6YW5ub3RfZmlsZV9wYXRoICAgICAgICAgICA9IGZpbmRmaWxlKGFubm90X2ZpbGVfbmFtZSwnX2J1aWxkJykKICAgICAgICAgIGlmIGI6YW5ub3RfZmlsZV9wYXRoICE9ICcnCiAgICAgICAgICAgIGxldCBiOmFubm90X2ZpbGVfcGF0aCA9IGdldGN3ZCgpLicvJy5iOmFubm90X2ZpbGVfcGF0aAogICAgICAgICAgZW5kaWYKICAgICAgICAgIGxldCBiOnNvdXJjZV9maWxlX3JlbGF0aXZlX3BhdGggPSBzOkZuYW1lZXNjYXBlKGV4cGFuZCgnJScpKQogICAgICAgIGVsc2UKICAgICAgICAgICIgM3JkIGNhc2UgOiB0aGUgX2J1aWxkIGRpcmVjdG9yeSBpcyBpbiBhIGRpcmVjdG9yeSBoaWdoZXIgaW4gdGhlIGZpbGUgaGllcmFyY2h5IAogICAgICAgICAgIiAgICAgICAgICAgIChpdCBjYW4ndCBiZSBkZWVwZXIgYnkgb2NhbWxidWlsZCByZXF1aXJlbWVudHMpCiAgICAgICAgICAiICAgICAgLi4KICAgICAgICAgICIgICAgIC8gIFwKICAgICAgICAgICIgICAgLyAgICBcCiAgICAgICAgICAiIF9idWlsZCAgLi4uCiAgICAgICAgICAiICAgICAgICAgICBcCiAgICAgICAgICAiICAgICAgICAgICAgXAogICAgICAgICAgIiAgICAgICAgICAgLm1sCiAgICAgICAgICAiCiAgICAgICAgICBsZXQgYjpfYnVpbGRfcGF0aCA9IGZpbmRkaXIoJ19idWlsZCcsJzsnKQogICAgICAgICAgaWYgYjpfYnVpbGRfcGF0aCAhPSAnJwogICAgICAgICAgICBsZXQgcHJvamVjdF9wYXRoICAgICAgICAgICAgICAgID0gc3Vic3RpdHV0ZShiOl9idWlsZF9wYXRoLCcvX2J1aWxkJCcsJycsJycpCiAgICAgICAgICAgIGxldCBwYXRoX3JlbGF0aXZlX3RvX3Byb2plY3QgICAgPSBzOkZuYW1lZXNjYXBlKHN1YnN0aXR1dGUoZXhwYW5kKCclOnA6aCcpLHByb2plY3RfcGF0aC4nLycsJycsJycpKQogICAgICAgICAgICBsZXQgYjphbm5vdF9maWxlX3BhdGggICAgICAgICAgID0gZmluZGZpbGUoYW5ub3RfZmlsZV9uYW1lLHByb2plY3RfcGF0aC4nL19idWlsZC8nLnBhdGhfcmVsYXRpdmVfdG9fcHJvamVjdCkKICAgICAgICAgICAgbGV0IGI6c291cmNlX2ZpbGVfcmVsYXRpdmVfcGF0aCA9IHM6Rm5hbWVlc2NhcGUoc3Vic3RpdHV0ZShleHBhbmQoJyU6cCcpLHByb2plY3RfcGF0aC4nLycsJycsJycpKQogICAgICAgICAgZWxzZQogICAgICAgICAgICBsZXQgYjphbm5vdF9maWxlX3BhdGggPSBmaW5kZmlsZShhbm5vdF9maWxlX25hbWUsJyoqJykKICAgICAgICAgICAgIjR0aCBjYXNlIDogd2hhdCBpZiB0aGUgdXNlciBkZWNpZGVkIHRvIGNoYW5nZSB0aGUgbmFtZSBvZiB0aGUgX2J1aWxkIGRpcmVjdG9yeSA/CiAgICAgICAgICAgICIgICAgICAgICAgIC0+IHdlIHJlbGF4IHRoZSBjb25zdHJhaW50cywgaXQgc2hvdWxkIHdvcmsgaW4gbW9zdCBjYXNlcwogICAgICAgICAgICBpZiBiOmFubm90X2ZpbGVfcGF0aCAhPSAnJwogICAgICAgICAgICAgICIgNGEuIHdlIHN1cHBvc2UgdGhlIHJlbmFtZWQgX2J1aWxkIGRpcmVjdG9yeSBpcyBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkKICAgICAgICAgICAgICBsZXQgYjpfYnVpbGRfcGF0aCA9IG1hdGNoc3RyKGI6YW5ub3RfZmlsZV9wYXRoLCdeW14vXSonKQogICAgICAgICAgICAgIGlmIGI6YW5ub3RfZmlsZV9wYXRoICE9ICcnCiAgICAgICAgICAgICAgICBsZXQgYjphbm5vdF9maWxlX3BhdGggPSBnZXRjd2QoKS4nLycuYjphbm5vdF9maWxlX3BhdGgKICAgICAgICAgICAgICAgIGxldCBiOl9idWlsZF9wYXRoICAgICA9IGdldGN3ZCgpLicvJy5iOl9idWlsZF9wYXRoCiAgICAgICAgICAgICAgZW5kaWYKICAgICAgICAgICAgICBsZXQgYjpzb3VyY2VfZmlsZV9yZWxhdGl2ZV9wYXRoID0gczpGbmFtZWVzY2FwZShleHBhbmQoJyUnKSkKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICIgNGIuIGFuYXJjaHkgOiB0aGUgcmVuYW1lZCBfYnVpbGQgZGlyZWN0b3J5IG1heSBiZSBoaWdoZXIgaW4gdGhlIGhpZXJhcmNoeQogICAgICAgICAgICAgICIgdGhpcyB3aWxsIHdvcmsgaWYgdGhlIGZpbGUgZm9yIHdoaWNoIHdlIGFyZSBsb29raW5nIGFubm90YXRpb25zIGhhcyBhIHVuaXF1ZSBuYW1lIGluIHRoZSB3aG9sZSBwcm9qZWN0CiAgICAgICAgICAgICAgIiBpZiB0aGlzIGlzIG5vdCB0aGUgY2FzZSwgaXQgbWF5IHN0aWxsIHdvcmssIGJ1dCBubyB3YXJyYW50eSBoZXJlCiAgICAgICAgICAgICAgbGV0IGI6YW5ub3RfZmlsZV9wYXRoID0gZmluZGZpbGUoYW5ub3RfZmlsZV9uYW1lLCcqKjsnKQogICAgICAgICAgICAgIGxldCBwcm9qZWN0X3BhdGggICAgICA9IHM6RmluZF9jb21tb25fcGF0aChiOmFubm90X2ZpbGVfcGF0aCxleHBhbmQoJyU6cDpoJykpCiAgICAgICAgICAgICAgbGV0IGI6X2J1aWxkX3BhdGggICAgICAgPSBtYXRjaHN0cihiOmFubm90X2ZpbGVfcGF0aCxwcm9qZWN0X3BhdGguJy9bXi9dKicpCiAgICAgICAgICAgICAgbGV0IGI6c291cmNlX2ZpbGVfcmVsYXRpdmVfcGF0aCA9IHN1YnN0aXR1dGUoZXhwYW5kKCclOnAnKSxwcm9qZWN0X3BhdGguJy8nLCcnLCcnKQogICAgICAgICAgICBlbmRpZgogICAgICAgICAgZW5kaWYKICAgICAgICBlbmRpZgogICAgICBlbmRpZgoKICAgICAgaWYgYjphbm5vdF9maWxlX3BhdGggPT0gJycKICAgICAgICB0aHJvdyAnRTQ4NDogbm8gYW5ub3RhdGlvbiBmaWxlIGZvdW5kJwogICAgICBlbmRpZgoKICAgICAgc2lsZW50IGV4ZSAnY2QnICctJwoKICAgICAgbGV0IGI6YW5ub3RhdGlvbl9maWxlX2xvY2F0ZWQgPSAxCiAgICBlbmRpZgogIGVuZGZ1bgoKICAiIFRoaXMgaW4gb3JkZXIgdG8gbG9jYXRlIHRoZSAuYW5ub3QgZmlsZSBvbmx5IG9uY2UKICBsZXQgYjphbm5vdGF0aW9uX2ZpbGVfbG9jYXRlZCA9IDAKCiIgMi4gRmluZGluZyB0aGUgdHlwZSBpbmZvcm1hdGlvbiBpbiB0aGUgYW5ub3RhdGlvbiBmaWxlCiAgCiAgIiBhLiBUaGUgYW5ub3RhdGlvbiBmaWxlIGlzIG9wZW5lZCBpbiB2aW0gYXMgYSBidWZmZXIgdGhhdAogICIgc2hvdWxkIGJlIChhbG1vc3QpIGludmlzaWJsZSB0byB0aGUgdXNlci4KCiAgICAgICIgQWZ0ZXIgY2FsbDoKICAgICAgIiBUaGUgY3VycmVudCBidWZmZXIgaXMgbm93IHRoZSBvbmUgY29udGFpbmluZyB0aGUgLmFubm90IGZpbGUuCiAgICAgICIgV2UgbWFuYWdlIHRvIGtlZXAgYWxsIHRoaXMgaGlkZGVuIHRvIHRoZSB1c2VyJ3MgZXllLgogICAgZnVuY3Rpb24hIHM6RW50ZXJfYW5ub3RhdGlvbl9idWZmZXIoKQogICAgICBsZXQgczpjdXJyZW50X3BvcyA9IGdldHBvcygnLicpCiAgICAgIGxldCBzOmN1cnJlbnRfaGlkZGVuID0gJmw6aGlkZGVuCiAgICAgIHNldCBoaWRkZW4KICAgICAgbGV0IHM6Y3VycmVudF9idWYgPSBidWZuYW1lKCclJykKICAgICAgaWYgYnVmbG9hZGVkKGI6YW5ub3RfZmlsZV9wYXRoKQogICAgICAgIHNpbGVudCBleGUgJ2tlZXBqIGtlZXBhbHQnICdidWZmZXInIHM6Rm5hbWVlc2NhcGUoYjphbm5vdF9maWxlX3BhdGgpCiAgICAgIGVsc2UKICAgICAgICBzaWxlbnQgZXhlICdrZWVwaiBrZWVwYWx0JyAndmlldycgczpGbmFtZWVzY2FwZShiOmFubm90X2ZpbGVfcGF0aCkKICAgICAgZW5kaWYKICAgIGVuZGZ1bgoKICAgICAgIiBBZnRlciBjYWxsOgogICAgICAiICAgVGhlIG9yaWdpbmFsIGJ1ZmZlciBoYXMgYmVlbiByZXN0b3JlZCBpbiB0aGUgZXhhY3Qgc2FtZSBzdGF0ZSBhcyBiZWZvcmUuCiAgICBmdW5jdGlvbiEgczpFeGl0X2Fubm90YXRpb25fYnVmZmVyKCkKICAgICAgc2lsZW50IGV4ZSAna2VlcGoga2VlcGFsdCcgJ2J1ZmZlcicgczpGbmFtZWVzY2FwZShzOmN1cnJlbnRfYnVmKQogICAgICBsZXQgJmw6aGlkZGVuID0gczpjdXJyZW50X2hpZGRlbgogICAgICBjYWxsIHNldHBvcygnLicsczpjdXJyZW50X3BvcykKICAgIGVuZGZ1bgoKICAgICAgIiBBZnRlciBjYWxsOgogICAgICAiICAgVGhlIGFubm90IGZpbGUgaXMgbG9hZGVkIGFuZCBhc3NpZ25lZCB0byBhIGJ1ZmZlci4KICAgICAgIiAgIFRoaXMgYWxzbyBoYW5kbGVzIHRoZSBtb2RpZmljYXRpb24gZGF0ZSBvZiB0aGUgLmFubm90IGZpbGUsIGVnLiBhZnRlciBhIAogICAgICAiICAgY29tcGlsYXRpb24uCiAgICBmdW5jdGlvbiEgczpMb2FkX2Fubm90YXRpb24oKQogICAgICBpZiBidWZsb2FkZWQoYjphbm5vdF9maWxlX3BhdGgpICYmIGI6YW5ub3RfZmlsZV9sYXN0X21vZCA8IGdldGZ0aW1lKGI6YW5ub3RfZmlsZV9wYXRoKQogICAgICAgIGNhbGwgczpFbnRlcl9hbm5vdGF0aW9uX2J1ZmZlcigpCiAgICAgICAgc2lsZW50IGV4ZSAiYnVubG9hZCIKICAgICAgICBjYWxsIHM6RXhpdF9hbm5vdGF0aW9uX2J1ZmZlcigpCiAgICAgIGVuZGlmCiAgICAgIGlmICFidWZsb2FkZWQoYjphbm5vdF9maWxlX3BhdGgpCiAgICAgICAgY2FsbCBzOkVudGVyX2Fubm90YXRpb25fYnVmZmVyKCkKICAgICAgICBzZXRsb2NhbCBub2J1Zmxpc3RlZAogICAgICAgIHNldGxvY2FsIGJ1ZmhpZGRlbj1oaWRlCiAgICAgICAgc2V0bG9jYWwgbm9zd2FwZmlsZQogICAgICAgIHNldGxvY2FsIGJ1ZnR5cGU9bm93cml0ZQogICAgICAgIGNhbGwgczpFeGl0X2Fubm90YXRpb25fYnVmZmVyKCkKICAgICAgICBsZXQgYjphbm5vdF9maWxlX2xhc3RfbW9kID0gZ2V0ZnRpbWUoYjphbm5vdF9maWxlX3BhdGgpCiAgICAgIGVuZGlmCiAgICBlbmRmdW4KICAKICAiYi4gJ3NlYXJjaCcgYW5kICdtYXRjaCcgd29yayB0byBmaW5kIHRoZSB0eXBlIGluZm9ybWF0aW9uCiAgIAogICAgICAiSW46ICAtIGxpbjEsY29sMTogcG9zdGlvbiBvZiBleHByZXNzaW9uIGZpcnN0IGNoYXIKICAgICAgIiAgICAgLSBsaW4yLGNvbDI6IHBvc3Rpb24gb2YgZXhwcmVzc2lvbiBsYXN0IGNoYXIKICAgICAgIk91dDogLSB0aGUgcGF0dGVybiB0byBiZSBsb29rZWQgZm9yIHRvIGZpbmQgdGhlIGJsb2NrCiAgICAgICIgTXVzdCBiZSBjYWxsZWQgaW4gdGhlIHNvdXJjZSBidWZmZXIgKHVzZSBvZiBsaW5lMmJ5dGUpCiAgICBmdW5jdGlvbiEgczpCbG9ja19wYXR0ZXJuKGxpbjEsbGluMixjb2wxLGNvbDIpCiAgICAgIGxldCBzdGFydF9udW0xID0gYTpsaW4xCiAgICAgIGxldCBzdGFydF9udW0yID0gbGluZTJieXRlKGE6bGluMSkgLSAxCiAgICAgIGxldCBzdGFydF9udW0zID0gc3RhcnRfbnVtMiArIGE6Y29sMQogICAgICBsZXQgc3RhcnRfcG9zICA9ICciJy5iOnNvdXJjZV9maWxlX3JlbGF0aXZlX3BhdGguJyIgJy5zdGFydF9udW0xLicgJy5zdGFydF9udW0yLicgJy5zdGFydF9udW0zCiAgICAgIGxldCBlbmRfbnVtMSAgID0gYTpsaW4yCiAgICAgIGxldCBlbmRfbnVtMiAgID0gbGluZTJieXRlKGE6bGluMikgLSAxCiAgICAgIGxldCBlbmRfbnVtMyAgID0gZW5kX251bTIgKyBhOmNvbDIKICAgICAgbGV0IGVuZF9wb3MgICAgPSAnIicuYjpzb3VyY2VfZmlsZV9yZWxhdGl2ZV9wYXRoLiciICcuZW5kX251bTEuJyAnLmVuZF9udW0yLicgJy5lbmRfbnVtMwogICAgICByZXR1cm4gJ14nLnN0YXJ0X3Bvcy4nICcuZW5kX3Bvcy4iJCIKICAgICAgIiBycTogdGhlICdeJyBoZXJlIGlzIG5vdCB0b3RhbGx5IGNvcnJlY3QgcmVnYXJkaW5nIHRoZSBhbm5vdCBmaWxlICJncmFtbWFyIgogICAgICAiIGJ1dCBjdXJyZW50bHkgdGhlIGFubm90YXRpb24gZmlsZSByZXNwZWN0cyB0aGlzLCBhbmQgaXQncyBhIGxpdHRsZSBiaXQgZmFzdGVyIHdpdGggdGhlICdeJzsKICAgICAgIiBjYW4gYmUgcmVtb3ZlZCBzYWZlbHkuCiAgICBlbmRmdW4KCiAgICAgICJJbjogKHRoZSBjdXJzb3IgcG9zaXRpb24gc2hvdWxkIGJlIGF0IHRoZSBzdGFydCBvZiBhbiBhbm5vdGF0aW9uKQogICAgICAiT3V0OiB0aGUgdHlwZSBpbmZvcm1hdGlvbgogICAgICAiIE11c3QgYmUgY2FsbGVkIGluIHRoZSBhbm5vdGF0aW9uIGJ1ZmZlciAodXNlIG9mIHNlYXJjaCkKICAgIGZ1bmN0aW9uISBzOk1hdGNoX2RhdGEoKQogICAgICAiIHJxOiBpZGVtIGFzIHByZXZpb3VzbHksIGluIHRoZSBmb2xsb3dpbmcsIHRoZSAnXicgYXQgc3RhcnQgb2YgcGF0dGVybnMgaXMgbm90IG5lY2Vzc2FyeQogICAgICBrZWVwaiB3aGlsZSBzZWFyY2goJ150eXBlKCQnLCdjZScsbGluZSgiLiIpKSA9PSAwCiAgICAgICAga2VlcGogaWYgc2VhcmNoKCdeLlx7LX0oJCcsJ2UnKSA9PSAwCiAgICAgICAgICB0aHJvdyAibm9fYW5ub3RhdGlvbiIKICAgICAgICBlbmRpZgogICAgICAgIGtlZXBqIGlmIHNlYXJjaHBhaXIoJygnLCcnLCcpJykgPT0gMAogICAgICAgICAgdGhyb3cgIm1hbGZvcm1lZF9hbm5vdF9maWxlIgogICAgICAgIGVuZGlmCiAgICAgIGVuZHdoaWxlCiAgICAgIGxldCBiZWdpbiA9IGxpbmUoIi4iKSArIDEKICAgICAga2VlcGogaWYgc2VhcmNocGFpcignKCcsJycsJyknKSA9PSAwCiAgICAgICAgdGhyb3cgIm1hbGZvcm1lZF9hbm5vdF9maWxlIgogICAgICBlbmRpZgogICAgICBsZXQgZW5kID0gbGluZSgiLiIpIC0gMQogICAgICByZXR1cm4gam9pbihnZXRsaW5lKGJlZ2luLGVuZCksIlxuIikKICAgIGVuZGZ1bgogICAgICAgIAogICAgICAiSW46ICB0aGUgcGF0dGVybiB0byBsb29rIGZvciBpbiBvcmRlciB0byBtYXRjaCB0aGUgYmxvY2sKICAgICAgIk91dDogdGhlIHR5cGUgaW5mb3JtYXRpb24gKGNhbGxzIHM6TWF0Y2hfZGF0YSkKICAgICAgIiBTaG91bGQgYmUgY2FsbGVkIGluIHRoZSBhbm5vdGF0aW9uIGJ1ZmZlcgogICAgZnVuY3Rpb24hIHM6RXh0cmFjdF90eXBlX2RhdGEoYmxvY2tfcGF0dGVybikKICAgICAgY2FsbCBzOkVudGVyX2Fubm90YXRpb25fYnVmZmVyKCkKICAgICAgdHJ5CiAgICAgICAgaWYgc2VhcmNoKGE6YmxvY2tfcGF0dGVybiwnZScpID09IDAKICAgICAgICAgIHRocm93ICJub19hbm5vdGF0aW9uIgogICAgICAgIGVuZGlmCiAgICAgICAgY2FsbCBjdXJzb3IobGluZSgiLiIpICsgMSwxKQogICAgICAgIGxldCBhbm5vdGF0aW9uID0gczpNYXRjaF9kYXRhKCkKICAgICAgZmluYWxseQogICAgICAgIGNhbGwgczpFeGl0X2Fubm90YXRpb25fYnVmZmVyKCkKICAgICAgZW5kdHJ5CiAgICAgIHJldHVybiBhbm5vdGF0aW9uCiAgICBlbmRmdW4KICAKICAiYy4gbGluayB0aGlzIHN0dWZmIHdpdGggd2hhdCB0aGUgdXNlciB3YW50cwogICIgaWUuIGdldCB0aGUgZXhwcmVzc2lvbiBzZWxlY3RlZC91bmRlciB0aGUgY3Vyc29yCiAgICAKICAgIGxldCBzOm9jYW1sX3dvcmRfY2hhciA9ICdcd3xbwC3/XXwnJycKCiAgICAgICJJbjogIHRoZSBjdXJyZW50IG1vZGUgKGVnLiAidmlzdWFsIiwgIm5vcm1hbCIsIGV0Yy4pCiAgICAgICJPdXQ6IHRoZSBib3JkZXJzIG9mIHRoZSBleHByZXNzaW9uIHdlIGFyZSBsb29raW5nIGZvciB0aGUgdHlwZQogICAgZnVuY3Rpb24hIHM6TWF0Y2hfYm9yZGVycyhtb2RlKQogICAgICBpZiBhOm1vZGUgPT0gInZpc3VhbCIKICAgICAgICBsZXQgY3VyID0gZ2V0cG9zKCIuIikKICAgICAgICBub3JtYWwgYDwKICAgICAgICBsZXQgY29sMSA9IGNvbCgiLiIpCiAgICAgICAgbGV0IGxpbjEgPSBsaW5lKCIuIikKICAgICAgICBub3JtYWwgYD4KICAgICAgICBsZXQgY29sMiA9IGNvbCgiLiIpCiAgICAgICAgbGV0IGxpbjIgPSBsaW5lKCIuIikKICAgICAgICBjYWxsIGN1cnNvcihjdXJbMV0sY3VyWzJdKQogICAgICAgIHJldHVybiBbbGluMSxsaW4yLGNvbDEtMSxjb2wyXQogICAgICBlbHNlCiAgICAgICAgbGV0IGN1cnNvcl9saW5lID0gbGluZSgiLiIpCiAgICAgICAgbGV0IGN1cnNvcl9jb2wgID0gY29sKCIuIikKICAgICAgICBsZXQgbGluZSA9IGdldGxpbmUoJy4nKQogICAgICAgIGlmIGxpbmVbY3Vyc29yX2NvbC0xOmN1cnNvcl9jb2xdID09ICdbfCcKICAgICAgICAgIGxldCBbbGluMixjb2wyXSA9IHNlYXJjaHBhaXJwb3MoJ1xbfCcsJycsJ3xcXScsJ24nKQogICAgICAgICAgcmV0dXJuIFtjdXJzb3JfbGluZSxsaW4yLGN1cnNvcl9jb2wtMSxjb2wyKzFdCiAgICAgICAgZWxzZWlmICAgICBsaW5lW2N1cnNvcl9jb2wtMV0gPT0gJ1snCiAgICAgICAgICBsZXQgW2xpbjIsY29sMl0gPSBzZWFyY2hwYWlycG9zKCdcWycsJycsJ1xdJywnbicpCiAgICAgICAgICByZXR1cm4gW2N1cnNvcl9saW5lLGxpbjIsY3Vyc29yX2NvbC0xLGNvbDJdCiAgICAgICAgZWxzZWlmIGxpbmVbY3Vyc29yX2NvbC0xXSA9PSAnKCcKICAgICAgICAgIGxldCBbbGluMixjb2wyXSA9IHNlYXJjaHBhaXJwb3MoJygnLCcnLCcpJywnbicpCiAgICAgICAgICByZXR1cm4gW2N1cnNvcl9saW5lLGxpbjIsY3Vyc29yX2NvbC0xLGNvbDJdCiAgICAgICAgZWxzZWlmIGxpbmVbY3Vyc29yX2NvbC0xXSA9PSAneycKICAgICAgICAgIGxldCBbbGluMixjb2wyXSA9IHNlYXJjaHBhaXJwb3MoJ3snLCcnLCd9JywnbicpCiAgICAgICAgICByZXR1cm4gW2N1cnNvcl9saW5lLGxpbjIsY3Vyc29yX2NvbC0xLGNvbDJdCiAgICAgICAgZWxzZQogICAgICAgICAgbGV0IFtsaW4xLGNvbDFdID0gc2VhcmNocG9zKCdcdiUoJy5zOm9jYW1sX3dvcmRfY2hhci4nfFwuKSonLCduY2InKQogICAgICAgICAgbGV0IFtsaW4yLGNvbDJdID0gc2VhcmNocG9zKCdcdiUoJy5zOm9jYW1sX3dvcmRfY2hhci4nfFwuKSonLCduY2UnKQogICAgICAgICAgaWYgY29sMSA9PSAwIHx8IGNvbDIgPT0gMAogICAgICAgICAgICB0aHJvdyAibm9fZXhwcmVzc2lvbiIKICAgICAgICAgIGVuZGlmCiAgICAgICAgICByZXR1cm4gW2N1cnNvcl9saW5lLGN1cnNvcl9saW5lLGNvbDEtMSxjb2wyXQogICAgICAgIGVuZGlmCiAgICAgIGVuZGlmCiAgICBlbmRmdW4KCiAgICAgICJJbjogIHRoZSBjdXJyZW50IG1vZGUgKGVnLiAidmlzdWFsIiwgIm5vcm1hbCIsIGV0Yy4pCiAgICAgICJPdXQ6IHRoZSB0eXBlIGluZm9ybWF0aW9uIChjYWxscyBzOkV4dHJhY3RfdHlwZV9kYXRhKQogICAgZnVuY3Rpb24hIHM6R2V0X3R5cGUobW9kZSkKICAgICAgbGV0IFtsaW4xLGxpbjIsY29sMSxjb2wyXSA9IHM6TWF0Y2hfYm9yZGVycyhhOm1vZGUpCiAgICAgIHJldHVybiBzOkV4dHJhY3RfdHlwZV9kYXRhKHM6QmxvY2tfcGF0dGVybihsaW4xLGxpbjIsY29sMSxjb2wyKSkKICAgIGVuZGZ1bgogIAogICJkLiBtYWluCiAgICAgICJJbjogICAgICAgICB0aGUgY3VycmVudCBtb2RlIChlZy4gInZpc3VhbCIsICJub3JtYWwiLCBldGMuKQogICAgICAiQWZ0ZXIgY2FsbDogdGhlIHR5cGUgaW5mb3JtYXRpb24gaXMgZGlzcGxheWVkCiAgICBpZiAhZXhpc3RzKCIqT2NhbWxfZ2V0X3R5cGUiKQogICAgICBmdW5jdGlvbiBPY2FtbF9nZXRfdHlwZShtb2RlKQogICAgICAgIGNhbGwgczpMb2NhdGVfYW5ub3RhdGlvbigpCiAgICAgICAgY2FsbCBzOkxvYWRfYW5ub3RhdGlvbigpCiAgICAgICAgcmV0dXJuIHM6R2V0X3R5cGUoYTptb2RlKQogICAgICBlbmRmdW4KICAgIGVuZGlmCgogICAgaWYgIWV4aXN0cygiKk9jYW1sX2dldF90eXBlX29yX25vdCIpCiAgICAgIGZ1bmN0aW9uIE9jYW1sX2dldF90eXBlX29yX25vdChtb2RlKQogICAgICAgIGxldCB0PXJlbHRpbWUoKQogICAgICAgIHRyeQogICAgICAgICAgcmV0dXJuIE9jYW1sX2dldF90eXBlKGE6bW9kZSkKICAgICAgICBjYXRjaAogICAgICAgICAgcmV0dXJuICIiCiAgICAgICAgZW5kdHJ5CiAgICAgIGVuZGZ1bgogICAgZW5kaWYKCiAgICBpZiAhZXhpc3RzKCIqT2NhbWxfcHJpbnRfdHlwZSIpCiAgICAgIGZ1bmN0aW9uIE9jYW1sX3ByaW50X3R5cGUobW9kZSkKICAgICAgICBpZiBleHBhbmQoIiU6ZSIpID09ICJtbGkiCiAgICAgICAgICBlY2hvaGwgRXJyb3JNc2cgfCBlY2hvICJObyBhbm5vdGF0aW9ucyBmb3IgaW50ZXJmYWNlICgubWxpKSBmaWxlcyIgfCBlY2hvaGwgTm9uZQogICAgICAgICAgcmV0dXJuCiAgICAgICAgZW5kaWYKICAgICAgICB0cnkKICAgICAgICAgIGVjaG8gT2NhbWxfZ2V0X3R5cGUoYTptb2RlKQogICAgICAgIGNhdGNoIC9FNDg0Oi8KICAgICAgICAgIGVjaG9obCBFcnJvck1zZyB8IGVjaG8gIk5vIHR5cGUgYW5ub3RhdGlvbnMgKC5hbm5vdCkgZmlsZSBmb3VuZCIgfCBlY2hvaGwgTm9uZQogICAgICAgIGNhdGNoIC9ub19leHByZXNzaW9uLwogICAgICAgICAgZWNob2hsIEVycm9yTXNnIHwgZWNobyAiTm8gZXhwcmVzc2lvbiBmb3VuZCB1bmRlciB0aGUgY3Vyc29yIiB8IGVjaG9obCBOb25lCiAgICAgICAgY2F0Y2ggL25vX2Fubm90YXRpb24vCiAgICAgICAgICBlY2hvaGwgRXJyb3JNc2cgfCBlY2hvICJObyB0eXBlIGFubm90YXRpb24gZm91bmQgZm9yIHRoZSBnaXZlbiB0ZXh0IiB8IGVjaG9obCBOb25lCiAgICAgICAgY2F0Y2ggL21hbGZvcm1lZF9hbm5vdF9maWxlLwogICAgICAgICAgZWNob2hsIEVycm9yTXNnIHwgZWNobyAiTWFsZm9ybWVkIC5hbm5vdCBmaWxlIiB8IGVjaG9obCBOb25lCiAgICAgICAgZW5kdHJ5CiAgICAgIGVuZGZ1bgogICAgZW5kaWYKCiIgTWFwcwogIG1hcCAgPHNpbGVudD4gPExvY2FsTGVhZGVyPnQgOmNhbGwgT2NhbWxfcHJpbnRfdHlwZSgibm9ybWFsIik8Q1I+CiAgdm1hcCA8c2lsZW50PiA8TG9jYWxMZWFkZXI+dCA6PEMtVT5jYWxsIE9jYW1sX3ByaW50X3R5cGUoInZpc3VhbCIpPENSPmA8CgpsZXQgJmNwb3B0aW9ucz1zOmNwb3NldAp1bmxldCBzOmNwb3NldAoKIiB2aW06c3c9MiBmZG09aW5kZW50Cg==