# Name: smd_macro v0.20 # Type: Admin/Client side plugin # Define custom macros/virtual Txp tags for your site # Author: Stef Dawson # URL: http://stefdawson.com/ # Recommended load order: 5 # ..................................................................... # This is a plugin for Textpattern - http://textpattern.com/ # To install: textpattern > admin > plugins # Paste the following text into the 'Install plugin' box: # ..................................................................... YToxMTp7czo0OiJuYW1lIjtzOjk6InNtZF9tYWNybyI7czo2OiJhdXRob3IiO3M6MTE6IlN0 ZWYgRGF3c29uIjtzOjEwOiJhdXRob3JfdXJpIjtzOjIyOiJodHRwOi8vc3RlZmRhd3Nvbi5j b20vIjtzOjc6InZlcnNpb24iO3M6NDoiMC4yMCI7czoxMToiZGVzY3JpcHRpb24iO3M6NTE6 IkRlZmluZSBjdXN0b20gbWFjcm9zL3ZpcnR1YWwgVHhwIHRhZ3MgZm9yIHlvdXIgc2l0ZSI7 czo0OiJoZWxwIjtzOjEyMjUxOiI8ZGl2IGlkPSJzbWRfaGVscCI+CgoJPGgxIGlkPSJzbWRf dG9wIj5zbWRfbWFjcm88L2gxPgoKCTxwPkJ1aWxkIHlvdXIgb3duIHZpcnR1YWwgVHhwIHRh Z3MgZnJvbSBjb21iaW5hdGlvbnMgb2YgYnVpbHQtaW4gdGFncyBhbmQgcGx1Z2lucyAmIzgy MTI7IGV2ZW4gPHNwYW4gY2xhc3M9ImNhcHMiPlBIUDwvc3Bhbj4uIFRodXMgeW91IGNhbiBl YXNlIHlvdXIgd29ya2Zsb3cgb3Igb2ZmZXIgeW91ciBjbGllbnRzIHNpbXBsZXIgc3ludGF4 IGZvciBkb2luZyBwb3dlcmZ1bCB0aGluZ3MgaW4gdGhlaXIgUGFnZXMsIEZvcm1zLCBhbmQg QXJ0aWNsZXMuPC9wPgoKCTxoMiBpZD0ic21kX2ZlYXQiPkZlYXR1cmVzOjwvaDI+CgoJPHVs PgoJCTxsaT5EZWZpbmUgbWFjcm9zICYjODIxMjsgY3VzdG9tLCB2aXJ0dWFsIFR4cCB0YWdz ICYjODIxMjsgd2l0aCBhbnkgbnVtYmVyIG9mIGF0dHJpYnV0ZXM8L2xpPgoJCTxsaT5Db25z dHJ1Y3QgYSBkZWZpbml0aW9uIGJsb2NrICYjODIxMjsgbGlrZSBhIFR4cCBGb3JtICYjODIx MjsgdGhhdCBjb250YWlucyB0aGUgdGFncyAvIGNvZGUgdGhhdCBtYWtlIHVwIHlvdXIgbWFj cm88L2xpPgoJCTxsaT5JbmplY3QgcmVwbGFjZW1lbnQgdmFsdWVzIChyZWFkIGZyb20geW91 ciBhdHRyaWJ1dGVzKSBpbnRvIG1hY3JvIGRlZmluaXRpb25zIGF0IHJ1bnRpbWU8L2xpPgoJ CTxsaT5JbXBvcnQgLyBleHBvcnQgbWFjcm9zIGZvciBhcmNoaXZlIC8gc2hhcmluZyB3aXRo IHRoZSBjb21tdW5pdHk8L2xpPgoJCTxsaT5NYWNyb3MgY2FuIGJlIHNpbmdsZSBvciBjb250 YWluZXJzPC9saT4KCTwvdWw+CgoJPGgyPkF1dGhvciAvIGNyZWRpdHM8L2gyPgoKCTxwPldy aXR0ZW4gYnkgPGEgaHJlZj0iaHR0cDovL3N0ZWZkYXdzb24uY29tL2NvbnRhY3QiPlN0ZWYg RGF3c29uPC9hPi4gU3Bhd25lZCBmcm9tIGFuIGlkZWEgYnkganBkdXBvbnQsIHdpdGggdGhh bmtzLiBBbHNvIGJpZyBwcm9wcyB0byB0aGUgYmV0YSB0ZXN0IHRlYW06IHByaW1hcmlseSBq cGR1cG9udCwgcGllbWFuLCBtcmRhbGUsIG1hdmVyaWNrLCBtYXJ1Y2hhbiBhbmQgamFrb2Iu PC9wPgoKCTxoMj5JbnN0YWxsYXRpb24gLyB1bmluc3RhbGxhdGlvbjwvaDI+CgoJPHAgY2xh c3M9ImltcG9ydGFudCI+UmVxdWlyZXMgVHhwIDQuNC4xKzwvcD4KCgk8cD5Eb3dubG9hZCB0 aGUgcGx1Z2luIGZyb20gZWl0aGVyIDxhIGhyZWY9Imh0dHA6Ly90ZXh0cGF0dGVybi5vcmcv cGx1Z2lucy8xMjEzL3NtZF9tYWNybyI+dGV4dHBhdHRlcm4ub3JnPC9hPiwgb3IgdGhlIDxh IGhyZWY9Imh0dHA6Ly9zdGVmZGF3c29uLmNvbS9zdyI+c29mdHdhcmUgcGFnZTwvYT4sIHBh c3RlIHRoZSBjb2RlIGludG8gdGhlIFR4cCA8ZW0+QWRtaW4gLSZndDsgUGx1Z2luczwvZW0+ IHBhbmUsIGluc3RhbGwgYW5kIGVuYWJsZSB0aGUgcGx1Z2luLiBUbyB1bmluc3RhbGwsIGRl bGV0ZSBmcm9tIHRoZSA8ZW0+QWRtaW4gLSZndDsgUGx1Z2luczwvZW0+IHBhZ2UuPC9wPgoK CTxwPlZpc2l0IHRoZSA8YSBocmVmPSJodHRwOi8vZm9ydW0udGV4dHBhdHRlcm4uY29tL3Zp ZXd0b3BpYy5waHA/aWQ9MzU3NzIiPmZvcnVtIHRocmVhZDwvYT4gZm9yIG1vcmUgaW5mbyBv ciB0byByZXBvcnQgb24gdGhlIHN1Y2Nlc3Mgb3Igb3RoZXJ3aXNlIG9mIHRoZSBwbHVnaW4u PC9wPgoKCTxoMiBpZD0ic21kX3VzYWdlIj5Vc2FnZTwvaDI+CgoJPHA+VmlzaXQgdGhlIDxl bT5Db250ZW50IC0mZ3Q7IE1hY3JvczwvZW0+IHRhYi4gV2hlbiB0aGVyZSBhcmUgbWFjcm9z IGRlZmluZWQsIHRoZSBkcm9wZG93biBhdCB0aGUgdG9wLXJpZ2h0IG9mIHRoZSBwYW5lbCBj b250YWlucyBhIGxpc3Qgb2YgYWxsIG1hY3JvcyB0aGF0IGhhdmUgYmVlbiBkZWZpbmVkLiBD aG9vc2Ugb25lIHRvIGxvYWQgaXQgaW50byB0aGUgYm94ZXMgYmVsb3cgZm9yIGVkaXRpbmcu PC9wPgoKCTxwPlRoZSBib3hlcyBhcmU6PC9wPgoKCTx1bD4KCQk8bGk+PHNwYW4gY2xhc3M9 ImF0bm0iPk5hbWU8L3NwYW4+IDogbmFtZSBvZiB5b3VyIG1hY3JvL3ZpcnR1YWwgdGFnPHN1 cCBpZD0iZm5yZXYyNTA0NDAzNDQ0ZjQxODlkNDg0N2Y2IiBjbGFzcz0iZm9vdG5vdGUiPjxh IGhyZWY9IiNmbjI1MDQ0MDM0NDRmNDE4OWQ0ODQ3ZjYiPjE8L2E+PC9zdXA+LiBDbGljayB0 aGUgYWRqYWNlbnQgW3hdIGJ1dHRvbiB0byBkZWxldGUgaXQuPC9saT4KCQk8bGk+PHNwYW4g Y2xhc3M9ImF0bm0iPkRlc2NyaXB0aW9uPC9zcGFuPiA6IG9wdGlvbmFsIGRlc2NyaXB0aW9u IGZvciB5b3VyIG93biBkb2N1bWVudGF0aW9uICYjODIxMjsgbm90IHVzZWQgYW55d2hlcmUg ZWxzZSBhdCBwcmVzZW50LjwvbGk+CgkJPGxpPjxzcGFuIGNsYXNzPSJhdG5tIj5BdHRyaWJ1 dGVzPC9zcGFuPiA6IHNwZWNpZnkgdXAgdG8gdGhyZWUgdmFsdWVzIGZvciBlYWNoIGF0dHJp YnV0ZTxzdXAgaWQ9ImZucmV2MTkwNDI2NTg4MTRmNDE4OWQ0ODRiZTEiIGNsYXNzPSJmb290 bm90ZSI+PGEgaHJlZj0iI2ZuMTkwNDI2NTg4MTRmNDE4OWQ0ODRiZTEiPjI8L2E+PC9zdXA+ LiBDbGljayB0aGUgWytdIGJ1dHRvbiB0byBjcmVhdGUgbW9yZS4gQ2xlYXIgdGhlIDxlbT5u YW1lPC9lbT4gYm94IGJlZm9yZSBTYXZpbmcgdG8gZGVsZXRlIHRoYXQgYXR0cmlidXRlLiBU aGUgdGhyZWUgdmFsdWVzIGFyZToKCTx1bD4KCQk8bGk+PHNwYW4gY2xhc3M9ImF0bm0iPk5h bWU8L3NwYW4+IDogdGhlIG5hbWUgb2YgeW91ciBhdHRyaWJ1dGUgdGhhdCBjbGllbnRzIHdp bGwgdXNlIGluIHlvdXIgdGFnLiBNdXN0IGJlIGEgdmFsaWQgPHNwYW4gY2xhc3M9ImNhcHMi PkFTQ0lJPC9zcGFuPiBuYW1lLjwvbGk+CgkJPGxpPjxzcGFuIGNsYXNzPSJhdG5tIj5EZWZh dWx0PC9zcGFuPiA6IHRoZSBkZWZhdWx0IHZhbHVlIHRoYXQgdGhpcyBhdHRyaWJ1dGUgd2ls bCB0YWtlIG9uIGlmIG5vdCBzdXBwbGllZC4gTGVhdmUgZW1wdHkgZm9yIDxjb2RlPiZxdW90 OyZxdW90OzwvY29kZT4uPC9saT4KCQk8bGk+PHNwYW4gY2xhc3M9ImF0bm0iPlJlcGxhY2Vt ZW50PC9zcGFuPiA6IHRoZSBuYW1lIG9mIHRoZSA8Y29kZT57cmVwbGFjZW1lbnR9PC9jb2Rl PiB0aGF0IHRoaXMgYXR0cmlidXRlIHdpbGwgb2NjdXB5IGluIHlvdXIgZGVmaW5pdGlvbnMu IFNwZWNpZnkgaXQgPGVtPndpdGhvdXQ8L2VtPiB0aGUgPGNvZGU+e308L2NvZGU+IGJyYWNr ZXRzLiBJZiB0aGlzIGVudHJ5IGlzIG9taXR0ZWQsIHRoZSBhdHRyaWJ1dGUmIzgyMTc7cyA8 Y29kZT5OYW1lPC9jb2RlPiB3aWxsIGJlIHVzZWQuPC9saT4KCTwvdWw+PC9saT4KCQk8bGk+ PHNwYW4gY2xhc3M9ImF0bm0iPk1hY3JvIGRlZmluaXRpb248L3NwYW4+IDogeW91ciB0YWcg Y29kZSBoZXJlLiBBdCBhbnkgcG9pbnQgeW91IGNhbiBpbnNlcnQgdGhlIG5hbWUgb2YgYW55 IG9mIHlvdXIgZGVmaW5lZCBhdHRyaWJ1dGUgcmVwbGFjZW1lbnQgdmFsdWVzIGluc2lkZSA8 Y29kZT57fTwvY29kZT4gbWFya3MgdG8gaGF2ZSB0aGUgcGx1Z2luIGluamVjdCB0aGUgYXR0 cmlidXRlIGludG8geW91ciBtYXJrdXAgd2hlbiB0aGUgY2xpZW50IHVzZXMgdGhlIHRhZy4g U2VlIDxhIGhyZWY9IiNzbWRfZXhhbXBsZXMiPmV4YW1wbGVzPC9hPiBmb3IgbW9yZS48L2xp PgoJPC91bD4KCgk8cCBpZD0iZm4yNTA0NDAzNDQ0ZjQxODlkNDg0N2Y2IiBjbGFzcz0iZm9v dG5vdGUiPjxzdXA+MTwvc3VwPiA8c3BhbiBjbGFzcz0iY2FwcyI+SU1QT1JUQU5UPC9zcGFu PjogeW91ciB0YWcgPHN0cm9uZz48c3BhbiBjbGFzcz0iY2FwcyI+TVVTVDwvc3Bhbj48L3N0 cm9uZz4gYWRoZXJlIHRvIHRoZSBmb2xsb3dpbmcgY29udmVudGlvbnM6PC9wPgoKCTx1bD4K CQk8bGk+YW4gPHNwYW4gY2xhc3M9ImNhcHMiPkFTQ0lJPC9zcGFuPiBuYW1lICYjODIxMjsg bm8gZm9yZWlnbiBjaGFyYWN0ZXJzLCBoeXBoZW5zIG9yIGFueXRoaW5nIG90aGVyIHRoYW4g YWxwaGFudW1lcmljIGNoYXJhY3RlcnMgYW5kIHVuZGVyc2NvcmVzLiBJbiBhZGRpdGlvbiBp dCBtYXkgPGVtPm5vdDwvZW0+IGJlZ2luIHdpdGggYSBudW1iZXIuPC9saT4KCQk8bGk+ZG91 YmxlIGNoZWNrIGJlZm9yZSBzYXZpbmcgdGhhdCB5b3VyIHRhZyBkb2VzIG5vdCBoYXZlIHRo ZSBzYW1lIG5hbWUgYXMgYW4gZXhpc3RpbmcgVHhwIG9yIDxzcGFuIGNsYXNzPSJjYXBzIj5Q SFA8L3NwYW4+IGZ1bmN0aW9uLiBJZiBpdCBkb2VzLCB5b3VyIHNpdGUgPHNwYW4gY2xhc3M9 ImNhcHMiPldJTEw8L3NwYW4+IGJsb3cgdXAgd2l0aCBuYXN0eSBlcnJvcnMuIFRoZSBiZXN0 IHdheSB0byBhdm9pZCB0aGlzIGlzIHRvIG1ha2Ugc3VyZSB5b3UgcHJlZml4IHlvdXIgdGFn cyB3aXRoIGEgdGhyZWUtbGV0dGVyIHByZWZpeCwganVzdCBhcyB5b3Ugd291bGQgaWYgdGhp cyB3YXMgeW91ciBvd24gcGx1Z2luLjwvbGk+Cgk8L3VsPgoKCTxwPlRoZSBwbHVnaW4gdHJp ZXMgdG8gc2hpZWxkIHlvdSBmcm9tIGludmFsaWQgbmFtZXMgYXMgZmFyIGFzIHBvc3NpYmxl IGFuZCB3aWxsIHVzdWFsbHkgZGV0ZWN0IGludGVybmFsIDxzcGFuIGNsYXNzPSJjYXBzIj5Q SFA8L3NwYW4+L1R4cCBmdW5jdGlvbiBuYW1lIGNsYXNoZXMsIGFkbWluLXNpZGUgcGx1Z2lu IGNsYXNoZXMgYXMgd2VsbCBhcyBpbnZhbGlkL3ByZXZpb3VzbHkgZGVmaW5lZCBtYWNybyBu YW1lcy4gQnV0IGl0IGNhbm5vdCBsZWdpc2xhdGUgZm9yIGZ1bmN0aW9ucyB0aGF0IGFyZSBn b2luZyB0byBiZWNvbWUgYXZhaWxhYmxlIG9uIHlvdXIgcHVibGljIHNpdGUsIGkuZS4gdGFn cy9mdW5jdGlvbnMgYWRkZWQgYnkgcHVibGljLXNpZGUgcGx1Z2lucy4gUGxlYXNlIGV4ZXJj aXNlIGNhdXRpb24gd2hlbiBuYW1pbmcgeW91ciBtYWNyb3MuPC9wPgoKCTxwIGlkPSJmbjE5 MDQyNjU4ODE0ZjQxODlkNDg0YmUxIiBjbGFzcz0iZm9vdG5vdGUiPjxzdXA+Mjwvc3VwPiBN YWtlIHN1cmUgeW91IGF2b2lkIHRoZSBwaXBlIHN5bWJvbCA8Y29kZT58PC9jb2RlPiBpbiB5 b3VyIGF0dHJpYnV0ZSBuYW1lcyAvIGRlZmF1bHRzIC8gcmVwbGFjZW1lbnRzIGFzIHRoaXMg Y2hhcmFjdGVyIGlzIHVzZWQgaW50ZXJuYWxseSBieSB0aGUgcGx1Z2luLjwvcD4KCgk8aDM+ Q29udGFpbmVyIG1hY3JvczwvaDM+CgoJPHA+WW91IG1heSB1c2UgeW91ciBuZXcgbWFjcm9z IGFzIGNvbnRhaW5lciB0YWdzLiBJbiB5b3VyIG1hY3JvIGRlZmluaXRpb24sIHNwZWNpZnkg dGhlIHNwZWNpYWwgcmVwbGFjZW1lbnQgdGFnIDxjb2RlPntzbWRfY29udGFpbmVyfTwvY29k ZT4gd2hlcmUgeW91IHdhbnQgdGhlIGNvbnRhaW5lZCBjb250ZW50IHRvIGdvLiBJZiB0aGUg Y29udGFpbmVyIGlzIGVtcHR5LCBub3RoaW5nIGlzIG91dHB1dCA8ZW0+dW5sZXNzPC9lbT4g eW91IGRlZmluZSBhbiBhdHRyaWJ1dGUgbmFtZWQgPGNvZGU+c21kX2NvbnRhaW5lcjwvY29k ZT4gYW5kIGdpdmUgaXQgc29tZSBEZWZhdWx0IGNvbnRlbnQuIEluIHRoYXQgY2FzZSwgeW91 ciA8Y29kZT57c21kX2NvbnRhaW5lcn08L2NvZGU+IHJlcGxhY2VtZW50IHRhZyB3aWxsIHRh a2Ugb24gdGhlIGRlZmF1bHQgdmFsdWUgYXNzaWduZWQgdG8gdGhhdCBhdHRyaWJ1dGUuIE5v dGUgdGhhdCB0aGUgPGVtPlJlcGxhY2VtZW50IG5hbWU8L2VtPiBkb2VzbiYjODIxNzt0IG1h dHRlciBhbmQgY2FuIGJlIG9taXR0ZWQ6IHRoZSByZXBsYWNlbWVudCBpcyA8ZW0+YWx3YXlz PC9lbT4gZ29pbmcgdG8gYmUgPGNvZGU+e3NtZF9jb250YWluZXJ9PC9jb2RlPi48L3A+CgoJ PHA+Tm90ZSB0aGlzIG1lYW5zIHRoYXQgaWYgeW91IGFkZCBhbiBhdHRyaWJ1dGUgPGNvZGU+ c21kX2NvbnRhaW5lcj0mcXVvdDtzb21lIHZhbHVlJnF1b3Q7PC9jb2RlPiB0byB5b3VyIG1h Y3JvIHdoZW4gaXQmIzgyMTc7cyB1c2VkIGluIHlvdXIgcGFnZSwgaXQgZG9lcyB0aGUgc2Ft ZSB0aGluZyBhcyB1c2luZyB0aGUgY29udGFpbmVyLiBUaGlzIGNvdWxkIGJlIGNvbnN0cnVl ZCBhIGZlYXR1cmUuPC9wPgoKCTxoMiBpZD0ic21kX2ltcG9ydCI+SW1wb3J0aW5nIG1hY3Jv czwvaDI+CgoJPHA+WW91IGNhbiBpbXBvcnQgbWFjcm9zIHRoYXQgaGF2ZSBiZWVuIHByZXZp b3VzbHkgZXhwb3J0ZWQgZnJvbSB0aGUgcGx1Z2luLiBDbGljayB0aGUgPGVtPkltcG9ydDwv ZW0+IGxpbmsgYW5kIGNob29zZSB0aGUgPGNvZGU+c21kX21hY3Jvcy5pbmk8L2NvZGU+IGZp bGUgdGhhdCB5b3UgaGF2ZSBiZWVuIGdpdmVuICh0aGUgZmlsZSBuYW1lIGl0c2VsZiBkb2Vz biYjODIxNzt0IGFjdHVhbGx5IG1hdHRlcikuIElmIHlvdSB3YW50IHRvIG92ZXJ3cml0ZSBh bnkgbWFjcm9zIG9mIHRoZSBzYW1lIG5hbWUgdGhhdCBhbHJlYWR5IGV4aXN0IGluIHlvdXIg c3lzdGVtLCBjaGVjayB0aGUgPGVtPkZvcmNlIG92ZXJ3cml0ZTwvZW0+IGJveC4gT3RoZXJ3 aXNlLCBhbnkgbWFjcm9zIGluIHRoZSBpbXBvcnQgZmlsZSB0aGF0IGFscmVhZHkgZXhpc3Qg d2lsbCBiZSBza2lwcGVkLjwvcD4KCgk8cD5Ob3RlIHRoYXQgdGhlIHBsdWdpbiBtYWtlcyBz b21lIGNoZWNrcyBvbiB5b3VyIHN5c3RlbSBhbmQgd2lsbCB0cnkgYW5kIGJhaWwgb3V0IGdy YWNlZnVsbHkgaWYgdGhlIG5lY2Vzc2FyeSBwZXJtaXNzaW9ucyBhcmUgbm90IHNldCAoaXQg dGVtcG9yYXJpbHkgdXBsb2FkcyBmaWxlcyB0byBUeHAmIzgyMTc7cyB0ZW1wIGRpcmVjdG9y eSwgYXMgZGVmaW5lZCBpbiA8ZW0+QWR2YW5jZWQgUHJlZnM8L2VtPikuIEl0IGFsc28gaW1w b3NlcyBhIHNvZnQgbGltaXQgb2Ygcm91Z2hseSAxNUtCIG9uIHRoZSBzaXplIG9mIHRoZSBp bXBvcnRlZCBmaWxlLCBtb3N0bHkgZm9yIHJlYXNvbnMgb2Ygc3BlZWQuIElmIHlvdSBmaW5k IHlvdXJzZWxmIHJlcXVpcmluZyB0byBpbXBvcnQgbGFyZ2UgbnVtYmVycyBvZiBtYWNyb3Mg aW4gb25lIGZpbGUsIHlvdSBjYW4gaW5jcmVhc2UgdGhpcyBsaW1pdCBieSBjcmVhdGluZyB0 aGUgZm9sbG93aW5nIGdsb2JhbCBzeXN0ZW0gcHJlZmVyZW5jZSAoc21kX3ByZWZhbGl6ZXIg Y2FuIGhlbHApOjwvcD4KCgk8dWw+CgkJPGxpPjxzcGFuIGNsYXNzPSJhdG5tIj5QcmVmIG5h bWU8L3NwYW4+OiBzbWRfbWFjcm9faW1wb3J0X2ZpbGVzaXplPC9saT4KCQk8bGk+PHNwYW4g Y2xhc3M9ImF0bm0iPlZhbHVlPC9zcGFuPiA6IG1heGltdW0gZmlsZSBzaXplIChpbiBieXRl cyk8L2xpPgoJCTxsaT48c3BhbiBjbGFzcz0iYXRubSI+VmlzaWJpbGl0eTwvc3Bhbj4gOiBI aWRkZW48L2xpPgoJCTxsaT48c3BhbiBjbGFzcz0iYXRubSI+RXZlbnQ8L3NwYW4+IDogc21k X21hY3JvPC9saT4KCTwvdWw+CgoJPHA+QWx0ZXJuYXRpdmVseSwgc3BsaXQgeW91ciBtYWNy b3MgaW50byBhIGZldyBzbWFsbGVyIGZpbGVzIGFuZCBpbXBvcnQgdGhlbSBzZXBhcmF0ZWx5 LjwvcD4KCgk8aDIgaWQ9InNtZF9leHBvcnQiPkV4cG9ydGluZyBtYWNyb3M8L2gyPgoKCTxw PkF0IGFueSB0aW1lIHlvdSBjYW4gZXhwb3J0IG9uZSBvciBtb3JlIG1hY3JvcyB0byBhIGZp bGUgZm9yIGRpc3RyaWJ1dGlvbiBvciBiYWNrdXAuIEp1c3QgY2xpY2sgdGhlIDxlbT5FeHBv cnQ8L2VtPiBsaW5rIGFuZCBjaG9vc2Ugb25lIG9yIG1vcmUgbWFjcm9zIGZyb20gdGhlIGxp c3QgdGhhdCBhcHBlYXJzLiBDbGljayA8ZW0+R288L2VtPiBhbmQgdGhlbiBzYXZlIHRoZSBy ZXN1bHRpbmcgZmlsZSB0byB5b3VyIGZpbGVzeXN0ZW0uIFRoZSBjdXJyZW50IG1hY3JvIHRo YXQgaXMgYmVpbmcgZWRpdGVkIChpZiBhbnkpIGlzIHNlbGVjdGVkIGJ5IGRlZmF1bHQuPC9w PgoKCTxoMiBpZD0ic21kX2Nsb25lIj5DbG9uaW5nIG1hY3JvczwvaDI+CgoJPHA+V2hpbGUg YSBtYWNybyBpcyBsb2FkZWQgaW50byB0aGUgZWRpdCBib3hlcyB5b3UgY2FuIGNsb25lIGl0 LiBDbGljayB0aGUgPGVtPkNsb25lPC9lbT4gYnV0dG9uLCBzdXBwbHkgYSBuYW1lIGZvciB0 aGUgY2xvbmUgYW5kIGhpdCA8ZW0+R288L2VtPi4gUHJvdmlkZWQgdGhlIG5hbWUgaXNuJiM4 MjE3O3QgaW52YWxpZCBvciBpbiB1c2UsIHlvdXIgbmV3IGNsb25lIHdpbGwgYmUgY3JlYXRl ZCBhbmQgYnJvdWdodCBpbnRvIHRoZSBlZGl0IGFyZWEgZm9yIGltbWVkaWF0ZSBlZGl0aW5n LjwvcD4KCgk8cD5Ob3RlIHRoYXQgdGhlIGNsb25lIHdpbGwgYmUgY3JlYXRlZCBmcm9tIHRo ZSBjaG9zZW4gbWFjcm8gYXMgaXQgd2FzIGxhc3Qgc2F2ZWQgdG8gdGhlIGRhdGFiYXNlLiBJ ZiB5b3UgaGF2ZSBtYWRlIHVuc2F2ZWQgZWRpdHMgdG8gdGhlIG1hY3JvIGluIHRoZSBlZGl0 IGJveGVzIGF0IHRoZSB0aW1lIHlvdSBjbG9uZSB0aGUgbWFjcm8sIHRoZXkgd2lsbCBiZSBs b3N0LjwvcD4KCgk8aDIgaWQ9InNtZF9leGFtcGxlcyI+RXhhbXBsZXM8L2gyPgoKCTxoMyBp ZD0ic21kX2VnMSI+RXhhbXBsZSAxOiBpbWFnZSBnYWxsZXJ5PC9oMz4KCgk8dWw+CgkJPGxp PjxzcGFuIGNsYXNzPSJhdG5tIj5NYWNybyBuYW1lPC9zcGFuPiA6IG15X2dhbGxlcnk8L2xp PgoJCTxsaT48c3BhbiBjbGFzcz0iYXRubSI+QXR0cmlidXRlcyAoZGVmYXVsdCAvIHJlcGxh Y2VtZW50KTwvc3Bhbj4gOiBjYXRlZ29yeSAoZW1wdHkgLyBpbWdfY2F0KTwvbGk+Cgk8L3Vs PgoKPHByZSBjbGFzcz0iYmxvY2siPjxjb2RlIGNsYXNzPSJibG9jayI+Jmx0O3R4cDppbWFn ZXMgY2F0ZWdvcnk9JnF1b3Q7e2ltZ19jYXR9JnF1b3Q7Jmd0OwogICAmbHQ7dHhwOmltYWdl IC8mZ3Q7CiAgICZsdDtkaXYgY2xhc3M9JnF1b3Q7aW1nX2luZm8mcXVvdDsmZ3Q7Jmx0O3R4 cDppbWFnZV9pbmZvIC8mZ3Q7IGJ5ICZsdDt0eHA6aW1hZ2VfYXV0aG9yIC8mZ3Q7Jmx0Oy9k aXYmZ3Q7CiZsdDsvdHhwOmltYWdlcyZndDsKPC9jb2RlPjwvcHJlPgoKCTxwPlRodXMsIDxj b2RlPiZsdDt0eHA6bXlfZ2FsbGVyeSBjYXRlZ29yeT0mcXVvdDthbmltYWxzJnF1b3Q7IC8m Z3Q7PC9jb2RlPiB3aWxsIHJlbmRlciBhbiBpbWFnZSBnYWxsZXJ5IGZyb20gdGhlIGdpdmVu IGNhdGVnb3J5LCBjb21wbGV0ZSB3aXRoIGNhcHRpb24gYW5kIGF1dGhvciBpbmZvLiBOb3Rl IHRoYXQgbm8gZGVmYXVsdCB2YWx1ZSBpcyBnaXZlbiBzbyBpZiB0aGUgPGNvZGU+Y2F0ZWdv cnk8L2NvZGU+IGF0dHJpYnV0ZSBpcyBub3Qgc3VwcGxpZWQsIG5vIGdhbGxlcnkgd2lsbCBi ZSBwcm9kdWNlZC48L3A+CgoJPGgzIGlkPSJzbWRfZWcyIj5FeGFtcGxlIDI6IGludGVyZmFj ZSB0byBzbWRfcXVlcnk8L2gzPgoKCTx1bD4KCQk8bGk+PHNwYW4gY2xhc3M9ImF0bm0iPk1h Y3JvIG5hbWU8L3NwYW4+IDogbXlfY29sX2Zyb21fdGFibGU8L2xpPgoJCTxsaT48c3BhbiBj bGFzcz0iYXRubSI+QXR0cmlidXRlcyAoZGVmYXVsdCAvIHJlcGxhY2VtZW50KTwvc3Bhbj4g OiBjb2x1bW4gKElEIC8gY29sKSwgdGFibGUgKHRleHRwYXR0ZXJuKTwvbGk+Cgk8L3VsPgoK PHByZSBjbGFzcz0iYmxvY2siPjxjb2RlIGNsYXNzPSJibG9jayI+Jmx0O3AmZ3Q7VGhlIGNv bnRlbnRzIG9mIHRoZSB7Y29sfSBjb2x1bW4KZnJvbSB0aGUge3RhYmxlfSB0YWJsZSBpczom bHQ7L3AmZ3Q7CiZsdDt0eHA6c21kX3F1ZXJ5IGNvbHVtbj0mcXVvdDt7Y29sfSZxdW90OyB0 YWJsZT0mcXVvdDt7dGFibGV9JnF1b3Q7CiAgICAgd3JhcHRhZz0mcXVvdDt1bCZxdW90OyBi cmVhaz0mcXVvdDtsaSZxdW90OyZndDsKICAge3tjb2x9fQombHQ7L3R4cDpzbWRfcXVlcnkm Z3Q7CjwvY29kZT48L3ByZT4KCgk8cD5Bbnlib2R5IHVzaW5nIDxjb2RlPiZsdDt0eHA6bXlf Y29sX2Zyb21fdGFibGUgY29sdW1uPSZxdW90O1RpdGxlJnF1b3Q7IC8mZ3Q7PC9jb2RlPiB3 b3VsZCBzZWUgYSBsaXN0IG9mIGFsbCBhcnRpY2xlIHRpdGxlcy4gSWYgdGhleSBhZGRlZCA8 Y29kZT50YWJsZT0mcXVvdDt0eHBfZmlsZSZxdW90OzwvY29kZT4gdGhleSYjODIxNztkIHNl ZSBhbGwgdGl0bGVzIGZyb20gYWxsIHVwbG9hZGVkIGZpbGVzLiBUaGluZ3MgdG8gbm90ZTo8 L3A+CgoJPHVsPgoJCTxsaT5ObyByZXBsYWNlbWVudCB2YXJpYWJsZSBzcGVjaWZpZWQgZm9y IHRoZSA8Y29kZT50YWJsZTwvY29kZT4gYXR0cmlidXRlLCB0aGVyZWZvcmUgaXQgdGFrZXMg b24gdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSBpdHNlbGYuPC9saT4KCQk8bGk+VGhlIGRv dWJsZSBzZXQgb2YgPGNvZGU+e3t9fTwvY29kZT4gaW4gdGhlIHNtZF9xdWVyeSBjb250YWlu ZXIgaXMgcmVxdWlyZWQgYmVjYXVzZSB5b3UgZmlyc3Qgd2FudCB0aGUgbWFjcm8gdG8gcmVw bGFjZSA8Y29kZT57Y29sfTwvY29kZT4gd2l0aCB0aGUgdmFsdWUgZnJvbSB5b3VyIG1hY3Jv JiM4MjE3O3MgPGNvZGU+Y29sdW1uPC9jb2RlPiBhdHRyaWJ1dGUsIGkuZS4gaWYgeW91JiM4 MjE3O2QgY2hvc2VuIDxjb2RlPmNvbHVtbj0mcXVvdDtQb3N0ZWQmcXVvdDs8L2NvZGU+IHRo ZW4gPGNvZGU+e3tjb2x9fTwvY29kZT4gYmVjb21lcyA8Y29kZT57UG9zdGVkfTwvY29kZT4u IEFmdGVyIHRoYXQsIHNtZF9xdWVyeSBzZWFyY2hlcyBmb3IgPGNvZGU+e1Bvc3RlZH08L2Nv ZGU+IGFuZCByZXBsYWNlcyBpdCB3aXRoIHRoZSBjb250ZW50cyBvZiB0aGUgJiM4MjE2O1Bv c3RlZCYjODIxNzsgY29sdW1uIGZvciBlYWNoIHJvdyBpbiB0aGUgdGFibGUuPC9saT4KCTwv dWw+CgoJPGgyIGlkPSJzbWRfY2hhbmdlbG9nIj5DaGFuZ2Vsb2c8L2gyPgoKCTxwPjE2IE1h ciAyMDExIHwgMC4xMCB8IEluaXRpYWwgcHVibGljIHJlbGVhc2U8YnIgLz4KMjcgTWFyIDIw MTEgfCAwLjExIHwgRml4ZWQgbmVzdGluZyBidWcgKHRoYW5rcyBtYXZlcmljaykuIFJlc2F2 ZSB5b3VyIG1hY3JvcyBhZnRlciB1cGdyYWRpbmc8YnIgLz4KMTkgRmViIDIwMTIgfCAwLjIw IHwgRml4ZWQgPHNwYW4gY2xhc3M9ImNhcHMiPlVURjwvc3Bhbj4tOCBjb2xsYXRpb24sIGZv cmNlZCBsb3dlciBjYXNlIGF0dHJpYnV0ZSBuYW1lcyBhbmQgb25seSBwZXJtaXR0ZWQgdmFs aWQgYXNjaWkgY2hhcnMgLyB1bmRlcnNjb3JlcyBhcyBuYW1lcyAoYWxsIHRoYW5rcyB1bGkp IDsgYWRkZWQgY29udGFpbmVyIHN1cHBvcnQ8L3A+Cgo8L2Rpdj4KPCEtLSAqKiogQkVHSU4g UExVR0lOIENTUyAqKiogLS0+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CiNzbWRfaGVscCB7 IGxpbmUtaGVpZ2h0OjEuNSA7fQojc21kX2hlbHAgY29kZSB7IGZvbnQtd2VpZ2h0OmJvbGQ7 IGZvbnQ6IDEwNSUvMTMwJSAiQ291cmllciBOZXciLCBjb3VyaWVyLCBtb25vc3BhY2U7IGJh Y2tncm91bmQtY29sb3I6ICNmMGU2OGM7IGNvbG9yOiMzMzM7IH0KI3NtZF9oZWxwIGNvZGUu YmxvY2sgeyBmb250LXdlaWdodDpub3JtYWw7IGJvcmRlcjoxcHggZG90dGVkICM5OTk7IGRp c3BsYXk6YmxvY2s7IG1hcmdpbjoxMHB4IDEwcHggMjBweDsgcGFkZGluZzoxMHB4OyB9CiNz bWRfaGVscCBoMSB7IGZvbnQ6IDIycHggR2VvcmdpYSwgc2VyaWY7IG1hcmdpbjogMDsgdGV4 dC1hbGlnbjogY2VudGVyOyB9CiNzbWRfaGVscCBoMiB7IGJvcmRlci1ib3R0b206IDFweCBz b2xpZCBibGFjazsgcGFkZGluZzoxMHB4IDAgMDsgZm9udDogMThweCBHZW9yZ2lhLCBzZXJp ZjsgfQojc21kX2hlbHAgaDMgeyBmb250OiBib2xkIDEzcHggR2VvcmdpYSwgc2VyaWY7IGxl dHRlci1zcGFjaW5nOiAxcHg7IG1hcmdpbjogMjBweCAwIDA7IHRleHQtZGVjb3JhdGlvbjp1 bmRlcmxpbmU7IH0KI3NtZF9oZWxwIGg0IHsgZm9udDogYm9sZCAxMnB4IEdlb3JnaWEsIHNl cmlmOyBsZXR0ZXItc3BhY2luZzogMXB4OyBtYXJnaW46IDEwcHggMCAwOyB0ZXh0LXRyYW5z Zm9ybTogdXBwZXJjYXNlOyB9CiNzbWRfaGVscCAuYXRubSB7IGZvbnQtd2VpZ2h0OmJvbGQ7 IH0KI3NtZF9oZWxwIC5tYW5kIHsgYmFja2dyb3VuZDojZWVlOyBib3JkZXI6MXB4IGRvdHRl ZCAjOTk5OyB9CiNzbWRfaGVscCB0YWJsZSB7IHdpZHRoOjkwJTsgdGV4dC1hbGlnbjpjZW50 ZXI7IHBhZGRpbmctYm90dG9tOjFlbTsgYm9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlOyB9CiNz bWRfaGVscCB0ZCwgI3NtZF9oZWxwIHRoIHsgYm9yZGVyOjFweCBzb2xpZCAjOTk5OyBwYWRk aW5nOi41ZW07IH0KI3NtZF9oZWxwIHVsIHsgbGlzdC1zdHlsZS10eXBlOnNxdWFyZTsgfQoj c21kX2hlbHAgLmltcG9ydGFudCB7IGNvbG9yOnJlZDsgfQojc21kX2hlbHAgbGkgeyBtYXJn aW46NXB4IDIwcHggNXB4IDMwcHg7IH0KI3NtZF9oZWxwIC5icmVhayB7IG1hcmdpbi10b3A6 NXB4OyB9CiNzbWRfaGVscCBkbCBkZCB7IG1hcmdpbjoycHggMTVweDsgfQojc21kX2hlbHAg ZGwgZGQ6YmVmb3JlIHsgY29udGVudDogIlwyMDIyXDAwYTAiOyB9CiNzbWRfaGVscCBkbCBk ZCBkbCB7IHBhZGRpbmc6IDAgMTVweDsgfQo8L3N0eWxlPgo8IS0tICoqKiBFTkQgUExVR0lO IENTUyAqKiogLS0+CiI7czo0OiJjb2RlIjtzOjI1MzM2OiIvKioNCiAqIHNtZF9tYWNybw0K ICoNCiAqIEEgVGV4dHBhdHRlcm4gQ01TIHBsdWdpbiBmb3IgY3JlYXRpbmcgbmV3IHRhZ3M6 DQogKiAgLT4gRGVmaW5lIG5ldyA8dHhwOnRhZ3M+IHRvIGRvIGFueSB0YXNrIHlvdSBsaWtl IC0tIGxpZ2h0Ym94IGVmZmVjdCwgY29tbWVudCBzY2hlbWUuLi4NCiAqICAtPiBBZGQgYXJi aXRyYXJ5IG51bWJlcnMgb2YgYXR0cmlidXRlcyBhbmQgc2V0IGRlZmF1bHRzIGlmIHlvdSB3 aXNoDQogKiAgLT4gSW1wb3J0IC8gZXhwb3J0IHlvdXIgY3JlYXRpb25zIHRvIHNoYXJlIG5l dyB0YWdzIHdpdGggdGhlIGNvbW11bml0eQ0KICoNCiAqIEBhdXRob3IgU3RlZiBEYXdzb24N CiAqIEBsaW5rICAgaHR0cDovL3N0ZWZkYXdzb24uY29tLw0KICovDQoNCmlmKEB0eHBpbnRl cmZhY2UgPT0gJ2FkbWluJykgew0KCWdsb2JhbCAkc21kX21hY3JvX2V2ZW50LCAkc21kX21h Y3JvX3N0eWxlczsNCgkkc21kX21hY3JvX2V2ZW50ID0gJ3NtZF9tYWNybyc7DQoNCglhZGRf cHJpdnMoJHNtZF9tYWNyb19ldmVudCwnMSwyJyk7DQoJcmVnaXN0ZXJfdGFiKCdjb250ZW50 JywgJHNtZF9tYWNyb19ldmVudCwgc21kX21hY3JvX2dUeHQoJ3NtZF9tYWNyb190YWJfbmFt ZScpKTsNCglyZWdpc3Rlcl9jYWxsYmFjaygnc21kX21hY3JvX2Rpc3BhdGNoZXInLCAnc21k X21hY3JvJyk7DQoJcmVnaXN0ZXJfY2FsbGJhY2soJ3NtZF9tYWNyb191cGxvYWRfZm9ybScs ICRzbWRfbWFjcm9fZXZlbnQuJ191aScsICd1cGxvYWRfZm9ybScpOw0KCXJlZ2lzdGVyX2Nh bGxiYWNrKCdzbWRfbWFjcm9fd2VsY29tZScsICdwbHVnaW5fbGlmZWN5Y2xlLnNtZF9tYWNy bycpOw0KfQ0KDQppZiAoIWRlZmluZWQoJ1NNRF9NQUNSTycpKSB7DQoJZGVmaW5lKCJTTURf TUFDUk8iLCAnc21kX21hY3JvJyk7DQp9DQoNCi8vIEJvb3RzdHJhcCB0aGUgZnVuY3Rpb24g aW5zZXJ0aW9uDQpyZWdpc3Rlcl9jYWxsYmFjaygnc21kX21hY3JvX2Jvb3QnLCAncHJldGV4 dCcpOw0KDQovLyAqKioqKioqKioqKioqKioqKioqKg0KLy8gQURNSU4gU0lERSBJTlRFUkZB Q0UNCi8vICoqKioqKioqKioqKioqKioqKioqDQoNCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLQ0KZnVuY3Rpb24gc21kX21hY3JvX2Rpc3BhdGNoZXIoJGV2dCwgJHN0cCkgew0KCWds b2JhbCAkc21kX21hY3JvX2V2ZW50Ow0KDQoJJGF2YWlsYWJsZV9zdGVwcyA9IGFycmF5KA0K CQknc21kX21hY3JvX3RhYmxlX2luc3RhbGwnID0+IHRydWUsDQoJCSdzbWRfbWFjcm9fdGFi bGVfcmVtb3ZlJyAgPT4gdHJ1ZSwNCgkJJ3NtZF9tYWNyb19wcmVmc2F2ZScgICAgICA9PiB0 cnVlLA0KCQknc21kX21hY3JvX3NhdmUnICAgICAgICAgID0+IHRydWUsDQoJCSdzbWRfbWFj cm9fZGVsZXRlJyAgICAgICAgPT4gdHJ1ZSwNCgkpOw0KDQoJaWYgKCEkc3RwIG9yICFib3Vu Y2VyKCRzdHAsICRhdmFpbGFibGVfc3RlcHMpKSB7DQoJCSRzdHAgPSAkc21kX21hY3JvX2V2 ZW50Ow0KCX0NCgkkc3RwKCk7DQp9DQoNCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0K ZnVuY3Rpb24gc21kX21hY3JvX3dlbGNvbWUoJGV2dCwgJHN0cCkgew0KCSRtc2cgPSAnJzsN Cglzd2l0Y2ggKCRzdHApIHsNCgkJY2FzZSAnaW5zdGFsbGVkJzoNCgkJCXNtZF9tYWNyb190 YWJsZV9pbnN0YWxsKDApOw0KCQkJJG1zZyA9ICdHbyBnbyBnYWRnZXQgbWFjcm8hJzsNCgkJ CWJyZWFrOw0KCQljYXNlICdkZWxldGVkJzoNCgkJCXNtZF9tYWNyb190YWJsZV9yZW1vdmUo MCk7DQoJCQlicmVhazsNCgl9DQoJcmV0dXJuICRtc2c7DQp9DQoNCg0KLy8gLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tDQpmdW5jdGlvbiBzbWRfbWFjcm8oJG1zZz0nJykgew0KCWdsb2Jh bCAkc21kX21hY3JvX2V2ZW50Ow0KDQoJaWYgKCFzbWRfbWFjcm9fdGFibGVfZXhpc3QoMSkp IHsNCgkJc21kX21hY3JvX3RhYmxlX2luc3RhbGwoMCk7DQoJfQ0KDQoJJGV4cG9ydF9saXN0 ID0gZ3BzKCdzbWRfbWFjcm9fZXhwb3J0Jyk7DQoJJG1heF9maWxlX3NpemUgPSBnZXRfcHJl Zignc21kX21hY3JvX2ltcG9ydF9maWxlc2l6ZScsIDE1ICogMTAyNCk7DQoNCglpZiAoZ3Bz KCdzdGVwJykgPT0gJ3NtZF9tYWNyb19leHBvcnQnICYmICRleHBvcnRfbGlzdCkgew0KCQkv LyBHZW5lcmF0ZSBhbiBhc3NvY2lhdGl2ZSBhcnJheSB0aGF0IGlzIHRyYW5zbGF0ZWQgdG8g YW4gaW5pIGZpbGUNCgkJJG91dCA9IGFycmF5KCk7DQoJCSRyb3dzID0gc2FmZV9yb3dzKCcq JywgU01EX01BQ1JPLCAibWFjcm9fbmFtZSBJTiAoJyIuam9pbigiJywnIiwgZG9TbGFzaCgk ZXhwb3J0X2xpc3QpKS4iJykiKTsNCgkJZm9yZWFjaCAoJHJvd3MgYXMgJHJvdykgew0KCQkJ JGF0dHMgPSB1bnNlcmlhbGl6ZSgkcm93WydhdHRyaWJ1dGVzJ10pOw0KCQkJJG91dGF0dHMg PSBhcnJheSgpOw0KCQkJZm9yZWFjaCAoJGF0dHMgYXMgJGF0dCA9PiAkdmFscykgew0KCQkJ CSRvdXRhdHRzW10gPSB1dGY4X2RlY29kZShqb2luKCd8JywgYXJyYXkoJGF0dCwgJHZhbHNb J2RlZmF1bHQnXSwgJHZhbHNbJ3JlcCddKSkpOw0KCQkJfQ0KCQkJJG91dFskcm93WydtYWNy b19uYW1lJ11dID0gYXJyYXkoDQoJCQkJJ2Rlc2NyaXB0aW9uJyA9PiAkcm93WydkZXNjcmlw dGlvbiddLA0KCQkJCSdhdHRyaWJ1dGVzJyA9PiAkb3V0YXR0cywNCgkJCQknZGVmaW5pdGlv bicgPT4gJHJvd1snZGVmaW5pdGlvbiddLA0KCQkJKTsNCgkJfQ0KDQoJCSRjb250ZW50ID0g c21kX21hY3JvX2NyZWF0ZV9pbmkoJG91dCwgYXJyYXkoJ2RlZmluaXRpb24nID0+ICdiYXNl NjRfZW5jb2RlJykpOw0KCQloZWFkZXIoIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hh cnNldD11dGYtOCIpOw0KCQloZWFkZXIoIkNvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1l bnQ7IGZpbGVuYW1lPVwic21kX21hY3Jvcy5pbmlcIiIpOw0KCQloZWFkZXIoIkNvbnRlbnQt TGVuZ3RoOiAiIC4gbWJfc3RybGVuKCRjb250ZW50KSk7DQoJCWhlYWRlcigiQ29udGVudC1U cmFuc2Zlci1FbmNvZGluZzogYmluYXJ5Iik7DQoJCWhlYWRlcigiQ2FjaGUtQ29udHJvbDog bm8tY2FjaGUsIG11c3QtcmV2YWxpZGF0ZSwgbWF4LWFnZT02MCIpOw0KCQloZWFkZXIoIkV4 cGlyZXM6IFNhdCwgMDEgSmFuIDIwMDAgMTI6MDA6MDAgR01UIik7DQoJCXByaW50KCRjb250 ZW50KTsNCgkJZXhpdDsNCg0KCX0gZWxzZSBpZiAoZ3BzKCdzdGVwJykgPT0gJ3NtZF9tYWNy b19pbXBvcnQnKSB7DQoJCSRvdmVyd3JpdGUgPSBncHMoJ3NtZF9tYWNyb19pbXBvcnRfb3Zl cndyaXRlJyk7DQoNCgkJJGZpbGUgPSBAZ2V0X3VwbG9hZGVkX2ZpbGUoJF9GSUxFU1sndGhl ZmlsZSddWyd0bXBfbmFtZSddLCBnZXRfcHJlZigndGVtcGRpcicpLkRTLmJhc2VuYW1lKCRf RklMRVNbJ3RoZWZpbGUnXVsndG1wX25hbWUnXSkpOw0KCQlpZiAoJGZpbGUgPT09IGZhbHNl KSB7DQoJCQkkbXNnID0gYXJyYXkoc21kX21hY3JvX2dUeHQoJ3NtZF9tYWNyb19jYW5ub3Rf aW1wb3J0JyksIEVfV0FSTklORyk7DQoJCX0gZWxzZSB7DQoJCQkkc2l6ZSA9IGZpbGVzaXpl KCRmaWxlKTsNCgkJCWlmICgkbWF4X2ZpbGVfc2l6ZSA8ICRzaXplKSB7DQoJCQkJJG1zZyA9 IGFycmF5KHNtZF9tYWNyb19nVHh0KCdzbWRfbWFjcm9fZmlsZV9zaXplJyksIEVfV0FSTklO Ryk7DQoJCQl9IGVsc2Ugew0KCQkJCSRpbmkgPSBAcGFyc2VfaW5pX2ZpbGUoJGZpbGUsIHRy dWUpOw0KCQkJCWlmICgkaW5pKSB7DQoJCQkJCSRkb25lID0gYXJyYXkoJ29rJyA9PiBhcnJh eSgpLCAnbm9rJyA9PiBhcnJheSgpLCAnc2tpcCcgPT4gYXJyYXkoKSk7DQoJCQkJCWZvcmVh Y2ggKCRpbmkgYXMgJGtleSA9PiAkdmFsKSB7DQoJCQkJCQkkYXR0cyA9IGFycmF5KCk7DQoJ CQkJCQkkZGVmID0gJGRlc2MgPSAnJzsNCgkJCQkJCWlmIChpc3NldCgkdmFsWydhdHRyaWJ1 dGVzJ10pKSB7DQoJCQkJCQkJZm9yZWFjaCAoJHZhbFsnYXR0cmlidXRlcyddIGFzICRhdHRs aXN0KSB7DQoJCQkJCQkJCWxpc3QoJG5hbSwgJGRmbHQsICRyZXApID0gZXhwbG9kZSgnfCcs IHV0ZjhfZW5jb2RlKCRhdHRsaXN0KSk7DQoJCQkJCQkJCSRhdHRzW3N0cnRvbG93ZXIoc3Ry X3JlcGxhY2UoJy0nLCAnXycsIHNhbml0aXplRm9yVXJsKCRuYW0pKSldID0gYXJyYXkoDQoJ CQkJCQkJCQknZGVmYXVsdCcgPT4gJGRmbHQsDQoJCQkJCQkJCQkncmVwJyA9PiAkcmVwDQoJ CQkJCQkJCSk7DQoJCQkJCQkJfQ0KCQkJCQkJfQ0KCQkJCQkJaWYgKGlzc2V0KCR2YWxbJ2Rl c2NyaXB0aW9uJ10pKSB7DQoJCQkJCQkJJGRlc2MgPSAkdmFsWydkZXNjcmlwdGlvbiddOw0K CQkJCQkJfQ0KCQkJCQkJaWYgKGlzc2V0KCR2YWxbJ2RlZmluaXRpb24nXSkpIHsNCgkJCQkJ CQkkZGVmID0gYmFzZTY0X2RlY29kZSgkdmFsWydkZWZpbml0aW9uJ10pOw0KCQkJCQkJfQ0K DQoJCQkJCQkkcmVzdWx0ID0gKHN0cmluZylzbWRfbWFjcm9fc2F2ZV9kaXJlY3QoJGtleSwg JGRlc2MsICRhdHRzLCAkZGVmLCAkb3ZlcndyaXRlKTsNCgkJCQkJCXN3aXRjaCAoJHJlc3Vs dCkgew0KCQkJCQkJCWNhc2UgJ1NNRF9NQUNST19CQURfTkFNRSc6DQoJCQkJCQkJY2FzZSAn U01EX01BQ1JPX0NMQVNIJzoNCgkJCQkJCQkJJGRvbmVbJ25vayddW10gPSAka2V5Ow0KCQkJ CQkJCQlicmVhazsNCgkJCQkJCQljYXNlICdTTURfTUFDUk9fU0tJUCc6DQoJCQkJCQkJCSRk b25lWydza2lwJ11bXSA9ICRrZXk7DQoJCQkJCQkJCWJyZWFrOw0KCQkJCQkJCWRlZmF1bHQ6 DQoJCQkJCQkJCSRkb25lWydvayddW10gPSAka2V5Ow0KCQkJCQkJCQlicmVhazsNCgkJCQkJ CX0NCgkJCQkJfQ0KCQkNCgkJCQkJJG1zZyA9ICgoJGRvbmVbJ29rJ10pID8gc21kX21hY3Jv X2dUeHQoJ3NtZF9tYWNyb19pbXBvcnRlZCcpIC4gam9pbignLCAnLCAkZG9uZVsnb2snXSku YnIgOiAnJykNCgkJCQkJCS4gKCgkZG9uZVsnc2tpcCddKSA/IHNtZF9tYWNyb19nVHh0KCdz bWRfbWFjcm9fc2tpcHBlZCcpIC4gam9pbignLCAnLCAkZG9uZVsnc2tpcCddKS5iciA6ICcn KQ0KCQkJCQkJLiAoKCRkb25lWydub2snXSkgPyBzbWRfbWFjcm9fZ1R4dCgnc21kX21hY3Jv X25vdF9pbXBvcnRlZCcpIC4gam9pbignLCAnLCAkZG9uZVsnbm9rJ10pIDogJycpOw0KCQkJ CX0gZWxzZSB7DQoJCQkJCSRtc2cgPSBhcnJheShzbWRfbWFjcm9fZ1R4dCgnc21kX21hY3Jv X2ludmFsaWRfaW5pJyksIEVfV0FSTklORyk7DQoJCQkJfQ0KCQkJfQ0KCQkJdW5saW5rKCRm aWxlKTsNCgkJfQ0KCX0gZWxzZSBpZiAoZ3BzKCdzdGVwJykgPT0gJ3NtZF9tYWNyb19jbG9u ZScpIHsNCgkJJHNvdXJjZSA9IHNhZmVfcm93KCcqJywgU01EX01BQ1JPLCAibWFjcm9fbmFt ZT0nIi5kb1NsYXNoKGdwcygnc21kX21hY3JvX25hbWUnKSkuIiciKTsNCgkJJG5hbWUgPSBn cHMoJ3NtZF9tYWNyb19uZXdfbmFtZScpOw0KCQkkZGVzYyA9ICRzb3VyY2VbJ2Rlc2NyaXB0 aW9uJ107DQoJCSRkZWYgPSAkc291cmNlWydkZWZpbml0aW9uJ107DQoJCSRhdHRzID0gJHNv dXJjZVsnYXR0cmlidXRlcyddOw0KDQoJCSRyZXN1bHQgPSAoc3RyaW5nKXNtZF9tYWNyb19z YXZlX2RpcmVjdCgkbmFtZSwgJGRlc2MsICRhdHRzLCAkZGVmLCBmYWxzZSk7DQoJCXN3aXRj aCgkcmVzdWx0KSB7DQoJCQljYXNlICdTTURfTUFDUk9fQkFEX05BTUUnOg0KCQkJCSRtc2cg PSBhcnJheShzbWRfbWFjcm9fZ1R4dCgnc21kX21hY3JvX2ludmFsaWQnKSwgRV9XQVJOSU5H KTsNCgkJCQlicmVhazsNCgkJCWNhc2UgJ1NNRF9NQUNST19DTEFTSCc6DQoJCQljYXNlICdT TURfTUFDUk9fU0tJUCc6DQoJCQkJJG1zZyA9IGFycmF5KHNtZF9tYWNyb19nVHh0KCdzbWRf bWFjcm9fZXhpc3RzJyksIEVfV0FSTklORyk7DQoJCQkJYnJlYWs7DQoJCQlkZWZhdWx0Og0K CQkJCSRtc2cgPSBzbWRfbWFjcm9fZ1R4dCgnc21kX21hY3JvX2NyZWF0ZWQnKTsNCgkJCQkk X1BPU1RbJ3NtZF9tYWNyb19uYW1lJ10gPSAkbmFtZTsgLy8gSW5qZWN0IHRoZSBuZXcgbWFj cm8gaW50byB0aGUgcG9zdCBzdHJlYW0gc28gaXQncyBzZWxlY3RlZCBieSBkZWZhdWx0DQoJ CQkJYnJlYWs7DQoJCX0NCgl9DQoNCglwYWdldG9wKHNtZF9tYWNyb19nVHh0KCdzbWRfbWFj cm9fdGFiX25hbWUnKSwgJG1zZyk7DQoNCgkkbWFjcm9zID0gc2FmZV9yb3dzKCcqJywgU01E X01BQ1JPLCAnMT0xIE9SREVSIEJZIG1hY3JvX25hbWUnKTsNCgkkbWFjcm9fbmFtZSA9ICRt YWNyb19uZXdfbmFtZSA9IGdwcygnc21kX21hY3JvX25hbWUnKTsNCgkkbWFjcm9fZGVzY3Jp cHRpb24gPSAkbWFjcm9fZGVmID0gJG1hY3JvX2NvZGUgPSAnJzsNCgkkbWFjcm9fYXR0cyA9 IGFycmF5KCk7DQoNCgkvLyBCdWlsZCB0aGUgc2VsZWN0IGxpc3QgaWYgcG9zc2libGUNCgkk bWFjcm9saXN0ID0gYXJyYXkoKTsNCglmb3JlYWNoICgkbWFjcm9zIGFzICRpZHggPT4gJG1h Y3JvKSB7DQoJCSRtYWNyb2xpc3RbJG1hY3JvWydtYWNyb19uYW1lJ11dID0gJG1hY3JvWydt YWNyb19uYW1lJ107DQoJCWlmICgkbWFjcm9bJ21hY3JvX25hbWUnXSA9PSAkbWFjcm9fbmFt ZSkgew0KCQkJJG1hY3JvX25ld19uYW1lID0gJG1hY3JvWydtYWNyb19uYW1lJ107DQoJCQkk bWFjcm9fZGVzY3JpcHRpb24gPSAkbWFjcm9bJ2Rlc2NyaXB0aW9uJ107DQoJCQkkbWFjcm9f YXR0cyA9ICRtYWNyb1snYXR0cmlidXRlcyddID8gdW5zZXJpYWxpemUoJG1hY3JvWydhdHRy aWJ1dGVzJ10pIDogYXJyYXkoKTsNCgkJCSRtYWNyb19kZWYgPSAkbWFjcm9bJ2RlZmluaXRp b24nXTsNCgkJfQ0KCX0NCgkkbWFjcm9TZWxlY3RvciA9ICgkbWFjcm9saXN0KSA/IHNlbGVj dElucHV0KCdzbWRfbWFjcm9fbmFtZScsICRtYWNyb2xpc3QsICRtYWNyb19uYW1lLCB0cnVl LCAxKSA6ICcnOw0KCSRtdWx0aV9tYWNzZWwgPSAnJzsNCglpZiAoJG1hY3JvbGlzdCkgew0K CQkkbXVsdGlfbWFjc2VsID0gJzxzZWxlY3QgbmFtZT0ic21kX21hY3JvX2V4cG9ydFtdIiBp ZD0ic21kX21hY3JvX2V4cG9ydF9saXN0IiBzaXplPSI4IiBjbGFzcz0ibGlzdCIgbXVsdGlw bGU9Im11bHRpcGxlIj4nLm47DQoJCWZvcmVhY2ggKCRtYWNyb2xpc3QgYXMgJGtleSA9PiAk dmFsKSB7DQoJCQkkbXVsdGlfbWFjc2VsIC49ICc8b3B0aW9uIHZhbHVlPSInLiRrZXkuJyIn IC4gKCgkbWFjcm9fbmFtZT09JGtleSkgPyAnIHNlbGVjdGVkPSJzZWxlY3RlZCInIDogJycp IC4nPicuJHZhbC4nPC9vcHRpb24+Jy5uOw0KCQl9DQoJCSRtdWx0aV9tYWNzZWwgLj0gJzwv c2VsZWN0Pic7DQoJfQ0KDQoJJGVkaXRjZWxsID0gKCRtYWNyb2xpc3QpID8gJzxsYWJlbD4n LnNtZF9tYWNyb19nVHh0KCdzbWRfbWFjcm9fY2hvb3NlJykuJzwvbGFiZWw+Jy5zcC4kbWFj cm9TZWxlY3RvciA6ICcnOw0KDQoJLy8gRWRpdCBmb3JtDQoJZWNobyAnPGZvcm0gaWQ9InNt ZF9tYWNyb19zZWxlY3QiIGFjdGlvbj0iaW5kZXgucGhwIiBtZXRob2Q9InBvc3QiPic7DQoJ ZWNobyBzdGFydFRhYmxlKCdzbWRfbWFjcm9fc2VsZWN0JywgJycsICcnLCAnJywgJzgwMCcp Ow0KCWVjaG8gdHIoDQoJCXRkYSgkZWRpdGNlbGwgLiBlSW5wdXQoJHNtZF9tYWNyb19ldmVu dCksICcgY2xhc3M9Im5vbGluZSIgc3R5bGU9InRleHQtYWxpZ246IHJpZ2h0OyB2ZXJ0aWNh bC1hbGlnbjogbWlkZGxlOyInKQ0KCQkpOw0KCWVjaG8gZW5kVGFibGUoKTsNCgllY2hvICc8 L2Zvcm0+JzsNCg0KCS8vIEltcG9ydCAvIGV4cG9ydCBmb3JtDQoJZWNobyBzdGFydFRhYmxl KCdzbWRfbWFjcm9faW1wZXhwJywgJycsICcnLCAnJywgJzgwMCcpOw0KCWVjaG8gdHIoDQoJ CXRkYSgNCgkJCSc8YSBpZD0ic21kX21hY3JvX2ltcG9ydCIgaHJlZj0iIyI+Jy5zbWRfbWFj cm9fZ1R4dCgnc21kX21hY3JvX2ltcG9ydCcpLic8L2E+Jw0KCQkJLigoJG11bHRpX21hY3Nl bCkNCgkJCQk/ICcgLyAnIC4gJzxhIGlkPSJzbWRfbWFjcm9fZXhwb3J0IiBocmVmPSIjIj4n LnNtZF9tYWNyb19nVHh0KCdzbWRfbWFjcm9fZXhwb3J0JykuJzwvYT4nDQoJCQkJCS4gKCgk bWFjcm9fbmFtZSkgPyAnIC8gJyAuICc8YSBpZD0ic21kX21hY3JvX2Nsb25lIiBocmVmPSIj Ij4nLnNtZF9tYWNyb19nVHh0KCdzbWRfbWFjcm9fY2xvbmUnKS4nPC9hPicgOiAnJykNCgkJ CQk6ICcnKQ0KCQkJLic8ZGl2IGlkPSJzbWRfbWFjcm9faW1wb3J0X2hvbGRlciIgY2xhc3M9 InNtZF9oaWRkZW4iPicNCgkJCS4gdXBsb2FkX2Zvcm0oc21kX21hY3JvX2dUeHQoJ3NtZF9t YWNyb191cGxvYWQnKSwgJycsICdzbWRfbWFjcm9faW1wb3J0JywgJHNtZF9tYWNyb19ldmVu dCwgJycpDQoJCQkuICc8L2Rpdj4nDQoJCQkuICgoJG11bHRpX21hY3NlbCkNCgkJCQkJPyAn PGRpdiBpZD0ic21kX21hY3JvX2V4cG9ydF9ob2xkZXIiIGNsYXNzPSJzbWRfaGlkZGVuIj48 Zm9ybSBpZD0ic21kX21hY3JvX2V4cG9ydF9mb3JtIiBhY3Rpb249ImluZGV4LnBocCIgbWV0 aG9kPSJwb3N0Ij4nDQoJCQkJCQkuICRtdWx0aV9tYWNzZWwgLiBicg0KCQkJCQkJLiBmSW5w dXQoJ3N1Ym1pdCcsICdzbWRfbWFjcm9fZXhwb3J0X2dvJywgZ1R4dCgnZ28nKSwgJycsICcn LCAnc21kX21hY3JvX2V4cG9ydF9jbG9zZSgpOycpDQoJCQkJCQkuIGVJbnB1dCgkc21kX21h Y3JvX2V2ZW50KQ0KCQkJCQkJLiBzSW5wdXQoJ3NtZF9tYWNyb19leHBvcnQnKQ0KCQkJCQkJ LiAnPC9mb3JtPjwvZGl2PicNCgkJCQkJCS4gJzxkaXYgaWQ9InNtZF9tYWNyb19jbG9uZV9o b2xkZXIiIGNsYXNzPSJzbWRfaGlkZGVuIj48Zm9ybSBpZD0ic21kX21hY3JvX2Nsb25lX2Zv cm0iIGFjdGlvbj0iaW5kZXgucGhwIiBtZXRob2Q9InBvc3QiPicNCgkJCQkJCS4gaElucHV0 KCdzbWRfbWFjcm9fbmFtZScsICRtYWNyb19uYW1lKQ0KCQkJCQkJLiBmSW5wdXQoJ3RleHQn LCAnc21kX21hY3JvX25ld19uYW1lJywgJycpDQoJCQkJCQkuIGZJbnB1dCgnc3VibWl0Jywg J3NtZF9tYWNyb19jbG9uZV9nbycsIGdUeHQoJ2dvJykpDQoJCQkJCQkuIGVJbnB1dCgkc21k X21hY3JvX2V2ZW50KQ0KCQkJCQkJLiBzSW5wdXQoJ3NtZF9tYWNyb19jbG9uZScpDQoJCQkJ CQkuIHRJbnB1dCgpDQoJCQkJCQkuICc8L2Zvcm0+PC9kaXY+Jw0KCQkJCQk6ICcnDQoJCQkJ KQ0KCQksICcgY2xhc3M9Im5vbGluZSIgc3R5bGU9InRleHQtYWxpZ246IHJpZ2h0OyB2ZXJ0 aWNhbC1hbGlnbjogbWlkZGxlOyInDQoJCSkNCgkpOw0KCWVjaG8gZW5kVGFibGUoKTsNCg0K CWVjaG8gJzxmb3JtIGlkPSJzbWRfbWFjcm9fZm9ybSIgYWN0aW9uPSJpbmRleC5waHAiIG1l dGhvZD0icG9zdCI+JzsNCgllY2hvIHN0YXJ0VGFibGUoJ2VkaXQnKTsNCgllY2hvIHRyKA0K CQlmTGFiZWxDZWxsKCduYW1lJywgJycsICdzbWRfbWFjcm9fbmV3X25hbWUnKQ0KCQkudGQo DQoJCQlmSW5wdXQoJ3RleHQnLCAnc21kX21hY3JvX25ld19uYW1lJywgJG1hY3JvX25ld19u YW1lKS5mSW5wdXQoJ2hpZGRlbicsICdzbWRfbWFjcm9fbmFtZScsICRtYWNyb19uYW1lKQ0K CQkJLigoJG1hY3JvX25hbWUgPT0gJycpID8gJycgOiBzcC4nPGEgaHJlZj0iP2V2ZW50PScu JHNtZF9tYWNyb19ldmVudC4gYS4nc3RlcD1zbWRfbWFjcm9fZGVsZXRlJyAuIGEgLiAnc21k X21hY3JvX25hbWU9Jy51cmxlbmNvZGUoJG1hY3JvX25hbWUpLiBhIC4gJ190eHBfdG9rZW49 Jy5mb3JtX3Rva2VuKCkgLiAnIiBjbGFzcz0ic21hbGxlcmJveCIgb25jbGljaz0icmV0dXJu IGNvbmZpcm0oXCcnLmdUeHQoJ2NvbmZpcm1fZGVsZXRlX3BvcHVwJykuJ1wnKTsiPlt4XTwv YT4nKQ0KCQkpDQoJKTsNCgllY2hvIHRyKA0KCQlmTGFiZWxDZWxsKCdkZXNjcmlwdGlvbics ICcnLCAnc21kX21hY3JvX2Rlc2NyaXB0aW9uJykNCgkJLnRkKA0KCQkJZklucHV0KCd0ZXh0 JywgJ3NtZF9tYWNyb19kZXNjcmlwdGlvbicsICRtYWNyb19kZXNjcmlwdGlvbiwgJycsICcn LCAnJywgJzY2JykNCgkJKQ0KCSk7DQoNCgkkYXR0bGlzdCA9IGFycmF5KCc8dGFibGUgaWQ9 InNtZF9tYWNyb19hdHRsaXN0Ij48dGhlYWQ+PHRyPjx0aD4nLmdUeHQoJ25hbWUnKS4nPC90 aD48dGg+Jy5nVHh0KCdkZWZhdWx0JykuJzwvdGg+PHRoPicuc21kX21hY3JvX2dUeHQoJ3Nt ZF9tYWNyb19yZXBuYW1lJykuJzwvdGg+PC90cj48L3RoZWFkPjx0Ym9keT4nKTsNCgkkbWFj cm9fYXR0cyA9IGVtcHR5KCRtYWNyb19hdHRzKSA/IGFycmF5KCcnID0+IGFycmF5KCdkZWZh dWx0JyA9PiAnJywgJ3JlcCcgPT4gJycpKSA6ICRtYWNyb19hdHRzOw0KDQoJZm9yZWFjaCAo JG1hY3JvX2F0dHMgYXMgJGF0dG5hbWUgPT4gJGF0dCkgew0KCQkkYXR0bGlzdFtdID0gJzx0 ciBjbGFzcz0ic21kX21hY3JvX2F0dCI+Jw0KCQkJLic8dGQ+Jy5mSW5wdXQoJ3RleHQnLCAn c21kX21hY3JvX2F0dG5hbWVbXScsICRhdHRuYW1lKS4gJzwvdGQ+Jw0KCQkJLic8dGQ+Jy5m SW5wdXQoJ3RleHQnLCAnc21kX21hY3JvX2F0dGRmbHRbXScsICRhdHRbJ2RlZmF1bHQnXSku ICc8L3RkPicNCgkJCS4nPHRkPicuZklucHV0KCd0ZXh0JywgJ3NtZF9tYWNyb19hdHRyZXBb XScsICRhdHRbJ3JlcCddKS4gJzwvdGQ+Jw0KCQkJLic8L3RyPic7DQoJfQ0KCSRhdHRsaXN0 W10gPSAnPC90Ym9keT48L3RhYmxlPic7DQoNCgkkYXR0cyA9IGpvaW4obiwgJGF0dGxpc3Qp Ow0KCWVjaG8gdHIoDQoJCXRkYSgnPGxhYmVsPicuc21kX21hY3JvX2dUeHQoJ3NtZF9tYWNy b19hdHRyaWJ1dGVzJykuJzwvbGFiZWw+Jy5zcC4nPGEgaHJlZj0iIyIgaWQ9InNtZF9tYWNy b19hdHRfYWRkIiB0aXRsZT0iJy5zbWRfbWFjcm9fZ1R4dCgnc21kX21hY3JvX2F0dF9jbG9u ZV9oZWxwJykuJyI+Jy5zbWRfbWFjcm9fZ1R4dCgnc21kX21hY3JvX2F0dF9jbG9uZScpLic8 L2E+JywgJyBjbGFzcz0ibm9saW5lIiBzdHlsZT0idGV4dC1hbGlnbjogcmlnaHQ7IHZlcnRp Y2FsLWFsaWduOiB0b3A7IicpDQoJCS50ZGEoJGF0dHMsICcgaWQ9InNtZF9tYWNyb19hdHQi JykNCgkpOw0KCWVjaG8gdHIoDQoJCXRkYSgnPGxhYmVsPicuc21kX21hY3JvX2dUeHQoJ3Nt ZF9tYWNyb190YWdfZGVmaW5pdGlvbicpLic8L2xhYmVsPicsICcgY2xhc3M9Im5vbGluZSIg c3R5bGU9InRleHQtYWxpZ246IHJpZ2h0OyB2ZXJ0aWNhbC1hbGlnbjogdG9wOyInKQ0KCQku dGRhKA0KCQkJdGV4dF9hcmVhKCdzbWRfbWFjcm9fZGVmaW5pdGlvbicsIDI1MCwgNzAwLCAk bWFjcm9fZGVmKQ0KCQkpDQoJKTsNCgllY2hvIHRyKHRkKCcmbmJzcDsnKS5lSW5wdXQoJHNt ZF9tYWNyb19ldmVudCkuc0lucHV0KCdzbWRfbWFjcm9fc2F2ZScpLnRkKGZJbnB1dCgnc3Vi bWl0JywgJ3NhdmUnLCBnVHh0KCdzYXZlJyksICdzbWFsbGVyYm94JywgJycsICcnKSkpOw0K CWVjaG8gdElucHV0KCk7DQoJZWNobyBlbmRUYWJsZSgpOw0KCWVjaG8gJzwvZm9ybT4nOw0K CWVjaG8gPDw8RU9KUw0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPg0KalF1ZXJ5 KGZ1bmN0aW9uKCkgew0KCWpRdWVyeSgnI3NtZF9tYWNyb19hdHRfYWRkJykuY2xpY2soZnVu Y3Rpb24oZXYpIHsNCgkJdmFyIG9iaiA9IGpRdWVyeSgnI3NtZF9tYWNyb19hdHRsaXN0IHRi b2R5Jyk7DQoJCXZhciBlbGVtcyA9IGpRdWVyeSgnLnNtZF9tYWNyb19hdHQnKTsNCg0KCQkv LyBBZGQgdGhlIHJvdywgZW1wdHkgaXQgYW5kIGZvY3VzLiBDYW4ndCBkbyB0aGlzIGluIGFu eSBmZXdlciBqUXVlcnkoKSBjYWxscyBmb3Igc29tZSByZWFzb24NCgkJb2JqLmFwcGVuZChv YmouY2hpbGRyZW4oKS5lcSgwKS5jbG9uZSgpKTsNCgkJb2JqLmNoaWxkcmVuKCkubGFzdCgp LmZpbmQoJ2lucHV0OnRleHQnKS52YWwoJycpOw0KCQlvYmouY2hpbGRyZW4oKS5sYXN0KCku ZmluZCgnaW5wdXQ6dGV4dCcpLmZpcnN0KCkuZm9jdXMoKTsNCgkJZXYucHJldmVudERlZmF1 bHQoKTsNCgl9KTsNCg0KCS8vIEltcG9ydCBsaW5rDQoJalF1ZXJ5KCcjc21kX21hY3JvX2lt cG9ydCcpLmNsaWNrKGZ1bmN0aW9uKGV2KSB7DQoJCWpRdWVyeSgnI3NtZF9tYWNyb19leHBv cnRfaG9sZGVyJykuaGlkZSgnbm9ybWFsJyk7DQoJCWpRdWVyeSgnI3NtZF9tYWNyb19jbG9u ZV9ob2xkZXInKS5oaWRlKCdub3JtYWwnKTsNCgkJalF1ZXJ5KCcjc21kX21hY3JvX2ltcG9y dF9ob2xkZXInKS50b2dnbGUoJ25vcm1hbCcpOw0KCX0pOw0KDQoJLy8gRXhwb3J0IGxpbmsN CglqUXVlcnkoJyNzbWRfbWFjcm9fZXhwb3J0JykuY2xpY2soZnVuY3Rpb24oZXYpIHsNCgkJ alF1ZXJ5KCcjc21kX21hY3JvX2ltcG9ydF9ob2xkZXInKS5oaWRlKCdub3JtYWwnKTsNCgkJ alF1ZXJ5KCcjc21kX21hY3JvX2Nsb25lX2hvbGRlcicpLmhpZGUoJ25vcm1hbCcpOw0KCQlq UXVlcnkoJyNzbWRfbWFjcm9fZXhwb3J0X2hvbGRlcicpLnRvZ2dsZSgnbm9ybWFsJyk7DQoJ fSk7DQoNCgkvLyBDbG9uZSBsaW5rDQoJalF1ZXJ5KCcjc21kX21hY3JvX2Nsb25lJykuY2xp Y2soZnVuY3Rpb24oZXYpIHsNCgkJalF1ZXJ5KCcjc21kX21hY3JvX2ltcG9ydF9ob2xkZXIn KS5oaWRlKCdub3JtYWwnKTsNCgkJalF1ZXJ5KCcjc21kX21hY3JvX2V4cG9ydF9ob2xkZXIn KS5oaWRlKCdub3JtYWwnKTsNCgkJalF1ZXJ5KCcjc21kX21hY3JvX2Nsb25lX2hvbGRlcicp LnRvZ2dsZSgnbm9ybWFsJykuZmluZCgiaW5wdXRbbmFtZT0nc21kX21hY3JvX25ld19uYW1l J10iKS5mb2N1cygpOw0KCX0pOw0KfSk7DQpmdW5jdGlvbiBzbWRfbWFjcm9fZXhwb3J0X2Ns b3NlKCkgew0KCWpRdWVyeSgiI3NtZF9tYWNyb19leHBvcnQiKS5jbGljaygpOw0KfQ0KPC9z Y3JpcHQ+DQo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KLnNtZF9oaWRkZW4gew0KCWRpc3Bs YXk6bm9uZTsNCn0NCiNzbWRfbWFjcm9faW1wb3J0X2hvbGRlciAudXBsb2FkLWZvcm0gew0K CXRleHQtYWxpZ246cmlnaHQhaW1wb3J0YW50Ow0KCXdpZHRoOjgwMHB4Ow0KfQ0KPC9zdHls ZT4NCkVPSlM7DQp9DQoNCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8gQWRkIGFu IG92ZXJ3cml0ZSBjaGVja2JveCB0byB0aGUgdXBsb2FkIGZvcm0NCmZ1bmN0aW9uIHNtZF9t YWNyb191cGxvYWRfZm9ybSgkZXZ0LCAkc3RwLCAkZGF0YSwgJGFyZ3MpIHsNCgkkcmV0ID0g c3RyX3JlcGxhY2UoDQoJCSc8L2Rpdj4nDQoJCSwgIGNoZWNrYm94KCdzbWRfbWFjcm9faW1w b3J0X292ZXJ3cml0ZScsICcxJywgMCkgLiBzbWRfbWFjcm9fZ1R4dCgnc21kX21hY3JvX292 ZXJ3cml0ZScpIC4gJzwvZGl2PicNCgkJLCAkZGF0YQ0KCSk7DQoJcmV0dXJuICRyZXQ7DQp9 DQoNCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8gVGFrZXMgZnVuY3Rpb24gcGFy YW1zOyBhc3N1bWVzIGF0dHJpYnV0ZSBzYW5pdGl6YXRpb24gZG9uZSBhbHJlYWR5DQpmdW5j dGlvbiBzbWRfbWFjcm9fc2F2ZV9kaXJlY3QoJG5hbWU9JycsICRkZXNjPScnLCAkYXR0cz1h cnJheSgpLCAkZGVmPScnLCAkb3ZlcndyaXRlID0gZmFsc2UpIHsNCglnbG9iYWwgJHNtZF9t YWNyb19ldmVudDsNCg0KCSRzbWRfbWFjcm9fbmV3X25hbWUgPSBzYW5pdGl6ZUZvclVybCgk bmFtZSk7DQoJJHNtZF9tYWNyb19kZXNjcmlwdGlvbiA9IGRvU2xhc2goJGRlc2MpOw0KCSRz bWRfbWFjcm9fZGVmaW5pdGlvbiA9ICRkZWY7DQoNCgkkcmV0ID0gJyc7DQoNCglpZiAoc21k X21hY3JvX3ZhbGlkKCRzbWRfbWFjcm9fbmV3X25hbWUpKSB7DQoJCSRjb2RlID0gZG9TbGFz aChzbWRfbWFjcm9fYnVpbGQoJHNtZF9tYWNyb19uZXdfbmFtZSwgJGF0dHMsICRzbWRfbWFj cm9fZGVmaW5pdGlvbikpOw0KDQoJCSRzbWRfbWFjcm9fZGVmaW5pdGlvbiA9IGRvU2xhc2go JHNtZF9tYWNyb19kZWZpbml0aW9uKTsNCgkJJHNtZF9tYWNyb19hdHRzID0gaXNfYXJyYXko JGF0dHMpID8gc2VyaWFsaXplKCRhdHRzKSA6ICRhdHRzOw0KDQoJCWlmIChzbWRfbWFjcm9f dGFibGVfZXhpc3QoKSkgew0KCQkJLy8gQ2hlY2sgaWYgdGhpcyBtYWNybyBuYW1lIGNsYXNo ZXMgd2l0aCBhIGJ1aWx0LWluIFBIUC9UeHAgZnVuY3Rpb24NCgkJCSRleGlzdHMgPSBzbWRf bWFjcm9fZXhpc3RzKCRzbWRfbWFjcm9fbmV3X25hbWUsIGZhbHNlKTsNCgkJCWlmICgkZXhp c3RzID09PSBmYWxzZSkgew0KCQkJCSRpbmRiID0gc2FmZV9maWVsZCgnbWFjcm9fbmFtZScs IFNNRF9NQUNSTywgIm1hY3JvX25hbWU9JyRzbWRfbWFjcm9fbmV3X25hbWUnIik7DQoNCgkJ CQlpZiAoJGluZGIpIHsNCgkJCQkJaWYgKCRvdmVyd3JpdGUpIHsNCgkJCQkJCS8vIFVwZGF0 ZQ0KCQkJCQkJJHJldCA9IHNhZmVfdXBkYXRlKFNNRF9NQUNSTywgIm1hY3JvX25hbWU9JyRz bWRfbWFjcm9fbmV3X25hbWUnLCBkZXNjcmlwdGlvbj0nJHNtZF9tYWNyb19kZXNjcmlwdGlv bicsIGF0dHJpYnV0ZXM9JyRzbWRfbWFjcm9fYXR0cycsIGRlZmluaXRpb249JyRzbWRfbWFj cm9fZGVmaW5pdGlvbicsIGNvZGU9JyRjb2RlJyIsICJtYWNyb19uYW1lPSckc21kX21hY3Jv X25ld19uYW1lJyIpOw0KCQkJCQl9IGVsc2Ugew0KCQkJCQkJJHJldCA9ICdTTURfTUFDUk9f U0tJUCc7DQoJCQkJCX0NCgkJCQl9IGVsc2Ugew0KCQkJCQkvLyBJbnNlcnQNCgkJCQkJJHJl dCA9IHNhZmVfaW5zZXJ0KFNNRF9NQUNSTywgIm1hY3JvX25hbWU9JyRzbWRfbWFjcm9fbmV3 X25hbWUnLCBkZXNjcmlwdGlvbj0nJHNtZF9tYWNyb19kZXNjcmlwdGlvbicsIGF0dHJpYnV0 ZXM9JyRzbWRfbWFjcm9fYXR0cycsIGRlZmluaXRpb249JyRzbWRfbWFjcm9fZGVmaW5pdGlv bicsIGNvZGU9JyRjb2RlJyIpOw0KCQkJCX0NCgkJCX0gZWxzZSB7DQoJCQkJJHJldCA9ICdT TURfTUFDUk9fQ0xBU0gnOw0KCQkJfQ0KCQl9DQoJfSBlbHNlIHsNCgkJJHJldCA9ICdTTURf TUFDUk9fQkFEX05BTUUnOw0KCX0NCg0KCS8vICRyZXQgbWF5IGJlIGVtcHR5IG9ubHkgaWYg bWFjcm8gdGFibGUgbm90IGluc3RhbGxlZA0KCXJldHVybiAkcmV0Ow0KfQ0KDQovLyAtLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vIFRha2VzIFVSTCBwYXJhbXM7IHNhbml0aXplcyBh dHRyaWJ1dGVzIGxvY2FsbHkNCmZ1bmN0aW9uIHNtZF9tYWNyb19zYXZlKCkgew0KCWdsb2Jh bCAkc21kX21hY3JvX2V2ZW50Ow0KDQoJZXh0cmFjdChkb1NsYXNoKGdwc2EoYXJyYXkoDQoJ CSdzbWRfbWFjcm9fbmFtZScsDQoJCSdzbWRfbWFjcm9fbmV3X25hbWUnLA0KCQknc21kX21h Y3JvX2Rlc2NyaXB0aW9uJywNCgkpKSkpOw0KDQoJJG1zZyA9ICcnOw0KCSRzbWRfbWFjcm9f bmV3X25hbWUgPSBzYW5pdGl6ZUZvclVybCgkc21kX21hY3JvX25ld19uYW1lKTsNCg0KCWlm IChzbWRfbWFjcm9fdmFsaWQoJHNtZF9tYWNyb19uZXdfbmFtZSkpIHsNCgkJJGF0dF9uYW1l ID0gZ3BzKCdzbWRfbWFjcm9fYXR0bmFtZScpOw0KCQkkYXR0X2RmbHQgPSBncHMoJ3NtZF9t YWNyb19hdHRkZmx0Jyk7DQoJCSRhdHRfcmVwID0gZ3BzKCdzbWRfbWFjcm9fYXR0cmVwJyk7 DQoNCgkJLy8gRG9uJ3QgZG9TbGFzaCgpIHRoaXMgeWV0DQoJCSRzbWRfbWFjcm9fZGVmaW5p dGlvbiA9IGdwcygnc21kX21hY3JvX2RlZmluaXRpb24nKTsNCg0KCQkkYXR0cyA9IGFycmF5 KCk7DQoJCWZvcmVhY2goJGF0dF9uYW1lIGFzICRpZHggPT4gJGF0dCkgew0KCQkJaWYgKCRh dHQgPT0gJycpIGNvbnRpbnVlOw0KCQkJJGF0dHNbc3RydG9sb3dlcihzdHJfcmVwbGFjZSgn LScsICdfJywgc2FuaXRpemVGb3JVcmwoJGF0dCkpKV0gPSBhcnJheSgNCgkJCQknZGVmYXVs dCcgPT4gJGF0dF9kZmx0WyRpZHhdLA0KCQkJCSdyZXAnID0+ICRhdHRfcmVwWyRpZHhdDQoJ CQkpOw0KCQl9DQoJCQ0KCQkkY29kZSA9IGRvU2xhc2goc21kX21hY3JvX2J1aWxkKCRzbWRf bWFjcm9fbmV3X25hbWUsICRhdHRzLCAkc21kX21hY3JvX2RlZmluaXRpb24pKTsNCgkJJHNt ZF9tYWNyb19kZWZpbml0aW9uID0gZG9TbGFzaCgkc21kX21hY3JvX2RlZmluaXRpb24pOw0K CQkkc21kX21hY3JvX2F0dHMgPSBzZXJpYWxpemUoJGF0dHMpOw0KDQoJCWlmIChzbWRfbWFj cm9fdGFibGVfZXhpc3QoKSkgew0KCQkJJGV4aXN0cyA9ICgkc21kX21hY3JvX25hbWUgIT0g JHNtZF9tYWNyb19uZXdfbmFtZSkgJiYgc21kX21hY3JvX2V4aXN0cygkc21kX21hY3JvX25l d19uYW1lKTsNCgkJCWlmICgkZXhpc3RzID09PSBmYWxzZSkgew0KCQkJCS8vIEluamVjdCB0 aGUgbmV3IG5hbWUgc28gaXQncyBzZWxlY3RlZCBpbiB0aGUgZHJvcGRvd24gaWYgcmVuYW1l ZA0KCQkJCSRfUE9TVFsnc21kX21hY3JvX25hbWUnXSA9ICRzbWRfbWFjcm9fbmV3X25hbWU7 DQoJCQkJDQoJCQkJaWYgKCRzbWRfbWFjcm9fbmFtZSA9PSAnJykgew0KCQkJCQkvLyBJbnNl cnQNCgkJCQkJJHJldCA9IHNhZmVfaW5zZXJ0KFNNRF9NQUNSTywgIm1hY3JvX25hbWU9JyRz bWRfbWFjcm9fbmV3X25hbWUnLCBkZXNjcmlwdGlvbj0nJHNtZF9tYWNyb19kZXNjcmlwdGlv bicsIGF0dHJpYnV0ZXM9JyRzbWRfbWFjcm9fYXR0cycsIGRlZmluaXRpb249JyRzbWRfbWFj cm9fZGVmaW5pdGlvbicsIGNvZGU9JyRjb2RlJyIpOw0KCQkJCQkkbXNnID0gc21kX21hY3Jv X2dUeHQoJ3NtZF9tYWNyb19jcmVhdGVkJyk7DQoJCQkJfSBlbHNlIHsNCgkJCQkJLy8gVXBk YXRlDQoJCQkJCSRyZXQgPSBzYWZlX3VwZGF0ZShTTURfTUFDUk8sICJtYWNyb19uYW1lPSck c21kX21hY3JvX25ld19uYW1lJywgZGVzY3JpcHRpb249JyRzbWRfbWFjcm9fZGVzY3JpcHRp b24nLCBhdHRyaWJ1dGVzPSckc21kX21hY3JvX2F0dHMnLCBkZWZpbml0aW9uPSckc21kX21h Y3JvX2RlZmluaXRpb24nLCBjb2RlPSckY29kZSciLCAibWFjcm9fbmFtZT0nJHNtZF9tYWNy b19uYW1lJyIpOw0KCQkJCQkkbXNnID0gc21kX21hY3JvX2dUeHQoJ3NtZF9tYWNyb19zYXZl ZCcpOw0KCQkJCX0NCgkJCX0gZWxzZSB7DQoJCQkJJG1zZyA9IGFycmF5KHNtZF9tYWNyb19n VHh0KCdzbWRfbWFjcm9fZXhpc3RzJyksIEVfV0FSTklORyk7DQoJCQl9DQoJCX0NCgl9IGVs c2Ugew0KCQkkbXNnID0gYXJyYXkoc21kX21hY3JvX2dUeHQoJ3NtZF9tYWNyb19pbnZhbGlk JyksIEVfV0FSTklORyk7DQoJfQ0KCXNtZF9tYWNybygkbXNnKTsNCn0NCg0KLy8gLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tDQpmdW5jdGlvbiBzbWRfbWFjcm9fZGVsZXRlKCkgew0KCWds b2JhbCAkc21kX21hY3JvX2V2ZW50Ow0KDQoJJG1hY3JvX25hbWUgPSBkb1NsYXNoKGdwcygn c21kX21hY3JvX25hbWUnKSk7DQoNCgkkcmV0ID0gc2FmZV9kZWxldGUoU01EX01BQ1JPLCAi bWFjcm9fbmFtZT0nJG1hY3JvX25hbWUnIik7DQoJJG1zZyA9IHNtZF9tYWNyb19nVHh0KCdz bWRfbWFjcm9fZGVsZXRlZCcpOw0KDQoJJF9HRVRbJ3NtZF9tYWNyb19uYW1lJ10gPSAnJzsN Cg0KCXNtZF9tYWNybygkbXNnKTsNCn0NCg0KLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t DQovLyBDaGVjayB0aGUgbWFjcm8gZG9lc24ndCBleGlzdCBhbmQgYWxzbyB0aGF0IGl0IGRv ZXNuJ3QgY2xhc2ggd2l0aCBhbiBpbnRlcm5hbCBQSFAvVHhwIGZ1bmN0aW9uDQpmdW5jdGlv biBzbWRfbWFjcm9fZXhpc3RzKCRtYWNybywgJGNoZWNrX2RiID0gdHJ1ZSkgew0KCSRyZXQg PSAoJGNoZWNrX2RiKSA/IHNhZmVfZmllbGQoJ21hY3JvX25hbWUnLCBTTURfTUFDUk8sICJt YWNyb19uYW1lPSckbWFjcm8nIikgOiBmYWxzZTsNCglpZiAoJHJldCA9PT0gZmFsc2UpIHsN CgkJJGZucyA9IGdldF9kZWZpbmVkX2Z1bmN0aW9ucygpOw0KCQlmb3JlYWNoICgkZm5zIGFz ICRmbGlzdCkgew0KCQkJaWYgKCRyZXQgPT09IGZhbHNlKSB7DQoJCQkJJHJldCA9IGluX2Fy cmF5KCRtYWNybywgJGZsaXN0KTsNCgkJCX0NCgkJfQ0KCX0NCglyZXR1cm4gJHJldDsNCn0N Ci8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8gQ2hlY2sgdGhlIG1hY3JvIG5hbWUg aXMgYSB2YWxpZCBQSFAgZnVuY3Rpb24gbmFtZQ0KZnVuY3Rpb24gc21kX21hY3JvX3ZhbGlk KCRtYWNybykgew0KCXJldHVybiBpc19jYWxsYWJsZSgkbWFjcm8sIHRydWUpICYmIHByZWdf bWF0Y2goJy9eW2EtekEtWl9ceDdmLVx4ZmZdW2EtekEtWjAtOV9ceDdmLVx4ZmZdKiQvJywg JG1hY3JvKTsNCn0NCg0KLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpmdW5jdGlvbiBz bWRfbWFjcm9fYnVpbGQoJG1hY3JvLCAkYXJncywgJGRlZikgew0KCSRhcmdsaXN0ID0gJHJl cHMgPSBhcnJheSgpOw0KCSRsQXR0cyA9ICcnOw0KDQoJLy8gVmFsaWRhdGUgbWFjcm8gbmFt ZSBhbmQgYmFpbCBpZiBpdCdkIGNhdXNlIHByb2JsZW1zDQoJLy8gQnVpbGQgYXJnIGxpc3Qg YW5kIHJlcGxhY2VtZW50cyBhcnJheS4NCgkvLyBSZXBsYWNlbWVudHMgYXJlIHByZWZpeGVk IHdpdGggdGhlIG5hbWUgb2YgdGhlIG1hY3JvIGZvciBjbGFzaCBtaW5pbWlzYXRpb24NCgkk YXJncyA9IGlzX2FycmF5KCRhcmdzKSA/ICRhcmdzIDogdW5zZXJpYWxpemUoJGFyZ3MpOw0K CWZvcmVhY2ggKCRhcmdzIGFzICRhcmcgPT4gJHZhbHMpIHsNCgkJJGFyZ2xpc3RbXSA9ICIn JGFyZycgPT4gJyIuJHZhbHNbJ2RlZmF1bHQnXS4iJyI7DQoJCSRyZXAgPSBlbXB0eSgkdmFs c1sncmVwJ10pID8gJGFyZyA6ICR2YWxzWydyZXAnXTsNCgkJJHJlcHNbXSA9ICcieycgLiAk cmVwIC4gJ30iID0+ICIkJy4kbWFjcm8uJ18nLiRhcmcuJyInOw0KCX0NCgkkcmVwc1tdID0g JyJ7c21kX2NvbnRhaW5lcn0iID0+ICIkJy4kbWFjcm8uJ19zbWRfY29udGFpbmVyIic7DQoJ JGFyZ19zdHJpbmcgPSBqb2luKCcsJy5uLCAkYXJnbGlzdCk7DQoJJHJlcF9zdHJpbmcgPSBq b2luKCcsJy5uLCAkcmVwcyk7DQoJJGRlZiA9IGRvU2xhc2goJGRlZik7DQoNCgkvLyBPbmx5 IGNyZWF0ZSBsQXR0cyBpZiB0aGVyZSdzIGF0IGxlYXN0IG9uZSBhdHRyaWJ1dGUgZGVmaW5l ZA0KCWlmICgkYXJnX3N0cmluZykgew0KCQkkbEF0dHMgPSA8PDxFT0FUVA0KZXh0cmFjdChs QXR0cyhhcnJheSgNCgkJeyRhcmdfc3RyaW5nfQ0KCSksXCRhdHRzKSwgRVhUUl9QUkVGSVhf QUxMLCAneyRtYWNyb30nKTsNCkVPQVRUOw0KCX0NCg0KJGZ1bGxfbWFjcm8gPSA8PDwgRU9G Tg0KZnVuY3Rpb24geyRtYWNyb30oXCRhdHRzLCBcJHRoaW5nID0gTlVMTCkgew0KCXskbEF0 dHN9DQoJXCR7JG1hY3JvfV9zbWRfY29udGFpbmVyID0gKFwkdGhpbmcpPyBcJHRoaW5nIDog KGlzc2V0KFwkeyRtYWNyb31fc21kX2NvbnRhaW5lcikgPyBcJHskbWFjcm99X3NtZF9jb250 YWluZXIgOiAnJyk7DQoJXCRvdXQgPSAnJzsNCglcJG91dCA9IHN0cnRyKHN0cmlwc2xhc2hl cygneyRkZWZ9JyksIGFycmF5KHskcmVwX3N0cmluZ30pKTsNCglyZXR1cm4gcGFyc2UoXCRv dXQpOw0KfQ0KRU9GTjsNCg0KCXJldHVybiAkZnVsbF9tYWNybzsNCn0NCg0KLy8gLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tDQovLyBDcmVhdGUgaW5pIGZpbGUgY29udGVudHMgYW5kIHJl dHVybiBpdC4NCi8vICRzcGVjaWFsIGlzIGFuIGFycmF5IG9mIGtleW5hbWVzIGFuZCBhIGZ1 bmN0aW9uIHRvIGFwcGx5IHRvIHRoZW0gKGUuZy4gJ2RlZmluaXRpb24nID0+ICdiYXNlNjRf ZW5jb2RlJykNCmZ1bmN0aW9uIHNtZF9tYWNyb19jcmVhdGVfaW5pKCRhcnIsICRzcGVjaWFs PWFycmF5KCkpIHsNCgkkY29udGVudCA9ICcnOw0KCWZvcmVhY2ggKCRhcnIgYXMgJGtleSA9 PiAkZWxlbSkgew0KCQkkY29udGVudCAuPSAiWyIuJGtleS4iXVxuIjsNCgkJZm9yZWFjaCAo JGVsZW0gYXMgJHN1YmtleSA9PiAkc3ViZWxlbSkgew0KCQkJJHN1YmVsZW0gPSAoYXJyYXlf a2V5X2V4aXN0cygkc3Via2V5LCAkc3BlY2lhbCkpID8gZG9BcnJheSgkc3ViZWxlbSwgJHNw ZWNpYWxbJHN1YmtleV0pIDogJHN1YmVsZW07DQoJCQlpZihpc19hcnJheSgkc3ViZWxlbSkp IHsNCgkJCQkkbnVtID0gY291bnQoJHN1YmVsZW0pOw0KCQkJCWZvcigkaWR4ID0gMDsgJGlk eCA8ICRudW07ICRpZHgrKykgew0KCQkJCQkkY29udGVudCAuPSAkc3Via2V5IC4gIltdID0g XCIiIC4gJHN1YmVsZW1bJGlkeF0gLiAiXCJcbiI7DQoJCQkJfQ0KCQkJfSBlbHNlIGlmKCRz dWJlbGVtID09ICIiKSB7DQoJCQkJJGNvbnRlbnQgLj0gJHN1YmtleSAuICIgPSBcbiI7DQoJ CQl9IGVsc2Ugew0KCQkJCSRjb250ZW50IC49ICRzdWJrZXkgLiAiID0gXCIiIC4gJHN1YmVs ZW0gLiAiXCJcbiI7DQoJCQl9DQoJCX0NCgl9DQoNCglyZXR1cm4gJGNvbnRlbnQ7DQp9DQoN Ci8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8gQWRkIG1hY3JvIHRhYmxlIGlmIG5v dCBhbHJlYWR5IGluc3RhbGxlZA0KZnVuY3Rpb24gc21kX21hY3JvX3RhYmxlX2luc3RhbGwo JHNob3dwYW5lPScxJykgew0KCWdsb2JhbCAkREI7DQoNCgkkR0xPQkFMU1sndHhwX2Vycl9j b3VudCddID0gMDsNCgkkcmV0ID0gJyc7DQoJJHNxbCA9IGFycmF5KCk7DQoJJHNxbFtdID0g IkNSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTIGAiLlBGWC5TTURfTUFDUk8uImAgKA0KCQlg bWFjcm9fbmFtZWAgdmFyY2hhcigzMikgTk9UIE5VTEwgZGVmYXVsdCAnJywNCgkJYGRlc2Ny aXB0aW9uYCB2YXJjaGFyKDI1NSkgTlVMTCBkZWZhdWx0ICcnIENPTExBVEUgdXRmOF9nZW5l cmFsX2NpLA0KCQlgYXR0cmlidXRlc2AgdGV4dCBOVUxMIGRlZmF1bHQgJycgQ09MTEFURSB1 dGY4X2dlbmVyYWxfY2ksDQoJCWBkZWZpbml0aW9uYCBtZWRpdW10ZXh0IE5VTEwgZGVmYXVs dCAnJyBDT0xMQVRFIHV0ZjhfZ2VuZXJhbF9jaSwNCgkJYGNvZGVgIG1lZGl1bXRleHQgTlVM TCBkZWZhdWx0ICcnLA0KCQlQUklNQVJZIEtFWSAoYG1hY3JvX25hbWVgKQ0KCSkgRU5HSU5F PU15SVNBTSwgQ0hBUkFDVEVSIFNFVD11dGY4IjsNCg0KCWlmKGdwcygnZGVidWcnKSkgew0K CQlkbXAoJHNxbCk7DQoJfQ0KCWZvcmVhY2ggKCRzcWwgYXMgJHFyeSkgew0KCQkkcmV0ID0g c2FmZV9xdWVyeSgkcXJ5KTsNCgkJaWYgKCRyZXQ9PT1mYWxzZSkgew0KCQkJJEdMT0JBTFNb J3R4cF9lcnJfY291bnQnXSsrOw0KCQkJZWNobyAiPGI+Ii4kR0xPQkFMU1sndHhwX2Vycl9j b3VudCddLiIuPC9iPiAiLm15c3FsX2Vycm9yKCkuIjxiciAvPlxuIjsNCgkJCWVjaG8gIjwh LS1cbiAkcXJ5IFxuLS0+XG4iOw0KCQl9DQoJfQ0KDQoJJGZsZHMgPSBnZXRUaGluZ3MoJ2Rl c2NyaWJlIGAnLlBGWC5TTURfTUFDUk8uJ2AnKTsNCglpZiAoIWluX2FycmF5KCdkZWZpbml0 aW9uJywkZmxkcykpIHsNCgkJc2FmZV9hbHRlcihTTURfTUFDUk8sICJhZGQgYGRlZmluaXRp b25gIG1lZGl1bXRleHQgTlVMTCBkZWZhdWx0ICcnIGFmdGVyIGBhdHRyaWJ1dGVzYCIpOw0K CX0NCg0KCS8vIFVwZ3JhZGUgdGFibGUgY29sbGF0aW9uIGlmIG5lY2Vzc2FyeQ0KCSRyZXQg PSBAc2FmZV9maWVsZCgiQ09MTEFUSU9OX05BTUUiLCAiSU5GT1JNQVRJT05fU0NIRU1BLkNP TFVNTlMiLCAidGFibGVfbmFtZSA9ICciLlBGWC5TTURfTUFDUk8uIicgQU5EIHRhYmxlX3Nj aGVtYSA9ICciIC4gJERCLT5kYiAuICInIEFORCBjb2x1bW5fbmFtZSA9ICdkZXNjcmlwdGlv biciKTsNCglpZiAoJHJldCAhPSAndXRmOF9nZW5lcmFsX2NpJykgew0KCQkkcmV0ID0gc2Fm ZV9hbHRlcihTTURfTUFDUk8sICdDT05WRVJUIFRPIENIQVJBQ1RFUiBTRVQgdXRmOCBDT0xM QVRFIHV0ZjhfZ2VuZXJhbF9jaScpOw0KCX0NCg0KCS8vIFNwaXQgb3V0IHJlc3VsdHMNCglp ZiAoJEdMT0JBTFNbJ3R4cF9lcnJfY291bnQnXSA9PSAwKSB7DQoJCWlmICgkc2hvd3BhbmUp IHsNCgkJCSRtc2cgPSBzbWRfbWFjcm9fZ1R4dCgnc21kX21hY3JvX3RibF9pbnN0YWxsZWQn KTsNCgkJCXNtZF9tYWNybygkbXNnKTsNCgkJfQ0KCX0gZWxzZSB7DQoJCWlmICgkc2hvd3Bh bmUpIHsNCgkJCSRtc2cgPSBzbWRfbWFjcm9fZ1R4dCgnc21kX21hY3JvX3RibF9ub3RfaW5z dGFsbGVkJyk7DQoJCQlzbWRfbWFjcm8oJG1zZyk7DQoJCX0NCgl9DQp9DQoNCi8vIC0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8gRHJvcCB0YWJsZSBpZiBpbiBkYXRhYmFzZQ0KZnVu Y3Rpb24gc21kX21hY3JvX3RhYmxlX3JlbW92ZSgpIHsNCgkkcmV0ID0gJyc7DQoJJHNxbCA9 IGFycmF5KCk7DQoJJEdMT0JBTFNbJ3R4cF9lcnJfY291bnQnXSA9IDA7DQoJaWYgKHNtZF9t YWNyb190YWJsZV9leGlzdCgpKSB7DQoJCSRzcWxbXSA9ICJEUk9QIFRBQkxFIElGIEVYSVNU UyAiIC5QRlguU01EX01BQ1JPLiAiOyAiOw0KCQlpZihncHMoJ2RlYnVnJykpIHsNCgkJCWRt cCgkc3FsKTsNCgkJfQ0KCQlmb3JlYWNoICgkc3FsIGFzICRxcnkpIHsNCgkJCSRyZXQgPSBz YWZlX3F1ZXJ5KCRxcnkpOw0KCQkJaWYgKCRyZXQ9PT1mYWxzZSkgew0KCQkJCSRHTE9CQUxT Wyd0eHBfZXJyX2NvdW50J10rKzsNCgkJCQllY2hvICI8Yj4iLiRHTE9CQUxTWyd0eHBfZXJy X2NvdW50J10uIi48L2I+ICIubXlzcWxfZXJyb3IoKS4iPGJyIC8+XG4iOw0KCQkJCWVjaG8g IjwhLS1cbiAkcXJ5IFxuLS0+XG4iOw0KCQkJfQ0KCQl9DQoJfQ0KCWlmICgkR0xPQkFMU1sn dHhwX2Vycl9jb3VudCddID09IDApIHsNCgkJJG1zZyA9IHNtZF9tYWNyb19nVHh0KCdzbWRf bWFjcm9fdGJsX3JlbW92ZWQnKTsNCgl9IGVsc2Ugew0KCQkkbXNnID0gc21kX21hY3JvX2dU eHQoJ3NtZF9tYWNyb190Ymxfbm90X3JlbW92ZWQnKTsNCgkJc21kX21hY3JvKCRtc2cpOw0K CX0NCn0NCg0KLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpmdW5jdGlvbiBzbWRfbWFj cm9fdGFibGVfZXhpc3QoJGFsbD0nJykgew0KCWlmICgkYWxsKSB7DQoJCSR0YmxzID0gYXJy YXkoU01EX01BQ1JPID0+IDUpOw0KCQkkb3V0ID0gY291bnQoJHRibHMpOw0KCQlmb3JlYWNo ICgkdGJscyBhcyAkdGJsID0+ICRjb2xzKSB7DQoJCQlpZiAoZ3BzKCdkZWJ1ZycpKSB7DQoJ CQkJZWNobyAiKysgVEFCTEUgIi4kdGJsLiIgSEFTICIuY291bnQoQHNhZmVfc2hvdygnY29s dW1ucycsICR0YmwpKS4iIENPTFVNTlM7IFJFUVVJUkVTICIuJGNvbHMuIiArKyIuYnI7DQoJ CQl9DQoJCQlpZiAoY291bnQoQHNhZmVfc2hvdygnY29sdW1ucycsICR0YmwpKSA9PSAkY29s cykgew0KCQkJCSRvdXQtLTsNCgkJCX0NCgkJfQ0KCQlyZXR1cm4gKCRvdXQ9PT0wKSA/IDEg OiAwOw0KCX0gZWxzZSB7DQoJCWlmIChncHMoJ2RlYnVnJykpIHsNCgkJCWVjaG8gIisrIFRB QkxFICIuU01EX01BQ1JPLiIgSEFTICIuY291bnQoQHNhZmVfc2hvdygnY29sdW1ucycsIFNN RF9NQUNSTykpLiIgQ09MVU1OUzsiOw0KCQl9DQoJCXJldHVybihAc2FmZV9zaG93KCdjb2x1 bW5zJywgU01EX01BQ1JPKSk7DQoJfQ0KfQ0KDQovLyAqKioqKioqKioqKioqKioqKioqKioN Ci8vIFBVQkxJQyBTSURFIElOVEVSRkFDRQ0KLy8gKioqKioqKioqKioqKioqKioqKioqDQoN Ci8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8gRXh0cmFjdHMgYWxsIHByZWJ1aWx0 IG1hY3JvcyAoZXNzZW50aWFsbHksIG5ldyB0YWdzKSBhbmQgaW5qZWN0cyB0aGVtIGludG8g dGhlIGdsb2JhbCBzY29wZSBzbyB0aGV5IGNhbiBiZSBjYWxsZWQNCmZ1bmN0aW9uIHNtZF9t YWNyb19ib290KCkgew0KCSRmdWxsX21hY3JvcyA9IGFycmF5KCk7DQoNCgkkcnMgPSBzYWZl X3Jvd3MoJyonLCBTTURfTUFDUk8sICcxPTEnKTsNCg0KCWZvcmVhY2ggKCRycyBhcyAkcm93 KSB7DQoJCSRmdWxsX21hY3Jvc1tdID0gc3RyX3JlcGxhY2UoJ1xyXG4nLCcNCicsJHJvd1sn Y29kZSddKTsgLy8geXVra3kgbmV3bGluZSB3b3JrYXJvdW5kDQoJfQ0KDQoJJG1hY3JvcyA9 IGpvaW4obiwgJGZ1bGxfbWFjcm9zKTsNCg0KCS8vIEluamVjdCB0aGUgdmlydHVhbCB0YWdz IGludG8gdGhlIGdsb2JhbCBzY29wZQ0KCWV2YWwoJG1hY3Jvcyk7DQp9DQoNCi8qKg0KICog c21kX21hY3JvX2dUeHQJQ29udmVydCBzdHJpbmdzIGZvciBpMThuIHB1cnBvc2VzDQogKi8N CmZ1bmN0aW9uIHNtZF9tYWNyb19nVHh0KCR3aGF0LCAkYXR0cyA9IGFycmF5KCkpIHsNCgkk bGFuZyA9IGFycmF5KA0KCQknZW4tZ2InID0+IGFycmF5KA0KCQkJJ3NtZF9tYWNyb19hdHRy aWJ1dGVzJyA9PiAnQXR0cmlidXRlcycsDQoJCQknc21kX21hY3JvX2Nob29zZScgPT4gJ1Nl bGVjdCBtYWNybyB0byBlZGl0OicsDQoJCQknc21kX21hY3JvX2F0dF9jbG9uZScgPT4gJ1sr XScsDQoJCQknc21kX21hY3JvX2F0dF9jbG9uZV9oZWxwJyA9PiAnQWRkIGFuIGF0dHJpYnV0 ZScsDQoJCQknc21kX21hY3JvX2Nhbm5vdF9pbXBvcnQnID0+ICdVbmFibGUgdG8gaW1wb3J0 IG1hY3JvLiBQbGVhc2UgY2hlY2sgZm9sZGVyIHBlcm1pc3Npb25zL3NldHRpbmdzIG9uIHlv dXIgaG9zdCcsDQoJCQknc21kX21hY3JvX2Nsb25lJyA9PiAnQ2xvbmUnLA0KCQkJJ3NtZF9t YWNyb19jcmVhdGVkJyA9PiAnTWFjcm8gY3JlYXRlZCcsDQoJCQknc21kX21hY3JvX2RlbGV0 ZWQnID0+ICdNYWNybyBkZWxldGVkJywNCgkJCSdzbWRfbWFjcm9fZXhpc3RzJyA9PiAnTWFj cm8gbmFtZSBhbHJlYWR5IGV4aXN0cyBvciBjbGFzaGVzJywNCgkJCSdzbWRfbWFjcm9fZXhw b3J0JyA9PiAnRXhwb3J0JywNCgkJCSdzbWRfbWFjcm9fZmlsZV9zaXplJyA9PiAnTWFjcm8g ZmlsZSB0b28gbGFyZ2UnLA0KCQkJJ3NtZF9tYWNyb19pbXBvcnQnID0+ICdJbXBvcnQnLA0K CQkJJ3NtZF9tYWNyb19pbXBvcnRlZCcgPT4gJ0ltcG9ydGVkOiAnLA0KCQkJJ3NtZF9tYWNy b19pbnZhbGlkJyA9PiAnTWFjcm8gbmFtZSBub3QgdmFsaWQnLA0KCQkJJ3NtZF9tYWNyb19p bnZhbGlkX2luaScgPT4gJ01hY3JvIGZpbGUgbm90IGluIGV4cGVjdGVkIGZvcm1hdCcsDQoJ CQknc21kX21hY3JvX25vdF9pbXBvcnRlZCcgPT4gJ05vdCBpbXBvcnRlZDogJywNCgkJCSdz bWRfbWFjcm9fb3ZlcndyaXRlJyA9PiAnRm9yY2Ugb3ZlcndyaXRlJywNCgkJCSdzbWRfbWFj cm9fcmVwbmFtZScgPT4gJ1JlcGxhY2VtZW50IG5hbWUnLA0KCQkJJ3NtZF9tYWNyb19zYXZl ZCcgPT4gJ01hY3JvIHNhdmVkJywNCgkJCSdzbWRfbWFjcm9fc2tpcHBlZCcgPT4gJ1NraXBw ZWQ6ICcsDQoJCQknc21kX21hY3JvX3RhYl9uYW1lJyA9PiAnTWFjcm9zJywNCgkJCSdzbWRf bWFjcm9fdGFnX2RlZmluaXRpb24nID0+ICdNYWNybyBkZWZpbml0aW9uJywNCgkJCSdzbWRf bWFjcm9fdGJsX2luc3RhbGxfbGJsJyA9PiAnSW5zdGFsbCB0YWJsZScsDQoJCQknc21kX21h Y3JvX3RibF9pbnN0YWxsZWQnID0+ICdUYWJsZSBpbnN0YWxsZWQnLA0KCQkJJ3NtZF9tYWNy b190Ymxfbm90X2luc3RhbGxlZCcgPT4gJ1RhYmxlIG5vdCBpbnN0YWxsZWQnLA0KCQkJJ3Nt ZF9tYWNyb190YmxfcmVtb3ZlZCcgPT4gJ1RhYmxlIHJlbW92ZWQnLA0KCQkJJ3NtZF9tYWNy b190Ymxfbm90X3JlbW92ZWQnID0+ICdUYWJsZSBub3QgcmVtb3ZlZCcsDQoJCQknc21kX21h Y3JvX3VwbG9hZCcgPT4gJ01hY3JvIGZpbGUnLA0KCQkpLA0KCSk7DQoNCgkkdGhpc2xhbmcg PSBnZXRfcHJlZignbGFuZ3VhZ2UnLCAnZW4tZ2InKTsNCgkkdGhpc2xhbmcgPSAoaXNzZXQo JGxhbmdbJHRoaXNsYW5nXVskd2hhdF0pKSA/ICR0aGlzbGFuZyA6ICdlbi1nYic7DQoJcmV0 dXJuIHN0cnRyKCRsYW5nWyR0aGlzbGFuZ11bJHdoYXRdLCAkYXR0cyk7DQp9IjtzOjQ6InR5 cGUiO3M6MToiMSI7czo1OiJmbGFncyI7czoxOiIyIjtzOjU6Im9yZGVyIjtzOjE6IjUiO3M6 MzoibWQ1IjtzOjMyOiI2MmQwNzM4MjI2MmFmOGMzYmFiNjI1MGEzYjZmMzkzNCI7fQ==