Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 海阔视界规则分享,当前分享的是:网页插件¥js_url¥global_全网vip视频@base64://Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgICDmh5LkurrkuJPnlKjvvIzlhajnvZFWSVDop4bpopHlhY3otLnnoLTop6Pljrvlub/lkYrjgIHlhajnvZHpn7PkuZDnm7TmjqXkuIvovb3jgIHnn6XkuY7lop7lvLrjgIHnn63op4bpopHml6DmsLTljbDkuIvovb3jgIHnmb7luqbnvZHnm5jnm7TmjqXkuIvovb3nrYnlpJrlip/og73lt6XlhbfnrrHvvIzlip/og73lj6/ni6znq4vlvIDlhbPjgILplb/mnJ/mm7TmlrDvvIzmlL7lv4Pkvb/nlKjjgIJ2NgovLyBAbmFtZXNwYWNlIAkgbGFuaGFoYQovLyBAdmVyc2lvbiAgICAgIDYuOC4xCi8vIEBkZXNjcmlwdGlvbiAg6Ieq55So5aSa5Yqf6IO96ISa5pys5bel5YW3566x77yM5a6M5YWo5YWN6LS544CB5peg5bm/5ZGK44CB5peg6ZyA5YWz5rOo5YWs5LyX5Y+377yM6ZuG5ZCI5LqG5LyY6YW344CB54ix5aWH6Im644CB6IW+6K6v44CBQuermShiaWxpYmlsaSnjgIHoipLmnpznrYnlhajnvZFWSVDop4bpopEoUEMr56e75Yqo56uvKeWFjei0ueegtOino+WOu+W5v+WRiu+8jOe9keaYk+S6kemfs+S5kOOAgVFR6Z+z5LmQ44CB6YW354uX44CB6YW35oiR44CB6Jm+57Gz44CB6Jy76JyTRk3jgIHojZTmnp1GTeOAgeWWnOmprOaLiembheetiee9keermemfs+S5kOWSjOacieWjsOS5pumfs+mikeWFjeWuouaIt+err+S4i+i9ve+8jOefpeS5juWinuW8uijnn6XkuY7op4bpopHkuIvovb3jgIHljrvlub/lkYrjgIHlhbPplK7or43lsY/olL3jgIHljrvpmaTkvqfovrnmoI/nrYkp77yM6KeG6aKR5peg5rC05Y2w5LiL6L29KGJpbGliaWxp44CB5oqW6Z+z44CB5b+r5omL44CB6KW/55Oc44CBeW91dHViZSnvvIznmb7luqbnvZHnm5jnm7TmjqXkuIvovb3vvIzkvJjmg6DliLjoh6rliqjmn6Xor6LnrYnlh6DkuKroh6rlt7HluLjnlKjnmoTlip/og73vvIzkuJTlip/og73lj6/ni6znq4vlvIDlhbPjgIIKLy8gQGF1dGhvciAgICAgICBsYW5oYWhh77yMc3loeXoxOTkw77yMem1mbWMKLy8gQGljb24gICAgICAgICBkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUdRQUFBQmtDQVlBQUFCdzRwVlVBQUFROEVsRVFWUjRYdTFkQ1hRVVJScithcElRVDF3UXc2RVlCY1NFckNnS0NvUW93b29jTGlyS2VvQW9MRDV4MllEdStoVENQbmRkSmVDNUN0NmdJQnRkbFVNUXhBUEU5NWdNS2tiaG9XR0NLTWdwc1BqVW9Fc0lrTnIzVGFkaE11bWVxZTZ1bmdSSThTQkFWOWZ4Zi9XZjlWZVhnSWNpcGN6eThQcFIvYW9Rb3N6TkJJV1RsNlNVdlFBTUFIQUpnRmJZc1NzZEg1ZTB3aWNsd01wVndLN2RUcG83ZXVwbU5BTzZkUWE2ZERKK3RzallDR0FMZ0dJQTd3b2grRk9wS0FNaTkrMjdHWTBhRGNTVzdkM3h5dXN0RUNwSncyYjIyVkJxVVNDek5aQjN5VDZNdUdrcm1tY3NSMlhsSXBHZVBrK0ZVa3FBeUc4Mi9CbW50N3dXejg2OEFDKzkybFNsNFlZNkFOSWJBYmZjc0F0M0RpdkJ0dS9uaTNadHBpV2lTMXhBNUE4L2RNZTg5d2FnN1ZsOThlRGo1MkxucmhNVE5kanczSUlDelU4cngvMzNyTVdHRFlzeHNPOWljZHBwbjl2UnlSWVF1WHYzSUtTa0RNQ2txVDJ4OElQVElaRGVRR3dQRkpDeUFnT3YvQTczNVMvRmZyRlFOUC9OQjFhdFdRSWlmOTQ3QlBzckJtUFVYN3VqOU91bUVFanhNSlNHVjAwS1NIa0FPZTEzNHNVblBrSnF5bHpSdVBIOFdPTFVBa1R1MjNjakRzb2hHSkdmaXpYaEpnM1U5SUVDSFR2c3hLeW5QMFJhV3BFUTR0M29IbW9BSXFXOERNQkk1RS9vaDJYTFQvVmhLQTFObWhTNHV2OTJGSTUvQzhBTUljUWhuVklUa004K2Z3anJOOTJFQng4L0MwSUVHcWpuSXdVb3ZpWVdoSEZXNjVuaXdvNVBtRDBkQWtUdStya3ZVZy9laFQ2REw4WC85aDN2NDFBYW1qWXBjTUx4NVhqL3pTVVE4a25SdEduRWVUd015TUwzLzRIUFZ3L0ZHMiszZ1JCSy9rbFNLZHY1QXVEMEZzRHBMUTJQbU1YOGQreEFHRFZnS1ZzUGJQc2VLUHNHS0ZtZDFPRXFkU2JsUWR3dzhDdGNkTkUwOGZ2ZlBYTUlFTGxqeDNrUXFlTnc1Zlg5VUhtZ2ZpanlWaTJBWGoyQWl6c0J2UzlWbWwvQ1NnVHFzMVhBc3FBQlVuMG9qZEsreC90dnpFTktZSkpvMW14YmhCTms0V09ESUZQR29taE9Wd2pScU03R2VmSkpCZ2pEL2dCa25lUHZNTWc1czk0RWxoVUQyM2Y0MjFlODFpVit3WWliUDRLUWo0aDdSaGNiZ0hUclB4cFZ1QjNsUDU5WEo4cWMzSEJOUCtDV3dVRGprNU5QbkxjV0E4L09xQnRnSkE2Z1Zjc1NwTWlueFFkelhqVUE2WkJYZ0txcVlSQTRGOGxVSCtTSVB3MDNPS0krbExvQVJsWlZBU2hGVldDNldGYzh4UUFrSi9lZk9JZ2hFS0xOWVRYdk00V3U3Z3VNRytPY0l5aGV0dTB3ZElGWktINElyc2xkNURncWZ5cDkvdDFKS2Q4RC9IdTJ3VEhKS0ZJQ0V1c1FDTXdTYTRPRjFTS3IzMVQ4dUdjUWhHemxPNGVRUUJNTERHV3RVcWg4U1h4VEllLzVSZVd0dzNVSUZLMHk5c2VmV2UzVTNxZUZOcUhRZitVdnlSRnlBMUx3cWlnTjNXOEEwdSttSW16YTNBOFEvb2JXZStVQkU4Y241Z29TZmY2N3dQekYrZ25DQlRGNkJOQTd6K0NxUk9XMk1UVzVNVkY5cDg4SmlNQlduSERjSEZHeTlHNERrTHdCNzJEM2p6MGhBaWM0YlUrNS9uMzVpWFVGeGRFekx4dGcrRjBJQmtFaE9QSEVHa1ZZdC83K2prWmlONW8yV1NSQ0M0Y2JnSFM4L0VOVVZ1WWlJUHdKc1Q4MEhyZzJ6cVRJRVFTQ3Nyc3VDcTA3QW1QSE1UbDUvbzVLeWoxSVRWa212bHgralFGSWR2ZmxrWDF5RWREcmczQ0NVd3JqNndzNmFRV0ZnRlBkb0p0RTVKTHhZd0NLMWVoQ3JyMWlzTzdlYXJZbjVWNUFCa1Y0eFpYVmdQVDRHRUJuQ0tScTdYbkdGSHN3Q01Ea0tja1JUMDRtUlVBSURBSDZiRFZRTU5GLy8wUmlINEJQUkxpNHB3RklWdmVWZ0xnUUFhRnZJeXFlbUtMbE5HR2lmb1h0aFBEMXFhNlUrd0h4cVFnWDU1a2k2M01nY0w2Mm5VSDZGNVRMVm9WZzNKWmY5eUxLRFNBMG1lOGJZM0Q5aDh1QkNaUDB6SVBlT2xBaXdzWGRURUJXUWFJakFnSHZleUJrK2FtRlJ4OFluTkVIYnhvT3Axbm9xMXczd2cyME5kK3BrZ2NCK1lVb1czRnhkZWdrZHpVa3ZNZXhLSGZudm16dFp4ekpuRUh5a1R2bVduanY5T2hwSVhvcEVnUmt0UWlIT3BzY3NnWkFEb1JIRHJGVDRrYzZHQ1EyRjlzU0c3UDh1dUhlOUNIM1JTRFhpUENLQzZzQnlmM1NBTVJEWkpFNmc3b2p0dENhb3M2b0wvc1BYbGF5blc1a1dHZTR4ZHhWKzZxU1ZaQllJOWFGT2xWYldibGZRYUNEYTBEb2IxQytXb1hPR1E5S2h1ZXRPbmt2OVRqUGVUT3NQWHN2SVJZcEdmSDlTb1JENXg4R0JPaUFnRXNPWWJDUSt4bXhoVTVmZm9FWEV0Uy9kKzJNRmk5Y1VoMkNGK0VWSFUybFhncUpiRmNjWWlkYkthcm80ZGExQis0SHBET25BbDB1cU4yeVd5NlJVa0ppclNnTC9iWWFrQjVyd2JNZWJuU0lIWGZRQzYrcjJKUWZJRVMzeVREK3pDbjZKRUlWTjBXaUFjbktEVmZ2RmpyTE5ySFRIVHJpUDJ5Ym9Yb21PSEFEaXFibGd2ZjhKclY2KzFaY3dsQUxEUmluaFJ3aUVCWnJRem1tRGlsenRYMXJaMW5wVU9SV0pqUWRzY2xUL2QyZlVDV21sVi9pMWllSkFDTEt4TnJpRHQ0QW9STVlteDJpZ3p0SWxOS2dQV2tZdGlBd2Raa3R3dEZSd1ROc3o2MWlXcElVMDI2S0ZrRHNsRG4xaHR1QlJVOG1IaUJtUFhNUDVVZzNIQXlsdms2VWhiTGRjd2hYQmpOR1lvdFhyOVZzVHdVUTF1V09IaGRBZmRJdlRybWtPdEZCbElXeXFnSHBzUTVDdG5lVTRHQ2wxT2lORXhBZFJSVVFzeThxZmtaZm83TlJkSXdqR1cxb0FjU0tZTHJFVlNJZEVvOUlkTkJvVkNSYnZ6Q3Q2WnIrd0o0OVJncVJrMUJSTFVDeWUzd05JYytKeXIyT3Z5N3M3SEI2NWZUT2RSUXJ3R2xXcXVaYU1VMlVoRW1HZm9tMU5pbEdHWlpYWFJRUlFNVFhvcXo0WEhNTDF4a2dkdWF1em1RQUswQk1zNUw2aTJOSWxNWkR3bER4RjgzUnNVVHMyN0FTMzQ1TTRBZ2c2MFc0dUwwWjdWMFBvSjJ5RHJGUzZMck0zWGhLUFhxU0JJUFJWNnNZV2l6cC9OWXZWb0RRREtib1ZDcGVBZEhwcGRvTk9CNkhSTDlEQjIzY1dPdllVbXpiMUM4UFQzRW0zMVVJeWgzUzJHd1ZKMTU3SkhLQ2IwUTRkSTY1UWZVTklOb3FjNGhuRmxXWXBTb2dabFBVYTRVRmFybThUS3ArZUtvKy9XSWxNY2lWZlJTVHlEMERFcnUzVEtJNGtwaytBR0kybVNqcHpheW5NNm5hemlkVDFha1JRT1MzSXJ5aW5Uc09jYnA2RmVoZnE0cVhQcWhmVE1XZnFHK3VaSVpodkZpSDFHT01lc2VXT2dWRWQ3amRDeUFtWVJqZUtaeWdybC9HRkxnVFkzWnVRQU1nTnV5Z3FsL2M3dnBwQnlRcjkxdEhoM1Ywck41RW9zU1BQdXo4cCtpeHFLN3E2SGU4K21YVlowUkVXYWl0R1Z3OCtnRmhhQ01TS285S2RJdGRGUFRxdTFya0JpUmFQSjZWdW5Gb3h6MGdWbWF2empnV0NhQ0xReWhPR0pWV09iSGxkbVBOQ2hBbmdWWUxEdGtBZ2JNOStTRk9IS0ZFSzQ3UG1TVVllL3pNU1JJQkZUcUJpSGN1eFJ3SHh6NzVLZmNPb3c3SFVHS2pLQXUxTVVXV00wQzhPa0lxZ01TbTI2aXVPSnE4bE9rcVI2d1o3cGsweFp2SkcxazhGanVuVGtJblJyVFhBeUIyU296eVYyZDBsYXVjSzV5K2drcXlIVUVjbHg5ZlQ1Q0FIQ05GTENQQ09zWnJKVjRkdVFIVmdJUk5Ec25PTlRoRTlVeTBYZUt4enZDN0NoZVpkYUtQQ1NSNmo4QXlBcXdhR2svVW5wM0o2MFM4d2lzZ2RrcFhwMktuNk9GQlVSN01qQndHblZGYnRKaDFWUFVFZ2RDOW8ralZ3aUl0amRESmR5Szg0bXd6ZExJUkVQeEdWcUwxY1BpNWxTSnpFbEJMMUpOVllqTXpJYzJWVFlXdG9pZjhQanBucFQ5VTlaMUpBeTJBMk9rUlhVa09WZ0ZNeW1WK3hVRkZUM0N5REhqcTBoTldDOGd1ODhhUi9pQnpSTmhra3dpSHpuTFBJWFdSQnNRSXJjckhhUmdvcFBXa1MwL1ljYlBkOFFTbmk3STJJTG5mQVNKVFZhY2ZHcCtWcjBDaWNSL0FxL1hpTk91RWc2S280T3JVclNmc0FMSGlZamM3cDhaK3lHWVJEbVdhVzdqdUFMRUxPenRsV2FzSk93SEViejFoTlQ2ZGM5Y0dDSzBjSHZPS1RUYlF3U1dxZ05DeW8vWGtsU01UR1JteHo2MjR3KzBSREF0QU5nRTQwNUdWWlE3UXp1enp1b09ZQ0pCa0hlcTNBc3B1ems2ODgraDJ0UUlTajB1YzVDYkZUdHp1VUF4bE5EL0ZrU3c5RVR1dWVDZU5vODF5Snh5bkZSQjJiTGRpM0c3NHNNM1lXRlpkZjZER0pQQ1VpZFlmNWZRaUVReEF0b2h3NkV4VHFic1hXV3pLamt2NFRJZUNkN0xhL0t3Yjc2U3hsK043QmlEYlJEaDBoaDVBckZaME5HR2MydVYrRXRWdDIzYnhPMjJMVHU1QWFmSGwrZ0Rod096a3ZnNnJ5eTBoZGJ4SENjQVFpZFZ1bzg1OW9OSmc5ZGVBc25NM0EyanR5c3FLbm5BODBlVkZuK2dncXRzMk9DY2U4TFQ2ampEMTJxRGgraUlDcGNIclRRN1JBd2duYlJlTzVqTzNWb2hiWW5wOUx4NFliRnYzZGtOcGNLUUp5RlorU2Qwemg1Z0VzSXZ4SEVtQUpBTERpMVZsdDFCS2czZUx5RjJFT1QwK0FvVEREOXpHV1g2NllqeGVWN2piOTZuQWVRcllMcERwMWdGTU5KN1M0TDBFcEM5eTh2UjlCdFRPR2psU3pOK2gxd1BqeDlxVHppOHcyR05wOE84RTVEcms1T2s3MFhLa2lpdVZEeno3Q1lZQnlHUUNjaXR5OG1ZbTRpYmw1MWJpeW1vSExYb2YzTXhFWjZBdzJVRkNNMHVGMFlaNHhXOHdERUNlSUNDamtKUDNuRExCNDFWVUVWZnhDR0FDdzhuN3ZibmtKRjBvV2VLMk5QZzBBZmtMY3ZJZTF3SklJbkdsbXFiRHdmQnJEUVNHOTN2b0xMeWZoT05RU1l3Z3Q5SzBUVllnc3pUNEFnRVpoNXk4U1ZybWJDZXU4c2NiKytCdWJzb2gxM3pJRzNIV3U3dTZpTHFCbjFLaWY4UU1GcFV0WUJLakxqN3dYQnFjUVVEdXh3VzlIc0QrL2Q0d3NSTlhKQ1NKb2tvSWxWR3d6ZkpmakRQaFZ1ZkJTZnpHSjdtN3BVZFhOcVBLUEtMcnBLVUJxNWNWRVpDSGNPbkFDZmpoUjZkTjFLeHY5OTJzUksyU0FKVG5pWTQ0SjJySDYzTXptOUhyRjBiZGp1UFVKc0R5dC85RFFCN0dvTnZ1eGJwdjNUWmx2UGZ4WXVkY1lLYnA4SDJWbXdxOGpkRDZiUzRJNmlvLzA0VlV4bjF1VzJEZXpEa0U1RW5rangvclNYbkcrM2l5MVdEaWJiOUdGRzQvUStiN3lUWFVFZFJOS2puREtnVDFXcWR2TCtEeEIrWVRrS2N4cldnMG5uekJmWk9xNHNwcGRnakJJZWZ3YklmVHE0dGlaME5PTUcvcElSREo5bmNTVWRlNFgyVVJBWGtlSzFmZDRlbTdzeXJpeXZ6QWwxdENrRnNZQXFmeHdIMko2SEM0eVVuUmJWUHg4OThFZ1NtdWZ2czFpUWllNlBtY2w3NUhkdnQ3ak9CaVplVWlYRFcwYldUZ1RrdThjRHZiU25ieW10UHgxNGY2elRNcXNPVE5sU0kxOVRJai9DN2xYRHcxclRkZW5IV0s0L0hGKzB5c21UUGx1TkZqNkFWK1RXN1VyWnR4OGZtdmkyNlhqRE1BMmJ2M2p5amZNeEpYM3RBSmxmdWRYM3NVcTBPU2xWdDdOT0RXS08wWExKbTlEQUpQaVdiTmxoMDZmeUFYTFoySUwxYmZoTmZleWtTZzRlcnVwR0ROSzd5SERpNURwL05lRWYxN1A4WStEd05TWHA2SEEzSlU1SUxpWC9mV2p3dUtrMEtWT3V6a2xNWTc4VTdSQWh3NDhMekl5SWpjbEZuamhJNzg0c3RiOE4yV2tTaVkyQVVCMFhDbnVwOVk4V2EyU1g5Ympzek02YUpUaC9sbVY3V09UTWxuWGhxSHJkdUhZc0Y3N1FHUjV1ZVlqdG0ycStSZURMcHFGVnEzbUNudUhENHRtZzYxQWZuMTEwNFFhYmRoeE9oQldCTSs0NWdsbWw4VGw3SUNIYlBYNHRRbVJlTFpSLzhWMjQzbG9VTDVVMFVmeU1xaHVQMnVQbGo3ZFhPL3huYk10VXN3Y3JMS0lNUnJZdmIwUjYzbWIzdktVNWFYWDRQVXRNRzRmM0pQTEZyYVhPdVZlc2NjRWhGbmJ5LzZYMUdHbjhyZkVDODk4YkFkQ2VJZXU1VVZGUU9RbnQ0Znl6L3VpWDg4Y2laMi9QZEVWMWRhSElzQVJNODVvOWtlUEhEdmwxaS9jWTRZT2FTV21JcXJRMkpwSjZYc2pBMGJlcU5seTF3OE56TWIwNHN5QUhHaWNlZWhnMlBVeHlJb3ZBNXYxTEFmY01ld0VtemJ0VUMweTN3eEVSbVVLU3IzNysrRkpjRWV5TW5xaUZtdloyTEZ5aWJZdU9Wa0NCd1BpVVlJSUFESjMxSlVaMEJHdDIzOG5YOUdNdStqamJ6cS96QnIxM3B1MXEzeElORzg2dlo1Wm1zZ3Qwc0ZicjF4TTFxM0NxS3ljckZJVDUrbk1paGxRQTZSWmV2V3JwZyt1d015bW1SaVVMK1dDSDZhZ2M5V05jYktMNDdEenQxcGdFd0ZCTUZKUVFBQ1ZlQmxsUUpFaWI4Z3EzOFRuTWlYQ2c2REZlbUV6dzhCVmh0VWxWazVyK09ZRGpXNmFORWM2Tm9KNkhJaDBQVWlvR1h6Q2dDYlVGNGVST1BHaTRVUUphcEQ4allRMVY0YTZpbFQ0UCtHQzVPbCt4SUtud0FBQUFCSlJVNUVya0pnZ2c9PQovLyBAbWF0Y2ggICAgICAgICo6Ly9wYW4uYmFpZHUuY29tL2Rpc2svaG9tZSoKLy8gQG1hdGNoICAgICAgICAqOi8veXVuLmJhaWR1LmNvbS9kaXNrL2hvbWUqCi8vIEBtYXRjaCAgICAgICAgKjovL3Bhbi5iYWlkdS5jb20vZGlzay9tYWluKgovLyBAbWF0Y2ggICAgICAgICo6Ly95dW4uYmFpZHUuY29tL2Rpc2svbWFpbioKLy8gQG1hdGNoICAgICAgICAqOi8vcGFuLmJhaWR1LmNvbS9zKgovLyBAbWF0Y2ggICAgICAgICo6Ly95dW4uYmFpZHUuY29tL3MqCi8vIEBtYXRjaCAgICAgICAgKjovLyoueW91a3UuY29tLyoKLy8gQG1hdGNoICAgICAgICAqOi8vKi5pcWl5aS5jb20vKgovLyBAbWF0Y2ggICAgICAgICo6Ly8qLmlxLmNvbS8qCi8vIEBtYXRjaCAgICAgICAgKjovLyoubGUuY29tLyoKLy8gQG1hdGNoICAgICAgICAqOi8vdi5xcS5jb20vKgovLyBAbWF0Y2ggICAgICAgICo6Ly9tLnYucXEuY29tLyoKLy8gQG1hdGNoICAgICAgICAqOi8vKi50dWRvdS5jb20vKgovLyBAbWF0Y2ggICAgICAgICo6Ly8qLm1ndHYuY29tLyoKLy8gQG1hdGNoICAgICAgICAqOi8vdHYuc29odS5jb20vKgovLyBAbWF0Y2ggICAgICAgICo6Ly9maWxtLnNvaHUuY29tLyoKLy8gQG1hdGNoICAgICAgICAqOi8vKi4xOTA1LmNvbS8qCi8vIEBtYXRjaCAgICAgICAgKjovLyouYmlsaWJpbGkuY29tLyoKLy8gQG1hdGNoICAgICAgICAqOi8vKi5wcHR2LmNvbS8qCi8vIEBtYXRjaCAgICAgICAgKjovL2l0ZW0udGFvYmFvLmNvbS8qCi8vIEBtYXRjaCAgICAgICAgKjovL3MudGFvYmFvLmNvbS8qCi8vIEBtYXRjaCAgICAgICAgKjovL2NoYW9zaGkuZGV0YWlsLnRtYWxsLmNvbS8qCi8vIEBtYXRjaCAgICAgICAgKjovL2RldGFpbC50bWFsbC5jb20vKgovLyBAbWF0Y2ggICAgICAgICo6Ly9kZXRhaWwudG1hbGwuaGsvKgovLyBAbWF0Y2ggICAgICAgICo6Ly9pdGVtLmpkLmNvbS8qCi8vIEBtYXRjaCAgICAgICAgKjovLyoueWl5YW9qZC5jb20vKgovLyBAbWF0Y2ggICAgICAgICo6Ly9ucGNpdGVtLmpkLmhrLyoKLy8gQG1hdGNoICAgICAgICAqOi8vKi5saWFuZ3hpbnlhby5jb20vKgovLyBAbWF0Y2ggICAgICAgICo6Ly9tdXNpYy4xNjMuY29tLyoKLy8gQG1hdGNoICAgICAgICAqOi8veS5xcS5jb20vKgovLyBAbWF0Y2ggICAgICAgICo6Ly8qLmt1Z291LmNvbS8qCi8vIEBtYXRjaCAgICAgICAgKjovLyoua3V3by5jbi8qCi8vIEBtYXRjaCAgICAgICAgKjovLyoueGltYWxheWEuY29tLyoKLy8gQG1hdGNoICAgICAgICAqOi8vKi56aGlodS5jb20vKgovLyBAbWF0Y2ggICAgICAgICo6Ly8qLmRvdXlpbi5jb20vKgovLyBAbWF0Y2ggICAgICAgICo6Ly8qLmt1YWlzaG91LmNvbS8qCi8vIEBtYXRjaCAgICAgICAgKjovLyouaXhpZ3VhLmNvbS8qCi8vIEBtYXRjaCAgICAgICAgKjovLyoueW91dHViZS5jb20vKgovLyBAbWF0Y2ggICAgICAgICo6Ly80Ny45OS4xNTguMTE4LyoKLy8gQGNvbm5lY3QgICAgICBkLnBjcy5iYWlkdS5jb20KLy8gQGNvbm5lY3QgICAgICBiYWlkdS5jb20KLy8gQGNvbm5lY3QgICAgICBiYWlkdXBjcy5jb20KLy8gQGNvbm5lY3QgICAgICB5b3V4aWFvaG91LmNvbQovLyBAY29ubmVjdCAgICAgIGxvY2FsaG9zdAovLyBAcmVxdWlyZSAgICAgIGh0dHBzOi8vbGYyNi1jZG4tdG9zLmJ5dGVjZG50cC5jb20vY2RuL2V4cGlyZS0xLU0vY3J5cHRvLWpzLzQuMS4xL2NyeXB0by1qcy5taW4uanMKLy8gQHJlcXVpcmUgICAgICBodHRwczovL2xmMy1jZG4tdG9zLmJ5dGVjZG50cC5jb20vY2RuL2V4cGlyZS0xLU0vbGltb250ZS1zd2VldGFsZXJ0Mi8xMS40LjQvc3dlZXRhbGVydDIuYWxsLm1pbi5qcwovLyBAcmVxdWlyZSAgICAgIGh0dHBzOi8vbGY5LWNkbi10b3MuYnl0ZWNkbnRwLmNvbS9jZG4vZXhwaXJlLTEtTS9xcmNvZGVqcy8xLjAuMC9xcmNvZGUuanMKLy8gQG9yaWdpbmFsLXNjcmlwdCBodHRwczovL2dyZWFzeWZvcmsub3JnL3NjcmlwdHMvMzc2MDc4Ci8vIEBvcmlnaW5hbC1hdXRob3IgemhtYWkKLy8gQG9yaWdpbmFsLWxpY2Vuc2UgR1BMIExpY2Vuc2UKLy8gQG9yaWdpbmFsLXNjcmlwdCBodHRwczovL2dpdGh1Yi5jb20vc3loeXoxOTkwL2JhaWR1eXVuL2Jsb2IvbWFzdGVyL2JhaWR1eXVuLnVzZXIuanMKLy8gQG9yaWdpbmFsLWF1dGhvciB5b3V4aWFvaG91Ci8vIEBvcmlnaW5hbC1saWNlbnNlIEFHUEwgTGljZW5zZQovLyBAb3JpZ2luYWwtY2hhbmdlcyDlsIblvLrliLblhbPms6jlhazkvJflj7fmlLnkuLrpnZ7lvLrliLbjgIIKLy8gQGFudGlmZWF0dXJlICByZWZlcnJhbC1saW5rIOatpOaPkOekuuS4ukdyZWFzeUZvcmvku6PnoIHop4TojIPopoHmsYLlkKvmnInmn6XliLjlip/og73nmoTohJrmnKzlv4Xpobvmt7vliqDvvIzlrp7pmYXkvb/nlKjml6Dku7vkvZXlvLrliLbot7PovazvvIzku6PnoIHlj6/mn6XvvIzor7fnn6XmgonjgIIKLy8gQGxpY2Vuc2UgICAgICBBR1BMIExpY2Vuc2UKLy8gQGdyYW50ICAgICAgICBHTV9kb3dubG9hZAovLyBAZ3JhbnQgICAgICAgIEdNX29wZW5JblRhYgovLyBAZ3JhbnQgICAgICAgIEdNX3NldFZhbHVlCi8vIEBncmFudCAgICAgICAgR01fZ2V0VmFsdWUKLy8gQGdyYW50ICAgICAgICBHTV9kZWxldGVWYWx1ZQovLyBAZ3JhbnQgICAgICAgIEdNX3htbGh0dHBSZXF1ZXN0Ci8vIEBncmFudCAgICAgICAgR01fYWRkU3R5bGUKLy8gQGdyYW50ICAgICAgICB1bnNhZmVXaW5kb3cKLy8gQGdyYW50ICAgICAgICBHTV9zZXRDbGlwYm9hcmQKLy8gQGdyYW50ICAgICAgICBHTV9nZXRSZXNvdXJjZVVSTAovLyBAZ3JhbnQgICAgICAgIEdNX2dldFJlc291cmNlVGV4dAovLyBAZ3JhbnQgICAgICAgIEdNX2luZm8KLy8gQGdyYW50ICAgICAgICBHTV9yZWdpc3Rlck1lbnVDb21tYW5kCi8vIEBncmFudCAgICAgICAgR01fY29va2llCi8vIEBjb25uZWN0ICAgICAgaWVzZG91eWluLmNvbQovLyBAY29ubmVjdCAgICAgIDQ3Ljk5LjE1OC4xMTgKLy8gPT0vVXNlclNjcmlwdD09CgooZnVuY3Rpb24oKSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgdmFyIGRvbUhlYWQgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaGVhZCcpWzBdOwoKICAgIHZhciBkb21TdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7CgogICAgZG9tU3R5bGUudHlwZSA9ICd0ZXh0L2Nzcyc7CgogICAgZG9tU3R5bGUucmVsID0gJ3N0eWxlc2hlZXQnOwogICAgLy/lubPlj7DliKTmlq0KICAgIHZhciBpc01vYmlsZSA9IC9BbmRyb2lkfHdlYk9TfGlQaG9uZXxpUG9kfEJsYWNrQmVycnkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpOwoKICAgIGlmKGlzTW9iaWxlKXsKCiAgICAgICAgbGV0IHBsYXlMaW5lID0gWwogICAgICAgICAgICB7Im5hbWUiOiLnuq/lh4AxIiwidXJsIjoiaHR0cHM6Ly9pbTE5MDcudG9wLz9qeD0ifSwKICAgICAgICAgICAgeyJuYW1lIjoiQuermTEiLCJ1cmwiOiJodHRwczovL2p4Lmpzb25wbGF5ZXIuY29tL3BsYXllci8/dXJsPSJ9LAogICAgICAgICAgICB7Im5hbWUiOiLniLHosYYiLCJ1cmwiOiJodHRwczovL2p4LmFpZG91ZXIubmV0Lz91cmw9In0sCiAgICAgICAgICAgIHsibmFtZSI6IkNIb2siLCJ1cmwiOiJodHRwczovL3d3dy5nYWk0LmNvbS8/dXJsPSJ9LAogICAgICAgICAgICB7Im5hbWUiOiJPSyIsInVybCI6Imh0dHBzOi8vb2tqeC5jYy8/dXJsPSJ9LAogICAgICAgICAgICB7Im5hbWUiOiJSREhLIiwidXJsIjoiaHR0cHM6Ly9qeC5yZGhrLm5ldC8/dj0ifSwKICAgICAgICAgICAgeyJuYW1lIjoi5Lq65Lq66L+3IiwidXJsIjoiaHR0cHM6Ly9qeC5ibGJvLmNjOjQ0MzMvP3VybD0ifSwKICAgICAgICAgICAgeyJuYW1lIjoi5oCd5Y+kMyIsInVybCI6Imh0dHBzOi8vanNhcC5hdHRha2lkcy5jb20vP3VybD0ifSwKICAgICAgICAgICAgeyJuYW1lIjoi5ZCs5LmQIiwidXJsIjoiaHR0cHM6Ly9qeC5kajZ1LmNvbS8/dXJsPSJ9LAogICAgICAgICAgICB7Im5hbWUiOiJZVCIsInVybCI6Imh0dHBzOi8vangueWFuZ3R1LnRvcC8/dXJsPSJ9CiAgICAgICAgXTsKCiAgICAgICAgbGV0IHVzZVdlYiA9IFsnbS5iaWxpYmlsaS5jb20nLCd5b3VrdS5jb20nLCd3d3cueW91a3UuY29tJywnbS55b3VrdS5jb20nLCdtLnYucXEuY29tJywnbS5pcWl5aS5jb20nLCdtLm1ndHYuY29tJywnbS50di5zb2h1LmNvbScsJ20uMTkwNS5jb20nLCdtLnBwdHYuY29tJywnbS5sZS5jb20nXTsKCiAgICAgICAgaWYodXNlV2ViLmluZGV4T2YobG9jYXRpb24uaG9zdCkgPT0gLTEpewogICAgICAgICAgICBjb25zb2xlLmxvZygn5LiN5piv5bqU55So572R56uZJyk7cmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gc2V0Q29va2llKGNuYW1lLGN2YWx1ZSxleGRheXMpewoKICAgICAgICAgICAgdmFyIGQgPSBuZXcgRGF0ZSgpOwoKICAgICAgICAgICAgZC5zZXRUaW1lKGQuZ2V0VGltZSgpKyhleGRheXMqMjQqNjAqNjAqMTAwMCkpOwoKICAgICAgICAgICAgdmFyIGV4cGlyZXMgPSAiZXhwaXJlcz0iK2QudG9HTVRTdHJpbmcoKTsKCiAgICAgICAgICAgIGRvY3VtZW50LmNvb2tpZSA9IGNuYW1lKyI9IitjdmFsdWUrIjsgIitleHBpcmVzOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gZ2V0Q29va2llKGNuYW1lKXsKICAgICAgICAgICAgdmFyIG5hbWUgPSBjbmFtZSArICI9IjsKICAgICAgICAgICAgdmFyIGNhID0gZG9jdW1lbnQuY29va2llLnNwbGl0KCc7Jyk7CiAgICAgICAgICAgIGZvcih2YXIgaT0wOyBpPGNhLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICB2YXIgYyA9IGNhW2ldLnRyaW0oKTsKICAgICAgICAgICAgICAgIGlmIChjLmluZGV4T2YobmFtZSk9PTApIHsgcmV0dXJuIGMuc3Vic3RyaW5nKG5hbWUubGVuZ3RoLGMubGVuZ3RoKTsgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAiIjsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnQoZG9tLGRvbUlkKXsKCiAgICAgICAgICAgIHZhciByb290RWxlbWVudCA9IGRvY3VtZW50LmJvZHk7CgogICAgICAgICAgICB2YXIgbmV3RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoZG9tKTsKCiAgICAgICAgICAgIG5ld0VsZW1lbnQuaWQgPSBkb21JZDsKCiAgICAgICAgICAgIHZhciBuZXdFbGVtZW50SHRtbENvbnRlbnQgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgnJyk7CgogICAgICAgICAgICByb290RWxlbWVudC5hcHBlbmRDaGlsZChuZXdFbGVtZW50KTsKCiAgICAgICAgICAgIG5ld0VsZW1lbnQuYXBwZW5kQ2hpbGQobmV3RWxlbWVudEh0bWxDb250ZW50KTsKCiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiB0b2FzdChtc2csZHVyYXRpb24pewoKICAgICAgICAgICAgZHVyYXRpb249aXNOYU4oZHVyYXRpb24pPzMwMDA6ZHVyYXRpb247CgogICAgICAgICAgICBsZXQgdG9hc3REb20gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKCiAgICAgICAgICAgIHRvYXN0RG9tLmlubmVySFRNTCA9IG1zZzsKCiAgICAgICAgICAgIHRvYXN0RG9tLnN0eWxlLmNzc1RleHQ9J3BhZGRpbmc6MnB4IDE1cHg7bWluLWhlaWdodDogMzZweDtsaW5lLWhlaWdodDogMzZweDt0ZXh0LWFsaWduOiBjZW50ZXI7dHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSk7Ym9yZGVyLXJhZGl1czogNHB4O2NvbG9yOiByZ2IoMjU1LCAyNTUsIDI1NSk7cG9zaXRpb246IGZpeGVkO3RvcDogNTAlO2xlZnQ6IDUwJTt6LWluZGV4OiA5OTk5OTk5O2JhY2tncm91bmQ6IHJnYigwLCAwLCAwKTtmb250LXNpemU6IDE2cHg7JwoKICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0b2FzdERvbSk7CgogICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgIHZhciBkID0gMC41OwoKICAgICAgICAgICAgICAgIHRvYXN0RG9tLnN0eWxlLndlYmtpdFRyYW5zaXRpb24gPSAnLXdlYmtpdC10cmFuc2Zvcm0gJyArIGQgKyAncyBlYXNlLWluLCBvcGFjaXR5ICcgKyBkICsgJ3MgZWFzZS1pbic7CgogICAgICAgICAgICAgICAgdG9hc3REb20uc3R5bGUub3BhY2l0eSA9ICcwJzsKCiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKHRvYXN0RG9tKSB9LCBkICogMTAwMCk7CgogICAgICAgICAgICB9LCBkdXJhdGlvbik7CgogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gcGxheVZpZGVvRnVuYygpewogICAgICAgICAgICAvL2NzcwogICAgICAgICAgICBsZXQgcGxheVZpZGVvU3R5bGUgPSBgCiAgICAgICAgICAgIC56aG1fcGxheV92aWRvZV9pY29uewogICAgICAgICAgICAgICAgcGFkZGluZy10b3A6MnB4O2N1cnNvcjpwb2ludGVyOwogICAgICAgICAgICAgICAgei1pbmRleDo5OTk5OTk5OwogICAgICAgICAgICAgICAgZGlzcGxheTpibG9jazsKICAgICAgICAgICAgICAgIHBvc2l0aW9uOmZpeGVkO2xldDowcHg7dG9wOjM2MHB4O3RleHQtYWxpZ246Y2VudGVyO292ZXJmbG93OnZpc2libGU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLnpobV9wbGF5X3ZpZGVvX3dyYXB7CiAgICAgICAgICAgICAgICBwb3NpdGlvbjpmaXhlZDtsZWZ0OjQwcHg7dG9wOjM2MHB4OwogICAgICAgICAgICAgICAgei1pbmRleDo5OTk5OTk5OwogICAgICAgICAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICAgICAgICAgIHdpZHRoOjMwMHB4OwogICAgICAgICAgICB9CiAgICAgICAgICAgIC56aG1fcGxheV92aWRlb19saW5lewogICAgICAgICAgICAgICAgd2lkdGg6MzIwcHg7CiAgICAgICAgICAgICAgICBoZWlnaHQ6MzE2cHg7CiAgICAgICAgICAgICAgICBvdmVyZmxvdy15OnNjcm9sbDsKICAgICAgICAgICAgICAgIG92ZXJmbG93LXg6aGlkZGVuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC56aG1fcGxheV92aWRlX2xpbmVfdWx7CiAgICAgICAgICAgICAgICB3aWR0aDozMDBweDsKICAgICAgICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7CiAgICAgICAgICAgICAgICBmbGV4LWZsb3c6IHJvdyB3cmFwOwogICAgICAgICAgICAgICAgbGlzdC1zdHlsZTogbm9uZTsKICAgICAgICAgICAgICAgIHBhZGRpbmc6MHB4OwogICAgICAgICAgICAgICAgbWFyZ2luOjBweDsKCiAgICAgICAgICAgIH0KICAgICAgICAgICAgLnpobV9wbGF5X3ZpZGVvX2xpbmVfdWxfbGl7CiAgICAgICAgICAgICAgICBwYWRkaW5nOjRweCAwcHg7CiAgICAgICAgICAgICAgICBtYXJnaW46MnB4OwogICAgICAgICAgICAgICAgd2lkdGg6MzAlOwogICAgICAgICAgICAgICAgY29sb3I6I0ZGRjsKICAgICAgICAgICAgICAgIHRleHQtYWxpZ246Y2VudGVyOwogICAgICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjojZjI0NDQzOwogICAgICAgICAgICAgICAgYm94LXNoYWRvdzowcHggMHB4IDEwcHggI2ZmZjsKICAgICAgICAgICAgICAgIGZvbnQtc2l6ZToxNHB4OwogICAgICAgICAgICB9CiAgICAgICAgICAgIC56aG1fcGxheV92aWRlb19saW5lX3VsX2xpOmhvdmVyewogICAgICAgICAgICAgICAgY29sb3I6IzI2MDAzMzsKICAgICAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6I2ZjYzBjMAogICAgICAgICAgICB9CiAgICAgICAgICAgIC56aG1fbGluZV9zZWxlY3RlZHsKICAgICAgICAgICAgICAgIGNvbG9yOiMyNjAwMzM7CiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiNmY2MwYzAKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLnpobV9wbGF5X3ZpZGVvX2p4ewogICAgICAgICAgICAgICAgd2lkdGg6MTAwJTsKICAgICAgICAgICAgICAgIGhlaWdodDoxMDAlOwogICAgICAgICAgICAgICAgei1pbmRleDo5OTk5OTk7CiAgICAgICAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7dG9wOjBweDtwYWRkaW5nOjBweDsKICAgICAgICAgICAgfQogICAgICAgICAgICBgOwoKICAgICAgICAgICAgZG9tU3R5bGUuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUocGxheVZpZGVvU3R5bGUpKTsKCiAgICAgICAgICAgIGRvbUhlYWQuYXBwZW5kQ2hpbGQoZG9tU3R5bGUpOwoKICAgICAgICAgICAgLy90ZW1wbGF0ZTppY29uLHBsYXlMaW5lOwogICAgICAgICAgICBsZXQgcGxheVdyYXBIdG1sID0gIjxkaXYgaHJlZj0namF2YXNjcmlwdDp2b2lkKDApJyB0YXJnZXQ9J19ibGFuaycgc3R5bGU9JycgY2xhc3M9J3BsYXlCdXR0b24gemhtX3BsYXlfdmlkb2VfaWNvbicgaWQ9J3pobWxvZ28nPjxpbWcgY2xhc3M9J2ljb25Mb2dvJyBzcmM9J2RhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaFpBQ1dBUGNBQVBKRVEvdjcrZm5MeVBqQ3dmUm5aZm5UMFBKS1Nmakd4UHYyOVBuWTEvTmJXdnYxOC9hVWsvcmw0L3J3N3ZuS3lQYUppUHJyNmZhYW1QUnljZmFMaXZ2NTkvSkpTUHJ2N2ZOVlZQbmUzZnJ0Ni9OUVQvdjYrUGVscFBhZ252UjNkdmk2dVB2ejhmZXhyL25PelBlZ252cms0dlIxYy9KR1JmcnE2UG5RenZqQ3dQblMwUG5aMS92dzd2bmEyZmVvcC9lbXBmcmMydk5VVS9peHIvUjRkdldKaC9lc3F2SkhSdnZ4Ny9yeThmTlNVZk5XVlBqQndQVjZlZmFNaXZuZjNmaTh1dldEZ3Z2NDl2cnA2UHJ5OFBKUFR2YVlsL25UMGZuVzFQZXJxZlJzYS9SdmJ2V0FmL1Y5ZlBuazR2aTJ0ZlJqWWZSaFgvdnU3UE5ZVi9KRlJQbms0ZmFIaGZhWGx2djM5ZnJoMy9pN3V2bk55L25PeS9yczZ2ZXJxdlJnWHZuZDIvYUdoUFdSa1BWL2Zmcmk0UHJqNFBpd3Jmbkx5ZmFVa3ZSZlhmSk5UUGpGdy9leXNmUmxZL1J4Y1B2djdmZXpzdmkwc3Z2MjgvYWJtdmVxcVBlcHFQSk1TL2V5c1BXT2pmTmRYUFJ6Y3Z2MDh2UnViZnJvNXZlaW9mZWxvL05aV1BuWjJQTnBhUG5VMHZSZlh2bkh4Zml1clBqQXYvblF6ZnJuNWZuYzIvZTBzdmFkblBlNHQvYVNrZk5YVnZSbVpQZXRxdm5ZMXZpOHUvZWlvUGl0cS9pL3ZmUndiL1IxZFBuZTNQYWVuZmFjbXZlM3R2blJ6L3JqNGZhWGxmVitmUFdGaFBKTFN2YU5pL1dNalBSMGMvYVZrL1dQai9hZG0vcnA1L25JeHZSb1p2UmlZZmpEd3ZhVmxQSk9UZmUydGZOcWFmSlJVUGVrb3ZhYW1mTmFXZlY4ZXZuZDNQbk56UG5WMVBlc3EvakV3L1Y2ZVBSM2QvbmczdnJ3N2ZhV2xQZW5wZmFmbmZXUGp2aXdydk5XVmZuTXl2aTZ1ZlYvZnZWOWUvbmIydnJ1Ni9Sa1l2akF2dm5JeGZSaVlQaTl2UGVnbi9WN2VmZWpvZmUxdFBXQ2dmcm01UEpJUi9uYzJ2TmNXL0pRVC9qRnhQdnk4UFdEZ2ZXQmYvUnNiUFY1ZC9OcGFmTmNYUG5mM3ZhSWh2UnZiL2l2cmZuWDF2TlJVZmFLaWZSdGJQYVpsL05lWFBlNXVQV0NnUFJyYXZhSWgvTm9aL25KeC9XRmcvaTl1L1IyZGZqSHh2akl4dk5UVXZpL3Z2ZTFzL05lWFFBQUFBQUFBQUFBQUFBQUFDSC9DMDVGVkZORFFWQkZNaTR3QXdFQUFBQWgrUVFFbGdBQUFDd0FBQUFBWkFDV0FBQUkvZ0FCQ0J4SXNLREJnd2dUS2x6SXNLSERoeEFqU3B4SXNhTEZpeGd6YXR6SXNhUEhqeUJEaWx4SVlFU0FBQ01JakZ4cFVJV0RBQTVVZUZqSTR1VEpCQ3h6Q3N4aGs4aVFoVFp0NnN5cHdhYUdEQXNIQk9VeGxPVUxKQ1dRdktpeGNBT0RBUU1ZYkdpNlVrR1BHajBVR09CS3RxelpzMmpUcWwzTHRxTUNFMDFNaUsxS1lzUUlFbHM3Zm1GQ2E5RVdGNGtRaENpVFFvVUlUVXpTZk95UWdrV0tEa0dTTHRXb0E5aXVaVUV6YXc0Z0JacVZJaHRSMkVTQlU2Rm1qRFFPQ2RuTWVqTUNMUk15THJDNTRBTE5vS1Vwam5IUnVuZnJUdlV1bnBtOTRNRWZrZ01jWEJpZ2N1SWwzcjZqc3o2am9LSUpDUjRrbU5neEVrTWozeVhvL21rQ0phaVdCVFZmOUZpWk02bEVid1NvVHJROXlFc0s2d3FxU09WeEtNTldramVzdWREY2ZBQmNRd2RyZlZ3aEEwVVdoSUhJWmtMMFFxQWFLMnptaVE4M1pBVEZFWm9WTWg4R3ltaUdBQ1VXY0VURkZRZ0U5VUJFQm1DZ0FBWmpNVVFBQ1NRTXFKQU1aV2ptZ21JZmZaSEFTUXVVRWhFRUlqd2hBZ1EySG1SRFVEWXNwQVowUWQxUllrZ25pTUZBRkJMRllGTU1RQ3owa2syMkpYVENnNW1oUVpZZFZwQmp4MEp5MEJabVFrNEVWWVZDZFdUR1FUcGtFVkpVQUM2QWx0QVBObVdpd2tJUWZIa0JCQW4xWXFjVlpma1JwVUkreEFGRUhENG8wUkFCU1Jha0E0QkJqV0pXQjVuRmhwQUJVMFF4Ull3WTNaR1pMbWZsc1pwTi9tVk11VkliSEFTVmhheGxNWkxaS1RtbEVCUUhzYVIxUW9nMjlTSGZTS1ZrWnNaYTZtUkdnVVlUaUdwUUFVRzk0ZWRDT3BnVWdoZXZnTFJGVUM0Y3RBUURIakN3QkhjS0ZYcVNBNGdTeEVlWkR1a1QxREtPSE11UkhrRnBjSkJMTU1tMFVKdzJ6VWtRSEVGMWdlcENlMmptU3pJZU5XTlRPd2Z4ZEpKUFhnYjFKZ0FXaEJBVU1BKzFsZ0l6SEoxUXh4YWJyR25RbmdFY3RkQ1NOaVZCa0RkQlZYQXRRN1d5eGdFbmorVDBWRlJUeWNnQUEwa1NiRk1yRUZYZzJ4NlVtQ3lTVjJETlJWRVdRVEg2a05IUnBUSUtGUVFhaEVGbUdCUWRWQ0c1dEFhR0d4ajlzVUFGakh5RVRGQmxSUFRxU1M4QUVFWWZyUlZDU0VWdUJNV0gva2ViQkFXQzIwSFZJWkFvd21pOFdRVWk0RE5SblRiNTRkRjNOcVVORVJaQjBVSFFJNXpVckJrT2MrRGFVTjgySFVQUVcwelE0SFJDQkNnVkFITUREUktVT3hHbGFKUGxCY1hESVdzTmhBRlJLRUVOUWhCajJCd0IyVzAyNVFhMVRaWkNKUHRKTGg5VWpUV3RTZktPUSsvYTFBQkJvcDFFR2xDWkRSUkJVS3pFSHBRWENWa3doK0diSFZMZFFsRUVKUVZCRWdkQXNVS3FuOFNVUUxQWlZFdEUrWjlFdmtJWVdJVG1Nb09GRG1BdElZQ0lHVUh1UVJ4N3pFUWhWc0dLVmdaQ3RaTXNDQ0lKc3dtckdBSUpYN0VtRWpmNkZVR3VrNTN0VUFRSFFjbEdSTkFYQUJBNkJCbnUwVXdJRkpLSG9PREFJOWs3U1J0V0dCUVhOcVFKL21UWVRBUVVRb0NnSk1JamlnaEtPWGhvazBvMEJBcGNhTTJ6RW9LSm9JREJJMnVJV2tTU2FCTmFMRVFHZDZoZ1pzaEFnNFdJSVNpcThFZ2xna0tDaURqQ0ppRW9Sdm1NZ01MTjRNQUlHVnFJSVlMaXhJRzA2RVVIUTRoVjdESkJnWndpS0VTTFNDZ3NZWWk3SVdRTU1kUk1CZGlnQTRkOHl5WmlJQWlSaklRa3lkamtmZ0FRUkZDNGNVQ05kTEExWElEQ1EwNnd2QUJJQ3dCYU9nbVh1QmVVZ2R5QWNqWVJSRVM2WVFsenFKSWdNb0REQUlOQ2hqRkU1QkpCUVFDdTJnU2tpeDJrSnNVanlDVlAwc2FINE1FbUNKQWp4aVRBUWh2aVVTS09zb2s4Q2hMTEFNeVNpS3BqM1VBK2dSdUlTQ0lvd2dBQUV5S1ptVWxXY2lKMC9yUEpGUXF5eVNObDZpSHRDd3FXSElLeUFCakRnNXRKWlVVbThLdWNFZVNQTUxvSWxBS3dMSWQwUVRyRnZNZ2hnc0lGa1Z3VGp0cXdxRy91bU1lS1FDSXpQaENKS0ZqNFA0Wjg3ejZVekVnV2JXS3drWURLSmhVSW4wdFpvOUNNMENBelJzaklqR3AwRUIzMEx3QXBhRWlPeG1oTWpWaWdBVUZwUVNBRk1vRXJlT0FLRTBCWFFsaDJraVlaWkJhWitRUkQyT0ROa21Za0dKbko1RUhXd0pNY3JPR0JDZm5TU1p3cEVBTWtJcGs3VklnYWRoR0FCY0Robmh0UndnQnZZYStDeEc5K2NKSVRRcW9ZbEJMTWJDaXk4RVJtOW9hUUhHNHZYWVpxMTBISUdwUnRrS1VJZ2NnTU1SVFNnU1A4UUhpUllVaTBGbUtCY1dTR0YwMHAva0xZZ3FJSXp4VkVBVFFJZ3VtbVdoRm1aQVlQUTVIQkxUSVRBaDV4SlJhWllZZE8wbkE4bk9yQkxBZXl5VGwwd29SdUJrQjNac2xoQU5iQkVuVEFRak1jbU9KSFZxc1FaQVlGRUFNUkJ5eWtFQUVHbU5VaUo2QUFwNEtDQllZNUJMZTZQUjFDMUFVVHpSckVETDBUeUEzbTBFcGZOT0VpRmhnR1ZEWFRoVmN5NUFXbVBVTFBGQUt3a3dqTUlDZXdqMDFjQVFBbGdJRTFLOENETENUeURUTm9XRE9JdU9CRFVLWXloY2cxQUhRVkNHTnQ4Z1ZpREZPU0FtQ0FHOVFncG1mQWd4T3BhQTBDTkZIS2h4ejJKd3JoYWdDYVo1QkZSUFdsMGprSkI3TGdqRW5Nb0FQQm9NWWFBb0hMM2xDSEl2ejZoYjlJUXFOL0F1QUdkZXhOL2pNeUVPVTI4OGtXRmhtWEI5QndMb3hJd3plZWVDNEFhR0FNTi9jbUJUMGdFQWlFVEtLQ0VHQVdIL2J6U1RTUWhDOWt6UUFaMU13STlwT1FOSHhpRW1BUW8yWVc0SUpqaUdFVmhaMFBLRGFEQXV3NnhBTGhBTWM4aG9FS0NaQ0NDVzVBYjlZT2dvWjZtcUZic3k0SVJIbHI2SFJtcWcwVkRNUXFjbjBRSHhSSkJKVWkzazBPNGdnaENNRVZSU2IyUUFCMUVrSFJVaWpTamdneit4cGpndFF2QUtETXRrUEtlYzZFREhJRWhSUzNRL3JaU1hWL1pOZnVqcmU4NTAzdmVrL2szT20yZDBGSXFCMnRJdVRiNGRiM1FJYlRWd0VjeHpUZE00Z0FIc0R3QjRoWElSUm8rQU1HSUpCb2FPSGlXZ2hxUVdBZ2NZbXJvQU1nbDBqLy9tcWo3QURraGlCUVhsMUR2bzBVQUZETEpnZFF1SFFpMEltSEs4U3lKejlJNms2aXpvSjgrM283dGNuZlhCNlVtQmRFQUc3dXhBY1l3aGpIRE84aUZNak0waFh5QWFrTDVPVW5NVHBCa083bUNFdzlJVytKaTM0cjBnSy9MV1RRTm1rNTBXRXVjejhQc1NrVmlxWkNmaVQwZ1dBOUFGb2ZDTmRQSW9DQ1VHQUdDV2hsQUlhdUV3a2tjeUd0L1ByZDh5NlF2UWVnN3dmNVFDdmZQcFN5MndRR0NZRkJVQ2kvOXF5M25lOEpNWHhRdm82Um9acFpJSEUveVFvU2tucVYyNzNvbjMrOFFscUplWVF3TFN5OEhvaVN2WG9RemR1a0JRbXgvRWtldnZqWVF4NGhDejVKN1EreU02bFF4Y1VXbTMxUWJDNlFxTnVFODUzSHUvRVYvcEw4QUN6L1pFWlJPMElxSElBTEg0VHVQRC9JdHlsT2tPSWZQU2pIUHdqdEUzSmtRbVZXSVRNSUN0QUx3bWFiU0tBZzdyZDE4QmQ2enBJUVlUWm1DMEZlaURkNkJWRjF2emN0c1BkK05oRi9CWkZ5MkZjUWNrWm4vb1lSNkRkNEJaRi9OckY2QUJpQkFqaUJCekVEOUNSN1pBR0N5MFlRSGZoL0k4aDJFbmdTSlNCeGtsQUN3b2ROcERjVURuZ1NDRkFReXdOOEVDaURKZWhtTUZnVy9hZDhBeUY2TFJpRG5qZUQwb0VBTXpCZURwWVFhS2Q2QTlGNlV6aUVUMWlFdm9FQUs3Q0RvMUlxcDhJUS9NVXVETkdEQVVCNVVQYURCeEdBZWhkVkRUQ0hkSmdCQXZCOURCRXBrNUpzRktaWURKR0VBZkFzMXRlRVRxaDlVRWlCL2hSQmJRRmdiZEFISmcxeGhTb0hpVnZJaFlib2hZZzRFZHRHY2trV0ZFd0djVUdCRklDWUVIRFllQU9JRWVUV0pXUkdWQTZSY2dDd1BPSlhpSXdIQUk1M2lSTEJicWRuRWQvV2VvUkhpYkU0aXhrQmJ4OHhpSm9oaHE5SGhIRm9ndXFXY21tbkVLTW9pNlVvYm81WGQ2Sklnc2NJZXVyR2hOUEhqTlJJaXNnNEZLbnpFajNYRURtNGhndlJqTDZJRWZ4bVFnb0JUWVRJRUszbmV0Tm9qTnhvamNKQkhBWjNiU2NCRVJKQWgzTklmUVhSQ0FrUWtBbGdDQVlCQXZ5NGl4VXhjdDAyRUFBbmNBYUJjMVhCQUlTVUZ3NDVFTk9BQ3l5QUMzNlFXaFU1RVZNd0FVMHdBV1hZa1NSWmtpWjVraDRSUVZsQmtSMjVEMDNRTkxrblBCQU5XWkpld0FJODgzd0pjUm9seVdLdmFCRHNhSEltV1gvb3hITzNTRy81VUJRYVlBbHdoWklNWVFxQThnT21VSlJNT1pWVVdaVldhWlVCQVFBaCtRUUJsZ0FBQUN3R0FBWUFXUUNMQUljeXpUTHgwVVh4cFVUeVgwUHlTRVB5VmtQeWVVVHlna1R3eUVUelRVUHh5a1h5aWtUd3gwVHh0a1h5VVVQeHQwVHhya1h4eGtYd3YwVHltRVR5aTBQeHVVVHlha1B4eUVYeHhFWHlhRVB4dTBUeHpFWHh6VVh5a1VUeGxFVHlVa1B5ajBUeGhrVHhwRVR5YmtUeHRFWHh3MFh5bkVUeGdrVHlWRVB5ZTBUeVpVUHhvRVR4c0VUeWVVUHliRVB4c2tUeHUwWHlkRVR4ckVUeWNFUHlaMFB4djBYeGVVVHh6VVR5bWtUeGowVHhrMFB5WTBQeHJrVHlqVVR4cDBUeVdrUHlhVVB4aEVUeG8wVHhkVVB5b1VUeVdFUHlja1B4cVVUeHEwVHhxa1R5azBRQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUkvZ0FIUUFnUUFNSUFBQWdUS2x6SXNLSERoeEFqUmhSd0ljQUZBUXNlRUNUWVFLTEhqeUJETmxTd1VVR0pqUnRGcWx6Sk1tR0VqUkZnQ0VBcG9xWE5teEU3a0toQm9rT0xCQWNFQ0RpUUFLZlJvd2dMakxBeG9nQUJwRkNqU3AxS3RhclZxMWl6YXQwS3NZQ0ZHUmFjSnFBQUFRS0ZvbHl4Z21EeGdBV0lHRE0zMWt4N0ZjTkdEQTFRRXFSN2xjUEdEUmMwYnV6SXQ2b012eHVRNUJnZ0FBRURBUWNMVTdVUVlrRUlJQjhrYTk3TXViUG56NkEvRTNCUXdNRlRBQU1vVUlnYytxYUJDU1ltR0JqZ0FhV0gxamNyYkt5d0FnRktCcmh0M3ZqTFFBSktDY0ZiYXRpb1FZQUIzd0VZR0VqT01nVU9JamhTN0VBNGdEVjFsUVJRL3Z4QWNmcTcrZlBvMDRQT2tFRTlTQlVuRnB4UThlRTVRUVRUM1Urc2VIR0I4WTNJNlFjUlNRU1pCQjFCd0FuNDBFc0V4VlRiUmpvbytKQk9QUG1FMmdFSGVDZmhRa294NWRTR0lJWW80b2drS3VTVkVTNDR4UmhCa0pVSXdGb1Z2UENXWUJ5NWFCZEJlT2tWZ0lzRUJtQlNYQVROUldJU2lCMnhBRkJDRWVVaVpaWmg1dUtUVUVZcFpXR2psZllVVUdVcFdlSnJzYzBHWkFCQ2pxZ2JRYnpwNk9Kd0JHM0FBSTBCRUViaW1BSHd0bUlBTFc0Sm0yd2FQbG1sYVZQMjZlZWZPS1cyMnBNMEJMRkFFRFI4OENCQnQ1WG9BMGtLK0xEQWdkSHhXRklKL3hFVUlJazNCb0NYZmRIbFJ5SUlMMmdnWXd3SXNRZGxBUzRNa1dKNS9vREdLdXVzQzZuNkpLdXVPZ1VxZmk1MlVPb0xQbVVhd0tZak1oaEFUSlFtU0dLUEppMGFRSVFsVW1RUlJxaXBsbWVJOE1sSEg2M2NkdXV0aUhzK05XZWRKS1p3cDNac3VqbmljZ1ExWjJhSmFBYWc1cGRoaWdnbmIxaENvQ1dKWE9MWlo3amZCaXh3aVBudU95S1RJVmp3QWIwdUhoWUFCekxrOEM2SmZxVVpHRXJxaXRncFh1TmV1K0ZhYmIzVnAxZGdmVGp3eVNpako2akhHM2JZRkFIT05rb2loVDIxa0t5THhzWWtMTEVpTWxzQ3FOSzVLRzEvcWJiM1pMYnpaWmJ5MGt5M1pxdUw0WTMzMUs2aWptZ2RkdHJ0N0NLN0FUUjNNN3pFT1F2dG03dXRVTzJnTHZZNzI3K2s4ZG4wMjNBWHhwaHY1QjVjV2NJZnBOdXdVVjhRUzZ5WGl4WExleEZOTnQ3VlFNRm9rZGdERHcvdzBBT3FVNkpBd3d3MGtCZjM1WmhmaGVSUWlZOVl4QXdlRXNCd2lVbzhVR0VMRXhjTEV3eDZsK2h6eHk0SzhWSUVRaXpRNXdITGFaQmhRQUFoL2hWTllXUmxJSGRwZEdnZ1UyTnlaV1Z1Vkc5SGFXWUFPdz09JyB0aXRsZT0n54K55Ye75Y+z5L6n5YiX6KGo6L+b6KGM6Kej5p6QJyBzdHlsZT0nd2lkdGg6NDBweCc+IjsKCiAgICAgICAgICAgIHBsYXlXcmFwSHRtbCArPSAiPGRpdiBjbGFzcz0ncGxheUxpbmVEaXYgemhtX3BsYXlfdmlkZW9fd3JhcCcgc3R5bGU9J2Rpc3BsYXk6bm9uZTsnPiIKCiAgICAgICAgICAgIHBsYXlXcmFwSHRtbCArPSAiPGRpdiBjbGFzcz0nemhtX3BsYXlfdmlkZW9fbGluZSc+IjsKCiAgICAgICAgICAgIHBsYXlXcmFwSHRtbCArPSI8ZGl2Pjx1bCBjbGFzcz0nemhtX3BsYXlfdmlkZV9saW5lX3VsJz4iOwoKICAgICAgICAgICAgcGxheUxpbmUuZm9yRWFjaChmdW5jdGlvbihpdGVtKXsKCiAgICAgICAgICAgICAgICBsZXQgc2VsZWN0ZWQgPSAnJzsKCiAgICAgICAgICAgICAgICBpZihnZXRDb29raWUoJ3BsYXlMaW5lQWN0aW9uJykgPT0gaXRlbS51cmwpewoKICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZD0nemhtX2xpbmVfc2VsZWN0ZWQnOwoKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBwbGF5V3JhcEh0bWwgKz1gPGxpIGNsYXNzPSdwbGF5TGluZVRkIHpobV9wbGF5X3ZpZGVvX2xpbmVfdWxfbGkgJHtzZWxlY3RlZH0nIHVybD0nJHtpdGVtLnVybH0nID4ke2l0ZW0ubmFtZX08L2xpPmA7CgogICAgICAgICAgICB9KQoKICAgICAgICAgICAgcGxheVdyYXBIdG1sICs9IjwvZGl2PjwvZGl2PjwvZGl2PiI7CgogICAgICAgICAgICAvL3RlbXBsYXRlOm5vZGU75pKt5pS+5Yy65Z+fCgogICAgICAgICAgICBsZXQgcGxheUp4SHRtbCA9ICI8ZGl2IGNsYXNzPSd6aG1fcGxheV92aWRlb19qeCc+IjsKCiAgICAgICAgICAgIHBsYXlKeEh0bWwgKz0gIjxpZnJhbWUgYWxsb3d0cmFuc3BhcmVuY3k9dHJ1ZSBmcmFtZWJvcmRlcj0nMCcgc2Nyb2xsaW5nPSdubycgYWxsb3dmdWxsc2NyZWVuPXRydWUgYWxsb3d0cmFuc3BhcmVuY3k9dHJ1ZSBuYW1lPSdqeF9wbGF5JyBzdHlsZT0naGVpZ2h0OjEwMCU7d2lkdGg6MTAwJScgaWQ9J3BsYXlJZnJhbWUnPjwvaWZyYW1lPjwvZGl2PiI7CgogICAgICAgICAgICAvL+W+queOr+WIpOaWreaYr+WQpuWcqOaSreaUvumhte+8jOaYr+WImeaJp+ihjOS4i+mdogogICAgICAgICAgICBsZXQganhWaWRlb0RhdGEgPSBbCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6IiNwbGF5ZXIiLG1hdGNoOi9tXC52XC5xcVwuY29tXC94XC9wbGF5XC5odG1sXD9jaWQ9LyxhcmVhQ2xhc3NOYW1lOidzbGlkZXJfYm94J30sCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6IiNwbGF5ZXIiLG1hdGNoOi9tXC52XC5xcVwuY29tXC9wbGF5XC5odG1sXD9jaWRcPS8sYXJlYUNsYXNzTmFtZTonc2xpZGVyX2JveCd9LAogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIjcGxheWVyIixtYXRjaDovbVwudlwucXFcLmNvbVwvY292ZXJcLy4qaHRtbC8sYXJlYUNsYXNzTmFtZTonc2xpZGVyX2JveCd9LAogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIjcGxheWVyIixtYXRjaDovaHR0cHM/OlwvXC9tXC52XC5xcVwuY29tXC94XC9tXC9wbGF5XD8uKmNpZC4qLyxhcmVhQ2xhc3NOYW1lOidzbGlkZXJfYm94J30sCgogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIubS12aWRlby1wbGF5ZXItd3JhcCIsbWF0Y2g6L15odHRwczpcL1wvbS5pcWl5aVwuY29tXC9bdndhXVxfLyxhcmVhQ2xhc3NOYW1lOidtLXNsaWRpbmctbGlzdCd9LAogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIuaW50bC12aWRlby13cmFwIixtYXRjaDovXmh0dHBzOlwvXC93d3dcLmlxXC5jb21cL3BsYXlcLy8sYXJlYUNsYXNzTmFtZTonbS1zbGlkaW5nLWxpc3QnfSwKCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6IiNwbGF5ZXIiLG1hdGNoOi9tXC55b3VrdVwuY29tXC9hbGlwYXlfdmlkZW9cL2lkXy8sYXJlYUNsYXNzTmFtZTonJ30sCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6IiNwbGF5ZXIiLG1hdGNoOi9tXC55b3VrdVwuY29tXC92aWRlb1wvaWRfLyxhcmVhQ2xhc3NOYW1lOicnfSwKCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6Ii5wbGF5ZXItY29udGFpbmVyIixub2RlVHlwZTonY2xhc3MnLG1hdGNoOi9tXC5iaWxpYmlsaVwuY29tXC9iYW5ndW1pLyxhcmVhQ2xhc3NOYW1lOidlcC1saXN0LXByZS1ib2R5J30sCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6Ii5tcGxheWVyIixub2RlVHlwZTonY2xhc3MnLG1hdGNoOi9tXC5iaWxpYmlsaVwuY29tXC92aWRlb1wvLyxhcmVhQ2xhc3NOYW1lOidlcC1saXN0LXByZS1ib2R5J30sCgogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIudmlkZW8tYXJlYSIsbm9kZVR5cGU6J2NsYXNzJyxtYXRjaDovbVwubWd0dlwuY29tXC9iLyxhcmVhQ2xhc3NOYW1lOidjbGVhcmZpeCd9LAoKICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiI2xlX3BsYXlib3giLG5vZGVUeXBlOidpZCcsbWF0Y2g6L21cLmxlXC5jb21cL3B0dlwvdnBsYXlcLy8sYXJlYUNsYXNzTmFtZTonc2lkZXNsaXBfc2xpZGUnfSwKCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6IiNqLXBsYXllciIsbm9kZVR5cGU6J2lkJyxtYXRjaDovbVwubGVcLmNvbVwvdnBsYXkvLGFyZWFDbGFzc05hbWU6J2p1amknfSwKCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6IiNwbGF5ZXIiLG5vZGVUeXBlOidpZCcsbWF0Y2g6L3BsYXlcLnR1ZG91XC5jb21cL3Zfc2hvd1wvaWRfL30sCgogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIjcHB0dl9wbGF5cGFnZV9ib3giLG5vZGVUeXBlOidpZCcsbWF0Y2g6L3ZcLnBwdHZcLmNvbVwvc2hvd1wvL30sCgogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIjcGxheWVyIixub2RlVHlwZTonaWQnLG1hdGNoOi92aXBcLjE5MDUuY29tXC9wbGF5XC8vfSwKCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6IiN2b2RQbGF5ZXIiLG5vZGVUeXBlOidpZCcsbWF0Y2g6L3d3d1wuMTkwNS5jb21cL3ZvZFwvcGxheVwvL30sCiAgICAgICAgICAgIF07CgogICAgICAgICAgICAvL+WIm+W7umxvZ29faWNvbgogICAgICAgICAgICBjcmVhdGVFbGVtZW50KCdkaXYnLCd6aG1JY29uJyk7CgogICAgICAgICAgICBsZXQgemhtUGxheSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd6aG1JY29uJyk7CgogICAgICAgICAgICB6aG1QbGF5LmlubmVySFRNTCA9IHBsYXlXcmFwSHRtbDsKCiAgICAgICAgICAgIGxldCBqeFZpZGVvV2ViID0ganhWaWRlb0RhdGEuZmlsdGVyKGZ1bmN0aW9uKGl0ZW0pewoKICAgICAgICAgICAgICAgIHJldHVybiBsb2NhdGlvbi5ocmVmLm1hdGNoKGl0ZW0ubWF0Y2gpOwoKICAgICAgICAgICAgfSkKCiAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN6aG1sb2dvJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgbGV0IGp4VmlkZW9XZWIgPSBqeFZpZGVvRGF0YS5maWx0ZXIoZnVuY3Rpb24oaXRlbSl7CgogICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhdGlvbi5ocmVmLm1hdGNoKGl0ZW0ubWF0Y2gpOwoKICAgICAgICAgICAgICAgIH0pCgogICAgICAgICAgICAgICAgaWYoanhWaWRlb1dlYi5sZW5ndGggPT0gMCl7CgogICAgICAgICAgICAgICAgICAgIHRvYXN0KCfor7flnKjop4bpopHmkq3mlL7pobXngrnlh7vlm77moIcnKTsKCiAgICAgICAgICAgICAgICB9ZWxzZXsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHtmdW5jTmFtZSxtYXRjaDpub3dNYXRjaCxub2RlOm5vd05vZGUsbmFtZTpub3dOYW1lfSA9IGp4VmlkZW9XZWJbMF07CgogICAgICAgICAgICAgICAgICAgIGxldCBwbGF5TGluZURpdiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy56aG1fcGxheV92aWRlb193cmFwJyk7CgogICAgICAgICAgICAgICAgICAgIGxldCBwbGF5U2hvdyA9IHBsYXlMaW5lRGl2LnN0eWxlLmRpc3BsYXk7CgogICAgICAgICAgICAgICAgICAgIHBsYXlTaG93ID09ICdub25lJz8gcGxheUxpbmVEaXYuc3R5bGUuZGlzcGxheSA9ICdibG9jayc6cGxheUxpbmVEaXYuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHBsYXlMaW5lVGQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcucGxheUxpbmVUZCcpOwoKICAgICAgICAgICAgICAgICAgICBwbGF5TGluZVRkLmZvckVhY2goZnVuY3Rpb24oaXRlbSl7CgogICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbigpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXlMaW5lVGQuZm9yRWFjaChmdW5jdGlvbihlKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5zZXRBdHRyaWJ1dGUoJ2NsYXNzJywncGxheUxpbmVUZCB6aG1fcGxheV92aWRlb19saW5lX3VsX2xpJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0QXR0cmlidXRlKCdjbGFzcycsJ3BsYXlMaW5lVGQgemhtX3BsYXlfdmlkZW9fbGluZV91bF9saSB6aG1fbGluZV9zZWxlY3RlZCcpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldENvb2tpZSgncGxheUxpbmVBY3Rpb24nLHRoaXMuZ2V0QXR0cmlidXRlKCd1cmwnKSwzMCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5vd1dlYk5vZGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKG5vd05vZGUpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKG5vd1dlYk5vZGUpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3dXZWJOb2RlLmlubmVySFRNTCA9IHBsYXlKeEh0bWw7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwbGF5SWZyYW1lID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3BsYXlJZnJhbWUnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheUlmcmFtZS5zcmM9IGl0ZW0uZ2V0QXR0cmlidXRlKCd1cmwnKStsb2NhdGlvbi5ocmVmOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygn6KeG6aKR572R56uZ57uT54K55LiN5a2Y5ZyoJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICB9KQoKICAgICAgICAgICAgICAgICAgICB9KQoKICAgICAgICAgICAgICAgICAgICBsZXQgdmlkZW9TZWxlY3QgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuJytqeFZpZGVvV2ViWzBdLmFyZWFDbGFzc05hbWUpOwoKICAgICAgICAgICAgICAgICAgICB2aWRlb1NlbGVjdC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oZSl7CgogICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24uaHJlZj1sb2NhdGlvbi5ocmVmOwoKICAgICAgICAgICAgICAgICAgICAgICAgfSwxMDAwKQoKICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgfSkKCiAgICAgICAgICAgIGxldCB0aW1lciA9IHNldEludGVydmFsKGZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgbGV0IGp4VmlkZW9XZWIgPSBqeFZpZGVvRGF0YS5maWx0ZXIoZnVuY3Rpb24oaXRlbSl7CgogICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhdGlvbi5ocmVmLm1hdGNoKGl0ZW0ubWF0Y2gpOwoKICAgICAgICAgICAgICAgIH0pCgogICAgICAgICAgICAgICAgaWYoanhWaWRlb1dlYi5sZW5ndGg+MCl7CgogICAgICAgICAgICAgICAgICAgIGxldCB2aWRlb1NlbGVjdCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy4nK2p4VmlkZW9XZWJbMF0uYXJlYUNsYXNzTmFtZSk7CgogICAgICAgICAgICAgICAgICAgIGlmKHZpZGVvU2VsZWN0KXsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvU2VsZWN0LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbihlKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKGUudGFyZ2V0LnBhcmVudE5vZGUuaHJlZik7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbi5ocmVmPWxvY2F0aW9uLmhyZWY7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwxMDAwKQoKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9LDEwMDApCgogICAgICAgIH0KCiAgICAgICAgcGxheVZpZGVvRnVuYygpOwoKICAgIH1lbHNlewogICAgICAgIC8qLS1jb25maWctLSovCiAgICAgICAgdmFyIENvbmZpZyA9ewoKICAgICAgICBjb3Vwb25Vcmw6d2luZG93LmxvY2F0aW9uLmhyZWYsCgogICAgICAgIGNvdXBvbkhvc3Q6d2luZG93LmxvY2F0aW9uLmhvc3QsCgogICAgICAgIHdlYlVybDonaHR0cDovL211c2ljLmxpdXpoaWppbi5jbi8nLAoKICAgICAgICBpY29uVmlwVG9wOjM2MCwKCiAgICAgICAgaWNvblZpcFBvc2l0aW9uIDogJ2xlZnQnLAoKICAgICAgICBpY29uVmlwV2lkdGggOiA0MCwKCiAgICAgICAgY291cG9uVGltZXJOdW0gOiAxMDAsLy8xMDDmrKHnrYnkuo4xMOenkgoKICAgICAgICBjb3Vwb25XYWl0VGltZSA6IDEwMCwKCiAgICAgICAgaWNvbldhaXRUaW1lIDogMTAwLAoKICAgICAgICBpY29uVmlwT3BhY2l0eToxMDAsCgogICAgICAgIHNlbGVjdGVkTGVmdDonc2VsZWN0ZWQnLAoKICAgICAgICBzZWxlY3RlZFJpZ2h0OicnLAoKICAgICAgICB2aWRlb1BsYXlMaW5lQWRkOkdNX2dldFZhbHVlKCd2aWRlb1BsYXlMaW5lQWRkJywwKSwKCiAgICAgICAgZHlWaWRlb0Rvd25sb2FkOkdNX2dldFZhbHVlKCdkeVZpZGVvRG93bmxvYWQnLDIyKSwKCiAgICAgICAga3NWaWRlb0Rvd25sb2FkOkdNX2dldFZhbHVlKCdrc1ZpZGVvRG93bmxvYWQnLDIyKSwKCiAgICAgICAgeGlndWFWaWRlb0Rvd25sb2FkOkdNX2dldFZhbHVlKCd4aWd1YVZpZGVvRG93bmxvYWQnLDIyKSwKCiAgICAgICAgYmlsaVZpZGVvRG93bmxvYWQ6R01fZ2V0VmFsdWUoJ2JpbGlWaWRlb0Rvd25sb2FkJywyMiksCgogICAgICAgIHlvdXR1YmVWaWRlb0Rvd25sb2FkOkdNX2dldFZhbHVlKCd5b3V0dWJlVmlkZW9Eb3dubG9hZCcsMjIpLAogICAgICAgIH0KCiAgICAgICAgdmFyIHtjb3Vwb25VcmwsCiAgICAgICAgICAgIGNvdXBvbkhvc3QsCiAgICAgICAgICAgIHdlYlVybCwKICAgICAgICAgICAgaWNvblZpcFRvcCwKICAgICAgICAgICAgaWNvblZpcFBvc2l0aW9uLAogICAgICAgICAgICBpY29uVmlwV2lkdGgsCiAgICAgICAgICAgIGljb25WaXBPcGFjaXR5LAogICAgICAgICAgICBjb3Vwb25UaW1lck51bSwKICAgICAgICAgICAgY291cG9uV2FpdFRpbWUsCiAgICAgICAgICAgIGljb25XYWl0VGltZSwKICAgICAgICAgICAgc2VsZWN0ZWRMZWZ0LAogICAgICAgICAgICBzZWxlY3RlZFJpZ2h0LAogICAgICAgICAgICB2aWRlb1BsYXlMaW5lQWRkLAogICAgICAgICAgICBkeVZpZGVvRG93bmxvYWQsCiAgICAgICAgICAgIGtzVmlkZW9Eb3dubG9hZCwKICAgICAgICAgICAgeGlndWFWaWRlb0Rvd25sb2FkLAogICAgICAgICAgICBiaWxpVmlkZW9Eb3dubG9hZCwKICAgICAgICAgICAgeW91dHViZVZpZGVvRG93bmxvYWQKICAgICAgICB9ID0gQ29uZmlnOwogICAgICAgIC8qLS1sYW5nLS0qLwogICAgICAgIHZhciBsYW5nID0gewogICAgICAgICAgICBzZXQ6J+iuvue9ricsCiAgICAgICAgICAgIGljb25Qb3NpdGlvbjon5Zu+5qCH5L2N572uJywKICAgICAgICAgICAgcGxheVZpZGVvOifop4bpopHop6PmnpAnLAogICAgICAgICAgICBwbGF5TXVzaWM6J+mfs+S5kOS4i+i9vScsCiAgICAgICAgICAgIHpoTmljZTon55+l5LmO5aKe5by6JywKICAgICAgICAgICAgdmlkZW9Eb3dubG9hZDon6KeG6aKR5LiL6L29JywKICAgICAgICAgICAgYmFpZHVEb3dubG9hZDon55m+5bqm5LiL6L29JywKICAgICAgICAgICAgaWNvbkhlaWdodDon5Zu+5qCH6auY5bqmJywKICAgICAgICAgICAgaWNvbldpZHRoOiflm77moIflpKflsI8nLAogICAgICAgICAgICBpY29uTGluZTon5rC05bmz5L2N572uJywKICAgICAgICAgICAgaWNvbldhaXRUaW1lOifnrYnlvoXml7bpl7QnLAogICAgICAgICAgICBpY29uTGVmdDon6Z2g5bemJywKICAgICAgICAgICAgaWNvblJpZ2h0OifpnaDlj7MnLAogICAgICAgICAgICB0aXBJY29uSGVpZ2h0Oifpu5jorqQzNjAs5bu66K6uMX41MDAnLAogICAgICAgICAgICB0aXBJY29uV2lkdGg6J+m7mOiupDQwLOW7uuiurjIwfjUwJywKICAgICAgICAgICAgdGlwSWNvbk9wYWNpdHk6J+ivt+Whq+WGmTAtMTAw55qE5pW05pWwJywKICAgICAgICAgICAgdGlwRXJyb3JJY29uSGVpZ2h0Oic85Zu+5qCH5L2N572uPuS4reeahDzlm77moIfpq5jluqY+5bqU5Li6MTAwMOS7peWGheato+aVtOaVsO+8jOW7uuiurjF+NTAwJywKICAgICAgICAgICAgdGlwRXJyb3JJY29uV2lkdGg6Jzzlm77moIfkvY3nva4+5Lit55qEPOWbvuagh+Wkp+Wwjz7lupTkuLoxMDDku6XlhoXmraPmlbTmlbDvvIzlu7rorq4yMH41MCcsCiAgICAgICAgICAgIHRpcEVycm9ySWNvbk9wYWNpdHk6J+Whq+WGmeaVsOWtl+S4jeato+ehricsCiAgICAgICAgICAgIHNldFBsYXlWaWRlbzon6Kej5p6Q6K6+572uJywKICAgICAgICAgICAgcGxheVZpZGVvTGluZUFkZDon56uZ5aSW6Kej5p6QJywKICAgICAgICAgICAgdGlwUGxheVZpZGVvTGluZUFkZDon6K+35aGr5YWl57q/6Lev5ZCN56ew5ZKM5Zyw5Z2A77yM5Lit6Ze055So5Y2K6KeS6YCX5Y+36ZqU5byA77yM5q+P57q/6Lev5LiA6KGM44CCJywKICAgICAgICAgICAgemhTZXQ6J+efpeS5juiuvue9ricsCiAgICAgICAgICAgIHpoVmlkZW9DbG9zZTon5bGP6JS96KeG6aKRJywKICAgICAgICAgICAgemhWaWRlb0Rvd25sb2FkOifop4bpopHkuIvovb0nLAogICAgICAgICAgICB6aEFEQ2xvc2U6J+Wxj+iUveW5v+WRiicsCiAgICAgICAgICAgIHpoQ2xvc2VMZWZ0OiflhbPpl63kvqfovrnmoI8nLAogICAgICAgICAgICB6aENoYW5nZUxpbms6J+mTvuaOpeebtOaOpei3s+i9rCcsCiAgICAgICAgICAgIHNwZWNpYWxDb2x1bW46J+agh+iusOaWh+eroCcsCiAgICAgICAgICAgIHZpZGVvVGl0bGU6J+agh+iusOinhumikScsCiAgICAgICAgICAgIHpoS2V5d29yZENsb3NlOiflsY/olL3lhbPplK7or40nLAogICAgICAgICAgICB0aXBLZXl3b3JkOifor7fovpPlhaXlhbPplK7or40s55SoIiwi5Y+36ZqU5byAJywKICAgICAgICAgICAgYXV0aG9yTmFtZUNsb3NlOiflsY/olL3nlKjmiLcnLAogICAgICAgICAgICB0aXBBdXRob3JOYW1lOifor7fovpPlhaXnlKjmiLflkI0s55SoIiwi5Y+36ZqU5byAJywKICAgICAgICAgICAgeWFueHVhbkNsb3NlOiflsY/olL3nm5DpgIknLAogICAgICAgICAgICBkeVZpZGVvRG93bmxvYWQ6J+aKlumfs+S4i+i9vScsCiAgICAgICAgICAgIGtzVmlkZW9Eb3dubG9hZDon5b+r5omL5LiL6L29JywKICAgICAgICAgICAgeGlndWFWaWRlb0Rvd25sb2FkOifopb/nk5zkuIvovb0nLAogICAgICAgICAgICBiaWxpVmlkZW9Eb3dubG9hZDonQuermSAoYmlsaWJpbGkpIOS4i+i9vScsCiAgICAgICAgICAgIHlvdXR1YmVWaWRlb0Rvd25sb2FkOid5b3V0dWJl5LiL6L29JywKICAgICAgICB9OwoKICAgICAgICAvKi0tZGF0YXMtLSovCiAgICAgICAgdmFyIGRhdGFzID0gewoKICAgICAgICAgICAgZ2V0Q291cG9uOlt7aXNPcGVuOjIyLHdlYjpbCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6ImNvdXBvbiIsbmFtZToidGFvYmFvIixub2RlOiIuSl9MaW5rQWRkIixtYXRjaDovaXRlbVwudGFvYmFvXC5jb20vfSwKICAgICAgICAgICAgICAgIHtmdW5jTmFtZToiY291cG9uIixuYW1lOiJ0bWFsbENhb3NoaSIsbm9kZToiI0pfTGlua0J1eSIsbWF0Y2g6L15odHRwcz86XC9cL2NoYW9zaGkuZGV0YWlsLnRtYWxsLmNvbVwvL30sCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6ImNvdXBvbiIsbmFtZToidG1hbGxDYW9zaGkiLG5vZGU6Ii5BY3Rpb25zLS1sZWZ0QnV0dG9ucy0tMU0zS2tGNyIsbWF0Y2g6L15odHRwcz86XC9cL2NoYW9zaGkuZGV0YWlsLnRtYWxsLmNvbVwvL30sCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6ImNvdXBvbiIsbmFtZToidG1hbGwiLG5vZGU6Ii5CYXNpY0NvbnRlbnQtLWFjdGlvbnMtLTFjbzhzeDgiLG1hdGNoOi9eaHR0cHM/OlwvXC9kZXRhaWxcLnRtYWxsXC5jb20vfSwKICAgICAgICAgICAgICAgIHtmdW5jTmFtZToiY291cG9uIixuYW1lOiJ0bWFsbCIsbm9kZToiI0pfTGlua0J1eSIsbWF0Y2g6L15odHRwcz86XC9cL2RldGFpbFwudG1hbGxcLmNvbS99LAogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJjb3Vwb24iLG5hbWU6InRtYWxsT3RoZXIiLG5vZGU6Ii50bS1tc2ctYm94IixtYXRjaDovXmh0dHBzPzpcL1wvZGV0YWlsXC50bWFsbFwuY29tL30sCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6ImNvdXBvbiIsbmFtZToidG1hbGwiLG5vZGU6Ii5CYXNpY0NvbnRlbnQtLWFjdGlvbnMtLTFjbzhzeDgiLG1hdGNoOi9eaHR0cHM/OlwvXC9kZXRhaWxcLnRtYWxsXC5oay99LAogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJjb3Vwb24iLG5hbWU6ImpkIixub2RlOiIjY2hvb3NlLWJ0bnMiLG1hdGNoOi9pdGVtXC5qZFwuY29tL30sCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6ImNvdXBvbiIsbmFtZToiamQiLG5vZGU6IiNjaG9vc2UtYnRucyIsbWF0Y2g6L1wueWl5YW9qZFwuY29tL30sCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6ImNvdXBvbiIsbmFtZToiamQiLG5vZGU6IiNjaG9vc2UtYnRucyIsbWF0Y2g6L25wY2l0ZW1cLmpkXC5oay99LAogICAgICAgICAgICBdfV0sCiAgICAgICAgICAgIGp4VmlkZW86W3tpc09wZW46R01fZ2V0VmFsdWUoJ21vdmllTGlzdCcsJzIyJyksd2ViOlsKICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIixtYXRjaDovaHR0cHM/OlwvXC92XC5xcVwuY29tLyxuYW1lOidxcVBDJ30sCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG1hdGNoOi9odHRwcz86XC9cL21cLnZcLnFxXC5jb20vLG5hbWU6J3FxTW9iaWxlJ30sCgogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBtYXRjaDovXmh0dHBzPzpcL1wvd3d3XC5pcWl5aVwuY29tLyxuYW1lOidpcWl5aVBjJ30sCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG1hdGNoOi9eaHR0cHM/OlwvXC93d3dcLmlxXC5jb20vfSwKICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiLm0tdmlkZW8tcGxheWVyLXdyYXAiLG1hdGNoOi9eaHR0cHM/OlwvXC9tLmlxaXlpXC5jb20vLGFyZWFDbGFzc05hbWU6J20tc2xpZGluZy1saXN0J30sCgogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIjcGxheWVyIixub2RlVHlwZTonaWQnLG1hdGNoOi9tXC55b3VrdVwuY29tXC9hbGlwYXlfdmlkZW9cL2lkXy99LAogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIjcGxheWVyIixub2RlVHlwZTonaWQnLG1hdGNoOi9tXC55b3VrdVwuY29tXC92aWRlb1wvaWRfL30sCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG1hdGNoOi9eaHR0cHM/OlwvXC8uKnlvdWt1XC5jb20vfSwKCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG1hdGNoOi9eaHR0cHM/OlwvXC93d3dcLmJpbGliaWxpXC5jb20vfSwKICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbWF0Y2g6L15odHRwcz86XC9cL21cLmJpbGliaWxpXC5jb20vfSwKCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6Ii52aWRlby1hcmVhIixub2RlVHlwZTonY2xhc3MnLG1hdGNoOi9tXC5tZ3R2XC5jb21cL2IvfSwKICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbWF0Y2g6L21ndHZcLmNvbS8sYXJlYUNsYXNzTmFtZTonZXBpc29kZS1pdGVtcyBjbGVhcmZpeCd9LAogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIueC1jb3Zlci1wbGF5YnRuLXdyYXAiLG5vZGVUeXBlOidjbGFzcycsbWF0Y2g6Ly50dlwuc29odVwuY29tL30sCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6Ii54LWNvdmVyLXBsYXlidG4td3JhcCIsbm9kZVR5cGU6J2NsYXNzJyxtYXRjaDovbVwudHZcLnNvaHVcLmNvbS99LAogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIjcGxheWVyV3JhcCIsbm9kZVR5cGU6J2lkJyxtYXRjaDovZmlsbVwuc29odVwuY29tL30sCgogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBtYXRjaDovdHVkb3VcLmNvbS99LAoKICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIixtYXRjaDovbGVcLmNvbS99LAoKICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIixtYXRjaDovcHB0dlwuY29tL30sCgogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLG1hdGNoOi8xOTA1XC5jb20vfSwKCiAgICAgICAgICAgIF19XSwKCiAgICAgICAgICAgIGp4TXVzaWM6W3tpc09wZW46R01fZ2V0VmFsdWUoJ211c2ljTGlzdCcsJzIyJyksd2ViOlsKICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheU11c2ljIixuYW1lOiduZXRlYXNlJyxtYXRjaDovXmh0dHBzPzpcL1wvbXVzaWNcLjE2M1wuY29tLyx0aXA6J+ivt+WcqOmfs+S5kOWNleabsumhteeCueWHu+Wbvuagh+S4i+i9vSd9LAoKICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheU11c2ljIixuYW1lOidxcScsbWF0Y2g6L15odHRwcz86XC9cL3lcLnFxXC5jb20vLHRpcDon6K+354K55Ye75pKt5pS+6ZyA6KaB5LiL6L2955qE5q2M5puy77yM5Zyo5pKt5pS+6aG154K55Ye75Zu+5qCH5LiL6L29J30sCgogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5TXVzaWMiLG5hbWU6J2t1Z291JyxtYXRjaDova3Vnb3VcLmNvbS8sdGlwOifor7fngrnlh7vmkq3mlL7pnIDopoHkuIvovb3nmoTmrYzmm7LvvIznhLblkI7lnKjnvZHpobXkuIvmlrnmkq3mlL7lmajlhoXngrnlh7si5LiL6L29Iid9LAoKICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheU11c2ljIixuYW1lOidrdXdvJyxtYXRjaDova3V3b1wuY24vLHRpcDon6K+354K55Ye75pKt5pS+6ZyA6KaB5LiL6L2955qE5q2M5puy77yM54S25ZCO5Zyo572R6aG15LiL5pa55pKt5pS+5Zmo5YaF54K55Ye7IuS4i+i9vSInfSwKCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlNdXNpYyIsbmFtZToneGltYWxheWEnLG1hdGNoOi9eaHR0cHM/OlwvXC93d3dcLnhpbWFsYXlhXC5jb20vLHRpcDon6K+354K55Ye75pKt5pS+6ZyA6KaB5LiL6L2955qE5q2M5puy77yM54S25ZCO5Zyo572R6aG15LiL5pa55pKt5pS+5Zmo5YaF54K55Ye7IuS4i+i9vSInfQogICAgICAgICAgICBdfV0sCgogICAgICAgICAgICBwbGF5TGluZTpbCiAgICAgICAgICAgICAgICB7Im5hbWUiOiLnuq/lh4AxIiwidXJsIjoiaHR0cHM6Ly9pbTE5MDcudG9wLz9qeD0iLCJtb2JpbGUiOjF9LAogICAgICAgICAgICAgICAgeyJuYW1lIjoiQuermTEiLCJ1cmwiOiJodHRwczovL2p4Lmpzb25wbGF5ZXIuY29tL3BsYXllci8/dXJsPSIsIm1vYmlsZSI6MX0sCiAgICAgICAgICAgICAgICB7Im5hbWUiOiLniLHosYYiLCJ1cmwiOiJodHRwczovL2p4LmFpZG91ZXIubmV0Lz91cmw9IiwibW9iaWxlIjoxfSwKICAgICAgICAgICAgICAgIHsibmFtZSI6IkJMIiwidXJsIjoiaHR0cHM6Ly92aXAuYmxqaWV4LmNvbS8/dj0iLCJtb2JpbGUiOjB9LAogICAgICAgICAgICAgICAgeyJuYW1lIjoi5Yaw6LGGIiwidXJsIjoiaHR0cHM6Ly9hcGkucWlhbnFpLm5ldC92aXAvP3VybD0iLCJtb2JpbGUiOjB9LAogICAgICAgICAgICAgICAgeyJuYW1lIjoi55m+5Z+fIiwidXJsIjoiaHR0cHM6Ly9qeC42MThnLmNvbS8/dXJsPSIsIm1vYmlsZSI6MH0sCiAgICAgICAgICAgICAgICB7Im5hbWUiOiJDSyIsInVybCI6Imh0dHBzOi8vd3d3LmNrcGxheWVyLnZpcC9qaWV4aS8/dXJsPSIsIm1vYmlsZSI6MH0sCiAgICAgICAgICAgICAgICB7Im5hbWUiOiJDSG9rIiwidXJsIjoiaHR0cHM6Ly93d3cuZ2FpNC5jb20vP3VybD0iLCJtb2JpbGUiOjF9LAogICAgICAgICAgICAgICAgeyJuYW1lIjoiY2ttb3YiLCJ1cmwiOiJodHRwczovL3d3dy5ja21vdi52aXAvYXBpLnBocD91cmw9IiwibW9iaWxlIjowfSwKICAgICAgICAgICAgICAgIHsibmFtZSI6Ikg4IiwidXJsIjoiaHR0cHM6Ly93d3cuaDhqeC5jb20vamlleGkucGhwP3VybD0iLCJtb2JpbGUiOjB9LAogICAgICAgICAgICAgICAgeyJuYW1lIjoiSlkiLCJ1cmwiOiJodHRwczovL2p4LnBsYXllcmp5LmNvbS8/dXJsPSIsIm1vYmlsZSI6MH0sCiAgICAgICAgICAgICAgICB7Im5hbWUiOiLop6PmnpAiLCJ1cmwiOiJodHRwczovL2NrbW92LmNjeWpqZC5jb20vY2ttb3YvP3VybD0iLCJtb2JpbGUiOjB9LAogICAgICAgICAgICAgICAgeyJuYW1lIjoi6Kej5p6QbGEiLCJ1cmwiOiJodHRwczovL2FwaS5qaWV4aS5sYS8/dXJsPSIsIm1vYmlsZSI6MH0sCiAgICAgICAgICAgICAgICB7Im5hbWUiOiLogIHmnb8iLCJ1cmwiOiJodHRwczovL3ZpcC5sYW9iYW5kcS5jb20vamlleGkucGhwP3VybD0iLCJtb2JpbGUiOjB9LAogICAgICAgICAgICAgICAgeyJuYW1lIjoiTUFPIiwidXJsIjoiaHR0cHM6Ly93d3cubXRvc3ouY29tL20zdTgucGhwP3VybD0iLCJtb2JpbGUiOjB9LAogICAgICAgICAgICAgICAgeyJuYW1lIjoiTTNVOCIsInVybCI6Imh0dHBzOi8vangubTN1OC50di9qaWV4aS8/dXJsPSIsIm1vYmlsZSI6MH0sCiAgICAgICAgICAgICAgICB7Im5hbWUiOiLor7rorq8iLCJ1cmwiOiJodHRwczovL3d3dy5ueGZsdi5jb20vP3VybD0iLCJtb2JpbGUiOjB9LAogICAgICAgICAgICAgICAgeyJuYW1lIjoiT0siLCJ1cmwiOiJodHRwczovL29ranguY2MvP3VybD0iLCJtb2JpbGUiOjF9LAogICAgICAgICAgICAgICAgeyJuYW1lIjoiUE0iLCJ1cmwiOiJodHRwczovL3d3dy5wbGF5bTN1OC5jbi9qaWV4aS5waHA/dXJsPSIsIm1vYmlsZSI6MH0sCiAgICAgICAgICAgICAgICB7Im5hbWUiOiLnm5jlj6QiLCJ1cmwiOiJodHRwczovL3d3dy5wYW5ndWppZXhpLmNjL2ppZXhpLnBocD91cmw9IiwibW9iaWxlIjowfSwKICAgICAgICAgICAgICAgIHsibmFtZSI6IuS4g+WTpSIsInVybCI6Imh0dHBzOi8vangubm54di5jbi90di5waHA/dXJsPSIsIm1vYmlsZSI6MH0sCiAgICAgICAgICAgICAgICB7Im5hbWUiOiJSREhLIiwidXJsIjoiaHR0cHM6Ly9qeC5yZGhrLm5ldC8/dj0iLCJtb2JpbGUiOjF9LAogICAgICAgICAgICAgICAgeyJuYW1lIjoi5Lq65Lq66L+3IiwidXJsIjoiaHR0cHM6Ly9qeC5ibGJvLmNjOjQ0MzMvP3VybD0iLCJtb2JpbGUiOjF9LAogICAgICAgICAgICAgICAgeyJuYW1lIjoi5oCd5LqRIiwidXJsIjoiaHR0cHM6Ly9qeC5hcDJwLmNuLz91cmw9IiwibW9iaWxlIjowfSwKICAgICAgICAgICAgICAgIHsibmFtZSI6IuaAneWPpDMiLCJ1cmwiOiJodHRwczovL2pzYXAuYXR0YWtpZHMuY29tLz91cmw9IiwibW9iaWxlIjoxfSwKICAgICAgICAgICAgICAgIHsibmFtZSI6IuWQrOS5kCIsInVybCI6Imh0dHBzOi8vanguZGo2dS5jb20vP3VybD0iLCJtb2JpbGUiOjF9LAogICAgICAgICAgICAgICAgeyJuYW1lIjoi57u05aSaIiwidXJsIjoiaHR0cHM6Ly9qeC5pdml0by5jbi8/dXJsPSIsIm1vYmlsZSI6MH0sCiAgICAgICAgICAgICAgICB7Im5hbWUiOiLomb7nsbMiLCJ1cmwiOiJodHRwczovL2p4LnhtZmx2LmNvbS8/dXJsPSIsIm1vYmlsZSI6MH0sCiAgICAgICAgICAgICAgICB7Im5hbWUiOiJZVCIsInVybCI6Imh0dHBzOi8vangueWFuZ3R1LnRvcC8/dXJsPSIsIm1vYmlsZSI6MH0sCiAgICAgICAgICAgICAgICB7Im5hbWUiOiLkupHnq68iLCJ1cmwiOiJodHRwczovL3NiLjVnc2VvLm5ldC8/dXJsPSIsIm1vYmlsZSI6MH0sCiAgICAgICAgICAgICAgICB7Im5hbWUiOiLkupHmnpAiLCJ1cmwiOiJodHRwczovL2p4LnlwYXJzZS5jb20vaW5kZXgucGhwP3VybD0iLCJtb2JpbGUiOjB9LAogICAgICAgICAgICAgICAgeyJuYW1lIjoiMDUyMyIsInVybCI6Imh0dHBzOi8vZ28ueWgwNTIzLmNuL3kuY3k/dXJsPSIsIm1vYmlsZSI6MH0sCiAgICAgICAgICAgICAgICB7Im5hbWUiOiIxN+S6kSIsInVybCI6Imh0dHBzOi8vd3d3LjE3MTd5dW4uY29tL2p4L3R5LnBocD91cmw9IiwibW9iaWxlIjowfSwKICAgICAgICAgICAgICAgIHsibmFtZSI6IjE4MCIsInVybCI6Imh0dHBzOi8vanguMDAwMTgwLnRvcC9qeC8/dXJsPSIsIm1vYmlsZSI6MH0sCiAgICAgICAgICAgICAgICB7Im5hbWUiOiI0SyIsInVybCI6Imh0dHBzOi8vanguNGtkdi5jb20vP3VybD0iLCJtb2JpbGUiOjF9LAogICAgICAgICAgICAgICAgeyJuYW1lIjoiODA5MCIsInVybCI6Imh0dHBzOi8vd3d3LjgwOTBnLmNuLz91cmw9IiwibW9iaWxlIjowfQogICAgICAgICAgICBdLAoKICAgICAgICAgICAgemhOaWNlOlt7aXNPcGVuOkdNX2dldFZhbHVlKCd6aGlodUxpc3QnLCcyMicpLHdlYjpbCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6J3poTmljZScsbWF0Y2g6L15odHRwcz86XC9cL1thLXpdK1wuemhpaHVcLmNvbS99CiAgICAgICAgICAgIF19XSwKICAgICAgICAgICAgdGFvYmFvOlt7aXNPcGVuOkdNX2dldFZhbHVlKCd0YW9iYW8nLCcyMicpLHdlYjpbCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6J3Rhb2Jhb1NlYXJjaCcsbWF0Y2g6L15odHRwcz86XC9cL3NcLnRhb2Jhb1wuY29tXC9zZWFyY2hcPy4rL30KICAgICAgICAgICAgXX1dLAoKICAgICAgICAgICAgdmlkZW9Eb3dubG9hZDpbe2lzT3BlbjpHTV9nZXRWYWx1ZSgndmlkZW9Eb3dubG9hZExpc3QnLCcyMicpLHdlYjpbCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6J3ZpZGVvRG93bmxvYWQnLG5hbWU6J2R5VmlkZW9Eb3dubG9hZCcsbWF0Y2g6L15odHRwcz86XC9cL3d3d1wuZG91eWluXC5jb21cLz8uKyQvLGlzV2ViT3BlbjpkeVZpZGVvRG93bmxvYWR9LAogICAgICAgICAgICAgICAge2Z1bmNOYW1lOid2aWRlb0Rvd25sb2FkJyxuYW1lOidrc1ZpZGVvRG93bmxvYWQnLG1hdGNoOi9eaHR0cHM/OlwvXC93d3dcLmt1YWlzaG91XC5jb21cLz8uKyQvLGlzV2ViT3Blbjprc1ZpZGVvRG93bmxvYWR9LAogICAgICAgICAgICAgICAgLy97ZnVuY05hbWU6J3ZpZGVvRG93bmxvYWQnLG5hbWU6J3hpZ3VhVmlkZW9Eb3dubG9hZCcsbWF0Y2g6L15odHRwcz86XC9cL3d3d1wuaXhpZ3VhXC5jb21cL1swLTldK1w/LiskLyxpc1dlYk9wZW46eGlndWFWaWRlb0Rvd25sb2FkfSwKICAgICAgICAgICAgICAgIHtmdW5jTmFtZTondmlkZW9Eb3dubG9hZCcsbmFtZToneGlndWFWaWRlb0Rvd25sb2FkJyxtYXRjaDovXmh0dHBzPzpcL1wvd3d3XC5peGlndWFcLmNvbVwvLyxpc1dlYk9wZW46eGlndWFWaWRlb0Rvd25sb2FkfSwKICAgICAgICAgICAgICAgIHtmdW5jTmFtZTondmlkZW9Eb3dubG9hZCcsbmFtZTonYmlsaVZpZGVvRG93bmxvYWQnLG1hdGNoOi9eaHR0cHM/OlwvXC93d3dcLmJpbGliaWxpXC5jb21cLy8saXNXZWJPcGVuOmJpbGlWaWRlb0Rvd25sb2FkfSwKICAgICAgICAgICAgICAgIHtmdW5jTmFtZTondmlkZW9Eb3dubG9hZCcsbmFtZToneW91dHViZVZpZGVvRG93bmxvYWQnLG1hdGNoOi9eaHR0cHM/OlwvXC93d3dcLnlvdXR1YmVcLmNvbS8saXNXZWJPcGVuOnlvdXR1YmVWaWRlb0Rvd25sb2FkfSwKICAgICAgICAgICAgXX1dLAoKICAgICAgICAgICAgYmFpZHU6W3tpc09wZW46R01fZ2V0VmFsdWUoJ2JhaWR1TGlzdCcsJzIyJyksd2ViOlsKICAgICAgICAgICAgICAgIHtmdW5jTmFtZTonYmFpZHUnLG1hdGNoOi9odHRwcz86XC9cL3BhblwuYmFpZHVcLmNvbS99CiAgICAgICAgICAgIF19XSwKCiAgICAgICAgICAgIGtleUNvZGU6WwogICAgICAgICAgICAgICAge2NvZGU6NDgsaXNTaGlmdDpmYWxzZSx2YWx1ZTonMCd9LAogICAgICAgICAgICAgICAge2NvZGU6NDgsaXNTaGlmdDp0cnVlLHZhbHVlOicpJ30sCiAgICAgICAgICAgICAgICB7Y29kZTo0OSxpc1NoaWZ0OmZhbHNlLHZhbHVlOicxJ30sCiAgICAgICAgICAgICAgICB7Y29kZTo0OSxpc1NoaWZ0OnRydWUsdmFsdWU6JyEnfSwKICAgICAgICAgICAgICAgIHtjb2RlOjUwLGlzU2hpZnQ6ZmFsc2UsdmFsdWU6JzInfSwKICAgICAgICAgICAgICAgIHtjb2RlOjUwLGlzU2hpZnQ6dHJ1ZSx2YWx1ZTonQCd9LAogICAgICAgICAgICAgICAge2NvZGU6NTEsaXNTaGlmdDpmYWxzZSx2YWx1ZTonMyd9LAogICAgICAgICAgICAgICAge2NvZGU6NTEsaXNTaGlmdDp0cnVlLHZhbHVlOicjJ30sCiAgICAgICAgICAgICAgICB7Y29kZTo1Mixpc1NoaWZ0OmZhbHNlLHZhbHVlOic0J30sCiAgICAgICAgICAgICAgICB7Y29kZTo1Mixpc1NoaWZ0OnRydWUsdmFsdWU6JyQnfSwKICAgICAgICAgICAgICAgIHtjb2RlOjUzLGlzU2hpZnQ6ZmFsc2UsdmFsdWU6JzUnfSwKICAgICAgICAgICAgICAgIHtjb2RlOjUzLGlzU2hpZnQ6dHJ1ZSx2YWx1ZTonJSd9LAogICAgICAgICAgICAgICAge2NvZGU6NTQsaXNTaGlmdDpmYWxzZSx2YWx1ZTonNid9LAogICAgICAgICAgICAgICAge2NvZGU6NTQsaXNTaGlmdDp0cnVlLHZhbHVlOideJ30sCiAgICAgICAgICAgICAgICB7Y29kZTo1NSxpc1NoaWZ0OmZhbHNlLHZhbHVlOic3J30sCiAgICAgICAgICAgICAgICB7Y29kZTo1NSxpc1NoaWZ0OnRydWUsdmFsdWU6JyYnfSwKICAgICAgICAgICAgICAgIHtjb2RlOjU2LGlzU2hpZnQ6ZmFsc2UsdmFsdWU6JzgnfSwKICAgICAgICAgICAgICAgIHtjb2RlOjU2LGlzU2hpZnQ6dHJ1ZSx2YWx1ZTonKid9LAogICAgICAgICAgICAgICAge2NvZGU6NTcsaXNTaGlmdDpmYWxzZSx2YWx1ZTonOSd9LAogICAgICAgICAgICAgICAge2NvZGU6NTcsaXNTaGlmdDp0cnVlLHZhbHVlOicoJ30sCiAgICAgICAgICAgICAgICB7Y29kZTo3MCxpc1NoaWZ0OmZhbHNlLHZhbHVlOidmJ30sCiAgICAgICAgICAgICAgICB7Y29kZTo3MCxpc1NoaWZ0OnRydWUsdmFsdWU6J0YnfSwKICAgICAgICAgICAgICAgIHtjb2RlOjc0LGlzU2hpZnQ6ZmFsc2UsdmFsdWU6J2onfSwKICAgICAgICAgICAgICAgIHtjb2RlOjc0LGlzU2hpZnQ6dHJ1ZSx2YWx1ZTonSid9LAogICAgICAgICAgICAgICAge2NvZGU6NzUsaXNTaGlmdDpmYWxzZSx2YWx1ZTonayd9LAogICAgICAgICAgICAgICAge2NvZGU6NzUsaXNTaGlmdDp0cnVlLHZhbHVlOidLJ30sCiAgICAgICAgICAgICAgICB7Y29kZTo3Nixpc1NoaWZ0OmZhbHNlLHZhbHVlOidsJ30sCiAgICAgICAgICAgICAgICB7Y29kZTo3Nixpc1NoaWZ0OnRydWUsdmFsdWU6J0wnfSwKICAgICAgICAgICAgXSwKCiAgICAgICAgICAgIGRvd25sb2FkT3B0aW9uOlt7bmFtZTon55u05o6l5LiL6L29JyxpZDondG9Eb3dubG9hZCd9LHtuYW1lOiflpI3liLbpk77mjqUnLGlkOid0b0NvcHknfSx7bmFtZTon5omT5byA5paH5Lu2JyxpZDondG9MaW5rJ31dCgogICAgICAgIH0KCiAgICAgICAgdmFyIHtnZXRDb3Vwb24sanhWaWRlbyxqeE11c2ljLHBsYXlMaW5lLHpoTmljZSx0YW9iYW8sdmlkZW9Eb3dubG9hZCxrZXlDb2RlLGRvd25sb2FkT3B0aW9uLGJhaWR1fSA9IGRhdGFzOwoKICAgICAgICAvKi0tQ2xhc3MtLSovCiAgICAgICAgY2xhc3MgQmFzZUNsYXNzewoKICAgICAgICAgICAgY29uc3RydWN0b3IoKXsKCiAgICAgICAgICAgICAgICBpZihHTV9nZXRWYWx1ZSgnaWNvblBvc2l0aW9uU2V0UGFnZScpICE9IDApewoKICAgICAgICAgICAgICAgICAgICBpY29uVmlwVG9wID0gR01fZ2V0VmFsdWUoJ2ljb25Ub3AnKSB8fCBHTV9nZXRWYWx1ZSgnaWNvblRvcCcpID09IDA/R01fZ2V0VmFsdWUoJ2ljb25Ub3AnKTppY29uVmlwVG9wOwoKICAgICAgICAgICAgICAgICAgICBpY29uVmlwUG9zaXRpb24gPSBHTV9nZXRWYWx1ZSgnaWNvblBvc2l0aW9uJyk/R01fZ2V0VmFsdWUoJ2ljb25Qb3NpdGlvbicpOmljb25WaXBQb3NpdGlvbjsKCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRMZWZ0ID0gaWNvblZpcFBvc2l0aW9uPT0nbGVmdCc/J3NlbGVjdGVkJzonJzsKCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRSaWdodCA9IGljb25WaXBQb3NpdGlvbj09J3JpZ2h0Jz8nc2VsZWN0ZWQnOicnOwoKICAgICAgICAgICAgICAgICAgICBpY29uVmlwV2lkdGggPSBHTV9nZXRWYWx1ZSgnaWNvbldpZHRoJyk/R01fZ2V0VmFsdWUoJ2ljb25XaWR0aCcpOmljb25WaXBXaWR0aDsKCiAgICAgICAgICAgICAgICAgICAgaWNvbldhaXRUaW1lID0gR01fZ2V0VmFsdWUoJ2ljb25XYWl0VGltZScpP0dNX2dldFZhbHVlKCdpY29uV2FpdFRpbWUnKSoxMDAwOmljb25XYWl0VGltZTsKCiAgICAgICAgICAgICAgICAgICAgaWNvblZpcE9wYWNpdHkgPSBHTV9nZXRWYWx1ZSgnaWNvbk9wYWNpdHknKSB8fCBHTV9nZXRWYWx1ZSgnaWNvbk9wYWNpdHknKSA9PSAwP0dNX2dldFZhbHVlKCdpY29uT3BhY2l0eScpOmljb25WaXBPcGFjaXR5OwoKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBHTV9yZWdpc3Rlck1lbnVDb21tYW5kKCLorr7nva4iLCAoKSA9PiB0aGlzLm1lbnVTZXQoKSk7CgogICAgICAgICAgICB9CgogICAgICAgICAgICBtZW51U2V0KCl7CgogICAgICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgICAgICAgICBsZXQgbWVudVNldFN0eWxlID0gYAogICAgICAgICAgICAgICAgICAgICAgICAuemhtTWFza3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHotaW5kZXg6OTk5OTk5OTk5OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjojMDAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IGZpeGVkO3RvcDogMDtyaWdodDogMDtib3R0b206IDA7bGVmdDogMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wYWNpdHk6MC44OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC53cmFwLWJveHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHotaW5kZXg6MTAwMDAwMDAwMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOmZpeGVkOzt0b3A6IDUwJTtsZWZ0OiA1MCU7dHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTIwMHB4KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiAzMDBweDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiAjNTU1OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDVweDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJmbG93OmhpZGRlbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQ6MTZweCBudW1Gb250LFBpbmdGYW5nU0MtUmVndWxhcixUYWhvbWEsTWljcm9zb2Z0IFlhaGVpLHNhbnMtc2VyaWYgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQtd2VpZ2h0OjQwMCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRXcmFwSGVhZHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6I2YyNDQ0MztoZWlnaHQ6NDBweDtjb2xvcjojZmZmO3RleHQtYWxpZ246Y2VudGVyO2xpbmUtaGVpZ2h0OjQwcHg7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLnNldFdyYXBMaXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbjowcHg7cGFkZGluZzowcHg7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLnNldFdyYXBMaSBsaXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmY7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZWVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luOjBweCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZzoxMnB4IDIwcHg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO2FsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0LXN0eWxlOiBub25lOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAuc2V0V3JhcExpQ29udGVudHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IGZsZXg7anVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO2FsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLnNldFdyYXBTYXZlewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246YWJzb2x1dGU7dG9wOi0ycHg7cmlnaHQ6MTBweDtmb250LXNpemU6MjRweDtjdXJzb3I6cG9pbnRlcgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC5pY29uU2V0Rm9vdHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOmFic29sdXRlO2JvdHRvbTowcHg7cGFkZGluZzoxMHB4IDIwcHg7d2lkdGg6MTAwJTsKICAgICAgICAgICAgICAgICAgICAgICAgei1pbmRleDoxMDAwMDAwMDA5O2JhY2tncm91bmQ6I2ZlZjllZjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAuaWNvblNldEZvb3RMaXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbjowcHg7cGFkZGluZzowcHg7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIC5pY29uU2V0Rm9vdExpIGxpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOjBweCAycHg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47YWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAuaWNvblNldEZvb3RMaSBsaSBhewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6IzU1NTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAuaWNvblNldEZvb3RMaSBhOmhvdmVyIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiNmZTZkNzM7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLmljb25TZXRQYWdlewogICAgICAgICAgICAgICAgICAgICAgICAgICAgei1pbmRleDoxMDAwMDAwMDAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246YWJzb2x1dGU7dG9wOjBweDtsZWZ0OjMwMHB4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZDojZmZmOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6MzAwcHg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6MTAwJTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAuaWNvblNldFVsSGVhZHsKICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZzowcHg7CiAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbjowcHg7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLmljb25TZXRQYWdlSGVhZHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlci1ib3R0b206MXB4IHNvbGlkICNjY2M7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6NDBweDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUtaGVpZ2h0OjQwcHg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6I2ZlNmQ3MzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiNmZmY7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250LXNpemU6IDE1cHg7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLmljb25TZXRQYWdlTGl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW46MHB4O3BhZGRpbmc6MHB4OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC5pY29uU2V0UGFnZUxpIGxpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdC1zdHlsZTogbm9uZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6OHB4IDIwcHg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZWVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC56aGlodVNldFBhZ2V7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB6LWluZGV4OjEwMDAwMDAwMDI7cG9zaXRpb246YWJzb2x1dGU7dG9wOjBweDtsZWZ0OjMwMHB4O2JhY2tncm91bmQ6I2ZmZjt3aWR0aDozMDBweDtoZWlnaHQ6MTAwJTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAuaWNvblNldFBhZ2VJbnB1dHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IGZsZXggIWltcG9ydGFudDtqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47YWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAuemhpaHVTZXRQYWdlTGl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW46MHB4O3BhZGRpbmc6MHB4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OjMwMHB4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmZsb3cteTogc2Nyb2xsOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAuemhpaHVTZXRQYWdlQ29udGVudHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IGZsZXggIWltcG9ydGFudDtqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47YWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLmNpcmN1bGFyewogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDQwcHg7aGVpZ2h0OiAyMHB4O2JvcmRlci1yYWRpdXM6IDE2cHg7dHJhbnNpdGlvbjogLjNzO2N1cnNvcjogcG9pbnRlcjtib3gtc2hhZG93OiAwIDAgM3B4ICM5OTkgaW5zZXQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLnJvdW5kLWJ1dHRvbnsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiAyMHB4O2hlaWdodDogMjBweDs7Ym9yZGVyLXJhZGl1czogNTAlO2JveC1zaGFkb3c6IDAgMXB4IDVweCByZ2JhKDAsMCwwLC41KTt0cmFuc2l0aW9uOiAuM3M7cG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC5iYWNrewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyOiBzb2xpZCAjRkZGOyBib3JkZXItd2lkdGg6IDAgM3B4IDNweCAwOyBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHBhZGRpbmc6IDNweDt0cmFuc2Zvcm06IHJvdGF0ZSgxMzVkZWcpOyAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgxMzVkZWcpO21hcmdpbi1sZWZ0OjEwcHg7Y3Vyc29yOnBvaW50ZXI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLnRvLXJpZ2h0ewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luLWxlZnQ6MjBweDsgZGlzcGxheTogaW5saW5lLWJsb2NrOyBwYWRkaW5nOiAzcHg7dHJhbnNmb3JtOiByb3RhdGUoLTQ1ZGVnKTsgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgtNDVkZWcpO2N1cnNvcjpwb2ludGVyOwoKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAuaWNvblNldFNhdmV7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250LXNpemU6MjRweDtjdXJzb3I6cG9pbnRlcjttYXJnaW4tcmlnaHQ6NXB4O21hcmdpbi1ib3R0b206NHB4O2NvbG9yOiNGRkY7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLnpobV9zZXRfcGFnZXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHotaW5kZXg6MTAwMDAwMDAwMzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOmFic29sdXRlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wOjBweDtsZWZ0OjMwMHB4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZDojZmZmOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6MzAwcHg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6MTAwJTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAuemhtX3NldF9wYWdlX2hlYWRlcnsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlci1ib3R0b206MXB4IHNvbGlkICNjY2M7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6NDBweDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUtaGVpZ2h0OjQwcHg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6I2ZlNmQ3MzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiNmZmY7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250LXNpemU6IDE1cHg7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLnpobV9zZXRfcGFnZV9jb250ZW50ewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogZmxleCAhaW1wb3J0YW50O2p1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjthbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC56aG1fc2V0X3BhZ2VfbGlzdHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbjowcHg7cGFkZGluZzowcHg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IDI4MHB4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmZsb3cteTogc2Nyb2xsOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAuemhtX3NldF9wYWdlX2xpc3Q6Oi13ZWJraXQtc2Nyb2xsYmFyIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8q5rua5Yqo5p2h5pW05L2T5qC35byPKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoIDogMHB4OyAgLyrpq5jlrr3liIbliKvlr7nlupTmqKrnq5bmu5rliqjmnaHnmoTlsLrlr7gqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiAxcHg7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLnpobV9zZXRfcGFnZV9saXN0Ojotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKua7muWKqOadoemHjOmdouWwj+aWueWdlyovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXItcmFkaXVzICAgOiAycHg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmU2ZDczOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC56aG1fc2V0X3BhZ2VfbGlzdDo6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2sgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLyrmu5rliqjmnaHph4zpnaLovajpgZMqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm94LXNoYWRvdyAgIDogaW5zZXQgMCAwIDVweCByZ2JhKDAsIDAsIDAsIDAuMik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kICAgOiAjZWRlZGVkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogMTBweDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAuemhtX3NldF9wYWdlX2xpc3QgbGl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmJvcmRlci1ib3R0b206MXB4IHNvbGlkICNjY2M7Ki8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6MTJweCAyMHB4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheTpibG9jazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlci1ib3R0b206MXB4IHNvbGlkICNlZWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgbGk6bGFzdC1jaGlsZHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlci1ib3R0b206bm9uZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAuemhtX3Njcm9sbHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJmbG93LXk6IHNjcm9sbCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC56aG1fc2Nyb2xsOjotd2Via2l0LXNjcm9sbGJhciB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKua7muWKqOadoeaVtOS9k+agt+W8jyovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCA6IDBweDsgIC8q6auY5a695YiG5Yir5a+55bqU5qiq56uW5rua5Yqo5p2h55qE5bC65a+4Ki8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogMXB4OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC56aG1fc2Nyb2xsOjotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKua7muWKqOadoemHjOmdouWwj+aWueWdlyovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXItcmFkaXVzICAgOiAycHg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmU2ZDczOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC56aG1fc2Nyb2xsOjotd2Via2l0LXNjcm9sbGJhci10cmFjayB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKua7muWKqOadoemHjOmdoui9qOmBkyovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3gtc2hhZG93ICAgOiBpbnNldCAwIDAgNXB4IHJnYmEoMCwgMCwgMCwgMC4yKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQgICA6ICNlZGVkZWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXItcmFkaXVzOiAxMHB4OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC8qLWZvcm0tKi8KICAgICAgICAgICAgICAgICAgICAgICAgOnJvb3QgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLS1iYXNlLWNvbG9yOiAjNDM0YTU2OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLS13aGl0ZS1jb2xvci1wcmltYXJ5OiAjZjdmOGY4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLS13aGl0ZS1jb2xvci1zZWNvbmRhcnk6ICNmZWZlZmU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLWdyYXktY29sb3ItcHJpbWFyeTogI2MyYzJjMjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tZ3JheS1jb2xvci1zZWNvbmRhcnk6ICNjMmMyYzI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLWdyYXktY29sb3ItdGVydGlhcnk6ICM2NzZmNzk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLWFjdGl2ZS1jb2xvcjogIzIyN2M5ZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tdmFsaWQtY29sb3I6ICNjMmMyYzI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLWludmFsaWQtY29sb3I6ICNmNzJmNDc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLWludmFsaWQtaWNvbjogdXJsKCJkYXRhOmltYWdlL3N2Zyt4bWw7Y2hhcnNldD11dGY4LCUzQ3N2ZyUyMHhtbG5zJTNEJTIyaHR0cCUzQSUyRiUyRnd3dy53My5vcmclMkYyMDAwJTJGc3ZnJTIyJTIwd2lkdGglM0QlMjIyNCUyMiUyMGhlaWdodCUzRCUyMjI0JTIyJTIwdmlld0JveCUzRCUyMjAlMjAwJTIwMjQlMjAyNCUyMiUzRSUyMCUzQ3BhdGglMjBkJTNEJTIyTTEzLjQxJTIwMTJsNC4zLTQuMjlhMSUyMDElMjAwJTIwMSUyMDAtMS40Mi0xLjQyTDEyJTIwMTAuNTlsLTQuMjktNC4zYTElMjAxJTIwMCUyMDAlMjAwLTEuNDIlMjAxLjQybDQuMyUyMDQuMjktNC4zJTIwNC4yOWExJTIwMSUyMDAlMjAwJTIwMCUyMDAlMjAxLjQyJTIwMSUyMDElMjAwJTIwMCUyMDAlMjAxLjQyJTIwMGw0LjI5LTQuMyUyMDQuMjklMjA0LjNhMSUyMDElMjAwJTIwMCUyMDAlMjAxLjQyJTIwMCUyMDElMjAxJTIwMCUyMDAlMjAwJTIwMC0xLjQyeiUyMiUyMGZpbGwlM0QlMjIlMjNmNzJmNDclMjIlMjAlMkYlM0UlM0MlMkZzdmclM0UiKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAudGV4dC1pbnB1dCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250LXNpemU6IDE2cHg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByaWdodDowcHg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB6LWluZGV4OiAwOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC50ZXh0LWlucHV0X19ib2R5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1tb3otYXBwZWFyYW5jZTogbm9uZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVhcmFuY2U6IG5vbmU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWdyYXktY29sb3ItcHJpbWFyeSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXItcmFkaXVzOiAzcHg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IDEuN2VtOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZS1oZWlnaHQ6IDEuNzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOiAycHggMWVtOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIDAuM3M7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDo1NSU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250LXNpemU6MTRweDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAudGV4dC1pbnB1dF9fYm9keTotbXMtaW5wdXQtcGxhY2Vob2xkZXIgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6IHZhcigtLWdyYXktY29sb3Itc2Vjb25kYXJ5KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAudGV4dC1pbnB1dF9fYm9keTo6LW1vei1wbGFjZWhvbGRlciB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogdmFyKC0tZ3JheS1jb2xvci1zZWNvbmRhcnkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC50ZXh0LWlucHV0X19ib2R5OjpwbGFjZWhvbGRlciB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogdmFyKC0tZ3JheS1jb2xvci1zZWNvbmRhcnkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICosIDo6YWZ0ZXIsIDo6YmVmb3JlIHsKICAgICAgICAgICAgICAgICAgICAgICAgYm94LXNpemluZzogaW5pdGlhbCAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC50ZXh0LWlucHV0X19ib2R5W2RhdGEtaXMtdmFsaWRdIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmctcmlnaHQ6IDFlbTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAudGV4dC1pbnB1dF9fYm9keVtkYXRhLWlzLXZhbGlkPXRydWVdIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlci1jb2xvcjogdmFyKC0tdmFsaWQtY29sb3IpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC50ZXh0LWlucHV0X19ib2R5W2RhdGEtaXMtdmFsaWQ9ZmFsc2VdIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlci1jb2xvcjogdmFyKC0taW52YWxpZC1jb2xvcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3gtc2hhZG93OiBpbnNldCAwIDAgMCAxcHggdmFyKC0taW52YWxpZC1jb2xvcik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLnRleHQtaW5wdXRfX2JvZHk6Zm9jdXMgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1hY3RpdmUtY29sb3IpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm94LXNoYWRvdzogaW5zZXQgMCAwIDAgMXB4IHZhcigtLWFjdGl2ZS1jb2xvcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC50ZXh0LWlucHV0X19ib2R5Oi13ZWJraXQtYXV0b2ZpbGwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvbi1kZWxheTogOTk5OXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtd2Via2l0LXRyYW5zaXRpb24tcHJvcGVydHk6IGJhY2tncm91bmQtY29sb3I7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uLXByb3BlcnR5OiBiYWNrZ3JvdW5kLWNvbG9yOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC50ZXh0LWlucHV0X192YWxpZGF0b3IgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogcmlnaHQgMC41ZW0gY2VudGVyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQtc2l6ZTogMS41ZW07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0OiAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wOiAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB6LWluZGV4OiAtMTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAudGV4dC1pbnB1dF9fYm9keVtkYXRhLWlzLXZhbGlkPWZhbHNlXSArIC50ZXh0LWlucHV0X192YWxpZGF0b3IgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC1pbWFnZTogdmFyKC0taW52YWxpZC1pY29uKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAuc2VsZWN0LWJveCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3gtc2l6aW5nOiBpbmhlcml0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udC1zaXplOiAxNnB4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZC1jb2xvciAwLjVzIGVhc2Utb3V0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6OTBweDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAuc2VsZWN0LWJveDo6YWZ0ZXIgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1ncmF5LWNvbG9yLXNlY29uZGFyeSkgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXItc3R5bGU6IHNvbGlkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyLXdpZHRoOiA2cHggNHB4IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3R0b206IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50OiAiIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbjogYXV0byAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByaWdodDogLTcycHg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3A6IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHotaW5kZXg6IDE7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLnNlbGVjdC1ib3hfX2JvZHkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm94LXNpemluZzogaW5oZXJpdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1tb3otYXBwZWFyYW5jZTogbm9uZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVhcmFuY2U6IG5vbmU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWdyYXktY29sb3ItcHJpbWFyeSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXItcmFkaXVzOiAzcHg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IDEuN2VtOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZS1oZWlnaHQ6IDEuNzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmctbGVmdDogMWVtOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZy1yaWdodDogY2FsYygxZW0gKyAxNnB4KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiAxNDAlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udC1zaXplOjE0cHg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWRkaW5nLXRvcDoycHg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWRkaW5nLWJvdHRvbToycHg7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLnNlbGVjdC1ib3hfX2JvZHlbZGF0YS1pcy12YWxpZD10cnVlXSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXItY29sb3I6IHZhcigtLXZhbGlkLWNvbG9yKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMCAwIDFweCB2YXIoLS12YWxpZC1jb2xvcik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLnNlbGVjdC1ib3hfX2JvZHlbZGF0YS1pcy12YWxpZD1mYWxzZV0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1pbnZhbGlkLWNvbG9yKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMCAwIDFweCB2YXIoLS1pbnZhbGlkLWNvbG9yKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAuc2VsZWN0LWJveF9fYm9keS5mb2N1cy12aXNpYmxlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlci1jb2xvcjogdmFyKC0tYWN0aXZlLWNvbG9yKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMCAwIDFweCB2YXIoLS1hY3RpdmUtY29sb3IpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAuc2VsZWN0LWJveF9fYm9keTotd2Via2l0LWF1dG9maWxsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb24tZGVsYXk6IDk5OTlzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLXdlYmtpdC10cmFuc2l0aW9uLXByb3BlcnR5OiBiYWNrZ3JvdW5kLWNvbG9yOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvbi1wcm9wZXJ0eTogYmFja2dyb3VuZC1jb2xvcjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAudGV4dGFyZWFfX2JvZHkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLW1vei1hcHBlYXJhbmNlOiBub25lOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZWFyYW5jZTogbm9uZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tZ3JheS1jb2xvci1wcmltYXJ5KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udDogaW5oZXJpdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQ6IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXR0ZXItc3BhY2luZzogaW5oZXJpdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOiAxZW07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNpemU6IG5vbmU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3A6IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIDAuNXMgZWFzZS1vdXQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLnRleHRhcmVhX19ib2R5Om9ubHktY2hpbGQgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzaXplOiB2ZXJ0aWNhbDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAudGV4dGFyZWFfX2JvZHk6Zm9jdXMgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1hY3RpdmUtY29sb3IpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm94LXNoYWRvdzogaW5zZXQgMCAwIDAgMXB4IHZhcigtLWFjdGl2ZS1jb2xvcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC50ZXh0YXJlYV9fYm9keVtkYXRhLWlzLXZhbGlkPXRydWVdIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlci1jb2xvcjogdmFyKC0tdmFsaWQtY29sb3IpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm94LXNoYWRvdzogaW5zZXQgMCAwIDAgMXB4IHZhcigtLXZhbGlkLWNvbG9yKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAudGV4dGFyZWFfX2JvZHlbZGF0YS1pcy12YWxpZD1mYWxzZV0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1pbnZhbGlkLWNvbG9yKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMCAwIDFweCB2YXIoLS1pbnZhbGlkLWNvbG9yKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLnRleHRhcmVhIC5fZHVtbXktYm94IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbi1oZWlnaHQ6IDI0MHB4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJmbG93LXdyYXA6IGJyZWFrLXdvcmQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOiAxZW07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aXNpYmlsaXR5OiBoaWRkZW47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLnRvTGVmdE1vdmV7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuaW1hdGlvbjptb3ZlVG9MZWZ0IDAuNXMgaW5maW5pdGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtd2Via2l0LWFuaW1hdGlvbjptb3ZlVG9MZWZ0IDAuNXMgaW5maW5pdGU7IC8qU2FmYXJpIGFuZCBDaHJvbWUqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDoxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbWF0aW9uLWZpbGwtbW9kZTogZm9yd2FyZHM7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIEBrZXlmcmFtZXMgbW92ZVRvTGVmdHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20ge2xlZnQ6MjAwcHg7fQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8ge2xlZnQ6MHB4O30KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgQC13ZWJraXQta2V5ZnJhbWVzIG1vdmVUb0xlZnQgLypTYWZhcmkgYW5kIENocm9tZSovewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSB7bGVmdDoyMDBweDt9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byB7bGVmdDowcHg7fQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAudG9SaWdodE1vdmV7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuaW1hdGlvbjptb3ZlVG9SaWdodCAycyBpbmZpbml0ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC13ZWJraXQtYW5pbWF0aW9uOm1vdmVUb1JpZ2h0IDJzIGluZmluaXRlOyAvKlNhZmFyaSBhbmQgQ2hyb21lKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6MTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW1hdGlvbi1maWxsLW1vZGU6IGZvcndhcmRzOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIEBrZXlmcmFtZXMgbW92ZVRvUmlnaHR7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIHtsZWZ0OjBweDt9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byB7bGVmdDoyMDAwcHg7fQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBALXdlYmtpdC1rZXlmcmFtZXMgbW92ZVRvUmlnaHQgLypTYWZhcmkgYW5kIENocm9tZSovewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSB7bGVmdDowcHg7fQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8ge2xlZnQ6MjAwcHg7fQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYDsKCiAgICAgICAgICAgICAgICBkb21TdHlsZSAuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUobWVudVNldFN0eWxlKSk7CgogICAgICAgICAgICAgICAgZG9tSGVhZC5hcHBlbmRDaGlsZChkb21TdHlsZSk7CgogICAgICAgICAgICAgICAgdmFyIHNldExpc3RKc29uPSBbCiAgICAgICAgICAgICAgICAgICAgeydsaXN0TmFtZSc6bGFuZy5pY29uUG9zaXRpb24sJ3NldExpc3RJRCc6J2ljb25Qb3NpdGlvblNldFBhZ2UnLCdzZXRQYWdlSUQnOidtb3ZpZUljb25TZXRQYWdlJywndGFrZVBsYWNlJzonMHB4J30sCiAgICAgICAgICAgICAgICAgICAgeydsaXN0TmFtZSc6bGFuZy5wbGF5VmlkZW8sJ3NldExpc3RJRCc6J21vdmllTGlzdCcsJ3NldFBhZ2VJRCc6J21vdmllVmlkZW9TZXRQYWdlJywndGFrZVBsYWNlJzonMHB4J30sCiAgICAgICAgICAgICAgICAgICAgeydsaXN0TmFtZSc6bGFuZy5wbGF5TXVzaWMsJ3NldExpc3RJRCc6J211c2ljTGlzdCcsJ3NldFBhZ2VJRCc6JycsJ3Rha2VQbGFjZSc6JzBweCd9LAogICAgICAgICAgICAgICAgICAgIHsnbGlzdE5hbWUnOmxhbmcuemhOaWNlLCdzZXRMaXN0SUQnOid6aGlodUxpc3QnLCdzZXRQYWdlSUQnOid6aGlodUljb25TZXRQYWdlJywndGFrZVBsYWNlJzonMHB4J30sCiAgICAgICAgICAgICAgICAgICAgeydsaXN0TmFtZSc6bGFuZy52aWRlb0Rvd25sb2FkLCdzZXRMaXN0SUQnOid2aWRlb0Rvd25sb2FkTGlzdCcsJ3NldFBhZ2VJRCc6J3ZpZGVvRG93bmxvYWRTZXRQYWdlJywndGFrZVBsYWNlJzonMHB4J30sCiAgICAgICAgICAgICAgICAgICAgeydsaXN0TmFtZSc6bGFuZy5iYWlkdURvd25sb2FkLCdzZXRMaXN0SUQnOidiYWlkdUxpc3QnLCdzZXRQYWdlSUQnOicnLCd0YWtlUGxhY2UnOicwcHgnfSwKICAgICAgICAgICAgICAgIF07CgogICAgICAgICAgICAgICAgdmFyIHpoaWh1T3B0aW9uSnNvbiA9IFsKICAgICAgICAgICAgICAgICAgICB7J29wdGlvbk5hbWUnOmxhbmcuemhWaWRlb0Nsb3NlLCdvcHRpb25JRCc6J3JlbW92ZVZpZGVvJywnZGVmYXVsdCc6JzAnfSwKICAgICAgICAgICAgICAgICAgICB7J29wdGlvbk5hbWUnOmxhbmcuemhWaWRlb0Rvd25sb2FkLCdvcHRpb25JRCc6J2Rvd25sb2FkVmlkZW8nLCdkZWZhdWx0JzonMjInfSwKICAgICAgICAgICAgICAgICAgICB7J29wdGlvbk5hbWUnOmxhbmcuemhBRENsb3NlLCdvcHRpb25JRCc6J3JlbW92ZUFEJywnZGVmYXVsdCc6JzIyJ30sCiAgICAgICAgICAgICAgICAgICAgeydvcHRpb25OYW1lJzpsYW5nLnpoQ2xvc2VMZWZ0LCdvcHRpb25JRCc6J3JlbW92ZVJpZ2h0JywnZGVmYXVsdCc6JzAnfSwKICAgICAgICAgICAgICAgICAgICB7J29wdGlvbk5hbWUnOmxhbmcuemhDaGFuZ2VMaW5rLCdvcHRpb25JRCc6J2NoYW5nZUxpbmsnLCdkZWZhdWx0JzonMjInfSwKICAgICAgICAgICAgICAgICAgICB7J29wdGlvbk5hbWUnOmxhbmcuc3BlY2lhbENvbHVtbiwnb3B0aW9uSUQnOidzcGVjaWFsQ29sdW1uJywnZGVmYXVsdCc6MjJ9LAogICAgICAgICAgICAgICAgICAgIHsnb3B0aW9uTmFtZSc6bGFuZy52aWRlb1RpdGxlLCdvcHRpb25JRCc6J3ZpZGVvVGl0bGUnLCdkZWZhdWx0JzoyMn0sCiAgICAgICAgICAgICAgICAgICAgeydvcHRpb25OYW1lJzpsYW5nLnpoS2V5d29yZENsb3NlLCdvcHRpb25JRCc6J3JlbW92ZUtleXdvcmQnLCdkZWZhdWx0JzonMCd9LAogICAgICAgICAgICAgICAgICAgIHsnb3B0aW9uTmFtZSc6bGFuZy5hdXRob3JOYW1lQ2xvc2UsJ29wdGlvbklEJzoncmVtb3ZlQXV0aG9yTmFtZScsJ2RlZmF1bHQnOicyMid9LAogICAgICAgICAgICAgICAgICAgIHsnb3B0aW9uTmFtZSc6bGFuZy55YW54dWFuQ2xvc2UsJ29wdGlvbklEJzoncmVtb3ZlWWFueHVhbicsJ2RlZmF1bHQnOicwJ30KICAgICAgICAgICAgICAgIF07CgogICAgICAgICAgICAgICAgdmFyIHBsYXlWaWRlb09wdGlvbkpzb24gPXsKICAgICAgICAgICAgICAgICAgICAnb3B0aW9uTmFtZSc6bGFuZy5wbGF5VmlkZW9MaW5lQWRkLAogICAgICAgICAgICAgICAgICAgICdvcHRpb25JRCc6J3ZpZGVvUGxheUxpbmVBZGQnLAogICAgICAgICAgICAgICAgICAgICdkZWZhdWx0Jzp2aWRlb1BsYXlMaW5lQWRkLAogICAgICAgICAgICAgICAgICAgICd0ZXh0YXJlYSc6J3ZpZGVvUGxheUxpbmVBZGRUZXh0YXJlYScsCiAgICAgICAgICAgICAgICAgICAgJ3RleHRhcmVhSWQnOidwbGF5VmlkZW9MaW5lVGV4dGFyZWEnLAogICAgICAgICAgICAgICAgICAgICd0aXAnOgpg57qv5YeAMSxodHRwczovL2ltMTkwNy50b3AvP2p4PQpC56uZMSxodHRwczovL2p4Lmpzb25wbGF5ZXIuY29tL3BsYXllci8/dXJsPQrniLHosYYsaHR0cHM6Ly9qeC5haWRvdWVyLm5ldC8/dXJsPQpCTCxodHRwczovL3ZpcC5ibGppZXguY29tLz92PQrlhrDosYYsaHR0cHM6Ly9hcGkucWlhbnFpLm5ldC92aXAvP3VybD0K55m+5Z+fLGh0dHBzOi8vanguNjE4Zy5jb20vP3VybD0KQ0ssaHR0cHM6Ly93d3cuY2twbGF5ZXIudmlwL2ppZXhpLz91cmw9CkNIb2ssaHR0cHM6Ly93d3cuZ2FpNC5jb20vP3VybD0KY2ttb3YsaHR0cHM6Ly93d3cuY2ttb3YudmlwL2FwaS5waHA/dXJsPQpIOCxodHRwczovL3d3dy5oOGp4LmNvbS9qaWV4aS5waHA/dXJsPQpKWSxodHRwczovL2p4LnBsYXllcmp5LmNvbS8/dXJsPQrop6PmnpAsaHR0cHM6Ly9ja21vdi5jY3lqamQuY29tL2NrbW92Lz91cmw9Cuino+aekGxhLGh0dHBzOi8vYXBpLmppZXhpLmxhLz91cmw9CuiAgeadvyxodHRwczovL3ZpcC5sYW9iYW5kcS5jb20vamlleGkucGhwP3VybD0KTUFPLGh0dHBzOi8vd3d3Lm10b3N6LmNvbS9tM3U4LnBocD91cmw9Ck0zVTgsaHR0cHM6Ly9qeC5tM3U4LnR2L2ppZXhpLz91cmw9CuivuuiuryxodHRwczovL3d3dy5ueGZsdi5jb20vP3VybD0KT0ssaHR0cHM6Ly9va2p4LmNjLz91cmw9ClBNLGh0dHBzOi8vd3d3LnBsYXltM3U4LmNuL2ppZXhpLnBocD91cmw9CuebmOWPpCxodHRwczovL3d3dy5wYW5ndWppZXhpLmNjL2ppZXhpLnBocD91cmw9CuS4g+WTpSxodHRwczovL2p4Lm5ueHYuY24vdHYucGhwP3VybD0KUkRISyxodHRwczovL2p4LnJkaGsubmV0Lz92PQrkurrkurrov7csaHR0cHM6Ly9qeC5ibGJvLmNjOjQ0MzMvP3VybD0K5oCd5LqRLGh0dHBzOi8vanguYXAycC5jbi8/dXJsPQrmgJ3lj6QzLGh0dHBzOi8vanNhcC5hdHRha2lkcy5jb20vP3VybD0K5ZCs5LmQLGh0dHBzOi8vanguZGo2dS5jb20vP3VybD0K57u05aSaLGh0dHBzOi8vanguaXZpdG8uY24vP3VybD0K6Jm+57GzLGh0dHBzOi8vangueG1mbHYuY29tLz91cmw9CllULGh0dHBzOi8vangueWFuZ3R1LnRvcC8/dXJsPQrkupHnq68saHR0cHM6Ly9zYi41Z3Nlby5uZXQvP3VybD0K5LqR5p6QLGh0dHBzOi8vangueXBhcnNlLmNvbS9pbmRleC5waHA/dXJsPQowNTIzLGh0dHBzOi8vZ28ueWgwNTIzLmNuL3kuY3k/dXJsPQoxN+S6kSxodHRwczovL3d3dy4xNzE3eXVuLmNvbS9qeC90eS5waHA/dXJsPQoxODAsaHR0cHM6Ly9qeC4wMDAxODAudG9wL2p4Lz91cmw9CjRLLGh0dHBzOi8vanguNGtkdi5jb20vP3VybD0KODA5MCxodHRwczovL3d3dy44MDkwZy5jbi8/dXJsPWAsCiAgICAgICAgICAgICAgICAgICAgICd2YWx1ZU5hbWUnOidwbGF5VmlkZW9MaW5lVGV4dCd9CgogICAgICAgICAgICAgICAgdmFyIHZpZGVvRG93bmxvYWRPcHRpb25Kc29uID0gWwogICAgICAgICAgICAgICAgICAgIHsnb3B0aW9uTmFtZSc6bGFuZy5keVZpZGVvRG93bmxvYWQsJ29wdGlvbklEJzonZHlWaWRlb0Rvd25sb2FkJywnZGVmYXVsdCc6ZHlWaWRlb0Rvd25sb2FkfSwKICAgICAgICAgICAgICAgICAgICB7J29wdGlvbk5hbWUnOmxhbmcua3NWaWRlb0Rvd25sb2FkLCdvcHRpb25JRCc6J2tzVmlkZW9Eb3dubG9hZCcsJ2RlZmF1bHQnOmtzVmlkZW9Eb3dubG9hZH0sCiAgICAgICAgICAgICAgICAgICAgeydvcHRpb25OYW1lJzpsYW5nLnhpZ3VhVmlkZW9Eb3dubG9hZCwnb3B0aW9uSUQnOid4aWd1YVZpZGVvRG93bmxvYWQnLCdkZWZhdWx0Jzp4aWd1YVZpZGVvRG93bmxvYWR9LAogICAgICAgICAgICAgICAgICAgIHsnb3B0aW9uTmFtZSc6bGFuZy5iaWxpVmlkZW9Eb3dubG9hZCwnb3B0aW9uSUQnOidiaWxpVmlkZW9Eb3dubG9hZCcsJ2RlZmF1bHQnOmJpbGlWaWRlb0Rvd25sb2FkfSwKICAgICAgICAgICAgICAgICAgICB7J29wdGlvbk5hbWUnOmxhbmcueW91dHViZVZpZGVvRG93bmxvYWQsJ29wdGlvbklEJzoneW91dHViZVZpZGVvRG93bmxvYWQnLCdkZWZhdWx0Jzp5b3V0dWJlVmlkZW9Eb3dubG9hZH0sCiAgICAgICAgICAgICAgICBdOwoKICAgICAgICAgICAgICAgIHZhciBzZXRIdG1sID0gIjxkaXYgaWQ9J3NldE1hc2snIGNsYXNzPSd6aG1NYXNrJz48L2Rpdj4iOwoKICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPGRpdiBjbGFzcz0nd3JhcC1ib3gnIGlkPSdzZXRXcmFwJz4iOwoKICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPGRpdiBjbGFzcz0naWNvblNldFBhZ2UnIGlkPSdtb3ZpZUljb25TZXRQYWdlJz4iOwoKICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPHVsIGNsYXNzPSdpY29uU2V0VWxIZWFkJz48bGkgY2xhc3M9J2ljb25TZXRQYWdlSGVhZCc+PHNwYW4gY2xhc3M9J2JhY2snPjwvc3Bhbj48c3Bhbj4iK2xhbmcuaWNvblBvc2l0aW9uKyI8L3NwYW4+PHNwYW4gY2xhc3M9J2ljb25TZXRTYXZlJz7Dlzwvc3Bhbj48L2xpPjwvdWw+IjsKCiAgICAgICAgICAgICAgICBzZXRIdG1sICs9Ijx1bCBjbGFzcz0naWNvblNldFBhZ2VMaSc+IjsKCiAgICAgICAgICAgICAgICBzZXRIdG1sICs9IjxsaT4iK2xhbmcuaWNvbkhlaWdodCsi77yaPHNwYW4gY2xhc3M9J3RleHQtaW5wdXQnPjxpbnB1dCBjbGFzcz0ndGV4dC1pbnB1dF9fYm9keScgaWQ9J2ljb25Ub3AnIHZhbHVlPSciK2ljb25WaXBUb3ArIicgcGxhY2Vob2xkZXI9JyIrbGFuZy50aXBJY29uSGVpZ2h0KyInPjxzcGFuIGNsYXNzPSd0ZXh0LWlucHV0X192YWxpZGF0b3InPjwvc3Bhbj48L3NwYW4+PC9saT4iOwoKICAgICAgICAgICAgICAgIHNldEh0bWwgKz0gIjxsaSAgc3R5bGU9J2Rpc3BsYXk6IGlubGluZS1mbGV4Oyc+PHNwYW4gc3R5bGU9J3BhZGRpbmctdG9wOjRweDsnPiIrbGFuZy5pY29uTGluZSsi77yaPC9zcGFuPjxkaXYgY2xhc3M9J3NlbGVjdC1ib3gnPjxzZWxlY3QgY2xhc3M9J3NlbGVjdC1ib3hfX2JvZHknIGlkPSdpY29uUG9zaXRpb24nPiI7CgogICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8b3B0aW9uIHZhbHVlPSdsZWZ0JyAiK3NlbGVjdGVkTGVmdCsiPiIrbGFuZy5pY29uTGVmdCsiPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0ncmlnaHQnICIrc2VsZWN0ZWRSaWdodCsiPiIrbGFuZy5pY29uUmlnaHQrIjwvb3B0aW9uPiI7CgogICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8L3NlbGVjdD48L2Rpdj48L2xpPiIKCiAgICAgICAgICAgICAgICBzZXRIdG1sICs9IjxsaT4iK2xhbmcuaWNvbldpZHRoKyLvvJo8c3BhbiBjbGFzcz0ndGV4dC1pbnB1dCc+PGlucHV0IGNsYXNzPSd0ZXh0LWlucHV0X19ib2R5JyBpZD0naWNvbldpZHRoJyB2YWx1ZT0nIitpY29uVmlwV2lkdGgrIicgcGxhY2Vob2xkZXI9JyIrbGFuZy50aXBJY29uV2lkdGgrIic+PHNwYW4gY2xhc3M9J3RleHQtaW5wdXRfX3ZhbGlkYXRvcic+PC9zcGFuPjwvc3Bhbj48L2xpPiI7CgogICAgICAgICAgICAgICAgc2V0SHRtbCArPSAiPGxpICBzdHlsZT0nZGlzcGxheTogaW5saW5lLWZsZXg7Jz48c3BhbiBzdHlsZT0ncGFkZGluZy10b3A6NHB4Oyc+IitsYW5nLmljb25XYWl0VGltZSsi77yaPC9zcGFuPjxkaXYgY2xhc3M9J3NlbGVjdC1ib3gnPjxzZWxlY3QgY2xhc3M9J3NlbGVjdC1ib3hfX2JvZHknIGlkPSdpY29uV2FpdFRpbWUnPiI7CgogICAgICAgICAgICAgICAgZm9yKGxldCBpID0xO2k8PTg7aSsrKXsKCiAgICAgICAgICAgICAgICAgICAgbGV0IGljb25TZWxlY3RlZCA9IEdNX2dldFZhbHVlKCdpY29uV2FpdFRpbWUnKT09aS8yPydzZWxlY3RlZCc6Jyc7CgogICAgICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPG9wdGlvbiB2YWx1ZT0iK2kvMisiICIraWNvblNlbGVjdGVkKyI+IitpLzIrIuenkjwvb3B0aW9uPiI7CgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPC9zZWxlY3Q+PC9kaXY+PC9saT4iOwoKICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPGxpPumAjyDmmI4g5bqmIO+8mjxzcGFuIGNsYXNzPSd0ZXh0LWlucHV0Jz48aW5wdXQgY2xhc3M9J3RleHQtaW5wdXRfX2JvZHknIGlkPSdpY29uT3BhY2l0eScgdmFsdWU9JyIraWNvblZpcE9wYWNpdHkrIicgcGxhY2Vob2xkZXI9JyIrbGFuZy50aXBJY29uT3BhY2l0eSsiJz48L3NwYW4+PC9saT4iOwoKICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPC91bD48L2Rpdj4iOwoKICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPGRpdiBjbGFzcz0nemhtX3NldF9wYWdlJyBpZD0ndmlkZW9Eb3dubG9hZFNldFBhZ2UnPiI7CgogICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8dWwgY2xhc3M9J2ljb25TZXRVbEhlYWQnPjxsaSBjbGFzcz0nemhtX3NldF9wYWdlX2hlYWRlcic+PHNwYW4gY2xhc3M9J2JhY2snPjwvc3Bhbj48c3Bhbj4iK2xhbmcudmlkZW9Eb3dubG9hZCsiPC9zcGFuPjxzcGFuICBjbGFzcz0naWNvblNldFNhdmUnPsOXPC9saT48L3VsPiI7CgogICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8dWwgY2xhc3M9J3pobV9zZXRfcGFnZV9saXN0Jz4iOwoKICAgICAgICAgICAgICAgIGZvcihsZXQgaT0wO2k8dmlkZW9Eb3dubG9hZE9wdGlvbkpzb24ubGVuZ3RoO2krKyl7CgogICAgICAgICAgICAgICAgICAgIGxldCBiYWNrQ29sb3Isc3dpdGNoQmFja0NvcmxvcixkaXNwbGF5OwoKICAgICAgICAgICAgICAgICAgICBsZXQgb3B0aW9uVmFsdWUgPSBHTV9nZXRWYWx1ZSh2aWRlb0Rvd25sb2FkT3B0aW9uSnNvbltpXS5vcHRpb25JRCx2aWRlb0Rvd25sb2FkT3B0aW9uSnNvbltpXS5kZWZhdWx0KTsKCiAgICAgICAgICAgICAgICAgICAgaWYob3B0aW9uVmFsdWUgIT0gJzIyJyl7CgogICAgICAgICAgICAgICAgICAgICAgICBiYWNrQ29sb3IgPSAnI2ZmZic7CgogICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2hCYWNrQ29ybG9yID0gJyNGRkYnOwoKICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheSA9ICdub25lJzsKCiAgICAgICAgICAgICAgICAgICAgfWVsc2V7CgogICAgICAgICAgICAgICAgICAgICAgICBiYWNrQ29sb3IgPSAnI2ZlNmQ3Myc7CgogICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2hCYWNrQ29ybG9yID0gJyNGRkU1RTUnOwoKICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheSA9ICdibG9jayc7CgogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8bGk+IjsKCiAgICAgICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8ZGl2IGNsYXNzPSd6aG1fc2V0X3BhZ2VfY29udGVudCc+IjsKCiAgICAgICAgICAgICAgICAgICAgc2V0SHRtbCArPSAiPHNwYW4+Iit2aWRlb0Rvd25sb2FkT3B0aW9uSnNvbltpXS5vcHRpb25OYW1lKyI8L3NwYW4+IjsKCiAgICAgICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8ZGl2IGNsYXNzPSdjaXJjdWxhcicgc3R5bGU9J2JhY2tncm91bmQtY29sb3I6Iitzd2l0Y2hCYWNrQ29ybG9yKyInIGlkPSciK3ZpZGVvRG93bmxvYWRPcHRpb25Kc29uW2ldLm9wdGlvbklEKyInPiI7CgogICAgICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPGRpdiBjbGFzcz0ncm91bmQtYnV0dG9uJyBzdHlsZT0nYmFja2dyb3VuZDogIitiYWNrQ29sb3IrIjsgbGVmdDogIitvcHRpb25WYWx1ZSsicHg7Jz48L2Rpdj4iOwoKICAgICAgICAgICAgICAgICAgICBzZXRIdG1sICs9ICI8L2Rpdj48L2Rpdj4iOwoKICAgICAgICAgICAgICAgICAgICBzZXRIdG1sICs9ICI8L2xpPiI7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8L3VsPiIKCiAgICAgICAgICAgICAgICBzZXRIdG1sICs9IjwvZGl2PiIKCiAgICAgICAgICAgICAgICBzZXRIdG1sICs9IjxkaXYgY2xhc3M9J3pobV9zZXRfcGFnZScgaWQ9J21vdmllVmlkZW9TZXRQYWdlJz4iOwoKICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPHVsIGNsYXNzPSdpY29uU2V0VWxIZWFkJz48bGkgY2xhc3M9J3pobV9zZXRfcGFnZV9oZWFkZXInPjxzcGFuIGNsYXNzPSdiYWNrJz48L3NwYW4+PHNwYW4+IitsYW5nLnNldFBsYXlWaWRlbysiPC9zcGFuPjxzcGFuICBjbGFzcz0naWNvblNldFNhdmUnPsOXPC9saT48L3VsPiI7CgogICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8dWwgY2xhc3M9J3pobV9zZXRfcGFnZV9saXN0JyBzdHlsZT0nb3ZlcmZsb3cteTp1bnNldCc+IjsKCiAgICAgICAgICAgICAgICAgICAgbGV0IGJhY2tDb2xvcixzd2l0Y2hCYWNrQ29ybG9yLGRpc3BsYXk7CgogICAgICAgICAgICAgICAgICAgIGxldCBvcHRpb25WYWx1ZSA9IEdNX2dldFZhbHVlKHBsYXlWaWRlb09wdGlvbkpzb24ub3B0aW9uSUQscGxheVZpZGVvT3B0aW9uSnNvbi5kZWZhdWx0KTsKCiAgICAgICAgICAgICAgICAgICAgaWYob3B0aW9uVmFsdWUgIT0gJzIyJyl7CgogICAgICAgICAgICAgICAgICAgICAgICBiYWNrQ29sb3IgPSAnI2ZmZic7CgogICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2hCYWNrQ29ybG9yID0gJyNGRkYnOwoKICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKCiAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tDb2xvciA9ICcjZmU2ZDczJzsKCiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaEJhY2tDb3Jsb3IgPSAnI0ZGRTVFNSc7CgogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8bGk+IjsKCiAgICAgICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8ZGl2IGNsYXNzPSd6aG1fc2V0X3BhZ2VfY29udGVudCc+IjsKCiAgICAgICAgICAgICAgICAgICAgc2V0SHRtbCArPSAiPHNwYW4gY2xhc3M9J3BsYXlWaWRlb09wdGlvbk5hbWUnPiIrcGxheVZpZGVvT3B0aW9uSnNvbi5vcHRpb25OYW1lKyI8L3NwYW4+IjsKCiAgICAgICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8ZGl2IGNsYXNzPSdjaXJjdWxhcicgc3R5bGU9J2JhY2tncm91bmQtY29sb3I6Iitzd2l0Y2hCYWNrQ29ybG9yKyInIGlkPSciK3BsYXlWaWRlb09wdGlvbkpzb24ub3B0aW9uSUQrIic+IjsKCiAgICAgICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8ZGl2IGNsYXNzPSdyb3VuZC1idXR0b24nIHN0eWxlPSdiYWNrZ3JvdW5kOiAiK2JhY2tDb2xvcisiOyBsZWZ0OiAiK29wdGlvblZhbHVlKyJweDsnPjwvZGl2PiI7CgogICAgICAgICAgICAgICAgICAgIHNldEh0bWwgKz0gIjwvZGl2PjwvZGl2PiI7CgogICAgICAgICAgICAgICAgICAgIHNldEh0bWwrPSI8L2xpPjxsaT4iOwoKICAgICAgICAgICAgICAgICAgICBzZXRIdG1sICs9IjxkaXY+6Kej5p6Q57q/6LevPC9kaXY+IjsKCiAgICAgICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8ZGl2IGNsYXNzPSdmb3JtX190ZXh0YXJlYSc+IjsKCiAgICAgICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8ZGl2IGNsYXNzPSd0ZXh0YXJlYSBqcy1mbGV4aWJsZS10ZXh0YXJlYScgc3R5bGU9J3BhZGRpbmc6IDVweCAwcHg7JyBpZD0nIitwbGF5VmlkZW9PcHRpb25Kc29uLnRleHRhcmVhKyInPiI7CgogICAgICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPHRleHRhcmVhIHJvd3M9JzknIGNsYXNzPSd0ZXh0YXJlYV9fYm9keSB6aG1fc2Nyb2xsJyBwbGFjZWhvbGRlcj0nIitsYW5nLnRpcFBsYXlWaWRlb0xpbmVBZGQrIicgc3R5bGU9J3dpZHRoOjI1MHB4O2ZvbnQtc2l6ZToxMnB4O3BhZGRpbmc6NHB4O3Jlc2l6ZTpub25lOycgaWQ9JyIrcGxheVZpZGVvT3B0aW9uSnNvbi50ZXh0YXJlYUlkKyInPiIrR01fZ2V0VmFsdWUocGxheVZpZGVvT3B0aW9uSnNvbi52YWx1ZU5hbWUscGxheVZpZGVvT3B0aW9uSnNvbi50aXApKyI8L3RleHRhcmVhPiI7CgogICAgICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPC9kaXY+PC9kaXY+PC9saT4iOwoKICAgICAgICAgICAgICAgICAgICBzZXRIdG1sICs9IjwvdWw+IgoKICAgICAgICAgICAgICAgICAgICBzZXRIdG1sICs9IjwvZGl2PiIKCiAgICAgICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8ZGl2IGNsYXNzPSd6aGlodVNldFBhZ2UnIGlkPSd6aGlodUljb25TZXRQYWdlJz4iOwoKICAgICAgICAgICAgICAgICAgICBzZXRIdG1sICs9Ijx1bCBjbGFzcz0naWNvblNldFVsSGVhZCc+PGxpIGNsYXNzPSdpY29uU2V0UGFnZUhlYWQnPjxzcGFuIGNsYXNzPSdiYWNrJz48L3NwYW4+PHNwYW4+IitsYW5nLnpoU2V0KyI8L3NwYW4+PHNwYW4gIGNsYXNzPSdpY29uU2V0U2F2ZSc+w5c8L2xpPjwvdWw+IjsKCiAgICAgICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8dWwgY2xhc3M9J3pobV9zZXRfcGFnZV9saXN0JyBzdHlsZT0naGVpZ2h0OjMwMHB4Jz4iOwoKICAgICAgICAgICAgICAgIGZvcih2YXIgb3B0aW9uTj0wO29wdGlvbk48emhpaHVPcHRpb25Kc29uLmxlbmd0aDtvcHRpb25OKyspewoKICAgICAgICAgICAgICAgICAgICBsZXQgYmFja0NvbG9yLHN3aXRjaEJhY2tDb3Jsb3I7CgogICAgICAgICAgICAgICAgICAgIGxldCBvcHRpb25WYWx1ZSA9IEdNX2dldFZhbHVlKHpoaWh1T3B0aW9uSnNvbltvcHRpb25OXS5vcHRpb25JRCx6aGlodU9wdGlvbkpzb25bb3B0aW9uTl0uZGVmYXVsdCk7CgogICAgICAgICAgICAgICAgICAgIGlmKG9wdGlvblZhbHVlICE9ICcyMicpewoKICAgICAgICAgICAgICAgICAgICAgICAgYmFja0NvbG9yID0gJyNmZmYnOwoKICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoQmFja0NvcmxvciA9ICcjRkZGJzsKCiAgICAgICAgICAgICAgICAgICAgfWVsc2V7CgogICAgICAgICAgICAgICAgICAgICAgICBiYWNrQ29sb3IgPSAnI2ZlNmQ3Myc7CgogICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2hCYWNrQ29ybG9yID0gJyNGRkU1RTUnOwoKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPGxpID48ZGl2IGNsYXNzPSd6aGlodVNldFBhZ2VDb250ZW50Jz48c3Bhbj4iK3poaWh1T3B0aW9uSnNvbltvcHRpb25OXS5vcHRpb25OYW1lKyI8L3NwYW4+IjsKCiAgICAgICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8ZGl2IGNsYXNzPSdjaXJjdWxhcicgc3R5bGU9J2JhY2tncm91bmQtY29sb3I6ICIrc3dpdGNoQmFja0NvcmxvcisiOycgaWQ9Iit6aGlodU9wdGlvbkpzb25bb3B0aW9uTl0ub3B0aW9uSUQrIj48ZGl2IGNsYXNzPSdyb3VuZC1idXR0b24nIHN0eWxlPSdiYWNrZ3JvdW5kOiAiK2JhY2tDb2xvcisiO2xlZnQ6ICIrb3B0aW9uVmFsdWUrInB4Oyc+PC9kaXY+PC9kaXY+PC9kaXY+IjsKCiAgICAgICAgICAgICAgICAgICAgaWYoemhpaHVPcHRpb25Kc29uW29wdGlvbk5dLm9wdGlvbklEID09ICdyZW1vdmVLZXl3b3JkJyl7CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIga2V5d29yZFNob3c7CgogICAgICAgICAgICAgICAgICAgICAgICBpZihHTV9nZXRWYWx1ZSgncmVtb3ZlS2V5d29yZCcsJzAnKSA9PSAnMjInKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXl3b3JkU2hvdyA9ICdibG9jayc7CgogICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXdvcmRTaG93ID0gJ25vbmUnOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBzZXRIdG1sICs9IjxkaXYgc3R5bGU9J21hcmdpbi10b3A6MTBweDtkaXNwbGF5OiIra2V5d29yZFNob3crIjtwYWRkaW5nOjVweCAwcHg7JyBpZD0nemhpaHVLZXl3b3JkJz48c3BhbiBjbGFzcz0ndGV4dC1pbnB1dCc+PGlucHV0IHZhbHVlPSciK0dNX2dldFZhbHVlKCdpbnB1dFpoS2V5d29yZCcsJycpKyInIGlkPSdpbnB1dFpoS2V5d29yZCcgY2xhc3M9J3RleHQtaW5wdXRfX2JvZHknIHBsYWNlaG9sZGVyPSciK2xhbmcudGlwS2V5d29yZCsiJyBzdHlsZT0nd2lkdGg6ODglJz48c3Bhbj48L2Rpdj4iOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYoemhpaHVPcHRpb25Kc29uW29wdGlvbk5dLm9wdGlvbklEID09ICdyZW1vdmVBdXRob3JOYW1lJyl7CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXV0aG9yTmFtZVNob3c7CgogICAgICAgICAgICAgICAgICAgICAgICBpZihHTV9nZXRWYWx1ZSgncmVtb3ZlQXV0aG9yTmFtZScsJzIyJykgPT0gJzIyJyl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0aG9yTmFtZVNob3cgPSAnYmxvY2snOwoKICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRob3JOYW1lU2hvdyA9ICdub25lJzsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8ZGl2IHN0eWxlPSdtYXJnaW4tdG9wOjEwcHg7ZGlzcGxheToiK2F1dGhvck5hbWVTaG93KyI7cGFkZGluZzo1cHggMHB4OycgaWQ9J3poaWh1QXV0aG9yTmFtZSc+PHNwYW4gY2xhc3M9J3RleHQtaW5wdXQnPjxpbnB1dCB2YWx1ZT0nIitHTV9nZXRWYWx1ZSgnaW5wdXRaaEF1dGhvck5hbWUnLCcnKSsiJyBpZD0naW5wdXRaaEF1dGhvck5hbWUnIGNsYXNzPSd0ZXh0LWlucHV0X19ib2R5JyBwbGFjZWhvbGRlcj0nIitsYW5nLnRpcEF1dGhvck5hbWUrIicgc3R5bGU9J3dpZHRoOjg4JSc+PHNwYW4+PC9kaXY+IjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8L2xpPiI7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8L3VsPiIKCiAgICAgICAgICAgICAgICBzZXRIdG1sICs9IjwvZGl2PiI7CgogICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8dWwgY2xhc3M9J2ljb25TZXRVbEhlYWQnPjxsaSBjbGFzcz0naWNvblNldFBhZ2VIZWFkJz48c3Bhbj48L3NwYW4+PHNwYW4+IitsYW5nLnNldCsiPC9zcGFuPjxzcGFuIGNsYXNzPSdpY29uU2V0U2F2ZSc+w5c8L3NwYW4+PC9saT48L3VsPiI7CgogICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8dWwgY2xhc3M9J3NldFdyYXBMaSc+IjsKCiAgICAgICAgICAgICAgICBmb3IodmFyIHNldE49MDtzZXROPHNldExpc3RKc29uLmxlbmd0aDtzZXROKyspewoKICAgICAgICAgICAgICAgICAgICB2YXIgbGlzdFZhbHVlID0gR01fZ2V0VmFsdWUoc2V0TGlzdEpzb25bc2V0Tl0uc2V0TGlzdElELCcyMicpOwoKICAgICAgICAgICAgICAgICAgICBsZXQgYmFja0NvbG9yLGFycm93Q29sb3Isc3dpdGNoQmFja0NvcmxvcjsKCiAgICAgICAgICAgICAgICAgICAgaWYobGlzdFZhbHVlICE9IDIyKXsKICAgICAgICAgICAgICAgICAgICAgICAgYmFja0NvbG9yID0gJyNmZmYnOwogICAgICAgICAgICAgICAgICAgICAgICBhcnJvd0NvbG9yPSAnI0VFRSc7CiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaEJhY2tDb3Jsb3IgPSAnI0ZGRic7CgogICAgICAgICAgICAgICAgICAgIH1lbHNlewogICAgICAgICAgICAgICAgICAgICAgICBiYWNrQ29sb3IgPSAnI2ZlNmQ3Myc7CiAgICAgICAgICAgICAgICAgICAgICAgIGFycm93Q29sb3IgPSAnI0NDQyc7CiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaEJhY2tDb3Jsb3IgPSAnI0ZGRTVFNSc7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZihzZXRMaXN0SnNvbltzZXROXS5zZXRQYWdlSUQgPT0gJycpewogICAgICAgICAgICAgICAgICAgICAgICBhcnJvd0NvbG9yID0gJyNFRUUnOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8bGk+PHNwYW4+IitzZXRMaXN0SnNvbltzZXROXS5saXN0TmFtZSsiPC9zcGFuPiI7CgogICAgICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPGRpdiBjbGFzcz0nc2V0V3JhcExpQ29udGVudCc+IjsKCiAgICAgICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8ZGl2IGNsYXNzPSdjaXJjdWxhcicgaWQ9JyIrc2V0TGlzdEpzb25bc2V0Tl0uc2V0TGlzdElEKyInIHN0eWxlPSdiYWNrZ3JvdW5kLWNvbG9yOiAiK3N3aXRjaEJhY2tDb3Jsb3IrIjsnPjxkaXYgY2xhc3M9J3JvdW5kLWJ1dHRvbicgc3R5bGU9J2JhY2tncm91bmQ6ICIrYmFja0NvbG9yKyI7bGVmdDogIitsaXN0VmFsdWUrInB4Jz48L2Rpdj48L2Rpdj4iOwoKICAgICAgICAgICAgICAgICAgICBzZXRIdG1sICs9IjxzcGFuIGNsYXNzPSd0by1yaWdodCcgZGF0YT0nIitzZXRMaXN0SnNvbltzZXROXS5zZXRQYWdlSUQrIicgdGFrZVBsYWNlPSciK3NldExpc3RKc29uW3NldE5dLnRha2VQbGFjZSsiJyBzdHlsZT0nYm9yZGVyOiBzb2xpZCAiK2Fycm93Q29sb3IrIjsgYm9yZGVyLXdpZHRoOiAwIDNweCAzcHggMDsnPjwvc3Bhbj48L2Rpdj48L2xpPiI7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8L3VsPiI7CgogICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8ZGl2IHN0eWxlPSdoZWlnaHQ6NDBweDsnIGlkPSd6aG1UYWtlUGxhY2UnPjwvZGl2PiI7CgogICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8ZGl2IGNsYXNzPSdpY29uU2V0Rm9vdCcgc3R5bGU9Jyc+IjsKCiAgICAgICAgICAgICAgICBzZXRIdG1sICs9Ijx1bCBjbGFzcz0naWNvblNldEZvb3RMaSc+IjsKCiAgICAgICAgICAgICAgICBzZXRIdG1sICs9IjxsaT48L2xpPiI7CgogICAgICAgICAgICAgICAgc2V0SHRtbCArPSc8L3VsPic7CgogICAgICAgICAgICAgICAgc2V0SHRtbCArPSc8L2Rpdj4nOwoKICAgICAgICAgICAgICAgIHNldEh0bWwgKz0gIjwvZGl2PiI7CgogICAgICAgICAgICAgICAgaWYoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3NldE1hc2snKSkgcmV0dXJuOwoKICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlRWxlbWVudCgnZGl2JywnemhtTWVudScpOwoKICAgICAgICAgICAgICAgIGxldCB6aG1NZW51ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3pobU1lbnUnKTsKCiAgICAgICAgICAgICAgICB6aG1NZW51LmlubmVySFRNTCA9IHNldEh0bWw7CgogICAgICAgICAgICAgICAgbGV0IHRpbWVyWmhtSWNvbiA9IHNldEludGVydmFsKGZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgICAgIGlmIChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjemhtTWVudScpKXsKCiAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGltZXJaaG1JY29uKTsgLy8g5Y+W5raI5a6a5pe25ZmoCgogICAgICAgICAgICAgICAgICAgICAgICBsZXQgY2lyY3VsYXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuY2lyY3VsYXInKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGNpcmN1bGFyLmZvckVhY2goZnVuY3Rpb24oaXRlbSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uKF9lKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGJ1dHRvblN0eWxlID0gaXRlbS5jaGlsZHJlblswXS5zdHlsZTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxlZnQgPSBidXR0b25TdHlsZS5sZWZ0OwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gcGFyc2VJbnQobGVmdCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBsaXN0TGVmdFZhbHVlOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihsZWZ0PT0wKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1dHRvblN0eWxlLmxlZnQgPSAnMjJweCc7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXR0b25TdHlsZS5iYWNrZ3JvdW5kID0gJyNmZTZkNzMnOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5zdHlsZS5iYWNrZ3JvdW5kPScjZmZFNUU1JzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGl0ZW0ubmV4dFNpYmxpbmcgJiYgaXRlbS5uZXh0U2libGluZy5nZXRBdHRyaWJ1dGUoJ2RhdGEnKSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5uZXh0U2libGluZy5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywnYm9yZGVyOiBzb2xpZCAjY2NjO2JvcmRlci13aWR0aDogMCAzcHggM3B4IDA7JykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdExlZnRWYWx1ZSA9IDIyOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1dHRvblN0eWxlLmxlZnQgPSAnMHB4JzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1dHRvblN0eWxlLmJhY2tncm91bmQgPSAnI2ZmZic7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLnN0eWxlLmJhY2tncm91bmQ9JyNmZmYnOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoaXRlbS5uZXh0U2libGluZyl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5uZXh0U2libGluZy5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywnYm9yZGVyOiBzb2xpZCAjRUVFO2JvcmRlci13aWR0aDogMCAzcHggM3B4IDA7JykKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RMZWZ0VmFsdWUgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNldExpc3RJRCA9IGl0ZW0uaWQ7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHNldExpc3RJRCA9PSAncmVtb3ZlS2V5d29yZCcgJiYgbGlzdExlZnRWYWx1ZT09MjIpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3poaWh1S2V5d29yZCcpLnN0eWxlLmRpc3BsYXk9J2Jsb2NrJzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3pobVRha2VQbGFjZScpLnN0eWxlPSAnaGVpZ2h0OjIyMHB4JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHNldExpc3RJRCA9PSAncmVtb3ZlS2V5d29yZCcgJiYgbGlzdExlZnRWYWx1ZT09MCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjemhpaHVLZXl3b3JkJykuc3R5bGUuZGlzcGxheT0nbm9uZSc7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN6aG1UYWtlUGxhY2UnKS5zdHlsZT0gJ2hlaWdodDoxODBweCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihzZXRMaXN0SUQgPT0gJ3JlbW92ZUF1dGhvck5hbWUnICYmIGxpc3RMZWZ0VmFsdWU9PTIyKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN6aGlodUF1dGhvck5hbWUnKS5zdHlsZS5kaXNwbGF5PSdibG9jayc7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoc2V0TGlzdElEID09ICdyZW1vdmVBdXRob3JOYW1lJyAmJiBsaXN0TGVmdFZhbHVlPT0wKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN6aGlodUF1dGhvck5hbWUnKS5zdHlsZS5kaXNwbGF5PSdub25lJzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdNX3NldFZhbHVlKHNldExpc3RJRCxsaXN0TGVmdFZhbHVlKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQoKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICBsZXQgdG9SaWdodCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy50by1yaWdodCcpOwoKICAgICAgICAgICAgICAgICAgICAgICAgdG9SaWdodC5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbihlKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxlZnQgPSBpdGVtLnByZXZpb3VzU2libGluZy5jaGlsZHJlblswXS5zdHlsZS5sZWZ0OwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gcGFyc2VJbnQobGVmdCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGxlZnQgIT0gMjIpIHJldHVybjsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNldFBhZ2VJRCA9IGl0ZW0uZ2V0QXR0cmlidXRlKCdkYXRhJyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwYWdlSWQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChzZXRQYWdlSUQpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlSWQuY2xhc3NOYW1lPSdpY29uU2V0UGFnZSB0b0xlZnRNb3ZlJzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy/nn6XkuY7orr7nva7mmoLkvY3pq5jluqYKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoc2V0UGFnZUlEPT0nemhpaHVJY29uU2V0UGFnZScpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3pobVRha2VQbGFjZScpLnN0eWxlPSBgaGVpZ2h0OjY4cHhgOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy/lrp7ml7blm77moIfpq5jluqYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihzZXRQYWdlSUQgPT0gJ21vdmllSWNvblNldFBhZ2UnKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNpY29uVG9wJykudmFsdWU9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI3pobWxvZ28iKS5vZmZzZXRUb3A7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQoKICAgICAgICAgICAgICAgICAgICAgICAgfSkKCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0b0JhY2sgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuYmFjaycpOwoKICAgICAgICAgICAgICAgICAgICAgICAgdG9CYWNrLmZvckVhY2goZnVuY3Rpb24oaXRlbSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uKGUpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcGFyZW50RG9tID0gaXRlbS5wYXJlbnROb2RlLnBhcmVudE5vZGUucGFyZW50Tm9kZTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50RG9tLmNsYXNzTmFtZT0naWNvblNldFBhZ2UgdG9SaWdodE1vdmUnOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjemhtVGFrZVBsYWNlJykuc3R5bGU9J2hlaWdodDo0MHB4OycKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQoKICAgICAgICAgICAgICAgICAgICAgICAgfSkKCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzZXRTYXZlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmljb25TZXRTYXZlJyk7CgogICAgICAgICAgICAgICAgICAgICAgICBzZXRTYXZlLmZvckVhY2goZnVuY3Rpb24oaXRlbSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsKCk9PnsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGljb25Ub3AgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaWNvblRvcCcpLnZhbHVlOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaWNvbk9wYWNpdHk9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ljb25PcGFjaXR5JykudmFsdWU7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpY29uUG9zaXRpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaWNvblBvc2l0aW9uJykudmFsdWU7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpY29uV2lkdGggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaWNvbldpZHRoJykudmFsdWU7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpY29uV2FpdFRpbWUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaWNvbldhaXRUaW1lJykudmFsdWU7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwbGF5VmlkZW9MaW5lVGV4dCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNwbGF5VmlkZW9MaW5lVGV4dGFyZWEnKS52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcGxheVZpZGVvTGluZUxlZnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjdmlkZW9QbGF5TGluZUFkZCcpLmNoaWxkcmVuWzBdLnN0eWxlLmxlZnQ7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpbnB1dFpoS2V5d29yZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dFpoS2V5d29yZCcpLnZhbHVlOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW5wdXRBdXRob3JOYW1lID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0WmhBdXRob3JOYW1lJykudmFsdWU7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGljb25Ub3AgIT0gJycpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoISgvKF5bMC05XVswLTldezAsMn0kKS8udGVzdChpY29uVG9wKSkpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsZXJ0KGxhbmcudGlwRXJyb3JJY29uSGVpZ2h0KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdNX3NldFZhbHVlKCdpY29uVG9wJyxpY29uVG9wKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGljb25PcGFjaXR5ICE9ICcnKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCEoL14oPzowfFsxLTldWzAtOV0/fDEwMCkkLy50ZXN0KGljb25PcGFjaXR5KSkpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsZXJ0KGxhbmcudGlwRXJyb3JJY29uT3BhY2l0eSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTV9zZXRWYWx1ZSgnaWNvbk9wYWNpdHknLGljb25PcGFjaXR5KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGljb25Qb3NpdGlvbiAhPSAnJyl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTV9zZXRWYWx1ZSgnaWNvblBvc2l0aW9uJyxpY29uUG9zaXRpb24pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoaWNvbldhaXRUaW1lICE9ICcnKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdNX3NldFZhbHVlKCdpY29uV2FpdFRpbWUnLGljb25XYWl0VGltZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihpY29uV2lkdGggIT0nJyl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighKC8oXihbMS05XVswLTldPykkKS8udGVzdChpY29uV2lkdGgpKSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxlcnQobGFuZy50aXBFcnJvckljb25XaWR0aCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTV9zZXRWYWx1ZSgnaWNvbldpZHRoJyxpY29uV2lkdGgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoR01fZ2V0VmFsdWUoJ3ZpZGVvUGxheUxpbmVBZGQnKSA9PSAyMil7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihwbGF5VmlkZW9MaW5lVGV4dCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxpbmVPYmogPSBfdGhpcy5nZXRMaW5lKHBsYXlWaWRlb0xpbmVUZXh0KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihsaW5lT2JqLmxlbmd0aD4wKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR01fc2V0VmFsdWUoJ3BsYXlWaWRlb0xpbmVUZXh0JyxwbGF5VmlkZW9MaW5lVGV4dCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxlcnQoJ+e6v+i3r+i+k+WFpeS4jeato+ehricpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdNX3NldFZhbHVlKCdwbGF5VmlkZW9MaW5lVGV4dCcsJycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR01fc2V0VmFsdWUoJ3BsYXlWaWRlb0xpbmVUZXh0JyxwbGF5VmlkZW9MaW5lVGV4dCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihpbnB1dFpoS2V5d29yZCAhPSAnJyl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTV9zZXRWYWx1ZSgnaW5wdXRaaEtleXdvcmQnLGlucHV0WmhLZXl3b3JkKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihHTV9nZXRWYWx1ZSgnaW5wdXRaaEtleXdvcmQnKSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR01fZGVsZXRlVmFsdWUoJ2lucHV0WmhLZXl3b3JkJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihpbnB1dEF1dGhvck5hbWUgIT0gJycpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR01fc2V0VmFsdWUoJ2lucHV0WmhBdXRob3JOYW1lJyxpbnB1dEF1dGhvck5hbWUpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKEdNX2dldFZhbHVlKCdpbnB1dFpoQXV0aG9yTmFtZScpKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTV9kZWxldGVWYWx1ZSgnaW5wdXRaaEF1dGhvck5hbWUnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpc3RvcnkuZ28oMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgICAgICAgICB9KQoKICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ljb25Ub3AnKS5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLGZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGljb25Ub3AgPSB0aGlzLnZhbHVlOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCEoLyheWzEtOV1cZCokKS8udGVzdChpY29uVG9wKSkpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZSgnZGF0YS1pcy12YWxpZCcsJ2ZhbHNlJykKCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0QXR0cmlidXRlKCdkYXRhLWlzLXZhbGlkJywndHJ1ZScpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwoKICAgICAgICAgICAgICAgICAgICAgICAgfSkKCiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpY29uV2lkdGgnKS5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLGZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGljb25XaWR0aCA9IHRoaXMudmFsdWU7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoISgvKF5bMS05XVxkKiQpLy50ZXN0KGljb25XaWR0aCkpKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ2RhdGEtaXMtdmFsaWQnLCdmYWxzZScpCgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZSgnZGF0YS1pcy12YWxpZCcsJ3RydWUnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKCiAgICAgICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgICAgICAgIC8v6IW+6K6v6KeG6aKR5b+r5o236ZSu5Yay56qBCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGNvdXBvblVybC5tYXRjaCgvdlwucXFcLmNvbVwveFwvY292ZXIvKSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGFkZExpbmVUZXh0ID1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjcGxheVZpZGVvTGluZVRleHRhcmVhJyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkTGluZVRleHQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsZnVuY3Rpb24oZSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdGFydFBvcyA9IGFkZExpbmVUZXh0LnNlbGVjdGlvblN0YXJ0OwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZW5kUG9zID0gYWRkTGluZVRleHQuc2VsZWN0aW9uRW5kOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhcnRQb3MgPT09IHVuZGVmaW5lZCB8fCBlbmRQb3MgPT09IHVuZGVmaW5lZCkgcmV0dXJuOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlDb2RlLmZvckVhY2goZnVuY3Rpb24oaXRlbSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihlLmtleUNvZGUgPT0gaXRlbS5jb2RlICYmIGUuc2hpZnRLZXk9PWl0ZW0uaXNTaGlmdCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRleHRWYWx1ZSA9IGFkZExpbmVUZXh0LnZhbHVlOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdGFydFZhbHVlID0gdGV4dFZhbHVlLnN1YnN0cmluZygwLHN0YXJ0UG9zKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZW5kVmFsdWUgPSB0ZXh0VmFsdWUuc3Vic3RyaW5nKHN0YXJ0UG9zKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYWxsVmFsdWUgPSBzdGFydFZhbHVlK2l0ZW0udmFsdWUrZW5kVmFsdWU7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkTGluZVRleHQudmFsdWU9YWxsVmFsdWU7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkTGluZVRleHQuc2VsZWN0aW9uU3RhcnQgPSBzdGFydFBvcysxOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZExpbmVUZXh0LnNlbGVjdGlvbkVuZCA9IGVuZFBvcysxOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB9KQoKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGNyZWF0ZUVsZW1lbnQoZG9tLGRvbUlkKXsKCiAgICAgICAgICAgICAgICB2YXIgcm9vdEVsZW1lbnQgPSBkb2N1bWVudC5ib2R5OwoKICAgICAgICAgICAgICAgIHZhciBuZXdFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChkb20pOwoKICAgICAgICAgICAgICAgIG5ld0VsZW1lbnQuaWQgPSBkb21JZDsKCiAgICAgICAgICAgICAgICB2YXIgbmV3RWxlbWVudEh0bWxDb250ZW50ID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJycpOwoKICAgICAgICAgICAgICAgIHJvb3RFbGVtZW50LmFwcGVuZENoaWxkKG5ld0VsZW1lbnQpOwoKICAgICAgICAgICAgICAgIG5ld0VsZW1lbnQuYXBwZW5kQ2hpbGQobmV3RWxlbWVudEh0bWxDb250ZW50KTsKCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJlcXVlc3QobWV0aG9kLHVybCxkYXRhLGlzQ29va2llPScnKXsKCiAgICAgICAgICAgICAgICBsZXQgcmVxdWVzdCA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpOwoKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSxyZWplY3QpPT57CgogICAgICAgICAgICAgICAgICAgIHJlcXVlc3Qub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgICAgICAgICBpZihyZXF1ZXN0LnJlYWR5U3RhdGU9PTQpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJlcXVlc3Quc3RhdHVzPT0yMDApewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlcXVlc3QucmVzcG9uc2VUZXh0KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KHJlcXVlc3Quc3RhdHVzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHJlcXVlc3Qub3BlbihtZXRob2QsdXJsKTsKICAgICAgICAgICAgICAgICAgICBpZihpc0Nvb2tpZSl7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3Qud2l0aENyZWRlbnRpYWxzID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5zZXRSZXF1ZXN0SGVhZGVyKCdDb250ZW50LVR5cGUnLCAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJyk7CiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5zZW5kKGRhdGEpOwoKICAgICAgICAgICAgICAgIH0pCgogICAgICAgICAgICB9CgogICAgICAgICAgICBzZXRDb29raWUoY25hbWUsY3ZhbHVlLGV4ZGF5cyl7CgogICAgICAgICAgICAgICAgdmFyIGQgPSBuZXcgRGF0ZSgpOwoKICAgICAgICAgICAgICAgIGQuc2V0VGltZShkLmdldFRpbWUoKSsoZXhkYXlzKjI0KjYwKjYwKjEwMDApKTsKCiAgICAgICAgICAgICAgICB2YXIgZXhwaXJlcyA9ICJleHBpcmVzPSIrZC50b0dNVFN0cmluZygpOwoKICAgICAgICAgICAgICAgIGRvY3VtZW50LmNvb2tpZSA9IGNuYW1lKyI9IitjdmFsdWUrIjsgIitleHBpcmVzOwogICAgICAgICAgICB9CgogICAgICAgICAgICBnZXRDb29raWUoY25hbWUpewogICAgICAgICAgICAgICAgdmFyIG5hbWUgPSBjbmFtZSArICI9IjsKICAgICAgICAgICAgICAgIHZhciBjYSA9IGRvY3VtZW50LmNvb2tpZS5zcGxpdCgnOycpOwogICAgICAgICAgICAgICAgZm9yKHZhciBpPTA7IGk8Y2EubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IGNhW2ldLnRyaW0oKTsKICAgICAgICAgICAgICAgICAgICBpZiAoYy5pbmRleE9mKG5hbWUpPT0wKSB7IHJldHVybiBjLnN1YnN0cmluZyhuYW1lLmxlbmd0aCxjLmxlbmd0aCk7IH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiAiIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZ2V0UXVlcnlTdHJpbmcoZSkgewogICAgICAgICAgICAgICAgdmFyIHQgPSBuZXcgUmVnRXhwKCIoXnwmKSIgKyBlICsgIj0oW14mXSopKCZ8JCkiKTsKICAgICAgICAgICAgICAgIHZhciBhID0gd2luZG93LmxvY2F0aW9uLnNlYXJjaC5zdWJzdHIoMSkubWF0Y2godCk7CiAgICAgICAgICAgICAgICBpZiAoYSAhPSBudWxsKSByZXR1cm4gYVsyXTsKICAgICAgICAgICAgICAgIHJldHVybiAiIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZ2V0VXJsUGFyYW1zKHVybCl7CiAgICAgICAgICAgICAgICBsZXQgcmVnID0gLyhbXj8mKyNdKyk9KFtePyYrI10rKS9nOwogICAgICAgICAgICAgICAgbGV0IG9iaj17fTsKICAgICAgICAgICAgICAgIHVybC5yZXBsYWNlKHJlZywocmVzLCQxLCQyKT0+e29ialskMV09JDJ9KTsKICAgICAgICAgICAgICAgIHJldHVybiBvYmo7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGdldExpbmUodGV4dCl7CgogICAgICAgICAgICAgICAgbGV0IHRleHRBcnIgPSB0ZXh0LnNwbGl0KCdcbicpOwoKICAgICAgICAgICAgICAgIGlmKHRleHRBcnIubGVuZ3RoID4gMCl7CgogICAgICAgICAgICAgICAgICAgIGxldCBsaW5lT2JqID0gW107CgogICAgICAgICAgICAgICAgICAgIGxldCBtYXRjaCA9IC9eKC4rKShodHRwcz86XC9cLy4rKSQvOwoKICAgICAgICAgICAgICAgICAgICB0ZXh0QXJyLmZvckVhY2goZnVuY3Rpb24oaXRlbSl7CgogICAgICAgICAgICAgICAgICAgICAgICBpdGVtID0gaXRlbS5yZXBsYWNlKC9ccyosKi9nLCcnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFpdGVtKSByZXR1cm4gdHJ1ZTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBsaW5lTWF0Y2ggPSBpdGVtLm1hdGNoKG1hdGNoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGxpbmVNYXRjaCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZU9iai5wdXNoKHsnbmFtZSc6bGluZU1hdGNoWzFdLnN1YnN0cmluZygwLDQpLCd1cmwnOmxpbmVNYXRjaFsyXX0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZU9iaj1bXTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgfSkKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxpbmVPYmo7CgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBzdGF0aWMgZ2V0RWxlbWVudChjc3MsYWxsPScnKXsKCiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUscmVqZWN0KT0+ewoKICAgICAgICAgICAgICAgICAgICBsZXQgbnVtID0gMDsKCiAgICAgICAgICAgICAgICAgICAgbGV0IHRpbWVyID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXsKCiAgICAgICAgICAgICAgICAgICAgICAgIG51bSsrCgogICAgICAgICAgICAgICAgICAgICAgICBsZXQgZG9tOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYoYWxsID09IGZhbHNlKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb20gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGNzcyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZG9tKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aW1lcik7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZG9tKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb20gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKGNzcyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZG9tLmxlbmd0aD4wKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aW1lcik7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZG9tKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKG51bT09MjApewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aW1lcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICB9LDMwMCkKCiAgICAgICAgICAgICAgICAgICAgfSkKCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHN0YXRpYyB0b2FzdChtc2csZHVyYXRpb24pewoKICAgICAgICAgICAgICAgIGR1cmF0aW9uPWlzTmFOKGR1cmF0aW9uKT8zMDAwOmR1cmF0aW9uOwoKICAgICAgICAgICAgICAgIGxldCB0b2FzdERvbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwoKICAgICAgICAgICAgICAgIHRvYXN0RG9tLmlubmVySFRNTCA9IG1zZzsKCiAgICAgICAgICAgICAgICAvL3RvYXN0RG9tLnN0eWxlLmNzc1RleHQ9IndpZHRoOiA2MCU7bWluLXdpZHRoOiAxNTBweDtvcGFjaXR5OiAwLjc7aGVpZ2h0OiAzMHB4O2NvbG9yOiByZ2IoMjU1LCAyNTUsIDI1NSk7bGluZS1oZWlnaHQ6IDMwcHg7dGV4dC1hbGlnbjogY2VudGVyO2JvcmRlci1yYWRpdXM6IDVweDtwb3NpdGlvbjogZml4ZWQ7dG9wOiA0MCU7bGVmdDogMjAlO3otaW5kZXg6IDk5OTk5OTtiYWNrZ3JvdW5kOiByZ2IoMCwgMCwgMCk7Zm9udC1zaXplOiAxMnB4OyI7CiAgICAgICAgICAgICAgICB0b2FzdERvbS5zdHlsZS5jc3NUZXh0PSdwYWRkaW5nOjJweCAxNXB4O21pbi1oZWlnaHQ6IDM2cHg7bGluZS1oZWlnaHQ6IDM2cHg7dGV4dC1hbGlnbjogY2VudGVyO3RyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUpO2JvcmRlci1yYWRpdXM6IDRweDtjb2xvcjogcmdiKDI1NSwgMjU1LCAyNTUpO3Bvc2l0aW9uOiBmaXhlZDt0b3A6IDUwJTtsZWZ0OiA1MCU7ei1pbmRleDogOTk5OTk5OTtiYWNrZ3JvdW5kOiByZ2IoMCwgMCwgMCk7Zm9udC1zaXplOiAxNnB4OycKCiAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRvYXN0RG9tKTsKCiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgICAgICAgICB2YXIgZCA9IDAuNTsKCiAgICAgICAgICAgICAgICAgICAgdG9hc3REb20uc3R5bGUud2Via2l0VHJhbnNpdGlvbiA9ICctd2Via2l0LXRyYW5zZm9ybSAnICsgZCArICdzIGVhc2UtaW4sIG9wYWNpdHkgJyArIGQgKyAncyBlYXNlLWluJzsKCiAgICAgICAgICAgICAgICAgICAgdG9hc3REb20uc3R5bGUub3BhY2l0eSA9ICcwJzsKCiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCh0b2FzdERvbSkgfSwgZCAqIDEwMDApOwoKICAgICAgICAgICAgICAgIH0sIGR1cmF0aW9uKTsKCiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy9jcmVhdGUgemhtTG9nb0ljb24KICAgICAgICAgICAgemhtTG9nbygpewoKICAgICAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CgogICAgICAgICAgICAgICAgbGV0IHNvcnREaXYgPSBpY29uVmlwUG9zaXRpb249PSdsZWZ0Jz8ncm93Jzoncm93LXJldmVyc2UnOwoKICAgICAgICAgICAgICAgIGxldCBwbGF5VmlkZW9TdHlsZSA9IGAKICAgICAgICAgICAgICAgIC56aG1fcGxheV92aWRvZV9pY29uewogICAgICAgICAgICAgICAgICAgcGFkZGluZy10b3A6MnB4OwogICAgICAgICAgICAgICAgICAgY3Vyc29yOnBvaW50ZXI7CiAgICAgICAgICAgICAgICAgICB6LWluZGV4Ojk5OTk5OTsKICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOmZpeGVkOyR7aWNvblZpcFBvc2l0aW9ufTo1cHg7dG9wOiR7aWNvblZpcFRvcH1weDsKICAgICAgICAgICAgICAgICAgIHRleHQtYWxpZ246Y2VudGVyOwogICAgICAgICAgICAgICAgICAgb3ZlcmZsb3c6dmlzaWJsZTsKICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6ZmxleDsKICAgICAgICAgICAgICAgICAgIGZsZXgtZGlyZWN0aW9uOiR7c29ydERpdn07CiAgICAgICAgICAgICAgICAgICB3aWR0aDphdXRvOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnpobV9wbGF5X3ZpZGVvX3dyYXB7CiAgICAgICAgICAgICAgICAgICB6LWluZGV4Ojk5OTk5OTk7CiAgICAgICAgICAgICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgICAgICAgICAgICAgd2lkdGg6MzAwcHg7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuaWNvbkxvZ297CiAgICAgICAgICAgICAgICAgICAgb3BhY2l0eToke2ljb25WaXBPcGFjaXR5LzEwMH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuemhtX3BsYXlfdmlkZW9fbGluZXsKICAgICAgICAgICAgICAgICAgIHdpZHRoOjMyMHB4OwogICAgICAgICAgICAgICAgICAgaGVpZ2h0OjMxNnB4OwogICAgICAgICAgICAgICAgICAgb3ZlcmZsb3cteTpzY3JvbGw7CiAgICAgICAgICAgICAgICAgICBvdmVyZmxvdy14OmhpZGRlbjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC56aG1fcGxheV92aWRlX2xpbmVfdWx7CiAgICAgICAgICAgICAgICAgICB3aWR0aDozMDBweDsKICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICAgICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7CiAgICAgICAgICAgICAgICAgICBmbGV4LWZsb3c6IHJvdyB3cmFwOwogICAgICAgICAgICAgICAgICAgbGlzdC1zdHlsZTogbm9uZTsKICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6MHB4OwogICAgICAgICAgICAgICAgICAgbWFyZ2luOjBweDsKCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuemhtX3BsYXlfdmlkZW9fbGluZV91bF9saXsKICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6NHB4IDBweDsKICAgICAgICAgICAgICAgICAgIG1hcmdpbjoycHg7CiAgICAgICAgICAgICAgICAgICB3aWR0aDozMCU7CiAgICAgICAgICAgICAgICAgICBjb2xvcjojRkZGOwogICAgICAgICAgICAgICAgICAgdGV4dC1hbGlnbjpjZW50ZXI7CiAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiNmMjQ0NDM7CiAgICAgICAgICAgICAgICAgICBib3gtc2hhZG93OjBweCAwcHggMTBweCAjZmZmOwogICAgICAgICAgICAgICAgICAgZm9udC1zaXplOjE0cHg7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuemhtX3BsYXlfdmlkZW9fbGluZV91bF9saTpob3ZlcnsKICAgICAgICAgICAgICAgICAgIGNvbG9yOiMyNjAwMzM7CiAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiNmY2MwYzAKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC56aG1fbGluZV9zZWxlY3RlZHsKICAgICAgICAgICAgICAgICAgIGNvbG9yOiMyNjAwMzM7CiAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiNmY2MwYzAKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAuemhtX3BsYXlfdmlkZW9fanh7CiAgICAgICAgICAgICAgICAgICB3aWR0aDoxMDAlOwogICAgICAgICAgICAgICAgICAgaGVpZ2h0OjEwMCU7CiAgICAgICAgICAgICAgICAgICB6LWluZGV4Ojk5OTk5OTsKICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTt0b3A6MHB4O3BhZGRpbmc6MHB4OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYDsKCiAgICAgICAgICAgICAgICAgZG9tU3R5bGUgLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHBsYXlWaWRlb1N0eWxlKSk7CgogICAgICAgICAgICAgICAgIGRvbUhlYWQuYXBwZW5kQ2hpbGQoZG9tU3R5bGUpOwoKICAgICAgICAgICAgICAgICBsZXQgcGxheVdyYXBIdG1sID0gIjxkaXYgaHJlZj0namF2YXNjcmlwdDp2b2lkKDApJyB0YXJnZXQ9J19ibGFuaycgc3R5bGU9JycgY2xhc3M9J3BsYXlCdXR0b24gemhtX3BsYXlfdmlkb2VfaWNvbicgaWQ9J3pobWxvZ28nPiI7CgogICAgICAgICAgICAgICAgIHBsYXlXcmFwSHRtbCArPSAiPGltZyBjbGFzcz0naWNvbkxvZ28nIHN0eWxlPSd3aWR0aDoiK2ljb25WaXBXaWR0aCsicHg7aGVpZ2h0OiIraWNvblZpcFdpZHRoKjEuNSsicHgnIHNyYz0nZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoWkFDV0FQY0FBUEpFUS92Nytmbkx5UGpDd2ZSblpmblQwUEpLU2ZqR3hQdjI5UG5ZMS9OYld2djE4L2FVay9ybDQvcnc3dm5LeVBhSmlQcnI2ZmFhbVBSeWNmYUxpdnY1OS9KSlNQcnY3Zk5WVlBuZTNmcnQ2L05RVC92NitQZWxwUGFnbnZSM2R2aTZ1UHZ6OGZleHIvbk96UGVnbnZyazR2UjFjL0pHUmZycTZQblF6dmpDd1BuUzBQbloxL3Z3N3ZuYTJmZW9wL2VtcGZyYzJ2TlVVL2l4ci9SNGR2V0poL2VzcXZKSFJ2dng3L3J5OGZOU1VmTldWUGpCd1BWNmVmYU1pdm5mM2ZpOHV2V0RndnY0OXZycDZQcnk4UEpQVHZhWWwvblQwZm5XMVBlcnFmUnNhL1J2YnZXQWYvVjlmUG5rNHZpMnRmUmpZZlJoWC92dTdQTllWL0pGUlBuazRmYUhoZmFYbHZ2MzlmcmgzL2k3dXZuTnkvbk95L3JzNnZlcnF2UmdYdm5kMi9hR2hQV1JrUFYvZmZyaTRQcmo0UGl3cmZuTHlmYVVrdlJmWGZKTlRQakZ3L2V5c2ZSbFkvUnhjUHZ2N2ZlenN2aTBzdnYyOC9hYm12ZXFxUGVwcVBKTVMvZXlzUFdPamZOZFhQUnpjdnYwOHZSdWJmcm81dmVpb2ZlbG8vTlpXUG5aMlBOcGFQblUwdlJmWHZuSHhmaXVyUGpBdi9uUXpmcm41Zm5jMi9lMHN2YWRuUGU0dC9hU2tmTlhWdlJtWlBldHF2blkxdmk4dS9laW9QaXRxL2kvdmZSd2IvUjFkUG5lM1BhZW5mYWNtdmUzdHZuUnovcmo0ZmFYbGZWK2ZQV0ZoUEpMU3ZhTmkvV01qUFIwYy9hVmsvV1BqL2FkbS9ycDUvbkl4dlJvWnZSaVlmakR3dmFWbFBKT1RmZTJ0Zk5xYWZKUlVQZWtvdmFhbWZOYVdmVjhldm5kM1BuTnpQblYxUGVzcS9qRXcvVjZlUFIzZC9uZzN2cnc3ZmFXbFBlbnBmYWZuZldQanZpd3J2TldWZm5NeXZpNnVmVi9mdlY5ZS9uYjJ2cnU2L1JrWXZqQXZ2bkl4ZlJpWVBpOXZQZWduL1Y3ZWZlam9mZTF0UFdDZ2ZybTVQSklSL25jMnZOY1cvSlFUL2pGeFB2eThQV0RnZldCZi9Sc2JQVjVkL05wYWZOY1hQbmYzdmFJaHZSdmIvaXZyZm5YMXZOUlVmYUtpZlJ0YlBhWmwvTmVYUGU1dVBXQ2dQUnJhdmFJaC9Ob1ovbkp4L1dGZy9pOXUvUjJkZmpIeHZqSXh2TlRVdmkvdnZlMXMvTmVYUUFBQUFBQUFBQUFBQUFBQUNIL0MwNUZWRk5EUVZCRk1pNHdBd0VBQUFBaCtRUUVsZ0FBQUN3QUFBQUFaQUNXQUFBSS9nQUJDQnhJc0tEQmd3Z1RLbHpJc0tIRGh4QWpTcHhJc2FMRml4Z3phdHpJc2FQSGp5QkRpbHhJWUVTQUFDTUlqRnhwVUlXREFBNVVlRmpJNHVUSkJDeHpDc3hoazhpUWhUWnQ2c3lwd2FhR0RBc0hCT1V4bE9VTEpDV1F2S2l4Y0FPREFRTVliR2k2VWtHUEdqMFVHT0JLdHF6WnMyalRxbDNMdHFNQ0UwMU1pSzFLWXNRSUVsczdmbUZDYTlFV0Y0a1FoQ2lUUW9VSVRVelNmT3lRZ2tXS0RrR1NMdFdvQTlpdVpVRXphdzRnQlpxVklodFIyRVNCVTZGbWpEUU9DZG5NZWpNQ0xSTXlMckM1NEFMTm9LVXBqbkhSdW5mclR2VXVucG05NE1FZmtnTWNYQmlnY3VJbDNyNmpzejZqb0tJSkNSNGttTmd4RWtNajN5WG8vbWtDSmFpV0JUVmY5RmlaTTZsRWJ3U29UclE5eUVzSzZ3cXFTT1Z4S01OV2tqZXN1ZERjZkFCY1F3ZHJmVndoQTBVV2hJSElaa0wwUXFBYUsyem1pUTgzWkFURkVab1ZNaDhHeW1pR0FDVVdjRVRGRlFnRTlVQkVCbUNnQUFaak1VUUFDU1FNcUpBTVpXam1nbUlmZlpIQVNRdVVFaEVFSWp3aEFnUTJIbVJEVURZc3BBWjBRZDFSWWtnbmlNRkFGQkxGWUZNTVFDejBrazIySlhUQ2c1bWhRWllkVnBCangwSnkwQlptUWs0RVZZVkNkV1RHUVRwa0VWSlVBQzZBbHRBUE5tV2l3a0lRZkhrQkJBbjFZcWNWWmZrUnBVSSt4QUZFSEQ0bzBSQUJTUmFrQTRCQmpXSldCNW5GaHBBQlUwUXhSWXdZM1pHWkxtZmxzWnBOL21WTXVWSWJIQVNWaGF4bE1aTFpLVG1sRUJRSHNhUjFRb2cyOVNIZlNLVmtac1phNm1SR2dVWVRpR3BRQVVHOTRlZENPcGdVZ2hldmdMUkZVQzRjdEFRREhqQ3dCSGNLRlhxU0E0Z1N4RWVaRHVrVDFES09ITXVSSGtGcGNKQkxNTW0wVUp3MnpVa1FIRUYxZ2VwQ2Uyam1TekllTldOVE93ZnhkSkpQWGdiMUpnQVdoQkFVTUErMWxnSXpISjFReHhhYnJHblFuZ0VjdGRDU05pVkJrRGRCVlhBdFE3V3l4Z0VuaitUMFZGUlR5Y2dBQTBrU2JGTXJFRlhnMng2VW1DeVNWMkROUlZFV1FUSDZrTkhScFRJS0ZRUWFoRUZtR0JRZFZDRzV0QWFHR3hqOXNVQUZqSHlFVEZCbFJQVHFTUzhBRUVZZnJSVkNTRVZ1Qk1XSC9rZWJCQVdDMjBIVklaQW93bWk4V1FVaTRETlJuVGI1NGRGM05xVU5FUlpCMFVIUUk1elVyQmtPYytEYVVOODJIVVBRVzB6UTRIUkNCQ2dWQUhNRERSS1VPeEdsYUpQbEJjWERJV3NOaEFGUktFRU5RaEJqMkJ3QjJXMDI1UWExVFpaQ0pQdEpMaDlValRXdFNmS09RKy9hMUFCQm9wMUVHbENaRFJSQlVLekVIcFFYQ1Zrd2grR2JIVkxkUWxFRUpRVkJFZ2RBc1VLcW44U1VRTFBaVkV0RStaOUV2a0lZV0lUbU1vT0ZEbUF0SVlDSUdVSHVRUng3ekVRaFZzR0tWZ1pDdFpNc0NDSUpzd21yR0FJSlg3RW1FamY2RlVHdWs1M3RVQVFIUWNsR1JOQVhBQkE2QkJudTBVd0lGSktIb09EQUk5azdTUnRXR0JRWE5xUUovbVRZVEFRVVFvQ2dKTUlqaWdoS09YaG9rMG8wQkFwY2FNMnpFb0tKb0lEQkkydUlXa1NTYUJOYUxFUUdkNmhnWnNoQWc0V0lJU2lxOEVnbGdrS0NpRGpDSmlFb1J2bU1nTUxONE1BSUdWcUlJWUxpeElHMDZFVUhRNGhWN0RKQmdad2lLRVNMU0Nnc1lZaTdJV1FNTWRSTUJkaWdBNGQ4eXlaaUlBaVJqSVFreWRqa2ZnQVFSRkM0Y1VDTmRMQTFYSURDUTA2d3ZBQklDd0JhT2dtWHVCZVVnZHlBY2pZUlJFUzZZUWx6cUpJZ01vRERBSU5DaGpGRTVCSkJRUUN1MmdTa2l4MmtKc1VqeUNWUDBzYUg0TUVtQ0pBanhpVEFRaHZpVVNLT3NvazhDaExMQU15U2lLcGozVUErZ1J1SVNDSW93Z0FBRXlLWm1VbFdjaUowL3JQSkZRcXl5U05sNmlIdEN3cVdISUt5QUJqRGc1dEpaVVVtOEt1Y0VlU1BNTG9JbEFLd0xJZDBRVHJGdk1naGdzSUZrVndUanRxd3FHL3VtTWVLUUNJelBoQ0pLRmo0UDRaODd6NlV6RWdXYldLd2tZREtKaFVJbjB0Wm85Q00wQ0F6UnNqSWpHcDBFQjMwTHdBcGFFaU94bWhNalZpZ0FVRnBRU0FGTW9FcmVPQUtFMEJYUWxoMmtpWVpaQmFaK1FSRDJPRE5rbVlrR0puSjVFSFd3Sk1jck9HQkNmblNTWndwRUFNa0lwazdWSWdhZGhHQUJjRGhuaHRSd2dCdllhK0N4RzkrY0pJVFFxb1lsQkxNYkNpeThFUm05b2FRSEc0dlhZWnExMEhJR3BSdGtLVUlnY2dNTVJUU2dTUDhRSGlSWVVpMEZtS0JjV1NHRjAwcC9rTFlncUlJenhWRUFUUUlndW1tV2hGbVpBWVBRNUhCTFRJVEFoNXhKUmFaWVlkTzBuQThuT3JCTEFleXlUbDB3b1J1QmtCM1pzbGhBTmJCRW5UQVFqTWNtT0pIVnFzUVpBWUZFQU1SQnl5a0VBRUdtTlVpSjZBQXA0S0NCWVk1QkxlNlBSMUMxQVVUelJyRURMMFR5QTNtMEVwZk5PRWlGaGdHVkRYVGhWY3k1QVdtUFVMUEZBS3drd2pNSUNld2owMWNBUUFsZ0lFMUs4Q0RMQ1R5RFROb1dET0l1T0JEVUtZeWhjZzFBSFFWQ0dOdDhnVmlERk9TQW1DQUc5UWdwbWZBZ3hPcGFBMENORkhLaHh6Mkp3cmhhZ0NhWjVCRlJQV2wwamtKQjdMZ2pFbk1vQVBCb01ZYUFvSEwzbENISXZ6NmhiOUlRcU4vQXVBR2RleE4vak15RU9VMjg4a1dGaG1YQjlCd0xveEl3emVlZUM0QWFHQU1OL2NtQlQwZ0VBaUVUS0tDRUdBV0gvYnpTVFNRaEM5a3pRQVoxTXdJOXBPUU5IeGlFbUFRbzJZVzRJSmppR0VWaFowUEtEYURBdXc2eEFMaEFNYzhob0VLQ1pDQ0NXNUFiOVlPZ29aNm1xRmJzeTRJUkhscjZIUm1xZzBWRE1RcWNuMFFIeFJKQkpVaTNrME80Z2doQ01FVlJTYjJRQUIxRWtIUlVpalNqZ2d6K3hwamd0UXZBS0RNdGtQS2VjNkVESElFaFJTM1EvclpTWFYvWk5mdWpyZTg1MDN2ZWsvazNPbTJkMEZJcUIydEl1VGI0ZGIzUUliVFZ3RWN4elRkTTRnQUhzRHdCNGhYSVJSbytBTUdJSkJvYU9IaVdnaHFRV0FnY1ltcm9BTWdsMGovL21xajdBRGtoaUJRWGwxRHZvMFVBRkRMSmdkUXVIUWkwSW1ISzhTeUp6OUk2azZpem9KOCszbzd0Y25mWEI2VW1CZEVBRzd1eEFjWXdoakhETzhpRk1qTTBoWHlBYWtMNU9Vbk1UcEJrTzdtQ0V3OUlXK0ppMzRyMGdLL0xXVFFObWs1MFdFdWN6OFBzU2tWaXFaQ2ZpVDBnV0E5QUZvZkNOZFBJb0NDVUdBR0NXaGxBSWF1RXdra2N5R3QvUHJkOHk2UXZRZWc3d2Y1UUN2ZlBwU3kyd1FHQ1lGQlVDaS85cXkzbmU4Sk1YeFF2bzZSb1pwWklIRS95UW9Ta25xVjI3M29uMys4UWxxSmVZUXdMU3k4SG9pU3ZYb1F6ZHVrQlFteC9Fa2V2dmpZUXg0aEN6NUo3USt5TTZsUXhjVVdtMzFRYkM2UXFOdUU4NTNIdS9FVi9wTDhBQ3ovWkVaUk8wSXFISUFMSDRUdVBEL0l0eWxPa09JZlBTakhQd2p0RTNKa1FtVldJVE1JQ3RBTHdtYWJTS0FnN3JkMThCZDZ6cElRWVRabUMwRmVpRGQ2QlZGMXZ6Y3RzUGQrTmhGL0JaRnkyRmNRY2tabi9vWVI2RGQ0QlpGL05yRjZBQmlCQWppQkJ6RUQ5Q1I3WkFHQ3kwWVFIZmgvSThoMkVuZ1NKU0J4a2xBQ3dvZE5wRGNVRG5nU0NGQVF5d044RUNpREplaG1NRmdXL2FkOEF5RjZMUmlEbmplRDBvRUFNekJlRHBZUWFLZDZBOUY2VXppRVQxaUV2b0VBSzdDRG8xSXFwOElRL01VdUROR0RBVUI1VVBhREJ4R0FlaGRWRFRDSGRKZ0JBdkI5REJFcGs1SnNGS1pZREpHRUFmQXMxdGVFVHFoOVVFaUIvaFJCYlFGZ2JkQUhKZzF4aFNvSGlWdkloWWJvaFlnNEVkdEdja2tXRkV3R2NVR0JGSUNZRUhEWWVBT0lFZVRXSldSR1ZBNlJjZ0N3UE9KWGlJd0hBSTUzaVJMQmJxZG5FZC9XZW9SSGliRTRpeGtCYng4eGlKb2hocTlIaEhGb2d1cVdjbW1uRUtNb2k2VW9ibzVYZDZKSWdzY0lldXJHaE5QSGpOUklpc2c0RktuekVqM1hFRG00aGd2UmpMNklFZnhtUWdvQlRZVElFSzNuZXROb2pOeG9qY0pCSEFaM2JTY0JFUkpBaDNOSWZRWFJDQWtRa0FsZ0NBWUJBdnk0aXhVeGN0MDJFQUFuY0FhQmMxWEJBSVNVRnc0NUVOT0FDeXlBQzM2UVdoVTVFVk13QVUwd0FXWFlrU1Jaa2laNWtoNFJRVmxCa1IyNUQwM1FOTGtuUEJBTldaSmV3QUk4ODN3SmNSb2x5V0t2YUJEc2FISW1XWC9veEhPM1NHLzVVQlFhWUFsd2haSU1ZUXFBOGdPbVVKUk1PWlZVV1pWV2FaVUJBUUFoK1FRQmxnQUFBQ3dHQUFZQVdRQ0xBSWN5elRMeDBVWHhwVVR5WDBQeVNFUHlWa1B5ZVVUeWdrVHd5RVR6VFVQeHlrWHlpa1R3eDBUeHRrWHlVVVB4dDBUeHJrWHh4a1h3djBUeW1FVHlpMFB4dVVUeWFrUHh5RVh4eEVYeWFFUHh1MFR4ekVYeHpVWHlrVVR4bEVUeVVrUHlqMFR4aGtUeHBFVHlia1R4dEVYeHcwWHluRVR4Z2tUeVZFUHllMFR5WlVQeG9FVHhzRVR5ZVVQeWJFUHhza1R4dTBYeWRFVHhyRVR5Y0VQeVowUHh2MFh4ZVVUeHpVVHlta1R4ajBUeGswUHlZMFB4cmtUeWpVVHhwMFR5V2tQeWFVUHhoRVR4bzBUeGRVUHlvVVR5V0VQeWNrUHhxVVR4cTBUeHFrVHlrMFFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSS9nQUhRQWdRQU1JQUFBZ1RLbHpJc0tIRGh4QWpSaFJ3SWNBRkFRc2VFQ1RZUUtMSGp5QkRObFN3VVVHSmpSdEZxbHpKTW1HRWpSRmdDRUFwb3FYTm14RTdrS2hCb2tPTEJBY0VDRGlRQUtmUm93Z0xqTEF4b2dBQnBGQ2pTcDFLdGFyVnExaXphdDBLc1lDRkdSYWNKcUFBQVFLRm9seXhnbUR4Z0FXSUdETTMxa3g3RmNOR0RBMVFFcVI3bGNQR0RSYzBidXpJdDZvTXZ4dVE1QmdnQUFFREFRY0xVN1VRWWtFSUlCOGthOTdNdWJQbno2QS9FM0JRd01GVEFBTW9VSWdjK3FhQkNTWW1HQmpnQWFXSDFqY3JiS3l3QWdGS0JyaHQzdmpMUUFKS0NjRmJhdGlvUVlBQjN3RVlHRWpPTWdVT0lqaFM3RUE0Z0RWMWxRUlEvdnhBY2ZxNytmUG8wNFBPa0VFOVNCVW5GcHhROGVFNVFRVFQzVStzZUhHQjhZM0k2UWNSU1FTWkJCMUJ3QW40MEVzRXhWVGJSam9vK0pCT1BQbUUyZ0VIZUNmaFFrb3g1ZFNHSUlZbzRvZ2tLdVNWRVM0NHhSaEJrSlVJd0ZvVnZQQ1dZQnk1YUJkQmVPa1ZnSXNFQm1CU1hBVE5SV0lTaUIyeEFGQkNFZVVpWlpaaDV1S1RVRVlwWldHamxmWVVVR1VwV2VKcnNjMEdaQUJDanFnYlFienA2T0p3QkczQUFJMEJFRWJpbUFId3RtSUFMVzRKbTJ3YVBsbWxhVlAyNmVlZk9LVzIycE0wQkxGQUVEUjg4Q0JCdDVYb0Ewa0srTERBZ2RIeFdGSUoveEVVSUlrM0JvQ1hmZEhsUnlJSUwyZ2dZd3dJc1FkbEFTNE1rV0o1L29ER0t1dXNDNm42Skt1dU9nVXFmaTUyVU9vTFBtVWF3S1lqTWhoQVRKUW1TR0tQSmkwYVFJUWxVbVFSUnFpcGxtZUk4TWxISDYzY2R1dXRpSHMrTldlZEpLWndwM1pzdWpuaWNnUTFaMmFKYUFhZzVwZGhpZ2duYjFoQ29DV0pYT0xaWjdqZkJpeHdpUG51T3lLVElWandBYjB1SGhZQUJ6TGs4QzZKZnFVWkdFcnFpdGdwWHVOZXUrRmFiYjNWcDFkZ2ZUand5U2lqSjZqSEczYllGQUhPTmtvaWhUMjFrS3lMeHNZa0xMRWlNbHNDcU5LNUtHMS9xYmIzWkxielpaYnkwa3kzWnF1TDRZMzMxSzZpam1nZGR0cnQ3Q0s3QVRSM003ekVPUXZ0bTd1dFVPMmdMdlk3MjcrazhkbjAyM0FYeHBodjVCNWNXY0lmcE51d1VWOFFTNnlYaXhYTGV4Rk5OdDdWUU1Gb2tkZ0REdy93MEFPcVU2SkF3d3cwa0JmMzVaaGZoZVJRaVk5WXhBd2VFc0J3aVVvOFVHRUxFeGNMRXd4NmwraHp4eTRLOFZJRVFpelE1d0hMYVpCaFFBQWgvaFZOWVdSbElIZHBkR2dnVTJOeVpXVnVWRzlIYVdZQU93PT0nPiIKCiAgICAgICAgICAgICAgICAgcGxheVdyYXBIdG1sICs9ICI8ZGl2PiI7CgogICAgICAgICAgICAgICAgIF90aGlzLmNyZWF0ZUVsZW1lbnQoJ2RpdicsJ3pobUljb24nKTsKCiAgICAgICAgICAgICAgICAgbGV0IHpobVBsYXkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnemhtSWNvbicpOwoKICAgICAgICAgICAgICAgICB6aG1QbGF5LmlubmVySFRNTCA9IHBsYXlXcmFwSHRtbDsKCiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvL+W3pumUruaMieS4i+aLluWKqAogICAgICAgICAgICAgLy90eXBlOuagueaNruS4jeWQjOexu+Wei++8jOWkhOeQhuWbvuagh+WNleWHu+S6i+WKoQogICAgICAgICAgICAgemhtTG9nb0RyYWcodHlwZSx3ZWIpewoKICAgICAgICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwoKICAgICAgICAgICAgICAgICB2YXLCoHpobUxvZ29EcmFnPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiN6aG1sb2dvIik7CgogICAgICAgICAgICAgICAgIHZhciB6aG1Mb2dvSWNvbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5pY29uTG9nbyIpOwoKICAgICAgICAgICAgICAgICBpZighemhtTG9nb0RyYWcgfHwgIXpobUxvZ29JY29uKXJldHVybjsKCiAgICAgICAgICAgICAgICAgemhtTG9nb0RyYWcub25tb3VzZWRvd24gPSBmdW5jdGlvbihldmVudCl7CgogICAgICAgICAgICAgICAgICAgICBpZihldmVudC53aGljaD09MylyZXR1cm4gZmFsc2U7Ly/lsY/olL3lj7PplK4KCiAgICAgICAgICAgICAgICAgICAgIGxldCBzZWRvd25Ub3AgPSB6aG1Mb2dvRHJhZy5vZmZzZXRUb3A7CgogICAgICAgICAgICAgICAgICAgICBsZXQgemhtTG9nb0ljb25IZWlnaHQgPSB6aG1Mb2dvSWNvbi5vZmZzZXRIZWlnaHQ7CgogICAgICAgICAgICAgICAgICAgICBsZXQgYm90dG9tU3BhY2UgPSAxMDsKCiAgICAgICAgICAgICAgICAgICAgIGlmKGV2ZW50LnRhcmdldC5jbGFzc05hbWUgIT0gJ2ljb25Mb2dvJylyZXR1cm47CgogICAgICAgICAgICAgICAgICAgICAvL2xldMKgc2hpZnRYwqA9wqBldmVudC5jbGllbnRYwqAtwqB6aG1Mb2dvRHJhZy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0OwogICAgICAgICAgICAgICAgICAgICBsZXQgc2hpZnR4ID0gNTsKCiAgICAgICAgICAgICAgICAgICAgIGxldMKgc2hpZnRZID0gZXZlbnQuY2xpZW50WS16aG1Mb2dvRHJhZy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3A7CgogICAgICAgICAgICAgICAgICAgICB6aG1Mb2dvRHJhZy5zdHlsZS5wb3NpdGlvbsKgPcKgJ2ZpeGVkJzsKCiAgICAgICAgICAgICAgICAgICAgIHpobUxvZ29EcmFnLnN0eWxlLnpJbmRleMKgPcKgOTk5OTk5OTsKCiAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kKHpobUxvZ29EcmFnKTsKCiAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uwqBvbk1vdXNlTW92ZShldmVudCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgLy96aG1Mb2dvRHJhZy5zdHlsZS5sZWZ0wqA9wqBwYWdlWMKgLcKgc2hpZnRYwqArwqAncHgnOwogICAgICAgICAgICAgICAgICAgICAgICAgemhtTG9nb0RyYWcuc3R5bGUubGVmdMKgPcKgJzVweCc7CgogICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGhlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodCAtIHpobUxvZ29JY29uSGVpZ2h0LWJvdHRvbVNwYWNlOwoKICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB5ID0gZXZlbnQucGFnZVktc2hpZnRZOwoKICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBNYXRoLm1pbihNYXRoLm1heCgwLCB5KSwgaGVpZ2h0KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICB6aG1Mb2dvRHJhZy5zdHlsZS50b3AgPSB5KydweCc7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgLy/lnKhtb3VzZW1vdmXkuovku7bkuIrnp7vliqjlm77moIcKICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJyxvbk1vdXNlTW92ZSk7CiAgICAgICAgICAgICAgICAgICAgIC8v5p2+5byA5LqL5Lu2CiAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50Lm9ubW91c2V1cCA9IGZ1bmN0aW9uKGUpewoKICAgICAgICAgICAgICAgICAgICAgICAgIEdNX3NldFZhbHVlKCdpY29uVG9wJyx6aG1Mb2dvRHJhZy5vZmZzZXRUb3ApOwoKICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScswqBvbk1vdXNlTW92ZSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgemhtTG9nb0RyYWcub25tb3VzZXVwwqA9wqBudWxsOwoKICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBoZWlnaHQgPSB6aG1Mb2dvRHJhZy5vZmZzZXRUb3AremhtTG9nb0ljb25IZWlnaHQrYm90dG9tU3BhY2U7CgogICAgICAgICAgICAgICAgICAgICAgICAgaWYoemhtTG9nb0RyYWcub2Zmc2V0VG9wIDwgMCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpobUxvZ29EcmFnLnN0eWxlLnRvcCA9JzBweCc7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgaWYod2luZG93LmlubmVySGVpZ2h0IDwgaGVpZ2h0KXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemhtTG9nb0RyYWcuc3R5bGUudG9wID13aW5kb3cuaW5uZXJIZWlnaHQtemhtTG9nb0ljb25IZWlnaHQtYm90dG9tU3BhY2UrJ3B4JzsKCiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAvL2NsaWNr5LqL5Lu25aSE55CGCiAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2godHlwZSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3ZpZGVvJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHpobUxvZ29EcmFnLm9mZnNldFRvcD09c2Vkb3duVG9wICYmIHdlYi5sZW5ndGggPT0gMCAmJiB6aG1Mb2dvRHJhZy5vZmZzZXRUb3A+MCAmJiB3aW5kb3cuaW5uZXJIZWlnaHQgPiBoZWlnaHQpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2VDbGFzcy50b2FzdCgn6K+35Zyo6KeG6aKR5pKt5pS+6aG154K55Ye75Zu+5qCHJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ211c2ljJzoKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHpobUxvZ29EcmFnLm9mZnNldFRvcD09c2Vkb3duVG9wICYmIGUudGFyZ2V0LmNsYXNzTmFtZSA9PSAnaWNvbkxvZ28nKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2RvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScswqBvbk1vdXNlTW92ZSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy96aG1Mb2dvRHJhZy5vbm1vdXNldXDCoD3CoG51bGw7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG11c2ljVXJsRGF0YSA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7bWF0Y2g6L15odHRwcz86XC9cL211c2ljXC4xNjNcLmNvbVwvI1wvKD86c29uZ3xkailcP2lkL30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge21hdGNoOi9eaHR0cHM/OlwvXC95XC5tdXNpY1wuMTYzXC5jb21cL21cLyg/OnNvbmd8ZGopXD9pZC99LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHttYXRjaDovXmh0dHBzPzpcL1wvbXVzaWNcLjE2M1wuY29tXC8oPzpzb25nfGRqKVw/aWQvfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7bWF0Y2g6L15odHRwcz86XC9cL3lcLnFxXC5jb21cL25cL3J5cXFcL3BsYXllci99LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHttYXRjaDova3Vnb3VcLmNvbS99LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHttYXRjaDova3V3b1wuY24vfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7bWF0Y2g6L15odHRwcz86XC9cL3d3d1wueGltYWxheWFcLmNvbS99LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBtdXNpY1VybCA9IG11c2ljVXJsRGF0YS5maWx0ZXIoZnVuY3Rpb24oaXRlbSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhdGlvbi5ocmVmLm1hdGNoKGl0ZW0ubWF0Y2gpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYobXVzaWNVcmwubGVuZ3RoPT0wKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzZUNsYXNzLnRvYXN0KHdlYlswXS50aXApOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoKHdlYlswXS5uYW1lKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICduZXRlYXNlJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0ZWFzZUZ1bigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdxcSc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFxRnVuKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2t1Z291JzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga3Vnb3VGdW4oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAna3V3byc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGt1d29GdW4oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAneGltYWxheWEnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4aW1hbGF5YUZ1bigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBuZXRlYXNlRnVuKCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB1cmxQYXJhbXMgPSBfdGhpcy5nZXRVcmxQYXJhbXMobG9jYXRpb24uaHJlZik7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHVybFBhcmFtcy5pZCA9PSB1bmRlZmluZWQpIHJldHVybjsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5ldGVhc2VVcmxFbmNvZGUgPSBlbmNvZGVVUklDb21wb25lbnQoJ2h0dHBzOi8vbXVzaWMuMTYzLmNvbS9zb25nP2lkPScrdXJsUGFyYW1zLmlkKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG9wZW5VcmwgPSB3ZWJVcmwrIj9pZD0iK3VybFBhcmFtcy5pZCsiJnR5cGU9bmV0ZWFzZSIKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93Lm9wZW4ob3BlblVybCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHFxRnVuKCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBxcVNvbmdNYXRjaDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLnBsYXllcl9tdXNpY19faW5mbyIpKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFxU29uZ01hdGNoID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLnBsYXllcl9tdXNpY19faW5mbyIpLmNoaWxkTm9kZXNbMF0uaHJlZi5tYXRjaCgvc29uZ0RldGFpbFwvKFxTKilcPy8pOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZihkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjc2ltX3NvbmdfaW5mbyIpKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFxU29uZ01hdGNoID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI3NpbV9zb25nX2luZm8iKS5jaGlsZE5vZGVzWzBdLmhyZWYubWF0Y2goL3NvbmdcLyhcUyopLmh0bWwvKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxcVNvbmdNYXRjaCA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIXFxU29uZ01hdGNoWzFdKXtjb25zb2xlLmxvZygn5rKh5pyJ6I635Y+W5Yiw5q2M5puySUQnKTsgcmV0dXJufTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGF1ZGlvTGluayA9IGVuY29kZVVSSUNvbXBvbmVudChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJhdWRpbyIpLnNyYyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBvcGVuVXJsID0gd2ViVXJsKyc/aWQ9JytxcVNvbmdNYXRjaFsxXSsnJnR5cGU9cXEmcGxheVVybD0nK2F1ZGlvTGluazsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93Lm9wZW4ob3BlblVybCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGt1Z291RnVuKCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhdWRpb01vZHVsZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNhdWRpb01vZHVsZScpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihhdWRpb01vZHVsZSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjYXVkaW9Nb2R1bGUnKS5zdHlsZT0nYm90dG9tOjBweDsnOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3Nob3dIaWRlX3BsYXliYXInKS5jbGFzc05hbWUgPSAnaWNvbiBzaG93LXBsYXliYXItYnRuJzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2VDbGFzcy50b2FzdCgn6K+354K55Ye75pKt5pS+6ZyA6KaB5LiL6L2955qE5q2M5puy77yM54S25ZCO5Zyo572R6aG15LiL5pa55pKt5pS+5Zmo5YaF54K55Ye7IuS4i+i9vSInLDIwMDApCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGt1d29GdW4oKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnBsYXlDb250cm9sJykuc3R5bGU9J2JvdHRvbTowcHgnOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlQ2xhc3MudG9hc3QoJ+ivt+eCueWHu+aSreaUvumcgOimgeS4i+i9veeahOatjOabsu+8jOeEtuWQjuWcqOe9kemhteS4i+aWueaSreaUvuWZqOWGheeCueWHuyLkuIvovb0iJywyMDAwKQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB4aW1hbGF5YUZ1bigpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcueG0tcGxheWVyJykuc3R5bGU9J2JvdHRvbTowcHgnOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlQ2xhc3MudG9hc3QoJ+ivt+eCueWHu+aSreaUvumcgOimgeS4i+i9veeahOatjOabsu+8jOeEtuWQjuWcqOe9kemhteS4i+aWueaSreaUvuWZqOWGheeCueWHuyLkuIvovb0iJywyMDAwKQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd5b3V0dWJlJzoKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgIHpobUxvZ29EcmFnLm9uZHJhZ3N0YXJ0wqA9wqBmdW5jdGlvbigpewogICAgICAgICAgICAgICAgICAgICByZXR1cm7CoGZhbHNlOwogICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICB9CgogICAgICAgICAgICAgLy/kuIvovb0KICAgICAgICAgICAgc3RhdGljIExSX2Rvd25sb2FkKHVybCxmaWxlbmFtZSl7CgogICAgICAgICAgICAgICAgbGV0IHVhID0gbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpOwogICAgICAgICAgICAgICAgY29uc29sZS5sb2codWEubWF0Y2goL3ZlcnNpb25cLyhbXGQuXSspLipzYWZhcmkvKSk7CgogICAgICAgICAgICAgICAgaWYodWEubWF0Y2goL3ZlcnNpb25cLyhbXGQuXSspLipzYWZhcmkvKSl7CgogICAgICAgICAgICAgICAgICAgIHdpbmRvdy5vcGVuKHVybCk7CgogICAgICAgICAgICAgICAgfWVsc2V7CgogICAgICAgICAgICAgICAgICAgIEdNX2Rvd25sb2FkKHVybCxmaWxlbmFtZSk7CiAgICAgICAgICAgICAgICB9CgoKICAgICAgICAgICAgfQoKICAgICAgICB9CgogICAgICAgIGNsYXNzIENvdXBvbkNsYXNzIGV4dGVuZHMgQmFzZUNsYXNzewoKICAgICAgICAgICAgY29uc3RydWN0b3IoKXsKCiAgICAgICAgICAgICAgICBzdXBlcigpOwoKICAgICAgICAgICAgICAgIHRoaXMuZGl2RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwoKICAgICAgICAgICAgICAgIHRoaXMuZGl2RWxlbWVudC5pZD0nemhtX2Rpdl9zJzsKCiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGFvYmFvKCl7CgogICAgICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgICAgICAgICBsZXQgbm9kZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNKX2p1VmFsaWQnKTsKCiAgICAgICAgICAgICAgICBub2RlLnN0eWxlPSdvdmVyZmxvdzppbmhlcml0OycKCiAgICAgICAgICAgICAgICBsZXQgY2xhc3NOYW1lID0gJ3pobV90YWJfdGFvYmFvJzsKCiAgICAgICAgICAgICAgICBfdGhpcy5nZXRUaXRsZVNob3AoJy50Yi1tYWluLXRpdGxlJywnLnRiLXNob3AtbmFtZSA+IGRsID4gZGQgPiBzdHJvbmcgPiBhJykudGhlbihmdW5jdGlvbihyZXNwKXsKCiAgICAgICAgICAgICAgICAgICAgX3RoaXMuZ2V0Q291cG9uSW5mbyhub2RlLGNsYXNzTmFtZSxyZXNwLmdvb2RzVGl0bGUscmVzcC5zaG9wTmFtZSk7CgogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICB9CiAgICAgICAgICAgIHRtYWxsKCl7CgogICAgICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgICAgICAgICBsZXQgbm9kZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5BY3Rpb25zLS1sZWZ0QnV0dG9ucy0tMU0zS2tGNycpP2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5BY3Rpb25zLS1sZWZ0QnV0dG9ucy0tMU0zS2tGNycpOmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNKX0xpbmtCdXknKS5wYXJlbnROb2RlOwoKICAgICAgICAgICAgICAgIGxldCBjbGFzc05hbWUgPSAnemhtX3RhYl90bWFsbCc7CgogICAgICAgICAgICAgICAgX3RoaXMuZ2V0VGl0bGVTaG9wKCcuSXRlbUhlYWRlci0tbWFpblRpdGxlLS0zQ0lqcVc1JywnLlNob3BIZWFkZXItLXRpdGxlLS0ycXNCRTFBJykudGhlbihmdW5jdGlvbihyZXNwKXsKCiAgICAgICAgICAgICAgICAgICAgX3RoaXMuZ2V0Q291cG9uSW5mbyhub2RlLGNsYXNzTmFtZSxyZXNwLmdvb2RzVGl0bGUscmVzcC5zaG9wTmFtZSk7CgogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICB9CgogICAgICAgICAgICB0bWFsbENhb3NoaSgpewoKICAgICAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CgogICAgICAgICAgICAgICAgbGV0IG5vZGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuQWN0aW9ucy0tbGVmdEJ1dHRvbnMtLTFNM0trRjcnKT9kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuQWN0aW9ucy0tbGVmdEJ1dHRvbnMtLTFNM0trRjcnKTpkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjSl9MaW5rQnV5JykucGFyZW50Tm9kZTsKCiAgICAgICAgICAgICAgICBsZXQgY2xhc3NOYW1lID0gJ3pobV90YWJfdG1hbGwnOwoKICAgICAgICAgICAgICAgIF90aGlzLmdldFRpdGxlU2hvcCgnLkl0ZW1IZWFkZXItLW1haW5UaXRsZS0tM0NJanFXNScsJy5TaG9wSGVhZGVyLS10aXRsZS0tMnFzQkUxQScpLnRoZW4oZnVuY3Rpb24ocmVzcCl7CgogICAgICAgICAgICAgICAgICAgX3RoaXMuZ2V0Q291cG9uSW5mbyhub2RlLGNsYXNzTmFtZSxyZXNwLmdvb2RzVGl0bGUscmVzcC5zaG9wTmFtZSk7CgogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgfQogICAgICAgICAgICB0bWFsbE90aGVyKCl7CgogICAgICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgICAgICAgICBsZXQgbm9kZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy50bS1tc2ctYm94Jyk7CgogICAgICAgICAgICAgICAgbGV0IGNsYXNzTmFtZSA9ICd6aG1fdGFiX3RtYWxsJzsKCiAgICAgICAgICAgICAgICBfdGhpcy5nZXRUaXRsZVNob3AoJy5JdGVtSGVhZGVyLS1tYWluVGl0bGUtLTNDSWpxVzUnLCcuU2hvcEhlYWRlci0tdGl0bGUtLTJxc0JFMUEnKS50aGVuKGZ1bmN0aW9uKHJlc3ApewoKICAgICAgICAgICAgICAgICAgIF90aGlzLmdldENvdXBvbkluZm8obm9kZSxjbGFzc05hbWUscmVzcC5nb29kc1RpdGxlLHJlc3Auc2hvcE5hbWUpOwoKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgfQogICAgICAgICAgICBqZCgpewogICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKT0+ewoKICAgICAgICAgICAgICAgICAgICBsZXQgamRHb29kc0lkID0gY291cG9uVXJsLm1hdGNoKC9qZFwuKGhrfGNvbSlcLyhcUyopLmh0bWwvKTsKCiAgICAgICAgICAgICAgICAgICAgbGV0IG5vZGU9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNjaG9vc2UtYnRucycpOwoKICAgICAgICAgICAgICAgICAgICBub2RlLmJlZm9yZSh0aGlzLmRpdkVsZW1lbnQpOwoKICAgICAgICAgICAgICAgICAgICB0aGlzLnJlcXVlc3QoJ2dldCcsYGh0dHBzOi8vYXBpLnR5cGVjaHJvbWUuY29tL2luZGV4X2pkX25ldy5waHA/Z29vZHNfaWQ9JHtqZEdvb2RzSWRbMl19YCkudGhlbigocmVzdWx0KT0+ewoKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3A9IEpTT04ucGFyc2UocmVzdWx0KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBodG1sPScnOwoKICAgICAgICAgICAgICAgICAgICAgICAgcmVzcC5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0bWwgKz0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgCiAgICAgICAgPGRpdiBjbGFzcz0iemhtX2NvdXBvbiIgc3R5bGU9Im1hcmdpbi1sZWZ0OjEwcHg7Ij4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iemhtX2xlZnQiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iemhtX2ltZ19pY29uIj4KICAgICAgICA8aW1nIHNyYz0iZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoWkFCa0FIai9BQ0gvQzA1RlZGTkRRVkJGTWk0d0F3RUFBQUFoK1FRSkxBSC9BQ3dBQUFBQVpBQmtBS2Y2QkRuNkJEbjZCRG42QkRuNkJEbjZCRG42QkRuNkJEbjZCRG42QkRuNkJEcjZCVHI2QlRyNkJUcjZCVHI2QlRyNkJUcjZCanI2QmpyNkJqdjZCanY2Qmp2NkJqdjZCenY2Qnp2NkNEejZDRHo2Q1QzNkNUMzZDVDM2Q2o3NkN6NzZDei82Q3ovNkRELzZERUQ2RFVENkRVRDZEa0g2RGtINkRrSDZEMEw2RUVMNkVVUDZFVVQ2RWtUN0UwWDdGRVg3RkViN0ZFYjdGVWI3RlVmN0ZVZjdGa2Y3RmtmN0YwajdGMGo3RjBqN0YwajdHRWo3R0VuN0dVcjdHa3Y3RzB2N0hFejdIVTM3SDAvN0lWRDdJMUg3SkZMN0psVDdKMVQ3S0ZiN0tWYjdLbGY3SzFqN0xscjdNRno3TWwzN05GLzhObUQ4T0dMOE9tVDhQR1g4UDJmOFFXbjhRMnI4Ukd2OFJtMzhSbTM4UjI3OFNHLzhTWEQ4U25EOFRITDhUblA4VDNUOFVIWDhVbmY4VkhqOFYzdjhXMzc4WUlMOFpJWDhhb244YjQzOGNZLzdjSTc2Yll2NGE0bjFhWWZ1WjRUalpIL1VaSHpIWm51OGFYcXRiSHFpYjNxV2MzcUlkM3VBZUhwNWVYbDZlbnA3ZTN0OGZIeDlmWDErZm41L2YzK0FnSUNCZ1lHQ2dvS0RnNE9FaElTRmhZV0dob2FIaDRlSWlJaUppWW1LaW9xTGk0dU1qSXlOalkyT2pvNlBqNCtRa0pDUmtaR1NrcEtUazVPVWxKU1ZsWldXbHBhWGw1ZVltSmlabVptYW1wcWJtNXVjbkp5ZG5aMmVucDZmbjUrZ29LQ2hvYUdpb3FLam82T2twS1NscGFXcnBxZTJxS3ZBcWE3SnFySFFxN1BYckxYZHJMZmlyYmpvckxudXFybnlxTGoxcDdqM3BiZjVwTGI2b3JiN29yWDhvYlg4b0xUOW9MVDlvTFQ5b2JYOW9yYjlvN2Y5cGJqOXBybjlwN245cUxyOXFMdjlxYnY5cWJ2OXFyejlxcno5cXJ6OXE3ejlxNzM5cTczOXJiNzlyci85c01IOHNzTDh0TVQ4dHNYOHVNZjd1c242dmNyNndNejV3czc0dzgvNHhkRDN4OUgzeU5MMnl0VDF5OVgwemRiejBOZnkwdG54MU5yeDFOdngxZHZ4MXR6eDE5M3cyTjN4MmQvdzI5L3YzT0h2M3VMdjRPUHY0dVh1NWVmdTUrbnU2dXZ0N2UzdTd1N3Y3Ky93OFBEeDhmSHk4dkx6OC9QMDlQVDE5ZlgyOXZiNCtQajUrZm43Ky92OC9QejkvZjMrL3Y3Ky92NysvdjR5elRJSS9nRC9DUnhJc0tEQmd3Z1RLbHpJc0tIRGh4QVpxbHZTSktMRml4Z3ovaXRENU1RSkkybzBpaHhKTWdrSEJ3bzhQQ0hKc3VWRFlrSWN5SlJReEovTG16Z0w0b281azRqTm5FQmQ0aG9pMDRFRW4wR1RHalFIUlVtU0x3NkhGajM2azJHWEpVbWdWRlVLc1VrS0NoaDZqR2tvdGVmV2hHSjhhS0NRd2duWGlHVjZGTVZRazJGWm8wZ1granVpUWFhQ0hyamVQcVRpb3FpREZGY1liaU1xa3dLU2hsWldLSkJaSUVkSXdRMjNFYUZRbElJUVp3eWpxS0JBUWNVVXUwSTROeDV5Rm5QQ0tpc01nNGpDc0JzVUlrV2tOSVJTd3JDS0xhNGQrak9Dd1hDUHl5elIvRENNNFVqd2gxd0tGeDFSeGVXWUZnV0t3aWp6L0tHU2t3NEsvc0F3NDVJTWpPd3BLM1ozU0NiSTJoVHFXL3BiVW9LQ2h5SEkxek1zVTJTSVZweS9OREZFRW1ub2h4TXVWRUNSUlJaWVhDRUVGcjRZNkpvYVVoamh3d3dzZUFCQ0NTV0lvSUVMTGdpUnhCUzhTQWlVUDFNUU1jTUlHa2hnMklzT1VLQkJDVHdrRVlhSkJaSFQya05TQ0pGQ2NUQUdhUmdITFJnaFJrYit4Sk9jRWpQWXdFUmdFSFV4eEZkQ1Z2a2lCaTRza1Y5RGFDeVJndzFMUUtuUkVpRElCTUlQVk94b2tEOVEyQUJra0JKd0JsYU1MZ3JKZ1ErSk5XVE5Feng0SUpNSThXR2tuR0VVbkVDRUZ3dXBjVVJ2UWM3WVFnOUduRkNDQ2pBZzBRTU1KL1FGSXdVdFBLSG1RRlVFTWNLTE9jQ2owYUJYdXFBYlFtY1E0ZWVML2hTTTBNTVJVMnc1a0JwVUdKSERDS29aZHNJU256YkJRcTlGOGZDcFEweVVDZU54QjUwaGhLYUdsU0JFRk1wRUJVVVFqQm9td2hIbUhGUkdEa0dlUUp0SWFpVFJ3cHRtamtzUUdzKytxRUVPVWh5TGtEOVI4QUN0VEI4QWE1QVhLbVJYbEFZd09LRU5TMW9NY1lKcUNyaEFSa0hnSEFGZVVTSVVjWVpHWmhpUnJVemlHdlR0WkRHcVlNUllOMGtCeEFrZ3NMQlNRVTJNNm1zVDhqYmtqMWN2dW9Cb1FVNm9BTUlKUWxRSFZEQlVQTUdGUVYzQThHSUtVTGowUkd5ZEFiSGxPbFU0a1daM3R3eUJyZ2h1M2RURUNVTXlnU05CdkJtbWdSRXRDNlNHclFrcDhhcE1MY3lNb3hwQnZQZ0QyUWFSUVVRT09Sd0JkMEZxcERhWC9oRmIveFBGeFNmb3ZOQXlSR2hRUUVwSk9KUkZDMFVwd01LUkpwS3pXV2Q1TFRTR0MvNVdkbmRCZlAycnRZbGR1TUN4QXlwMDRkQVlMR1MrblVOZVNDY1RENXNMNXNUWkVyQjJPbmFVeWNDZHk4Uk5KL2g2L2d6UnF3ZnFNblJkNWpLUTUxQVZXTXVFd1JJU2Z0dTRDN3MzZEh6dXlqZDBCZytHK1pDT2dXR3dNRG9RMzkrT2ZQWU0rVE41ZURPd1llQVQyVG9HMGZYaEpkL1Z3eU5vZ1pNWlRpbmh2MU5KUUo5QW5QQXdEbnpPZk5pRENQeW1rd1dEZkNFSi8vTmZFcG9RTzdFUmdRT2t5U0FGT0lDZmdrQUJXaVhRMzBQb1Z3RDdQUVFNcVpPSkFRc3lCdmRva0RRZ01FSTJHSktFRW95dUtBV2dEc3BBQ0pVUjRxNSsvZ0pjQ0JsK0tBRWdlUEJzTC9KQUR4aGlnM3ZKWmxVRFdjS2JTdEJEQkFJUklrUDBWeEVMOG9TSHdZb0REQWtEdUJSQXhqSXFvQVVnRzhnVFFLZzI2LzJ3aEVGVWlCZFdvRVVqRW9RS0xUQmpHUjJRZ3lvcVJBby9BSkVnWFpDRGszRU5XaUNBb2h2UEI1RmtGV1dGQkhrWkR3WUpJaDlRNFNGcTJBSVdOb2tGTFpETkpIdWIzeHZIMHhWb2pRQUxCMUVEZ3pqWkJURzVoQW9wNEJnRmlpQktSZ3BuZlE0UUFTcjFBd2JSRmNVR0ZSeUllVElIdTRlZ1FTNjVRNE9CMk9hcm56bmtHMGg0bFFlZzk1QXF4TElvUHdoYlVwRHdKZzFRMHlGbU9BSU1ab0FFVnpJRUNkQjZub21rY0RITFJHUWI1UnVoRGFJbFFnT2RBWmt5L2xFSlY1aUFSQitZY3oxTHVCY1AzT2N5S0JqQkNJcTBITGc4dDdYUWVTMXg2Zk1LV0ZSUXRQUVo0VjdVNjF2bmlwS0NTeTRFRE9meGl3M2lXSkFvTkU4bUdsQkMzLzd4aFhrYWg2UURRY0lIRERPQ05oNGtDek40MFF4Z3FoUi9FT01nVGxDVzg0Z2dEWVZBNFFRY1UwQUt3S0FRTkFTQldDQ29hRUdDb1UyTVZDTUtQN0RCRUJaR0VEVkl6VEFmQ0pSQjJDQUVESkFSQTBPbzFyeEFTVGxtRk1RTFE4Z0JFT0tWRXlvSW9UY0t3SUFRekJrR2x4WWxiUXJwZ2hCVW9BSWhRQTRoVTFBQnFiaDZxN0lxZ0FMU3NvSkx2RUFFS3ZtbEJNQXBpQlJTUUNnaEhFTWg2SkRDMHhKaUJoOE03VFFGQ1orL09sYUU2bW1rQ2psQS9oZEtUcERaU0pwTk5sTE55Qks4NklFREVrUU1QL3hYRHc2TGtWMElEMFlhS01KUERaS0dweHJHQmhQTGlFTTdzOWRVRmc1R0dDQ0NTT0p5UTdaSTdEVklRK2szTGVLUElxRExCY1F0Q0JtTU1KcVl6VEFqdk5DYm1kREVrTzhZeGdWcGpFaGtSZ2RKaFZoQkNDcUxrUkNxaWhBcDJFQUVJOGlCRTdyUmtESnc3MThxSmE5NURmTzJoa3pqQ1RrUWdRaDZZRk9NakVFS1Vnam1RSm9nVkFmQVFKa1I2VUllSVpiUWhad0J4SzU5VGhwTSt5OGJ2UERHTnc3THZZRFFqSlUreEFrenRaS1FZU1NDRnZ1WXRBc2RzcElkNE04alB3U2RTeDR5QjhUcVpJVlVRUVUzalBLTHpzallLaStFdTNQNUFBakdUT1l5bDlrRGJ5cEEvZytBNGVXR2xIWjhUbGlDbk9kTVp6cERBWjhGNE1GeTI2eVFOOCtFbGc3cEJtUEMwNE05OHhraGZzYUxOdStpWmtNZjJpQ0pwa3BVQnQzb1I1UFdCeHlUTkZrb1hXaExJNXJHZUhtSU16anRhRThMcExTR0VVSVlyb0NGQlMySWs1eTh3aFhFMERiSzZOblVrQWExQXpoZzVsNlgyVU00dkRXdUNZSnFMUXNwejZVMjlSa3diZXdnS2NBR2JoMzJRSGJTN0NCNWhzQk9oa0lMNmxSdEIyakFCdldVdGtCUTlJUGh6VUFDR0VpM3V0TXRnUnpRRGdneEZ2Y0FvY1dCM0Jva29FWHhnTDNsTFpDL0dTWUgwVFhJR1B5cVZEL3lXeUQzWk00UUNsU1FNcFRWTUVDSTlzRUp3Z1F2YW9BSFRuQ2ZQODdRaE5pQ2RkOFRqd3VNU1VEZ0FnOTR3QVZCbm9yU0puNlFLWVJYeVM2b0xjdFJkbElocThESU0vL0h5MXBBZ1N3ekJ3YkZ5N2xCckRBbDJYcGJCVU5ncXRBVjRnOHFGS0htTFRqQ0xwZE85YW9uSkNBQUlma0VDVElBL3dBc0JnQUJBRmdBWVFDbkFBQUFBUUVCQWdJQ0F3TURCQVFFQlFVRkJnWUdCd2NIQ0FnSUNRa0pDZ29LQ3dzTERBd01EUTBORGc0T0R3OFBFQkFRRVJFUkVoSVNFeE1URkJRVUZSVVZGaFlXRnhjWEdCZ1lHUmtaR2hvYUd4c2JIQndjSFIwZEhoNGVIeDhmSUNBZ0lTRWhJaUlpSXlNakpDUWtKU1VsSmlZbUp5Y25LQ2dvS1NrcEtpb3FLeXNyTEN3c0xTMHRMaTR1THk4dk1EQXdNVEV4TWpJeU16TXpORFEwTlRVMU5qWTJOemMzT0RnNE9UazVPam82T3pzN1BEdzhQVDA5UGo0K1B6OC9RRUJBUVVGQlFrSkNRME5EUkVSRVJVVkZSa1pHUjBkSFNFaElTVWxKU2twS1MwdExURXhNVFUxTlRrNU9UMDlQVUZCUVVWRlJVbEpTVTFOVFZGUlVWVlZWVmxaV1YxZFhXRmhZV1ZsWldscGFXMXRiWEZ4Y1hWMWRYbDVlWDE5ZllHQmdZV0ZoWW1KaVkyTmpaR1JrWldWbFptWm1aMmRuYUdob2FXbHBhbXBxYTJ0cmJHeHNiVzF0Ym01dWIyOXZjSEJ3Y1hGeGNuSnljM056ZEhSMGRYVjFkbloyZDNkM2VIaDRlWGw1ZW5wNmUzdDdmSHg4ZlgxOWZuNStmMzkvZ0lDQWdZR0Jnb0tDZzRPRGhJU0VoWVdGaG9hR2g0ZUhpSWlJaVltSmlvcUtpNHVMakl5TWpZMk5qbzZPajQrUGtKQ1FrWkdSa3BLU2s1T1RsSlNVbFpXVmxwYVdsNWVYbUppWW41MlRxcVNLdUsxK3pMcHIzc1ZZNmN4TjdzOUg4TkJGOE5CRjhOQkU4TkJFOE5CRThOQkU4TkJFOE5CRThOQkU4TkJFOE5CRThOQkU4TkJFOE5GRThORkU4TkZFOE5GRThORkU4TkZGOE5GRjhORkY4TkZGOE5GRjhORkY4TkZGOE5GRjhORkY4TkZGOE5GRzhkRkc4ZEZHOGRGRzhkRkg4ZEZIOGRGSDhkRkk4ZEZJOGRGSjhkSko4ZEpKOGRKSzhkSks4ZEpMOGRKTDhkSk04ZEpNOGROTjhkTk84ZE5QOGROUDhkTlE4ZE5ROGROUjh0UlM4dFJTOHRSVDh0UlY4dFZXOHRWWTh0Wlo4dFpiOHRkZTg5ZGc4OWhpODloajg5aGo4OWhrODlsbTg5bG85TnBxOU5wcjlOcHM5TnR0OU50dzlOeHk5Tnh6OU4xMTlOMTI5TjEzOU4xNTlkNTc5ZDkrOWQrQTllQ0Q5ZUdHOXVLSzl1T045dU9ROStXWCtPaWsrT3V1K2UyNCt1L0MrdkhKK3ZISU1zMHlDUDRBL3drY1NMQ2d3WU1JRGZZTE55Nmh3NGNRSTBxY1dJL2JNbWZkOGszY3lMSGpSbS9IY3VVNlZzNmp5Wk1uK1cwVEtiSmJQNVF3WXo3Y3g0MWxMbTR2WmVyYytZK21UWmM4Z3hMc1orN2J0M2dTZmJMRUtSSGVOMi9sY2dwMU9NNVpMMkRaNWtWVUtwSXBSSG5aZ1BWeVZuSnFRbnJaV1BZQ09yUG1VcWtKKzNrRHhqS2JQck1JMVVXejZhd2R4SDV1Yy9YeUZwSGRNNWF4cm1uRXE1QmJMN1hiNENJMFozVnNPb2o2dGowVzJjc3I0NExxRHJOTWh1NXZPVzdkU2tNc3A0d3Z2TThIKzNXalczZXhUbnhwV1FMckJoc2hQR3MyazZuak9lOVpMSmJXNlBWRytDMWtybGpKZWRLemRueGt3K1VINldrVE52YjZ6bjdmbFA3MU9zYk5OdmFDOUxweGl5cVUzemh1My9DZGg3bFBIVHA0N3RxMTQrYU8zM3k4K0tEVFRUYldQSE5NTXNvb2s0d3cwVml6elRmcCtQZGZUUDJrMDQwMXl0Qm0wNGJqTFpQTk4vTE0xNDlrRzZHempWVWJwcWppTWRGMEU2SkpJMHAwenpmV1dEUE9YUnZCd3cyS0t2YVlvakRXaEdOZVJQalFhTTAzKzBBVVRqSWlIWk9OT2lUR1ZvNDFHcXI0V0M5WCtqaFNOdXhJMUU4NTF6aVhqSGNJM1pNYlN4aTk1bEErM3JTbW9qREtSSk5OTjg0NDg0dzEzaEM0VEpWcVJjT2VRK3RzdzZSTjEwUTVrSmtwOW1LTmFnZlp3NDF6TnZXaVREYmVvQ1BmUWZtbzA4MDF5V3pHVnppRy9qUE9NNTdXRmFwQVM2cVl6WkFDMmJPTk1QNHBLck1OT2hKaVpzNDJ5NlNZakRkUlRxZWlNK1pBbE04MzBaU2FpM0FHM2NNTnJEWUJjdzA2cHlMVUR6clhNTXZTTWQrUUNJOHoxWWtFakRWL1FxUWpqN2xFTnhSSUd5YlRqVDBvMWRPTm0yZ0dpeDV3bkdHa0ZVZm9aTFBNTWMrVVJkQTQ4SXJrekRqUlJ0UlBWUnRhbythL3poeXp6RFpkbXNTUE91UXNQTkJ2R3dMTFV6bWljYmJOa1Ayc013NlVVK25qV0hCazZvVHd0ZUhNWjA3QXdyQUZFVDZzU3R1Y1RkRWd0UncrMm15WXphVVB6Y1BOTmRkNFU3TkIrR2ltRm0vTG9ST3dNOE5CNU0reVRYNGprVHQ3c2ZUTWk1OEI1dWxhQmY4ekQzVWlKUWIwUTNQcDFqSnM4R1F0c01VT3lXTWNjc3BGaERGTGlzRkdEdjZrTjRYOWp6elJkR3Z1WDkxNG1rekVlSGw5TGFOZkJVNzNST280bzV2VmpOVkRyMGpXMURNUjRJTFhIVkU5MTlpVWpkOG15UzA2Nlp3Lzd1WEp6MWx6dGxDc3FVWFk1bk5qN25sRTQwQ2FETnlmRytXNzcrd1d0UGUxS1Q4a2QrY2J4UzVTTW40VkZNL3Z2cE9qRVQ2UFltbjllT1VWVkE2a3l2QWV0K08yYnhSUHg4ZUlVOUE4cjE2UDVURzhodGVqTXVzVU5JNjEzVzgwRC9qbDNnNFJQUjNuc28zMmZMUEpNYlJoRFd0dDZCaU0rOGMzTktRTW5Vbmtmc2liQ0FSWm9nMEE5bWc4OGJqY2hxSnhyNEdVZzM3ZVM4Z0V3emNSZVBTdmdnVFJTNCtzZ1pSODFlaUYxcmlHdnp5b3U4dElFSCtEaTRnNEJqVVM4dzFsSFA3WHNFYURvdEdnSncwa0gvblJUenZjOFRxQjNJd3pzNU5JNmtnb2tmbU54aDBId1VjUzlRT1BKSFVrSFpMakROTWVXTHY4VFVSeHl3dWhUdUxodG5MaEtDSmpxMDRzVmpVUlJDR25pVHpKeDByUXBFYUZvR3NrbEpQSU9zSW9rdEY5Sm0zZUN1VG52RkVqYjd3eElvak1CVERXeGhpbkVRcVBEb21SL1RTNGpEN3F4QjVuR3NrTXpTSU92dG1sTjk4dzRNKzhaQTV2cEVhQ0doU0dEOW5XUm1Fb01pNVZ3Wkl6RWlpdDJkZ2toNGVzRXRRZ2trSEJCYzhoNkNDa0pHLzVtUXo2VEhNTythTkk2dWNRZDJpd1hOQVVTajlxOVM4ZVNsSm1CeWxIcnREa3dJUGNRMm1qR2FWQStFRzYySmlEUU56b29FRHl3Ym9tRlk4Z1NmN2JUR2U0V1JEdzhLMHovbkFlTjZ5UkRXaDVSQjNiY0JNd3R2SEl2MTB6Wnc2Qng0bWNFVStIZ0RGaCtrc2FYWHJ4TU1UWmJVZWw2cVJCa2hrcGJ2Q3puK2tnV1VKQW1URWJFbVI4M1JwTE4vU0hrSFZRS1VYTzRKMC9nNlBPamp5eFNiTjhLZjVFSW95c3RNVll1WWpaU2YvQnMxSlo0eDRvdVp2SHZGZ1FlaHBRakE5QkM0Y3drazJEaE1ZbXdxQmtSMlJUSlJhZWhVN0dzc2FwOW9IT1l4bnhJVDgxbzBjTUk4Q2cxbFJRYXZFTVF0QmhqV1FrUTRaaEF4MVltV213d29udWFQMEVrMSt6NFVtQnpBTWRsdHBJN242SnlZajJqelFidVFka3V5b1UzSUQxR2xnQ2htaEhTOXJTWXFWSzJnam9oQjR5V1MyNVZsY3VYZjV0UWdUNzJ0b1dzcUd5UFVna2JldWpZOXd6dHdVWkpHOWR5MEhnWmpWMHVqbUdjcGZMM09ZZXcxTnpYS3B4QjhMU3VwRGpHK0hJcm5hM205MXZsQ09VMlpEdWRQOVIzYTZjTVRDNUNPOTRFVkxldmlVRnZlcGRyMEhhcTFlSGNDVzk0cDB1ZmYxMjMvaktseUQwUGEvbzhtdmM5bTVESGt0MGg0SVh6T0Q4eUtObmVDTXdjTnQ3SUw5YStNSVlYaENoSkp6YmVvUnl1Q255NzM5YjlXRVEvMUsxSXhaSVpreHNwY2lrbUNEbGFDT0x2NFhGRncra1F0bncxREd1WVZyU2hza20ycUNwamNsaHJXUElpemxGUHJLTkNmSXlRa0gxSUdQalN6bVhUT0ptY2FPSjlkZ0dhbEZNNVlHVUVxelpLQWMrUm5RUGN2QllnRDJsc2psVzAyVU41Ylk1eEloZE1qcjY5OXBvMUxqTEJ4R0hNclcwU3p6anNsaGFVaFF2L1Z3UWRvQTBSY0NnNkpRSkhSdE5LYk5GSHYxTVFBQUFJZjRWVFdGa1pTQjNhWFJvSUZOamNtVmxibFJ2UjJsbUFEcz0iID4gICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iemhtX2NvbnRlbnQiPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InpobV9tb25leSIgc3R5bGU9J21hcmdpbi10b3A6N3B4Oyc+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InpobV9hbW91bnRfbW9uZXkiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iemhtX21vbmV5X3NpZ24iIHN0eWxlPSdtYXJnaW4tdG9wOi0xMHB4Oyc+wqU8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InpobV9tb25leV9udW0iPiR7aXRlbS5kaXNjb3VudH08L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InpobV9jb25kaXRpb24iPua7oSR7aXRlbS5xdW90YX3lhYPlj6/nlKg8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ6aG1fdGltZSIgc3R5bGU9J21hcmdpbi10b3A6MTBweDsnPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ6aG1fdGVybSI+5pyJ5pWI5pyfPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InpobV9kYXRlIj4ke2l0ZW0uZW5kVGltZX08L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iemhtX2NpcmNsZSIgc3R5bGU9InJpZ2h0OjQ0cHg7Ij48L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iemhtX2xpbmtfY291cG9uIiBzdHlsZT0icGFkZGluZzowcHggMTZweCAwcHggMTZweDsiPgogICAgICAgICAgICAgICAgPGEgY2xhc3M9InpobV9nZXRfbGlua190ZXh0IiBzdHlsZT0ibGV0dGVyLXNwYWNpbmc6IDEwcHg7Zm9udC1zaXplOjE2cHg7bWFyZ2luLXRvcDoxMHB4OyIgaHJlZj0iJHtpdGVtLmNvdXBvbl9saW5rfSIgdGFyZ2V0PSdfYmxhbmsnIHJlbD0nbm9vcGVuZXIgbm9yZWZlcnJlciBub2ZvbGxvdycgc3R5bGU9Im1hcmdpbi1sZWZ0OjE2cHg7d2lkdGg6MzRweDsiPumihuWPljwvYT4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgICAgYAogICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd6aG1fZGl2X3MnKS5pbm5lckhUTUwgPSBodG1sOwoKICAgICAgICAgICAgICAgICAgICB9KQoKCgogICAgICAgICAgICAgICAgfSxjb3Vwb25XYWl0VGltZSkKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZ2V0Q291cG9uSW5mbyhub2RlLGNsYXNzTmFtZSxnb29kc1RpdGxlLHNob3BOYW1lKXsKCiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpPT57CgogICAgICAgICAgICAgICAgICAgIGxldCBnb29kc19pZCA9IHRoaXMuZ2V0UXVlcnlTdHJpbmcoJ2lkJyk7CgogICAgICAgICAgICAgICAgICAgIGlmKCFnb29kc19pZCl7Y29uc29sZS5sb2coJ2dvb2RzX2lkJyk7cmV0dXJufTsKCiAgICAgICAgICAgICAgICAgICAgaWYoY2xhc3NOYW1lID09ICd6aG1fdGFiX3Rhb2JhbycpewoKICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5xdWVyeVNlbGVjdG9yKCdkaXY6bnRoLW9mLXR5cGUoMSknKS5iZWZvcmUodGhpcy5kaXZFbGVtZW50KTsKCiAgICAgICAgICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuYmVmb3JlKHRoaXMuZGl2RWxlbWVudCk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBsZXQgdXJsID0gYGh0dHBzOi8vYXBpLnR5cGVjaHJvbWUuY29tL2dldGNvdXBvbi5waHA/Z29vZHNfaWQ9JHtnb29kc19pZH0mZ29vZHNfdGl0bGU9JHtlbmNvZGVVUklDb21wb25lbnQoZ29vZHNUaXRsZSl9JnNob3BfbmFtZT0ke2VuY29kZVVSSUNvbXBvbmVudChzaG9wTmFtZSl9YDsKCiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXF1ZXN0KCdnZXQnLHVybCkudGhlbigocmVzdWx0KT0+ewoKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3A9IEpTT04ucGFyc2UocmVzdWx0KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJlc3AuY29kZT09MjAwKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaHRtbCA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYAogICAgICAgIDxkaXYgY2xhc3M9InpobV9jb3Vwb24iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJ6aG1fbGVmdCI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ6aG1faW1nX2ljb24iPgogICAgICAgIDxpbWcgc3JjPSJkYXRhOmltYWdlL2dpZjtiYXNlNjQsUjBsR09EbGhaQUJrQUhqL0FDSC9DMDVGVkZORFFWQkZNaTR3QXdFQUFBQWgrUVFKTEFIL0FDd0FBQUFBWkFCa0FLZjZCRG42QkRuNkJEbjZCRG42QkRuNkJEbjZCRG42QkRuNkJEbjZCRG42QkRyNkJUcjZCVHI2QlRyNkJUcjZCVHI2QlRyNkJqcjZCanI2Qmp2NkJqdjZCanY2Qmp2NkJ6djZCenY2Q0R6NkNEejZDVDM2Q1QzNkNUMzZDajc2Q3o3NkN6LzZDei82REQvNkRFRDZEVUQ2RFVENkRrSDZEa0g2RGtINkQwTDZFRUw2RVVQNkVVVDZFa1Q3RTBYN0ZFWDdGRWI3RkViN0ZVYjdGVWY3RlVmN0ZrZjdGa2Y3RjBqN0YwajdGMGo3RjBqN0dFajdHRW43R1VyN0drdjdHMHY3SEV6N0hVMzdIMC83SVZEN0kxSDdKRkw3SmxUN0oxVDdLRmI3S1ZiN0tsZjdLMWo3TGxyN01GejdNbDM3TkYvOE5tRDhPR0w4T21UOFBHWDhQMmY4UVduOFEycjhSR3Y4Um0zOFJtMzhSMjc4U0cvOFNYRDhTbkQ4VEhMOFRuUDhUM1Q4VUhYOFVuZjhWSGo4VjN2OFczNzhZSUw4WklYOGFvbjhiNDM4Y1kvN2NJNzZiWXY0YTRuMWFZZnVaNFRqWkgvVVpIekhabnU4YVhxdGJIcWliM3FXYzNxSWQzdUFlSHA1ZVhsNmVucDdlM3Q4Zkh4OWZYMStmbjUvZjMrQWdJQ0JnWUdDZ29LRGc0T0VoSVNGaFlXR2hvYUhoNGVJaUlpSmlZbUtpb3FMaTR1TWpJeU5qWTJPam82UGo0K1FrSkNSa1pHU2twS1RrNU9VbEpTVmxaV1dscGFYbDVlWW1KaVptWm1hbXBxYm01dWNuSnlkbloyZW5wNmZuNStnb0tDaG9hR2lvcUtqbzZPa3BLU2xwYVdycHFlMnFLdkFxYTdKcXJIUXE3UFhyTFhkckxmaXJiam9yTG51cXJueXFMajFwN2ozcGJmNXBMYjZvcmI3b3JYOG9iWDhvTFQ5b0xUOW9MVDlvYlg5b3JiOW83ZjlwYmo5cHJuOXA3bjlxTHI5cUx2OXFidjlxYnY5cXJ6OXFyejlxcno5cTd6OXE3MzlxNzM5cmI3OXJyLzlzTUg4c3NMOHRNVDh0c1g4dU1mN3VzbjZ2Y3I2d016NXdzNzR3OC80eGREM3g5SDN5TkwyeXRUMXk5WDB6ZGJ6ME5meTB0bngxTnJ4MU52eDFkdngxdHp4MTkzdzJOM3gyZC93MjkvdjNPSHYzdUx2NE9QdjR1WHU1ZWZ1NStudTZ1dnQ3ZTN1N3U3djcrL3c4UER4OGZIeTh2THo4L1AwOVBUMTlmWDI5dmI0K1BqNStmbjcrL3Y4L1B6OS9mMysvdjcrL3Y3Ky92NHl6VElJL2dEL0NSeElzS0RCZ3dnVEtseklzS0hEaHhBWnFsdlNKS0xGaXhnei9pdEQ1TVFKSTJvMGloeEpNZ2tIQndvOFBDSEpzdVZEWWtJY3lKUlF4Si9MbXpnTDRvbzVrNGpObkVCZDRob2kwNEVFbjBHVEdqUUhSVW1TTHc2SEZqMzZrMkdYSlVtZ1ZGVUtzVWtLQ2hoNmpHa290ZWZXaEdKOGFLQ1F3Z25YaUdWNkZNVlFrMkZabzBnWCtqdWlRYWFDSHJqZVBxVGlvcWlERkZjWWJpTXFrd0tTaGxaV0tKQlpJRWRJd1EyM0VhRlFsSUlRWnd5anFLQkFRY1VVdTBJNE54NXlGblBDS2lzTWc0akNzQnNVSWtXa05JUlN3ckNLTGE0ZCtqT0N3WENQeXl6Ui9EQ000VWp3aDF3S0Z4MVJ4ZVdZRmdXS3dpanovS0dTa3c0Sy9zQXc0NUlNak93cEszWjNTQ2JJMmhUcVcvcGJVb0tDaHlISTF6TXNVMlNJVnB5L05ERkVFbW5vaHhNdVZFQ1JSUlpZWENFRUZyNFk2Sm9hVWhqaHd3d3NlQUJDQ1NXSW9JRUxMZ2lSeEJTOFNBaVVQMU1RTWNNSUdraGcySXNPVUtCQkNUd2tFWWFKQlpIVDJrTlNDSkZDY1RBR2FSZ0hMUmdoUmtiK3hKT2NFalBZd0VSZ0VIVXh4RmRDVnZraUJpNHNrVjlEYUN5Umd3MUxRS25SRWlESUJNSVBWT3hva0Q5UTJBQmtrQkp3QmxhTUxnckpnUStKTldUTkV6eDRJSk1JOFdHa25HRVVuRUNFRnd1cGNVUnZRYzdZUWc5R25GQ0NDakFnMFFNTUovUUZJd1V0UEtIbVFGVUVNY0tMT2NDajBhQlh1cUFiUW1jUTRlZUwvaFNNME1NUlUydzVrQnBVR0pIRENLb1pkc0lTbnpiQlFxOUY4ZkNwUTB5VUNlTnhCNTBoaEthR2xTQkVGTXBFQlVVUWpCb213aEhtSEZSR0RrR2VRSnRJYWlUUndwdG1qa3NRR3MrK3FFRU9VaHlMa0Q5UjhBQ3RUQjhBYTVBWEttUlhsQVl3T0tFTlMxb01jWUpxQ3JoQVJrSGdIQUZlVVNJVWNZWkdaaGlSclV6aUd2VHRaREdxWU1SWU4wa0J4QWtnc0xCU1FVMk02bXNUOGpia2oxY3Z1b0JvUVU2b0FNSUpRbFFIVkRCVVBNR0ZRVjNBOEdJS1VMajBSR3lkQWJIbE9sVTRrV1ozdHd5QnJnaHUzZFRFQ1VNeWdTTkJ2Qm1tZ1JFdEM2U0dyUWtwOGFwTUxjeU1veHBCdlBnRDJRYVJRVVFPT1J3QmQwRnFwRGFYL2hGYi94UEZ4U2Zvdk5BeVJHaFFRRXBKT0pSRkMwVXB3TUtSSnBLeldXZDVMVFNHQy81V2RuZEJmUDJydFlsZHVNQ3hBeXAwNGRBWUxHUytuVU5lU0NjVEQ1c0w1c1RaRXJCMk9uYVV5Y0NkeThSTkovaDYvZ3pScXdmcU1uUmQ1aktRNTFBVldNdUV3UklTZnR1NEM3czNkSHp1eWpkMEJnK0crWkNPZ1dHd01Eb1EzOStPZlBZTStUTjVlRE93WWVBVDJUb0cwZlhoSmQvVnd5Tm9nWk1aVGluaHYxTkpRSjlBblBBd0Ruek9mTmlEQ1B5bWt3V0RmQ0VKLy9OZkVwb1FPN0VSZ1FPa3lTQUZPSUNmZ2tBQldpWFEzMFBvVndEN1BRUU1xWk9KQVFzeUJ2ZG9rRFFnTUVJMkdKS0VFb3l1S0FXZ0RzcEFDSlVSNHE1Ky9nSmNDQmwrS0FFZ2VQQnNML0pBRHhoaWczdkpabFVEV2NLYlN0QkRCQUlSSWtQMFZ4RUw4b1NId1lvRERBa0R1QlJBeGpJcW9BVWdHOGdUUUtnMjYvMndoRUZVaUJkV29FVWpFb1FLTFRCakdSMlFneW9xUkFvL0FKRWdYWkNEazNFTldpQ0FvaHZQQjVGa0ZXV0ZCSGtaRHdZSkloOVE0U0ZxMkFJV05va0ZMWkROSkh1YjN4dkgweFZvalFBTEIxRURnempaQlRHNWhBb3A0QmdGaWlCS1JncG5mUTRRQVNyMUF3YlJGY1VHRlJ5SWVUSUh1NGVnUVM2NVE0T0IyT2Fybnpua0cwaDRsUWVnOTVBcXhMSW9Qd2hiVXBEd0pnMVEweUZtT0FJTVpvQUVWeklFQ2RCNm5vbWtjREhMUkdRYjVSdWhEYUlsUWdPZEFaa3kvbEVKVjVpQVJCK1ljejFMdUJjUDNPY3lLQmpCQ0lxMEhMZzh0N1hRZVMxeDZmTUtXRlJRdFBRWjRWN1U2MXZuaXBLQ1N5NEVET2Z4aXczaVdKQW9ORThtR2xCQzMvN3hoWGthaDZRRFFjSUhERE9DTmg0a0N6TjQwUXhncWhSL0VPTWdUbENXODRnZ0RZVkE0UVFjVTBBS3dLQVFOQVNCV0NDb2FFR0NvVTJNVkNNS1A3REJFQlpHRURWSXpUQWZDSlJCMkNBRURKQVJBME9vMXJ4QVNUbG1GTVFMUThnQkVPS1ZFeW9Jb1RjS3dJQVF6QmtHbHhZbGJRcnBnaEJVb0FJaFFBNGhVMUFCcWJoNnE3SXFnQUxTc29KTHZFQUVLdm1sQk1BcGlCUlNRQ2doSEVNaDZKREMweEppQmg4TTdUUUZDWisvT2xhRTZtbWtDamxBL2hkS1RwRFpTSnBOTmxMTnlCSzg2SUVERWtRTVAveFhEdzZMa1YwSUQwWWFLTUpQRFpLR3B4ckdCaFBMaUVNN3M5ZFVGZzVHR0NDQ1NPSnlRN1pJN0RWSVErazNMZUtQSXFETEJjUXRDQm1NTUpxWXpUQWp2TkNibWRERWtPOFl4Z1ZwakVoa1JnZEpoVmhCQ0NxTGtSQ3FpaEFwMkVBRUk4aUJFN3JSa0RKdzcxOHFKYTk1RGZPMmhrempDVGtRZ1FoNllGT01qRUVLVWdqbVFKb2dWQWZBUUprUjZVSWVJWmJRaFp3QnhLNTlUaHBNK3k4YnZQREdOdzdMdllEUWpKVSt4QWt6dFpLUVlTU0NGdnVZdEFzZHNwSWQ0TThqUHdTZFN4NHlCOFRxWklWVVFRVTNqUEtMenNqWUtpK0V1M1A1QUFqR1RPWXlsOWtEYnlwQS9nK0E0ZVdHbEhaOFRsaUNuT2RNWnpwREFaOEY0TUZ5MjZ5UU44K0VsZzdwQm1QQzA0TTk4eGtoZnNhTE51K2laa01mMmlDSnBrcFVCdDNvUjVQV0J4eVRORmtvWFdoTEk1ckdlSG1JTXpqdGFFOExwTFNHRVVJWXJvQ0ZCUzJJazV5OHdoWEUwRGJLNk5uVWtBYTFBemhnNWw2WDJVTTR2RFd1Q1lKcUxRc3B6NlUyOVJrd2Jld2dLY0FHYmgzMlFIYlM3Q0I1aHNCT2hrSUw2bFJ0QjJqQUJ2V1V0a0JROUlQaHpVQUNHRWkzdXRNdGdSelFEZ2d4RnZjQW9jV0IzQm9rb0VYeGdMM2xMWkMvR1NZSDBUWElHUHlxVkQveVd5RDNaTTRRQ2xTUU1wVFZNRUNJOXNFSndnUXZhb0FIVG5DZlA4N1FoTmlDZGQ4VGp3dU1TVURnQWc5NHdBVkJub3JTSm42UUtZUlh5UzZvTGN0UmRsSWhxOERJTS8vSHkxcEFnU3d6QndiRnk3bEJyREFsMlhwYkJVTmdxdEFWNGc4cUZLSG1MVGpDTHBkTzlhb25KQ0FBSWZrRUNUSUEvd0FzQmdBQkFGZ0FZUUNuQUFBQUFRRUJBZ0lDQXdNREJBUUVCUVVGQmdZR0J3Y0hDQWdJQ1FrSkNnb0tDd3NMREF3TURRME5EZzRPRHc4UEVCQVFFUkVSRWhJU0V4TVRGQlFVRlJVVkZoWVdGeGNYR0JnWUdSa1pHaG9hR3hzYkhCd2NIUjBkSGg0ZUh4OGZJQ0FnSVNFaElpSWlJeU1qSkNRa0pTVWxKaVltSnljbktDZ29LU2twS2lvcUt5c3JMQ3dzTFMwdExpNHVMeTh2TURBd01URXhNakl5TXpNek5EUTBOVFUxTmpZMk56YzNPRGc0T1RrNU9qbzZPenM3UER3OFBUMDlQajQrUHo4L1FFQkFRVUZCUWtKQ1EwTkRSRVJFUlVWRlJrWkdSMGRIU0VoSVNVbEpTa3BLUzB0TFRFeE1UVTFOVGs1T1QwOVBVRkJRVVZGUlVsSlNVMU5UVkZSVVZWVlZWbFpXVjFkWFdGaFlXVmxaV2xwYVcxdGJYRnhjWFYxZFhsNWVYMTlmWUdCZ1lXRmhZbUppWTJOalpHUmtaV1ZsWm1abVoyZG5hR2hvYVdscGFtcHFhMnRyYkd4c2JXMXRibTV1YjI5dmNIQndjWEZ4Y25KeWMzTnpkSFIwZFhWMWRuWjJkM2QzZUhoNGVYbDVlbnA2ZTN0N2ZIeDhmWDE5Zm41K2YzOS9nSUNBZ1lHQmdvS0NnNE9EaElTRWhZV0Zob2FHaDRlSGlJaUlpWW1KaW9xS2k0dUxqSXlNalkyTmpvNk9qNCtQa0pDUWtaR1JrcEtTazVPVGxKU1VsWldWbHBhV2w1ZVhtSmlZbjUyVHFxU0t1SzErekxwcjNzVlk2Y3hON3M5SDhOQkY4TkJGOE5CRThOQkU4TkJFOE5CRThOQkU4TkJFOE5CRThOQkU4TkJFOE5CRThOQkU4TkZFOE5GRThORkU4TkZFOE5GRThORkY4TkZGOE5GRjhORkY4TkZGOE5GRjhORkY4TkZGOE5GRjhORkY4TkZHOGRGRzhkRkc4ZEZHOGRGSDhkRkg4ZEZIOGRGSThkRkk4ZEZKOGRKSjhkSko4ZEpLOGRKSzhkSkw4ZEpMOGRKTThkSk04ZE5OOGROTzhkTlA4ZE5QOGROUThkTlE4ZE5SOHRSUzh0UlM4dFJUOHRSVjh0Vlc4dFZZOHRaWjh0WmI4dGRlODlkZzg5aGk4OWhqODloajg5aGs4OWxtODlsbzlOcHE5TnByOU5wczlOdHQ5TnR3OU54eTlOeHo5TjExOU4xMjlOMTM5TjE1OWQ1NzlkOSs5ZCtBOWVDRDllR0c5dUtLOXVPTjl1T1E5K1dYK09paytPdXUrZTI0K3UvQyt2SEordkhJTXMweUNQNEEvd2tjU0xDZ3dZTUlEZllMTnk2aHc0Y1FJMHFjV0kvYk1tZmQ4azNjeUxIalJtL0hjdVU2VnM2anlaTW4rVzBUS2JKYlA1UXdZejdjeDQxbExtNHZaZXJjK1krbVRaYzhneExzWis3YnQzZ1NmYkxFS1JIZU4yL2xjZ3AxT001WkwyRFo1a1ZVS3BJcFJIblpnUFZ5Vm5KcVFuclpXUFlDT3JQbVVxa0orM2tEeGpLYlByTUkxVVd6NmF3ZHhINXVjL1h5RnBIZE01YXhybW5FcTVCYkw3WGI0Q0kwWjNWc09vajZ0ajBXMmNzcjQ0THFEck5NaHU1dk9XN2RTa01zcDR3dnZNOEgrM1dqVzNleFRueHBXUUxyQmhzaFBHczJrNm5qT2U5WkxKYlc2UFZHK0Mxa3JsakplZEt6ZG54a3crVUg2V2tUTnZiNnpuN2ZsUDcxT3NiTk52YUM5THB4aXlxVTN6aHUzL0NkaDdsUEhUcDQ3dHExNCthTzMzeTgrS0RUVFRiV1BITk1Nc29vazR3dzBWaXp6VGZwK1BkZlRQMmswNDAxeXRCbTA0YmpMWlBOTi9MTTE0OWtHNkd6alZVYnBxamlNZEYwRTZKSkkwcDB6emZXV0RQT1hSdkJ3dzJLS3ZhWW9qRFdoR05lUlBqUWFNMDMrMEFVVGpJaUhaT05PaVRHVm80MUdxcjRXQzlYK2poU051eEkxRTg1MXppWGpIY0kzWk1iU3hpOTVsQSszclNtb2pES1JKTk5OODQ0ODR3MTNoQzRUSlZxUmNPZVErdHN3NlJOMTBRNWtKa3A5bUtOYWdmWnc0MXpOdldpVERiZW9DUGZRZm1vMDgwMXlXekdWemlHL2pQT001N1dGYXBBUzZxWXpaQUMyYk9OTVA0cEtyTU5PaEppWnM0Mnk2U1lqRGRSVHFlaU0rWkFsTTgzMFpTYWkzQUczY01OckRZQmN3MDZweUxVRHpyWE1NdlNNZCtRQ0k4ejFZa0VqRFYvUXFRamo3bEVOeFJJR3liVGpUMG8xZE9ObTJnR2l4NXduR0drRlVmb1pMUE1NYytVUmRBNDhJcmt6RGpSUnRSUFZSdGFvK2Evemh5enpEWmRtc1NQT3VRc1BOQnZHd0xMVXptaWNiYk5rUDJzTXc2VVUrbmpXSEJrNm9Ud3RlSE1aMDdBd3JBRkVUNnNTdHVjVGRFZ3RSdysybXlZemFVUHpjUE5OZGQ0VTdOQitHaW1GbS9Mb1JPd004TkI1TSt5VFg0amtUdDdzZlRNaTU4QjV1bGFCZjh6RDNVaUpRYjBRM1BwMWpKczhHUXRzTVVPeVdNY2NzcEZoREZMaXNGR0R2NmtONFg5anp6UmRHdnVYOTE0bWt6RWVIbDlMYU5mQlU3M1JPbzRvNXZWak5WRHIwalcxRE1SNElMWEhWRTkxOWlVamQ4bXlTMDY2WncvN3VYSnoxbHp0bENzcVVYWTVuTmo3bmxFNDBDYUROeWZHK1c3Nyt3V3RQZTFLVDhrZCtjYnhTNVNNbjRWRk0vdnZwT2pFVDZQWW1uOWVPVVZWQTZreXZBZXQrTzJieFJQeDhlSVU5QThyMTZQNVRHOGh0ZWpNdXNVTkk2MTNXODBEL2psM2c0UlBSM25zbzMyZkxQSk1iUmhEV3R0NkJpTSs4YzNOS1FNblVua2ZzaWJDQVJab2cwQTltZzg4YmpjaHFKeHI0R1VnMzdlUzhnRXd6Y1JlUFN2Z2dUUlM0K3NnWlI4MWVpRjFyaUd2enlvdTh0SUVIK0RpNGc0QmpVUzh3MWxIUDdYc0VhRG90R2dKdzBrSC9uUlR6dmM4VHFCM0l3enM1Tkk2a2dva2ZtTnhoMEh3VWNTOVFPUEpIVWtIWkxqRE5NZVdMdjhUVVJ4eXd1aFR1TGh0bkxoS0NKanEwNHNWalVSUkNHbmlUekp4MHJRcEVhRm9Hc2tsSlBJT3NJb2t0RjlKbTNlQ3VUbnZGRWpiN3d4SW9qTUJURFd4aGluRVFxUERvbVIvVFM0akQ3cXhCNW5Hc2tNelNJT3Z0bWxOOTh3NE0rOFpBNXZwRWFDR2hTR0Q5bldSbUVvTWk1VndaSXpFaWl0MmRna2g0ZXNFdFFna2tIQkJjOGg2Q0NrSkcvNW1RejZUSE1PK2FOSTZ1Y1FkMml3WE5BVVNqOXE5UzhlU2xKbUJ5bEhydERrd0lQY1EybWpHYVZBK0VHNjJKaURRTnpvb0VEeXdib21GWThnU2Y3YlRHZTRXUkR3OEswei9uQWVONnlSRFdoNVJCM2JjQk13dHZISXYxMHpadzZCeDRtY0VVK0hnREZoK2tzYVhYcnhNTVRaYlVlbDZxUkJraGtwYnZDem4ra2dXVUpBbVRFYkVtUjgzUnBMTi9TSGtIVlFLVVhPNEowL2c2UE9qanl4U2JOOEtmNUVJb3lzdE1WWXVZalpTZi9CczFKWjR4NG91WnZIdkZnUWVocFFqQTlCQzRjd2trMkRoTVltd3FCa1IyUlRKUmFlaFU3R3NzYXA5b0hPWXhueElUODFvMGNNSThDZzFsUlFhdkVNUXRCaGpXUWtRNFpoQXgxWW1XbXd3b251YVAwRWsxK3o0VW1CekFNZGx0cEk3bjZKeVlqMmp6UWJ1UWRrdXlvVTNJRDFHbGdDaG1oSFM5clNZcVZLMmdqb2hCNHlXUzI1VmxjdVhmNXRRZ1Q3MnRvV3NxR3lQVWdrYmV1alk5d3p0d1VaSkc5ZHkwSGdaalYwdWptR2NwZkwzT1lldzFOelhLcHhCOExTdXBEakcrSElybmEzbTkxdmxDT1UyWkR1ZFA5UjNhNmNNVEM1Q085NEVWTGV2aVVGdmVwZHIwSGFxMWVIY0NXOTRwMHVmZjEyMy9qS2x5RDBQYS9vOG12YzltNURIa3QwaDRJWHpPRDh5S05uZUNNd2NOdDdJTDlhK01JWVhoQ2hKSnpiZW9SeXVDbnk3MzliOVdFUS8xSzFJeFpJWmt4c3BjaWttQ0RsYUNPTHY0WEZGdytrUXRudzFER3VZVnJTaHNrbTJxQ3BqY2xocldQSWl6bEZQcktOQ2ZJeVFrSDFJR1BqU3ptWFRPSm1jYU9KOWRnR2FsRk01WUdVRXF6WktBYytSblFQY3ZCWWdEMmxzamxXMDJVTjViWTV4SWhkTWpyNjk5cG8xTGpMQnhHSE1yVzBTenpqc2xoYVVoUXYvVndRZG9BMFJjQ2c2SlFKSFJ0TktiTkZIdjFNUUFBQUlmNFZUV0ZrWlNCM2FYUm9JRk5qY21WbGJsUnZSMmxtQURzPSIgPiAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ6aG1fY29udGVudCI+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iemhtX21vbmV5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iemhtX2Ftb3VudF9tb25leSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ6aG1fbW9uZXlfc2lnbiI+wqU8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InpobV9tb25leV9udW0iPiR7cmVzcC5kYXRhLnlvdWh1aXF1YW59PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ6aG1fY29uZGl0aW9uIj4ke3Jlc3AuZGF0YS5jb3Vwb25faW5mb308L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ6aG1fdGltZSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InpobV90ZXJtIj7mnInmlYjmnJ88L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iemhtX2RhdGUiPiR7cmVzcC5kYXRhLmNvdXBvbl9lbmRfdGltZX08L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iemhtX2NpcmNsZSI+PC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InpobV9saW5rX2NvdXBvbiIgc3R5bGU9Im1hcmdpbi1yaWdodDoiPgogICAgICAgICAgICA8YSBjbGFzcz0iemhtX2dldF9saW5rX3RleHQiIG9uY2xpY2s9IndpbmRvdy5vcGVuKCdodHRwczovL2FwaS50eXBlY2hyb21lLmNvbS9jb2RlLnBocD9saW5rPSR7cmVzcC5kYXRhLmNvZGVfdXJsfScpIj7ngrnlh7vpooblj5Y8L2E+CiAgICAgICAgICAgIDxkaXYgaWQ9InRicXJjb2RlIiBjbGFzcz0iemhtX3FyY29kZSI+PC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgIGA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnemhtX2Rpdl9zJykuaW5uZXJIVE1MPWh0bWw7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHFyY29kZSA9IG5ldyBRUkNvZGUoInRicXJjb2RlIiwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiA2NywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IDY3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yRGFyayA6ICIjMTIxMjEyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvckxpZ2h0IDogIiNmZmZmZmYiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlY3RMZXZlbCA6IFFSQ29kZS5Db3JyZWN0TGV2ZWwuTQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcXJjb2RlLm1ha2VDb2RlKHJlc3AuZGF0YS5jb2RlX3VybCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLkFjdGlvbnMtLXJvb3QtLWh3RXVqZ2MnKSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5BY3Rpb25zLS1yb290LS1od0V1amdjJykuc3R5bGU9InBvc2l0aW9uOnVuc2V0IjsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKCiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgfSkKCiAgICAgICAgICAgICAgICB9LGNvdXBvbldhaXRUaW1lKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZ2V0VGl0bGVTaG9wKHRpdGxlLHNob3ApewoKICAgICAgICAgICAgICAgIGFzeW5jIGZ1bmN0aW9uIHJlc3AoKXsKCiAgICAgICAgICAgICAgICAgICAgbGV0IGdvb2RzVGl0bGVEb20gPSBhd2FpdCBCYXNlQ2xhc3MuZ2V0RWxlbWVudCh0aXRsZSk7CgogICAgICAgICAgICAgICAgICAgIGxldCBzaG9wTmFtZURvbSA9IGF3YWl0IEJhc2VDbGFzcy5nZXRFbGVtZW50KHNob3ApOwoKICAgICAgICAgICAgICAgICAgICBsZXQgZ29vZHNUaXRsZT1nb29kc1RpdGxlRG9tP2dvb2RzVGl0bGVEb20uaW5uZXJUZXh0OicnOwoKICAgICAgICAgICAgICAgICAgICBsZXQgc2hvcE5hbWUgPSBzaG9wTmFtZURvbT9zaG9wTmFtZURvbS5pbm5lclRleHQ6Jyc7CgogICAgICAgICAgICAgICAgICAgIHZhciBkYXRhID0ge307CgogICAgICAgICAgICAgICAgICAgIGRhdGEuZ29vZHNUaXRsZSA9IGdvb2RzVGl0bGU7CgogICAgICAgICAgICAgICAgICAgIGRhdGEuc2hvcE5hbWUgPSBzaG9wTmFtZTsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRhdGE7CgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiByZXNwKCk7CgogICAgICAgICAgICB9CgogICAgICAgIH0KCiAgICAgICAgY2xhc3MgUGxheVZpZGVvQ2xhc3MgZXh0ZW5kcyBCYXNlQ2xhc3N7CiAgICAgICAgICAgIGNvbnN0cnVjdG9yKCl7CiAgICAgICAgICAgICAgICBzdXBlcigpOwogICAgICAgICAgICB9CgogICAgICAgIH0KCiAgICAgICAgY2xhc3MgUGxheU11c2ljQ2xhc3MgZXh0ZW5kcyBCYXNlQ2xhc3N7CiAgICAgICAgICAgIGNvbnN0cnVjdG9yKCl7CiAgICAgICAgICAgICAgICBzdXBlcigpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB4bWx5Q3JlYXRlQ2hlY2tib3goKXsKCiAgICAgICAgICAgICAgICBsZXQgc291bmRMaXN0bGkgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc291bmQtbGlzdCB1bCBsaScpOwoKICAgICAgICAgICAgICAgIHNvdW5kTGlzdGxpLmZvckVhY2goZnVuY3Rpb24oaXRlbSl7CgogICAgICAgICAgICAgICAgICAgIGxldCBjaGVja2JveGVkID0gaXRlbS5xdWVyeVNlbGVjdG9yKCdpbnB1dCcpOwoKICAgICAgICAgICAgICAgICAgICBpZihjaGVja2JveGVkKXsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgbGV0IHRpdGxlID0gaXRlbS5xdWVyeVNlbGVjdG9yKCcudGV4dCcpOwoKICAgICAgICAgICAgICAgICAgICBpZighdGl0bGUpewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgdGl0bGUuc3R5bGUgPSAid2lkdGg6MzYwcHgiOwoKICAgICAgICAgICAgICAgICAgICBsZXQgc3JjID0gdGl0bGUucXVlcnlTZWxlY3RvcignYScpLmdldEF0dHJpYnV0ZSgnaHJlZicpOwoKICAgICAgICAgICAgICAgICAgICBsZXQgZmlyc3REb20gPSBpdGVtLnF1ZXJ5U2VsZWN0b3IoJy5pY29uLXdyYXBwZXInKTsKCiAgICAgICAgICAgICAgICAgICAgbGV0IGlucHV0RG9tID0gZmlyc3REb20uY2xvbmVOb2RlKHRydWUpOwoKICAgICAgICAgICAgICAgICAgICBpbnB1dERvbS5zdHlsZT0gJ21pbi13aWR0aDogMHB4Oyc7CgogICAgICAgICAgICAgICAgICAgIGlucHV0RG9tLmlubmVySFRNTCA9ICI8aW5wdXQgdHlwZT0nY2hlY2tib3gnIG5hbWU9J3pobUNoZWNrYm94JyB2YWx1ZT0iK3NyYysiICBjbGFzcz0nemhtQ2hlY2tib3gnPiI7CgogICAgICAgICAgICAgICAgICAgIGZpcnN0RG9tLmJlZm9yZShpbnB1dERvbSk7CgogICAgICAgICAgICAgICAgfSkKCiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGNsYXNzIFpoQ2xhc3MgZXh0ZW5kcyBCYXNlQ2xhc3N7CgogICAgICAgICAgICBjb25zdHJ1Y3RvcigpewogICAgICAgICAgICAgICAgc3VwZXIoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzaG93U3BlY2lhbENvbHVtbigpewoKICAgICAgICAgICAgICAgIGlmKGxvY2F0aW9uLmhyZWYgPT0gJ2h0dHBzOi8vd3d3LnpoaWh1LmNvbS8nKXsKCiAgICAgICAgICAgICAgICAgICAgbGV0IGNhcmRSZWNvbW1lbmQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuRmVlZCcpOwoKICAgICAgICAgICAgICAgICAgICBpZihjYXJkUmVjb21tZW5kLmxlbmd0aCA+MCl7CgogICAgICAgICAgICAgICAgICAgICAgICBjYXJkUmVjb21tZW5kLmZvckVhY2goZnVuY3Rpb24oaXRlbSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoaXRlbS5xdWVyeVNlbGVjdG9yKCcuc3BlY2lhbENvbHVtbicpKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGFab3AgPSBKU09OLnBhcnNlKGl0ZW0uZ2V0QXR0cmlidXRlKCdkYXRhLXphLWV4dHJhLW1vZHVsZScpKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighZGF0YVpvcClyZXR1cm47CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHR5cGUgPSBkYXRhWm9wLmNhcmQuY29udGVudC50eXBlOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHR5cGUgPT0gJ1Bvc3QnKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRpdGxlID0gaXRlbS5xdWVyeVNlbGVjdG9yKCdkaXY+ZGl2PmgyPnNwYW4+YScpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighdGl0bGUpcmV0dXJuOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbmV3RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdFbGVtZW50LmNsYXNzTmFtZSA9ICdzcGVjaWFsQ29sdW1uIEJ1dHRvbiBWb3RlQnV0dG9uIFZvdGVCdXR0b24tLXVwJzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RWxlbWVudC5zdHlsZSA9ICdsaW5lLWhlaWdodDoyMHB4O3BhZGRpbmc6MHB4IDVweDttYXJnaW4tcmlnaHQ6NXB4O2JvcmRlci1yYWRpdXM6MnB4Oyc7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0VsZW1lbnQuaW5uZXJUZXh0ID0gJ+aWh+eroCc7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlLmJlZm9yZShuZXdFbGVtZW50KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZihsb2NhdGlvbi5ocmVmLm1hdGNoKC9odHRwcz86XC9cL3d3dy56aGlodS5jb21cL3NlYXJjaC8pKXsKICAgICAgICAgICAgICAgICAgICBsZXQgbj0wOwoKICAgICAgICAgICAgICAgICAgICBsZXQgdGltZXI9IHNldEludGVydmFsKGZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgICAgICAgICBsZXQgY2FyZFNlYXJjaCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5TZWFyY2hSZXN1bHQtQ2FyZCcpOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYobisrPjYwMCl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhckludGVydmFsKHRpbWVyKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgaWYoY2FyZFNlYXJjaC5sZW5ndGggPjApewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGltZXIpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcmRTZWFyY2guZm9yRWFjaChmdW5jdGlvbihpdGVtKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoaXRlbS5xdWVyeVNlbGVjdG9yKCcuc3BlY2lhbENvbHVtbicpKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGFab3AgPSBKU09OLnBhcnNlKGl0ZW0uZ2V0QXR0cmlidXRlKCdkYXRhLXphLWV4dHJhLW1vZHVsZScpKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWRhdGFab3ApcmV0dXJuOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdHlwZSA9IGRhdGFab3AuY2FyZC5jb250ZW50LnR5cGU7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHR5cGUgPT0gJ1Bvc3QnKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0aXRsZSA9IGl0ZW0ucXVlcnlTZWxlY3RvcignZGl2PmRpdj5oMj5zcGFuPmRpdj5hJyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighdGl0bGUpcmV0dXJuOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5ld0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0VsZW1lbnQuY2xhc3NOYW1lID0gJ3NwZWNpYWxDb2x1bW4gQnV0dG9uIFZvdGVCdXR0b24gVm90ZUJ1dHRvbi0tdXAnOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RWxlbWVudC5zdHlsZSA9ICdsaW5lLWhlaWdodDoyMHB4O3BhZGRpbmc6MHB4IDVweDttYXJnaW4tcmlnaHQ6NXB4Oyc7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdFbGVtZW50LmlubmVyVGV4dCA9ICfmlofnq6AnOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUuYmVmb3JlKG5ld0VsZW1lbnQpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgICAgICAgICB9CgoKICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBzaG93VmlkZW9UaXRsZSgpewoKICAgICAgICAgICAgICAgIGlmKGxvY2F0aW9uLmhyZWYgPT0gJ2h0dHBzOi8vd3d3LnpoaWh1LmNvbS8nKXsKCiAgICAgICAgICAgICAgICAgICAgbGV0IGNhcmRSZWNvbW1lbmQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuRmVlZCcpOwoKICAgICAgICAgICAgICAgICAgICBpZihjYXJkUmVjb21tZW5kLmxlbmd0aCA+MCl7CgogICAgICAgICAgICAgICAgICAgICAgICBjYXJkUmVjb21tZW5kLmZvckVhY2goZnVuY3Rpb24oaXRlbSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoaXRlbS5xdWVyeVNlbGVjdG9yKCcudmlkZW9UaXRsZScpKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGFab3AgPSBKU09OLnBhcnNlKGl0ZW0uZ2V0QXR0cmlidXRlKCdkYXRhLXphLWV4dHJhLW1vZHVsZScpKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighZGF0YVpvcClyZXR1cm47CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGhhc1ZpZGVvID0gZGF0YVpvcC5jYXJkLmhhc192aWRlbzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihoYXNWaWRlbyA9PSB0cnVlKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRpdGxlOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihpdGVtLnF1ZXJ5U2VsZWN0b3IoJ2Rpdj5kaXY+aDI+ZGl2PmEnKSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZSA9IGl0ZW0ucXVlcnlTZWxlY3RvcignZGl2PmRpdj5oMj5kaXY+YScpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZihpdGVtLnF1ZXJ5U2VsZWN0b3IoJ2Rpdj5kaXY+aDI+c3Bhbj5hJykpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSBpdGVtLnF1ZXJ5U2VsZWN0b3IoJ2Rpdj5kaXY+aDI+c3Bhbj5hJyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5ld0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RWxlbWVudC5jbGFzc05hbWUgPSAndmlkZW9UaXRsZSc7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0VsZW1lbnQuc3R5bGUgPSAnYmFja2dyb3VuZDogcmdiYSgyNTUsIDEzMSwgODYsIDAuMTIpO2NvbG9yOiByZ2IoMjU1LCA3MywgMTIpO2xpbmUtaGVpZ2h0OjIwcHg7cGFkZGluZzoxcHggNnB4O21hcmdpbi1yaWdodDo1cHg7Ym9yZGVyLXJhZGl1czoycHg7Zm9udC1zaXplOjE0cHg7JzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RWxlbWVudC5pbm5lclRleHQgPSAn6KeG6aKRJzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUuYmVmb3JlKG5ld0VsZW1lbnQpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmKGxvY2F0aW9uLmhyZWYubWF0Y2goL2h0dHBzPzpcL1wvd3d3LnpoaWh1LmNvbVwvc2VhcmNoLykpewoKICAgICAgICAgICAgICAgICAgICBsZXQgbj0wOwoKICAgICAgICAgICAgICAgICAgICBsZXQgdGltZXI9IHNldEludGVydmFsKGZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgICAgICAgICBsZXQgY2FyZFNlYXJjaCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5TZWFyY2hSZXN1bHQtQ2FyZCcpOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYobisrPjYwMCl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhckludGVydmFsKHRpbWVyKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgaWYoY2FyZFNlYXJjaC5sZW5ndGggPjApewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGltZXIpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcmRTZWFyY2guZm9yRWFjaChmdW5jdGlvbihpdGVtKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoaXRlbS5xdWVyeVNlbGVjdG9yKCcudmlkZW9UaXRsZScpKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGFab3AgPSBKU09OLnBhcnNlKGl0ZW0uZ2V0QXR0cmlidXRlKCdkYXRhLXphLWV4dHJhLW1vZHVsZScpKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWRhdGFab3ApcmV0dXJuOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdHlwZSA9IGRhdGFab3AuY2FyZC5jb250ZW50LnR5cGU7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHR5cGUgPT0gJ1p2aWRlbycgKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0aXRsZSA9IGl0ZW0ucXVlcnlTZWxlY3RvcignZGl2PmRpdj5oMj5zcGFuPmRpdj5hJyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighdGl0bGUpcmV0dXJuOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5ld0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0VsZW1lbnQuY2xhc3NOYW1lID0gJ3ZpZGVvVGl0bGUnOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RWxlbWVudC5zdHlsZSA9ICdiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMTMxLCA4NiwgMC4xMik7Y29sb3I6IHJnYigyNTUsIDczLCAxMik7bGluZS1oZWlnaHQ6MjBweDtwYWRkaW5nOjFweCA2cHg7bWFyZ2luLXJpZ2h0OjVweDtib3JkZXItcmFkaXVzOjJweDtmb250LXNpemU6MTRweDsnOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RWxlbWVudC5pbm5lclRleHQgPSAn6KeG6aKRJzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlLmJlZm9yZShuZXdFbGVtZW50KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICAgICAgfQoKCiAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9CiAgICAgICAgICAgIHJlbW92ZVZpZGVvKCl7CgogICAgICAgICAgICAgICAgbGV0IGNhcmQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuRmVlZCcpOwoKICAgICAgICAgICAgICAgIGNhcmQuZm9yRWFjaChmdW5jdGlvbihpdGVtKXsKCiAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGFab3AgPSBKU09OLnBhcnNlKGl0ZW0uZ2V0QXR0cmlidXRlKCdkYXRhLXphLWV4dHJhLW1vZHVsZScpKTsKCiAgICAgICAgICAgICAgICAgICAgbGV0IHZpZGVvID0gZGF0YVpvcC5jYXJkLmNvbnRlbnQudmlkZW9faWQ7CgogICAgICAgICAgICAgICAgICAgIGlmKHZpZGVvKXsKCiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0ucGFyZW50Tm9kZS5zdHlsZT0nZGlzcGxheTpub25lOyc7CgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pCgogICAgICAgICAgICB9CiAgICAgICAgICAgIHJlbW92ZUFEKCl7CgogICAgICAgICAgICAgICAgbGV0IHpoSGlkZUFEID0gYC5QYy1jYXJkLC5QYy13b3Jke2Rpc3BsYXk6bm9uZSAhaW1wb3J0YW50O30uVG9wc3RvcnlJdGVtLS1hZHZlcnRDYXJke2Rpc3BsYXk6bm9uZSAhaW1wb3J0YW50fWA7CgogICAgICAgICAgICAgICAgZG9tU3R5bGUgLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHpoSGlkZUFEKSk7CgogICAgICAgICAgICAgICAgZG9tSGVhZC5hcHBlbmRDaGlsZChkb21TdHlsZSk7CgogICAgICAgICAgICB9CiAgICAgICAgICAgIGRvd25sb2FkVmlkZW8oKXsKCiAgICAgICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGlmKGxvY2F0aW9uLmhyZWYubWF0Y2goL2h0dHBzOlwvXC93d3dcLnpoaWh1XC5jb21cL3p2aWRlb1wvLisvKSl7CgogICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy56aG1Eb3dubG9hZCcpKXJldHVybjsKCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2aWRlb0RvbSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ3ZpZGVvJyk7CgogICAgICAgICAgICAgICAgICAgICAgICBpZighZG9jdW1lbnQucXVlcnlTZWxlY3RvcigndmlkZW8nKSk7CgogICAgICAgICAgICAgICAgICAgICAgICBsZXQgYnV0dG9uID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLl9lMjk2cGcnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGJ1dHRvbi5sZW5ndGg8MilyZXR1cm47CgogICAgICAgICAgICAgICAgICAgICAgICBsZXQgZG93bmxvYWRCdXQgPSBidXR0b25bMV0uY2xvbmVOb2RlKHRydWUpOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWRvd25sb2FkQnV0LnF1ZXJ5U2VsZWN0b3IoJy5fMXRnOG9pcicpKXJldHVybjsKCiAgICAgICAgICAgICAgICAgICAgICAgIGRvd25sb2FkQnV0LnF1ZXJ5U2VsZWN0b3IoJy5fMXRnOG9pcicpLmlubmVyVGV4dD0n5LiL6L29JzsKCiAgICAgICAgICAgICAgICAgICAgICAgIGRvd25sb2FkQnV0LnNldEF0dHJpYnV0ZSgnaWQnLCdkb3dubG9hZFZpZGVvJyk7CgogICAgICAgICAgICAgICAgICAgICAgICBidXR0b25bMV0uYmVmb3JlKGRvd25sb2FkQnV0KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNkb3dubG9hZFZpZGVvJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZpZGVvSWQ7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLlpWaWRlby1wbGF5ZXInKSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB6VmlkZW8gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuWlZpZGVvJyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2aWRlb0RhdGEgPSBKU09OLnBhcnNlKHpWaWRlby5nZXRBdHRyaWJ1dGUoJ2RhdGEtemEtZXh0cmEtbW9kdWxlJykpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlb0lkID0gdmlkZW9EYXRhLmNhcmQuY29udGVudC52aWRlb19pZDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHZpZGVvVXJsID0gd2luZG93LmxvY2F0aW9uLmhyZWY7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2aWRlb09iaiA9IHZpZGVvVXJsLnNwbGl0KCc/Jyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvSWQgPSB2aWRlb09ialswXS5zcGxpdCgnLycpLnBvcCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCF2aWRlb0lkKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygn5pyq6I635Y+W6KeG6aKRaWQnKTtyZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgemhEb3dubG9hZCh2aWRlb0lkKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkKCiAgICAgICAgICAgICAgICAgICAgfSwyMDAwKTsKCiAgICAgICAgICAgICAgICB9ZWxzZXsKCiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NTm9kZUluc2VydGVkJywoZSkgPT4gewoKICAgICAgICAgICAgICAgICAgICBpZighZS5yZWxhdGVkTm9kZS5xdWVyeVNlbGVjdG9yKSByZXR1cm47CgogICAgICAgICAgICAgICAgICAgIHZhciBwbGF5QmFyID0gZS5yZWxhdGVkTm9kZS5xdWVyeVNlbGVjdG9yKCc6c2NvcGUgPiBkaXY6bGFzdC1jaGlsZCA+IGRpdjpmaXJzdC1jaGlsZCA+IGRpdjpudGgtb2YtdHlwZSgyKScpOwoKICAgICAgICAgICAgICAgICAgICBpZighcGxheUJhciB8fCBwbGF5QmFyLnF1ZXJ5U2VsZWN0b3IoJy56aG1Eb3dubG9hZCcpKSByZXR1cm47CgogICAgICAgICAgICAgICAgICAgIGlmKHBsYXlCYXIuY2xhc3NOYW1lICE9ICdjc3MtMTk5cXg3bScpcmV0dXJuOwoKICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgICAgICAgICBsZXQgcGxheUJ1dD0gcGxheUJhci5wYXJlbnROb2RlLnF1ZXJ5U2VsZWN0b3IoJy5fMWMxY3Z1ZycpOwoKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBsYXlCdXRMaSA9IHBsYXlCdXQucXVlcnlTZWxlY3RvcignOnNjb3BlID4gZGl2Omxhc3QtY2hpbGQgPiBkaXY6Zmlyc3QtY2hpbGQnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFwbGF5QnV0TGkpIHJldHVybjsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkb3dubG9hZEJ1dCA9IHBsYXlCdXRMaS5jbG9uZU5vZGUodHJ1ZSk7CgogICAgICAgICAgICAgICAgICAgICAgICBkb3dubG9hZEJ1dC5jbGFzc05hbWUgPSBwbGF5QnV0TGkuY2xhc3NOYW1lICsgJyB6aG1Eb3dubG9hZCc7CgogICAgICAgICAgICAgICAgICAgICAgICBpZighZG93bmxvYWRCdXQucXVlcnlTZWxlY3RvcignLl8xdGc4b2lyJykpIHJldHVybjsKCiAgICAgICAgICAgICAgICAgICAgICAgIGRvd25sb2FkQnV0LnF1ZXJ5U2VsZWN0b3IoJy5fMXRnOG9pcicpLmlubmVyVGV4dD0n5LiL6L29JzsKCiAgICAgICAgICAgICAgICAgICAgICAgIHBsYXlCdXRMaS5iZWZvcmUoZG93bmxvYWRCdXQpOwoKICAgICAgICAgICAgICAgICAgICAgICAgZG93bmxvYWRCdXQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZpZGVvSWQ7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZ2V0VmlkZW9EYXRhKGRvbSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwYXJlbnREb20gPSBkb20ucGFyZW50Tm9kZQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihwYXJlbnREb20uY2xhc3NOYW1lICYmIHBhcmVudERvbS5jbGFzc05hbWU9PSdGZWVkJyl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhwYXJlbnREb20uY2xhc3NOYW1lKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2aWRlb0RhdGEgPSBKU09OLnBhcnNlKHBhcmVudERvbS5nZXRBdHRyaWJ1dGUoJ2RhdGEtemEtZXh0cmEtbW9kdWxlJykpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW9JZCA9IHZpZGVvRGF0YS5jYXJkLmNvbnRlbnQudmlkZW9faWQ7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VmlkZW9EYXRhKHBhcmVudERvbSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRWaWRlb0RhdGEocGxheUJ1dCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIXZpZGVvSWQpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygn5pyq6I635Y+W6KeG6aKRaWQnKTtyZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgemhEb3dubG9hZCh2aWRlb0lkKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIH0pCgogICAgICAgICAgICAgICAgICAgIH0sMTAwMCk7CgogICAgICAgICAgICAgICAgfSkKCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgZnVuY3Rpb24gemhEb3dubG9hZCh2aWRlb0lkKXsKCiAgICAgICAgICAgICAgICAgICAgbGV0IHVybCA9ICdodHRwczovL2xlbnMuemhpaHUuY29tL2FwaS92NC92aWRlb3MvJyt2aWRlb0lkOwoKICAgICAgICAgICAgICAgICAgICBfdGhpcy5yZXF1ZXN0KCdnZXQnLHVybCkudGhlbigocmVzdWx0KT0+ewoKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGEgPSBKU09OLnBhcnNlKHJlc3VsdCk7CgogICAgICAgICAgICAgICAgICAgICAgICBpZihkYXRhLnBsYXlsaXN0ICE9IHVuZGVmaW5lZCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBsYXlfdXJsID0gZGF0YS5wbGF5bGlzdC5MRC5wbGF5X3VybDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdmlkZW9OYW1lID0gdmlkZW9JZCsiLm1wNCI7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2cocGxheV91cmwpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2VDbGFzcy5MUl9kb3dubG9hZChwbGF5X3VybCx2aWRlb05hbWUpOwoKICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzZUNsYXNzLnRvYXN0KCfkuIvovb3lpLHotKXvvIEnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVtb3ZlUmlnaHQoKXsKICAgICAgICAgICAgICAgIGlmKGxvY2F0aW9uLmhyZWYubWF0Y2goL15odHRwcz86XC9cL3d3d1wuemhpaHVcLmNvbVwvcGVvcGxlXC8uKi8pKXsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbGV0IHpoRnVsbFNjcmVlbiA9IGAuR2xvYmFsU2lkZUJhciB7ZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O30KICAgICAgICAgICAgICAgICAgICAuY3NzLTFxeXl0ajd7ZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O30KICAgICAgICAgICAgICAgICAgICAuUXVlc3Rpb24tc2lkZUNvbHVtbntkaXNwbGF5Om5vbmUgIWltcG9ydGFudH0KICAgICAgICAgICAgICAgICAgICAuVG9wc3RvcnktbWFpbkNvbHVtbnt3aWR0aDoxMDAlICFpbXBvcnRhbnR9CiAgICAgICAgICAgICAgICAgICAgLlF1ZXN0aW9uLW1haW5Db2x1bW57d2lkdGg6MTAwMHB4ICFpbXBvcnRhbnR9CiAgICAgICAgICAgICAgICAgICAgLmNzcy1jYXpnNDh7bWFyZ2luOiAwcHggMTZweCAwcHggMHB4ICFpbXBvcnRhbnQ7fQogICAgICAgICAgICAgICAgICAgIC5RdWVzdGlvbldhaXRpbmctbWFpbkNvbHVtbnt3aWR0aDoxMDAlICFpbXBvcnRhbnQ7fQogICAgICAgICAgICAgICAgICAgIC5jc3MtMWo1ZDNsbHtwYWRkaW5nLWxlZnQ6MTBweDt9CiAgICAgICAgICAgICAgICAgICAgLmNzcy15aGp3b2V7anVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuICFpbXBvcnRhbnQ7fQogICAgICAgICAgICAgICAgICAgIC5BdXRob3JJbmZve21heC13aWR0aDoxMDAwcHggIWltcG9ydGFudDt9OwogICAgICAgICAgICAgICAgICAgIGA7CiAgICAgICAgICAgICAgICBkb21TdHlsZSAuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoemhGdWxsU2NyZWVuKSk7CgogICAgICAgICAgICAgICAgZG9tSGVhZC5hcHBlbmRDaGlsZChkb21TdHlsZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2hhbmdlTGluaygpewoKICAgICAgICAgICAgICAgIGlmKGNvdXBvblVybC5pbmRleE9mKCd0YXJnZXQnKSAhPSAtMSl7CgogICAgICAgICAgICAgICAgICAgIGxldCBvYmogPSB0aGlzLmdldFVybFBhcmFtcyhjb3Vwb25VcmwpOwoKICAgICAgICAgICAgICAgICAgICBpZihvYmoudGFyZ2V0ID09IHVuZGVmaW5lZCkgcmV0dXJuOwoKICAgICAgICAgICAgICAgICAgICBsZXQgbGluayA9IGRlY29kZVVSSUNvbXBvbmVudChvYmoudGFyZ2V0KTsKCiAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24uaHJlZj1saW5rOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJlbW92ZUtleXdvcmQoKXsKCiAgICAgICAgICAgICAgICB2YXIgR01LZXl3b3JkID0gR01fZ2V0VmFsdWUoJ2lucHV0WmhLZXl3b3JkJywnMCcpOwoKICAgICAgICAgICAgICAgIGlmKEdNS2V5d29yZCA9PSAnMCcgfHwgR01LZXl3b3JkID09ICcnKSByZXR1cm47CgogICAgICAgICAgICAgICAgbGV0IGtleXdvcmQgPSBHTUtleXdvcmQuc3BsaXQoJywnKTsKCiAgICAgICAgICAgICAgICBsZXQgY29udGVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5Db250ZW50SXRlbScpOwoKICAgICAgICAgICAgICAgIGtleXdvcmQuZm9yRWFjaChmdW5jdGlvbihpdGVtKXsKCiAgICAgICAgICAgICAgICAgICAgY29udGVudC5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlKXsKCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkYXRhWm9wID0gSlNPTi5wYXJzZSh2YWx1ZS5nZXRBdHRyaWJ1dGUoJ2RhdGEtem9wJykpOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYoZGF0YVpvcCAmJiBkYXRhWm9wLnRpdGxlLmluZGV4T2YoaXRlbSkgIT0gLTEpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpdGVtQ2FyZCA9IHZhbHVlLnBhcmVudE5vZGUucGFyZW50Tm9kZS5wYXJlbnROb2RlOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpdGVtQ2FyZENsYXNzPSBpdGVtQ2FyZC5jbGFzc05hbWU7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoaXRlbUNhcmRDbGFzcy5pbmRleE9mKCdUb3BzdG9yeUl0ZW0taXNSZWNvbW1lbmQnKSAhPSAtMSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1DYXJkLnN0eWxlPSdkaXNwbGF5Om5vbmUnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJlbW92ZUF1dGhvck5hbWUoKXsKCiAgICAgICAgICAgICAgICB2YXIgR01BdXRob3JOYW1lID0gR01fZ2V0VmFsdWUoJ2lucHV0WmhBdXRob3JOYW1lJywnMCcpOwoKICAgICAgICAgICAgICAgIGlmKEdNQXV0aG9yTmFtZSA9PSAnMCcgfHwgR01BdXRob3JOYW1lID09ICcnKSByZXR1cm47CgogICAgICAgICAgICAgICAgbGV0IGF1dGhvck5hbWUgPSBHTUF1dGhvck5hbWUuc3BsaXQoJywnKTsKCiAgICAgICAgICAgICAgICAvL+aQnOe0oumhtQogICAgICAgICAgICAgICAgaWYobG9jYXRpb24uaHJlZi5tYXRjaCgvXmh0dHBzPzpcL1wvd3d3LnpoaWh1LmNvbVwvc2VhcmNoLykpewoKICAgICAgICAgICAgICAgICAgICBsZXQgbj0wOwoKICAgICAgICAgICAgICAgICAgICBsZXQgdGltZXIgPSBzZXRJbnRlcnZhbChmdW5jdGlvbigpewoKICAgICAgICAgICAgICAgICAgICBsZXQgdXNlckxpbmsgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuQ2FyZCcpOwoKICAgICAgICAgICAgICAgICAgICBpZih1c2VyTGluay5sZW5ndGggPiA1KXsKCiAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGltZXIpOwoKICAgICAgICAgICAgICAgICAgICAgICAgdXNlckxpbmsuZm9yRWFjaChmdW5jdGlvbihpdGVtKXsKCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhdXRob3IgPSBpdGVtLnF1ZXJ5U2VsZWN0b3IoJ2InKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGF1dGhvcil7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYXV0aG9yTmFtZS5pbmRleE9mKGF1dGhvci5pbm5lclRleHQpICE9IC0xKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5zdHlsZSA9ICdkaXNwbGF5Om5vbmUnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB9KQoKICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZihuPjMwKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhckludGVydmFsKHRpbWVyKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4rKzsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB9LDEwMCkKCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvL+WbnuetlOmhtQogICAgICAgICAgICAgICAgaWYobG9jYXRpb24uaHJlZi5tYXRjaCgvXmh0dHBzPzpcL1wvd3d3LnpoaWh1LmNvbVwvcXVlc3Rpb25cLy4qLykpewoKICAgICAgICAgICAgICAgICAgICBsZXQgaXRlbURvbSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5MaXN0LWl0ZW0nKTsKCiAgICAgICAgICAgICAgICAgICAgaWYoaXRlbURvbS5sZW5ndGg+MCl7CgogICAgICAgICAgICAgICAgICAgICAgICBpdGVtRG9tLmZvckVhY2goZnVuY3Rpb24oaXRlbSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbnRlbnQgPSBpdGVtLnF1ZXJ5U2VsZWN0b3IoJy5Db250ZW50SXRlbScpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGNvbnRlbnQpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGF0YVpvcCA9IEpTT04ucGFyc2UoY29udGVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtem9wJykpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihhdXRob3JOYW1lLmluZGV4T2YoZGF0YVpvcC5hdXRob3JOYW1lKSAhPSAtMSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLnN0eWxlID0gJ2Rpc3BsYXk6bm9uZSc7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICB9KQoKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy/nrYnkvaDlm57nrZTpobUKICAgICAgICAgICAgICAgIGlmKGxvY2F0aW9uLmhyZWYgPT0gJ2h0dHBzOi8vd3d3LnpoaWh1LmNvbS9xdWVzdGlvbi93YWl0aW5nJyl7CgogICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsKCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBxdWVzdGlvbkxpc3QgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuanNOYXZpZ2FibGUnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHF1ZXN0aW9uTGlzdC5sZW5ndGg+MCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlc3Rpb25MaXN0LmZvckVhY2goZnVuY3Rpb24oaXRlbSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhdXRob3JEb21UZXh0ID0gaXRlbS5xdWVyeVNlbGVjdG9yKCcuY3NzLXRuc2F4aCcpLmlubmVyVGV4dDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYXV0aG9yRG9tVGV4dCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYXV0aG9yID0gYXV0aG9yRG9tVGV4dC5yZXBsYWNlKCciJywnJykucmVwbGFjZSgn55qE5o+Q6ZeuJywnJykucmVwbGFjZSgvKF5ccyspfChccyskKS9nLCcnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGF1dGhvcil7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYXV0aG9yTmFtZS5pbmRleE9mKGF1dGhvcikgIT0gLTEpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLnN0eWxlPSdkaXNwbGF5Om5vbmU7JzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQoKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB9LDMwMCkKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8v5o6o6I2Q6aG1CiAgICAgICAgICAgICAgICBpZihsb2NhdGlvbi5ocmVmID09ICdodHRwczovL3d3dy56aGlodS5jb20vJyl7CgogICAgICAgICAgICAgICAgICAgIGxldCBjb250ZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLkNvbnRlbnRJdGVtJyk7CgogICAgICAgICAgICAgICAgICAgIGNvbnRlbnQuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSl7CgogICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGF0YVpvcCA9IEpTT04ucGFyc2UodmFsdWUuZ2V0QXR0cmlidXRlKCdkYXRhLXpvcCcpKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGF1dGhvck5hbWUuaW5kZXhPZihkYXRhWm9wLmF1dGhvck5hbWUpICE9IC0xKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaXRlbUNhcmQgPSB2YWx1ZS5wYXJlbnROb2RlLnBhcmVudE5vZGUucGFyZW50Tm9kZTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihpdGVtQ2FyZCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1DYXJkLnN0eWxlPSdkaXNwbGF5Om5vbmUnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIH0pCgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGxldCBuPTA7CgogICAgICAgICAgICAgICAgbGV0IHRpbWVyQ2xvc2VBdXRob3IgPSBzZXRJbnRlcnZhbChmdW5jdGlvbigpewoKICAgICAgICAgICAgICAgICAgICBsZXQgY29tbWVudERvbSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5Db21tZW50cy1jb250YWluZXInKT9kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuQ29tbWVudHMtY29udGFpbmVyJyk6ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmNzcy0zNHBvZHInKTsKCiAgICAgICAgICAgICAgICAgICAgaWYoY29tbWVudERvbSl7CgogICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29tbWVudExpID0gY29tbWVudERvbS5xdWVyeVNlbGVjdG9yQWxsKCcuY3NzLTFmcm45M3g+ZGl2PmRpdicpOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYoY29tbWVudExpWzBdLmNsYXNzTmFtZT09J2Nzcy0xOTR2NzNtJyl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudExpLmZvckVhY2goZnVuY3Rpb24oaXRlbSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb21tZW50QXV0aG9yTmFtZURvbSA9IGl0ZW0ucXVlcnlTZWxlY3RvcignLmNzcy0xcmQwaDZmJyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb21tZW50QXV0aG9yTmFtZSA9IGNvbW1lbnRBdXRob3JOYW1lRG9tLmlubmVyVGV4dDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYXV0aG9yTmFtZS5pbmRleE9mKGNvbW1lbnRBdXRob3JOYW1lKSAhPSAtMSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLnN0eWxlID0gJ2Rpc3BsYXk6bm9uZSc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCgogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pCgogICAgICAgICAgICB9CgogICAgICAgICAgICByZW1vdmVZYW54dWFuKCl7CgogICAgICAgICAgICAgICAgLy/lm57nrZTpobUKICAgICAgICAgICAgICAgIGlmKGxvY2F0aW9uLmhyZWYubWF0Y2goL15odHRwcz86XC9cL3d3dy56aGlodS5jb21cL3F1ZXN0aW9uXC8uKi8pKXsKCiAgICAgICAgICAgICAgICAgICAgbGV0IGl0ZW1Eb20gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuTGlzdC1pdGVtJyk7CgogICAgICAgICAgICAgICAgICAgIGlmKGl0ZW1Eb20ubGVuZ3RoPjApewoKICAgICAgICAgICAgICAgICAgICAgICAgaXRlbURvbS5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb250ZW50ID0gaXRlbS5xdWVyeVNlbGVjdG9yKCcuS2ZlQ29sbGVjdGlvbi1PcmRpbmFyeUxhYmVsLWNvbnRlbnQnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihjb250ZW50ICYmIGNvbnRlbnQuaW5uZXJUZXh0LmluZGV4T2YoJ+ebkOmAiScpICE9IC0xKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5zdHlsZSA9ICdkaXNwbGF5Om5vbmUnOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSkKCiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBsZXQgYW5zd2VyQ2FyZCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5BbnN3ZXJDYXJkJyk7CgogICAgICAgICAgICAgICAgICAgIGlmKGFuc3dlckNhcmQpewoKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbnRlbnQgPSBhbnN3ZXJDYXJkLnF1ZXJ5U2VsZWN0b3IoJy5LZmVDb2xsZWN0aW9uLU9yZGluYXJ5TGFiZWwtY29udGVudCcpOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYoY29udGVudCAmJiBjb250ZW50LmlubmVyVGV4dC5pbmRleE9mKCfnm5DpgIknKSAhPSAtMSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5zd2VyQ2FyZC5zdHlsZSA9ICdkaXNwbGF5Om5vbmUnOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvL+aQnOe0oumhtQogICAgICAgICAgICAgICAgaWYobG9jYXRpb24uaHJlZi5tYXRjaCgvXmh0dHBzPzpcL1wvd3d3LnpoaWh1LmNvbVwvc2VhcmNoLykpewoKICAgICAgICAgICAgICAgICAgIGxldCBudW0gPSAwOwoKICAgICAgICAgICAgICAgICAgIGxldCB0aW1lciA9IHNldEludGVydmFsKGZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgICAgICAgICBsZXQgY2FyZExpc3QgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuQ2FyZCcpOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYoY2FyZExpc3QubGVuZ3RoID4gNSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aW1lcik7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FyZExpc3QuZm9yRWFjaChmdW5jdGlvbihpdGVtKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHR5cGUgPSBpdGVtLnF1ZXJ5U2VsZWN0b3IoJy5LZmVDb2xsZWN0aW9uLVBjQ29sbGVnZUNhcmQtdHlwZScpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih0eXBlICYmIHR5cGUuaW5uZXJUZXh0LmluZGV4T2YoJ+ebkOmAieS4k+agjycpICE9IC0xKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uc3R5bGUgPSAnZGlzcGxheTpub25lJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhdXRob3IgPSBpdGVtLnF1ZXJ5U2VsZWN0b3IoJ2InKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGF1dGhvcllhbnh1YW4gPSBbJ+aVheS6i+aho+ahiOWxgCcsICfnm5DpgInmjqjojZAnLCAn55uQ6YCJ56eR5pmuJywgJ+ebkOmAieaIkOmVv+iuoeWIkicsICfnn6XkuY7nm5DpgInkvJrlkZgnLCAn55+l5LmO55uQ6YCJ5Yib5L2c6ICFJywgJ+ebkOmAieW/g+eQhicsICfnm5DpgInlgaXlurflv4Xkv67or74nLCAn55uQ6YCJ5aWH5aaZ54mp6K+tJywgJ+ebkOmAieeUn+a0u+mmhicsICfnm5DpgInogYzlnLonLCAn55uQ6YCJ5paH5a2m55SE6YCJJywgJ+ebkOmAieS9nOiAheWwj+euoeWuticsICfnm5DpgInljZrnianppoYnLCAn55uQ6YCJ54K56YeRJywgJ+ebkOmAiea1i+ivhOWupCcsICfnm5DpgInnp5HmioDliY3msr8nLCAn55uQ6YCJ5Lya5ZGY57K+5ZOBJywgJ+WOhuWPsueOr+a4uOiusCddOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihhdXRob3IgJiYgYXV0aG9yWWFueHVhbi5pbmRleE9mKGF1dGhvci5pbm5lclRleHQpICE9IC0xKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uc3R5bGUgPSAnZGlzcGxheTpub25lJzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCgogICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZihudW0+MzApewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGltZXIpOwoKICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtKys7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgfSwxMDApCgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8v5o6o6I2Q6aG1CiAgICAgICAgICAgICAgICBpZihsb2NhdGlvbi5ocmVmID09ICdodHRwczovL3d3dy56aGlodS5jb20vJyl7CgogICAgICAgICAgICAgICAgICAgIGxldCBjb250ZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLkNvbnRlbnRJdGVtJyk7CgogICAgICAgICAgICAgICAgICAgIGNvbnRlbnQuZm9yRWFjaChmdW5jdGlvbihpdGVtKXsKCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb250ZW50ID0gaXRlbS5xdWVyeVNlbGVjdG9yKCcuS2ZlQ29sbGVjdGlvbi1PcmRpbmFyeUxhYmVsLWNvbnRlbnQnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGNvbnRlbnQgJiYgY29udGVudC5pbm5lclRleHQuaW5kZXhPZign55uQ6YCJJykgIT0gLTEpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uc3R5bGUgPSAnZGlzcGxheTpub25lJzsKCiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgY2xvc2VBdXRob3IoKXsKICAgICAgICAgICAgICAgIC8v6YCa6L+H5a6a5pe25Zmo6I635Y+WCgogICAgICAgICAgICAgICAgbGV0IHRpbWVyQ2xvc2VBdXRob3IgPSBzZXRJbnRlcnZhbChmdW5jdGlvbigpewoKICAgICAgICAgICAgICAgICAgICBsZXQgemhtQ2xvc2VBdXRob3JCdXR0b24gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjemhtQ2xvc2VBdXRob3JCdXR0b24nKTsKCiAgICAgICAgICAgICAgICAgICAgaWYoemhtQ2xvc2VBdXRob3JCdXR0b24pcmV0dXJuOwoKICAgICAgICAgICAgICAgICAgICBsZXQgYXV0aG9ySW5mbyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5jc3MtMXJhc2FtcicpOwoKICAgICAgICAgICAgICAgICAgICBpZihhdXRob3JJbmZvKXsKCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB1c2VyTmFtZUluZm8gPSBhdXRob3JJbmZvLnF1ZXJ5U2VsZWN0b3IoJy5Vc2VyTGluaycpOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYodXNlck5hbWVJbmZvKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdXNlckxpbmtJbmZvID0gdXNlck5hbWVJbmZvLnF1ZXJ5U2VsZWN0b3IoJy5Vc2VyTGluay1saW5rJyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGF1dGhvck5hbWVMaW5rID0gdXNlckxpbmtJbmZvLmlubmVyVGV4dDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgR01BdXRob3JOYW1lID0gR01fZ2V0VmFsdWUoJ2lucHV0WmhBdXRob3JOYW1lJyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGF1dGhvckFycmF5ID0gR01BdXRob3JOYW1lP0dNQXV0aG9yTmFtZS5zcGxpdCgnLCcpOicnOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBidXR0b25DbG9zZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1dHRvbkNsb3NlLmlubmVySFRNTCA9IGF1dGhvckFycmF5LmluZGV4T2YoYXV0aG9yTmFtZUxpbmspICE9IC0xPyflt7LlsY/olL0nOiflsY/olL3nlKjmiLcnOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1dHRvbkNsb3NlLnN0eWxlID0gYnV0dG9uQ2xvc2UuaW5uZXJIVE1MID09ICflt7LlsY/olL0nPydwb3NpdGlvbjphYnNvbHV0ZTtyaWdodDoxMHB4O2JhY2tncm91bmQtY29sb3I6I2ZmMmU0ZDtib3JkZXItY29sb3I6I2ZmMmU0ZCc6J3Bvc2l0aW9uOmFic29sdXRlO3JpZ2h0OjEwcHgnOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1dHRvbkNsb3NlLmNsYXNzTmFtZT0nQnV0dG9uIEZvbGxvd0J1dHRvbiBGRWZVcmRmTUlLcFFESkRxa2p0ZSBCdXR0b24tLXByaW1hcnkgQnV0dG9uLS1ibHVlIGVwTUpsMGxGUXVZYkM3anJ3cl9vIEptWXpha3k3TUVQTUZjSkRMTk1HJzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXR0b25DbG9zZS5zZXRBdHRyaWJ1dGUoJ2lkJywnemhtQ2xvc2VBdXRob3JCdXR0b24nKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyTmFtZUluZm8uYXBwZW5kQ2hpbGQoYnV0dG9uQ2xvc2UpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJOYW1lSW5mby5wYXJlbnROb2RlLnN0eWxlPSdsaW5lLWhlaWdodDozNXB4JzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXR0b25DbG9zZS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHpobUF1dGhvck5hbWU7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGJ1dHRvbkNsb3NlLmlubmVySFRNTD09J+W3suWxj+iUvScpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGxldCBpPTA7aTxhdXRob3JBcnJheS5sZW5ndGg7aSsrKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihhdXRob3JBcnJheVtpXSA9PSBhdXRob3JOYW1lTGluayl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhvckFycmF5LnNwbGljZShpLDEpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpobUF1dGhvck5hbWUgPSBhdXRob3JBcnJheS50b1N0cmluZygpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpobUF1dGhvck5hbWU9IEdNX2dldFZhbHVlKCdpbnB1dFpoQXV0aG9yTmFtZScpP0dNX2dldFZhbHVlKCdpbnB1dFpoQXV0aG9yTmFtZScpKycsJythdXRob3JOYW1lTGluazphdXRob3JOYW1lTGluazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdNX3NldFZhbHVlKCdpbnB1dFpoQXV0aG9yTmFtZScsemhtQXV0aG9yTmFtZSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdNX3NldFZhbHVlKCdyZW1vdmVBdXRob3JOYW1lJywnMjInKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0dG9uQ2xvc2UuaW5uZXJIVE1MID0gYnV0dG9uQ2xvc2UuaW5uZXJIVE1MID09ICflt7LlsY/olL0nPyflsY/olL3nlKjmiLcnOiflt7LlsY/olL0nOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXR0b25DbG9zZS5zdHlsZSA9IGJ1dHRvbkNsb3NlLmlubmVySFRNTCA9PSAn5bey5bGP6JS9Jz8ncG9zaXRpb246YWJzb2x1dGU7cmlnaHQ6MTBweDtiYWNrZ3JvdW5kLWNvbG9yOiNmZjJlNGQ7Ym9yZGVyLWNvbG9yOiNmZjJlNGQnOidwb3NpdGlvbjphYnNvbHV0ZTtyaWdodDoxMHB4JzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pCgogICAgICAgICAgICB9CgogICAgICAgIH0KCiAgICAgICAgY2xhc3MgVmlkZW9Eb3dubG9hZENsYXNzIGV4dGVuZHMgQmFzZUNsYXNzewoKICAgICAgICAgICAgY29uc3RydWN0b3IoKXsKCiAgICAgICAgICAgICAgICBzdXBlcigpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBkeVZpZGVvRG93bmxvYWQoKXsKCiAgICAgICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwoKICAgICAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdsb2FkJyxmdW5jdGlvbigpewoKICAgICAgICAgICAgICAgICAgICBhc3luYyBmdW5jdGlvbiBnZXRDb250cm9scygpewoKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHZpZGVvRG9tID0gYXdhaXQgQmFzZUNsYXNzLmdldEVsZW1lbnQoJy54Zy12aWRlby1jb250YWluZXInKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCF2aWRlb0RvbSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ+ayoeacieaJvuWIsERPTScpO3JldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHZzTmF2ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmZ1eV93bWN0Om50aC1vZi10eXBlKDUpJyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgaWYoY291cG9uVXJsLmluZGV4T2YoJ3ZzZGV0YWlsJykgIT0gLTEpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ+e7vOiJuuagj+ebruWFs+mXreS4i+i9vScpO3JldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuY3JlYXRlRHlWaWRlb0Rvd25sb2FkKCk7CgogICAgICAgICAgICAgICAgICAgICAgICBsZXQgdmlkZW9QbGF5RG9tQWxsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgndmlkZW8nKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2aWRlb0luZGV4ID0gdmlkZW9QbGF5RG9tQWxsLmxlbmd0aD4xP3ZpZGVvUGxheURvbUFsbC5sZW5ndGgtMjp2aWRlb1BsYXlEb21BbGwubGVuZ3RoLTE7CgogICAgICAgICAgICAgICAgICAgICAgICBsZXQgdmlkZW9QbGF5RG9tID0gdmlkZW9QbGF5RG9tQWxsW3ZpZGVvSW5kZXhdOwoKICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW9QbGF5RG9tLmFkZEV2ZW50TGlzdGVuZXIoJ2VuZGVkJyxmdW5jdGlvbigpeyAvL+e7k+adnwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCLmkq3mlL7nu5PmnZ8iKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYXV0b1BsYXkgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcueGctc3dpdGNoLWNoZWNrZWQnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihhdXRvUGxheSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldENvbnRyb2xzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgfSwgZmFsc2UpOwoKICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3RvRG93bmxvYWQnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlQ2xhc3MudG9hc3QoJ+ato+WcqOS4i+i9veivt+eojeS+rycpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpbmZvID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLlB6OHQybWVQJyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZpbGVuYW1lOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGluZm8ubGVuZ3RoPjApewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYWNjb3VudDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoaW5mb1t2aWRlb0luZGV4XS5pbm5lclRleHQpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjb3VudCA9IGluZm9bdmlkZW9JbmRleF0uaW5uZXJUZXh0LnJlcGxhY2VBbGwoJy4nLCcnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcueGhEb3BjUV8nKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRpdGxlID0gdnRbdmlkZW9JbmRleF0uaW5uZXJUZXh0LnNwbGl0KCcjJyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHRpdGxlWzBdIHx8IHRpdGxlWzFdKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gdGl0bGVbMF0/dGl0bGVbMF0ucmVwbGFjZUFsbCgnLicsJycpK2FjY291bnQrJy5tcDQnOnRpdGxlWzFdLnJlcGxhY2VBbGwoJy4nLCcnKSthY2NvdW50KycubXA0JzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2UgaWYoYWNjb3VudCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IGFjY291bnQrJy5tcDQnOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCkrJy5tcDQnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKSsnLm1wNCc7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2VDbGFzcy5MUl9kb3dubG9hZCh2aWRlb1BsYXlEb20uY2hpbGRyZW5bMF0uc3JjLGZpbGVuYW1lKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIH0pCgogICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjdG9Db3B5JykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzZUNsYXNzLnRvYXN0KCflt7LlpI3liLbliLDliarotLTmnb8nKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTV9zZXRDbGlwYm9hcmQodmlkZW9QbGF5RG9tLmNoaWxkcmVuWzBdLnNyYyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pCgogICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcudG9MaW5rJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93Lm9wZW4odmlkZW9QbGF5RG9tLmNoaWxkcmVuWzBdLnNyYyk7CgogICAgICAgICAgICAgICAgICAgICAgICB9KQoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgZ2V0Q29udHJvbHMoKTsKCiAgICAgICAgICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIndoZWVsIixnZXRDb250cm9scyk7CgogICAgICAgICAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJyxmdW5jdGlvbihlKXsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGUuY29kZT09J0Fycm93RG93bicgfHwgZS5jb2RlPT0nQXJyb3dVcCcpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldENvbnRyb2xzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgfSkKCiAgICAgICAgICAgICAgICAgICAgYXN5bmMgZnVuY3Rpb24gaW5zZXJ0ZWREb20oKXsKCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2aWRlb0RvbSA9IGF3YWl0IEJhc2VDbGFzcy5nZXRFbGVtZW50KCd2aWRlbycpOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYoIXZpZGVvRG9tKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygn5rKh5pyJ5om+5YiwRE9NJyk7cmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICB2aWRlb0RvbS5hZGRFdmVudExpc3RlbmVyKCdET01Ob2RlSW5zZXJ0ZWQnLChlKSA9PiB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q29udHJvbHMoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIH0pCgogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaW5zZXJ0ZWREb20oKTsKCiAgICAgICAgICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxnZXRDb250cm9scyk7CgogICAgICAgICAgICAgICAgfSkKCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGNyZWF0ZUR5VmlkZW9Eb3dubG9hZCgpewoKICAgICAgICAgICAgICAgIGxldCBjb250cm9sQWxsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnhnLXJpZ2h0LWdyaWQnKTsKCiAgICAgICAgICAgICAgICBsZXQgY29udHJvbHMgPSBjb250cm9sQWxsLmxlbmd0aD4xP2NvbnRyb2xBbGxbY29udHJvbEFsbC5sZW5ndGgtMl06Y29udHJvbEFsbFtjb250cm9sQWxsLmxlbmd0aC0xXTsKCiAgICAgICAgICAgICAgICBsZXQgdmlkZW9Eb3dubG9hZERvbSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN6aG1Eb3V5aW5Eb3dubG9hZCcpOwoKICAgICAgICAgICAgICAgIGlmKHZpZGVvRG93bmxvYWREb20pewoKICAgICAgICAgICAgICAgICAgICB2aWRlb0Rvd25sb2FkRG9tLnBhcmVudE5vZGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh2aWRlb0Rvd25sb2FkRG9tLnBhcmVudE5vZGUpOwoKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBsZXQgcGxheVNldGluZyA9IGNvbnRyb2xzLnF1ZXJ5U2VsZWN0b3IoJy54Z3BsYXllci1wbGF5YmFjay1zZXR0aW5nJyk7CgogICAgICAgICAgICAgICAgbGV0IGRvd25sb2FkRG9tID0gcGxheVNldGluZy5jbG9uZU5vZGUodHJ1ZSk7CgogICAgICAgICAgICAgICAgZG93bmxvYWREb20uc3R5bGU9J21hcmdpbi1yaWdodDoyMHB4Oyc7CgogICAgICAgICAgICAgICAgbGV0IGRvd25sb2FkVGV4dCA9IGRvd25sb2FkRG9tLnF1ZXJ5U2VsZWN0b3IoJ2RpdjpmaXJzdC1jaGlsZCcpOwoKICAgICAgICAgICAgICAgIGRvd25sb2FkVGV4dC5pbm5lclRleHQ9J+S4i+i9vSc7CgogICAgICAgICAgICAgICAgZG93bmxvYWRUZXh0LnN0eWxlID0gJ2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjQwMDsnOwoKICAgICAgICAgICAgICAgIGRvd25sb2FkVGV4dC5zZXRBdHRyaWJ1dGUoJ2lkJywnemhtRG91eWluRG93bmxvYWQnKTsKCiAgICAgICAgICAgICAgICBsZXQgZGV0YWlsID0gY29udHJvbHMucXVlcnlTZWxlY3RvcigneGctaWNvbjpudGgtb2YtdHlwZSgxKScpLmNoaWxkcmVuWzBdOwoKICAgICAgICAgICAgICAgIGxldCBsaW5rVXJsID0gZGV0YWlsLmdldEF0dHJpYnV0ZSgnaHJlZicpP2RldGFpbC5nZXRBdHRyaWJ1dGUoJ2hyZWYnKTpsb2NhdGlvbi5ocmVmOwoKICAgICAgICAgICAgICAgIGlmKGxpbmtVcmwuaW5kZXhPZignd3d3LmRvdXlpbi5jb20nKT09LTEpewoKICAgICAgICAgICAgICAgICAgICBsaW5rVXJsPScvL3d3dy5kb3V5aW4uY29tJytsaW5rVXJsOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGRvd25sb2FkVGV4dC5zZXRBdHRyaWJ1dGUoJ2RhdGEtdXJsJyxsaW5rVXJsKTsKCiAgICAgICAgICAgICAgICBkb3dubG9hZFRleHQucmVtb3ZlQXR0cmlidXRlKCd0YXJnZXQnKTsKCiAgICAgICAgICAgICAgICBkb3dubG9hZFRleHQuc2V0QXR0cmlidXRlKCdocmVmJywnamF2YXNjcmlwdDp2b2lkKDApOycpOwoKICAgICAgICAgICAgICAgIGRvd25sb2FkRG9tLm9ubW91c2VvdmVyPWZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgICAgIGRvd25sb2FkRG9tLmNsYXNzTmFtZT0neGdwbGF5ZXItcGxheWJhY2stc2V0dGluZyBzbGlkZS1zaG93JzsKCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgZG93bmxvYWREb20ub25tb3VzZW91dD1mdW5jdGlvbigpewoKICAgICAgICAgICAgICAgICAgICBkb3dubG9hZERvbS5jbGFzc05hbWU9J3hncGxheWVyLXBsYXliYWNrLXNldHRpbmcnOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGxldCBkb3dubG9hZEh0bWwgPSAnJzsKCiAgICAgICAgICAgICAgICBkb3dubG9hZE9wdGlvbi5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pewoKICAgICAgICAgICAgICAgICAgICBkb3dubG9hZEh0bWwgKz0gYDxkaXYgY2xhc3M9InhncGxheWVyLXBsYXlyYXRpby1pdGVtICR7aXRlbS5pZH0iIGlkPSIke2l0ZW0uaWR9Ij4ke2l0ZW0ubmFtZX08L2Rpdj5gOwoKICAgICAgICAgICAgICAgIH0pCgogICAgICAgICAgICAgICAgZG93bmxvYWREb20ucXVlcnlTZWxlY3RvcignLnhncGxheWVyLXBsYXlyYXRpby13cmFwJykuaW5uZXJIVE1MID0gZG93bmxvYWRIdG1sOwoKICAgICAgICAgICAgICAgIGRvd25sb2FkRG9tLnF1ZXJ5U2VsZWN0b3IoJy54Z3BsYXllci1zbGlkZXInKS5zdHlsZT0nd2lkdGg6NjBweCBpbXBvcnRhbnQ7JzsKCiAgICAgICAgICAgICAgICBsZXQgYXV0b1BsYXkgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcueGdwbGF5ZXItYXV0b3BsYXktc2V0dGluZycpOwoKICAgICAgICAgICAgICAgIGF1dG9QbGF5LmFmdGVyKGRvd25sb2FkRG9tKTsKCiAgICAgICAgICAgICAgICBsZXQgZGl2RG9tID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CgogICAgICAgICAgICAgICAgZGl2RG9tLnN0eWxlPSJwb3NpdGlvbjogYWJzb2x1dGU7ei1pbmRleDotOTk5O2hlaWdodDo4MHB4O3dpZHRoOjQwcHg7bWFyZ2luLXRvcDotODBweDsiCgogICAgICAgICAgICAgICAgZG93bmxvYWREb20uYXBwZW5kQ2hpbGQoZGl2RG9tKTsKCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGtzVmlkZW9Eb3dubG9hZCgpewoKICAgICAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CgogICAgICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLGZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgICAgIGFzeW5jIGZ1bmN0aW9uIGdldENvbnRyb2xzKCl7CgogICAgICAgICAgICAgICAgICAgICAgICBsZXQgdmlkZW9Eb21BcnIgPSBhd2FpdCBCYXNlQ2xhc3MuZ2V0RWxlbWVudCgnLnBsYXllci12aWRlbycsMSk7CgogICAgICAgICAgICAgICAgICAgICAgICBpZighdmlkZW9Eb21BcnIpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCfmsqHmnInmib7liLBET00nKTtyZXR1cm47CgogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBsZXQgdmlkZW9Eb20gPSB2aWRlb0RvbUFyci5sZW5ndGg+Mj92aWRlb0RvbUFyclsxXTp2aWRlb0RvbUFyclswXTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHZpZGVvRG9tLmdldEF0dHJpYnV0ZSgnc3JjJykubWF0Y2goL15ibG9iLykpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2Jsb2Lop4bpopHml6Dms5XkuIvovb0nKTtyZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLmNyZWF0ZUtzVmlkZW9Eb3dubG9hZCh2aWRlb0RvbSk7CgogICAgICAgICAgICAgICAgICAgICAgICB2aWRlb0RvbS5hZGRFdmVudExpc3RlbmVyKCdwbGF5aW5nJyxmdW5jdGlvbigpeyAvL+aSreaUvuS4rQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coIuaSreaUvuS4rSIpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvRG9tLmFkZEV2ZW50TGlzdGVuZXIoJ2VuZGVkJyxmdW5jdGlvbigpeyAvL+e7k+adnwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCLmkq3mlL7nu5PmnZ8iKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYXV0b1BsYXkgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuYXV0by13YXJwcGVyJykuZ2V0QXR0cmlidXRlKCdhdXRvcGxheScpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGF1dG9QbGF5KXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRDb250cm9scygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICB9LCBmYWxzZSk7CgogICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjdG9Eb3dubG9hZCcpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbigpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2VDbGFzcy50b2FzdCgn5q2j5Zyo5LiL6L296K+356iN5L6vJyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBsYXlUaW1lVG90YWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcudG90YWwnKS5pbm5lclRleHQ7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNlY29uZCA9IHBsYXlUaW1lVG90YWwubWF0Y2goLyguKyk6KC4rKS8pOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzZWNvbmRUb3RhbCA9IHNlY29uZFsxXSo2MCtwYXJzZUludChzZWNvbmRbMl0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkYXRhVXJsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3pobUtzRG93bmxvYWQnKS5nZXRBdHRyaWJ1dGUoJ2RhdGEtdXJsJyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGFjY291bnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcucHJvZmlsZS11c2VyLW5hbWUtdGl0bGUnKT9kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcucHJvZmlsZS11c2VyLW5hbWUtdGl0bGUnKS5pbm5lclRleHQ6ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmZlZWQtYXV0aG9yJykuaW5uZXJUZXh0OwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0aXRsZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy52aWRlby1pbmZvLXRpdGxlJyk/ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnZpZGVvLWluZm8tdGl0bGUnKS5pbm5lclRleHQ6bmV3IERhdGUoKS5nZXRUaW1lKCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHZpZGVvRmlsZU5hbWUgPSAoYWNjb3VudCAmJiB0aXRsZSk/YWNjb3VudCsnLScrdGl0bGUrJy5tcDQnOm5ldyBEYXRlKCkuZ2V0VGltZSgpKycubXA0JzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlQ2xhc3MuTFJfZG93bmxvYWQoZGF0YVVybCx2aWRlb0ZpbGVOYW1lKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIH0pCgogICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjdG9Db3B5JykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzZUNsYXNzLnRvYXN0KCflt7LlpI3liLbliLDliarotLTmnb8nKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTV9zZXRDbGlwYm9hcmQodmlkZW9Eb20uZ2V0QXR0cmlidXRlKCdzcmMnKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pCgogICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjdG9MaW5rJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93Lm9wZW4odmlkZW9Eb20uZ2V0QXR0cmlidXRlKCdzcmMnKSk7CgogICAgICAgICAgICAgICAgICAgICAgICB9KQoKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGdldENvbnRyb2xzKCk7CgogICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbihlKXsKCiAgICAgICAgICAgICAgICAgICAgICAgIGdldENvbnRyb2xzKCk7CgogICAgICAgICAgICAgICAgICAgIH0pCgogICAgICAgICAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ3aGVlbCIsZ2V0Q29udHJvbHMpOwoKICAgICAgICAgICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsZnVuY3Rpb24oZSl7CgogICAgICAgICAgICAgICAgICAgICAgICBpZihlLmNvZGU9PSdBcnJvd0Rvd24nIHx8IGUuY29kZT09J0Fycm93VXAnKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRDb250cm9scygpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgoKICAgICAgICAgICAgICAgICAgICB9KQoKICAgICAgICAgICAgICAgIH0pCgoKICAgICAgICAgICAgfQoKICAgICAgICAgICAgY3JlYXRlS3NWaWRlb0Rvd25sb2FkKHZpZGVvRG9tKXsKCiAgICAgICAgICAgICAgICBsZXQgbWF0Y2ggPSAvXmh0dHBzPzpcL1wvd3d3XC5rdWFpc2hvdVwuY29tXC8oLispLzsKCiAgICAgICAgICAgICAgICBsZXQgcmVzcCA9IGxvY2F0aW9uLmhyZWYubWF0Y2gobWF0Y2gpOwoKICAgICAgICAgICAgICAgIGlmKCFyZXNwIHx8IChyZXNwWzFdLmluZGV4T2YoJ3Nob3J0LXZpZGVvJykgPT0gLTEgJiYgcmVzcFsxXS5pbmRleE9mKCd2aWRlbycpID09LTEgJiYgcmVzcFsxXS5pbmRleE9mKCduZXctcmVjbycpID09IC0xKSl7CgogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCflvZPliY3kuI3mmK/op4bpopHmkq3mlL7pobUnKTtyZXR1cm47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYocmVzcFsxXS5pbmRleE9mKCdzaG9ydC12aWRlbycpICE9IC0xKXsKCiAgICAgICAgICAgICAgICAgICAgbGV0IHBsYXllckFyZWEgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcudmlkZW8tY29udGFpbmVyLXBsYXllcicpOwoKICAgICAgICAgICAgICAgICAgICBsZXQgcGxheWVyQXJlYVdpZHRoID0gcGxheWVyQXJlYS5zdHlsZS53aWR0aC5tYXRjaCgvKC4rKXB4Lyk7CgogICAgICAgICAgICAgICAgICAgIGxldCBwbGF5ZXJCYXJQcm9ncmVzcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5wbGF5ZXItYmFyLXByb2dyZXNzJyk7CgogICAgICAgICAgICAgICAgICAgIHBsYXllckJhclByb2dyZXNzLnN0eWxlLndpZHRoID0gcGxheWVyQXJlYVdpZHRoWzFdLTMyMCsncHgnOwoKICAgICAgICAgICAgICAgICAgICBsZXQgdGltZVRvdGFsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnRvdGFsJyk7CgogICAgICAgICAgICAgICAgICAgIHRpbWVUb3RhbC5zdHlsZS5yaWdodD0nMTgwcHgnOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGxldCBjb250cm9scyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5yaWdodCcpOwoKICAgICAgICAgICAgICAgIGxldCB2aWRlb0Rvd25sb2FkRG9tID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3pobUtzRG93bmxvYWQnKTsKCiAgICAgICAgICAgICAgICBpZih2aWRlb0Rvd25sb2FkRG9tKXsKCiAgICAgICAgICAgICAgICAgICAgdmlkZW9Eb3dubG9hZERvbS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHZpZGVvRG93bmxvYWREb20pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGxldCBkZXRhaWxEb20gPSBjb250cm9scy5xdWVyeVNlbGVjdG9yKCdkaXY6bnRoLW9mLXR5cGUoMSknKTsKCiAgICAgICAgICAgICAgICBsZXQgeGdJY29uID0gZGV0YWlsRG9tLmNsb25lTm9kZSh0cnVlKTsKCiAgICAgICAgICAgICAgICBsZXQgbGlua1VybCA9IHZpZGVvRG9tLmdldEF0dHJpYnV0ZSgnc3JjJyk7CgogICAgICAgICAgICAgICAgeGdJY29uLnF1ZXJ5U2VsZWN0b3IoJy5rd2FpLXBsYXllci12b2x1bWUtc291bmQnKS5pbm5lckhUTUw9IjxkaXYgc3R5bGU9J2N1cnNvcjpwb2ludGVyOyc+5LiL6L29PC9kaXY+IjsKCiAgICAgICAgICAgICAgICBsZXQgc2xpZGVyID0geGdJY29uLnF1ZXJ5U2VsZWN0b3IoJy5wbC1zbGlkZXInKTsKCiAgICAgICAgICAgICAgICBzbGlkZXIuc3R5bGUgPSAnd2lkdGg6NDlweDtwYWRkaW5nOjEwcHggNXB4IDIwcHg7JzsKCiAgICAgICAgICAgICAgICBsZXQgZG93bmxvYWRMaXN0ID0gJyc7CgogICAgICAgICAgICAgICAgZG93bmxvYWRPcHRpb24uZm9yRWFjaChmdW5jdGlvbihpdGVtKXsKCiAgICAgICAgICAgICAgICAgICAgZG93bmxvYWRMaXN0ICs9IGA8ZGl2IHN0eWxlPSJtYXJnaW4tdG9wOjEwcHg7Y29sb3I6I0ZGRjtjdXJzb3I6cG9pbnRlcjsiIGlkPSIke2l0ZW0uaWR9Ij4ke2l0ZW0ubmFtZX08L2Rpdj5gOwoKICAgICAgICAgICAgICAgIH0pCgogICAgICAgICAgICAgICAgc2xpZGVyLmlubmVySFRNTCA9IGRvd25sb2FkTGlzdDsKCiAgICAgICAgICAgICAgICB4Z0ljb24uc2V0QXR0cmlidXRlKCdkYXRhLXVybCcsbGlua1VybCk7CgogICAgICAgICAgICAgICAgeGdJY29uLnNldEF0dHJpYnV0ZSgnaWQnLCd6aG1Lc0Rvd25sb2FkJyk7CgogICAgICAgICAgICAgICAgZGV0YWlsRG9tLmJlZm9yZSh4Z0ljb24pOwoKICAgICAgICAgICAgICAgIHJldHVybjsKCiAgICAgICAgICAgICAgICAvL+mHjeaehOaSreaUvuaTjeS9nOaMiemSrgoKICAgICAgICAgICAgICAgIGxldCB6aG1Lc0J1dHRvbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN6aG1Lc0J1dHRvbicpOwoKICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coemhtS3NCdXR0b24pOwoKICAgICAgICAgICAgICAgIGlmKHpobUtzQnV0dG9uKXsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGxldCBidXR0b25JY29uID0gZGV0YWlsRG9tLmNsb25lTm9kZSh0cnVlKTsKCiAgICAgICAgICAgICAgICBidXR0b25JY29uLnNldEF0dHJpYnV0ZSgnaWQnLCd6aG1Lc0J1dHRvbicpOwoKICAgICAgICAgICAgICAgIGxldCBidXR0b25JY29uSW1nID0gYnV0dG9uSWNvbi5xdWVyeVNlbGVjdG9yKCcudW5tdXRlZC1pY29uJyk7CgogICAgICAgICAgICAgICAgaWYoYnV0dG9uSWNvbkltZyl7CiAgICAgICAgICAgICAgICAgICAgYnV0dG9uSWNvbkltZy5zdHlsZSA9ICdiYWNrZ3JvdW5kOiB1cmwoaHR0cHM6Ly9zMi0xMDYyMy5rd2ltZ3MuY29tL3VkYXRhL3BrZy9jbG91ZGNkbi9pbWcvcGxheWVyLXNldHRpbmcuYWQxZjVjZTguc3ZnKSBuby1yZXBlYXQnOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGRldGFpbERvbS5hZnRlcihidXR0b25JY29uKTsKCiAgICAgICAgICAgICAgICBsZXQgcGxTbGlkZXIgPSBidXR0b25JY29uLnF1ZXJ5U2VsZWN0b3IoJy5wbC1zbGlkZXInKTsKCiAgICAgICAgICAgICAgICBwbFNsaWRlci5zdHlsZT0nd2lkdGg6YXV0bztwYWRkaW5nOjEwcHggMTBweCAyNXB4IDEwcHg7JzsKCiAgICAgICAgICAgICAgICBwbFNsaWRlci5pbm5lckhUTUwgPSAiIjsKCiAgICAgICAgICAgICAgICBsZXQgYnV0dG9uRm91ciA9IGNvbnRyb2xzLnF1ZXJ5U2VsZWN0b3IoJ2RpdjpudGgtb2YtdHlwZSg0KScpOwoKICAgICAgICAgICAgICAgIGJ1dHRvbkZvdXIuc3R5bGUubWFyZ2luPScwcHgnOwoKICAgICAgICAgICAgICAgIGxldCBhdXRvUGxheSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5wbGF5LXNldHRpbmctY29udGFpbmVyJyk7CgogICAgICAgICAgICAgICAgaWYoYXV0b1BsYXkpewogICAgICAgICAgICAgICAgICAgIGF1dG9QbGF5LnN0eWxlLm1hcmdpbj0nMHB4IDQwcHggMHB4IDBweCc7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbGV0IGJ1dHRvbkZpdmUgPSBjb250cm9scy5xdWVyeVNlbGVjdG9yKCdkaXY6bnRoLW9mLXR5cGUoNSknKTsKCiAgICAgICAgICAgICAgICBpZihidXR0b25GaXZlKXsKCiAgICAgICAgICAgICAgICAgICAgYnV0dG9uRml2ZS5zdHlsZS5tYXJnaW49JzE1cHggMHB4JzsKCiAgICAgICAgICAgICAgICAgICAgYnV0dG9uRml2ZS5vbm1vdXNlb3Zlcj1mdW5jdGlvbigpewoKICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0b29sVGlwID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmt3YWktcGxheWVyLXJvdGF0ZS10b29sdGlwJyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYodG9vbFRpcCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvb2xUaXAucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0b29sVGlwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCgogICAgICAgICAgICAgICAgICAgICAgICB9LDMwKQoKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHBsU2xpZGVyLmFwcGVuZENoaWxkKGJ1dHRvbkZpdmUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbGV0IGJ1dHRvblNpeCA9IGNvbnRyb2xzLnF1ZXJ5U2VsZWN0b3IoJ2RpdjpudGgtb2YtdHlwZSg2KScpOwoKICAgICAgICAgICAgICAgIGlmKGJ1dHRvblNpeCl7CgogICAgICAgICAgICAgICAgICAgIGJ1dHRvblNpeC5zdHlsZS5tYXJnaW49JzE1cHggMHB4JzsKCiAgICAgICAgICAgICAgICAgICAgbGV0IHRvb2xUaXAgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcua3dhaS1wbGF5ZXItZnVsbHNjcmVlbi10b29sdGlwJyk7CgogICAgICAgICAgICAgICAgICAgIGJ1dHRvblNpeC5vbm1vdXNlb3Zlcj1mdW5jdGlvbigpewoKICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0b29sVGlwID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmt3YWktcGxheWVyLWZ1bGxzY3JlZW4tdG9vbHRpcCcpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHRvb2xUaXApewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b29sVGlwLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodG9vbFRpcCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgfSwzMCkKCiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBwbFNsaWRlci5hcHBlbmRDaGlsZChidXR0b25TaXgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcGxTbGlkZXIuYXBwZW5kQ2hpbGQoYnV0dG9uRm91cik7CgogICAgICAgICAgICB9CgogICAgICAgICAgICB4aWd1YVZpZGVvRG93bmxvYWQoKXsKCiAgICAgICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwoKICAgICAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdsb2FkJyxmdW5jdGlvbigpewoKICAgICAgICAgICAgICAgICAgICBhc3luYyBmdW5jdGlvbiBnZXRDb250cm9scygpewoKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHZpZGVvRG9tID0gYXdhaXQgQmFzZUNsYXNzLmdldEVsZW1lbnQoJ3ZpZGVvJyk7CgogICAgICAgICAgICAgICAgICAgICAgICBpZighdmlkZW9Eb20pewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCfmsqHmnInmib7liLBET00nKTtyZXR1cm47CgogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5jcmVhdGVYaWd1YVZpZGVvRG93bmxvYWQoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIEdNX3htbGh0dHBSZXF1ZXN0KHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICJnZXQiLAoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybDogJ2h0dHA6Ly80Ny45OS4xNTguMTE4L3ZpZGVvLWNyYWNrL3YyL3BhcnNlP2NvbnRlbnQ9JytlbmNvZGVVUklDb21wb25lbnQobG9jYXRpb24uaHJlZiksCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogJycsCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogeydBY2NlcHQnOiAndGV4dC9wbGFpbiwgdGV4dC9odG1sLGFwcGxpY2F0aW9uL2pzb24nfSwKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmxvYWQ6IGZ1bmN0aW9uKHJlcyl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJlcy5zdGF0dXM9PTIwMCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVzcCA9IEpTT04ucGFyc2UocmVzLnJlc3BvbnNlVGV4dCkKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2aWRlb1NyYyA9ICcnOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocmVzcC5jb2RlID09IDApewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW9TcmMgPSByZXNwLmRhdGEudXJsOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN0b0Rvd25sb2FkJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCF2aWRlb1NyYyl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlQ2xhc3MudG9hc3QoJ+ivpeinhumikeaXoOazleS4i+i9vScpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHZpZGVvVGl0bGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcudmlkZW9UaXRsZSBoMScpLmlubmVyVGV4dDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHZpZGVvQXV0aG9yID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmF1dGhvcl9fdXNlck5hbWUnKS50aXRsZTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzZUNsYXNzLnRvYXN0KCfmraPlnKjkuIvovb3or7fnqI3kvq8nKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzZUNsYXNzLkxSX2Rvd25sb2FkKHZpZGVvU3JjLHZpZGVvVGl0bGUrJ0AnK3ZpZGVvQXV0aG9yKycubXA0Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3RvQ29weScpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbigpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighdmlkZW9TcmMpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzZUNsYXNzLnRvYXN0KCfor6Xop4bpopHkuI3og73lpI3liLblnLDlnYAnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2VDbGFzcy50b2FzdCgn5bey5aSN5Yi25Yiw5Ymq6LS05p2/Jyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdNX3NldENsaXBib2FyZCh2aWRlb1NyYyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN0b0xpbmsnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIXZpZGVvU3JjKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2VDbGFzcy50b2FzdCgn6K+l6KeG6aKR5LiN6IO955u05o6l5omT5byAJyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cub3Blbih2aWRlb1NyYyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oZSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucGF0aC5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoaXRlbS5jbGFzc05hbWUgPT0gJ3hncGxheWVyLWNvbnRyb2wtaXRlbSBjb250cm9sX3BsYXluZXh0IGNvbW1vbi1jb250cm9sLWl0ZW0nKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uLnJlbG9hZCgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwxMDAwKQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG9iakxpbmsgPSB7fTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wYXRoLmZvckVhY2goZnVuY3Rpb24oaXRlbSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihpdGVtLmhyZWYpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iakxpbmsuaHJlZiA9IGl0ZW0uaHJlZj9pdGVtLmhyZWY6Jyc7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqTGluay50YXJnZXQgPSBpdGVtLnRhcmdldD9pdGVtLnRhcmdldDonJzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYob2JqTGluay5ocmVmICYmIG9iakxpbmsudGFyZ2V0ICE9ICdfYmxhbmsnKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uLmhyZWYgPSBvYmpMaW5rLmhyZWY7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uZXJyb3IgOiBmdW5jdGlvbihlcnIpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdlcnJvcicpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ3ZpZGVvJykuYWRkRXZlbnRMaXN0ZW5lcignZW5kZWQnLGZ1bmN0aW9uKCl7IC8v57uT5p2fCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coIuaSreaUvue7k+adnyIpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24ucmVsb2FkKCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSw1NTAwKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGZhbHNlKTsKCiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBnZXRDb250cm9scygpOwogICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgfQoKICAgICAgICAgICAgY3JlYXRlWGlndWFWaWRlb0Rvd25sb2FkKCl7CgogICAgICAgICAgICAgICAgbGV0IHJpZ2h0R3JpZCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy54Zy1yaWdodC1ncmlkJyk7CgogICAgICAgICAgICAgICAgbGV0IHBsYXlDb250cm9sID0gcmlnaHRHcmlkLnF1ZXJ5U2VsZWN0b3IoJ2RpdjpudGgtb2YtdHlwZSgyKScpOwoKICAgICAgICAgICAgICAgIGxldCBjb250cm9sID0gcGxheUNvbnRyb2wuY2xvbmVOb2RlKHRydWUpOwoKICAgICAgICAgICAgICAgIGxldCBlbnRyeT0gY29udHJvbC5xdWVyeVNlbGVjdG9yKCcueGdwbGF5ZXItY29udHJvbC1pdGVtX19lbnRyeScpOwoKICAgICAgICAgICAgICAgIGVudHJ5LmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPSJ4Z3BjUGxheWVyX3RleHRFbnRyeSI+PHNwYW4+5LiL6L29PC9zcGFuPjwvZGl2Pic7CgogICAgICAgICAgICAgICAgbGV0IHBvcG92ZXIgPSBjb250cm9sLnF1ZXJ5U2VsZWN0b3IoJy54Z3BsYXllci1jb250cm9sLWl0ZW1fX3BvcG92ZXInKTsKCiAgICAgICAgICAgICAgICBsZXQgZG93bmxvYWRMaXN0ID0gJzx1bD4nOwoKICAgICAgICAgICAgICAgIGRvd25sb2FkT3B0aW9uLmZvckVhY2goZnVuY3Rpb24oaXRlbSl7CgogICAgICAgICAgICAgICAgICAgIGRvd25sb2FkTGlzdCArPSBgPGxpIHRhYmluZGV4PSIwIiByb2xlPSJtZW51aXRlbXJhZGlvIiBhcmlhLWNoZWNrZWQ9ImZhbHNlIiBpZD0iJHtpdGVtLmlkfSI+JHtpdGVtLm5hbWV9PC9saT5gOwoKICAgICAgICAgICAgICAgIH0pCgogICAgICAgICAgICAgICAgZG93bmxvYWRMaXN0ICs9ICc8L3VsPic7CgogICAgICAgICAgICAgICAgcG9wb3Zlci5pbm5lckhUTUwgPSBkb3dubG9hZExpc3Q7CgogICAgICAgICAgICAgICAgcGxheUNvbnRyb2wuYmVmb3JlKGNvbnRyb2wpOwoKICAgICAgICAgICAgICAgIGxldCBkaXZEb20gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKCiAgICAgICAgICAgICAgICBkaXZEb20uc3R5bGU9IndpZHRoOiA4MHB4OyBoZWlnaHQ6IDE0MHB4O3Bvc2l0aW9uOmFic29sdXRlO2JvdHRvbTo0MHB4O2xlZnQ6MjBweDt6LWluZGV4Oi0xIjsKCiAgICAgICAgICAgICAgICBjb250cm9sLmFwcGVuZENoaWxkKGRpdkRvbSk7CgogICAgICAgICAgICAgICAgY29udHJvbC5vbm1vdXNlb3Zlcj1mdW5jdGlvbigpewoKICAgICAgICAgICAgICAgICAgICBwb3BvdmVyLnN0eWxlLmRpc3BsYXk9J2Jsb2NrJzsKCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY29udHJvbC5vbm1vdXNlb3V0PWZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgICAgIHBvcG92ZXIuc3R5bGUuZGlzcGxheT0nbm9uZSc7CgogICAgICAgICAgICAgICAgfQoKCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGJpbGlWaWRlb0Rvd25sb2FkKCl7CgogICAgICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsZnVuY3Rpb24oKXsKCiAgICAgICAgICAgICAgICAgICAgYXN5bmMgZnVuY3Rpb24gZ2V0Q29udHJvbHMoKXsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGxvY2F0aW9uLmhyZWYuaW5kZXhPZignYmFuZ3VtaScpICE9IC0xKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmlnaHRDb250cm9sID0gYXdhaXQgQmFzZUNsYXNzLmdldEVsZW1lbnQoJy5zcXVpcnRsZS1jb250cm9sbGVyLXdyYXAtcmlnaHQnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighcmlnaHRDb250cm9sKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ+ayoeacieaJvuWIsERPTScpO3JldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5jcmVhdGVCaWxpVmlkZW9Eb3dubG9hZCgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG49MDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGltZXIgPSBzZXRJbnRlcnZhbChmdW5jdGlvbigpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZG9tID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmJpbGliaWxpLXBsYXllci12aWRlby1idG4tcXVhbGl0eScpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZG9tT3RoZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuYnB4LXBsYXllci1jdHJsLXF1YWxpdHknKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZG9tKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGltZXIpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuY3JlYXRlQmlsaVZpZGVvRG93bmxvYWQoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2UgaWYoZG9tT3RoZXIpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aW1lcik7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5jcmVhdGVCaWxpVmlkZW9Eb3dubG9hZE90aGVyKCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihuKys+MzApY2xlYXJJbnRlcnZhbCh0aW1lcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sMTAwKQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKCiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIC8vX3RoaXMuY3JlYXRlQmlsaVZpZGVvRG93bmxvYWQoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0aW1lclpobUljb24gPSBzZXRJbnRlcnZhbChmdW5jdGlvbigpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2aWRlb0RvbSA9IFt7bmFtZTondmlkZW8nLHR5cGU6J2RvbSd9LHtuYW1lOidid3BfdmlkZW8nLHR5cGU6J2RvbSd9LHtuYW1lOicuYmlsaWJpbGktcGxheWVyLXZpZGVvJyx0eXBlOidjbGFzcyd9XTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IobGV0IGkgPSAwO2k8dmlkZW9Eb20ubGVuZ3RoO2krKyl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2aWRlbyA9IHZpZGVvRG9tW2ldLnR5cGUgPT0gJ2RvbSc/ZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih2aWRlb0RvbVtpXS5uYW1lKTpkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHZpZGVvRG9tW2ldLm5hbWUpLmZpcnN0Q2hpbGQ7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHZpZGVvKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGltZXJaaG1JY29uKTsgLy/lj5bmtojlrprml7blmagKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoJ3BsYXknLGZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coIuaSreaUvuW8gOWniyIpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLmNyZWF0ZUJpbGlWaWRlb0Rvd25sb2FkKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcignZW5kZWQnLGZ1bmN0aW9uKCl7IC8v57uT5p2fCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYobG9jYXRpb24uaHJlZi5pbmRleE9mKCdiYW5ndW1pJykgIT0gLTEpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYmlsaURvd25sb2FkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2JpbGlEb3dubG9hZCcpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhiaWxpRG93bmxvYWQpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaWxpRG93bmxvYWQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiaWxpRG93bmxvYWQpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgICAgIH0pCgogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGdldENvbnRyb2xzKCk7CgogICAgICAgICAgICAgICAgICAgIGxldCB2aWRlbyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ3ZpZGVvJyk7CgogICAgICAgICAgICAgICAgICAgIGlmKHZpZGVvKXsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoJ3BhdXNlJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coIuaaguWBnCIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY2xvc2VJY29uID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmJpbGktbWluaS1jbG9zZS1pY29uJyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGNsb3NlSWNvbik7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGNsb3NlSWNvbil7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9zZUljb24uY2xpY2soKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvLnBsYXkoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LDUwKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIH0pCgogICAgICAgICAgICB9CgogICAgICAgICAgICBjcmVhdGVCaWxpVmlkZW9Eb3dubG9hZCgpewoKICAgICAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CgogICAgICAgICAgICAgICAgYXN5bmMgZnVuY3Rpb24gZ2V0Q29udHJvbHMoKXsKCiAgICAgICAgICAgICAgICAgICAgbGV0IGRvd25sb2FkSWNvbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNiaWxpRG93bmxvYWQnKTsKCiAgICAgICAgICAgICAgICAgICAgaWYoZG93bmxvYWRJY29uKXsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ+S4i+i9veaMiemSruW3suWtmOWcqCcpO3JldHVybjsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGlmKGxvY2F0aW9uLmhyZWYuaW5kZXhPZignYmFuZ3VtaScpICE9IC0xKXsKCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBxdWFsaXR5ID0gYXdhaXQgQmFzZUNsYXNzLmdldEVsZW1lbnQoJy5zcXVpcnRsZS1xdWFsaXR5LXdyYXAnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFxdWFsaXR5KXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygn5rKh5pyJ5om+5YiwRE9NJyk7cmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29udHJvbCA9IHF1YWxpdHkuY2xvbmVOb2RlKHRydWUpOwoKICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbC5xdWVyeVNlbGVjdG9yKCcuc3F1aXJ0bGUtdmlkZW8tcXVhbGl0eS10ZXh0JykuaW5uZXJUZXh0PSfkuIvovb0nOwoKICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbC5zZXRBdHRyaWJ1dGUoJ2lkJywnYmlsaURvd25sb2FkJyk7CgogICAgICAgICAgICAgICAgICAgICAgICBxdWFsaXR5LmJlZm9yZShjb250cm9sKTsKCiAgICAgICAgICAgICAgICAgICAgfWVsc2UgaWYobG9jYXRpb24uaHJlZi5pbmRleE9mKCd2aWRlbycpICE9IC0xKXsKCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhdXRvSWNvbkRvbSA9IGF3YWl0IEJhc2VDbGFzcy5nZXRFbGVtZW50KCcuYmlsaWJpbGktcGxheWVyLXZpZGVvLWJ0bi1xdWFsaXR5Jyk7CgogICAgICAgICAgICAgICAgICAgICAgICBpZighYXV0b0ljb25Eb20pewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCfmsqHmnInmib7liLBET00nKTtyZXR1cm47CgogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29udHJvbCA9IGF1dG9JY29uRG9tLmNsb25lTm9kZSh0cnVlKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wuc3R5bGU9J21hcmdpbi1yaWdodDoyMHB4Oyc7CgogICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sLnF1ZXJ5U2VsZWN0b3IoJy5idWktc2VsZWN0LXJlc3VsdCcpLmlubmVyVGV4dD0n5LiL6L29JzsKCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wucXVlcnlTZWxlY3RvcignLmJ1aS1zZWxlY3QtcmVzdWx0Jykuc2V0QXR0cmlidXRlKCdpZCcsJ2JpbGlEb3dubG9hZCcpOwoKICAgICAgICAgICAgICAgICAgICAgICAgYXV0b0ljb25Eb20uYmVmb3JlKGNvbnRyb2wpOwoKICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCflvZPliY3pobXpnaLkuI3mmK/op4bpopHmiJbnlarliacnKTtyZXR1cm47CgogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2JpbGlEb3dubG9hZCcpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbigpewoKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGJ2aWQgPSAnJyxhdmlkPScnOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYobG9jYXRpb24uaHJlZi5pbmRleE9mKCdiYW5ndW1pJykgIT0gLTEpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ2aWQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuYXYtbGluaycpLmlubmVyVGV4dDsKCiAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmKGxvY2F0aW9uLmhyZWYuaW5kZXhPZigndmlkZW8nKSAhPSAtMSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBhcmFtcyA9IGxvY2F0aW9uLmhyZWYubWF0Y2goL2h0dHBzOlwvXC93d3cuYmlsaWJpbGkuY29tXC92aWRlb1wvKC4rKVw/Lyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocGFyYW1zWzFdLmluZGV4T2YoJ2F2JykgIT0tMSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2aWQgPSBwYXJhbXNbMV0ucmVwbGFjZSgnYXYnLCcnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnZpZCA9IHBhcmFtc1sxXS5zdWJzdHJpbmcocGFyYW1zWzFdLmxlbmd0aC0xKT09Jy8nP3BhcmFtc1sxXS5zdWJzdHJpbmcoMCxwYXJhbXNbMV0ubGVuZ3RoLTEpOnBhcmFtc1sxXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2VDbGFzcy50b2FzdCgn5b2T5YmN6aG16Z2i5peg5rOV5LiL6L29Jyk7cmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBpZighYnZpZCAmJiAhYXZpZCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ+acquiOt+WPlmJ2aWTmiJZhdmlkJyk7cmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBsZXQgdXJsID0gImh0dHBzOi8vYXBpLmJpbGliaWxpLmNvbS94L3dlYi1pbnRlcmZhY2Uvdmlldz9idmlkPSIrYnZpZCsiJmFpZD0iK2F2aWQ7CgogICAgICAgICAgICAgICAgICAgICAgICBsZXQgdXJpID0gX3RoaXMucmVxdWVzdCgnZ2V0Jyx1cmwpLnRoZW4oKHJlc3VsdCk9PnsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVzcCA9IEpTT04ucGFyc2UocmVzdWx0KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihyZXNwLmNvZGUgPCAwKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzZUNsYXNzLnRvYXN0KCfor6Xop4bpopHml6Dms5XkuIvovb0nKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ+inhumikeS/oeaBr+aOpeWPo+i/lOWbnuaVsOaNrumUmeivrycpO3JldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL+mAiembhmNpZAoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwYWdlSWQgPSBfdGhpcy5nZXRRdWVyeVN0cmluZygncCcpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjaWQgPSAnJzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihwYWdlSWQpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaWQgPSByZXNwLmRhdGEucGFnZXNbcGFnZUlkLTFdLmNpZDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2lkID0gcmVzcC5kYXRhLmNpZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhjaWQpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBsaW5rID0gJ2h0dHBzOi8vYXBpLmJpbGliaWxpLmNvbS94L3BsYXllci9wbGF5dXJsP2F2aWQ9JytyZXNwLmRhdGEuYWlkKycmY2lkPScrY2lkKycmcW49MTEyJzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVzID0gX3RoaXMucmVxdWVzdCgnZ2V0JyxsaW5rKS50aGVuKChyZXN1bHQpPT57CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkYXRhID0gSlNPTi5wYXJzZShyZXN1bHQpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihkYXRhLmNvZGUgPCAwKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzZUNsYXNzLnRvYXN0KCfor6Xop4bpopHml6Dms5XkuIvovb0nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ+inhumikeWcsOWdgOaOpeWPo+i/lOWbnuaVsOaNrumUmeivrycpO3JldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkb3dubG9hZFVybCA9IGRhdGEuZGF0YS5kdXJsWzBdLnVybDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9HTV9kb3dubG9hZChkb3dubG9hZFVybCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5vcGVuKGRvd25sb2FkVXJsKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgICAgICAgIH0pCgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGdldENvbnRyb2xzKCk7CgogICAgICAgICAgICB9CgogICAgICAgICAgICBjcmVhdGVCaWxpVmlkZW9Eb3dubG9hZE90aGVyKCl7CgogICAgICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgICAgICAgICBhc3luYyBmdW5jdGlvbiBnZXRDb250cm9scygpewoKICAgICAgICAgICAgICAgICAgICBsZXQgZG93bmxvYWRJY29uID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2JpbGlEb3dubG9hZCcpOwoKICAgICAgICAgICAgICAgICAgICBpZihkb3dubG9hZEljb24pewogICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygn5LiL6L295oyJ6ZKu5bey5a2Y5ZyoJyk7cmV0dXJuOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYobG9jYXRpb24uaHJlZi5pbmRleE9mKCdiYW5ndW1pJykgIT0gLTEpewoKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHF1YWxpdHkgPSBhd2FpdCBCYXNlQ2xhc3MuZ2V0RWxlbWVudCgnLnNxdWlydGxlLXF1YWxpdHktd3JhcCcpOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYoIXF1YWxpdHkpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCfmsqHmnInmib7liLBET00nKTtyZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb250cm9sID0gcXVhbGl0eS5jbG9uZU5vZGUodHJ1ZSk7CgogICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhjb250cm9sLnF1ZXJ5U2VsZWN0b3IoJy5zcXVpcnRsZS12aWRlby1xdWFsaXR5LXRleHQnKSk7CgogICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sLnF1ZXJ5U2VsZWN0b3IoJy5zcXVpcnRsZS12aWRlby1xdWFsaXR5LXRleHQnKS5pbm5lclRleHQ9J+S4i+i9vSc7CgogICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sLnNldEF0dHJpYnV0ZSgnaWQnLCdiaWxpRG93bmxvYWQnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHF1YWxpdHkuYmVmb3JlKGNvbnRyb2wpOwoKICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZihsb2NhdGlvbi5ocmVmLmluZGV4T2YoJ3ZpZGVvJykgIT0gLTEpewoKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGF1dG9JY29uRG9tID0gYXdhaXQgQmFzZUNsYXNzLmdldEVsZW1lbnQoJy5icHgtcGxheWVyLWN0cmwtcXVhbGl0eScpOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWF1dG9JY29uRG9tKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygn5rKh5pyJ5om+5YiwRE9NJyk7cmV0dXJuOwoKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbnRyb2wgPSBhdXRvSWNvbkRvbS5jbG9uZU5vZGUodHJ1ZSk7CgogICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sLnN0eWxlPSdtYXJnaW4tcmlnaHQ6MjBweDsnOwoKICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbC5xdWVyeVNlbGVjdG9yKCcuYnB4LXBsYXllci1jdHJsLXF1YWxpdHktcmVzdWx0JykuaW5uZXJUZXh0PSfkuIvovb0nOwoKICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbC5xdWVyeVNlbGVjdG9yKCcuYnB4LXBsYXllci1jdHJsLXF1YWxpdHktbWVudScpLnNldEF0dHJpYnV0ZSgnaWQnLCdiaWxpRG93bmxvYWQnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBtZW51SXRlbXMgPSBjb250cm9sLnF1ZXJ5U2VsZWN0b3JBbGwoJy5icHgtcGxheWVyLWN0cmwtcXVhbGl0eS1tZW51LWl0ZW0nKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIG1lbnVJdGVtcy5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkYXRhVmFsdWUgPSBpdGVtLmdldEF0dHJpYnV0ZSgnZGF0YS1WYWx1ZScpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGRhdGFWYWx1ZSAhPSAxNiAmJiBkYXRhVmFsdWUgIT0gODApewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoaXRlbSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9JY29uRG9tLmJlZm9yZShjb250cm9sKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wub25tb3VzZW92ZXI9KCk9PnsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sLnF1ZXJ5U2VsZWN0b3IoJy5icHgtcGxheWVyLWN0cmwtcXVhbGl0eS1tZW51Jykuc3R5bGUuZGlzcGxheT0nYmxvY2snOwoKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbC5vbm1vdXNlb3V0PSgpPT57CgogICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sLnF1ZXJ5U2VsZWN0b3IoJy5icHgtcGxheWVyLWN0cmwtcXVhbGl0eS1tZW51Jykuc3R5bGUuZGlzcGxheT0nbm9uZSc7CgogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIH1lbHNlewoKICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ+W9k+WJjemhtemdouS4jeaYr+inhumikeaIlueVquWJpycpO3JldHVybjsKCiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjYmlsaURvd25sb2FkJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKGUpewoKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGJpbGlEYXRhVmFsdWUgPSBlLnRhcmdldC5nZXRBdHRyaWJ1dGUoJ2RhdGEtVmFsdWUnKT9lLnRhcmdldC5nZXRBdHRyaWJ1dGUoJ2RhdGEtVmFsdWUnKTonJzsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFiaWxpRGF0YVZhbHVlKXJldHVybjsKCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBidmlkID0gJycsYXZpZD0nJzsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGxvY2F0aW9uLmhyZWYuaW5kZXhPZignYmFuZ3VtaScpICE9IC0xKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBidmlkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmF2LWxpbmsnKS5pbm5lclRleHQ7CgogICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZihsb2NhdGlvbi5ocmVmLmluZGV4T2YoJ3ZpZGVvJykgIT0gLTEpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBub3dVcmwgPSBsb2NhdGlvbi5ocmVmLnNwbGl0KCc/Jyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBhcmFtcyA9IG5vd1VybFswXS5tYXRjaCgvaHR0cHM6XC9cL3d3dy5iaWxpYmlsaS5jb21cL3ZpZGVvXC8oLispLyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocGFyYW1zWzFdLmluZGV4T2YoJ2F2JykgIT0tMSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2aWQgPSBwYXJhbXNbMV0ucmVwbGFjZSgnYXYnLCcnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnZpZCA9IHBhcmFtc1sxXS5zdWJzdHJpbmcocGFyYW1zWzFdLmxlbmd0aC0xKT09Jy8nP3BhcmFtc1sxXS5zdWJzdHJpbmcoMCxwYXJhbXNbMV0ubGVuZ3RoLTEpOnBhcmFtc1sxXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2VDbGFzcy50b2FzdCgn5b2T5YmN6aG16Z2i5peg5rOV5LiL6L29Jyk7cmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBpZighYnZpZCAmJiAhYXZpZCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ+acquiOt+WPlmJ2aWTmiJZhdmlkJyk7cmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBsZXQgdXJsID0gImh0dHBzOi8vYXBpLmJpbGliaWxpLmNvbS94L3dlYi1pbnRlcmZhY2Uvdmlldz9idmlkPSIrYnZpZCsiJmFpZD0iK2F2aWQ7CgogICAgICAgICAgICAgICAgICAgICAgICBsZXQgdXJpID0gX3RoaXMucmVxdWVzdCgnZ2V0Jyx1cmwpLnRoZW4oKHJlc3VsdCk9PnsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVzcCA9IEpTT04ucGFyc2UocmVzdWx0KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihyZXNwLmNvZGUgPCAwKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzZUNsYXNzLnRvYXN0KCfor6Xop4bpopHml6Dms5XkuIvovb0nKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ+inhumikeS/oeaBr+aOpeWPo+i/lOWbnuaVsOaNrumUmeivrycpO3JldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL+mAiembhmNpZAoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwYWdlSWQgPSBfdGhpcy5nZXRRdWVyeVN0cmluZygncCcpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjaWQgPSAnJzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihwYWdlSWQpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaWQgPSByZXNwLmRhdGEucGFnZXNbcGFnZUlkLTFdLmNpZDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2lkID0gcmVzcC5kYXRhLmNpZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGluayA9ICdodHRwczovL2FwaS5iaWxpYmlsaS5jb20veC9wbGF5ZXIvcGxheXVybD9hdmlkPScrcmVzcC5kYXRhLmFpZCsnJmNpZD0nK2NpZCsnJnFuPScrYmlsaURhdGFWYWx1ZTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVzID0gX3RoaXMucmVxdWVzdCgnZ2V0JyxsaW5rLCcnLHRydWUpLnRoZW4oKHJlc3VsdCk9PnsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGEgPSBKU09OLnBhcnNlKHJlc3VsdCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGRhdGEuY29kZSA8IDApewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlQ2xhc3MudG9hc3QoJ+ivpeinhumikeaXoOazleS4i+i9vScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygn6KeG6aKR5Zyw5Z2A5o6l5Y+j6L+U5Zue5pWw5o2u6ZSZ6K+vJyk7cmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRvd25sb2FkVXJsID0gZGF0YS5kYXRhLmR1cmxbMF0udXJsOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0dNX2Rvd25sb2FkKGRvd25sb2FkVXJsKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93Lm9wZW4oZG93bmxvYWRVcmwpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICAgICAgfSkKCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgZ2V0Q29udHJvbHMoKTsKCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHlvdXR1YmVWaWRlb0Rvd25sb2FkKCl7CgogICAgICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgICAgICAgICBsZXQgdGltZXIgPSBzZXRJbnRlcnZhbChmdW5jdGlvbigpewoKICAgICAgICAgICAgICAgICAgICBsZXQgdXJsID0gbG9jYXRpb24uaHJlZi5tYXRjaCgvXmh0dHBzPzpcL1wvd3d3XC55b3V0dWJlXC5jb21cLyh3YXRjaFw/dj0uK3xzaG9ydHNcLy4rKS8pOwoKICAgICAgICAgICAgICAgICAgICBpZih1cmwpewoKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHlvdXR1YmVJY29uID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3pobWxvZ28nKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHlvdXR1YmVJY29uKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlvdXR1YmVJY29uLnN0eWxlLm9wYWNpdHk9MTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKCiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLnpobUxvZ28oKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwbGF5V3JhcEh0bWwgPSAiPGRpdiBjbGFzcz0nemhtX3BsYXlfdmlkZW9fbGluZSc+IjsKCiAgICAgICAgICAgICAgICAgICAgICAgIHBsYXlXcmFwSHRtbCArPSI8dWwgY2xhc3M9J3pobV9wbGF5X3ZpZGVfbGluZV91bCc+IjsKCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwbGF5TGluZSA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtuYW1lOifkuIvovb3nur/ot68xJyx1cmw6J2h0dHBzOi8vemguc2F2ZWZyb20ubmV0LzE3Ni8jdXJsPSd9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAge25hbWU6J+S4i+i9vee6v+i3rzInLHVybDonaHR0cHM6Ly9teWRvd25kb3duLmNvbS95MiMnfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtuYW1lOifkuIvovb3nur/ot68zJyx1cmw6J2h0dHBzOi8vd3d3Lnl0ZG93bmZrLmNvbS9zZWFyY2g/dXJsPSd9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAge25hbWU6J+S4i+i9vee6v+i3rzQnLHVybDonaHR0cHM6Ly95b3V0LmNvbS92aWRlby8/dXJsPSd9CiAgICAgICAgICAgICAgICAgICAgICAgIF07CgogICAgICAgICAgICAgICAgICAgICAgICBwbGF5TGluZS5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXlXcmFwSHRtbCArPWA8bGkgY2xhc3M9J3BsYXlMaW5lVGQgemhtX3BsYXlfdmlkZW9fbGluZV91bF9saScgdXJsPScke2l0ZW0udXJsfScgPiR7aXRlbS5uYW1lfTwvbGk+YDsKCiAgICAgICAgICAgICAgICAgICAgICAgIH0pCgogICAgICAgICAgICAgICAgICAgICAgICBwbGF5V3JhcEh0bWwgKz0iPC91bD48L2Rpdj4iOwoKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHpobVBsYXkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnemhtbG9nbycpOwoKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBsYXlMaW5lRG9tID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CgogICAgICAgICAgICAgICAgICAgICAgICBwbGF5TGluZURvbS5jbGFzc05hbWUgPSAncGxheUxpbmVEaXYgemhtX3BsYXlfdmlkZW9fd3JhcCc7CgogICAgICAgICAgICAgICAgICAgICAgICBwbGF5TGluZURvbS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwoKICAgICAgICAgICAgICAgICAgICAgICAgcGxheUxpbmVEb20uaW5uZXJIVE1MID0gcGxheVdyYXBIdG1sOwoKICAgICAgICAgICAgICAgICAgICAgICAgemhtUGxheS5hcHBlbmRDaGlsZChwbGF5TGluZURvbSk7CgogICAgICAgICAgICAgICAgICAgICAgICBsZXQgcGxheUxpbmVUZCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5wbGF5TGluZVRkJyk7CgogICAgICAgICAgICAgICAgICAgICAgICBwbGF5TGluZVRkLmZvckVhY2goZnVuY3Rpb24oaXRlbSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93Lm9wZW4oaXRlbS5nZXRBdHRyaWJ1dGUoJ3VybCcpK2xvY2F0aW9uLmhyZWYpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCgogICAgICAgICAgICAgICAgICAgICAgICB9KQoKICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnBsYXlCdXR0b24nKS5vbm1vdXNlb3Zlcj0oKT0+ewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5wbGF5TGluZURpdiIpLnN0eWxlLmRpc3BsYXk9J2Jsb2NrJzsKCiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5wbGF5QnV0dG9uJykub25tb3VzZW91dD0oKT0+ewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5wbGF5TGluZURpdiIpLnN0eWxlLmRpc3BsYXk9J25vbmUnOwoKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuemhtTG9nb0RyYWcoJ3lvdXR1YmUnLCcnKTsKCiAgICAgICAgICAgICAgICAgICAgfWVsc2V7CgogICAgICAgICAgICAgICAgICAgICAgICBsZXQgemhtSWNvbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN6aG1JY29uJyk7CgogICAgICAgICAgICAgICAgICAgICAgICBpZih6aG1JY29uKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aG1JY29uLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoemhtSWNvbik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCgogICAgICAgICAgICAgICAgICAgICAgICBsZXQgemhtbG9nbyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN6aG1sb2dvJyk7CgogICAgICAgICAgICAgICAgICAgICAgICBpZih6aG1sb2dvKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aG1sb2dvLnN0eWxlLm9wYWNpdHk9MDsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgfSw1MDApCgogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICB2YXIgYWxsV2ViID0gWy4uLmdldENvdXBvbiwuLi5qeFZpZGVvLC4uLmp4TXVzaWMsLi4uemhOaWNlLC4uLnRhb2JhbywuLi52aWRlb0Rvd25sb2FkLC4uLmJhaWR1XTsKCiAgICAgICAgdmFyIG5vd1dlYj1bXTsKCiAgICAgICAgYWxsV2ViLmZvckVhY2goZnVuY3Rpb24oaXRlbSl7CgogICAgICAgICAgICBpZihpdGVtLmlzT3BlbiA9PSAwKSByZXR1cm4gdHJ1ZTsKCiAgICAgICAgICAgIGl0ZW0ud2ViLmZvckVhY2goZnVuY3Rpb24odmFsKXsKCiAgICAgICAgICAgICAgICBsZXQgcmVzdWx0ID0gbG9jYXRpb24uaHJlZi5tYXRjaCh2YWwubWF0Y2gpOwoKICAgICAgICAgICAgICAgIGlmKHJlc3VsdCl7CgogICAgICAgICAgICAgICAgICAgIG5vd1dlYi5wdXNoKHZhbCk7CgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KQoKICAgICAgICB9KQoKICAgICAgICBpZihub3dXZWIubGVuZ3RoPT0wKXsKCiAgICAgICAgICAgIGxldCBiYXNlQ2xhc3MgPSBuZXcgQmFzZUNsYXNzKCk7CgogICAgICAgICAgICBjb25zb2xlLmxvZygn5rKh5pyJ5Yy56YWN6K+l572R56uZ5oiW6K+l5qih5Z2X5bey5YWz6ZetJyk7cmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgbm93V2ViLmZvckVhY2goZnVuY3Rpb24oaXRlbSl7CgogICAgICAgICAgICBzd2l0Y2goaXRlbS5mdW5jTmFtZSl7CiAgICAgICAgICAgICAgICBjYXNlICdjb3Vwb24nOgoKICAgICAgICAgICAgICAgICAgICBjb3Vwb25GdW5jKGl0ZW0pOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAncGxheVZpZGVvJzoKICAgICAgICAgICAgICAgICAgICBwbGF5VmlkZW9GdW5jKCk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICdwbGF5TXVzaWMnOgogICAgICAgICAgICAgICAgICAgIHBsYXlNdXNpY0Z1bmMoaXRlbSk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICd6aE5pY2UnOgogICAgICAgICAgICAgICAgICAgIHpoTmljZUZ1bmMoKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJ2JhaWR1JzoKICAgICAgICAgICAgICAgICAgICB2YXIgYmFzZUNsYXNzID0gbmV3IEJhc2VDbGFzczsKICAgICAgICAgICAgICAgICAgICBiYWlkdUZ1bmMoKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJ3ZpZGVvRG93bmxvYWQnOgoKICAgICAgICAgICAgICAgICAgICB2YXIgdmlkZW9Eb3dubG9hZENsYXNzID0gbmV3IFZpZGVvRG93bmxvYWRDbGFzcygpOwoKICAgICAgICAgICAgICAgICAgICB2YXIge2Z1bmNOYW1lLG1hdGNoOm5vd01hdGNoLG5vZGU6bm93Tm9kZSxuYW1lOm5vd05hbWV9ID0gaXRlbTsKCiAgICAgICAgICAgICAgICAgICAgaWYoaXRlbS5pc1dlYk9wZW4gPT0gMCl7CgogICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhpdGVtLm5hbWUrJ+W3suWFs+mXrScpO3JldHVybjsKCiAgICAgICAgICAgICAgICAgICAgfWVsc2V7CgogICAgICAgICAgICAgICAgICAgICAgICB2aWRlb0Rvd25sb2FkQ2xhc3Nbbm93TmFtZV0oKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgIGNhc2UgJ3Rhb2Jhb1NlYXJjaCc6CiAgICAgICAgICAgICAgICAgICAgdGFvYmFvU2VhcmNoRnVuYyhpdGVtKQogICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIH0KCiAgICAgICAgfSkKCiAgICAgICAgZnVuY3Rpb24gY291cG9uRnVuYyhpdGVtKXsKCiAgICAgICAgICAgIHZhciBjb3Vwb25DbGFzcyA9IG5ldyBDb3Vwb25DbGFzcygpOwoKICAgICAgICAgICAgdmFyIHtmdW5jTmFtZSxtYXRjaDpub3dNYXRjaCxub2RlOm5vd05vZGUsbmFtZTpub3dOYW1lfSA9IGl0ZW07CgogICAgICAgICAgICB2YXIgY291cG9uU3R5bGUgPWAKICAgICAgICAgICAgICAgICAgICBodG1sewogICAgICAgICAgICAgICAgICAgIC0tcmlnaHQ6MTAwJTsKICAgICAgICAgICAgICAgICAgICAtLWxlZnQ6MTAwJTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC56aG1fY291cG9uewogICAgICAgICAgICAgICAgICAgIHdpZHRoOmZpdC1jb250ZW50OwogICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICAgICAgICAgICAgZmxleC1kaXJlY3Rpb246cm93OwogICAgICAgICAgICAgICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgICAgICAgICAgICAgICAgICBhbGlnbi1pdGVtczpmbGV4LXN0YXJ0OwogICAgICAgICAgICAgICAgICAgIGZvbnQtc2l6ZToxNHB4OwogICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgICAgICBtYXJnaW4tYm90dG9tOjE1cHg7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuemhtX2xlZnR7CiAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICAgICAgICAgICAgICBmbGV4LWRpcmVjdGlvbjpyb3c7CiAgICAgICAgICAgICAgICAgICAganVzdGlmeS1jb250ZW50OmZsZXgtc3RhcnQ7CiAgICAgICAgICAgICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICAgICAgICAgICAgICBmb250LXNpemU6MTRweDsKICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiByYWRpYWwtZ3JhZGllbnQoY2lyY2xlIGF0IHJpZ2h0IHRvcCwgdHJhbnNwYXJlbnQgOHB4LCNmZmYgMCkgdG9wIGxlZnQgL3ZhcigtLXJpZ2h0KSA1MSUgbm8tcmVwZWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhZGlhbC1ncmFkaWVudChjaXJjbGUgYXQgcmlnaHQgYm90dG9tLCB0cmFuc3BhcmVudCA4cHgsICNmZmYgMCkgYm90dG9tIGxlZnQgL3ZhcigtLXJpZ2h0KSA1MSUgbm8tcmVwZWF0OwogICAgICAgICAgICAgICAgICAgIGZpbHRlcjogZHJvcC1zaGFkb3coMnB4IDJweCAzcHggIzg4OCk7CiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0Ojg0cHg7CiAgICAgICAgICAgICAgICAgICAgd2lkdGg6MTAwJTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC56aG1faW1nX2ljb257CiAgICAgICAgICAgICAgICAgICAgcGFkZGluZzo0cHggMHB4IDBweCA1cHg7CiAgICAgICAgICAgICAgICAgICAgbWFyZ2luLXJpZ2h0OjVweDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC56aG1faW1nX2ljb24gaW1newogICAgICAgICAgICAgICAgICAgIHdpZHRoOjQ3cHg7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuemhtX2NvbnRlbnR7CiAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICAgICAgICAgICAgICBmbGV4LWRpcmVjdGlvbjpjb2x1bW47CiAgICAgICAgICAgICAgICAgICAgbWFyZ2luLXJpZ2h0OiAxOHB4OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnpobV9tb25leXsKICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgICAgICAgICAgIGZsZXgtZGlyZWN0aW9uOnJvdzsKICAgICAgICAgICAgICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7CiAgICAgICAgICAgICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC56aG1fYW1vdW50X21vbmV5ewogICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICAgICAgICAgICAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuemhtX21vbmV5X3NpZ257CiAgICAgICAgICAgICAgICAgICAgY29sb3I6I2YyMzAzMDsKICAgICAgICAgICAgICAgICAgICBmb250LXNpemU6IDIwcHg7CiAgICAgICAgICAgICAgICAgICAgZm9udC1mYW1pbHk6IEFyaWFsOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnpobV9tb25leV9udW17CiAgICAgICAgICAgICAgICAgICAgY29sb3I6I2YyMzAzMDsKICAgICAgICAgICAgICAgICAgICBmb250LXNpemU6MzZweDsKICAgICAgICAgICAgICAgICAgICBtYXJnaW4tbGVmdDogMnB4OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnpobV9jb25kaXRpb257CiAgICAgICAgICAgICAgICAgICAgY29sb3I6I2ZiMGYzYTsKICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmNGVjOwogICAgICAgICAgICAgICAgICAgIG1hcmdpbi10b3A6NXB4OwogICAgICAgICAgICAgICAgICAgIG1hcmdpbi1sZWZ0OiA1cHg7CiAgICAgICAgICAgICAgICAgICAgcGFkZGluZzoycHggNXB4OwogICAgICAgICAgICAgICAgICAgIGZvbnQtc2l6ZToxMnB4OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnpobV90aW1lewogICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICAgICAgICAgICAgZmxleC1kaXJlY3Rpb246cm93OwogICAgICAgICAgICAgICAgICAgIG1hcmdpbi10b3A6IC01cHg7CiAgICAgICAgICAgICAgICAgICAgcGFkZGluZzoycHggNHB4OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnpobV90ZXJtewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiNmYjBmM2E7CiAgICAgICAgICAgICAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI2ZiMGYzYTsKICAgICAgICAgICAgICAgICAgICBib3JkZXItcmFkaXVzOjJweDsKICAgICAgICAgICAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6MHB4IDRweDsKICAgICAgICAgICAgICAgICAgICBmb250LXNpemU6MTJweDsKICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IDE4cHg7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuemhtX2RhdGV7CiAgICAgICAgICAgICAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgICAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgICAgICAgICAgICAgcGFkZGluZy1sZWZ0OjhweDsKCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuemhtX2NpcmNsZXsKICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiAjZmIwZjNhIHVybChkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUFnQUFBQUlDQVlBQUFERUQ3NkxBQUFBQ1hCSVdYTUFBQXNTQUFBTEVnSFMzWDc4QUFBQXpVbEVRVlFZbFMzTk1Vb0RRUmlHNFhjbXU5bEFYQlFicSsxQ0NxdWN3c2JPTzNnQVMyOWg0UW04Z1JkSU1LVmdsUVZCRmlTRmpZS0JxV1oyZC83UEl2WVBQRTZTTUNIdmNEOEh1THpCVXNJS0R5WThBTjRSVStKOS84bkg4b0xZSjN3V2NoeEJqSkh0WmtOMWZzYnA5b212aHp2NmNjRGpRSkxhdGxYWGRaSWs1YXdrS1Z6ZEtrOVc4Z0JGVVZEWE5RQTJqSlRBN0dTT21SMkxwbWtJSVdBNTQ2c3B2TzV3TDI5UXozR1NCQkNIbm53SXpPNGYwZk1hWW9LeS9BY204QTYrZnhrWDE1QU5xaW1ZOFFlbUNtOTIwcjFhVUFBQUFBQkpSVTVFcmtKZ2dnPT0pIHJlcGVhdC15OwogICAgICAgICAgICAgICAgICAgIG1hcmdpbi10b3A6MTBweDsKICAgICAgICAgICAgICAgICAgICB3aWR0aDogMTBweDsKICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6NjZweDsKICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgICAgICAgICAgICAgcmlnaHQ6OTdweDsKICAgICAgICAgICAgICAgICAgICB6LWluZGV4OjI7CiAgICAgICAgICAgICAgICAgICAgZmlsdGVyOm5vbmU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuemhtX2xpbmtfY291cG9uewogICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICAgICAgICAgICAgZmxleC1kaXJlY3Rpb246cm93OwogICAgICAgICAgICAgICAgICAgIGFsaWduLWl0ZW1zOmNlbnRlcjsKICAgICAgICAgICAgICAgICAgICBmaWx0ZXI6IGRyb3Atc2hhZG93KDJweCAycHggM3B4ICM4ODgpOwogICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6IHJhZGlhbC1ncmFkaWVudChjaXJjbGUgYXQgbGVmdCB0b3AsIHRyYW5zcGFyZW50IDhweCwgI2ZiMDUzYSAwKSB0b3AgcmlnaHQgL3ZhcigtLWxlZnQpIDUwJSBuby1yZXBlYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFkaWFsLWdyYWRpZW50KGNpcmNsZSBhdCBsZWZ0IGJvdHRvbSwgdHJhbnNwYXJlbnQgOHB4LCAjZmIwNTNhIDApIGJvdHRvbSByaWdodCAvdmFyKC0tbGVmdCkgNTAlIG5vLXJlcGVhdDsKICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IDg0cHg7CiAgICAgICAgICAgICAgICAgICAgcGFkZGluZzowcHggNnB4IDBweCA0cHg7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuemhtX2dldF9saW5rX3RleHR7CiAgICAgICAgICAgICAgICAgICAgY3Vyc29yOnBvaW50ZXI7CiAgICAgICAgICAgICAgICAgICAgbWFyZ2luLXRvcDogMHB4OwogICAgICAgICAgICAgICAgICAgIHdyaXRpbmctbW9kZTp2ZXJ0aWNhbC1scjsKICAgICAgICAgICAgICAgICAgICBsZXR0ZXItc3BhY2luZzowcHg7CiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICNmZmYgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgICAgICBmb250LXNpemU6MTRweDsKICAgICAgICAgICAgICAgICAgICBmb250LWZhbWlseToiTWljcm9zb2Z0IFlhSGVpIjsKICAgICAgICAgICAgICAgICAgICB0ZXh0LWRlY29yYXRpb246bm9uZTsKICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiByYWRpYWwtZ3JhZGllbnQoY2lyY2xlIGF0IGxlZnQgdG9wLCB0cmFuc3BhcmVudCA4cHgsICNmYjA1M2EgMCkgdG9wIHJpZ2h0IC92YXIoLS1sZWZ0KSA1MCUgbm8tcmVwZWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhZGlhbC1ncmFkaWVudChjaXJjbGUgYXQgbGVmdCBib3R0b20sIHRyYW5zcGFyZW50IDhweCwgI2ZiMDUzYSAwKSBib3R0b20gcmlnaHQgL3ZhcigtLWxlZnQpIDUwJSBuby1yZXBlYXQ7CgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnpobV9nZXRfbGlua190ZXh0OmhvdmVyewogICAgICAgICAgICAgICAgdGV4dC1kZWNvcmF0aW9uOm5vbmU7CiAgICAgICAgICAgICAgICBmb250LXdlaWdodDo4MDA7CiAgICAgICAgICAgICAgICBmb250LWZhbWlseToiTWljcm9zb2Z0IFlhSGVpIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC56aG1fcXJjb2RlewogICAgICAgICAgICAgICAgICAgIGJvcmRlcjozcHggc29saWQgI2ZmZjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBgOwoKICAgICAgICAgICAgZG9tU3R5bGUgLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNvdXBvblN0eWxlKSk7CgogICAgICAgICAgICBkb21IZWFkLmFwcGVuZENoaWxkKGRvbVN0eWxlKTsKCiAgICAgICAgICAgIGxldCBuPTA7CgogICAgICAgICAgICBsZXQgY291cG9uVGltZXIgPSBzZXRJbnRlcnZhbChmdW5jdGlvbigpewoKICAgICAgICAgICAgICAgIG4rKzsKCiAgICAgICAgICAgICAgICBsZXQgcGFnZU5vZGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKG5vd05vZGUpCgogICAgICAgICAgICAgICAgaWYocGFnZU5vZGUpewoKICAgICAgICAgICAgICAgICAgICBjbGVhckludGVydmFsKGNvdXBvblRpbWVyKTsKCiAgICAgICAgICAgICAgICAgICAgY291cG9uQ2xhc3Nbbm93TmFtZV0oKTsKCiAgICAgICAgICAgICAgICB9ZWxzZXsKCiAgICAgICAgICAgICAgICAgICAgaWYobj09Y291cG9uVGltZXJOdW0pIGNsZWFySW50ZXJ2YWwoY291cG9uVGltZXIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgfSwxMDApCiAgICAgICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gcGxheVZpZGVvRnVuYygpewoKICAgICAgICAgICAgdmFyIHBsYXlWaWRlb0NsYXNzID0gbmV3IFBsYXlWaWRlb0NsYXNzKCk7CgogICAgICAgICAgICBwbGF5VmlkZW9DbGFzcy56aG1Mb2dvKCk7CgogICAgICAgICAgICBpZihHTV9nZXRWYWx1ZSgncGxheVZpZGVvTGluZVRleHQnKSl7CgogICAgICAgICAgICAgICAgbGV0IGxpbmVPYmogPSBwbGF5VmlkZW9DbGFzcy5nZXRMaW5lKEdNX2dldFZhbHVlKCdwbGF5VmlkZW9MaW5lVGV4dCcpKTsKCiAgICAgICAgICAgICAgICBpZihsaW5lT2JqKXsKCiAgICAgICAgICAgICAgICAgICAgcGxheUxpbmUgPSBsaW5lT2JqCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9CgogICAgICAgICAgICAvL3RlbXBsYXRlOmljb24scGxheUxpbmU7CiAgICAgICAgICAgIGxldCBwbGF5V3JhcEh0bWwgPSAiPGRpdiBjbGFzcz0nemhtX3BsYXlfdmlkZW9fbGluZSc+IjsKCiAgICAgICAgICAgIHBsYXlXcmFwSHRtbCArPSI8ZGl2Pjx1bCBjbGFzcz0nemhtX3BsYXlfdmlkZV9saW5lX3VsJz4iOwoKICAgICAgICAgICAgcGxheUxpbmUuZm9yRWFjaChmdW5jdGlvbihpdGVtKXsKCiAgICAgICAgICAgICAgICBsZXQgc2VsZWN0ZWQgPSAnJzsKCiAgICAgICAgICAgICAgICBpZihwbGF5VmlkZW9DbGFzcy5nZXRDb29raWUoJ3BsYXlMaW5lQWN0aW9uJykgPT0gaXRlbS51cmwpewoKICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZCA9ICd6aG1fbGluZV9zZWxlY3RlZCc7CgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHBsYXlXcmFwSHRtbCArPWA8bGkgY2xhc3M9J3BsYXlMaW5lVGQgemhtX3BsYXlfdmlkZW9fbGluZV91bF9saSAke3NlbGVjdGVkfScgdXJsPScke2l0ZW0udXJsfScgPiR7aXRlbS5uYW1lfTwvbGk+YDsKCiAgICAgICAgICAgIH0pCgogICAgICAgICAgICBwbGF5V3JhcEh0bWwgKz0gIjwvZGl2PiI7CgogICAgICAgICAgICBsZXQgemhtUGxheSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd6aG1sb2dvJyk7CgogICAgICAgICAgICBsZXQgcGxheUxpbmVEb20gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKCiAgICAgICAgICAgIHBsYXlMaW5lRG9tLmNsYXNzTmFtZSA9ICdwbGF5TGluZURpdiB6aG1fcGxheV92aWRlb193cmFwJzsKCiAgICAgICAgICAgIHBsYXlMaW5lRG9tLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CgogICAgICAgICAgICBwbGF5TGluZURvbS5pbm5lckhUTUwgPSBwbGF5V3JhcEh0bWw7CgogICAgICAgICAgICB6aG1QbGF5LmFwcGVuZENoaWxkKHBsYXlMaW5lRG9tKTsKCiAgICAgICAgICAgIC8vdGVtcGxhdGU6bm9kZTvmkq3mlL7ljLrln58KCiAgICAgICAgICAgIGxldCBwbGF5SnhIdG1sID0gIjxkaXYgY2xhc3M9J3pobV9wbGF5X3ZpZGVvX2p4Jz4iOwoKICAgICAgICAgICAgcGxheUp4SHRtbCArPSAiPGlmcmFtZSBhbGxvd3RyYW5zcGFyZW5jeT10cnVlIGZyYW1lYm9yZGVyPScwJyBzY3JvbGxpbmc9J25vJyBhbGxvd2Z1bGxzY3JlZW49dHJ1ZSBhbGxvd3RyYW5zcGFyZW5jeT10cnVlIG5hbWU9J2p4X3BsYXknIHN0eWxlPSdoZWlnaHQ6MTAwJTt3aWR0aDoxMDAlJyBpZD0ncGxheUlmcmFtZSc+PC9pZnJhbWU+PC9kaXY+IjsKCiAgICAgICAgICAgIC8v5b6q546v5Yik5pat5piv5ZCm5Zyo5pKt5pS+6aG177yM5piv5YiZ5omn6KGM5LiL6Z2iCiAgICAgICAgICAgIGxldCBqeFZpZGVvRGF0YSA9IFsKICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiLnBsYXllcl9fY29udGFpbmVyIiAsbWF0Y2g6L2h0dHBzOlwvXC92LnFxLmNvbVwveFwvY292ZXJcL1thLXpBLVowLTldKy5odG1sLyxhcmVhQ2xhc3NOYW1lOidwbGF5bGlzdC1saXN0JyxuYW1lOidxcVBDJ30sCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6IiNwbGF5ZXItY29udGFpbmVyIiAsbWF0Y2g6L2h0dHBzOlwvXC92LnFxLmNvbVwveFwvY292ZXJcL1thLXpBLVowLTldK1wvW2EtekEtWjAtOV0rLmh0bWwvLGFyZWFDbGFzc05hbWU6J3BsYXlsaXN0LWxpc3QnLG5hbWU6J3FxUEMnfSwKICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiLmNvbnRhaW5lci1wbGF5ZXIiICxtYXRjaDovdlwucXFcLmNvbVwveFwvcGFnZS8sYXJlYUNsYXNzTmFtZTonbW9kX2VwaXNvZGUnfSwKCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6IiNmbGFzaGJveCIsbWF0Y2g6L15odHRwczpcL1wvd3d3XC5pcWl5aVwuY29tXC9bdndhXVxfLyxhcmVhQ2xhc3NOYW1lOidxeS1lcGlzb2RlLW51bScsbmFtZTonaXFpeWlQYyd9LAogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIubS12aWRlby1wbGF5ZXItd3JhcCIsbWF0Y2g6L15odHRwczpcL1wvbS5pcWl5aVwuY29tXC9bdndhXVxfLyxhcmVhQ2xhc3NOYW1lOidtLXNsaWRpbmctbGlzdCd9LAogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIuaW50bC12aWRlby13cmFwIixtYXRjaDovXmh0dHBzOlwvXC93d3dcLmlxXC5jb21cL3BsYXlcLy8sYXJlYUNsYXNzTmFtZTonbS1zbGlkaW5nLWxpc3QnfSwKCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6IiNwbGF5ZXIiLG1hdGNoOi92XC55b3VrdVwuY29tXC92X3Nob3dcL2lkXy8sYXJlYUNsYXNzTmFtZTonbmV3LWJveC1hbnRob2xvZ3ktaXRlbXMnfSwKICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiI3BsYXllciIsbWF0Y2g6L3ZcLnlvdWt1XC5jb21cL3ZfcGxheVwvaWRfL30sCgogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIjYmlsaWJpbGktcGxheWVyIixub2RlVHlwZTonaWQnLG1hdGNoOi93d3dcLmJpbGliaWxpXC5jb21cL3ZpZGVvLyxuYW1lOidiaWxpUGMnLGFyZWFDbGFzc05hbWU6J3ZpZGVvLWVwaXNvZGUtY2FyZCd9LAogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIuYnB4LXBsYXllci1wcmltYXJ5LWFyZWEiLG5vZGVUeXBlOidpZCcsbWF0Y2g6L3d3d1wuYmlsaWJpbGlcLmNvbVwvYmFuZ3VtaS8sYXJlYUNsYXNzTmFtZTonZXBsaXN0X2VwX2xpc3Rfd3JhcHBlcl9fUHpMSGEnfSwKICAgICAgICAgIAogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIjbWd0di1wbGF5ZXItd3JhcCIsbm9kZVR5cGU6J2lkJyxtYXRjaDovXmh0dHBzPzpcL1wvd3d3Lm1ndHZcLmNvbVwvYnxsXC9bMC05XS8sYXJlYUNsYXNzTmFtZTonZXBpc29kZS1pdGVtcyd9LAoKICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiLngtcGxheWVyIixub2RlVHlwZTonY2xhc3MnLG1hdGNoOi90dlwuc29odVwuY29tXC92LyxhcmVhQ2xhc3NOYW1lOidzZXJpZXMtdGFiX3BhbmUnfSwKICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiI3BsYXllcldyYXAiLG5vZGVUeXBlOidpZCcsbWF0Y2g6L2ZpbG1cLnNvaHVcLmNvbVwvYWxidW1cLy99LAoKICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiI2xlX3BsYXlib3giLG5vZGVUeXBlOidpZCcsbWF0Y2g6L2xlXC5jb21cL3B0dlwvdnBsYXlcLy8sYXJlYUNsYXNzTmFtZTonanVqaV9ncmlkJ30sCgogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIjcGxheWVyIixub2RlVHlwZTonaWQnLG1hdGNoOi9wbGF5XC50dWRvdVwuY29tXC92X3Nob3dcL2lkXy99LAoKICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiI3BwdHZfcGxheXBhZ2VfYm94Iixub2RlVHlwZTonaWQnLG1hdGNoOi92XC5wcHR2XC5jb21cL3Nob3dcLy99LAoKICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiI3BsYXllciIsbm9kZVR5cGU6J2lkJyxtYXRjaDovdmlwXC4xOTA1LmNvbVwvcGxheVwvL30sCgogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIjdm9kUGxheWVyIixub2RlVHlwZTonaWQnLG1hdGNoOi93d3dcLjE5MDUuY29tXC92b2RcL3BsYXlcLy99LAogICAgICAgICAgICBdOwoKICAgICAgICAgICAgbGV0IGp4VmlkZW9XZWIgPSBqeFZpZGVvRGF0YS5maWx0ZXIoZnVuY3Rpb24oaXRlbSl7CgogICAgICAgICAgICAgICAgcmV0dXJuIGxvY2F0aW9uLmhyZWYubWF0Y2goaXRlbS5tYXRjaCk7CgogICAgICAgICAgICB9KQoKICAgICAgICAgICAgcGxheVZpZGVvQ2xhc3MuemhtTG9nb0RyYWcoJ3ZpZGVvJyxqeFZpZGVvV2ViKTsKCiAgICAgICAgICAgIC8v5piv5ZCm5Zyo5pKt5pS+6aG1CiAgICAgICAgICAgIGlmKGp4VmlkZW9XZWIubGVuZ3RoID4gMCl7CgogICAgICAgICAgICAgICAgdmFyIHtmdW5jTmFtZSxtYXRjaDpub3dNYXRjaCxub2RlOm5vd05vZGUsbmFtZTpub3dOYW1lfSA9IGp4VmlkZW9XZWJbMF07CgogICAgICAgICAgICAgICAgLy/pvKDmoIfnu4/ov4fmmL7npLrnur/ot68KICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5wbGF5QnV0dG9uJykub25tb3VzZW92ZXI9KCk9PnsKCiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLnBsYXlMaW5lRGl2Iikuc3R5bGUuZGlzcGxheT0nYmxvY2snOwoKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcucGxheUJ1dHRvbicpLm9ubW91c2VvdXQ9KCk9PnsKCiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLnBsYXlMaW5lRGl2Iikuc3R5bGUuZGlzcGxheT0nbm9uZSc7CgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8v6YCJ5oup57q/6Lev6Kej5p6Q5pKt5pS+CgogICAgICAgICAgICAgICAgdmFyIHBsYXlMaW5lVGQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcucGxheUxpbmVUZCcpOwoKICAgICAgICAgICAgICAgIHBsYXlMaW5lVGQuZm9yRWFjaChmdW5jdGlvbihpdGVtKXsKCiAgICAgICAgICAgICAgICAgICAgaXRlbS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oKXsKCiAgICAgICAgICAgICAgICAgICAgICAgIHBsYXlMaW5lVGQuZm9yRWFjaChmdW5jdGlvbihlKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnNldEF0dHJpYnV0ZSgnY2xhc3MnLCdwbGF5TGluZVRkIHpobV9wbGF5X3ZpZGVvX2xpbmVfdWxfbGknKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkKCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0QXR0cmlidXRlKCdjbGFzcycsJ3BsYXlMaW5lVGQgemhtX3BsYXlfdmlkZW9fbGluZV91bF9saSB6aG1fbGluZV9zZWxlY3RlZCcpOwoKICAgICAgICAgICAgICAgICAgICAgICAgcGxheVZpZGVvQ2xhc3Muc2V0Q29va2llKCdwbGF5TGluZUFjdGlvbicsdGhpcy5nZXRBdHRyaWJ1dGUoJ3VybCcpLDMwKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKEdNX2dldFZhbHVlKCd2aWRlb1BsYXlMaW5lQWRkJykgIT0gMjIpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBub3dXZWJOb2RlID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcihub3dOb2RlKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihub3dXZWJOb2RlKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm93V2ViTm9kZS5pbm5lckhUTUwgPSBwbGF5SnhIdG1sOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcGxheUlmcmFtZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNwbGF5SWZyYW1lJyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXlJZnJhbWUuc3JjPSBpdGVtLmdldEF0dHJpYnV0ZSgndXJsJykrbG9jYXRpb24uaHJlZjsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ+inhumikee9keermee7k+eCueS4jeWtmOWcqCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93Lm9wZW4oaXRlbS5nZXRBdHRyaWJ1dGUoJ3VybCcpK2xvY2F0aW9uLmhyZWYpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIH0pCgogICAgICAgICAgICAgICAgfSkKCiAgICAgICAgICAgICAgICAvKi0t54m55q6K5aSE55CGLS0qLwogICAgICAgICAgICAgICAgLy/kvJjphbfljrvlub/lkYoKICAgICAgICAgICAgICAgIGlmKG5vd05vZGU9PSIjcGxheWVyIil7CgogICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsKCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB5b3VrdUFkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmFkdmVydGlzZS1sYXllcicpOwoKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHlrQWQgPSB5b3VrdUFkLmxhc3RDaGlsZDsKCiAgICAgICAgICAgICAgICAgICAgICAgIHlrQWQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh5a0FkKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5rdWktZGFzaGJvYXJkLTAnKS5zdHlsZT0nZGlzcGxheTpmbGV4JzsKCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwbGF5VmlkZW8gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcudmlkZW8tbGF5ZXIgdmlkZW8nKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHBsYXlWaWRlby5wbGF5KCk7CgogICAgICAgICAgICAgICAgICAgICAgICBsZXQgbj0wOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy/mmoLlgZwKICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmt1aS1wbGF5LWljb24tMCcpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbigpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2aWRlbyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy52aWRlby1sYXllciB2aWRlbycpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKG4rKyUyID09IDApewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlby5wYXVzZSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlby5wbGF5KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHBsYXlWaWRlby5hZGRFdmVudExpc3RlbmVyKCd0aW1ldXBkYXRlJyxmdW5jdGlvbigpeyAvL+aSreaUvuaXtumXtOaUueWPmAoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB5b3VrdUFkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmFkdmVydGlzZS1sYXllcicpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB5a0FkID0geW91a3VBZC5sYXN0Q2hpbGQ7CgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHlrQWQpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5a0FkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoeWtBZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmt1aS1kYXNoYm9hcmQtMCcpLnN0eWxlPSdkaXNwbGF5OmZsZXgnOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50Lm9ua2V5ZG93biA9IGZ1bmN0aW9uKGV2ZW50KXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdmlkZW8gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcudmlkZW8tbGF5ZXIgdmlkZW8nKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihldmVudC5rZXlDb2RlPT0zOSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvLmN1cnJlbnRUaW1lID0gdmlkZW8uY3VycmVudFRpbWUgKyA1OwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGV2ZW50LmtleUNvZGU9PTM3KXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW8uY3VycmVudFRpbWUgPSB2aWRlby5jdXJyZW50VGltZSAtIDU7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIH0sMzAwMCkKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8v54ix5aWH6Im65Y675bm/5ZGKCiAgICAgICAgICAgICAgICBpZihub3dOb2RlPT0iI2ZsYXNoYm94Iil7CgogICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsKCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkb20gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuc2tpcHBhYmxlLWFmdGVyJyk7CgogICAgICAgICAgICAgICAgICAgICAgICBpZihkb20pewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbS5jbGljaygpOwoKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB9LDMwMDApCgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8v6IW+6K6v5Y67dmlw5by556qXCiAgICAgICAgICAgICAgICBpZihub3dOb2RlPT0iI3BsYXllci1jb250YWluZXIiKXsKCiAgICAgICAgICAgICAgICAgICAgbGV0IG4gPSAwOwoKICAgICAgICAgICAgICAgICAgICBsZXQgdGltZXIgPSBzZXRJbnRlcnZhbChmdW5jdGlvbigpewoKICAgICAgICAgICAgICAgICAgICAgICAgaWYobisrIDwgMTAwKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcGFuZWxUaXBWaXAgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcucGFuZWwtb3ZlcmxheScpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBhbmVsVGlwVmlwKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFuZWxUaXBWaXAuc3R5bGUuZGlzcGxheT0nbm9uZSc7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGltZXIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aW1lcik7CgogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIH0sMTAwKQoKCgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8v5LmQ6KeG6YCJ6ZuG5aSE55CGCiAgICAgICAgICAgICAgICBpZihub3dOb2RlID09ICIjbGVfcGxheWJveCIpewoKICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgICAgICAgICBsZXQgakJsb2NrID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmpfYmxvY2snKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFqQmxvY2spIHJldHVybjsKCiAgICAgICAgICAgICAgICAgICAgICAgIGZvcihsZXQgaT0wO2k8akJsb2NrLmxlbmd0aDtpKyspewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2aWRlb0lkID0gakJsb2NrW2ldLmdldEF0dHJpYnV0ZSgnZGF0YS12aWQnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGluayA9IGBodHRwczovL3d3dy5sZS5jb20vcHR2L3ZwbGF5LyR7dmlkZW9JZH0uaHRtbGA7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgakJsb2NrW2ldLmZpcnN0Q2hpbGQuc2V0QXR0cmlidXRlKCdocmVmJyxsaW5rKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sMzAwMCkKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvL0Lnq5nlpKfkvJrlkZh1cmzlpITnkIbvvIzpobXpnaJjbGFzc+S4jeS4gOiHtAogICAgICAgICAgICAgICAgaWYobm93Tm9kZSA9PSAiLnBsYXllci1jb250YWluZXIiKXsKCiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpewoKICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5wbGF5ZXItY29udGFpbmVyJykgJiYgIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5icHgtcGxheWVyLWNvbnRhaW5lcicpKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3dOb2RlID0gJy5wbGF5ZXItbWFzayc7CgogICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3dOb2RlID0gJy5icHgtcGxheWVyLWNvbnRhaW5lcic7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgfSwzMDAwKQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8q6IW+6K6v6KeG6aKR54K55Ye75YW25a6D6KeG6aKR6Lez6L2sKi8KICAgICAgICAgICAgICAgIGlmKG5vd05hbWU9PSdxcVBDJyl7CgogICAgICAgICAgICAgICAgICAgIGxldCBmaWd1cmUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuZmlndXJlJyk7CgogICAgICAgICAgICAgICAgICAgIGxldCBmaWd1cmVEZXRhaWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuZmlndXJlX2RldGFpbCcpOwoKICAgICAgICAgICAgICAgICAgICBsZXQgbGlzdEl0ZW0gPSBbLi4uZmlndXJlLC4uLmZpZ3VyZURldGFpbF07CgogICAgICAgICAgICAgICAgICAgIGlmKGxpc3RJdGVtLmxlbmd0aCA+IDApewoKICAgICAgICAgICAgICAgICAgICAgICAgbGlzdEl0ZW0uZm9yRWFjaChmdW5jdGlvbihpdGVtKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbigpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGluayA9IHRoaXMuZ2V0QXR0cmlidXRlKCdocmVmJyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGxpbmspewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24uaHJlZiA9IGxpbms7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCgogICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsKCiAgICAgICAgICAgICAgICAgICAgbGV0IHZpZGVvU2VsZWN0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLicranhWaWRlb1dlYlswXS5hcmVhQ2xhc3NOYW1lKTsKCiAgICAgICAgICAgICAgICAgICAgaWYodmlkZW9TZWxlY3QubGVuZ3RoPT0wKXtjb25zb2xlLmxvZygn6K+l572R56uZ5pKt5pS+5Yy657G75ZCN5pS55Y+YJyk7cmV0dXJuO30KCiAgICAgICAgICAgICAgICAgICAgdmlkZW9TZWxlY3QuZm9yRWFjaChmdW5jdGlvbihpdGVtKXsKCiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKGUpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24uaHJlZj1sb2NhdGlvbi5ocmVmOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sMTAwMCkKCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0sMjAwMCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBwbGF5TXVzaWNGdW5jKCl7CgogICAgICAgICAgICBpZihzZWxmLmZyYW1lRWxlbWVudCAmJiBzZWxmLmZyYW1lRWxlbWVudC50YWdOYW1lID09ICJJRlJBTUUiKXsKCiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBwbGF5TXVzaWNDbGFzcyA9IG5ldyBQbGF5TXVzaWNDbGFzcygpOwoKICAgICAgICAgICAgdmFyIG11c2ljSWQgPSBNYXRoLmNlaWwoTWF0aC5yYW5kb20oKSoxMDAwMDAwMDApOwoKICAgICAgICAgICAgLy9uZXRlYXNlIOi3r+eUseS4pOasoe+8jOmcgOmHjeWumuS5iQogICAgICAgICAgICB2YXIgbmV3VXJsID0gbG9jYXRpb24uaHJlZjsKCiAgICAgICAgICAgIGxldCBqeE11c2ljV2ViID0ganhNdXNpY1swXS53ZWIuZmlsdGVyKGZ1bmN0aW9uKGl0ZW0pewoKICAgICAgICAgICAgICAgIHJldHVybiBuZXdVcmwubWF0Y2goaXRlbS5tYXRjaCk7CgogICAgICAgICAgICB9KQoKICAgICAgICAgICAgaWYoanhNdXNpY1dlYi5sZW5ndGgpewoKICAgICAgICAgICAgICAgIGxldCB0aW1lclpobUljb24gPSBzZXRJbnRlcnZhbChmdW5jdGlvbigpewoKICAgICAgICAgICAgICAgICAgICBpZiAoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3pobUljb24nKSl7CgogICAgICAgICAgICAgICAgICAgICAgICBjbGVhckludGVydmFsKHRpbWVyWmhtSWNvbik7IC8vIOWPlua2iOWumuaXtuWZqAoKICAgICAgICAgICAgICAgICAgICAgICAgaWYoanhNdXNpY1dlYlswXS5uYW1lPT0na3V3bycpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbnRyb2wgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuaWNvbi1iYXJfaWNvbl9kb3dubG9hZF8nKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGljb24gPSBjb250cm9sLmNsb25lTm9kZSh0cnVlKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbi5jbGFzc05hbWUgPSAnJzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbi5zdHlsZT0nbWFyZ2luLWxlZnQ6MTBweDsnOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uLmlubmVySFRNTCA9ICI8YSBzdHlsZT0nZm9udC1zaXplOjEwcHg7d2hpdGUtc3BhY2U6IG5vd3JhcDtjdXJzb3I6cG9pbnRlcjtjb2xvcjojNTU1OycgaWQ9J2t1d29Eb3dubG9hZCc+5LiL6L29PC9hPiI7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb250cm9scyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5jb2xfcicpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9scy5iZWZvcmUoaWNvbik7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNrdXdvRG93bmxvYWQnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhdWRpb1NyYyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoImF1ZGlvIikuc3JjOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNvbmdOYW1lID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmNvbnRyb2wgLnNvbmdfbmFtZScpLnRpdGxlOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGFydGlzdCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5jb250cm9sIC5hcnRpc3QnKS50aXRsZTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2VDbGFzcy5MUl9kb3dubG9hZChhdWRpb1NyYyxzb25nTmFtZSsnLScrYXJ0aXN0KycubXAzJyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwyMDAwKQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBpZihqeE11c2ljV2ViWzBdLm5hbWU9PSd4aW1hbGF5YScpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL+aSreaUvuWZqOWIm+W7uuS4i+i9vWljb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgeG1Db250cm9scyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy54bS1wbGF5ZXItb3ByYXRpb25zJyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb250cm9sID0geG1Db250cm9scy5xdWVyeVNlbGVjdG9yKCdhOm50aC1vZi10eXBlKDIpJyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpY29uID0gY29udHJvbC5jbG9uZU5vZGUodHJ1ZSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb24uaW5uZXJIVE1MID0gIjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTBweDt3aGl0ZS1zcGFjZTogbm93cmFwO2N1cnNvcjpwb2ludGVyO2NvbG9yOiNGRkY7JyBpZD0neGltYURvd25sb2FkJz7kuIvovb08L3NwYW4+IjsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1Db250cm9scy5zdHlsZT0ncG9zaXRpb246IHJlbGF0aXZlO21hcmdpbi1sZWZ0Oi0yMHB4Oyc7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy54bS1wbGF5ZXItcHJvZ3Jlc3MnKS5zdHlsZS53aWR0aD0nNDUwcHgnOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcueG0tcGxheWVyLXBsYXl0aW1lJykuc3R5bGU9J3Bvc2l0aW9uOiBhYnNvbHV0ZTtyaWdodDo0MHB4Oyc7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtQ29udHJvbHMucHJlcGVuZChpY29uKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL+aSreaUvuWZqOS4i+i9veS6i+S7tgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN4aW1hRG93bmxvYWQnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmbVRpdGxlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmZtLXRpdGxlJyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZm1UaXRsZU1hdGNoID0gZm1UaXRsZS5ocmVmLm1hdGNoKC9eaHR0cHM/OlwvXC93d3dcLnhpbWFsYXlhXC5jb21cL3NvdW5kXC8oXFMqKSQvKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB1cmwgPSAnaHR0cHM6Ly9tb2JpbGUueGltYWxheWEuY29tL21vYmlsZS1wbGF5cGFnZS90cmFjay92My9iYXNlSW5mby8nK25ldyBEYXRlKCkuZ2V0VGltZSgpKyc/ZGV2aWNlPXdlYiZ0cmFja0lkPScrZm1UaXRsZU1hdGNoWzFdOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheU11c2ljQ2xhc3MucmVxdWVzdCgnZ2V0Jyx1cmwpLnRoZW4oKHJlc3VsdCk9PnsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGF0YSA9IEpTT04ucGFyc2UocmVzdWx0KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcGxheVVybCA9IGRhdGEudHJhY2tJbmZvLnBsYXlVcmxMaXN0WzFdLnVybDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3RyMSA9IHBsYXlVcmwucmVwbGFjZUFsbCgnLScsJysnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3RyMiA9IHN0cjEucmVwbGFjZUFsbCgnXycsJy8nKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbnVtID0gc3RyMi5sZW5ndGglNDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihudW0pewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIyICs9ICc9PT09Jy5zdWJzdHIobnVtKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGVjcnlwdGVkID0gQ3J5cHRvSlMuQUVTLmRlY3J5cHQoewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaXBoZXJ0ZXh0OiBDcnlwdG9KUy5lbmMuQmFzZTY0LnBhcnNlKHN0cjIpCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgQ3J5cHRvSlMuZW5jLkhleC5wYXJzZSgiYWFhZDNlNGZkNTQwYjBmNzlkY2E5NTYwNmU3MmJmOTMiKSwgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlOiBDcnlwdG9KUy5tb2RlLkVDQiwKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZzogQ3J5cHRvSlMucGFkLlBrY3M3CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkudG9TdHJpbmcoQ3J5cHRvSlMuZW5jLlV0ZjgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGRlY3J5cHRlZCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZGVjcnlwdGVkKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzZUNsYXNzLkxSX2Rvd25sb2FkKGRlY3J5cHRlZCxkYXRhLnRyYWNrSW5mby50aXRsZSsnLm1wMycpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCfop6Plr4blnLDlnYDlpLHotKUnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8v6aG16Z2i5YiX6KGo5Yib5bu65om56YeP5LiL6L29CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRpbWVyID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB1cmxNYXRjaCA9IGxvY2F0aW9uLmhyZWYubWF0Y2goL15odHRwczpcL1wvd3d3LnhpbWFsYXlhLmNvbVwvYWxidW1cL1swLTldKy8pOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYodXJsTWF0Y2gpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzb3VuZExpc3QgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjYW5jaG9yX3NvdW5kX2xpc3QnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihzb3VuZExpc3QpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc291bmRMaXN0SGVhZCA9IHNvdW5kTGlzdC5xdWVyeVNlbGVjdG9yKCcuaGVhZCcpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc291bmRMaXN0SGVhZFRpdGxlID0gc291bmRMaXN0SGVhZC5xdWVyeVNlbGVjdG9yKCcuc29ydCcpLmxhc3RDaGlsZDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGJhdGNoRG93bmxvYWREb20gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjYmF0Y2hEb3dubG9hZCcpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighYmF0Y2hEb3dubG9hZERvbSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGF0YSA9IFt7bmFtZTon5om56YeP5LiL6L29JyxpZDonYmF0Y2hEb3dubG9hZCd9LHtuYW1lOifph43nva4nLGlkOidyZXNldCd9LHtuYW1lOiflhajpgIknLGlkOidzZWxlY3RBbGwnfV07CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmZvckVhY2goZnVuY3Rpb24oaXRlbSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbnRyb2wgPSBzb3VuZExpc3RIZWFkVGl0bGUuY2xvbmVOb2RlKHRydWUpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wuc2V0QXR0cmlidXRlKCdpZCcsaXRlbS5pZCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbC5pbm5lclRleHQgPSBpdGVtLm5hbWU7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291bmRMaXN0SGVhZFRpdGxlLmFmdGVyKGNvbnRyb2wpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wuYmVmb3JlKCIgfCAiKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3NlbGVjdEFsbCcpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbigpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB6aG1DaGVja2JveCA9IHNvdW5kTGlzdC5xdWVyeVNlbGVjdG9yQWxsKCJpbnB1dFtuYW1lPSd6aG1DaGVja2JveCddIik7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemhtQ2hlY2tib3guZm9yRWFjaChmdW5jdGlvbihpdGVtKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWl0ZW0uY2hlY2tlZCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmNoZWNrZWQ9dHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3Jlc2V0JykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHpobUNoZWNrYm94ID0gc291bmRMaXN0LnF1ZXJ5U2VsZWN0b3JBbGwoImlucHV0W25hbWU9J3pobUNoZWNrYm94J10iKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aG1DaGVja2JveC5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmNoZWNrZWQgPSBmYWxzZTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy/mraPluo/lgJLluo/kuovku7YKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291bmRMaXN0SGVhZC5xdWVyeVNlbGVjdG9yKCcuc29ydCcpLmZpcnN0Q2hpbGQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5TXVzaWNDbGFzcy54bWx5Q3JlYXRlQ2hlY2tib3goKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LDIwMDApCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdW5kTGlzdEhlYWRUaXRsZS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXlNdXNpY0NsYXNzLnhtbHlDcmVhdGVDaGVja2JveCgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sMjAwMCkKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2JhdGNoRG93bmxvYWQnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgemhtQ2hlY2tib3ggPSBzb3VuZExpc3QucXVlcnlTZWxlY3RvckFsbCgiaW5wdXRbbmFtZT0nemhtQ2hlY2tib3gnXSIpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpobUNoZWNrYm94LmZvckVhY2goZnVuY3Rpb24oaXRlbSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGl0ZW0uY2hlY2tlZCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc2NyTWF0Y2ggPSBpdGVtLnZhbHVlLm1hdGNoKC9cL3NvdW5kXC8oWzAtOV0rKS8pOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHVybCA9ICdodHRwczovL21vYmlsZS54aW1hbGF5YS5jb20vbW9iaWxlLXBsYXlwYWdlL3RyYWNrL3YzL2Jhc2VJbmZvLycrbmV3IERhdGUoKS5nZXRUaW1lKCkrJz9kZXZpY2U9d2ViJnRyYWNrSWQ9JytzY3JNYXRjaFsxXTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXlNdXNpY0NsYXNzLnJlcXVlc3QoJ2dldCcsdXJsKS50aGVuKChyZXN1bHQpPT57CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGEgPSBKU09OLnBhcnNlKHJlc3VsdCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBsYXlVcmwgPSBkYXRhLnRyYWNrSW5mby5wbGF5VXJsTGlzdFsxXS51cmw7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0cjEgPSBwbGF5VXJsLnJlcGxhY2VBbGwoJy0nLCcrJyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0cjIgPSBzdHIxLnJlcGxhY2VBbGwoJ18nLCcvJyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG51bSA9IHN0cjIubGVuZ3RoJTQ7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYobnVtKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyMiArPSAnPT09PScuc3Vic3RyKG51bSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRlY3J5cHRlZCA9IENyeXB0b0pTLkFFUy5kZWNyeXB0KHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2lwaGVydGV4dDogQ3J5cHRvSlMuZW5jLkJhc2U2NC5wYXJzZShzdHIyKQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIENyeXB0b0pTLmVuYy5IZXgucGFyc2UoImFhYWQzZTRmZDU0MGIwZjc5ZGNhOTU2MDZlNzJiZjkzIiksIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZTogQ3J5cHRvSlMubW9kZS5FQ0IsCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IENyeXB0b0pTLnBhZC5Qa2NzNwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLnRvU3RyaW5nKENyeXB0b0pTLmVuYy5VdGY4KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihkZWNyeXB0ZWQpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlQ2xhc3MuTFJfZG93bmxvYWQoZGVjcnlwdGVkLGRhdGEudHJhY2tJbmZvLnRpdGxlKycubXAzJyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ+ino+WvhuWcsOWdgOWksei0pScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHpobUNoZWNrYm94PSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuemhtQ2hlY2tib3gnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoemhtQ2hlY2tib3gubGVuZ3RoID09IDApewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheU11c2ljQ2xhc3MueG1seUNyZWF0ZUNoZWNrYm94KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy/nv7vpobXkuovku7YKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBhZ2VCYXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcucGFnaW5hdGlvbi1wYWdlJyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBhZ2VCYXIpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZUJhci5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXlNdXNpY0NsYXNzLnhtbHlDcmVhdGVDaGVja2JveCgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sMjAwMCkKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy/ot7PpobXkuovku7YKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcGFnZUxpbmsgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdidXR0b25bdHlwZT1zdWJtaXRdJyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBhZ2VMaW5rKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VMaW5rLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbigpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheU11c2ljQ2xhc3MueG1seUNyZWF0ZUNoZWNrYm94KCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwxMDAwKQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ+acquWMuemFjeWIsOWIl+ihqOWcsOWdgCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sNTAwKQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sMTAwMCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy/lhajlsYDngrnlh7vkuovku7YKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbihlKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG9iakxpbmsgPSB7fTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wYXRoLmZvckVhY2goZnVuY3Rpb24oaXRlbSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihpdGVtLmhyZWYpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iakxpbmsuaHJlZiA9IGl0ZW0uaHJlZj9pdGVtLmhyZWY6Jyc7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqTGluay50YXJnZXQgPSBpdGVtLnRhcmdldD9pdGVtLnRhcmdldDonJzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYob2JqTGluay5ocmVmICYmIG9iakxpbmsudGFyZ2V0ICE9ICdfYmxhbmsnKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uLmhyZWYgPSBvYmpMaW5rLmhyZWY7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKCiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGp4TXVzaWNXZWJbMF0ubmFtZT09J2t1Z291Jyl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGFEb20gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdhJyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgYURvbS5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGF0YU9iaiA9IGl0ZW0uZ2V0QXR0cmlidXRlKCdkYXRhb2JqJyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGRhdGFPYmopewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGFvYmonKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uc2V0QXR0cmlidXRlKCd0YXJnZXQnLCdfYmxhbmsnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoY291cG9uVXJsLmluZGV4T2YoJ21peHNvbmcnKSE9LTEgfHwgY291cG9uVXJsLmluZGV4T2YoJ3NvbmcnKSAhPSAtMSB8fCBjb3Vwb25VcmwuaW5kZXhPZignc2hhcmUnKSAhPSAtMSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2b2x1bWVEb20gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjdm9sdW1lJyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZG93bmxvYWREb20gPSB2b2x1bWVEb20uY2xvbmVOb2RlKHRydWUpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG93bmxvYWREb20ucmVtb3ZlQXR0cmlidXRlKCdpZCcpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG93bmxvYWREb20uc3R5bGU9J21hcmdpbi10b3A6MzBweCc7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3dubG9hZERvbS5pbm5lckhUTUwgPSAiPGEgc3R5bGU9J2NvbG9yOiNmZmY7Zm9udC1zaXplOjEwcHg7d2hpdGUtc3BhY2U6bm93cmFwO2N1cnNvcjpwb2ludGVyOycgaWQ9J2t1Z291RG93bmxvYWQnIGphdmFzY3JpcHQ6dm9pZCgwKTs+5LiL6L29PC9hPiI7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWVEb20uYmVmb3JlKGRvd25sb2FkRG9tKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZURvbS5zdHlsZT0nbGVmdDo1MHB4Oyc7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjbW9kZScpLnN0eWxlPSdtYXJnaW4tbGVmdDo5MHB4Oyc7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjcGJfZG93bmxvYWQnKS5zdHlsZT0nbWFyZ2luLWxlZnQ6MTMwcHg7JzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNwYl9zaGFyZScpLnN0eWxlPSdtYXJnaW4tbGVmdDoxNzBweDsnOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2xpc3QnKS5zdHlsZT0ncmlnaHQ6LTIwcHg7JzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNrdWdvdURvd25sb2FkJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGF1ZGlvID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI215QXVkaW8nKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYXVkaW9TcmMgPSBhdWRpby5nZXRBdHRyaWJ1dGUoJ3NyYycpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzaW5nZXJOYW1lID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnNpbmdlck5hbWUnKS50aXRsZTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc29uZ05hbWUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjc29uZ05hbWVUZW1wJykudGl0bGU7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzZUNsYXNzLkxSX2Rvd25sb2FkKGF1ZGlvU3JjLHNvbmdOYW1lKyctJytzaW5nZXJOYW1lLnN1YnN0cigwLHNpbmdlck5hbWUubGVuZ3RoLTEpKycubXAzJyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LDEwMDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhjb3Vwb25VcmwpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBpZihqeE11c2ljV2ViWzBdLm5hbWU9PSduZXRlYXNlJyAmJiBsb2NhdGlvbi5ocmVmID09ICdodHRwczovL211c2ljLjE2My5jb20vc3QvZG93bmxvYWQnKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB6aG1QbGF5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3pobUljb24nKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5TXVzaWNDbGFzcy56aG1Mb2dvKCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheU11c2ljQ2xhc3MuemhtTG9nb0RyYWcoJ211c2ljJyxqeE11c2ljV2ViKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIH0saWNvbldhaXRUaW1lKTsKCiAgICAgICAgICAgICAgICAgICAgfWVsc2V7CgogICAgICAgICAgICAgICAgICAgICAgICBwbGF5TXVzaWNDbGFzcy5jcmVhdGVFbGVtZW50KCdkaXYnLCd6aG1JY29uJyk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIH0pCgogICAgICAgICAgICAgICAgfWVsc2V7CgogICAgICAgICAgICAgICAgICAgIGxldCB6aG1QbGF5RG9tID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3pobUljb24nKTsKCiAgICAgICAgICAgICAgICAgICAgaWYoemhtUGxheURvbSl7CgogICAgICAgICAgICAgICAgICAgICAgICB6aG1QbGF5RG9tLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoemhtUGxheURvbSk7CgogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ+W9k+WJjemfs+mikee9keWdgOayoeaciea3u+WKoOWMuemFjeaIluWMuemFjemUmeivrycpOwoKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiB6aE5pY2VGdW5jKCl7CgogICAgICAgICAgICB2YXIgemhDbGFzcyA9IG5ldyBaaENsYXNzKCk7CgogICAgICAgICAgICAvL+WFs+mXreeZu+W9leW8ueahhgogICAgICAgICAgICAoYXN5bmMgZnVuY3Rpb24oKXsKCiAgICAgICAgICAgICAgICBsZXQgbG9naW5Nb2RhbFdyYXBwZXIgPSBhd2FpdCBCYXNlQ2xhc3MuZ2V0RWxlbWVudCgiLk1vZGFsLXdyYXBwZXIiKTsKCiAgICAgICAgICAgICAgICBpZihsb2dpbk1vZGFsV3JhcHBlcil7CgogICAgICAgICAgICAgICAgICAgIGxldCBjbG9zZUJ1dHRvbiA9IGxvZ2luTW9kYWxXcmFwcGVyLnF1ZXJ5U2VsZWN0b3IoJy5Nb2RhbC1jbG9zZUJ1dHRvbicpOwoKICAgICAgICAgICAgICAgICAgICBpZihjbG9zZUJ1dHRvbil7CgogICAgICAgICAgICAgICAgICAgICAgICBjbG9zZUJ1dHRvbi5jbGljaygpOwoKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgfSkoKQoKICAgICAgICAgICAgdmFyIHpoRGF0YSA9IFsKICAgICAgICAgICAgICAgIHtmdW5jOidyZW1vdmVWaWRlbycsaXNPcGVuOkdNX2dldFZhbHVlKCdyZW1vdmVWaWRlbycsJzAnKSxpc09uc2Nyb2xsOjEsb25sb2FkOjF9LAogICAgICAgICAgICAgICAge2Z1bmM6J3JlbW92ZUFEJyxpc09wZW46R01fZ2V0VmFsdWUoJ3JlbW92ZUFEJywnMjInKSxpc09uc2Nyb2xsOjAsb25sb2FkOjB9LAogICAgICAgICAgICAgICAge2Z1bmM6J2Rvd25sb2FkVmlkZW8nLGlzT3BlbjpHTV9nZXRWYWx1ZSgnZG93bmxvYWRWaWRlbycsJzIyJyksaXNPbnNjcm9sbDowLG9ubG9hZDowfSwKICAgICAgICAgICAgICAgIHtmdW5jOidyZW1vdmVSaWdodCcsaXNPcGVuOkdNX2dldFZhbHVlKCdyZW1vdmVSaWdodCcsJzAnKSxpc09uc2Nyb2xsOjAsb25sb2FkOjB9LAogICAgICAgICAgICAgICAge2Z1bmM6J2NoYW5nZUxpbmsnLGlzT3BlbjpHTV9nZXRWYWx1ZSgnY2hhbmdlTGluaycsJzIyJyksaXNPbnNjcm9sbDowLG9ubG9hZDowfSwKICAgICAgICAgICAgICAgIHtmdW5jOidyZW1vdmVLZXl3b3JkJyxpc09wZW46R01fZ2V0VmFsdWUoJ3JlbW92ZUtleXdvcmQnLCcwJyksaXNPbnNjcm9sbDoxLG9ubG9hZDoxfSwKICAgICAgICAgICAgICAgIHtmdW5jOidzaG93U3BlY2lhbENvbHVtbicsaXNPcGVuOkdNX2dldFZhbHVlKCdzcGVjaWFsQ29sdW1uJywnMjInKSxpc09uc2Nyb2xsOjEsb25sb2FkOjF9LAogICAgICAgICAgICAgICAge2Z1bmM6J3Nob3dWaWRlb1RpdGxlJyxpc09wZW46R01fZ2V0VmFsdWUoJ3ZpZGVvVGl0bGUnLCcyMicpLGlzT25zY3JvbGw6MSxvbmxvYWQ6MX0sCiAgICAgICAgICAgICAgICB7ZnVuYzoncmVtb3ZlQXV0aG9yTmFtZScsaXNPcGVuOkdNX2dldFZhbHVlKCdyZW1vdmVBdXRob3JOYW1lJywnMjInKSxpc09uc2Nyb2xsOjEsb25sb2FkOjF9LAogICAgICAgICAgICAgICAge2Z1bmM6J3JlbW92ZVlhbnh1YW4nLGlzT3BlbjpHTV9nZXRWYWx1ZSgncmVtb3ZlWWFueHVhbicsJzAnKSxpc09uc2Nyb2xsOjEsb25sb2FkOjF9LAogICAgICAgICAgICAgICAge2Z1bmM6J2Nsb3NlQXV0aG9yJyxpc09wZW46R01fZ2V0VmFsdWUoJ3JlbW92ZUF1dGhvck5hbWUnLDIyKSxpc09uc2Nyb2xsOjAsb25sb2FkOjF9LAogICAgICAgICAgICBdCgogICAgICAgICAgICB6aERhdGEuZm9yRWFjaChmdW5jdGlvbihpdGVtKXsKICAgICAgICAgICAgICAgIGlmKGl0ZW0uaXNPcGVuPT0yMiAmJiBpdGVtLm9ubG9hZD09MCl7CiAgICAgICAgICAgICAgICAgICAgemhDbGFzc1tpdGVtLmZ1bmNdKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pCgogICAgICAgICAgICB3aW5kb3cub25sb2FkPWZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICB6aERhdGEuZm9yRWFjaChmdW5jdGlvbihpdGVtKXsKICAgICAgICAgICAgICAgICAgICBpZihpdGVtLmlzT3Blbj09MjIgJiYgaXRlbS5vbmxvYWQ9PTEpewogICAgICAgICAgICAgICAgICAgICAgICB6aENsYXNzW2l0ZW0uZnVuY10oKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICB9CiAgICAgICAgICAgIHdpbmRvdy5vbnNjcm9sbCA9IGZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgdmFyIHNjcm9sbFRvcCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3A7CgogICAgICAgICAgICAgICAgaWYoc2Nyb2xsVG9wID4gMjAwKXsKCiAgICAgICAgICAgICAgICAgICAgemhEYXRhLmZvckVhY2goZnVuY3Rpb24oaXRlbSl7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGl0ZW0uaXNPcGVuPT0yMiAmJiBpdGVtLmlzT25zY3JvbGw9PTEpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpoQ2xhc3NbaXRlbS5mdW5jXSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSkKCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9CgogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gdGFvYmFvU2VhcmNoRnVuYyhpdGVtKXsKCiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CgogICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsZnVuY3Rpb24oKXsKCiAgICAgICAgICAgICAgICAoYXN5bmMgZnVuY3Rpb24gZ2V0Q29udHJvbHMoKXsKCiAgICAgICAgICAgICAgICAgICAgbGV0IHNlbGVjdHNEb20gPSBhd2FpdCBCYXNlQ2xhc3MuZ2V0RWxlbWVudCgnLm5leHQtY2hlY2tib3gtZ3JvdXAnKTsKCiAgICAgICAgICAgICAgICAgICAgaWYoc2VsZWN0c0RvbSl7CgogICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGFiZWxzID0gc2VsZWN0c0RvbS5xdWVyeVNlbGVjdG9yQWxsKCdsYWJlbCcpOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYobGFiZWxzLmxlbmd0aD4wKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMuZm9yRWFjaChmdW5jdGlvbihpdGVtKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGl0ZW1UZXh0ID0gaXRlbS5xdWVyeVNlbGVjdG9yKCcubmV4dC1jaGVja2JveC1sYWJlbCcpLmlubmVyVGV4dDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoaXRlbVRleHQ9PSflpKnnjKsnKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0YkxhYmVscyA9IGl0ZW0uY2xvbmVOb2RlKHRydWUpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGlucHV0RG9tID0gdGJMYWJlbHMucXVlcnlTZWxlY3RvcignaW5wdXQnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0RG9tLnZhbHVlPSdzZXJ2aWNlOnRhb2Jhbyc7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YkxhYmVscy5xdWVyeVNlbGVjdG9yKCcubmV4dC1jaGVja2JveC1sYWJlbCcpLmlubmVyVGV4dD0n5reY5a6dJzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uYmVmb3JlKHRiTGFiZWxzKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRiTGFiZWxzLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxzZWxlY3RUYW9iYW8pOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gc2VsZWN0VGFvYmFvKGUpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBnb29kc0xpc3QgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuQ29udGVudC0tY29udGVudElubmVyLS1RVlRjVTBNID4gZGl2ID4gYScpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGUudGFyZ2V0LmNsYXNzTmFtZT09J25leHQtY2hlY2tib3gtbGFiZWwnKXJldHVybjsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih0YkxhYmVscy5jbGFzc05hbWU9PSduZXh0LWNoZWNrYm94LXdyYXBwZXIgJyl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRiTGFiZWxzLmNsYXNzTmFtZT0nbmV4dC1jaGVja2JveC13cmFwcGVyIGNoZWNrZWQnOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb29kc0xpc3QuZm9yRWFjaChmdW5jdGlvbihpdGVtKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFpdGVtLmhyZWYubWF0Y2goL1wvXC9pdGVtXC50YW9iYW9cLmNvbVwvaXRlbVwuaHRtLykpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uc3R5bGU9J2Rpc3BsYXk6bm9uZSc7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRiTGFiZWxzLmNsYXNzTmFtZT0nbmV4dC1jaGVja2JveC13cmFwcGVyICc7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvb2RzTGlzdC5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5zdHlsZT0nZGlzcGxheTpibG9jayc7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL+WIhumhtQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcGFnZUJhciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5uZXh0LXBhZ2luYXRpb24tcGFnZXMnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VCYXIuZm9yRWFjaChmdW5jdGlvbihpdGVtKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbigpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8v6I635Y+W5o+S5YWl5ZWG5ZOB5YWD57Sg5pa55rOVCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLkNvbnRlbnQtLWNvbnRlbnRJbm5lci0tUVZUY1UwTScpLmFkZEV2ZW50TGlzdGVuZXIoJ0RPTU5vZGVJbnNlcnRlZCcsKGUpID0+IHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhRG9tID0gZS50YXJnZXQucXVlcnlTZWxlY3RvcignZGl2ID4gYScpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYURvbSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYodGJMYWJlbHMuY2xhc3NOYW1lPT0nbmV4dC1jaGVja2JveC13cmFwcGVyIGNoZWNrZWQnKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWFEb20uaHJlZi5tYXRjaCgvXC9cL2l0ZW1cLnRhb2Jhb1wuY29tXC9pdGVtXC5odG0vKSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhRG9tLnN0eWxlPSdkaXNwbGF5Om5vbmUnOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFEb20uc3R5bGU9J2Rpc3BsYXk6YmxvY2snOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy/lu7bov5/nrYnlvoXmlrnms5UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZ29vZHNMaXN0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLkNvbnRlbnQtLWNvbnRlbnRJbm5lci0tUVZUY1UwTSA+IGRpdiA+IGEnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHRiTGFiZWxzLmNsYXNzTmFtZT09J25leHQtY2hlY2tib3gtd3JhcHBlciBjaGVja2VkJyl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ29vZHNMaXN0LmZvckVhY2goZnVuY3Rpb24oZSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFlLmhyZWYubWF0Y2goL1wvXC9pdGVtXC50YW9iYW9cLmNvbVwvaXRlbVwuaHRtLykpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5zdHlsZT0nZGlzcGxheTpub25lJzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb29kc0xpc3QuZm9yRWFjaChmdW5jdGlvbihlKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5zdHlsZT0nZGlzcGxheTpibG9jayc7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LDMwMDApCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKCgogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB9KSgpOwoKICAgICAgICAgICAgfSkKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIGJhaWR1RnVuYygpewogICAgICAgIGxldCBwdCA9ICcnLCBzZWxlY3RMaXN0ID0gW10sIHBhcmFtcyA9IHt9LCBtb2RlID0gJycsIHdpZHRoID0gODAwLCBwYW4gPSB7fSwgY29sb3IgPSAnJywKICAgICAgICBkb2MgPSAkKGRvY3VtZW50KSwgcHJvZ3Jlc3MgPSB7fSwgcmVxdWVzdCA9IHt9LCBpbnMgPSB7fSwgaWRtID0ge307CiAgICAgICAgY29uc3QgdmVyc2lvbiA9ICc2LjEuMSc7CiAgICAgICAgY29uc3QgYXV0aG9yID0gJ0dyZWFzeUZvcmsnOwogICAgICAgIGNvbnN0IG5hbWUgPSAn572R55uY55u06ZO+5LiL6L295Yqp5omLJzsKICAgICAgICBjb25zdCBjdXN0b21DbGFzcyA9IHsKICAgICAgICBwb3B1cDogJ3BsLXBvcHVwJywKICAgICAgICBoZWFkZXI6ICdwbC1oZWFkZXInLAogICAgICAgIHRpdGxlOiAncGwtdGl0bGUnLAogICAgICAgIGNsb3NlQnV0dG9uOiAncGwtY2xvc2UnLAogICAgICAgIGNvbnRlbnQ6ICdwbC1jb250ZW50JywKICAgICAgICBpbnB1dDogJ3BsLWlucHV0JywKICAgICAgICBmb290ZXI6ICdwbC1mb290ZXInCiAgICB9OwoKICAgIGNvbnN0IHRlcm1pbmFsVHlwZSA9IHsKICAgICAgICB3YzogIldpbmRvd3MgQ01EIiwKICAgICAgICB3cDogIldpbmRvd3MgUG93ZXJTaGVsbCIsCiAgICAgICAgbHQ6ICJMaW51eCDnu4jnq68iLAogICAgICAgIGxzOiAiTGludXggU2hlbGwiLAogICAgICAgIG10OiAiTWFjT1Mg57uI56uvIiwKICAgIH07CgogICAgbGV0IHRvYXN0ID0gU3dhbC5taXhpbih7CiAgICAgICAgdG9hc3Q6IHRydWUsCiAgICAgICAgcG9zaXRpb246ICd0b3AnLAogICAgICAgIHNob3dDb25maXJtQnV0dG9uOiBmYWxzZSwKICAgICAgICB0aW1lcjogMzUwMCwKICAgICAgICB0aW1lclByb2dyZXNzQmFyOiBmYWxzZSwKICAgICAgICBkaWRPcGVuOiAodG9hc3QpID0+IHsKICAgICAgICAgICAgdG9hc3QuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VlbnRlcicsIFN3YWwuc3RvcFRpbWVyKTsKICAgICAgICAgICAgdG9hc3QuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsIFN3YWwucmVzdW1lVGltZXIpOwogICAgICAgIH0KICAgIH0pOwoKICAgIGNvbnN0IG1lc3NhZ2UgPSB7CiAgICAgICAgc3VjY2VzczogKHRleHQpID0+IHsKICAgICAgICAgICAgdG9hc3QuZmlyZSh7dGl0bGU6IHRleHQsIGljb246ICdzdWNjZXNzJ30pOwogICAgICAgIH0sCiAgICAgICAgZXJyb3I6ICh0ZXh0KSA9PiB7CiAgICAgICAgICAgIHRvYXN0LmZpcmUoe3RpdGxlOiB0ZXh0LCBpY29uOiAnZXJyb3InfSk7CiAgICAgICAgfSwKICAgICAgICB3YXJuaW5nOiAodGV4dCkgPT4gewogICAgICAgICAgICB0b2FzdC5maXJlKHt0aXRsZTogdGV4dCwgaWNvbjogJ3dhcm5pbmcnfSk7CiAgICAgICAgfSwKICAgICAgICBpbmZvOiAodGV4dCkgPT4gewogICAgICAgICAgICB0b2FzdC5maXJlKHt0aXRsZTogdGV4dCwgaWNvbjogJ2luZm8nfSk7CiAgICAgICAgfSwKICAgICAgICBxdWVzdGlvbjogKHRleHQpID0+IHsKICAgICAgICAgICAgdG9hc3QuZmlyZSh7dGl0bGU6IHRleHQsIGljb246ICdxdWVzdGlvbid9KTsKICAgICAgICB9CiAgICB9OwoKICAgIGxldCBiYXNlID0gewoKICAgICAgICBnZXRDb29raWUobmFtZSkgewogICAgICAgICAgICBsZXQgYXJyID0gZG9jdW1lbnQuY29va2llLnJlcGxhY2UoL1xzL2csICIiKS5zcGxpdCgnOycpOwogICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbCA9IGFyci5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgICAgICAgICAgICAgIGxldCB0ZW1wQXJyID0gYXJyW2ldLnNwbGl0KCc9Jyk7CiAgICAgICAgICAgICAgICBpZiAodGVtcEFyclswXSA9PT0gbmFtZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQodGVtcEFyclsxXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgIH0sCgogICAgICAgIGlzVHlwZShvYmopIHsKICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopLnJlcGxhY2UoL15cW29iamVjdCAoLispXF0kLywgJyQxJykudG9Mb3dlckNhc2UoKTsKICAgICAgICB9LAoKICAgICAgICBnZXRWYWx1ZShuYW1lKSB7CiAgICAgICAgICAgIHJldHVybiBHTV9nZXRWYWx1ZShuYW1lKTsKICAgICAgICB9LAoKICAgICAgICBzZXRWYWx1ZShuYW1lLCB2YWx1ZSkgewogICAgICAgICAgICBHTV9zZXRWYWx1ZShuYW1lLCB2YWx1ZSk7CiAgICAgICAgfSwKCiAgICAgICAgZ2V0U3RvcmFnZShrZXkpIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKGtleSkpOwogICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxTdG9yYWdlLmdldEl0ZW0oa2V5KTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIHNldFN0b3JhZ2Uoa2V5LCB2YWx1ZSkgewogICAgICAgICAgICBpZiAodGhpcy5pc1R5cGUodmFsdWUpID09PSAnb2JqZWN0JyB8fCB0aGlzLmlzVHlwZSh2YWx1ZSkgPT09ICdhcnJheScpIHsKICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShrZXksIEpTT04uc3RyaW5naWZ5KHZhbHVlKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGtleSwgdmFsdWUpOwogICAgICAgIH0sCgogICAgICAgIHNldENsaXBib2FyZCh0ZXh0KSB7CiAgICAgICAgICAgIEdNX3NldENsaXBib2FyZCh0ZXh0LCAndGV4dCcpOwogICAgICAgIH0sCgogICAgICAgIGUoc3RyKSB7CiAgICAgICAgICAgIHJldHVybiBidG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChzdHIpKSk7CiAgICAgICAgfSwKCiAgICAgICAgZChzdHIpIHsKICAgICAgICAgICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChlc2NhcGUoYXRvYihzdHIpKSk7CiAgICAgICAgfSwKCiAgICAgICAgZ2V0RXh0ZW5zaW9uKG5hbWUpIHsKICAgICAgICAgICAgY29uc3QgcmVnID0gLyg/IVwuKVx3KyQvOwogICAgICAgICAgICBpZiAocmVnLnRlc3QobmFtZSkpIHsKICAgICAgICAgICAgICAgIGxldCBtYXRjaCA9IG5hbWUubWF0Y2gocmVnKTsKICAgICAgICAgICAgICAgIHJldHVybiBtYXRjaFswXS50b1VwcGVyQ2FzZSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICB9LAoKICAgICAgICBzaXplRm9ybWF0KHZhbHVlKSB7CiAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gK3ZhbHVlKSB7CiAgICAgICAgICAgICAgICBsZXQgdW5pdCA9IFsiQiIsICJLQiIsICJNQiIsICJHQiIsICJUQiIsICJQQiIsICJFQiIsICJaQiIsICJZQiJdOwogICAgICAgICAgICAgICAgbGV0IGluZGV4ID0gTWF0aC5mbG9vcihNYXRoLmxvZyh2YWx1ZSkgLyBNYXRoLmxvZygxMDI0KSk7CiAgICAgICAgICAgICAgICBsZXQgc2l6ZSA9IHZhbHVlIC8gTWF0aC5wb3coMTAyNCwgaW5kZXgpOwogICAgICAgICAgICAgICAgc2l6ZSA9IHNpemUudG9GaXhlZCgxKTsKICAgICAgICAgICAgICAgIHJldHVybiBzaXplICsgdW5pdFtpbmRleF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgIH0sCgogICAgICAgIHNvcnRCeU5hbWUoYXJyKSB7CiAgICAgICAgICAgIGNvbnN0IGhhbmRsZSA9ICgpID0+IHsKICAgICAgICAgICAgICAgIHJldHVybiAoYSwgYikgPT4gewogICAgICAgICAgICAgICAgICAgIGNvbnN0IHAxID0gYS5maWxlbmFtZSA/IGEuZmlsZW5hbWUgOiBhLnNlcnZlcl9maWxlbmFtZTsKICAgICAgICAgICAgICAgICAgICBjb25zdCBwMiA9IGIuZmlsZW5hbWUgPyBiLmZpbGVuYW1lIDogYi5zZXJ2ZXJfZmlsZW5hbWU7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHAxLmxvY2FsZUNvbXBhcmUocDIsICJ6aC1DTiIpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgYXJyLnNvcnQoaGFuZGxlKCkpOwogICAgICAgIH0sCgogICAgICAgIGZpeEZpbGVuYW1lKG5hbWUpIHsKICAgICAgICAgICAgcmV0dXJuIG5hbWUucmVwbGFjZSgvWyE/JnxgIicqXC86PD5cXF0vZywgJ18nKTsKICAgICAgICB9LAoKICAgICAgICBibG9iRG93bmxvYWQoYmxvYiwgZmlsZW5hbWUpIHsKICAgICAgICAgICAgaWYgKGJsb2IgaW5zdGFuY2VvZiBCbG9iKSB7CiAgICAgICAgICAgICAgICBjb25zdCB1cmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpOwogICAgICAgICAgICAgICAgY29uc3QgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTsKICAgICAgICAgICAgICAgIGEuaHJlZiA9IHVybDsKICAgICAgICAgICAgICAgIGEuZG93bmxvYWQgPSBmaWxlbmFtZTsKICAgICAgICAgICAgICAgIGEuY2xpY2soKTsKICAgICAgICAgICAgICAgIFVSTC5yZXZva2VPYmplY3RVUkwodXJsKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIHBvc3QodXJsLCBkYXRhLCBoZWFkZXJzLCB0eXBlKSB7CiAgICAgICAgICAgIGlmICh0aGlzLmlzVHlwZShkYXRhKSA9PT0gJ29iamVjdCcpIHsKICAgICAgICAgICAgICAgIGRhdGEgPSBKU09OLnN0cmluZ2lmeShkYXRhKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4gewogICAgICAgICAgICAgICAgR01feG1saHR0cFJlcXVlc3QoewogICAgICAgICAgICAgICAgICAgIG1ldGhvZDogIlBPU1QiLCB1cmwsIGhlYWRlcnMsIGRhdGEsCiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiB0eXBlIHx8ICdqc29uJywKICAgICAgICAgICAgICAgICAgICBvbmxvYWQ6IChyZXMpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9PT0gJ2Jsb2InID8gcmVzb2x2ZShyZXMpIDogcmVzb2x2ZShyZXMucmVzcG9uc2UgfHwgcmVzLnJlc3BvbnNlVGV4dCk7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBvbmVycm9yOiAoZXJyKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpOwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgZ2V0KHVybCwgaGVhZGVycywgdHlwZSwgZXh0cmEpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsKICAgICAgICAgICAgICAgIGxldCByZXF1ZXN0T2JqID0gR01feG1saHR0cFJlcXVlc3QoewogICAgICAgICAgICAgICAgICAgIG1ldGhvZDogIkdFVCIsIHVybCwgaGVhZGVycywKICAgICAgICAgICAgICAgICAgICByZXNwb25zZVR5cGU6IHR5cGUgfHwgJ2pzb24nLAogICAgICAgICAgICAgICAgICAgIG9ubG9hZDogKHJlcykgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzLnN0YXR1cyA9PT0gMjA0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0T2JqLmFib3J0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZG1bZXh0cmEuaW5kZXhdID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSA9PT0gJ2Jsb2InKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMuc3RhdHVzID09PSAyMDAgJiYgYmFzZS5ibG9iRG93bmxvYWQocmVzLnJlc3BvbnNlLCBleHRyYS5maWxlbmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlcyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlcy5yZXNwb25zZSB8fCByZXMucmVzcG9uc2VUZXh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgb25wcm9ncmVzczogKHJlcykgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmEgJiYgZXh0cmEuZmlsZW5hbWUgJiYgZXh0cmEuaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcy50b3RhbCA+IDAgPyBwcm9ncmVzc1tleHRyYS5pbmRleF0gPSAocmVzLmxvYWRlZCAqIDEwMCAvIHJlcy50b3RhbCkudG9GaXhlZCgyKSA6IHByb2dyZXNzW2V4dHJhLmluZGV4XSA9IDAuMDA7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIG9ubG9hZHN0YXJ0KCkgewogICAgICAgICAgICAgICAgICAgICAgICBleHRyYSAmJiBleHRyYS5maWxlbmFtZSAmJiBleHRyYS5pbmRleCAmJiAocmVxdWVzdFtleHRyYS5pbmRleF0gPSByZXF1ZXN0T2JqKTsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIG9uZXJyb3I6IChlcnIpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycik7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBnZXRGaW5hbFVybCh1cmwsIGhlYWRlcnMpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsKICAgICAgICAgICAgICAgIGxldCByZXF1ZXN0T2JqID0gR01feG1saHR0cFJlcXVlc3QoewogICAgICAgICAgICAgICAgICAgIG1ldGhvZDogIkdFVCIsIHVybCwgaGVhZGVycywKICAgICAgICAgICAgICAgICAgICBvbmxvYWQ6IChyZXMpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXMuZmluYWxVcmwpOwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgb25lcnJvcjogKGVycikgPT4gewogICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyKTsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIHN0cmluZ2lmeShvYmopIHsKICAgICAgICAgICAgbGV0IHN0ciA9ICcnOwogICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7CiAgICAgICAgICAgICAgICBpZiAob2JqLmhhc093blByb3BlcnR5KGtleSkpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBvYmpba2V5XTsKICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9IGVuY29kZVVSSUNvbXBvbmVudChrZXkpICsgJz0nICsgZW5jb2RlVVJJQ29tcG9uZW50KHZhbHVlW2ldKSArICcmJzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSBlbmNvZGVVUklDb21wb25lbnQoa2V5KSArICc9JyArIGVuY29kZVVSSUNvbXBvbmVudCh2YWx1ZSkgKyAnJic7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBzdHIuc2xpY2UoMCwgLTEpOyAvLyDljrvmjonmnKvlsL7nmoQgIiYiCiAgICAgICAgfSwKCiAgICAgICAgc2xlZXAodGltZSkgewogICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIHRpbWUpKTsKICAgICAgICB9LAoKICAgICAgICBhZGRTdHlsZShpZCwgdGFnLCBjc3MpIHsKICAgICAgICAgICAgdGFnID0gdGFnIHx8ICdzdHlsZSc7CiAgICAgICAgICAgIGxldCBkb2MgPSBkb2N1bWVudCwgc3R5bGVEb20gPSBkb2MuZ2V0RWxlbWVudEJ5SWQoaWQpOwogICAgICAgICAgICBpZiAoc3R5bGVEb20pIHJldHVybjsKICAgICAgICAgICAgbGV0IHN0eWxlID0gZG9jLmNyZWF0ZUVsZW1lbnQodGFnKTsKICAgICAgICAgICAgc3R5bGUucmVsID0gJ3N0eWxlc2hlZXQnOwogICAgICAgICAgICBzdHlsZS5pZCA9IGlkOwogICAgICAgICAgICB0YWcgPT09ICdzdHlsZScgPyBzdHlsZS5pbm5lckhUTUwgPSBjc3MgOiBzdHlsZS5ocmVmID0gY3NzOwogICAgICAgICAgICBkb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2hlYWQnKVswXS5hcHBlbmRDaGlsZChzdHlsZSk7CiAgICAgICAgfSwKCiAgICAgICAgZmluZFJlYWN0KGRvbSwgdHJhdmVyc2VVcCA9IDApIHsKICAgICAgICAgICAgY29uc3Qga2V5ID0gT2JqZWN0LmtleXMoZG9tKS5maW5kKGtleSA9PiB7CiAgICAgICAgICAgICAgICByZXR1cm4ga2V5LnN0YXJ0c1dpdGgoIl9fcmVhY3RGaWJlciQiKQogICAgICAgICAgICAgICAgICAgIHx8IGtleS5zdGFydHNXaXRoKCJfX3JlYWN0SW50ZXJuYWxJbnN0YW5jZSQiKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGNvbnN0IGRvbUZpYmVyID0gZG9tW2tleV07CiAgICAgICAgICAgIGlmIChkb21GaWJlciA9PSBudWxsKSByZXR1cm4gbnVsbDsKCiAgICAgICAgICAgIGlmIChkb21GaWJlci5fY3VycmVudEVsZW1lbnQpIHsKICAgICAgICAgICAgICAgIGxldCBjb21wRmliZXIgPSBkb21GaWJlci5fY3VycmVudEVsZW1lbnQuX293bmVyOwogICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0cmF2ZXJzZVVwOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICBjb21wRmliZXIgPSBjb21wRmliZXIuX2N1cnJlbnRFbGVtZW50Ll9vd25lcjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBjb21wRmliZXIuX2luc3RhbmNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBjb25zdCBHZXRDb21wRmliZXIgPSBmaWJlciA9PiB7CiAgICAgICAgICAgICAgICBsZXQgcGFyZW50RmliZXIgPSBmaWJlci5yZXR1cm47CiAgICAgICAgICAgICAgICB3aGlsZSAodHlwZW9mIHBhcmVudEZpYmVyLnR5cGUgPT0gInN0cmluZyIpIHsKICAgICAgICAgICAgICAgICAgICBwYXJlbnRGaWJlciA9IHBhcmVudEZpYmVyLnJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBwYXJlbnRGaWJlcjsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgbGV0IGNvbXBGaWJlciA9IEdldENvbXBGaWJlcihkb21GaWJlcik7CiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdHJhdmVyc2VVcDsgaSsrKSB7CiAgICAgICAgICAgICAgICBjb21wRmliZXIgPSBHZXRDb21wRmliZXIoY29tcEZpYmVyKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gY29tcEZpYmVyLnN0YXRlTm9kZSB8fCBjb21wRmliZXI7CiAgICAgICAgfSwKCiAgICAgICAgaW5pdERlZmF1bHRDb25maWcoKSB7CiAgICAgICAgICAgIGxldCB2YWx1ZSA9IFt7CiAgICAgICAgICAgICAgICBuYW1lOiAnc2V0dGluZ19ycGNfZG9tYWluJywKICAgICAgICAgICAgICAgIHZhbHVlOiAnaHR0cDovL2xvY2FsaG9zdCcKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgbmFtZTogJ3NldHRpbmdfcnBjX3BvcnQnLAogICAgICAgICAgICAgICAgdmFsdWU6ICcxNjgwMCcKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgbmFtZTogJ3NldHRpbmdfcnBjX3BhdGgnLAogICAgICAgICAgICAgICAgdmFsdWU6ICcvanNvbnJwYycKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgbmFtZTogJ3NldHRpbmdfcnBjX3Rva2VuJywKICAgICAgICAgICAgICAgIHZhbHVlOiAnJwogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICBuYW1lOiAnc2V0dGluZ19ycGNfZGlyJywKICAgICAgICAgICAgICAgIHZhbHVlOiAnRDonCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgIG5hbWU6ICdzZXR0aW5nX3Rlcm1pbmFsX3R5cGUnLAogICAgICAgICAgICAgICAgdmFsdWU6ICd3YycKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgbmFtZTogJ3NldHRpbmdfdGhlbWVfY29sb3InLAogICAgICAgICAgICAgICAgdmFsdWU6ICcjMDlBQUZGJwogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICBuYW1lOiAnc2V0dGluZ19pbml0X2NvZGUnLAogICAgICAgICAgICAgICAgdmFsdWU6ICcnCiAgICAgICAgICAgIH1dOwoKICAgICAgICAgICAgdmFsdWUuZm9yRWFjaCgodikgPT4gewogICAgICAgICAgICAgICAgYmFzZS5nZXRWYWx1ZSh2Lm5hbWUpID09PSB1bmRlZmluZWQgJiYgYmFzZS5zZXRWYWx1ZSh2Lm5hbWUsIHYudmFsdWUpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBzaG93U2V0dGluZygpIHsKICAgICAgICAgICAgbGV0IGRvbSA9ICcnLCBidG4gPSAnJywKICAgICAgICAgICAgICAgIGNvbG9yTGlzdCA9IFsnIzA5QUFGRicsICcjY2MzMjM1JywgJyM1MjZlZmEnLCAnIzUxOGMxNycsICcjZWQ5NDRiJywgJyNmOTY5YTUnLCAnI2JjYTI4MCddOwogICAgICAgICAgICBkb20gKz0gYDxsYWJlbCBjbGFzcz0icGwtc2V0dGluZy1sYWJlbCI+PGRpdiBjbGFzcz0icGwtbGFiZWwiPlJQQ+S4u+acujwvZGl2PjxpbnB1dCB0eXBlPSJ0ZXh0IiAgcGxhY2Vob2xkZXI9IuS4u+acuuWcsOWdgO+8jOmcgOW4puS4imh0dHAocyk6Ly8iIGNsYXNzPSJwbC1pbnB1dCBsaXN0ZW5lci1kb21haW4iIHZhbHVlPSIke2Jhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX2RvbWFpbicpfSI+PC9sYWJlbD5gOwogICAgICAgICAgICBkb20gKz0gYDxsYWJlbCBjbGFzcz0icGwtc2V0dGluZy1sYWJlbCI+PGRpdiBjbGFzcz0icGwtbGFiZWwiPlJQQ+err+WPozwvZGl2PjxpbnB1dCB0eXBlPSJ0ZXh0IiBwbGFjZWhvbGRlcj0i56uv5Y+j5Y+377yM5L6L5aaC77yaTW90cml45Li6MTY4MDAiIGNsYXNzPSJwbC1pbnB1dCBsaXN0ZW5lci1wb3J0IiB2YWx1ZT0iJHtiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY19wb3J0Jyl9Ij48L2xhYmVsPmA7CiAgICAgICAgICAgIGRvbSArPSBgPGxhYmVsIGNsYXNzPSJwbC1zZXR0aW5nLWxhYmVsIj48ZGl2IGNsYXNzPSJwbC1sYWJlbCI+UlBD6Lev5b6EPC9kaXY+PGlucHV0IHR5cGU9InRleHQiIHBsYWNlaG9sZGVyPSLot6/lvoTvvIzpu5jorqTkuLovanNvbnJwYyIgY2xhc3M9InBsLWlucHV0IGxpc3RlbmVyLXBhdGgiIHZhbHVlPSIke2Jhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX3BhdGgnKX0iPjwvbGFiZWw+YDsKICAgICAgICAgICAgZG9tICs9IGA8bGFiZWwgY2xhc3M9InBsLXNldHRpbmctbGFiZWwiPjxkaXYgY2xhc3M9InBsLWxhYmVsIj5SUEPlr4bpkqU8L2Rpdj48aW5wdXQgdHlwZT0idGV4dCIgcGxhY2Vob2xkZXI9IuaXoOWvhumSpeaXoOmcgOWhq+WGmSIgY2xhc3M9InBsLWlucHV0IGxpc3RlbmVyLXRva2VuIiB2YWx1ZT0iJHtiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY190b2tlbicpfSI+PC9sYWJlbD5gOwogICAgICAgICAgICBkb20gKz0gYDxsYWJlbCBjbGFzcz0icGwtc2V0dGluZy1sYWJlbCI+PGRpdiBjbGFzcz0icGwtbGFiZWwiPuS/neWtmOi3r+W+hDwvZGl2PjxpbnB1dCB0eXBlPSJ0ZXh0IiBwbGFjZWhvbGRlcj0i5paH5Lu25LiL6L295ZCO5L+d5a2Y6Lev5b6E77yM5L6L5aaC77yaRDoiIGNsYXNzPSJwbC1pbnB1dCBsaXN0ZW5lci1kaXIiIHZhbHVlPSIke2Jhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX2RpcicpfSI+PC9sYWJlbD5gOwoKICAgICAgICAgICAgY29sb3JMaXN0LmZvckVhY2goKHYpID0+IHsKICAgICAgICAgICAgICAgIGJ0biArPSBgPGRpdiBkYXRhLWNvbG9yPSIke3Z9IiBzdHlsZT0iYmFja2dyb3VuZDogJHt2fTtib3JkZXI6IDFweCBzb2xpZCAke3Z9IiBjbGFzcz0icGwtY29sb3ItYm94IGxpc3RlbmVyLWNvbG9yICR7diA9PT0gYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ190aGVtZV9jb2xvcicpID8gJ2NoZWNrZWQnIDogJyd9Ij48L2Rpdj5gOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgZG9tICs9IGA8bGFiZWwgY2xhc3M9InBsLXNldHRpbmctbGFiZWwiPjxkaXYgY2xhc3M9InBsLWxhYmVsIj7nu4jnq6/nsbvlnos8L2Rpdj48c2VsZWN0IGNsYXNzPSJwbC1pbnB1dCBsaXN0ZW5lci10ZXJtaW5hbCI+YDsKICAgICAgICAgICAgT2JqZWN0LmtleXModGVybWluYWxUeXBlKS5mb3JFYWNoKGsgPT4gewogICAgICAgICAgICAgICAgZG9tICs9IGA8b3B0aW9uIHZhbHVlPSIke2t9IiAke2Jhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfdGVybWluYWxfdHlwZScpID09PSBrID8gJ3NlbGVjdGVkJyA6ICcnfT4ke3Rlcm1pbmFsVHlwZVtrXX08L29wdGlvbj5gOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgZG9tICs9IGA8L3NlbGVjdD48L2xhYmVsPmA7CiAgICAgICAgICAgIGRvbSArPSBgPGxhYmVsIGNsYXNzPSJwbC1zZXR0aW5nLWxhYmVsIj48ZGl2IGNsYXNzPSJwbC1sYWJlbCI+5Li76aKY6aKc6ImyPC9kaXY+IDxkaXYgY2xhc3M9InBsLWNvbG9yIj4ke2J0bn08ZGl2PjwvbGFiZWw+YDsKICAgICAgICAgICAgZG9tID0gJzxkaXY+JyArIGRvbSArICc8L2Rpdj4nOwoKICAgICAgICAgICAgU3dhbC5maXJlKHsKICAgICAgICAgICAgICAgIHRpdGxlOiAn5Yqp5omL6YWN572uJywKICAgICAgICAgICAgICAgIGh0bWw6IGRvbSwKICAgICAgICAgICAgICAgIGljb246ICdpbmZvJywKICAgICAgICAgICAgICAgIHNob3dDbG9zZUJ1dHRvbjogdHJ1ZSwKICAgICAgICAgICAgICAgIHNob3dDb25maXJtQnV0dG9uOiBmYWxzZSwKICAgICAgICAgICAgICAgIGZvb3RlcjogcGFuLmZvb3RlciwKICAgICAgICAgICAgfSkudGhlbigoKSA9PiB7CiAgICAgICAgICAgICAgICBtZXNzYWdlLnN1Y2Nlc3MoJ+iuvue9ruaIkOWKn++8gScpOwogICAgICAgICAgICAgICAgaGlzdG9yeS5nbygwKTsKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBkb2Mub24oJ2NsaWNrJywgJy5saXN0ZW5lci1jb2xvcicsIGFzeW5jIChlKSA9PiB7CiAgICAgICAgICAgICAgICBiYXNlLnNldFZhbHVlKCdzZXR0aW5nX3RoZW1lX2NvbG9yJywgZS50YXJnZXQuZGF0YXNldC5jb2xvcik7CiAgICAgICAgICAgICAgICBtZXNzYWdlLnN1Y2Nlc3MoJ+iuvue9ruaIkOWKn++8gScpOwogICAgICAgICAgICAgICAgaGlzdG9yeS5nbygwKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGRvYy5vbignaW5wdXQnLCAnLmxpc3RlbmVyLWRvbWFpbicsIGFzeW5jIChlKSA9PiB7CiAgICAgICAgICAgICAgICBiYXNlLnNldFZhbHVlKCdzZXR0aW5nX3JwY19kb21haW4nLCBlLnRhcmdldC52YWx1ZSk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBkb2Mub24oJ2lucHV0JywgJy5saXN0ZW5lci1wb3J0JywgYXN5bmMgKGUpID0+IHsKICAgICAgICAgICAgICAgIGJhc2Uuc2V0VmFsdWUoJ3NldHRpbmdfcnBjX3BvcnQnLCBlLnRhcmdldC52YWx1ZSk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBkb2Mub24oJ2lucHV0JywgJy5saXN0ZW5lci1wYXRoJywgYXN5bmMgKGUpID0+IHsKICAgICAgICAgICAgICAgIGJhc2Uuc2V0VmFsdWUoJ3NldHRpbmdfcnBjX3BhdGgnLCBlLnRhcmdldC52YWx1ZSk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBkb2Mub24oJ2lucHV0JywgJy5saXN0ZW5lci10b2tlbicsIGFzeW5jIChlKSA9PiB7CiAgICAgICAgICAgICAgICBiYXNlLnNldFZhbHVlKCdzZXR0aW5nX3JwY190b2tlbicsIGUudGFyZ2V0LnZhbHVlKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGRvYy5vbignaW5wdXQnLCAnLmxpc3RlbmVyLWRpcicsIGFzeW5jIChlKSA9PiB7CiAgICAgICAgICAgICAgICBiYXNlLnNldFZhbHVlKCdzZXR0aW5nX3JwY19kaXInLCBlLnRhcmdldC52YWx1ZSk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBkb2Mub24oJ2NoYW5nZScsICcubGlzdGVuZXItdGVybWluYWwnLCBhc3luYyAoZSkgPT4gewogICAgICAgICAgICAgICAgYmFzZS5zZXRWYWx1ZSgnc2V0dGluZ190ZXJtaW5hbF90eXBlJywgZS50YXJnZXQudmFsdWUpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICByZWdpc3Rlck1lbnVDb21tYW5kKCkgewogICAgICAgICAgICBHTV9yZWdpc3Rlck1lbnVDb21tYW5kKCfimpnvuI8g6K6+572uJywgKCkgPT4gewogICAgICAgICAgICAgICAgdGhpcy5zaG93U2V0dGluZygpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBjcmVhdGVUaXAoKSB7CiAgICAgICAgICAgICQoJ2JvZHknKS5hcHBlbmQoJzxkaXYgY2xhc3M9InBsLXRvb2x0aXAiPjwvZGl2PicpOwoKICAgICAgICAgICAgZG9jLm9uKCdtb3VzZWVudGVyIG1vdXNlbGVhdmUnLCAnLmxpc3RlbmVyLXRpcCcsIChlKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAoZS50eXBlID09PSAnbW91c2VlbnRlcicpIHsKICAgICAgICAgICAgICAgICAgICBsZXQgZmlsZW5hbWUgPSBlLmN1cnJlbnRUYXJnZXQuaW5uZXJUZXh0OwogICAgICAgICAgICAgICAgICAgIGxldCBzaXplID0gZS5jdXJyZW50VGFyZ2V0LmRhdGFzZXQuc2l6ZTsKICAgICAgICAgICAgICAgICAgICBsZXQgdGlwID0gYCR7ZmlsZW5hbWV9PHNwYW4gc3R5bGU9Im1hcmdpbi1sZWZ0OiAxMHB4O2NvbG9yOiAjZjU2YzZjOyI+JHtzaXplfTwvc3Bhbj5gOwogICAgICAgICAgICAgICAgICAgICQoZS5jdXJyZW50VGFyZ2V0KS5jc3Moe29wYWNpdHk6ICcwLjUnfSk7CiAgICAgICAgICAgICAgICAgICAgJCgnLnBsLXRvb2x0aXAnKS5odG1sKHRpcCkuY3NzKHsKICAgICAgICAgICAgICAgICAgICAgICAgJ2xlZnQnOiBlLnBhZ2VYICsgMTAgKyAncHgnLAogICAgICAgICAgICAgICAgICAgICAgICAndG9wJzogZS5wYWdlWSAtIGUuY3VycmVudFRhcmdldC5vZmZzZXRUb3AgPiAxNCA/IGUucGFnZVkgKyAncHgnIDogZS5wYWdlWSArIDIwICsgJ3B4JwogICAgICAgICAgICAgICAgICAgIH0pLnNob3coKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJChlLmN1cnJlbnRUYXJnZXQpLmNzcyh7b3BhY2l0eTogJzEnfSk7CiAgICAgICAgICAgICAgICAgICAgJCgnLnBsLXRvb2x0aXAnKS5oaWRlKDApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBjcmVhdGVMb2FkaW5nKCkgewogICAgICAgICAgICByZXR1cm4gJCgnPGRpdiBjbGFzcz0icGwtbG9hZGluZyI+PGRpdiBjbGFzcz0icGwtbG9hZGluZy1ib3giPjxkaXY+PGRpdj48L2Rpdj48ZGl2PjwvZGl2PjwvZGl2PjwvZGl2PjwvZGl2PicpOwogICAgICAgIH0sCgogICAgICAgIGNyZWF0ZURvd25sb2FkSWZyYW1lKCkgewogICAgICAgICAgICBsZXQgJGRpdiA9ICQoJzxkaXYgc3R5bGU9InBhZGRpbmc6MDttYXJnaW46MDtkaXNwbGF5OmJsb2NrIj48L2Rpdj4nKTsKICAgICAgICAgICAgbGV0ICRpZnJhbWUgPSAkKCc8aWZyYW1lIHNyYz0iamF2YXNjcmlwdDo7IiBpZD0iZG93bmxvYWRJZnJhbWUiIHN0eWxlPSJkaXNwbGF5Om5vbmUiPjwvaWZyYW1lPicpOwogICAgICAgICAgICAkZGl2LmFwcGVuZCgkaWZyYW1lKTsKICAgICAgICAgICAgJCgnYm9keScpLmFwcGVuZCgkZGl2KTsKICAgICAgICB9LAoKICAgICAgICBnZXRNaXJyb3JMaXN0KGxpbmssIG1pcnJvciwgdGhyZWFkID0gMikgewogICAgICAgICAgICBsZXQgaG9zdCA9IG5ldyBVUkwobGluaykuaG9zdDsKICAgICAgICAgICAgbGV0IG1pcnJvcnMgPSBbXTsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtaXJyb3IubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgdGhyZWFkOyBqKyspIHsKICAgICAgICAgICAgICAgICAgICBsZXQgaXRlbSA9IGxpbmsucmVwbGFjZShob3N0LCBtaXJyb3JbaV0pICsgJyYnLnJlcGVhdChqKTsKICAgICAgICAgICAgICAgICAgICBtaXJyb3JzLnB1c2goaXRlbSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG1pcnJvcnMuam9pbignXG4nKTsKICAgICAgICB9LAoKICAgICAgICBhZGRQYW5MaW5rZXJTdHlsZSgpIHsKICAgICAgICAgICAgY29sb3IgPSBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3RoZW1lX2NvbG9yJyk7CiAgICAgICAgICAgIGxldCBjc3MgPSBgCiAgICAgICAgICAgIGJvZHk6Oi13ZWJraXQtc2Nyb2xsYmFyIHsgZGlzcGxheTogbm9uZSB9CiAgICAgICAgICAgIDo6LXdlYmtpdC1zY3JvbGxiYXIgeyB3aWR0aDogNnB4OyBoZWlnaHQ6IDEwcHggfQogICAgICAgICAgICA6Oi13ZWJraXQtc2Nyb2xsYmFyLXRyYWNrIHsgYm9yZGVyLXJhZGl1czogMDsgYmFja2dyb3VuZDogbm9uZSB9CiAgICAgICAgICAgIDo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWIgeyBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDg1LDg1LDg1LC40KSB9CiAgICAgICAgICAgIDo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWIsOjotd2Via2l0LXNjcm9sbGJhci10aHVtYjpob3ZlciB7IGJvcmRlci1yYWRpdXM6IDVweDsgLXdlYmtpdC1ib3gtc2hhZG93OiBpbnNldCAwIDAgNnB4IHJnYmEoMCwwLDAsLjIpIH0KICAgICAgICAgICAgOjotd2Via2l0LXNjcm9sbGJhci10aHVtYjpob3ZlciB7IGJhY2tncm91bmQtY29sb3I6IHJnYmEoODUsODUsODUsLjMpIH0KICAgICAgICAgICAgLnN3YWwyLXBvcHVwIHsgZm9udC1zaXplOiAxNnB4ICFpbXBvcnRhbnQ7IH0KICAgICAgICAgICAgLnBsLXBvcHVwIHsgZm9udC1zaXplOiAxMnB4ICFpbXBvcnRhbnQ7IH0KICAgICAgICAgICAgLnBsLXBvcHVwIGEgeyBjb2xvcjogJHtjb2xvcn0gIWltcG9ydGFudDsgfQogICAgICAgICAgICAucGwtaGVhZGVyIHsgcGFkZGluZzogMCFpbXBvcnRhbnQ7YWxpZ24taXRlbXM6IGZsZXgtc3RhcnQhaW1wb3J0YW50OyBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2VlZSFpbXBvcnRhbnQ7IG1hcmdpbjogMCAwIDEwcHghaW1wb3J0YW50OyBwYWRkaW5nOiAwIDAgNXB4IWltcG9ydGFudDsgfQogICAgICAgICAgICAucGwtdGl0bGUgeyBmb250LXNpemU6IDE2cHghaW1wb3J0YW50OyBsaW5lLWhlaWdodDogMSFpbXBvcnRhbnQ7d2hpdGUtc3BhY2U6IG5vd3JhcCFpbXBvcnRhbnQ7IHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzIWltcG9ydGFudDt9CiAgICAgICAgICAgIC5wbC1jb250ZW50IHsgcGFkZGluZzogMCAhaW1wb3J0YW50OyBmb250LXNpemU6IDEycHghaW1wb3J0YW50OyB9CiAgICAgICAgICAgIC5wbC1tYWluIHsgbWF4LWhlaWdodDogNDAwcHg7b3ZlcmZsb3cteTpzY3JvbGw7IH0KICAgICAgICAgICAgLnBsLWZvb3RlciB7Zm9udC1zaXplOiAxMnB4IWltcG9ydGFudDtqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQhaW1wb3J0YW50OyBtYXJnaW46IDEwcHggMCAwIWltcG9ydGFudDsgcGFkZGluZzogNXB4IDAgMCFpbXBvcnRhbnQ7IGNvbG9yOiAjZjU2YzZjIWltcG9ydGFudDsgfQogICAgICAgICAgICAucGwtaXRlbSB7IGRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGxpbmUtaGVpZ2h0OiAyMnB4OyB9CiAgICAgICAgICAgIC5wbC1pdGVtLW5hbWUgeyBmbGV4OiAwIDAgMTUwcHg7IHRleHQtYWxpZ246IGxlZnQ7bWFyZ2luLXJpZ2h0OiAxMHB4OyBvdmVyZmxvdzogaGlkZGVuOyB3aGl0ZS1zcGFjZTogbm93cmFwOyB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsgY3Vyc29yOmRlZmF1bHQ7IH0KICAgICAgICAgICAgLnBsLWl0ZW0tbGluayB7IGZsZXg6IDE7IG92ZXJmbG93OiBoaWRkZW47IHRleHQtYWxpZ246IGxlZnQ7IHdoaXRlLXNwYWNlOiBub3dyYXA7IHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO2N1cnNvcjpwb2ludGVyIH0KICAgICAgICAgICAgLnBsLWl0ZW0tYnRuIHsgYmFja2dyb3VuZDogJHtjb2xvcn07IHBhZGRpbmc6IDRweCA1cHg7IGJvcmRlci1yYWRpdXM6IDNweDsgbGluZS1oZWlnaHQ6IDE7IGN1cnNvcjogcG9pbnRlcjsgY29sb3I6ICNmZmY7IH0KICAgICAgICAgICAgLnBsLWl0ZW0tdGlwIHsgZGlzcGxheTogZmxleDsganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO2ZsZXg6IDE7IH0KICAgICAgICAgICAgLnBsLWJhY2sgeyB3aWR0aDogNzBweDsgYmFja2dyb3VuZDogI2RkZDsgYm9yZGVyLXJhZGl1czogM3B4OyBjdXJzb3I6cG9pbnRlcjsgbWFyZ2luOjFweCAwOyB9CiAgICAgICAgICAgIC5wbC1leHQgeyBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHdpZHRoOiA0NHB4OyBiYWNrZ3JvdW5kOiAjOTk5OyBjb2xvcjogI2ZmZjsgaGVpZ2h0OiAxNnB4OyBsaW5lLWhlaWdodDogMTZweDsgZm9udC1zaXplOiAxMnB4OyBib3JkZXItcmFkaXVzOiAzcHg7fQogICAgICAgICAgICAucGwtcmV0cnkge3BhZGRpbmc6IDNweCAxMHB4OyBiYWNrZ3JvdW5kOiAjY2MzMjM1OyBjb2xvcjogI2ZmZjsgYm9yZGVyLXJhZGl1czogM3B4OyBjdXJzb3I6IHBvaW50ZXI7fQogICAgICAgICAgICAucGwtYnJvd3NlcmRvd25sb2FkIHsgcGFkZGluZzogM3B4IDEwcHg7IGJhY2tncm91bmQ6ICR7Y29sb3J9OyBjb2xvcjogI2ZmZjsgYm9yZGVyLXJhZGl1czogM3B4OyBjdXJzb3I6IHBvaW50ZXI7fQogICAgICAgICAgICAucGwtaXRlbS1wcm9ncmVzcyB7IGRpc3BsYXk6ZmxleDtmbGV4OiAxO2FsaWduLWl0ZW1zOmNlbnRlcn0KICAgICAgICAgICAgLnBsLXByb2dyZXNzIHsgZGlzcGxheTogaW5saW5lLWJsb2NrO3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7d2lkdGg6IDEwMCU7IGJveC1zaXppbmc6IGJvcmRlci1ib3g7bGluZS1oZWlnaHQ6IDE7cG9zaXRpb246IHJlbGF0aXZlO2hlaWdodDoxNXB4OyBmbGV4OiAxfQogICAgICAgICAgICAucGwtcHJvZ3Jlc3Mtb3V0ZXIgeyBoZWlnaHQ6IDE1cHg7Ym9yZGVyLXJhZGl1czogMTAwcHg7YmFja2dyb3VuZC1jb2xvcjogI2ViZWVmNTtvdmVyZmxvdzogaGlkZGVuO3Bvc2l0aW9uOiByZWxhdGl2ZTt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO30KICAgICAgICAgICAgLnBsLXByb2dyZXNzLWlubmVyeyBwb3NpdGlvbjogYWJzb2x1dGU7bGVmdDogMDt0b3A6IDA7YmFja2dyb3VuZC1jb2xvcjogIzQwOWVmZjt0ZXh0LWFsaWduOiByaWdodDtib3JkZXItcmFkaXVzOiAxMDBweDtsaW5lLWhlaWdodDogMTt3aGl0ZS1zcGFjZTogbm93cmFwO3RyYW5zaXRpb246IHdpZHRoIC42cyBlYXNlO30KICAgICAgICAgICAgLnBsLXByb2dyZXNzLWlubmVyLXRleHQgeyBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTtjb2xvcjogI2QxZDFkMTtmb250LXNpemU6IDEycHg7bWFyZ2luOiAwIDVweDtoZWlnaHQ6IDE1cHh9CiAgICAgICAgICAgIC5wbC1wcm9ncmVzcy10aXB7IGZsZXg6MTt0ZXh0LWFsaWduOnJpZ2h0fQogICAgICAgICAgICAucGwtcHJvZ3Jlc3MtaG93eyBmbGV4OiAwIDAgOTBweDsgYmFja2dyb3VuZDogI2RkZDsgYm9yZGVyLXJhZGl1czogM3B4OyBtYXJnaW4tbGVmdDogMTBweDsgY3Vyc29yOiBwb2ludGVyOyB0ZXh0LWFsaWduOiBjZW50ZXI7fQogICAgICAgICAgICAucGwtcHJvZ3Jlc3Mtc3RvcHsgZmxleDogMCAwIDUwcHg7IHBhZGRpbmc6IDAgMTBweDsgYmFja2dyb3VuZDogI2NjMzIzNTsgY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDNweDsgY3Vyc29yOiBwb2ludGVyO21hcmdpbi1sZWZ0OjEwcHg7aGVpZ2h0OjIwcHh9CiAgICAgICAgICAgIC5wbC1wcm9ncmVzcy1pbm5lci10ZXh0OmFmdGVyIHsgZGlzcGxheTogaW5saW5lLWJsb2NrO2NvbnRlbnQ6ICIiO2hlaWdodDogMTAwJTt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO30KICAgICAgICAgICAgLnBsLWJ0bi1wcmltYXJ5IHsgYmFja2dyb3VuZDogJHtjb2xvcn07IGJvcmRlcjogMDsgYm9yZGVyLXJhZGl1czogNHB4OyBjb2xvcjogI2ZmZmZmZjsgY3Vyc29yOiBwb2ludGVyOyBmb250LXNpemU6IDEycHg7IG91dGxpbmU6IG5vbmU7IGRpc3BsYXk6ZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsganVzdGlmeS1jb250ZW50OiBjZW50ZXI7IG1hcmdpbjogMnB4IDA7IHBhZGRpbmc6IDZweCAwO3RyYW5zaXRpb246IDAuM3Mgb3BhY2l0eTsgfQogICAgICAgICAgICAucGwtYnRuLXByaW1hcnk6aG92ZXIgeyBvcGFjaXR5OiAwLjk7dHJhbnNpdGlvbjogMC4zcyBvcGFjaXR5OyB9CiAgICAgICAgICAgIC5wbC1idG4tc3VjY2VzcyB7IGJhY2tncm91bmQ6ICM1NWFmMjg7IGFuaW1hdGlvbjogZWFzZU9wYWNpdHkgMS4ycyAyOyBhbmltYXRpb24tZmlsbC1tb2RlOmZvcndhcmRzIH0KICAgICAgICAgICAgLnBsLWJ0bi1pbmZvIHsgYmFja2dyb3VuZDogIzYwNjI2NjsgfQogICAgICAgICAgICAucGwtYnRuLXdhcm5pbmcgeyBiYWNrZ3JvdW5kOiAjZGE5MzI4OyB9CiAgICAgICAgICAgIC5wbC1idG4td2FybmluZyB7IGJhY2tncm91bmQ6ICNkYTkzMjg7IH0KICAgICAgICAgICAgLnBsLWJ0bi1kYW5nZXIgeyBiYWNrZ3JvdW5kOiAjY2MzMjM1OyB9CiAgICAgICAgICAgIC5wbC1kcm9wZG93bi1tZW51IHtwb3NpdGlvbjogYWJzb2x1dGU7cmlnaHQ6IDA7dG9wOiAzMHB4O3BhZGRpbmc6IDVweCAwO2NvbG9yOiByZ2IoMzcsIDM4LCA0Myk7YmFja2dyb3VuZDogI2ZmZjt6LWluZGV4OiA5OTk7d2lkdGg6IDEwMnB4O2JvcmRlcjogMXB4IHNvbGlkICNkZGQ7Ym9yZGVyLXJhZGl1czogMTBweDsgYm94LXNoYWRvdzogMCAwIDFweCAxcHggcmdiKDI4IDI4IDMyIC8gNSUpLCAwIDhweCAyNHB4IHJnYigyOCAyOCAzMiAvIDEyJSk7fQogICAgICAgICAgICAucGwtZHJvcGRvd24tbWVudS1pdGVtIHsgaGVpZ2h0OiAzMHB4O2Rpc3BsYXk6IGZsZXg7YWxpZ24taXRlbXM6IGNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsgfQogICAgICAgICAgICAucGwtZHJvcGRvd24tbWVudS1pdGVtOmhvdmVyIHsgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgxMzIsMTMzLDE0MSwwLjA4KTt9CiAgICAgICAgICAgIC5wbC1idXR0b24gLnBsLWRyb3Bkb3duLW1lbnUgeyBkaXNwbGF5OiBub25lOyB9CiAgICAgICAgICAgIC5wbC1idXR0b246aG92ZXIgLnBsLWRyb3Bkb3duLW1lbnUgeyBkaXNwbGF5OiBibG9jayFpbXBvcnRhbnQ7IH0KICAgICAgICAgICAgLnBsLWJ1dHRvbi1pbml0IHsgb3BhY2l0eTogMC41OyBhbmltYXRpb246IGVhc2VJbml0T3BhY2l0eSAxLjJzIDM7IGFuaW1hdGlvbi1maWxsLW1vZGU6Zm9yd2FyZHMgfQogICAgICAgICAgICAgQGtleWZyYW1lcyBlYXNlSW5pdE9wYWNpdHkgeyBmcm9tIHsgb3BhY2l0eTogMC41OyB9IDUwJSB7IG9wYWNpdHk6IDEgfSB0byB7IG9wYWNpdHk6IDAuNTsgfSB9CiAgICAgICAgICAgICBAa2V5ZnJhbWVzIGVhc2VPcGFjaXR5IHsgZnJvbSB7IG9wYWNpdHk6IDE7IH0gNTAlIHsgb3BhY2l0eTogMC4zNSB9IHRvIHsgb3BhY2l0eTogMTsgfSB9CiAgICAgICAgICAgIC5lbGVtZW50LWNsaWNrZWQgeyBvcGFjaXR5OiAwLjU7IH0KICAgICAgICAgICAgLnBsLWV4dHJhIHsgbWFyZ2luLXRvcDogMTBweDtkaXNwbGF5OmZsZXh9CiAgICAgICAgICAgIC5wbC1leHRyYSBidXR0b24geyBmbGV4OiAxfQogICAgICAgICAgICAucG9pbnRlciB7IGN1cnNvcjpwb2ludGVyIH0KICAgICAgICAgICAgLnBsLXNldHRpbmctbGFiZWwgeyBkaXNwbGF5OiBmbGV4O2FsaWduLWl0ZW1zOiBjZW50ZXI7anVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO3BhZGRpbmctdG9wOiAxMHB4OyB9CiAgICAgICAgICAgIC5wbC1sYWJlbCB7IGZsZXg6IDAgMCAxMDBweDt0ZXh0LWFsaWduOmxlZnQ7IH0KICAgICAgICAgICAgLnBsLWlucHV0IHsgZmxleDogMTsgcGFkZGluZzogOHB4IDEwcHg7IGJvcmRlcjogMXB4IHNvbGlkICNjMmMyYzI7IGJvcmRlci1yYWRpdXM6IDVweDsgZm9udC1zaXplOiAxNHB4IH0KICAgICAgICAgICAgLnBsLWNvbG9yIHsgZmxleDogMTtkaXNwbGF5OiBmbGV4O2ZsZXgtd3JhcDogd3JhcDsgbWFyZ2luLXJpZ2h0OiAtMTBweDt9CiAgICAgICAgICAgIC5wbC1jb2xvci1ib3ggeyB3aWR0aDogMzVweDtoZWlnaHQ6IDM1cHg7bWFyZ2luOjEwcHggMTBweCAwIDA7OyBib3gtc2l6aW5nOiBib3JkZXItYm94O2JvcmRlcjoxcHggc29saWQgI2ZmZjtjdXJzb3I6cG9pbnRlciB9CiAgICAgICAgICAgIC5wbC1jb2xvci1ib3guY2hlY2tlZCB7IGJvcmRlcjozcHggZGFzaGVkICMxMTEhaW1wb3J0YW50IH0KICAgICAgICAgICAgLnBsLWNsb3NlOmZvY3VzIHsgb3V0bGluZTogMDsgYm94LXNoYWRvdzogbm9uZTsgfQogICAgICAgICAgICAudGFnLWRhbmdlciB7Y29sb3I6I2NjMzIzNTttYXJnaW46IDAgNXB4O30KICAgICAgICAgICAgLnBsLXRvb2x0aXAgeyBwb3NpdGlvbjogYWJzb2x1dGU7IGNvbG9yOiAjZmZmZmZmOyBtYXgtd2lkdGg6IDYwMHB4OyBmb250LXNpemU6IDEycHg7IHBhZGRpbmc6IDVweCAxMHB4OyBiYWNrZ3JvdW5kOiAjMzMzOyBib3JkZXItcmFkaXVzOiA1cHg7IHotaW5kZXg6IDExMDAwMDsgbGluZS1oZWlnaHQ6IDEuMzsgZGlzcGxheTpub25lOyB3b3JkLWJyZWFrOiBicmVhay1hbGw7fQogICAgICAgICAgICAgQGtleWZyYW1lcyBsb2FkIHsgMCUgeyB0cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKSB9IDEwMCUgeyB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpIH0gfQogICAgICAgICAgICAucGwtbG9hZGluZy1ib3ggPiBkaXYgPiBkaXYgeyBwb3NpdGlvbjogYWJzb2x1dGU7Ym9yZGVyLXJhZGl1czogNTAlO30KICAgICAgICAgICAgLnBsLWxvYWRpbmctYm94ID4gZGl2ID4gZGl2Om50aC1jaGlsZCgxKSB7IHRvcDogOXB4O2xlZnQ6IDlweDt3aWR0aDogODJweDtoZWlnaHQ6IDgycHg7YmFja2dyb3VuZDogI2ZmZmZmZjt9CiAgICAgICAgICAgIC5wbC1sb2FkaW5nLWJveCA+IGRpdiA+IGRpdjpudGgtY2hpbGQoMikgeyB0b3A6IDE0cHg7bGVmdDogMzhweDt3aWR0aDogMjVweDtoZWlnaHQ6IDI1cHg7YmFja2dyb3VuZDogIzY2NjY2NjthbmltYXRpb246IGxvYWQgMXMgbGluZWFyIGluZmluaXRlO3RyYW5zZm9ybS1vcmlnaW46IDEycHggMzZweDt9CiAgICAgICAgICAgIC5wbC1sb2FkaW5nIHsgd2lkdGg6IDE2cHg7aGVpZ2h0OiAxNnB4O2Rpc3BsYXk6IGlubGluZS1ibG9jaztvdmVyZmxvdzogaGlkZGVuO2JhY2tncm91bmQ6IG5vbmU7fQogICAgICAgICAgICAucGwtbG9hZGluZy1ib3ggeyB3aWR0aDogMTAwJTtoZWlnaHQ6IDEwMCU7cG9zaXRpb246IHJlbGF0aXZlO3RyYW5zZm9ybTogdHJhbnNsYXRlWigwKSBzY2FsZSgwLjE2KTtiYWNrZmFjZS12aXNpYmlsaXR5OiBoaWRkZW47dHJhbnNmb3JtLW9yaWdpbjogMCAwO30KICAgICAgICAgICAgLnBsLWxvYWRpbmctYm94IGRpdiB7IGJveC1zaXppbmc6IGNvbnRlbnQtYm94OyB9CiAgICAgICAgICAgIC5zd2FsMi1jb250YWluZXIgeyB6LWluZGV4OjEwMDAwMCFpbXBvcnRhbnQ7IH0KICAgICAgICAgICAgYm9keS5zd2FsMi1oZWlnaHQtYXV0byB7IGhlaWdodDogaW5oZXJpdCFpbXBvcnRhbnQ7IH0KICAgICAgICAgICAgLmJ0bi1vcGVyYXRlIC5idG4tbWFpbiB7IGRpc3BsYXk6ZmxleDsgYWxpZ24taXRlbXM6Y2VudGVyOyB9CiAgICAgICAgICAgIGA7CiAgICAgICAgICAgIHRoaXMuYWRkU3R5bGUoJ3Bhbmxpbmtlci1zdHlsZScsICdzdHlsZScsIGNzcyk7CiAgICAgICAgfSwKCiAgICAgICAgYXN5bmMgaW5pdERpYWxvZygpIHsKICAgICAgICAgICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCBTd2FsLmZpcmUoewogICAgICAgICAgICAgICAgICAgIHRpdGxlOiAi6K+35pSv5oyB5Y6f5YibIiwKICAgICAgICAgICAgICAgICAgICBodG1sOiBgPGRpdj48aW1nIHN0eWxlPSJ3aWR0aDogMjUwcHg7bWFyZ2luLWJvdHRvbTogMTBweDsiIHNyYz0iJHtwYW4uaW1nfSIgYWx0PSIke3Bhbi5pbWd9Ij48aW5wdXQgY2xhc3M9InN3YWwyLWlucHV0IiBpZD0iaW5pdCIgdHlwZT0idGV4dCIgcGxhY2Vob2xkZXI9Iuivt+maj+S+v+i+k+WFpeaal+WPtyI+PC9kaXY+YCwKICAgICAgICAgICAgICAgICAgICBhbGxvd091dHNpZGVDbGljazogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgc2hvd0Nsb3NlQnV0dG9uOiB0cnVlLAogICAgICAgICAgICAgICAgICAgIGNvbmZpcm1CdXR0b25UZXh0OiAn56C06KejJwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmlzRGlzbWlzc2VkICYmIHJlc3VsdC5kaXNtaXNzID09PSAnY2xvc2UnKSByZXR1cm47CiAgICAgICAgICAgICAgICBpZiAocGFuLm51bSA9PSBwYW4ubnVtKSB7CiAgICAgICAgICAgICAgICAgICAgYmFzZS5zZXRWYWx1ZSgnc2V0dGluZ19pbml0X2NvZGUnLCBwYW4ubnVtKTsKICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnN1Y2Nlc3MoIuaal+WPt+ato+ehriIpOwogICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBoaXN0b3J5LmdvKDApOwogICAgICAgICAgICAgICAgICAgIH0sIDE1MDApOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBhd2FpdCBTd2FsLmZpcmUoewogICAgICAgICAgICAgICAgICAgICAgICB0aXRsZToi5pqX5Y+35LiN5q2j56GuIiwKICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogIuaal+WPt+S4jeato+ehriIsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpcm1CdXR0b25UZXh0OiAn6YeN5paw6L6T5YWlJywKICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VVcmw6IHBhbi5pbWcsCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5pbml0RGlhbG9nKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgfTsKCiAgICBsZXQgYmFpZHUgPSB7CgogICAgICAgIF9nZXRFeHRyYSgpIHsKICAgICAgICAgICAgbGV0IHNlS2V5ID0gZGVjb2RlVVJJQ29tcG9uZW50KGJhc2UuZ2V0Q29va2llKCdCRENMTkQnKSk7CiAgICAgICAgICAgIHJldHVybiAneycgKyAnInNla2V5IjoiJyArIHNlS2V5ICsgJyInICsgIn0iOwogICAgICAgIH0sCgogICAgICAgIF9nZXRTdXJsKCkgewoKICAgICAgICAgICAgbGV0IHJlZyA9IC8oPzw9c1wvfHN1cmw9KShbYS16QS1aMC05Xy1dKykvZzsKICAgICAgICAgICAgaWYgKHJlZy50ZXN0KGxvY2F0aW9uLmhyZWYpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbG9jYXRpb24uaHJlZi5tYXRjaChyZWcpWzBdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAnJzsKCiAgICAgICAgfSwKCiAgICAgICAgX2dldEZpZExpc3QoKSB7CiAgICAgICAgICAgIGxldCBmaWRsaXN0ID0gW107CiAgICAgICAgICAgIHNlbGVjdExpc3QuZm9yRWFjaCh2ID0+IHsKICAgICAgICAgICAgICAgIGlmICgrdi5pc2RpciA9PT0gMSkgcmV0dXJuOwogICAgICAgICAgICAgICAgZmlkbGlzdC5wdXNoKHYuZnNfaWQpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcmV0dXJuICdbJyArIGZpZGxpc3QgKyAnXSc7CiAgICAgICAgfSwKCiAgICAgICAgX3Jlc2V0RGF0YSgpIHsKICAgICAgICAgICAgcHJvZ3Jlc3MgPSB7fTsKICAgICAgICAgICAgJC5lYWNoKHJlcXVlc3QsIChrZXkpID0+IHsKICAgICAgICAgICAgICAgIChyZXF1ZXN0W2tleV0pLmFib3J0KCk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAkLmVhY2goaW5zLCAoa2V5KSA9PiB7CiAgICAgICAgICAgICAgICBjbGVhckludGVydmFsKGluc1trZXldKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGlkbSA9IHt9OwogICAgICAgICAgICBpbnMgPSB7fTsKICAgICAgICAgICAgcmVxdWVzdCA9IHt9OwogICAgICAgIH0sCgogICAgICAgIHNldEJEVVNTKCkgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgR01fY29va2llICYmIEdNX2Nvb2tpZSgnbGlzdCcsIHtuYW1lOiAnQkRVU1MnfSwgKGNvb2tpZXMsIGVycm9yKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFlcnJvcikgewogICAgICAgICAgICAgICAgICAgICAgICBiYXNlLnNldFN0b3JhZ2UoImJhaWR1eXVuUGx1Z2luX0JEVVNTIiwge0JEVVNTOiBjb29raWVzWzBdLnZhbHVlfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGdldEJEVVNTKCkgewogICAgICAgICAgICBsZXQgYmFpZHV5dW5QbHVnaW5fQkRVU1MgPSBiYXNlLmdldFN0b3JhZ2UoJ2JhaWR1eXVuUGx1Z2luX0JEVVNTJykgPyBiYXNlLmdldFN0b3JhZ2UoJ2JhaWR1eXVuUGx1Z2luX0JEVVNTJykgOiAneyJiYWlkdXl1blBsdWdpbl9CRFVTUyI6IiJ9JzsKICAgICAgICAgICAgcmV0dXJuIGJhaWR1eXVuUGx1Z2luX0JEVVNTLkJEVVNTIHx8ICcnOwogICAgICAgIH0sCgogICAgICAgIGNvbnZlcnRMaW5rVG9BcmlhKGxpbmssIGZpbGVuYW1lLCB1YSkgewogICAgICAgICAgICBsZXQgQkRVU1MgPSB0aGlzLmdldEJEVVNTKCk7CiAgICAgICAgICAgIGlmICghIUJEVVNTKSB7CiAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IGJhc2UuZml4RmlsZW5hbWUoZmlsZW5hbWUpOwogICAgICAgICAgICAgICAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChgYXJpYTJjICIke2xpbmt9IiAtLW91dCAiJHtmaWxlbmFtZX0iIC0taGVhZGVyICJVc2VyLUFnZW50OiAke3VhfSIgLS1oZWFkZXIgIkNvb2tpZTogQkRVU1M9JHtCRFVTU30iYCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIGxpbms6IHBhbi5hc3Npc3RhbnQsCiAgICAgICAgICAgICAgICB0ZXh0OiBwYW4uaW5pdFs1XQogICAgICAgICAgICB9OwogICAgICAgIH0sCgogICAgICAgIGNvbnZlcnRMaW5rVG9CQyhsaW5rLCBmaWxlbmFtZSwgdWEpIHsKICAgICAgICAgICAgbGV0IEJEVVNTID0gdGhpcy5nZXRCRFVTUygpOwogICAgICAgICAgICBpZiAoISFCRFVTUykgewogICAgICAgICAgICAgICAgbGV0IGNvb2tpZSA9IGBCRFVTUz0ke0JEVVNTfWA7CiAgICAgICAgICAgICAgICBsZXQgYmMgPSBgQUEvJHtlbmNvZGVVUklDb21wb25lbnQoZmlsZW5hbWUpfS8/dXJsPSR7ZW5jb2RlVVJJQ29tcG9uZW50KGxpbmspfSZjb29raWU9JHtlbmNvZGVVUklDb21wb25lbnQoY29va2llKX0mdXNlcl9hZ2VudD0ke2VuY29kZVVSSUNvbXBvbmVudCh1YSl9WlpgOwogICAgICAgICAgICAgICAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChgYmM6Ly9odHRwLyR7YmFzZS5lKGJjKX1gKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgbGluazogcGFuLmFzc2lzdGFudCwKICAgICAgICAgICAgICAgIHRleHQ6IHBhbi5pbml0WzVdCiAgICAgICAgICAgIH07CiAgICAgICAgfSwKCiAgICAgICAgY29udmVydExpbmtUb0N1cmwobGluaywgZmlsZW5hbWUsIHVhKSB7CiAgICAgICAgICAgIGxldCBCRFVTUyA9IHRoaXMuZ2V0QkRVU1MoKTsKICAgICAgICAgICAgaWYgKCEhQkRVU1MpIHsKICAgICAgICAgICAgICAgIGxldCB0ZXJtaW5hbCA9IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfdGVybWluYWxfdHlwZScpOwogICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBiYXNlLmZpeEZpbGVuYW1lKGZpbGVuYW1lKTsKICAgICAgICAgICAgICAgIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQoYCR7dGVybWluYWwgIT09ICd3cCcgPyAnY3VybCcgOiAnY3VybC5leGUnfSAtTCAtQyAtICIke2xpbmt9IiAtbyAiJHtmaWxlbmFtZX0iIC1BICIke3VhfSIgLWIgIkJEVVNTPSR7QkRVU1N9ImApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBsaW5rOiBwYW4uYXNzaXN0YW50LAogICAgICAgICAgICAgICAgdGV4dDogcGFuLmluaXRbNV0KICAgICAgICAgICAgfTsKICAgICAgICB9LAoKICAgICAgICBhZGRQYWdlTGlzdGVuZXIoKSB7CiAgICAgICAgICAgIGZ1bmN0aW9uIF9mYWN0b3J5KGUpIHsKICAgICAgICAgICAgICAgIGxldCB0YXJnZXQgPSAkKGUudGFyZ2V0KTsKICAgICAgICAgICAgICAgIGxldCBpdGVtID0gdGFyZ2V0LnBhcmVudHMoJy5wbC1pdGVtJyk7CiAgICAgICAgICAgICAgICBsZXQgbGluayA9IGl0ZW0uZmluZCgnLnBsLWl0ZW0tbGluaycpOwogICAgICAgICAgICAgICAgbGV0IHByb2dyZXNzID0gaXRlbS5maW5kKCcucGwtaXRlbS1wcm9ncmVzcycpOwogICAgICAgICAgICAgICAgbGV0IHRpcCA9IGl0ZW0uZmluZCgnLnBsLWl0ZW0tdGlwJyk7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIGl0ZW0sIGxpbmssIHByb2dyZXNzLCB0aXAsIHRhcmdldCwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZ1bmN0aW9uIF9yZXNldChpKSB7CiAgICAgICAgICAgICAgICBpbnNbaV0gJiYgY2xlYXJJbnRlcnZhbChpbnNbaV0pOwogICAgICAgICAgICAgICAgcmVxdWVzdFtpXSAmJiByZXF1ZXN0W2ldLmFib3J0KCk7CiAgICAgICAgICAgICAgICBwcm9ncmVzc1tpXSA9IDA7CiAgICAgICAgICAgICAgICBpZG1baV0gPSBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZG9jLm9uKCdtb3VzZWVudGVyIG1vdXNlbGVhdmUgY2xpY2snLCAnLnBsLWJ1dHRvbi5nLWRyb3Bkb3duLWJ1dHRvbicsIChlKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAoZS50eXBlID09PSAnbW91c2VsZWF2ZScpIHsKICAgICAgICAgICAgICAgICAgICAkKGUuY3VycmVudFRhcmdldCkucmVtb3ZlQ2xhc3MoJ2J1dHRvbi1vcGVuJyk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICQoZS5jdXJyZW50VGFyZ2V0KS5hZGRDbGFzcygnYnV0dG9uLW9wZW4nKTsKICAgICAgICAgICAgICAgICAgICAkKGUuY3VycmVudFRhcmdldCkuZmluZCgnLnBsLWRyb3Bkb3duLW1lbnUnKS5zaG93KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBkb2Mub24oJ21vdXNlbGVhdmUnLCAnLnBsLWJ1dHRvbi5nLWRyb3Bkb3duLWJ1dHRvbiAucGwtZHJvcGRvd24tbWVudScsIChlKSA9PiB7CiAgICAgICAgICAgICAgICAkKGUuY3VycmVudFRhcmdldCkuaGlkZSgpOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIGRvYy5vbignY2xpY2snLCAnLnBsLWJ1dHRvbi1tb2RlJywgKGUpID0+IHsKICAgICAgICAgICAgICAgIG1vZGUgPSBlLnRhcmdldC5kYXRhc2V0Lm1vZGU7CiAgICAgICAgICAgICAgICBTd2FsLnNob3dMb2FkaW5nKCk7CiAgICAgICAgICAgICAgICB0aGlzLmdldFBDU0xpbmsoKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGRvYy5vbignY2xpY2snLCAnLmxpc3RlbmVyLWxpbmstYXBpJywgYXN5bmMgKGUpID0+IHsKICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgIGxldCBvID0gX2ZhY3RvcnkoZSk7CiAgICAgICAgICAgICAgICBsZXQgJHdpZHRoID0gby5pdGVtLmZpbmQoJy5wbC1wcm9ncmVzcy1pbm5lcicpOwogICAgICAgICAgICAgICAgbGV0ICR0ZXh0ID0gby5pdGVtLmZpbmQoJy5wbC1wcm9ncmVzcy1pbm5lci10ZXh0Jyk7CiAgICAgICAgICAgICAgICBsZXQgZmlsZW5hbWUgPSBvLmxpbmtbMF0uZGF0YXNldC5maWxlbmFtZTsKICAgICAgICAgICAgICAgIGxldCBpbmRleCA9IG8ubGlua1swXS5kYXRhc2V0LmluZGV4OwogICAgICAgICAgICAgICAgX3Jlc2V0KGluZGV4KTsKICAgICAgICAgICAgICAgIGJhc2UuZ2V0KG8ubGlua1swXS5kYXRhc2V0LmxpbmssIHsiVXNlci1BZ2VudCI6IHBhbi51YX0sICdibG9iJywge2ZpbGVuYW1lLCBpbmRleH0pOwogICAgICAgICAgICAgICAgaW5zW2luZGV4XSA9IHNldEludGVydmFsKCgpID0+IHsKICAgICAgICAgICAgICAgICAgICBsZXQgcHJvZyA9ICtwcm9ncmVzc1tpbmRleF0gfHwgMDsKICAgICAgICAgICAgICAgICAgICBsZXQgaXNJRE0gPSBpZG1baW5kZXhdIHx8IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIGlmIChpc0lETSkgewogICAgICAgICAgICAgICAgICAgICAgICBvLnRpcC5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIG8ucHJvZ3Jlc3MuaGlkZSgpOwogICAgICAgICAgICAgICAgICAgICAgICBvLmxpbmsudGV4dCgn5bey5oiQ5Yqf5ZSk6LW3SURN77yM6K+35p+l55yLSURN5LiL6L295qGG77yBJykuYW5pbWF0ZSh7b3BhY2l0eTogJzAuNSd9LCAic2xvdyIpLnNob3coKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnNbaW5kZXhdKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWRtW2luZGV4XSA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG8ubGluay5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIG8udGlwLmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgby5wcm9ncmVzcy5zaG93KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICR3aWR0aC5jc3MoJ3dpZHRoJywgcHJvZyArICclJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICR0ZXh0LnRleHQocHJvZyArICclJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9nID09PSAxMDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoaW5zW2luZGV4XSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9ncmVzc1tpbmRleF0gPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgby5pdGVtLmZpbmQoJy5wbC1wcm9ncmVzcy1zdG9wJykuaGlkZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgby5pdGVtLmZpbmQoJy5wbC1wcm9ncmVzcy10aXAnKS5odG1sKCfkuIvovb3lrozmiJDvvIzmraPlnKjlvLnlh7rmtY/op4jlmajkuIvovb3moYbvvIEnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sIDUwMCk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBkb2Mub24oJ2NsaWNrJywgJy5saXN0ZW5lci1yZXRyeScsIGFzeW5jIChlKSA9PiB7CiAgICAgICAgICAgICAgICBsZXQgbyA9IF9mYWN0b3J5KGUpOwogICAgICAgICAgICAgICAgby50aXAuaGlkZSgpOwogICAgICAgICAgICAgICAgby5saW5rLnNob3coKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGRvYy5vbignY2xpY2snLCAnLmxpc3RlbmVyLWhvdycsIGFzeW5jIChlKSA9PiB7CiAgICAgICAgICAgICAgICBsZXQgbyA9IF9mYWN0b3J5KGUpOwogICAgICAgICAgICAgICAgbGV0IGluZGV4ID0gby5saW5rWzBdLmRhdGFzZXQuaW5kZXg7CiAgICAgICAgICAgICAgICBpZiAocmVxdWVzdFtpbmRleF0pIHsKICAgICAgICAgICAgICAgICAgICByZXF1ZXN0W2luZGV4XS5hYm9ydCgpOwogICAgICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoaW5zW2luZGV4XSk7CiAgICAgICAgICAgICAgICAgICAgby5wcm9ncmVzcy5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgby50aXAuc2hvdygpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGRvYy5vbignY2xpY2snLCAnLmxpc3RlbmVyLXN0b3AnLCBhc3luYyAoZSkgPT4gewogICAgICAgICAgICAgICAgbGV0IG8gPSBfZmFjdG9yeShlKTsKICAgICAgICAgICAgICAgIGxldCBpbmRleCA9IG8ubGlua1swXS5kYXRhc2V0LmluZGV4OwogICAgICAgICAgICAgICAgaWYgKHJlcXVlc3RbaW5kZXhdKSB7CiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFtpbmRleF0uYWJvcnQoKTsKICAgICAgICAgICAgICAgICAgICBjbGVhckludGVydmFsKGluc1tpbmRleF0pOwogICAgICAgICAgICAgICAgICAgIG8udGlwLmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICBvLnByb2dyZXNzLmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICBvLmxpbmsuc2hvdygwKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGRvYy5vbignY2xpY2snLCAnLmxpc3RlbmVyLWJhY2snLCBhc3luYyAoZSkgPT4gewogICAgICAgICAgICAgICAgbGV0IG8gPSBfZmFjdG9yeShlKTsKICAgICAgICAgICAgICAgIG8udGlwLmhpZGUoKTsKICAgICAgICAgICAgICAgIG8ubGluay5zaG93KCk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBkb2Mub24oJ2NsaWNrJywgJy5saXN0ZW5lci1saW5rLWFyaWEsIC5saXN0ZW5lci1jb3B5LWFsbCcsIChlKSA9PiB7CiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICBpZiAoIWUudGFyZ2V0LmRhdGFzZXQubGluaykgewogICAgICAgICAgICAgICAgICAgICQoZS50YXJnZXQpLnJlbW92ZUNsYXNzKCdsaXN0ZW5lci1jb3B5LWFsbCcpLmFkZENsYXNzKCdwbC1idG4tZGFuZ2VyJykuaHRtbChgJHtwYW4uaW5pdFs1XX3wn5GJPGEgaHJlZj0iJHtwYW4uYXNzaXN0YW50fSIgdGFyZ2V0PSJfYmxhbmsiIGNsYXNzPSJwbC1hIj7ngrnlh7vmraTlpITlronoo4U8L2E+8J+RiGApOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBiYXNlLnNldENsaXBib2FyZChkZWNvZGVVUklDb21wb25lbnQoZS50YXJnZXQuZGF0YXNldC5saW5rKSk7CiAgICAgICAgICAgICAgICAgICAgJChlLnRhcmdldCkudGV4dCgn5aSN5Yi25oiQ5Yqf77yM5b+r5Y6757KY6LS05ZCn77yBJykuYW5pbWF0ZSh7b3BhY2l0eTogJzAuNSd9LCAic2xvdyIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItbGluay1ycGMnLCBhc3luYyAoZSkgPT4gewogICAgICAgICAgICAgICAgbGV0IHRhcmdldCA9ICQoZS5jdXJyZW50VGFyZ2V0KTsKICAgICAgICAgICAgICAgIHRhcmdldC5maW5kKCcuaWNvbicpLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgdGFyZ2V0LmZpbmQoJy5wbC1sb2FkaW5nJykucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICB0YXJnZXQucHJlcGVuZChiYXNlLmNyZWF0ZUxvYWRpbmcoKSk7CiAgICAgICAgICAgICAgICBsZXQgcmVzID0gYXdhaXQgdGhpcy5zZW5kTGlua1RvUlBDKGUuY3VycmVudFRhcmdldC5kYXRhc2V0LmZpbGVuYW1lLCBlLmN1cnJlbnRUYXJnZXQuZGF0YXNldC5saW5rKTsKICAgICAgICAgICAgICAgIGlmIChyZXMgPT09ICdzdWNjZXNzJykgewogICAgICAgICAgICAgICAgICAgICQoJy5saXN0ZW5lci1ycGMtdGFzaycpLnNob3coKTsKICAgICAgICAgICAgICAgICAgICB0YXJnZXQucmVtb3ZlQ2xhc3MoJ3BsLWJ0bi1kYW5nZXInKS5odG1sKCflj5HpgIHmiJDlip/vvIzlv6vljrvnnIvnnIvlkKfvvIEnKS5hbmltYXRlKHtvcGFjaXR5OiAnMC41J30sICJzbG93Iik7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlcyA9PT0gJ2Fzc2lzdGFudCcpIHsKICAgICAgICAgICAgICAgICAgICB0YXJnZXQuYWRkQ2xhc3MoJ3BsLWJ0bi1kYW5nZXInKS5odG1sKGAke3Bhbi5pbml0WzVdffCfkYk8YSBocmVmPSIke3Bhbi5hc3Npc3RhbnR9IiB0YXJnZXQ9Il9ibGFuayIgY2xhc3M9InBsLWEiPueCueWHu+atpOWkhOWuieijhTwvYT7wn5GIYCk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHRhcmdldC5hZGRDbGFzcygncGwtYnRuLWRhbmdlcicpLnRleHQoJ+WPkemAgeWksei0pe+8jOivt+ajgOafpeaCqOeahFJQQ+mFjee9ruS/oeaBr++8gScpLmFuaW1hdGUoe29wYWNpdHk6ICcwLjUnfSwgInNsb3ciKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGRvYy5vbignY2xpY2snLCAnLmxpc3RlbmVyLXNlbmQtcnBjJywgKGUpID0+IHsKICAgICAgICAgICAgICAgICQoJy5saXN0ZW5lci1saW5rLXJwYycpLmNsaWNrKCk7CiAgICAgICAgICAgICAgICAkKGUudGFyZ2V0KS50ZXh0KCflj5HpgIHlrozmiJDvvIzlj5HpgIHnu5Pmnpzop4HkuIrmlrnmjInpkq7vvIEnKS5hbmltYXRlKHtvcGFjaXR5OiAnMC41J30sICJzbG93Iik7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBkb2Mub24oJ2NsaWNrJywgJy5saXN0ZW5lci1vcGVuLXNldHRpbmcnLCAoKSA9PiB7CiAgICAgICAgICAgICAgICBiYXNlLnNob3dTZXR0aW5nKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBkb2Mub24oJ2NsaWNrJywgJy5saXN0ZW5lci1ycGMtdGFzaycsICgpID0+IHsKICAgICAgICAgICAgICAgIGxldCBycGMgPSBKU09OLnN0cmluZ2lmeSh7CiAgICAgICAgICAgICAgICAgICAgZG9tYWluOiBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY19kb21haW4nKSwKICAgICAgICAgICAgICAgICAgICBwb3J0OiBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY19wb3J0JyksCiAgICAgICAgICAgICAgICB9KSwgdXJsID0gYCR7cGFuLmR9Lz9ycGM9JHtiYXNlLmUocnBjKX0jJHtiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY190b2tlbicpfWA7CiAgICAgICAgICAgICAgICBHTV9vcGVuSW5UYWIodXJsLCB7YWN0aXZlOiB0cnVlfSk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIChlKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAoZS50YXJnZXQubm9kZU5hbWUgPT09ICdBJyAmJiB+ZS50YXJnZXQuY2xhc3NOYW1lLmluZGV4T2YoJ3BsLWEnKSkgewogICAgICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sIHRydWUpOwogICAgICAgIH0sCgogICAgICAgIGFkZEJ1dHRvbigpIHsKICAgICAgICAgICAgaWYgKCFwdCkgcmV0dXJuOwogICAgICAgICAgICBsZXQgJHRvb2xXcmFwOwogICAgICAgICAgICBsZXQgJGJ1dHRvbiA9ICQoYDxkaXYgY2xhc3M9ImctZHJvcGRvd24tYnV0dG9uIHBvaW50ZXIgcGwtYnV0dG9uIj48ZGl2IHN0eWxlPSJjb2xvcjojZmZmO2JhY2tncm91bmQ6ICR7Y29sb3J9O2JvcmRlci1jb2xvcjoke2NvbG9yfSIgY2xhc3M9ImctYnV0dG9uIGctYnV0dG9uLWJsdWUiPjxzcGFuIGNsYXNzPSJnLWJ1dHRvbi1yaWdodCI+PGVtIGNsYXNzPSJpY29uIGljb24tZG93bmxvYWQiPjwvZW0+PHNwYW4gY2xhc3M9InRleHQiIHN0eWxlPSJ3aWR0aDogNjBweDsiPuS4i+i9veWKqeaJizwvc3Bhbj48L3NwYW4+PC9kaXY+PGRpdiBjbGFzcz0ibWVudSIgc3R5bGU9IndpZHRoOmF1dG87ei1pbmRleDo0MTtib3JkZXItY29sb3I6JHtjb2xvcn0iPjxkaXYgc3R5bGU9ImNvbG9yOiR7Y29sb3J9IiBjbGFzcz0iZy1idXR0b24tbWVudSBwbC1idXR0b24tbW9kZSIgZGF0YS1tb2RlPSJhcGkiPkFQSeS4i+i9vTwvZGl2PjxkaXYgc3R5bGU9ImNvbG9yOiR7Y29sb3J9IiBjbGFzcz0iZy1idXR0b24tbWVudSBwbC1idXR0b24tbW9kZSIgZGF0YS1tb2RlPSJhcmlhIj5Bcmlh5LiL6L29PC9kaXY+PGRpdiBzdHlsZT0iY29sb3I6JHtjb2xvcn0iIGNsYXNzPSJnLWJ1dHRvbi1tZW51IHBsLWJ1dHRvbi1tb2RlIiBkYXRhLW1vZGU9InJwYyI+UlBD5LiL6L29PC9kaXY+PGRpdiBzdHlsZT0iY29sb3I6JHtjb2xvcn0iIGNsYXNzPSJnLWJ1dHRvbi1tZW51IHBsLWJ1dHRvbi1tb2RlIiBkYXRhLW1vZGU9ImN1cmwiPmNVUkzkuIvovb08L2Rpdj48ZGl2IHN0eWxlPSJjb2xvcjoke2NvbG9yfSIgY2xhc3M9ImctYnV0dG9uLW1lbnUgcGwtYnV0dG9uLW1vZGUiIGRhdGEtbW9kZT0iYmMiPkJD5LiL6L29PC9kaXY+PC9kaXY+PC9kaXY+YCk7CiAgICAgICAgICAgIGlmIChwdCA9PT0gJ2hvbWUnKSAkdG9vbFdyYXAgPSAkKHBhbi5idG4uaG9tZSk7CiAgICAgICAgICAgIGlmIChwdCA9PT0gJ21haW4nKSB7CiAgICAgICAgICAgICAgICAkdG9vbFdyYXAgPSAkKHBhbi5idG4ubWFpbik7CiAgICAgICAgICAgICAgICAkYnV0dG9uID0gJChgPGRpdiBjbGFzcz0icGwtYnV0dG9uIiBzdHlsZT0icG9zaXRpb246IHJlbGF0aXZlOyBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IG1hcmdpbi1yaWdodDogOHB4OyI+PGJ1dHRvbiBjbGFzcz0idS1idXR0b24gdS1idXR0b24tLXByaW1hcnkgdS1idXR0b24tLXNtYWxsIGlzLXJvdW5kIGlzLWhhcy1pY29uIiBzdHlsZT0iYmFja2dyb3VuZDogJHtjb2xvcn07Ym9yZGVyLWNvbG9yOiAke2NvbG9yfTtmb250LXNpemU6IDE0cHg7IHBhZGRpbmc6IDhweCAxNnB4OyBib3JkZXI6IG5vbmU7Ij48aSBjbGFzcz0idS1pY29uIHUtaWNvbi1kb3dubG9hZCI+PC9pPjxzcGFuPuS4i+i9veWKqeaJizwvc3Bhbj48L2J1dHRvbj48dWwgY2xhc3M9ImRyb3Bkb3duLWxpc3QgbmQtY29tbW9uLWZsb2F0LW1lbnUgcGwtZHJvcGRvd24tbWVudSI+PGxpIGNsYXNzPSJzdWIgY3Vyc29yLXAgcGwtYnV0dG9uLW1vZGUiIGRhdGEtbW9kZT0iYXBpIj5BUEnkuIvovb08L2xpPjxsaSBjbGFzcz0ic3ViIGN1cnNvci1wIHBsLWJ1dHRvbi1tb2RlIiBkYXRhLW1vZGU9ImFyaWEiPkFyaWHkuIvovb08L2xpPjxsaSBjbGFzcz0ic3ViIGN1cnNvci1wIHBsLWJ1dHRvbi1tb2RlIiBkYXRhLW1vZGU9InJwYyI+UlBD5LiL6L29PC9saT48bGkgY2xhc3M9InN1YiBjdXJzb3ItcCBwbC1idXR0b24tbW9kZSIgZGF0YS1tb2RlPSJjdXJsIj5jVVJM5LiL6L29PC9saT48bGkgY2xhc3M9InN1YiBjdXJzb3ItcCBwbC1idXR0b24tbW9kZSIgZGF0YS1tb2RlPSJiYyIgPkJD5LiL6L29PC9saT48L3VsPjwvZGl2PmApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChwdCA9PT0gJ3NoYXJlJykgJHRvb2xXcmFwID0gJChwYW4uYnRuLnNoYXJlKTsKICAgICAgICAgICAgJHRvb2xXcmFwLnByZXBlbmQoJGJ1dHRvbik7CiAgICAgICAgICAgIHRoaXMuc2V0QkRVU1MoKTsKICAgICAgICAgICAgdGhpcy5hZGRQYWdlTGlzdGVuZXIoKTsKICAgICAgICB9LAoKICAgICAgICBhZGRJbml0QnV0dG9uKCkgewogICAgICAgICAgICBpZiAoIXB0KSByZXR1cm47CiAgICAgICAgICAgIGxldCAkdG9vbFdyYXA7CiAgICAgICAgICAgIGxldCAkYnV0dG9uID0gJChgPGRpdiBjbGFzcz0iZy1kcm9wZG93bi1idXR0b24gcG9pbnRlciBwbC1idXR0b24taW5pdCIgc3R5bGU9Im9wYWNpdHk6LjUiPjxkaXYgc3R5bGU9ImNvbG9yOiNmZmY7YmFja2dyb3VuZDogJHtjb2xvcn07Ym9yZGVyLWNvbG9yOiR7Y29sb3J9IiBjbGFzcz0iZy1idXR0b24gZy1idXR0b24tYmx1ZSI+PHNwYW4gY2xhc3M9ImctYnV0dG9uLXJpZ2h0Ij48ZW0gY2xhc3M9Imljb24gaWNvbi1kb3dubG9hZCI+PC9lbT48c3BhbiBjbGFzcz0idGV4dCIgc3R5bGU9IndpZHRoOiA2MHB4OyI+5LiL6L295Yqp5omLPC9zcGFuPjwvc3Bhbj48L2Rpdj48L2Rpdj5gKTsKICAgICAgICAgICAgaWYgKHB0ID09PSAnaG9tZScpICR0b29sV3JhcCA9ICQocGFuLmJ0bi5ob21lKTsKICAgICAgICAgICAgaWYgKHB0ID09PSAnbWFpbicpIHsKICAgICAgICAgICAgICAgICR0b29sV3JhcCA9ICQocGFuLmJ0bi5tYWluKTsKICAgICAgICAgICAgICAgICRidXR0b24gPSAkKGA8ZGl2IGNsYXNzPSJwbC1idXR0b24taW5pdCIgc3R5bGU9Im9wYWNpdHk6LjU7IGRpc3BsYXk6IGlubGluZS1ibG9jazsgbWFyZ2luLXJpZ2h0OiA4cHg7Ij48YnV0dG9uIGNsYXNzPSJ1LWJ1dHRvbiB1LWJ1dHRvbi0tcHJpbWFyeSB1LWJ1dHRvbi0tc21hbGwgaXMtcm91bmQgaXMtaGFzLWljb24iIHN0eWxlPSJiYWNrZ3JvdW5kOiAke2NvbG9yfTtib3JkZXItY29sb3I6ICR7Y29sb3J9O2ZvbnQtc2l6ZTogMTRweDsgcGFkZGluZzogOHB4IDE2cHg7IGJvcmRlcjogbm9uZTsiPjxpIGNsYXNzPSJ1LWljb24gdS1pY29uLWRvd25sb2FkIj48L2k+PHNwYW4+5LiL6L295Yqp5omLPC9zcGFuPjwvYnV0dG9uPjwvZGl2PmApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChwdCA9PT0gJ3NoYXJlJykgJHRvb2xXcmFwID0gJChwYW4uYnRuLnNoYXJlKTsKICAgICAgICAgICAgJHRvb2xXcmFwLnByZXBlbmQoJGJ1dHRvbik7CiAgICAgICAgICAgICRidXR0b24uY2xpY2soKCkgPT4gYmFzZS5pbml0RGlhbG9nKCkpOwogICAgICAgIH0sCgogICAgICAgIGFzeW5jIGdldFRva2VuKCkgewogICAgICAgICAgICBsZXQgcmVzID0gYXdhaXQgYmFzZS5nZXRGaW5hbFVybChwYW4ucGNzWzNdKTsKICAgICAgICAgICAgaWYgKHJlcy5pbmRleE9mKCdhY2Nlc3NfdG9rZW4nKSA9PT0gLTEpIHsKICAgICAgICAgICAgICAgIGxldCBodG1sID0gYXdhaXQgYmFzZS5nZXQocGFuLnBjc1szXSwge30sICd0ZXh0Jyk7CiAgICAgICAgICAgICAgICBsZXQgYmRzdG9rZW4gPSBodG1sLm1hdGNoKC9uYW1lPSJiZHN0b2tlbiJccyt2YWx1ZT0iKFteIl0rKSIvKT8uWzFdOwogICAgICAgICAgICAgICAgbGV0IGNsaWVudF9pZCA9IGh0bWwubWF0Y2goL25hbWU9ImNsaWVudF9pZCJccyt2YWx1ZT0iKFteIl0rKSIvKT8uWzFdOwogICAgICAgICAgICAgICAgbGV0IGRhdGEgPSB7CiAgICAgICAgICAgICAgICAgICAgZ3JhbnRfcGVybWlzc2lvbnNfYXJyOiAnbmV0ZGlzaycsCiAgICAgICAgICAgICAgICAgICAgYmRzdG9rZW46IGJkc3Rva2VuLAogICAgICAgICAgICAgICAgICAgIGNsaWVudF9pZDogY2xpZW50X2lkLAogICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlX3R5cGU6ICJ0b2tlbiIsCiAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogInBhZ2UiLAogICAgICAgICAgICAgICAgICAgIGdyYW50X3Blcm1pc3Npb25zOiAiYmFzaWMsbmV0ZGlzayIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGF3YWl0IGJhc2UucG9zdChwYW4ucGNzWzNdLCBiYXNlLnN0cmluZ2lmeShkYXRhKSwgewogICAgICAgICAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJywKICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICBsZXQgcmVzMiA9IGF3YWl0IGJhc2UuZ2V0RmluYWxVcmwocGFuLnBjc1szXSk7CiAgICAgICAgICAgICAgICBsZXQgYWNjZXNzVG9rZW4gPSByZXMyLm1hdGNoKC9hY2Nlc3NfdG9rZW49KFteJl0rKS8pPy5bMV07CiAgICAgICAgICAgICAgICBhY2Nlc3NUb2tlbiAmJiBiYXNlLnNldFN0b3JhZ2UoJ2FjY2Vzc1Rva2VuJywgYWNjZXNzVG9rZW4pOwogICAgICAgICAgICAgICAgcmV0dXJuIGFjY2Vzc1Rva2VuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxldCBhY2Nlc3NUb2tlbiA9IHJlcy5tYXRjaCgvYWNjZXNzX3Rva2VuPShbXiZdKykvKT8uWzFdOwogICAgICAgICAgICBhY2Nlc3NUb2tlbiAmJiBiYXNlLnNldFN0b3JhZ2UoJ2FjY2Vzc1Rva2VuJywgYWNjZXNzVG9rZW4pOwogICAgICAgICAgICByZXR1cm4gYWNjZXNzVG9rZW47CiAgICAgICAgfSwKCiAgICAgICAgYXN5bmMgZ2V0UENTTGluayhtYXhSZXF1ZXN0VGltZSA9IDIpIHsKICAgICAgICAgICAgc2VsZWN0TGlzdCA9IHRoaXMuZ2V0U2VsZWN0ZWRMaXN0KCk7CiAgICAgICAgICAgIGxldCBmaWRMaXN0ID0gdGhpcy5fZ2V0RmlkTGlzdCgpLCB1cmwsIHJlczsKCiAgICAgICAgICAgIGlmIChwdCA9PT0gJ2hvbWUnIHx8IHB0ID09PSAnbWFpbicpIHsKICAgICAgICAgICAgICAgIGlmIChzZWxlY3RMaXN0Lmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBtZXNzYWdlLmVycm9yKCfmj5DnpLrvvJror7flhYjli77pgInopoHkuIvovb3nmoTmlofku7bvvIEnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChmaWRMaXN0Lmxlbmd0aCA9PT0gMikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBtZXNzYWdlLmVycm9yKCfmj5DnpLrvvJror7fmiZPlvIDmlofku7blpLnlkI7li77pgInmlofku7bvvIEnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZpZExpc3QgPSBlbmNvZGVVUklDb21wb25lbnQoZmlkTGlzdCk7CiAgICAgICAgICAgICAgICBsZXQgYWNjZXNzVG9rZW4gPSBiYXNlLmdldFN0b3JhZ2UoJ2FjY2Vzc1Rva2VuJykgfHwgYXdhaXQgdGhpcy5nZXRUb2tlbigpOwogICAgICAgICAgICAgICAgdXJsID0gYCR7cGFuLnBjc1swXX0mZnNpZHM9JHtmaWRMaXN0fSZhY2Nlc3NfdG9rZW49JHthY2Nlc3NUb2tlbn1gOwogICAgICAgICAgICAgICAgcmVzID0gYXdhaXQgYmFzZS5nZXQodXJsLCB7IlVzZXItQWdlbnQiOiBwYW4udWF9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAocHQgPT09ICdzaGFyZScpIHsKICAgICAgICAgICAgICAgIHRoaXMuZ2V0U2hhcmVEYXRhKCk7CiAgICAgICAgICAgICAgICBpZiAoc2VsZWN0TGlzdC5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWVzc2FnZS5lcnJvcign5o+Q56S677ya6K+35YWI5Yu+6YCJ6KaB5LiL6L2955qE5paH5Lu277yBJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoZmlkTGlzdC5sZW5ndGggPT09IDIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWVzc2FnZS5lcnJvcign5o+Q56S677ya6K+35omT5byA5paH5Lu25aS55ZCO5Yu+6YCJ5paH5Lu277yBJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIXBhcmFtcy5zaWduKSB7CiAgICAgICAgICAgICAgICAgICAgbGV0IHVybCA9IGAke3Bhbi5wY3NbMl19JnN1cmw9JHtwYXJhbXMuc3VybH0mbG9naWQ9JHtwYXJhbXMubG9naWR9YDsKICAgICAgICAgICAgICAgICAgICBsZXQgciA9IGF3YWl0IGJhc2UuZ2V0KHVybCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHIuZXJybm8gPT09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLnNpZ24gPSByLmRhdGEuc2lnbjsKICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLnRpbWVzdGFtcCA9IHIuZGF0YS50aW1lc3RhbXA7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRpYWxvZyA9IGF3YWl0IFN3YWwuZmlyZSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2FzdDogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb246ICdpbmZvJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiBg5o+Q56S677ya6K+35bCG5paH5Lu2PHNwYW4gY2xhc3M9InRhZy1kYW5nZXIiPlvkv53lrZjliLDnvZHnm5hdPC9zcGFuPvCfkYnliY3lvoA8c3BhbiBjbGFzcz0idGFnLWRhbmdlciI+W+aIkeeahOe9keebmF08L3NwYW4+5Lit5LiL6L2977yBYCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dDb25maXJtQnV0dG9uOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlybUJ1dHRvblRleHQ6ICfngrnlh7vkv53lrZgnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246ICd0b3AnLAogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpYWxvZy5pc0NvbmZpcm1lZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnLnRvb2xzLXNoYXJlLXNhdmUtaGInKVswXS5jbGljaygpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIXBhcmFtcy5iZHN0b2tlbikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBtZXNzYWdlLmVycm9yKCfmj5DnpLrvvJror7flhYjnmbvlvZXnvZHnm5jvvIEnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGxldCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpOwogICAgICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKCdlbmNyeXB0JywgcGFyYW1zLmVuY3J5cHQpOwogICAgICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKCdwcm9kdWN0JywgcGFyYW1zLnByb2R1Y3QpOwogICAgICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKCd1aycsIHBhcmFtcy51ayk7CiAgICAgICAgICAgICAgICBmb3JtRGF0YS5hcHBlbmQoJ3ByaW1hcnlpZCcsIHBhcmFtcy5wcmltYXJ5aWQpOwogICAgICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKCdmaWRfbGlzdCcsIGZpZExpc3QpOwogICAgICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKCdsb2dpZCcsIHBhcmFtcy5sb2dpZCk7CiAgICAgICAgICAgICAgICBwYXJhbXMuc2hhcmVUeXBlID09PSAnc2VjcmV0JyA/IGZvcm1EYXRhLmFwcGVuZCgnZXh0cmEnLCBwYXJhbXMuZXh0cmEpIDogJyc7CiAgICAgICAgICAgICAgICB1cmwgPSBgJHtwYW4ucGNzWzFdfSZzaWduPSR7cGFyYW1zLnNpZ259JnRpbWVzdGFtcD0ke3BhcmFtcy50aW1lc3RhbXB9YDsKICAgICAgICAgICAgICAgIHJlcyA9IGF3YWl0IGJhc2UucG9zdCh1cmwsIGZvcm1EYXRhLCB7IlVzZXItQWdlbnQiOiBwYW4udWF9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAocmVzLmVycm5vID09PSAwKSB7CiAgICAgICAgICAgICAgICBsZXQgaHRtbCA9IHRoaXMuZ2VuZXJhdGVEb20ocmVzLmxpc3QpOwogICAgICAgICAgICAgICAgdGhpcy5zaG93TWFpbkRpYWxvZyhwYW5bbW9kZV1bMF0sIGh0bWwsIHBhblttb2RlXVsxXSk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzLmVycm5vID09PSAxMTIpIHsKICAgICAgICAgICAgICAgIHJldHVybiBtZXNzYWdlLmVycm9yKCfmj5DnpLrvvJrpobXpnaLov4fmnJ/vvIzor7fliLfmlrDph43or5XvvIEnKTsKICAgICAgICAgICAgfSBlbHNlIGlmIChyZXMuZXJybm8gPT09IDkwMTkpIHsKICAgICAgICAgICAgICAgIG1heFJlcXVlc3RUaW1lLS07CiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmdldFRva2VuKCk7CiAgICAgICAgICAgICAgICBpZiAobWF4UmVxdWVzdFRpbWUgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5nZXRQQ1NMaW5rKG1heFJlcXVlc3RUaW1lKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5lcnJvcign5o+Q56S677ya6I635Y+W5LiL6L296ZO+5o6l5aSx6LSl77yB6K+35Yi35paw572R6aG15ZCO6YeN6K+V77yBJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBtZXNzYWdlLmVycm9yKCfmj5DnpLrvvJrojrflj5bkuIvovb3pk77mjqXlpLHotKXvvIHor7fliLfmlrDnvZHpobXlkI7ph43or5XvvIEnKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGdlbmVyYXRlRG9tKGxpc3QpIHsKICAgICAgICAgICAgbGV0IGNvbnRlbnQgPSAnPGRpdiBjbGFzcz0icGwtbWFpbiI+JzsKICAgICAgICAgICAgbGV0IGFsaW5rQWxsVGV4dCA9ICcnOwogICAgICAgICAgICBiYXNlLnNvcnRCeU5hbWUobGlzdCk7CiAgICAgICAgICAgIGxpc3QuZm9yRWFjaCgodiwgaSkgPT4gewogICAgICAgICAgICAgICAgaWYgKHYuaXNkaXIgPT09IDEpIHJldHVybjsKICAgICAgICAgICAgICAgIGxldCBmaWxlbmFtZSA9IHYuc2VydmVyX2ZpbGVuYW1lIHx8IHYuZmlsZW5hbWU7CiAgICAgICAgICAgICAgICBsZXQgZXh0ID0gYmFzZS5nZXRFeHRlbnNpb24oZmlsZW5hbWUpOwogICAgICAgICAgICAgICAgbGV0IHNpemUgPSBiYXNlLnNpemVGb3JtYXQodi5zaXplKTsKICAgICAgICAgICAgICAgIGxldCBkbGluayA9IHYuZGxpbms7CiAgICAgICAgICAgICAgICBpZiAobW9kZSA9PT0gJ2FwaScpIHsKICAgICAgICAgICAgICAgICAgICBjb250ZW50ICs9IGA8ZGl2IGNsYXNzPSJwbC1pdGVtIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwbC1pdGVtLW5hbWUgbGlzdGVuZXItdGlwIiBkYXRhLXNpemU9IiR7c2l6ZX0iPiR7ZmlsZW5hbWV9PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9InBsLWl0ZW0tbGluayBwbC1hIGxpc3RlbmVyLWxpbmstYXBpIiBocmVmPSIke2RsaW5rfSIgZGF0YS1maWxlbmFtZT0iJHtmaWxlbmFtZX0iIGRhdGEtbGluaz0iJHtkbGlua30iIGRhdGEtaW5kZXg9IiR7aX0iPiR7ZGxpbmt9PC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBsLWl0ZW0tdGlwIiBzdHlsZT0iZGlzcGxheTogbm9uZSI+PHNwYW4+6Iul5rKh5pyJ5by55Ye6SURN5LiL6L295qGG77yM5om+5YiwSURNIDxiPumAiemhuTwvYj4gLT4gPGI+5paH5Lu257G75Z6LPC9iPiAtPiA8Yj7nrKzkuIDkuKrmoYY8L2I+IOS4rea3u+WKoOWQjue8gCA8c3BhbiBjbGFzcz0icGwtZXh0Ij4ke2V4dH08L3NwYW4+77yMPGEgaHJlZj0iJHtwYW4uaWRtfSIgdGFyZ2V0PSJfYmxhbmsiIGNsYXNzPSJwbC1hIj7or6bop4HmraTlpIQ8L2E+PC9zcGFuPiA8c3BhbiBjbGFzcz0icGwtYmFjayBsaXN0ZW5lci1iYWNrIj7ov5Tlm548L3NwYW4+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGwtaXRlbS1wcm9ncmVzcyIgc3R5bGU9ImRpc3BsYXk6IG5vbmUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwbC1wcm9ncmVzcyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwbC1wcm9ncmVzcy1vdXRlciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwbC1wcm9ncmVzcy1pbm5lciIgc3R5bGU9IndpZHRoOjUlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGwtcHJvZ3Jlc3MtaW5uZXItdGV4dCI+MCU8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InBsLXByb2dyZXNzLXN0b3AgbGlzdGVuZXItc3RvcCI+5Y+W5raI5LiL6L29PC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0icGwtcHJvZ3Jlc3MtdGlwIj7mnKrlj5HnjrBJRE3vvIzkvb/nlKjoh6rluKbmtY/op4jlmajkuIvovb08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJwbC1wcm9ncmVzcy1ob3cgbGlzdGVuZXItaG93Ij7lpoLkvZXllKTotbdJRE3vvJ88L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+PC9kaXY+YDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChtb2RlID09PSAnYXJpYScpIHsKICAgICAgICAgICAgICAgICAgICBsZXQgYWxpbmsgPSB0aGlzLmNvbnZlcnRMaW5rVG9BcmlhKGRsaW5rLCBmaWxlbmFtZSwgcGFuLnVhKTsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIChhbGluaykgPT09ICdvYmplY3QnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWl0ZW0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBsLWl0ZW0tbmFtZSBsaXN0ZW5lci10aXAiIGRhdGEtc2l6ZT0iJHtzaXplfSI+JHtmaWxlbmFtZX08L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0icGwtaXRlbS1saW5rIHBsLWEiIHRhcmdldD0iX2JsYW5rIiBocmVmPSIke2FsaW5rLmxpbmt9IiB0aXRsZT0i54K55Ye75aSN5Yi2YXJpYTJj6ZO+5o6lIiBkYXRhLWZpbGVuYW1lPSIke2ZpbGVuYW1lfSIgZGF0YS1saW5rPSIke2FsaW5rLmxpbmt9Ij4ke2RlY29kZVVSSUNvbXBvbmVudChhbGluay50ZXh0KX08L2E+IDwvZGl2PmA7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgYWxpbmtBbGxUZXh0ICs9IGFsaW5rICsgJ1xyXG4nOwogICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50ICs9IGA8ZGl2IGNsYXNzPSJwbC1pdGVtIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwbC1pdGVtLW5hbWUgbGlzdGVuZXItdGlwIiBkYXRhLXNpemU9IiR7c2l6ZX0iPiR7ZmlsZW5hbWV9PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9InBsLWl0ZW0tbGluayBwbC1hIGxpc3RlbmVyLWxpbmstYXJpYSIgaHJlZj0iJHthbGlua30iIHRpdGxlPSLngrnlh7vlpI3liLZhcmlhMmPpk77mjqUiIGRhdGEtZmlsZW5hbWU9IiR7ZmlsZW5hbWV9IiBkYXRhLWxpbms9IiR7YWxpbmt9Ij4ke2RlY29kZVVSSUNvbXBvbmVudChhbGluayl9PC9hPiA8L2Rpdj5gOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChtb2RlID09PSAncnBjJykgewogICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWl0ZW0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBsLWl0ZW0tbmFtZSBsaXN0ZW5lci10aXAiIGRhdGEtc2l6ZT0iJHtzaXplfSI+JHtmaWxlbmFtZX08L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJwbC1pdGVtLWxpbmsgbGlzdGVuZXItbGluay1ycGMgcGwtYnRuLXByaW1hcnkgcGwtYnRuLWluZm8iIGRhdGEtZmlsZW5hbWU9IiR7ZmlsZW5hbWV9IiBkYXRhLWxpbms9IiR7ZGxpbmt9Ij48ZW0gY2xhc3M9Imljb24gaWNvbi1kZXZpY2UiPjwvZW0+PHNwYW4gc3R5bGU9Im1hcmdpbi1sZWZ0OiA1cHg7Ij7mjqjpgIHliLAgUlBDIOS4i+i9veWZqDwvc3Bhbj48L2J1dHRvbj48L2Rpdj5gOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKG1vZGUgPT09ICdjdXJsJykgewogICAgICAgICAgICAgICAgICAgIGxldCBhbGluayA9IHRoaXMuY29udmVydExpbmtUb0N1cmwoZGxpbmssIGZpbGVuYW1lLCBwYW4udWEpOwogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgKGFsaW5rKSA9PT0gJ29iamVjdCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudCArPSBgPGRpdiBjbGFzcz0icGwtaXRlbSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGwtaXRlbS1uYW1lIGxpc3RlbmVyLXRpcCIgZGF0YS1zaXplPSIke3NpemV9Ij4ke2ZpbGVuYW1lfTwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJwbC1pdGVtLWxpbmsgcGwtYSIgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9IiR7YWxpbmsubGlua30iIHRpdGxlPSLngrnlh7vlpI3liLZjdXJs6ZO+5o6lIiBkYXRhLWZpbGVuYW1lPSIke2ZpbGVuYW1lfSIgZGF0YS1saW5rPSIke2FsaW5rLmxpbmt9Ij4ke2RlY29kZVVSSUNvbXBvbmVudChhbGluay50ZXh0KX08L2E+IDwvZGl2PmA7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgYWxpbmtBbGxUZXh0ICs9IGFsaW5rICsgJ1xyXG4nOwogICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50ICs9IGA8ZGl2IGNsYXNzPSJwbC1pdGVtIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwbC1pdGVtLW5hbWUgbGlzdGVuZXItdGlwIiBkYXRhLXNpemU9IiR7c2l6ZX0iPiR7ZmlsZW5hbWV9PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9InBsLWl0ZW0tbGluayBwbC1hIGxpc3RlbmVyLWxpbmstYXJpYSIgaHJlZj0iJHthbGlua30iIHRpdGxlPSLngrnlh7vlpI3liLZjdXJs6ZO+5o6lIiBkYXRhLWZpbGVuYW1lPSIke2ZpbGVuYW1lfSIgZGF0YS1saW5rPSIke2FsaW5rfSI+JHtkZWNvZGVVUklDb21wb25lbnQoYWxpbmspfTwvYT4gPC9kaXY+YDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAobW9kZSA9PT0gJ2JjJykgewogICAgICAgICAgICAgICAgICAgIGxldCBhbGluayA9IHRoaXMuY29udmVydExpbmtUb0JDKGRsaW5rLCBmaWxlbmFtZSwgcGFuLnVhKTsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIChhbGluaykgPT09ICdvYmplY3QnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWl0ZW0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBsLWl0ZW0tbmFtZSBsaXN0ZW5lci10aXAiIGRhdGEtc2l6ZT0iJHtzaXplfSI+JHtmaWxlbmFtZX08L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0icGwtaXRlbS1saW5rIHBsLWEiIGhyZWY9IiR7ZGVjb2RlVVJJQ29tcG9uZW50KGFsaW5rLmxpbmspfSIgdGl0bGU9IueCueWHu+eUqOavlOeJueW9l+aYn+S4i+i9vSIgZGF0YS1maWxlbmFtZT0iJHtmaWxlbmFtZX0iIGRhdGEtbGluaz0iJHthbGlua30iPiR7ZGVjb2RlVVJJQ29tcG9uZW50KGFsaW5rLnRleHQpfTwvYT4gPC9kaXY+YDsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBhbGlua0FsbFRleHQgKz0gYWxpbmsgKyAnXHJcbic7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWl0ZW0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBsLWl0ZW0tbmFtZSBsaXN0ZW5lci10aXAiIGRhdGEtc2l6ZT0iJHtzaXplfSI+JHtmaWxlbmFtZX08L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0icGwtaXRlbS1saW5rIHBsLWEiIGhyZWY9IiR7ZGVjb2RlVVJJQ29tcG9uZW50KGFsaW5rKX0iIHRpdGxlPSLngrnlh7vnlKjmr5TnibnlvZfmmJ/kuIvovb0iIGRhdGEtZmlsZW5hbWU9IiR7ZmlsZW5hbWV9IiBkYXRhLWxpbms9IiR7YWxpbmt9Ij4ke2RlY29kZVVSSUNvbXBvbmVudChhbGluayl9PC9hPiA8L2Rpdj5gOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGNvbnRlbnQgKz0gJzwvZGl2Pic7CiAgICAgICAgICAgIGlmIChtb2RlID09PSAnYXJpYScpCiAgICAgICAgICAgICAgICBjb250ZW50ICs9IGA8ZGl2IGNsYXNzPSJwbC1leHRyYSI+PGJ1dHRvbiBjbGFzcz0icGwtYnRuLXByaW1hcnkgbGlzdGVuZXItY29weS1hbGwiIGRhdGEtbGluaz0iJHthbGlua0FsbFRleHR9Ij7lpI3liLblhajpg6jpk77mjqU8L2J1dHRvbj48L2Rpdj5gOwogICAgICAgICAgICBpZiAobW9kZSA9PT0gJ3JwYycpIHsKICAgICAgICAgICAgICAgIGxldCBycGMgPSBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY19kb21haW4nKSArICc6JyArIGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX3BvcnQnKSArIGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX3BhdGgnKTsKICAgICAgICAgICAgICAgIGNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWV4dHJhIj48YnV0dG9uIGNsYXNzPSJwbC1idG4tcHJpbWFyeSBsaXN0ZW5lci1zZW5kLXJwYyI+5Y+R6YCB5YWo6YOo6ZO+5o6lPC9idXR0b24+PGJ1dHRvbiB0aXRsZT0iJHtycGN9IiBjbGFzcz0icGwtYnRuLXByaW1hcnkgcGwtYnRuLXdhcm5pbmcgbGlzdGVuZXItb3Blbi1zZXR0aW5nIiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDEwcHgiPuiuvue9riBSUEMg5Y+C5pWw77yI5b2T5YmN5Li677yaJHtycGN977yJPC9idXR0b24+PGJ1dHRvbiBjbGFzcz0icGwtYnRuLXByaW1hcnkgcGwtYnRuLXN1Y2Nlc3MgbGlzdGVuZXItcnBjLXRhc2siIHN0eWxlPSJtYXJnaW4tbGVmdDogMTBweDtkaXNwbGF5OiBub25lIj7mn6XnnIvkuIvovb3ku7vliqE8L2J1dHRvbj48L2Rpdj5gOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChtb2RlID09PSAnY3VybCcpCiAgICAgICAgICAgICAgICBjb250ZW50ICs9IGA8ZGl2IGNsYXNzPSJwbC1leHRyYSI+PGJ1dHRvbiBjbGFzcz0icGwtYnRuLXByaW1hcnkgbGlzdGVuZXItY29weS1hbGwiIGRhdGEtbGluaz0iJHthbGlua0FsbFRleHR9Ij7lpI3liLblhajpg6jpk77mjqU8L2J1dHRvbj48YnV0dG9uIGNsYXNzPSJwbC1idG4tcHJpbWFyeSBwbC1idG4td2FybmluZyBsaXN0ZW5lci1vcGVuLXNldHRpbmciIHN0eWxlPSJtYXJnaW4tbGVmdDogMTBweDsiPuiuvue9rue7iOerr+exu+Wei++8iOW9k+WJjeS4uu+8miR7dGVybWluYWxUeXBlW2Jhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfdGVybWluYWxfdHlwZScpXX3vvIk8L2J1dHRvbj48L2Rpdj5gOwogICAgICAgICAgICByZXR1cm4gY29udGVudDsKICAgICAgICB9LAoKICAgICAgICBhc3luYyBzZW5kTGlua1RvUlBDKGZpbGVuYW1lLCBsaW5rKSB7CiAgICAgICAgICAgIGxldCBycGMgPSB7CiAgICAgICAgICAgICAgICBkb21haW46IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX2RvbWFpbicpLAogICAgICAgICAgICAgICAgcG9ydDogYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfcG9ydCcpLAogICAgICAgICAgICAgICAgcGF0aDogYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfcGF0aCcpLAogICAgICAgICAgICAgICAgdG9rZW46IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX3Rva2VuJyksCiAgICAgICAgICAgICAgICBkaXI6IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX2RpcicpLAogICAgICAgICAgICB9OwogICAgICAgICAgICBsZXQgQkRVU1MgPSB0aGlzLmdldEJEVVNTKCk7CiAgICAgICAgICAgIGlmICghQkRVU1MpIHJldHVybiAnYXNzaXN0YW50JzsKCiAgICAgICAgICAgIGxldCB1cmwgPSBgJHtycGMuZG9tYWlufToke3JwYy5wb3J0fSR7cnBjLnBhdGh9YDsKICAgICAgICAgICAgbGV0IHJwY0RhdGEgPSB7CiAgICAgICAgICAgICAgICBpZDogbmV3IERhdGUoKS5nZXRUaW1lKCksCiAgICAgICAgICAgICAgICBqc29ucnBjOiAnMi4wJywKICAgICAgICAgICAgICAgIG1ldGhvZDogJ2FyaWEyLmFkZFVyaScsCiAgICAgICAgICAgICAgICBwYXJhbXM6IFtgdG9rZW46JHtycGMudG9rZW59YCwgW2xpbmtdLCB7CiAgICAgICAgICAgICAgICAgICAgZGlyOiBycGMuZGlyLAogICAgICAgICAgICAgICAgICAgIG91dDogZmlsZW5hbWUsCiAgICAgICAgICAgICAgICAgICAgaGVhZGVyOiBbYFVzZXItQWdlbnQ6ICR7cGFuLnVhfWAsIGBDb29raWU6IEJEVVNTPSR7QkRVU1N9YF0KICAgICAgICAgICAgICAgIH1dCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBsZXQgcmVzID0gYXdhaXQgYmFzZS5wb3N0KHVybCwgcnBjRGF0YSwgeyJVc2VyLUFnZW50IjogcGFuLnVhfSwgJycpOwogICAgICAgICAgICAgICAgaWYgKHJlcy5yZXN1bHQpIHJldHVybiAnc3VjY2Vzcyc7CiAgICAgICAgICAgICAgICByZXR1cm4gJ2ZhaWwnOwogICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJ2ZhaWwnOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgZ2V0U2VsZWN0ZWRMaXN0KCkgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgcmV0dXJuIHJlcXVpcmUoJ3N5c3RlbS1jb3JlOmNvbnRleHQvY29udGV4dC5qcycpLmluc3RhbmNlRm9yU3lzdGVtLmxpc3QuZ2V0U2VsZWN0ZWQoKTsKICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy53cC1zLWNvcmUtcGFuJykuX192dWVfXy5zZWxlY3RlZExpc3Q7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBnZXRMb2dpZCgpIHsKICAgICAgICAgICAgbGV0IHV0ID0gcmVxdWlyZSgic3lzdGVtLWNvcmU6Y29udGV4dC9jb250ZXh0LmpzIikuaW5zdGFuY2VGb3JTeXN0ZW0udG9vbHMuYmFzZVNlcnZpY2U7CiAgICAgICAgICAgIHJldHVybiB1dC5iYXNlNjRFbmNvZGUoYmFzZS5nZXRDb29raWUoIkJBSURVSUQiKSk7CiAgICAgICAgfSwKCiAgICAgICAgZ2V0U2hhcmVEYXRhKCkgewogICAgICAgICAgICBsZXQgcmVzID0gbG9jYWxzLmR1bXAoKTsKICAgICAgICAgICAgcGFyYW1zLnNoYXJlVHlwZSA9ICdzZWNyZXQnOwogICAgICAgICAgICBwYXJhbXMuc2lnbiA9ICcnOwogICAgICAgICAgICBwYXJhbXMudGltZXN0YW1wID0gJyc7CiAgICAgICAgICAgIHBhcmFtcy5iZHN0b2tlbiA9IHJlcy5iZHN0b2tlbi52YWx1ZTsKICAgICAgICAgICAgcGFyYW1zLmNoYW5uZWwgPSAnY2h1bmxlaSc7CiAgICAgICAgICAgIHBhcmFtcy5jbGllbnR0eXBlID0gMDsKICAgICAgICAgICAgcGFyYW1zLndlYiA9IDE7CiAgICAgICAgICAgIHBhcmFtcy5hcHBfaWQgPSAyNTA1Mjg7CiAgICAgICAgICAgIHBhcmFtcy5lbmNyeXB0ID0gMDsKICAgICAgICAgICAgcGFyYW1zLnByb2R1Y3QgPSAnc2hhcmUnOwogICAgICAgICAgICBwYXJhbXMubG9naWQgPSB0aGlzLmdldExvZ2lkKCk7CiAgICAgICAgICAgIHBhcmFtcy5wcmltYXJ5aWQgPSByZXMuc2hhcmVpZC52YWx1ZTsKICAgICAgICAgICAgcGFyYW1zLnVrID0gcmVzLnNoYXJlX3VrLnZhbHVlOwogICAgICAgICAgICBwYXJhbXMuc2hhcmVUeXBlID09PSAnc2VjcmV0JyAmJiAocGFyYW1zLmV4dHJhID0gdGhpcy5fZ2V0RXh0cmEoKSk7CiAgICAgICAgICAgIHBhcmFtcy5zdXJsID0gdGhpcy5fZ2V0U3VybCgpOwogICAgICAgIH0sCgogICAgICAgIGRldGVjdFBhZ2UoKSB7CiAgICAgICAgICAgIGxldCBwYXRoID0gbG9jYXRpb24ucGF0aG5hbWU7CiAgICAgICAgICAgIGlmICgvXlwvZGlza1wvaG9tZS8udGVzdChwYXRoKSkgcmV0dXJuICdob21lJzsKICAgICAgICAgICAgaWYgKC9eXC9kaXNrXC9tYWluLy50ZXN0KHBhdGgpKSByZXR1cm4gJ21haW4nOwogICAgICAgICAgICBpZiAoL15cLyhzfHNoYXJlKVwvLy50ZXN0KHBhdGgpKSByZXR1cm4gJ3NoYXJlJzsKICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgfSwKCiAgICAgICAgc2hvd01haW5EaWFsb2codGl0bGUsIGh0bWwsIGZvb3RlcikgewogICAgICAgICAgICBTd2FsLmZpcmUoewogICAgICAgICAgICAgICAgdGl0bGUsCiAgICAgICAgICAgICAgICBodG1sLAogICAgICAgICAgICAgICAgZm9vdGVyLAogICAgICAgICAgICAgICAgYWxsb3dPdXRzaWRlQ2xpY2s6IGZhbHNlLAogICAgICAgICAgICAgICAgc2hvd0Nsb3NlQnV0dG9uOiB0cnVlLAogICAgICAgICAgICAgICAgc2hvd0NvbmZpcm1CdXR0b246IGZhbHNlLAogICAgICAgICAgICAgICAgcG9zaXRpb246ICd0b3AnLAogICAgICAgICAgICAgICAgd2lkdGgsCiAgICAgICAgICAgICAgICBwYWRkaW5nOiAnMTVweCAyMHB4IDVweCcsCiAgICAgICAgICAgICAgICBjdXN0b21DbGFzcywKICAgICAgICAgICAgfSkudGhlbigoKSA9PiB7CiAgICAgICAgICAgICAgICB0aGlzLl9yZXNldERhdGEoKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgYXN5bmMgaW5pdFBhbkxpbmtlcigpIHsKICAgICAgICAgICAgYmFzZS5pbml0RGVmYXVsdENvbmZpZygpOwogICAgICAgICAgICBiYXNlLmFkZFBhbkxpbmtlclN0eWxlKCk7CiAgICAgICAgICAgIHB0ID0gdGhpcy5kZXRlY3RQYWdlKCk7CiAgICAgICAgICAgIGxldCByZXMgPSBhd2FpdCBiYXNlLnBvc3QKICAgICAgICAgICAgKGBodHRwczovL2FwaS55b3V4aWFvaG91LmNvbS9jb25maWc/dmVyPSR7dmVyc2lvbn0mYT0ke2F1dGhvcn1gLCB7fSwge30sICd0ZXh0Jyk7CiAgICAgICAgICAgIHBhbiA9IEpTT04ucGFyc2UoYmFzZS5kKHJlcykpOwogICAgICAgICAgICBPYmplY3QuZnJlZXplICYmIE9iamVjdC5mcmVlemUocGFuKTsKICAgICAgICAgICAgY29uc29sZS5sb2cocGFuKTsKICAgICAgICAgICAgcGFuLm51bSA9PT0gYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19pbml0X2NvZGUnKSA/IHRoaXMuYWRkQnV0dG9uKCkgOiB0aGlzLmFkZEluaXRCdXR0b24oKTsKICAgICAgICAgICAgYmFzZS5jcmVhdGVUaXAoKTsKICAgICAgICAgICAgYmFzZS5yZWdpc3Rlck1lbnVDb21tYW5kKCk7CiAgICAgICAgfQogICAgfTsKCiAgICBsZXQgbWFpbiA9IHsKICAgICAgICBpbml0KCkgewogICAgICAgICAgICBpZiAoLyhwYW58eXVuKS5iYWlkdS5jb20vLnRlc3QobG9jYXRpb24uaG9zdCkpIHsKICAgICAgICAgICAgICAgIGJhaWR1LmluaXRQYW5MaW5rZXIoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH07CgogICAgbWFpbi5pbml0KCk7CiAgICB9CiAgICB9Cn0pKCk7
Add Comment
Please, Sign In to add comment