IyEvYmluL2Jhc2gKIyBXSU5FIEluc3RhbGxhdGlvbiBzY3JpcHQKIyBDYW4gZG8gYWxtb3N0IGV2ZXJ5dGhpbmcgZnJvbSBjb21waWxpbmcgdG8gY29uZmlndXJpbmcuLi4KIwojIENvcHlyaWdodCAxOTk5IE92ZSBL5XZlbgojCiMgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgojIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKIyB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKIyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBCiMKCiMtLS0gZGVmYXVsdHMgKGNoYW5nZSB0aGVzZSBpZiB5b3UgYXJlIGEgcGFja2FnZXIpCkNPTkZBUkdTPSIiICAgICAgICAgICAgICAgICAgICMgY29uZmlndXJlIGFyZ3MsIGUuZy4gLS1wcmVmaXg9L3VzcgpwcmVmaXg9L3Vzci9sb2NhbCAgICAgICAgICAgICAjIGluc3RhbGxhdGlvbiBwcmVmaXgKYmluZGlyPSRwcmVmaXgvYmluICAgICAgICAgICAgIyB3aGVyZSB3aW5lbGliIGFwcHMgd2lsbCBiZSAob3IgYXJlKSBpbnN0YWxsZWQKbGliZGlyPSRwcmVmaXgvbGliICAgICAgICAgICAgIyB3aGVyZSBsaWJ3aW5lLnNvIHdpbGwgYmUgKG9yIGlzKSBpbnN0YWxsZWQKQklORElTVD1ubyAgICAgICAgICAgICAgICAgICAgIyB3aGV0aGVyIGNhbGxlZCBmcm9tIGEgYmluYXJ5IHBhY2thZ2UgY29uZmlnIHNjcmlwdAoKIyBmdW5jdGlvbnMKCmZ1bmN0aW9uIHN0ZF9zbGVlcCB7CiAgc2xlZXAgMQp9CgpmdW5jdGlvbiBjb25mX3F1ZXN0aW9uIHsKICAjIHBhcmFtZXRlcnM6ICQxID0gaW1wb3J0YW5jZSwgJDIgPSBxdWVzdGlvbi1pZCwgJDMrID0gbWVzc2FnZSBsaW5lcwogICMgdGhlIGZpcnN0IHR3byBwYXJhbWV0ZXJzIGNhbiBiZSB1c2VkIGJ5IGUuZy4gZGViY29uZiBpbiBkZWJpYW4gcGFja2FnZXMKICAjIGJ1dCBoZXJlIHdlIGp1c3QgcHJpbnQgdGhlIG1lc3NhZ2UKICBzaGlmdCAyCiAgZWNobwogIGxvY2FsIExJTkU9IiQxIgogIHdoaWxlIFsgJCMgLWd0IDAgXSAmJiBzaGlmdAogIGRvIHsKICAgIGVjaG8gIiRMSU5FIgogICAgTElORT0iJDEiCiAgfQogIGRvbmUKfQoKZnVuY3Rpb24gY29uZl9yZXNldF9xdWVzdGlvbiB7CiAgIyBwYXJhbWV0ZXJzOiAkMSA9IHF1ZXN0aW9uLWlkCiAgIyB0aGlzIGlzIHVzZWQgdG8gZmx1c2ggYW55IGNhY2hlZCBhbnN3ZXJzIGFuZCAiYWxyZWFkeS1kaXNwbGF5ZWQiIGZsYWdzCiAgc2hpZnQgIyBkdW1teSBjb21tYW5kCn0KCmZ1bmN0aW9uIGNvbmZfeWVzbm9fYW5zd2VyIHsKICB1bnNldCBBTlNXRVIKICB3aGlsZSBbICIkQU5TV0VSIiAhPSAneWVzJyBdICYmIFsgIiRBTlNXRVIiICE9ICdubycgXQogIGRvIHsKICAgIGVjaG8gLW4gIiQxIgogICAgcmVhZCBBTlNXRVIKICB9CiAgZG9uZQp9CgpmdW5jdGlvbiBjb25mX3N0cmluZ19hbnN3ZXIgewogIGVjaG8gLW4gIiQxIgogIHJlYWQgQU5TV0VSCn0KCiMgc3RhcnR1cC4uLgoKZWNobyAiV0lORSBJbnN0YWxsZXIgdjAuNzUiCmVjaG8KCmlmIFsgIiRCSU5ESVNUIiA9ICdubycgXQp0aGVuIHsKCiAgaWYgISBbIC1mIGNvbmZpZ3VyZSBdCiAgdGhlbiB7CiAgICBpZiBbIC1mIC4uL2NvbmZpZ3VyZSBdCiAgICB0aGVuIHsKICAgICAgcHVzaGQgLi4KICAgIH0KICAgIGVsc2UgewogICAgICBlY2hvICJZb3UncmUgcnVubmluZyB0aGlzIGZyb20gdGhlIHdyb25nIGRpcmVjdG9yeS4iCiAgICAgIGVjaG8gIkNoYW5nZSB0byB0aGUgV2luZSBzb3VyY2UncyBtYWluIGRpcmVjdG9yeSBhbmQgdHJ5IGFnYWluLiIKICAgICAgZXhpdCAxCiAgICB9CiAgICBmaQogIH0KICBmaQoKICBpZiBbIGB3aG9hbWlgID0gJ3Jvb3QnIF0KICB0aGVuIHsKICAgIGVjaG8gIllvdSBhcmUgcnVubmluZyB3aW5laW5zdGFsbCBhcyByb290LCB0aGlzIGlzIG5vdCBhZHZpc2FibGUuIFBsZWFzZSByZXJ1biBhcyBhIHVzZXIuIgogICAgZWNobyAiQWJvcnRpbmcuIgogICAgZXhpdCAxCiAgfQogIGZpCgogIGlmIFsgISAtdyAuIF0KICB0aGVuIHsKICAgIGVjaG8gIlRoZSBzb3VyY2UgZGlyZWN0b3J5IGlzIG5vdCB3cml0YWJsZS4gWW91IHByb2JhYmx5IGV4dHJhY3RlZCB0aGUgc291cmNlcyBhcyByb290LiIKICAgIGVjaG8gIllvdSBzaG91bGQgcmVtb3ZlIHRoZSBzb3VyY2UgdHJlZSBhbmQgZXh0cmFjdCBpdCBhZ2FpbiBhcyBhIG5vcm1hbCB1c2VyLiIKICAgIGV4aXQgMQogIH0KICBmaQoKICAjIGNoZWNrIHdoZXRoZXIgUlBNIGluc3RhbGxlZCwgYW5kIGlmIGl0IGlzLCByZW1vdmUgYW55IG9sZCB3aW5lIHJwbS4KICBoYXNoIHJwbSAmPi9kZXYvbnVsbAogIFJFVD0kPwogIGlmIFsgJFJFVCAtZXEgMCBdOyB0aGVuCiAgICBpZiBbIC1uICJgcnBtIC1xaSB3aW5lIDI+L2Rldi9udWxsfGdyZXAgIl5OYW1lImAiIF07IHRoZW4KICAgICAgZWNobyAiV2FybmluZzogT2xkIFdpbmUgUlBNIGluc3RhbGwgZGV0ZWN0ZWQuIERvIHlvdSB3YW50IHRvIHJlbW92ZSBpdCBmaXJzdD8iCiAgICAgIGNvbmZfeWVzbm9fYW5zd2VyICIoeWVzL25vKSAiCiAgICAgIGlmIFsgIiRBTlNXRVIiID0gJ3llcycgXTsgdGhlbgogICAgICAgIGVjaG8gIldlIG5lZWQgdG8gcmVtb3ZlIHRoZSBycG0gYXMgcm9vdCwgcGxlYXNlIGVudGVyIHlvdXIgcm9vdCBwYXNzd29yZCIKICAgICAgICBlY2hvCiAgICAgICAgZWNobyBTdGFydGluZyB3aW5lIHJwbSByZW1vdmFsLi4uCiAgICAgICAgc3UgLWMgInJwbSAtZSB3aW5lOyBSRVQ9JD8iCiAgICAgICAgaWYgWyAkUkVUIC1lcSAwIF07IHRoZW4KICAgICAgICAgIGVjaG8gRG9uZS4KICAgICAgICBlbHNlCiAgICAgICAgICBlY2hvICJGQUlMRUQuIFByb2JhYmx5IHlvdSBhcmVuJ3QgaW5zdGFsbGluZyBhcyByb290LiIKICAgICAgICAgIGVjaG8gIkV4cGVjdCBwcm9ibGVtcyAobGlicmFyeSBjb25mbGljdHMgd2l0aCBleGlzdGluZyBpbnN0YWxsIGV0Yy4pLiIKICAgICAgICBmaQogICAgICBlbHNlCiAgICAgICAgZWNobyAiU29ycnksIEkgd29uJ3QgaW5zdGFsbCBXaW5lIHdoZW4gYW4gcnBtIHZlcnNpb24gaXMgc3RpbGwgaW5zdGFsbGVkLiIKICAgICAgICBlY2hvICIoV2luZSBzdXBwb3J0IHN1ZmZlcmVkIGZyb20gd2F5IHRvbyBtYW55IGNvbmZsaWN0cyBiZXR3ZWVuIFJQTSIKICAgICAgICBlY2hvICJhbmQgc291cmNlIGluc3RhbGxzKSIKICAgICAgICBlY2hvICJIYXZlIGEgbmljZSBkYXkgISIKICAgICAgICBleGl0IDEKICAgICAgZmkKICAgIGZpCiAgZmkKCiAgIyBjaGVjayB3aGV0aGVyIHdpbmUgYmluYXJ5IHN0aWxsIGF2YWlsYWJsZQogIGlmIFsgLW4gImB3aGljaCB3aW5lIDI+L2Rldi9udWxsfGdyZXAgJy93aW5lJ2AiIF07IHRoZW4KICAgIGVjaG8gIldhcm5pbmcgISEgd2luZSBiaW5hcnkgKHN0aWxsKSBmb3VuZCwgd2hpY2ggbWF5IGluZGljYXRlIgogICAgZWNobyAiYSAoY29uZmxpY3RpbmcpIHByZXZpb3VzIGluc3RhbGxhdGlvbi4iCiAgICBlY2hvICJZb3UgbWlnaHQgd2FudCB0byBhYm9ydCBhbmQgdW5pbnN0YWxsIFdpbmUgZmlyc3QuIgogICAgZWNobyAiKElmIHlvdSBwcmV2aW91c2x5IHRyaWVkIHRvIGluc3RhbGwgZnJvbSBzb3VyY2UgbWFudWFsbHksICIKICAgIGVjaG8gInJ1biAnbWFrZSB1bmluc3RhbGwnIGZyb20gdGhlIHdpbmUgcm9vdCBkaXJlY3RvcnkpIgogICAgc3RkX3NsZWVwCiAgZmkKCiAgIyBydW4gdGhlIGNvbmZpZ3VyZSBzY3JpcHQsIGlmIG5lY2Vzc2FyeQoKICBpZiBbIC1mIGNvbmZpZy5jYWNoZSBdICYmIFsgLWYgTWFrZWZpbGUgXSAmJiBbIE1ha2VmaWxlIC1udCBjb25maWd1cmUgXQogIHRoZW4gewogICAgZWNobwogICAgZWNobyAiSSBzZWUgdGhhdCBXSU5FIGhhcyBhbHJlYWR5IGJlZW4gY29uZmlndXJlZCwgc28gSSdsbCBza2lwIHRoYXQuIgogICAgc3RkX3NsZWVwCiAgICAjIGxvYWQgY29uZmlndXJlIHJlc3VsdHMKICAgIC4gLi9jb25maWcuY2FjaGUKICB9CiAgZWxzZSB7CiAgICBlY2hvICJSdW5uaW5nIGNvbmZpZ3VyZS4uLiIKICAgIGVjaG8KICAgIGlmICEgLi9jb25maWd1cmUgLUMgJENPTkZBUkdTIC0tcHJlZml4PSRwcmVmaXgKICAgIHRoZW4gewogICAgICBlY2hvCiAgICAgIGVjaG8gIkNvbmZpZ3VyZSBmYWlsZWQsIGFib3J0aW5nIGluc3RhbGwuIgogICAgICBybSAtZiBjb25maWcuY2FjaGUKICAgICAgZXhpdCAxCiAgICB9CiAgICBmaQogICAgIyBsb2FkIGNvbmZpZ3VyZSByZXN1bHRzCiAgICAuIC4vY29uZmlnLmNhY2hlCiAgICAjIG1ha2Ugc3VyZSBYIHdhcyBmb3VuZAogICAgZXZhbCAiJGFjX2N2X2hhdmVfeCIKICAgIGlmIFsgIiRoYXZlX3giICE9ICJ5ZXMiIF0KICAgIHRoZW4gewogICAgICBlY2hvICJJbnN0YWxsIHRoZSBYIGRldmVsb3BtZW50IGhlYWRlcnMgYW5kIHRyeSBhZ2Fpbi4iCiAgICAgIHJtIC1mIGNvbmZpZy5jYWNoZQogICAgICBleGl0IDEKICAgIH0KICAgIGZpCiAgfQogIGZpCgogICMgbm93IGRvIHRoZSBjb21waWxhdGlvbiBhbmQgaW5zdGFsbCwgd2UgbmVlZCB0byBhbHdheXMgZG8gdGhpcyBiZWNhdXNlIHdlCiAgIyBkb24ndCB3YW50IHRoZSAnbWFrZSBpbnN0YWxsJyBjb21tYW5kIHdlIG1pZ2h0IHJ1biB0byBydW4gJ21ha2UnIGFzIHJvb3QKICBpZiBbIGB3aG9hbWlgICE9ICdyb290JyBdCiAgdGhlbiB7CiAgICAjIGFzayB0aGUgdXNlciBpZiB0aGV5IHdhbnQgdG8gYnVpbGQgYW5kIGluc3RhbGwgd2luZQogICAgZWNobwogICAgZWNobyAiV2UgbmVlZCB0byBpbnN0YWxsIHdpbmUgYXMgcm9vdCB1c2VyLCBkbyB5b3Ugd2FudCB1cyB0byBidWlsZCB3aW5lLCIKICAgIGVjaG8gIidzdSByb290JyBhbmQgaW5zdGFsbCBXaW5lPyAgRW50ZXIgJ25vJyB0byBjb250aW51ZSB3aXRob3V0IGluc3RhbGxpbmciCiAgICBjb25mX3llc25vX2Fuc3dlciAiKHllcy9ubykgIgogICAgUk9PVElOU1RBTEw9IiRBTlNXRVIiCgogICAgaWYgWyAiJFJPT1RJTlNUQUxMIiA9ICJ5ZXMiIF0KICAgIHRoZW4gewogICAgICAjIHN0YXJ0IG91dCB3aXRoIHRoZSBiYXNpYyBjb21tYW5kCiAgICAgIHN1Y29tbWFuZD0ibWFrZSBpbnN0YWxsIgoKICAgICAgIyBpZiB0aGUgdXNlciBkb2Vzbid0IGhhdmUgJGxpYmRpciBpbiB0aGVpciBsZC5zby5jb25mIGFkZCB0aGlzCiAgICAgICMgdG8gb3VyIHN1Y29tbWFuZCBzdHJpbmcKICAgICAgaWYgWyAtZiAvZXRjL2xkLnNvLmNvbmYgXQogICAgICB0aGVuCiAgICAgICAgaWYgISBncmVwIC1zICIkbGliZGlyIiAvZXRjL2xkLnNvLmNvbmYgPi9kZXYvbnVsbCAyPiYxCiAgICAgICAgdGhlbiB7CiAgICAgICAgICBlY2hvCiAgICAgICAgICBlY2hvICIkbGliZGlyIGRvZXNuJ3QgZXhpc3QgaW4geW91ciAvZXRjL2xkLnNvLmNvbmYsIGl0IHdpbGwgYmUgYWRkZWQiCiAgICAgICAgICBlY2hvICJ3aGVuIHdlIHBlcmZvcm0gdGhlIGluc3RhbGwuLi4iCiAgICAgICAgICBzdWNvbW1hbmQ9IiRzdWNvbW1hbmQ7ZWNobyAkbGliZGlyPj4vZXRjL2xkLnNvLmNvbmYiCiAgICAgICAgfQogICAgICAgIGZpCiAgICAgICAgIyBydW4gbGRjb25maWcgYWx3YXlzIGp1c3QgaW4gY2FzZSBzb21lIHVwZGF0ZWQgZmlsZXMgZG9uJ3QgZ2V0IGxpbmtlZAogICAgICAgIHN1Y29tbWFuZD0iJHN1Y29tbWFuZDskYWNfY3ZfcGF0aF9MRENPTkZJRyIKICAgICAgZmkKICAgIH0KICAgIGZpICMgWyAiJFJPT1RJTlNUQUxMIiA9ICJ5ZXMiIF0KCiAgICBlY2hvCgogICAgZWNobyAiQ29tcGlsaW5nIFdJTkUuIEdyYWIgYSBsdW5jaCBvciB0d28sIHJlbnQgYSB2aWRlbywgb3Igd2hhdGV2ZXIsIgogICAgZWNobyAiaW4gdGhlIG1lYW50aW1lLi4uIgogICAgZWNobwogICAgc3RkX3NsZWVwCgogICAgIyB0cnkgdG8ganVzdCBtYWtlIHdpbmUsIGlmIHRoaXMgZmFpbHMgJ21ha2UgZGVwZW5kJyBhbmQgdHJ5IHRvIHJlbWFrZQogICAgaWYgISB7IG1ha2U7IH0KICAgIHRoZW4gewogICAgICBpZiAhIHsgbWFrZSBkZXBlbmQgJiYgbWFrZTsgfQogICAgICB0aGVuIHsKICAgICAgICBlY2hvCiAgICAgICAgZWNobyAiQ29tcGlsYXRpb24gZmFpbGVkLCBhYm9ydGluZyBpbnN0YWxsLiIKICAgICAgICBleGl0IDEKICAgICAgfQogICAgICBmaQogICAgfQogICAgZmkKCiAgICBpZiBbICIkUk9PVElOU1RBTEwiID0gInllcyIgXQogICAgdGhlbiB7CiAgICAgIGVjaG8KCiAgICAgIGVjaG8gIlBlcmZvcm1pbmcgJ21ha2UgaW5zdGFsbCcgYXMgcm9vdCB0byBpbnN0YWxsIGJpbmFyaWVzLCBlbnRlciByb290IHBhc3N3b3JkIgoKICAgICAgc3RkX3NsZWVwCgogICAgICBpZiAhIHN1IHJvb3QgLWMgIiRzdWNvbW1hbmQiCiAgICAgIHRoZW4gewoJZWNobwoJZWNobyAiSW5jb3JyZWN0IHJvb3QgcGFzc3dvcmQuIElmIHlvdSBhcmUgcnVubmluZyBVYnVudHUgb3IgYSBzaW1pbGFyIGRpc3RyaWJ1dGlvbiwiCgllY2hvICInbWFrZSBpbnN0YWxsJyBuZWVkcyB0byBiZSBydW4gdmlhIHRoZSBzdWRvIHdyYXBwZXIsIHNvIHRyeWluZyB0aGF0IG9uZSBub3ciCglpZiAhIHN1ZG8gc3Ugcm9vdCAtYyAiJHN1Y29tbWFuZCIKICAgICAgICB0aGVuIHsKCSAgICAgZWNobwogICAgICAgICAgICAgZWNobyAiRWl0aGVyIHlvdSBlbnRlcmVkIGFuIGluY29ycmVjdCBwYXNzd29yZCBvciB3ZSBmYWlsZWQgdG8iCiAgICAgICAgICAgICBlY2hvICJydW4gJyRzdWNvbW1hbmQnIGNvcnJlY3RseS4iCiAgICAgICAgICAgICBlY2hvICJJZiB5b3UgZGlkbid0IGVudGVyIGFuIGluY29ycmVjdCBwYXNzd29yZCB0aGVuIHBsZWFzZSIKICAgICAgICAgICAgIGVjaG8gInJlcG9ydCB0aGlzIGVycm9yIGFuZCBhbnkgc3RlcHMgdG8gcG9zc2libHkgcmVwcm9kdWNlIGl0IHRvIgogICAgICAgICAgICAgZWNobyAiaHR0cDovL2J1Z3Mud2luZWhxLm9yZy8iCiAgICAgICAgICAgICBlY2hvCiAgICAgICAgICAgICBlY2hvICJJbnN0YWxsYXRpb24gZmFpbGVkLCBhYm9ydGluZy4iCiAgICAgICAgICAgICBleGl0IDEKICAgICAgICAgfQogICAgICAgICBmaQogICAgICAgfQogICAgICBmaQoKICAgICAgZWNobwoKICAgICAgIyBzZWUgaWYgd2luZSBpcyBpbnN0YWxsZWQgb24gdGhlIHVzZXJzIHN5c3RlbSwgaWYgbm90IHByb21wdCB0aGVtCiAgICAgICMgYW5kIHRoZW4gZXhpdAogICAgICBpZiBbICEgYHdoaWNoIHdpbmVgIF0KICAgICAgdGhlbgogICAgICAgIGVjaG8gIkNvdWxkIG5vdCBmaW5kIHdpbmUgb24geW91ciBzeXN0ZW0uICBSdW4gd2luZWluc3RhbGwgYXMgcm9vdCB0byBpbnN0YWxsIHdpbmUiCiAgICAgICAgZWNobyAiYmVmb3JlIHJlLXJ1bm5pbmcgd2luZWluc3RhbGwgYXMgYSB1c2VyLiIKICAgICAgICBlY2hvCiAgICAgICAgZWNobyAiRXhpdGluZyB3aW5laW5zdGFsbCIKICAgICAgICBleGl0IDE7CiAgICAgIGZpCgogICAgICBXSU5FSU5TVEFMTEVEPXllcwogICAgfQogICAgZWxzZSB7CiAgICAgIFdJTkVJTlNUQUxMRUQ9bm8KICAgIH0KICAgIGZpICMgWyAiJFJPT1RJTlNUQUxMIiA9ICJ5ZXMiIF0KICB9CiAgZmkgIyBbIGB3aG9hbWlgICE9ICdyb290JyBdCgp9CmZpICMgQklORElTVAoKaWYgWyAiJFdJTkVJTlNUQUxMRUQiID0gJ25vJyBdCnRoZW4KICAgIHRvb2xzL3dpbmVwcmVmaXhjcmVhdGUgLS11c2Utd2luZS10cmVlIC4KZWxzZQogICAgd2luZXByZWZpeGNyZWF0ZQpmaQplY2hvCgoKIyBpdCdzIGEgd3JhcAplY2hvCmVjaG8gIkluc3RhbGxhdGlvbiBjb21wbGV0ZSBmb3Igbm93LiBHb29kIGx1Y2sgKHRoaXMgaXMgc3RpbGwgYmV0YSBzb2Z0d2FyZSkuIgplY2hvICJJZiB5b3UgaGF2ZSBwcm9ibGVtcyB3aXRoIFdJTkUsIHBsZWFzZSByZWFkIHRoZSBkb2N1bWVudGF0aW9uIGZpcnN0LCIKZWNobyAiYXMgbWFueSBraW5kcyBvZiBwb3RlbnRpYWwgcHJvYmxlbXMgYXJlIGV4cGxhaW5lZCB0aGVyZS4iCgpleGl0IDAK