Dame: Unterschied zwischen den Versionen
Erscheinungsbild
K Schützte „Dame“: Auto-Spielschutz-Admin-only ([Bearbeiten=Nur Administratoren erlauben] (unbeschränkt) [Verschieben=Nur Administratoren erlauben] (unbeschränkt)) |
Spiele-ZIP-Metadaten in Diskussion verschoben |
||
| Zeile 6: | Zeile 6: | ||
PCFkb2N0eXBlIGh0bWw+CjxodG1sIGxhbmc9ImRlIj4KPGhlYWQ+CiAgPG1ldGEgY2hhcnNldD0idXRmLTgiPgogIDxtZXRhIG5hbWU9InZpZXdwb3J0IiBjb250ZW50PSJ3aWR0aD1kZXZpY2Utd2lkdGgsIGluaXRpYWwtc2NhbGU9MSwgdmlld3BvcnQtZml0PWNvdmVyIj4KICA8bWV0YSBuYW1lPSJ0aGVtZS1jb2xvciIgY29udGVudD0iIzE0MTgyNSI+CiAgPHRpdGxlPkRhbWUgTWVpc3RlcnNjaHVsZTwvdGl0bGU+CiAgCjxzdHlsZT4KOnJvb3QgewogIC0tYmc6ICMxMTE1MjE7CiAgLS1iZy1zb2Z0OiAjMTgxZTJlOwogIC0tcGFuZWw6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOSk7CiAgLS1wYW5lbC1zdHJvbmc6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNSk7CiAgLS10ZXh0OiAjZjhmYmZmOwogIC0tbXV0ZWQ6ICNiYWM0ZDY7CiAgLS1nb2xkOiAjZjJjMjYwOwogIC0tZ29sZC1zb2Z0OiByZ2JhKDI0MiwgMTk0LCA5NiwgMC4xOCk7CiAgLS1jeWFuOiAjNzZlMGQ2OwogIC0tZ29vZDogIzg0ZTA4YTsKICAtLWJhZDogI2ZmOGM4YzsKICAtLWRhcmstc3F1YXJlOiAjNWQzYzJiOwogIC0tbGlnaHQtc3F1YXJlOiAjZTlkN2I4OwogIC0tdmFsaWQ6ICM4Y2YwYTQ7CiAgLS1jYXB0dXJlOiAjZmZjZjcwOwogIC0tc2hhZG93OiAwIDI0cHggNzBweCByZ2JhKDAsIDAsIDAsIDAuMzYpOwogIC0tcmFkaXVzLXhsOiAzMHB4OwogIC0tcmFkaXVzLWxnOiAyMnB4OwogIC0tcmFkaXVzLW1kOiAxNnB4OwogIC0tdGFwLXNpemU6IDQ4cHg7CiAgZm9udC1mYW1pbHk6IHN5c3RlbS11aSwgLWFwcGxlLXN5c3RlbSwgQmxpbmtNYWNTeXN0ZW1Gb250LCAiU2Vnb2UgVUkiLCBzYW5zLXNlcmlmOwp9CgoqIHsKICBib3gtc2l6aW5nOiBib3JkZXItYm94Owp9CgpodG1sLApib2R5IHsKICBtaW4taGVpZ2h0OiAxMDAlOwogIG1hcmdpbjogMDsKICBiYWNrZ3JvdW5kOgogICAgcmFkaWFsLWdyYWRpZW50KGNpcmNsZSBhdCAxNSUgMTAlLCByZ2JhKDExOCwgMjI0LCAyMTQsIDAuMTgpLCB0cmFuc3BhcmVudCAyOHJlbSksCiAgICByYWRpYWwtZ3JhZGllbnQoY2lyY2xlIGF0IDkwJSA4JSwgcmdiYSgyNDIsIDE5NCwgOTYsIDAuMTQpLCB0cmFuc3BhcmVudCAyOHJlbSksCiAgICBsaW5lYXItZ3JhZGllbnQoMTQ1ZGVnLCAjMGMxMDE5IDAlLCAjMTcxYzJhIDQ4JSwgIzBmMTIxYyAxMDAlKTsKICBjb2xvcjogdmFyKC0tdGV4dCk7Cn0KCmJvZHkgewogIG1pbi1oZWlnaHQ6IDEwMHZoOwogIG1pbi1oZWlnaHQ6IDEwMGR2aDsKICBvdmVyZmxvdy14OiBoaWRkZW47Cn0KCmJ1dHRvbiB7CiAgZm9udDogaW5oZXJpdDsKfQoKYnV0dG9uOmZvY3VzLXZpc2libGUsClt0YWJpbmRleF06Zm9jdXMtdmlzaWJsZSB7CiAgb3V0bGluZTogNHB4IHNvbGlkIHZhcigtLWN5YW4pOwogIG91dGxpbmUtb2Zmc2V0OiA0cHg7Cn0KCi5hcHAtc2hlbGwgewogIG1pbi1oZWlnaHQ6IDEwMHZoOwogIG1pbi1oZWlnaHQ6IDEwMGR2aDsKICB3aWR0aDogMTAwJTsKICBkaXNwbGF5OiBncmlkOwogIHBsYWNlLWl0ZW1zOiBzdHJldGNoOwogIHBhZGRpbmc6IGNsYW1wKDEycHgsIDJ2dywgMjZweCk7Cn0KCi5hcHAtc2hlbGwuZnVsbHNjcmVlbi1mYWxsYmFjayB7CiAgcG9zaXRpb246IGZpeGVkOwogIGluc2V0OiAwOwogIHotaW5kZXg6IDIwOwogIG92ZXJmbG93OiBhdXRvOwp9Cgouc2NyZWVuIHsKICBkaXNwbGF5OiBub25lOwogIHdpZHRoOiBtaW4oMTQyMHB4LCAxMDAlKTsKICBtYXJnaW46IDAgYXV0bzsKfQoKLnNjcmVlbi1hY3RpdmUgewogIGRpc3BsYXk6IGJsb2NrOwp9Cgojc3RhcnQtc2NyZWVuIHsKICBtaW4taGVpZ2h0OiBjYWxjKDEwMHZoIC0gNTJweCk7CiAgbWluLWhlaWdodDogY2FsYygxMDBkdmggLSA1MnB4KTsKICBkaXNwbGF5OiBub25lOwogIGdyaWQtdGVtcGxhdGUtY29sdW1uczogbWlubWF4KDAsIDEuMjVmcikgbWlubWF4KDMyMHB4LCAwLjc1ZnIpOwogIGdhcDogY2xhbXAoMThweCwgM3Z3LCAzNHB4KTsKICBhbGlnbi1pdGVtczogc3RyZXRjaDsKfQoKI3N0YXJ0LXNjcmVlbi5zY3JlZW4tYWN0aXZlIHsKICBkaXNwbGF5OiBncmlkOwp9Cgouc3RhcnQtaGVybywKLnN0YXJ0LXBhbmVsLAoucmVzdWx0LWNhcmQsCi5zaWRlLXBhbmVsLAouYm9hcmQtZnJhbWUsCi5odWQtY2FyZCB7CiAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE0KTsKICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTYwZGVnLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDYpKTsKICBib3gtc2hhZG93OiB2YXIoLS1zaGFkb3cpOwogIGJhY2tkcm9wLWZpbHRlcjogYmx1cigxNHB4KTsKfQoKLnN0YXJ0LWhlcm8gewogIG1pbi1oZWlnaHQ6IDYyMHB4OwogIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy14bCk7CiAgcGFkZGluZzogY2xhbXAoMjRweCwgNXZ3LCA3MnB4KTsKICBkaXNwbGF5OiBmbGV4OwogIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgcG9zaXRpb246IHJlbGF0aXZlOwogIG92ZXJmbG93OiBoaWRkZW47Cn0KCi5zdGFydC1oZXJvOjpiZWZvcmUgewogIGNvbnRlbnQ6ICIiOwogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICBpbnNldDogYXV0byAtMTAlIC0yMiUgYXV0bzsKICB3aWR0aDogbWluKDY0dncsIDY4MHB4KTsKICBhc3BlY3QtcmF0aW86IDE7CiAgYm9yZGVyLXJhZGl1czogNTAlOwogIGJhY2tncm91bmQ6CiAgICByYWRpYWwtZ3JhZGllbnQoY2lyY2xlIGF0IDQ0JSA0NCUsIHJnYmEoMjQyLCAxOTQsIDk2LCAwLjUyKSAwIDEyJSwgdHJhbnNwYXJlbnQgMTIuNSUpLAogICAgcmFkaWFsLWdyYWRpZW50KGNpcmNsZSBhdCA1OCUgNTglLCByZ2JhKDExOCwgMjI0LCAyMTQsIDAuMjgpIDAgMTMlLCB0cmFuc3BhcmVudCAxMy41JSksCiAgICByZXBlYXRpbmctY29uaWMtZ3JhZGllbnQoZnJvbSA0NWRlZywgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA5KSAwIDI1JSwgdHJhbnNwYXJlbnQgMCA1MCUpOwogIG9wYWNpdHk6IDAuNTg7CiAgdHJhbnNmb3JtOiByb3RhdGUoLTE2ZGVnKTsKfQoKLnN0YXJ0LWhlcm8gPiAqIHsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgei1pbmRleDogMTsKfQoKLmJyYW5kLXJvdyB7CiAgZGlzcGxheTogZmxleDsKICBmbGV4LXdyYXA6IHdyYXA7CiAgZ2FwOiAxMHB4OwogIG1hcmdpbi1ib3R0b206IDIycHg7Cn0KCi5icmFuZC1iYWRnZSB7CiAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgbWluLWhlaWdodDogMzRweDsKICBhbGlnbi1pdGVtczogY2VudGVyOwogIHBhZGRpbmc6IDZweCAxMnB4OwogIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogIGJhY2tncm91bmQ6IHZhcigtLWdvbGQtc29mdCk7CiAgY29sb3I6ICNmZmU0YTU7CiAgZm9udC13ZWlnaHQ6IDgwMDsKICBsZXR0ZXItc3BhY2luZzogMC4wMmVtOwp9CgouYnJhbmQtYmFkZ2Uuc3VidGxlIHsKICBiYWNrZ3JvdW5kOiByZ2JhKDExOCwgMjI0LCAyMTQsIDAuMTQpOwogIGNvbG9yOiAjY2ZmYmY2Owp9CgpoMSwKaDIsCnAgewogIG1hcmdpbi10b3A6IDA7Cn0KCmgxIHsKICBtYXJnaW4tYm90dG9tOiAxNnB4OwogIGZvbnQtc2l6ZTogY2xhbXAoMi41cmVtLCA2dncsIDYuN3JlbSk7CiAgbGluZS1oZWlnaHQ6IDAuOTI7CiAgbGV0dGVyLXNwYWNpbmc6IC0wLjA3NWVtOwp9CgpoMiB7CiAgZm9udC1zaXplOiBjbGFtcCgxLjA1cmVtLCAyLjN2dywgMS4zNXJlbSk7CiAgbWFyZ2luLWJvdHRvbTogMTJweDsKfQoKLmhlcm8tdGV4dCB7CiAgbWF4LXdpZHRoOiA3MzBweDsKICBjb2xvcjogdmFyKC0tbXV0ZWQpOwogIGZvbnQtc2l6ZTogY2xhbXAoMS4wOHJlbSwgMnZ3LCAxLjQycmVtKTsKICBsaW5lLWhlaWdodDogMS42Owp9CgouaGVyby1hY3Rpb25zLAoudG9wLWFjdGlvbnMgewogIGRpc3BsYXk6IGZsZXg7CiAgZmxleC13cmFwOiB3cmFwOwogIGdhcDogMTJweDsKfQoKLmhlcm8tYWN0aW9ucyB7CiAgbWFyZ2luLXRvcDogMjRweDsKfQoKLnByaW1hcnktYnV0dG9uLAouc2Vjb25kYXJ5LWJ1dHRvbiwKLmdob3N0LWJ1dHRvbiwKLmljb24tYnV0dG9uLAouY2hvaWNlLWJ1dHRvbiB7CiAgbWluLWhlaWdodDogdmFyKC0tdGFwLXNpemUpOwogIGJvcmRlcjogMDsKICBib3JkZXItcmFkaXVzOiA5OTlweDsKICBwYWRkaW5nOiAxM3B4IDIwcHg7CiAgY3Vyc29yOiBwb2ludGVyOwogIGNvbG9yOiB2YXIoLS10ZXh0KTsKICB0b3VjaC1hY3Rpb246IG1hbmlwdWxhdGlvbjsKICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMTYwbXMgZWFzZSwgYmFja2dyb3VuZCAxNjBtcyBlYXNlLCBib3gtc2hhZG93IDE2MG1zIGVhc2UsIGJvcmRlci1jb2xvciAxNjBtcyBlYXNlOwp9CgoucHJpbWFyeS1idXR0b24gewogIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxMzVkZWcsICNmZmQzNmYsICNmNzllM2QpOwogIGNvbG9yOiAjMWIxMzA4OwogIGZvbnQtd2VpZ2h0OiA5MDA7CiAgYm94LXNoYWRvdzogMCAxNHB4IDMycHggcmdiYSgyNDcsIDE1OCwgNjEsIDAuMzIpOwp9Cgouc2Vjb25kYXJ5LWJ1dHRvbiB7CiAgYmFja2dyb3VuZDogcmdiYSgxMTgsIDIyNCwgMjE0LCAwLjE2KTsKICBjb2xvcjogI2RmZmZmYzsKICBmb250LXdlaWdodDogODAwOwogIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMTE4LCAyMjQsIDIxNCwgMC40Mik7Cn0KCi5naG9zdC1idXR0b24sCi5pY29uLWJ1dHRvbiB7CiAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA5KTsKICBjb2xvcjogdmFyKC0tdGV4dCk7CiAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE2KTsKICBmb250LXdlaWdodDogODAwOwp9CgouaWNvbi1idXR0b24ud2FybmluZyB7CiAgYm9yZGVyLWNvbG9yOiByZ2JhKDI1NSwgMTQwLCAxNDAsIDAuMzQpOwogIGNvbG9yOiAjZmZkZWRlOwp9CgoucHJpbWFyeS1idXR0b246aG92ZXIsCi5zZWNvbmRhcnktYnV0dG9uOmhvdmVyLAouZ2hvc3QtYnV0dG9uOmhvdmVyLAouaWNvbi1idXR0b246aG92ZXIsCi5jaG9pY2UtYnV0dG9uOmhvdmVyIHsKICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTJweCk7Cn0KCi5wcmltYXJ5LWJ1dHRvbjphY3RpdmUsCi5zZWNvbmRhcnktYnV0dG9uOmFjdGl2ZSwKLmdob3N0LWJ1dHRvbjphY3RpdmUsCi5pY29uLWJ1dHRvbjphY3RpdmUsCi5jaG9pY2UtYnV0dG9uOmFjdGl2ZSwKLnNxdWFyZS5kYXJrOmFjdGl2ZSB7CiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDFweCkgc2NhbGUoMC45OCk7Cn0KCi5zdGFydC1wYW5lbCB7CiAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLXhsKTsKICBwYWRkaW5nOiBjbGFtcCgxOHB4LCAzdncsIDMwcHgpOwogIGRpc3BsYXk6IGZsZXg7CiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICBnYXA6IDE4cHg7CiAgYWxpZ24tc2VsZjogc3RyZXRjaDsKfQoKLmRpZmZpY3VsdHktb3B0aW9ucyB7CiAgZGlzcGxheTogZ3JpZDsKICBnYXA6IDEycHg7Cn0KCi5jaG9pY2UtYnV0dG9uIHsKICB3aWR0aDogMTAwJTsKICBtaW4taGVpZ2h0OiA4MnB4OwogIHRleHQtYWxpZ246IGxlZnQ7CiAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLWxnKTsKICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDgpOwogIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMyk7Cn0KCi5jaG9pY2UtYnV0dG9uIHNwYW4gewogIGRpc3BsYXk6IGJsb2NrOwogIGZvbnQtd2VpZ2h0OiA5MDA7CiAgZm9udC1zaXplOiAxLjA1cmVtOwogIG1hcmdpbi1ib3R0b206IDRweDsKfQoKLmNob2ljZS1idXR0b24gc21hbGwgewogIGRpc3BsYXk6IGJsb2NrOwogIGNvbG9yOiB2YXIoLS1tdXRlZCk7CiAgbGluZS1oZWlnaHQ6IDEuMzU7Cn0KCi5jaG9pY2UtYWN0aXZlIHsKICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCByZ2JhKDI0MiwgMTk0LCA5NiwgMC4yKSwgcmdiYSgxMTgsIDIyNCwgMjE0LCAwLjE0KSk7CiAgYm9yZGVyLWNvbG9yOiByZ2JhKDI0MiwgMTk0LCA5NiwgMC41NSk7Cn0KCi5ydWxlLWNhcmQsCi5rZXktY2FyZCwKLmNvYWNoLWNhcmQsCi5taXNzaW9uLWNhcmQsCi5jYXB0dXJlLWNhcmQsCi5ydWxlcy1wYW5lbCB7CiAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLWxnKTsKICBwYWRkaW5nOiAxOHB4OwogIGJhY2tncm91bmQ6IHJnYmEoOSwgMTMsIDI0LCAwLjQ0KTsKICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTEpOwp9CgoucnVsZS1jYXJkIHAsCi5rZXktY2FyZCBwLAouY29hY2gtY2FyZCBwLAoubWlzc2lvbi1jYXJkIHAsCi5ydWxlcy1wYW5lbCBsaSB7CiAgY29sb3I6IHZhcigtLW11dGVkKTsKICBsaW5lLWhlaWdodDogMS41NTsKfQoKI3BsYXktc2NyZWVuLnNjcmVlbi1hY3RpdmUgewogIGRpc3BsYXk6IGJsb2NrOwp9CgoudG9wYmFyIHsKICBkaXNwbGF5OiBmbGV4OwogIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICBnYXA6IDE4cHg7CiAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICBtYXJnaW4tYm90dG9tOiAxNnB4Owp9CgouZXllYnJvdyB7CiAgbWFyZ2luLWJvdHRvbTogNXB4OwogIGNvbG9yOiB2YXIoLS1jeWFuKTsKICBmb250LXdlaWdodDogOTAwOwogIGxldHRlci1zcGFjaW5nOiAwLjEyZW07CiAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICBmb250LXNpemU6IDAuNzZyZW07Cn0KCi50b3BiYXIgaDEgewogIGZvbnQtc2l6ZTogY2xhbXAoMS43cmVtLCAzLjR2dywgMy4ycmVtKTsKICBtYXJnaW4tYm90dG9tOiAwOwogIGxldHRlci1zcGFjaW5nOiAtMC4wNDVlbTsKfQoKLmh1ZC1ncmlkIHsKICBkaXNwbGF5OiBncmlkOwogIGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KDQsIG1pbm1heCgxMjBweCwgMWZyKSk7CiAgZ2FwOiAxMnB4OwogIG1hcmdpbi1ib3R0b206IDEycHg7Cn0KCi5odWQtY2FyZCB7CiAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLWxnKTsKICBwYWRkaW5nOiAxNHB4IDE2cHg7Cn0KCi5odWQtbGFiZWwgewogIGRpc3BsYXk6IGJsb2NrOwogIGNvbG9yOiB2YXIoLS1tdXRlZCk7CiAgZm9udC1zaXplOiAwLjg4cmVtOwogIG1hcmdpbi1ib3R0b206IDRweDsKfQoKLmh1ZC1jYXJkIHN0cm9uZyB7CiAgZm9udC1zaXplOiBjbGFtcCgxLjM1cmVtLCAyLjZ2dywgMnJlbSk7Cn0KCi5wcm9ncmVzcy13cmFwIHsKICB3aWR0aDogMTAwJTsKICBoZWlnaHQ6IDEycHg7CiAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgb3ZlcmZsb3c6IGhpZGRlbjsKICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSk7CiAgbWFyZ2luLWJvdHRvbTogMThweDsKfQoKLnByb2dyZXNzLWJhciB7CiAgd2lkdGg6IDQlOwogIGhlaWdodDogMTAwJTsKICBib3JkZXItcmFkaXVzOiBpbmhlcml0OwogIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCg5MGRlZywgdmFyKC0tY3lhbiksIHZhcigtLWdvbGQpKTsKICB0cmFuc2l0aW9uOiB3aWR0aCAyNjBtcyBlYXNlOwp9CgouZ2FtZS1sYXlvdXQgewogIGRpc3BsYXk6IGdyaWQ7CiAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiBtaW5tYXgoMzAwcHgsIDFmcikgbWlubWF4KDI4MHB4LCAzNjBweCk7CiAgZ2FwOiBjbGFtcCgxNHB4LCAyLjN2dywgMjRweCk7CiAgYWxpZ24taXRlbXM6IHN0YXJ0Owp9CgouYm9hcmQtd3JhcCB7CiAgbWluLXdpZHRoOiAwOwp9CgouYm9hcmQtZnJhbWUgewogIHdpZHRoOiBtaW4oODZ2aCwgMTAwJSk7CiAgbWF4LXdpZHRoOiA4NTBweDsKICBtYXJnaW46IDAgYXV0bzsKICBwYWRkaW5nOiBjbGFtcCgxMHB4LCAydncsIDE4cHgpOwogIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy14bCk7CiAgYmFja2dyb3VuZDoKICAgIGxpbmVhci1ncmFkaWVudCgxNjBkZWcsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNSksIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNikpLAogICAgbGluZWFyLWdyYWRpZW50KDQ1ZGVnLCByZ2JhKDI0MiwgMTk0LCA5NiwgMC4wOSksIHJnYmEoMTE4LCAyMjQsIDIxNCwgMC4wOCkpOwp9CgouYm9hcmQgewogIHdpZHRoOiAxMDAlOwogIGFzcGVjdC1yYXRpbzogMTsKICBkaXNwbGF5OiBncmlkOwogIGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KDgsIDFmcik7CiAgZ3JpZC10ZW1wbGF0ZS1yb3dzOiByZXBlYXQoOCwgMWZyKTsKICBvdmVyZmxvdzogaGlkZGVuOwogIGJvcmRlci1yYWRpdXM6IDIwcHg7CiAgYm9yZGVyOiA3cHggc29saWQgcmdiYSgxOCwgMTMsIDksIDAuOSk7CiAgYm94LXNoYWRvdzogaW5zZXQgMCAwIDAgMnB4IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMiksIDAgMThweCA2MHB4IHJnYmEoMCwgMCwgMCwgMC4zKTsKfQoKLnNxdWFyZSB7CiAgbWluLXdpZHRoOiAwOwogIG1pbi1oZWlnaHQ6IDA7CiAgYm9yZGVyOiAwOwogIHBvc2l0aW9uOiByZWxhdGl2ZTsKICBkaXNwbGF5OiBncmlkOwogIHBsYWNlLWl0ZW1zOiBjZW50ZXI7Cn0KCi5zcXVhcmUubGlnaHQgewogIGJhY2tncm91bmQ6CiAgICBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMjUpLCB0cmFuc3BhcmVudCksCiAgICB2YXIoLS1saWdodC1zcXVhcmUpOwp9Cgouc3F1YXJlLmRhcmsgewogIGJhY2tncm91bmQ6CiAgICByYWRpYWwtZ3JhZGllbnQoY2lyY2xlIGF0IDI0JSAxOCUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMiksIHRyYW5zcGFyZW50IDMyJSksCiAgICB2YXIoLS1kYXJrLXNxdWFyZSk7CiAgY3Vyc29yOiBwb2ludGVyOwogIHBhZGRpbmc6IDZweDsKfQoKLnNxdWFyZS5kYXJrOjpiZWZvcmUgewogIGNvbnRlbnQ6IGF0dHIoZGF0YS1maWVsZCk7CiAgcG9zaXRpb246IGFic29sdXRlOwogIHRvcDogNXB4OwogIGxlZnQ6IDdweDsKICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjMyKTsKICBmb250LXNpemU6IGNsYW1wKDAuNTJyZW0sIDEuMXZ3LCAwLjc4cmVtKTsKICBmb250LXdlaWdodDogODAwOwogIHBvaW50ZXItZXZlbnRzOiBub25lOwp9Cgouc3F1YXJlLmRhcmsudmFsaWQ6OmFmdGVyLAouc3F1YXJlLmRhcmsuaGludDo6YWZ0ZXIgewogIGNvbnRlbnQ6ICIiOwogIHdpZHRoOiAzNCU7CiAgYXNwZWN0LXJhdGlvOiAxOwogIGJvcmRlci1yYWRpdXM6IDUwJTsKICBiYWNrZ3JvdW5kOiByZ2JhKDE0MCwgMjQwLCAxNjQsIDAuNDUpOwogIGJvcmRlcjogM3B4IHNvbGlkIHJnYmEoMTQwLCAyNDAsIDE2NCwgMC45NSk7CiAgYm94LXNoYWRvdzogMCAwIDI0cHggcmdiYSgxNDAsIDI0MCwgMTY0LCAwLjMpOwp9Cgouc3F1YXJlLmRhcmsuY2FwdHVyZS10YXJnZXQ6OmFmdGVyIHsKICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjA3LCAxMTIsIDAuNDIpOwogIGJvcmRlci1jb2xvcjogcmdiYSgyNTUsIDIwNywgMTEyLCAwLjk4KTsKICBib3gtc2hhZG93OiAwIDAgMjhweCByZ2JhKDI1NSwgMjA3LCAxMTIsIDAuMzgpOwp9Cgouc3F1YXJlLmRhcmsuc2VsZWN0ZWQgewogIGJveC1zaGFkb3c6IGluc2V0IDAgMCAwIDVweCB2YXIoLS1jeWFuKTsKfQoKLnNxdWFyZS5kYXJrLmxhc3QtbW92ZSB7CiAgYm94LXNoYWRvdzogaW5zZXQgMCAwIDAgNHB4IHJnYmEoMjQyLCAxOTQsIDk2LCAwLjY4KTsKfQoKLnBpZWNlIHsKICB3aWR0aDogbWluKDcyJSwgNzRweCk7CiAgYXNwZWN0LXJhdGlvOiAxOwogIGJvcmRlci1yYWRpdXM6IDUwJTsKICBkaXNwbGF5OiBncmlkOwogIHBsYWNlLWl0ZW1zOiBjZW50ZXI7CiAgcG9zaXRpb246IHJlbGF0aXZlOwogIHotaW5kZXg6IDI7CiAgYm94LXNoYWRvdzoKICAgIGluc2V0IDAgOHB4IDEycHggcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIyKSwKICAgIGluc2V0IDAgLTEwcHggMTRweCByZ2JhKDAsIDAsIDAsIDAuMjgpLAogICAgMCA5cHggMThweCByZ2JhKDAsIDAsIDAsIDAuMzIpOwp9CgoucGllY2U6OmJlZm9yZSB7CiAgY29udGVudDogIiI7CiAgcG9zaXRpb246IGFic29sdXRlOwogIGluc2V0OiAxNiU7CiAgYm9yZGVyLXJhZGl1czogNTAlOwogIGJvcmRlcjogM3B4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yOCk7Cn0KCi5waWVjZS5wbGF5ZXIgewogIGJhY2tncm91bmQ6CiAgICByYWRpYWwtZ3JhZGllbnQoY2lyY2xlIGF0IDM1JSAyNSUsICNmZmZmZmYgMCA4JSwgdHJhbnNwYXJlbnQgMTAlKSwKICAgIGxpbmVhci1ncmFkaWVudCgxNDVkZWcsICNmOGYwZDksICNjZmE0NWEgNjAlLCAjOGI1YzI2KTsKICBib3JkZXI6IDNweCBzb2xpZCAjZmZmMmJjOwp9CgoucGllY2UuYm90IHsKICBiYWNrZ3JvdW5kOgogICAgcmFkaWFsLWdyYWRpZW50KGNpcmNsZSBhdCAzNSUgMjUlLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNDUpIDAgOCUsIHRyYW5zcGFyZW50IDEwJSksCiAgICBsaW5lYXItZ3JhZGllbnQoMTQ1ZGVnLCAjM2M0NTY1LCAjMTcxZDMyIDU1JSwgIzA3MDkxMyk7CiAgYm9yZGVyOiAzcHggc29saWQgIzU2NjE3ZjsKfQoKLnBpZWNlLmtpbmcgewogIG91dGxpbmU6IDRweCBzb2xpZCByZ2JhKDI0MiwgMTk0LCA5NiwgMC42NSk7CiAgb3V0bGluZS1vZmZzZXQ6IC05cHg7Cn0KCi5waWVjZS1tYXJrIHsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgei1pbmRleDogMzsKICBjb2xvcjogIzJhMTkwODsKICBmb250LXNpemU6IGNsYW1wKDFyZW0sIDMuM3Z3LCAycmVtKTsKICBmb250LXdlaWdodDogMTAwMDsKICB0ZXh0LXNoYWRvdzogMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMjgpOwp9CgoucGllY2UuYm90IC5waWVjZS1tYXJrIHsKICBjb2xvcjogI2Y4ZDI3YTsKfQoKLmJvYXJkLWxhYmVsIHsKICBkaXNwbGF5OiBncmlkOwogIGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KDgsIDFmcik7CiAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC41Mik7CiAgZm9udC13ZWlnaHQ6IDkwMDsKICBwYWRkaW5nOiAwIDlweDsKICBmb250LXNpemU6IDAuNzhyZW07Cn0KCi5ib2FyZC1sYWJlbCBzcGFuIHsKICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KCi50b3AtbGFiZWwgewogIG1hcmdpbi1ib3R0b206IDdweDsKfQoKLmJvdHRvbS1sYWJlbCB7CiAgbWFyZ2luLXRvcDogN3B4Owp9CgouZmVlZGJhY2sgewogIG1pbi1oZWlnaHQ6IDYycHg7CiAgZGlzcGxheTogZ3JpZDsKICBhbGlnbi1pdGVtczogY2VudGVyOwogIG1hcmdpbjogMTRweCBhdXRvIDA7CiAgd2lkdGg6IG1pbig4NTBweCwgMTAwJSk7CiAgcGFkZGluZzogMTNweCAxOHB4OwogIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1sZyk7CiAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjI4KTsKICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTMpOwogIGNvbG9yOiAjZjZmYmZmOwogIGxpbmUtaGVpZ2h0OiAxLjQ1OwogIGJveC1zaGFkb3c6IDAgMTJweCAyOHB4IHJnYmEoMCwgMCwgMCwgMC4xOCk7Cn0KCi5mZWVkYmFjay5nb29kIHsKICBib3JkZXItY29sb3I6IHJnYmEoMTMyLCAyMjQsIDEzOCwgMC41NSk7CiAgYmFja2dyb3VuZDogcmdiYSg0MiwgOTYsIDQ5LCAwLjI2KTsKfQoKLmZlZWRiYWNrLmJhZCB7CiAgYm9yZGVyLWNvbG9yOiByZ2JhKDI1NSwgMTQwLCAxNDAsIDAuNTgpOwogIGJhY2tncm91bmQ6IHJnYmEoMTEyLCAzMiwgMzIsIDAuMjIpOwp9Cgouc2lkZS1wYW5lbCB7CiAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLXhsKTsKICBwYWRkaW5nOiAxNnB4OwogIGRpc3BsYXk6IGdyaWQ7CiAgZ2FwOiAxNHB4Owp9CgoubWlzc2lvbi1oZWFkLAoubWF0ZXJpYWwtcm93IHsKICBkaXNwbGF5OiBmbGV4OwogIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICBnYXA6IDEycHg7CiAgYWxpZ24taXRlbXM6IGNlbnRlcjsKfQoKI21pc3Npb24tbGFiZWwgewogIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogIHBhZGRpbmc6IDVweCAxMHB4OwogIGJhY2tncm91bmQ6IHZhcigtLWdvbGQtc29mdCk7CiAgY29sb3I6ICNmZmU1YWE7CiAgZm9udC13ZWlnaHQ6IDkwMDsKICB3aGl0ZS1zcGFjZTogbm93cmFwOwp9CgoubWF0ZXJpYWwtcm93IHsKICBwYWRkaW5nOiAxMXB4IDA7CiAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMik7CiAgY29sb3I6IHZhcigtLW11dGVkKTsKfQoKLm1hdGVyaWFsLXJvdzpmaXJzdC1vZi10eXBlIHsKICBib3JkZXItdG9wOiAwOwp9CgoubWF0ZXJpYWwtcm93IHN0cm9uZyB7CiAgY29sb3I6IHZhcigtLXRleHQpOwogIGZvbnQtc2l6ZTogMS4ycmVtOwp9CgoucnVsZXMtcGFuZWwgewogIGRpc3BsYXk6IG5vbmU7Cn0KCi5ydWxlcy1wYW5lbC5ydWxlcy12aXNpYmxlIHsKICBkaXNwbGF5OiBibG9jazsKfQoKLnJ1bGVzLXBhbmVsIHVsIHsKICBwYWRkaW5nLWxlZnQ6IDEuMTVyZW07CiAgbWFyZ2luOiAwOwp9CgoucnVsZXMtcGFuZWwgbGkgKyBsaSB7CiAgbWFyZ2luLXRvcDogOHB4Owp9CgoucmVzdWx0LWNhcmQgewogIG1pbi1oZWlnaHQ6IGNhbGMoMTAwdmggLSA1MnB4KTsKICBtaW4taGVpZ2h0OiBjYWxjKDEwMGR2aCAtIDUycHgpOwogIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy14bCk7CiAgcGFkZGluZzogY2xhbXAoMjZweCwgNnZ3LCA3OHB4KTsKICBkaXNwbGF5OiBmbGV4OwogIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7Cn0KCi5yZXN1bHQtY2FyZCBoMSB7CiAgZm9udC1zaXplOiBjbGFtcCgyLjVyZW0sIDZ2dywgNS44cmVtKTsKfQoKI3Jlc3VsdC10ZXh0IHsKICBtYXgtd2lkdGg6IDc4MHB4OwogIGNvbG9yOiB2YXIoLS1tdXRlZCk7CiAgZm9udC1zaXplOiBjbGFtcCgxLjA4cmVtLCAydncsIDEuMzVyZW0pOwogIGxpbmUtaGVpZ2h0OiAxLjY1Owp9CgoucmVzdWx0LXN0YXRzIHsKICBkaXNwbGF5OiBncmlkOwogIGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KDMsIG1pbm1heCgxMzBweCwgMWZyKSk7CiAgZ2FwOiAxNHB4OwogIG1heC13aWR0aDogODIwcHg7CiAgbWFyZ2luOiAyNnB4IDAgOHB4Owp9CgoucmVzdWx0LXN0YXRzIGRpdiB7CiAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLWxnKTsKICBwYWRkaW5nOiAxOHB4OwogIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOSk7CiAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEzKTsKfQoKLnJlc3VsdC1zdGF0cyBzcGFuIHsKICBkaXNwbGF5OiBibG9jazsKICBjb2xvcjogdmFyKC0tbXV0ZWQpOwogIG1hcmdpbi1ib3R0b206IDRweDsKfQoKLnJlc3VsdC1zdGF0cyBzdHJvbmcgewogIGZvbnQtc2l6ZTogMnJlbTsKfQoKLnRvYXN0IHsKICBwb3NpdGlvbjogZml4ZWQ7CiAgbGVmdDogNTAlOwogIGJvdHRvbTogbWF4KDE4cHgsIGVudihzYWZlLWFyZWEtaW5zZXQtYm90dG9tKSk7CiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpIHRyYW5zbGF0ZVkoMTIwJSk7CiAgbWF4LXdpZHRoOiBtaW4oNTYwcHgsIGNhbGMoMTAwdncgLSAzMnB4KSk7CiAgcGFkZGluZzogMTNweCAxOHB4OwogIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogIGJhY2tncm91bmQ6IHJnYmEoOSwgMTMsIDI0LCAwLjkpOwogIGNvbG9yOiB2YXIoLS10ZXh0KTsKICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTcpOwogIGJveC1zaGFkb3c6IDAgMThweCA0NnB4IHJnYmEoMCwgMCwgMCwgMC4zOCk7CiAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIDIyMG1zIGVhc2U7CiAgei1pbmRleDogMzA7CiAgdGV4dC1hbGlnbjogY2VudGVyOwp9CgoudG9hc3QudG9hc3QtdmlzaWJsZSB7CiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpIHRyYW5zbGF0ZVkoMCk7Cn0KCkBtZWRpYSAobWF4LXdpZHRoOiAxMDgwcHgpIHsKICAjc3RhcnQtc2NyZWVuLAogIC5nYW1lLWxheW91dCB7CiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmcjsKICB9CgogIC5zdGFydC1oZXJvIHsKICAgIG1pbi1oZWlnaHQ6IDQ4MHB4OwogIH0KCiAgLmJvYXJkLWZyYW1lIHsKICAgIHdpZHRoOiBtaW4oOTJ2dywgNzgwcHgpOwogIH0KCiAgLnNpZGUtcGFuZWwgewogICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoMiwgbWlubWF4KDAsIDFmcikpOwogIH0KCiAgLnJ1bGVzLXBhbmVsIHsKICAgIGdyaWQtY29sdW1uOiAxIC8gLTE7CiAgfQp9CgpAbWVkaWEgKG1heC13aWR0aDogNzYwcHgpIHsKICAuYXBwLXNoZWxsIHsKICAgIHBhZGRpbmc6IDEwcHg7CiAgfQoKICAudG9wYmFyIHsKICAgIGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICB9CgogIC50b3AtYWN0aW9ucywKICAuaGVyby1hY3Rpb25zIHsKICAgIHdpZHRoOiAxMDAlOwogIH0KCiAgLnByaW1hcnktYnV0dG9uLAogIC5zZWNvbmRhcnktYnV0dG9uLAogIC5naG9zdC1idXR0b24sCiAgLmljb24tYnV0dG9uIHsKICAgIGZsZXg6IDEgMSBhdXRvOwogIH0KCiAgLmh1ZC1ncmlkIHsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KDIsIG1pbm1heCgwLCAxZnIpKTsKICB9CgogIC5zaWRlLXBhbmVsIHsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyOwogIH0KCiAgLmJvYXJkLWZyYW1lIHsKICAgIGJvcmRlci1yYWRpdXM6IDIycHg7CiAgICBwYWRkaW5nOiA5cHg7CiAgICB3aWR0aDogMTAwJTsKICB9CgogIC5ib2FyZCB7CiAgICBib3JkZXItd2lkdGg6IDVweDsKICAgIGJvcmRlci1yYWRpdXM6IDE1cHg7CiAgfQoKICAuc3F1YXJlLmRhcmsgewogICAgcGFkZGluZzogM3B4OwogIH0KCiAgLnBpZWNlIHsKICAgIHdpZHRoOiA3OCU7CiAgfQoKICAucmVzdWx0LXN0YXRzIHsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyOwogIH0KfQoKQG1lZGlhIChtYXgtd2lkdGg6IDQ2MHB4KSB7CiAgLnN0YXJ0LWhlcm8sCiAgLnN0YXJ0LXBhbmVsLAogIC5yZXN1bHQtY2FyZCB7CiAgICBib3JkZXItcmFkaXVzOiAyMHB4OwogICAgcGFkZGluZzogMThweDsKICB9CgogIC5icmFuZC1yb3cgewogICAgZ2FwOiA3cHg7CiAgfQoKICAuYnJhbmQtYmFkZ2UgewogICAgZm9udC1zaXplOiAwLjc4cmVtOwogIH0KCiAgaDEgewogICAgbGV0dGVyLXNwYWNpbmc6IC0wLjA1NWVtOwogIH0KCiAgLmh1ZC1jYXJkIHsKICAgIHBhZGRpbmc6IDEycHg7CiAgfQoKICAuaWNvbi1idXR0b24gewogICAgbWluLWhlaWdodDogNDRweDsKICAgIHBhZGRpbmc6IDExcHggMTJweDsKICAgIGZvbnQtc2l6ZTogMC45MnJlbTsKICB9CgogIC5mZWVkYmFjayB7CiAgICBmb250LXNpemU6IDAuOTRyZW07CiAgfQoKICAuYm9hcmQtbGFiZWwgewogICAgZm9udC1zaXplOiAwLjY2cmVtOwogIH0KfQoKQG1lZGlhIChwcmVmZXJzLXJlZHVjZWQtbW90aW9uOiByZWR1Y2UpIHsKICAqLAogICo6OmJlZm9yZSwKICAqOjphZnRlciB7CiAgICB0cmFuc2l0aW9uLWR1cmF0aW9uOiAwLjAxbXMgIWltcG9ydGFudDsKICAgIGFuaW1hdGlvbi1kdXJhdGlvbjogMC4wMW1zICFpbXBvcnRhbnQ7CiAgfQp9Cgo8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgogIDxtYWluIGlkPSJnYW1lLXJvb3QiIGNsYXNzPSJhcHAtc2hlbGwiPgogICAgPHNlY3Rpb24gaWQ9InN0YXJ0LXNjcmVlbiIgY2xhc3M9InNjcmVlbiBzY3JlZW4tYWN0aXZlIiBhcmlhLWxhYmVsbGVkYnk9ImdhbWUtdGl0bGUiPgogICAgICA8ZGl2IGNsYXNzPSJzdGFydC1oZXJvIj4KICAgICAgICA8ZGl2IGNsYXNzPSJicmFuZC1yb3ciPgogICAgICAgICAgPHNwYW4gY2xhc3M9ImJyYW5kLWJhZGdlIj5NT09Dd2lraSBTcGllbGU8L3NwYW4+CiAgICAgICAgICA8c3BhbiBjbGFzcz0iYnJhbmQtYmFkZ2Ugc3VidGxlIj5Mb2thbCBzcGllbGJhcjwvc3Bhbj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8aDEgaWQ9ImdhbWUtdGl0bGUiPkRhbWUgTWVpc3RlcnNjaHVsZTwvaDE+CiAgICAgICAgPHAgY2xhc3M9Imhlcm8tdGV4dCI+CiAgICAgICAgICBTcGllbGUgRGFtZSBnZWdlbiBlaW5lIGZhaXJlIEtJLCBsZXJuZSBTY2hsYWdwZmxpY2h0LCBNZWhyZmFjaHNjaGzDpGdlIHVuZCBEYW1lbmJpbGR1bmcKICAgICAgICAgIGRpcmVrdCBhdWYgZGVtIEJyZXR0LgogICAgICAgIDwvcD4KICAgICAgICA8ZGl2IGNsYXNzPSJoZXJvLWFjdGlvbnMiPgogICAgICAgICAgPGJ1dHRvbiBpZD0ic3RhcnQtZ2FtZS1idXR0b24iIGNsYXNzPSJwcmltYXJ5LWJ1dHRvbiIgdHlwZT0iYnV0dG9uIj5QYXJ0aWUgc3RhcnRlbjwvYnV0dG9uPgogICAgICAgICAgPGJ1dHRvbiBpZD0idHJhaW5pbmctZ2FtZS1idXR0b24iIGNsYXNzPSJzZWNvbmRhcnktYnV0dG9uIiB0eXBlPSJidXR0b24iPlRyYWluaW5nc3J1bmRlPC9idXR0b24+CiAgICAgICAgICA8YnV0dG9uIGlkPSJzdGFydC1mdWxsc2NyZWVuLWJ1dHRvbiIgY2xhc3M9Imdob3N0LWJ1dHRvbiIgdHlwZT0iYnV0dG9uIj5Wb2xsYmlsZDwvYnV0dG9uPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KCiAgICAgIDxhc2lkZSBjbGFzcz0ic3RhcnQtcGFuZWwiIGFyaWEtbGFiZWw9IlNwaWVsZWluc3RlbGx1bmdlbiI+CiAgICAgICAgPGgyPlNjaHdpZXJpZ2tlaXQ8L2gyPgogICAgICAgIDxkaXYgaWQ9ImRpZmZpY3VsdHktb3B0aW9ucyIgY2xhc3M9ImRpZmZpY3VsdHktb3B0aW9ucyIgYXJpYS1sYWJlbD0iU2Nod2llcmlna2VpdCBhdXN3w6RobGVuIj4KICAgICAgICAgIDxidXR0b24gY2xhc3M9ImNob2ljZS1idXR0b24iIHR5cGU9ImJ1dHRvbiIgZGF0YS1kaWZmaWN1bHR5PSJlYXN5IiBhcmlhLXByZXNzZWQ9ImZhbHNlIj4KICAgICAgICAgICAgPHNwYW4+RWluc3RlaWdlcjwvc3Bhbj4KICAgICAgICAgICAgPHNtYWxsPktJIGJldm9yenVndCBndXRlIFrDvGdlLCBsw6Rzc3QgQ2hhbmNlbiBvZmZlbi48L3NtYWxsPgogICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJjaG9pY2UtYnV0dG9uIGNob2ljZS1hY3RpdmUiIHR5cGU9ImJ1dHRvbiIgZGF0YS1kaWZmaWN1bHR5PSJiYWxhbmNlZCIgYXJpYS1wcmVzc2VkPSJ0cnVlIj4KICAgICAgICAgICAgPHNwYW4+Rm9ydGdlc2Nocml0dGVuPC9zcGFuPgogICAgICAgICAgICA8c21hbGw+QXVzZ2V3b2dlbmVzIFNwaWVsIG1pdCB0YWt0aXNjaGVuIEFudHdvcnRlbi48L3NtYWxsPgogICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJjaG9pY2UtYnV0dG9uIiB0eXBlPSJidXR0b24iIGRhdGEtZGlmZmljdWx0eT0iZXhwZXJ0IiBhcmlhLXByZXNzZWQ9ImZhbHNlIj4KICAgICAgICAgICAgPHNwYW4+UHJvZmk8L3NwYW4+CiAgICAgICAgICAgIDxzbWFsbD5Wb3JhdXNzY2hhdWVuZGUgS0kgbWl0IEVuZHNwaWVsYmxpY2suPC9zbWFsbD4KICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgIDwvZGl2PgoKICAgICAgICA8ZGl2IGNsYXNzPSJydWxlLWNhcmQiPgogICAgICAgICAgPGgyPlJlZ2VsbiBpbSBTcGllbDwvaDI+CiAgICAgICAgICA8cD4KICAgICAgICAgICAgR2VzcGllbHQgd2lyZCBlaW5lIGtsYXJlIDjDlzgtU2NodWx2YXJpYW50ZTogU3RlaW5lIHppZWhlbiBkaWFnb25hbCB2b3J3w6RydHMsCiAgICAgICAgICAgIHNjaGxhZ2VuIGlzdCBQZmxpY2h0LCBEYW1lbiB6aWVoZW4gZGlhZ29uYWwgaW4gYmVpZGUgUmljaHR1bmdlbi4KICAgICAgICAgIDwvcD4KICAgICAgICA8L2Rpdj4KCiAgICAgICAgPGRpdiBjbGFzcz0ia2V5LWNhcmQiPgogICAgICAgICAgPGgyPlN0ZXVlcnVuZzwvaDI+CiAgICAgICAgICA8cD5NYXVzIG9kZXIgVG91Y2g6IFN0ZWluIHVuZCBaaWVsZmVsZCB3w6RobGVuLiBUYXN0YXR1cjogUGZlaWx0YXN0ZW4sIEVpbmdhYmUgdW5kIExlZXJ0YXN0ZS48L3A+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvYXNpZGU+CiAgICA8L3NlY3Rpb24+CgogICAgPHNlY3Rpb24gaWQ9InBsYXktc2NyZWVuIiBjbGFzcz0ic2NyZWVuIiBhcmlhLWxhYmVsbGVkYnk9InBsYXktdGl0bGUiPgogICAgICA8aGVhZGVyIGNsYXNzPSJ0b3BiYXIiPgogICAgICAgIDxkaXY+CiAgICAgICAgICA8cCBjbGFzcz0iZXllYnJvdyI+U3RyYXRlZ2llLVNwaWVsPC9wPgogICAgICAgICAgPGgxIGlkPSJwbGF5LXRpdGxlIj5EYW1lIE1laXN0ZXJzY2h1bGU8L2gxPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InRvcC1hY3Rpb25zIiBhcmlhLWxhYmVsPSJTcGllbG1lbsO8Ij4KICAgICAgICAgIDxidXR0b24gaWQ9ImZ1bGxzY3JlZW4tYnV0dG9uIiBjbGFzcz0iaWNvbi1idXR0b24iIHR5cGU9ImJ1dHRvbiI+Vm9sbGJpbGQ8L2J1dHRvbj4KICAgICAgICAgIDxidXR0b24gaWQ9ImhpbnQtYnV0dG9uIiBjbGFzcz0iaWNvbi1idXR0b24iIHR5cGU9ImJ1dHRvbiI+VGlwcDwvYnV0dG9uPgogICAgICAgICAgPGJ1dHRvbiBpZD0icnVsZXMtYnV0dG9uIiBjbGFzcz0iaWNvbi1idXR0b24iIHR5cGU9ImJ1dHRvbiI+UmVnZWxuPC9idXR0b24+CiAgICAgICAgICA8YnV0dG9uIGlkPSJyZXNldC1idXR0b24iIGNsYXNzPSJpY29uLWJ1dHRvbiB3YXJuaW5nIiB0eXBlPSJidXR0b24iPk5ldTwvYnV0dG9uPgogICAgICAgICAgPGJ1dHRvbiBpZD0ibWVudS1idXR0b24iIGNsYXNzPSJpY29uLWJ1dHRvbiIgdHlwZT0iYnV0dG9uIj5NZW7DvDwvYnV0dG9uPgogICAgICAgIDwvZGl2PgogICAgICA8L2hlYWRlcj4KCiAgICAgIDxzZWN0aW9uIGNsYXNzPSJodWQtZ3JpZCIgYXJpYS1sYWJlbD0iU3BpZWxzdGFuZCI+CiAgICAgICAgPGRpdiBjbGFzcz0iaHVkLWNhcmQiPgogICAgICAgICAgPHNwYW4gY2xhc3M9Imh1ZC1sYWJlbCI+UHVua3RlPC9zcGFuPgogICAgICAgICAgPHN0cm9uZyBpZD0ic2NvcmUtdmFsdWUiPjA8L3N0cm9uZz4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJodWQtY2FyZCI+CiAgICAgICAgICA8c3BhbiBjbGFzcz0iaHVkLWxhYmVsIj5MZXJuc3R1ZmU8L3NwYW4+CiAgICAgICAgICA8c3Ryb25nIGlkPSJsZXZlbC12YWx1ZSI+MTwvc3Ryb25nPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9Imh1ZC1jYXJkIj4KICAgICAgICAgIDxzcGFuIGNsYXNzPSJodWQtbGFiZWwiPlp1Zzwvc3Bhbj4KICAgICAgICAgIDxzdHJvbmcgaWQ9InR1cm4tdmFsdWUiPkR1PC9zdHJvbmc+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0iaHVkLWNhcmQiPgogICAgICAgICAgPHNwYW4gY2xhc3M9Imh1ZC1sYWJlbCI+WmVpdDwvc3Bhbj4KICAgICAgICAgIDxzdHJvbmcgaWQ9InRpbWUtdmFsdWUiPjAwOjAwPC9zdHJvbmc+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvc2VjdGlvbj4KCiAgICAgIDxkaXYgY2xhc3M9InByb2dyZXNzLXdyYXAiIGFyaWEtbGFiZWw9Ikxlcm5mb3J0c2Nocml0dCI+CiAgICAgICAgPGRpdiBpZD0icHJvZ3Jlc3MtYmFyIiBjbGFzcz0icHJvZ3Jlc3MtYmFyIj48L2Rpdj4KICAgICAgPC9kaXY+CgogICAgICA8c2VjdGlvbiBjbGFzcz0iZ2FtZS1sYXlvdXQiPgogICAgICAgIDxkaXYgY2xhc3M9ImJvYXJkLXdyYXAiPgogICAgICAgICAgPGRpdiBjbGFzcz0iYm9hcmQtZnJhbWUiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJib2FyZC1sYWJlbCB0b3AtbGFiZWwiIGFyaWEtaGlkZGVuPSJ0cnVlIj4KICAgICAgICAgICAgICA8c3Bhbj5BPC9zcGFuPjxzcGFuPkI8L3NwYW4+PHNwYW4+Qzwvc3Bhbj48c3Bhbj5EPC9zcGFuPjxzcGFuPkU8L3NwYW4+PHNwYW4+Rjwvc3Bhbj48c3Bhbj5HPC9zcGFuPjxzcGFuPkg8L3NwYW4+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGlkPSJib2FyZCIgY2xhc3M9ImJvYXJkIiByb2xlPSJncmlkIiBhcmlhLWxhYmVsPSJEYW1lYnJldHQgbWl0IDY0IEZlbGRlcm4iPjwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJib2FyZC1sYWJlbCBib3R0b20tbGFiZWwiIGFyaWEtaGlkZGVuPSJ0cnVlIj4KICAgICAgICAgICAgICA8c3Bhbj5BPC9zcGFuPjxzcGFuPkI8L3NwYW4+PHNwYW4+Qzwvc3Bhbj48c3Bhbj5EPC9zcGFuPjxzcGFuPkU8L3NwYW4+PHNwYW4+Rjwvc3Bhbj48c3Bhbj5HPC9zcGFuPjxzcGFuPkg8L3NwYW4+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8cCBpZD0iZmVlZGJhY2siIGNsYXNzPSJmZWVkYmFjayIgYXJpYS1saXZlPSJwb2xpdGUiPlfDpGhsZSBlaW5lbiBkZWluZXIgaGVsbGVuIFN0ZWluZS48L3A+CiAgICAgICAgPC9kaXY+CgogICAgICAgIDxhc2lkZSBjbGFzcz0ic2lkZS1wYW5lbCI+CiAgICAgICAgICA8c2VjdGlvbiBjbGFzcz0iY29hY2gtY2FyZCI+CiAgICAgICAgICAgIDxoMj5Db2FjaDwvaDI+CiAgICAgICAgICAgIDxwIGlkPSJjb2FjaC10ZXh0Ij5Lb250cm9sbGllcmUgZGllIE1pdHRlIHVuZCBhY2h0ZSBhdWYgU2NobGFncGZsaWNodC48L3A+CiAgICAgICAgICA8L3NlY3Rpb24+CgogICAgICAgICAgPHNlY3Rpb24gY2xhc3M9Im1pc3Npb24tY2FyZCI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1pc3Npb24taGVhZCI+CiAgICAgICAgICAgICAgPGgyPk1pc3Npb248L2gyPgogICAgICAgICAgICAgIDxzcGFuIGlkPSJtaXNzaW9uLWxhYmVsIj5FcsO2ZmZudW5nPC9zcGFuPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPHAgaWQ9Im1pc3Npb24tdGV4dCI+QnJpbmdlIGRlaW5lIFN0ZWluZSBzaWNoZXIgbmFjaCB2b3JuIHVuZCBiZXJlaXRlIGVpbmVuIFNjaGxhZ3p1ZyB2b3IuPC9wPgogICAgICAgICAgPC9zZWN0aW9uPgoKICAgICAgICAgIDxzZWN0aW9uIGNsYXNzPSJjYXB0dXJlLWNhcmQiPgogICAgICAgICAgICA8aDI+TWF0ZXJpYWw8L2gyPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJtYXRlcmlhbC1yb3ciPgogICAgICAgICAgICAgIDxzcGFuPkRlaW5lIFN0ZWluZTwvc3Bhbj4KICAgICAgICAgICAgICA8c3Ryb25nIGlkPSJwbGF5ZXItcGllY2VzIj4xMjwvc3Ryb25nPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ibWF0ZXJpYWwtcm93Ij4KICAgICAgICAgICAgICA8c3Bhbj5LSS1TdGVpbmU8L3NwYW4+CiAgICAgICAgICAgICAgPHN0cm9uZyBpZD0iYm90LXBpZWNlcyI+MTI8L3N0cm9uZz4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1hdGVyaWFsLXJvdyI+CiAgICAgICAgICAgICAgPHNwYW4+R2VzY2hsYWdlbjwvc3Bhbj4KICAgICAgICAgICAgICA8c3Ryb25nIGlkPSJjYXB0dXJlLXZhbHVlIj4wPC9zdHJvbmc+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9zZWN0aW9uPgoKICAgICAgICAgIDxzZWN0aW9uIGlkPSJydWxlcy1wYW5lbCIgY2xhc3M9InJ1bGVzLXBhbmVsIiBhcmlhLWxhYmVsPSJSZWdlbGhpbGZlIj4KICAgICAgICAgICAgPGgyPlJlZ2VsaGlsZmU8L2gyPgogICAgICAgICAgICA8dWw+CiAgICAgICAgICAgICAgPGxpPk5vcm1hbGUgU3RlaW5lIHppZWhlbiBlaW4gRmVsZCBkaWFnb25hbCB2b3J3w6RydHMuPC9saT4KICAgICAgICAgICAgICA8bGk+RWluIFNjaGxhZyDDvGJlcnNwcmluZ3QgZWluZW4gZ2VnbmVyaXNjaGVuIFN0ZWluIGF1ZiBlaW4gZnJlaWVzIEZlbGQuPC9saT4KICAgICAgICAgICAgICA8bGk+V2VubiBlaW4gU2NobGFnIG3DtmdsaWNoIGlzdCwgbXVzcyBlaW4gU2NobGFnIGdlc3BpZWx0IHdlcmRlbi48L2xpPgogICAgICAgICAgICAgIDxsaT5OYWNoIGVpbmVtIFNjaGxhZyB3aXJkIGVpbiB3ZWl0ZXJlciBTY2hsYWcgbWl0IGRlbXNlbGJlbiBTdGVpbiBzb2ZvcnQgZm9ydGdlc2V0enQuPC9saT4KICAgICAgICAgICAgICA8bGk+QXVmIGRlciBHcnVuZHJlaWhlIGRlciBHZWdlbnNlaXRlIHdpcmQgZWluIFN0ZWluIHp1ciBEYW1lLjwvbGk+CiAgICAgICAgICAgIDwvdWw+CiAgICAgICAgICA8L3NlY3Rpb24+CiAgICAgICAgPC9hc2lkZT4KICAgICAgPC9zZWN0aW9uPgogICAgPC9zZWN0aW9uPgoKICAgIDxzZWN0aW9uIGlkPSJlbmQtc2NyZWVuIiBjbGFzcz0ic2NyZWVuIiBhcmlhLWxhYmVsbGVkYnk9InJlc3VsdC10aXRsZSI+CiAgICAgIDxkaXYgY2xhc3M9InJlc3VsdC1jYXJkIj4KICAgICAgICA8cCBjbGFzcz0iZXllYnJvdyI+UGFydGllIGJlZW5kZXQ8L3A+CiAgICAgICAgPGgxIGlkPSJyZXN1bHQtdGl0bGUiPkF1c3dlcnR1bmc8L2gxPgogICAgICAgIDxwIGlkPSJyZXN1bHQtdGV4dCI+RHUgaGFzdCBkaWUgUGFydGllIGFiZ2VzY2hsb3NzZW4uPC9wPgogICAgICAgIDxkaXYgY2xhc3M9InJlc3VsdC1zdGF0cyI+CiAgICAgICAgICA8ZGl2PgogICAgICAgICAgICA8c3Bhbj5QdW5rdGU8L3NwYW4+CiAgICAgICAgICAgIDxzdHJvbmcgaWQ9ImZpbmFsLXNjb3JlIj4wPC9zdHJvbmc+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgIDxzcGFuPlplaXQ8L3NwYW4+CiAgICAgICAgICAgIDxzdHJvbmcgaWQ9ImZpbmFsLXRpbWUiPjAwOjAwPC9zdHJvbmc+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgIDxzcGFuPkxlcm5zdHVmZTwvc3Bhbj4KICAgICAgICAgICAgPHN0cm9uZyBpZD0iZmluYWwtbGV2ZWwiPjE8L3N0cm9uZz4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9Imhlcm8tYWN0aW9ucyI+CiAgICAgICAgICA8YnV0dG9uIGlkPSJwbGF5LWFnYWluLWJ1dHRvbiIgY2xhc3M9InByaW1hcnktYnV0dG9uIiB0eXBlPSJidXR0b24iPk5vY2ggZWluZSBQYXJ0aWU8L2J1dHRvbj4KICAgICAgICAgIDxidXR0b24gaWQ9ImVuZC1tZW51LWJ1dHRvbiIgY2xhc3M9InNlY29uZGFyeS1idXR0b24iIHR5cGU9ImJ1dHRvbiI+WnVtIE1lbsO8PC9idXR0b24+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgPC9zZWN0aW9uPgoKICAgIDxkaXYgaWQ9InRvYXN0IiBjbGFzcz0idG9hc3QiIHJvbGU9InN0YXR1cyIgYXJpYS1saXZlPSJwb2xpdGUiPjwvZGl2PgogIDwvbWFpbj4KCiAgCjxzY3JpcHQ+CigoKSA9PiB7CiAgInVzZSBzdHJpY3QiOwoKICBjb25zdCBCT0FSRF9TSVpFID0gODsKICBjb25zdCBTSURFX1BMQVlFUiA9ICJwbGF5ZXIiOwogIGNvbnN0IFNJREVfQk9UID0gImJvdCI7CiAgY29uc3QgTEVUVEVSUyA9IFsiQSIsICJCIiwgIkMiLCAiRCIsICJFIiwgIkYiLCAiRyIsICJIIl07CgogIGNvbnN0IGRpZmZpY3VsdHlOYW1lcyA9IHsKICAgIGVhc3k6ICJFaW5zdGVpZ2VyIiwKICAgIGJhbGFuY2VkOiAiRm9ydGdlc2Nocml0dGVuIiwKICAgIGV4cGVydDogIlByb2ZpIgogIH07CgogIGNvbnN0IGxldmVsRGF0YSA9IFsKICAgIHsKICAgICAgdGhyZXNob2xkOiAwLAogICAgICBsYWJlbDogIkVyw7ZmZm51bmciLAogICAgICBtaXNzaW9uOiAiQnJpbmdlIGRlaW5lIFN0ZWluZSBzaWNoZXIgbmFjaCB2b3JuIHVuZCBiZXJlaXRlIGVpbmVuIFNjaGxhZ3p1ZyB2b3IuIiwKICAgICAgY29hY2g6ICJLb250cm9sbGllcmUgZGllIE1pdHRlIHVuZCB6aWVoZSBuaWNodCBqZWRlbiBSYW5kc3RlaW4gc29mb3J0IHdlZy4iCiAgICB9LAogICAgewogICAgICB0aHJlc2hvbGQ6IDgwLAogICAgICBsYWJlbDogIlRha3RpayIsCiAgICAgIG1pc3Npb246ICJOdXR6ZSBkaWUgU2NobGFncGZsaWNodDogTG9ja2UgZGllIEtJIGluIGVpbmVuIHVuZ8O8bnN0aWdlbiBTY2hsYWcuIiwKICAgICAgY29hY2g6ICJXZW5uIG1laHJlcmUgU2NobMOkZ2UgZHJvaGVuLCBzdWNoZSB6dWVyc3QgbmFjaCBkZW0gWnVnIG1pdCBBbnNjaGx1c3MuIgogICAgfSwKICAgIHsKICAgICAgdGhyZXNob2xkOiAxODAsCiAgICAgIGxhYmVsOiAiRGFtZW5sYXVmIiwKICAgICAgbWlzc2lvbjogIkVycmVpY2hlIGRpZSBnZWduZXJpc2NoZSBHcnVuZHJlaWhlIHVuZCBiaWxkZSBlaW5lIERhbWUuIiwKICAgICAgY29hY2g6ICJEYW1lbiBzaW5kIGJld2VnbGljaGVyLiBTaWNoZXJlIGRlbiBXZWcgbWl0IGJlbmFjaGJhcnRlbiBTdGVpbmVuLiIKICAgIH0sCiAgICB7CiAgICAgIHRocmVzaG9sZDogMzIwLAogICAgICBsYWJlbDogIkVuZHNwaWVsIiwKICAgICAgbWlzc2lvbjogIkhhbHRlIE1hdGVyaWFsdm9ydGVpbCwgYmxvY2tpZXJlIGRpZSBLSSB1bmQgZXJ6d2luZ2UgZGVuIFNpZWcuIiwKICAgICAgY29hY2g6ICJJbSBFbmRzcGllbCB6w6RobHQgWnVnendhbmc6IEJlZ3JlbnplIGRpZSBGZWxkZXIgZGVyIGdlZ25lcmlzY2hlbiBTdGVpbmUuIgogICAgfQogIF07CgogIGNvbnN0IGVsZW1lbnRzID0gewogICAgcm9vdDogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUtcm9vdCIpLAogICAgc3RhcnRTY3JlZW46IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzdGFydC1zY3JlZW4iKSwKICAgIHBsYXlTY3JlZW46IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJwbGF5LXNjcmVlbiIpLAogICAgZW5kU2NyZWVuOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZW5kLXNjcmVlbiIpLAogICAgc3RhcnRHYW1lQnV0dG9uOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgic3RhcnQtZ2FtZS1idXR0b24iKSwKICAgIHRyYWluaW5nR2FtZUJ1dHRvbjogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInRyYWluaW5nLWdhbWUtYnV0dG9uIiksCiAgICBzdGFydEZ1bGxzY3JlZW5CdXR0b246IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzdGFydC1mdWxsc2NyZWVuLWJ1dHRvbiIpLAogICAgZnVsbHNjcmVlbkJ1dHRvbjogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImZ1bGxzY3JlZW4tYnV0dG9uIiksCiAgICBkaWZmaWN1bHR5T3B0aW9uczogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImRpZmZpY3VsdHktb3B0aW9ucyIpLAogICAgcmVzZXRCdXR0b246IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJyZXNldC1idXR0b24iKSwKICAgIG1lbnVCdXR0b246IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJtZW51LWJ1dHRvbiIpLAogICAgaGludEJ1dHRvbjogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImhpbnQtYnV0dG9uIiksCiAgICBydWxlc0J1dHRvbjogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInJ1bGVzLWJ1dHRvbiIpLAogICAgcnVsZXNQYW5lbDogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInJ1bGVzLXBhbmVsIiksCiAgICBib2FyZDogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJvYXJkIiksCiAgICBmZWVkYmFjazogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImZlZWRiYWNrIiksCiAgICBzY29yZVZhbHVlOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgic2NvcmUtdmFsdWUiKSwKICAgIGxldmVsVmFsdWU6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJsZXZlbC12YWx1ZSIpLAogICAgdHVyblZhbHVlOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidHVybi12YWx1ZSIpLAogICAgdGltZVZhbHVlOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidGltZS12YWx1ZSIpLAogICAgcHJvZ3Jlc3NCYXI6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJwcm9ncmVzcy1iYXIiKSwKICAgIGNvYWNoVGV4dDogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvYWNoLXRleHQiKSwKICAgIG1pc3Npb25MYWJlbDogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm1pc3Npb24tbGFiZWwiKSwKICAgIG1pc3Npb25UZXh0OiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibWlzc2lvbi10ZXh0IiksCiAgICBwbGF5ZXJQaWVjZXM6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJwbGF5ZXItcGllY2VzIiksCiAgICBib3RQaWVjZXM6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJib3QtcGllY2VzIiksCiAgICBjYXB0dXJlVmFsdWU6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjYXB0dXJlLXZhbHVlIiksCiAgICB0b2FzdDogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInRvYXN0IiksCiAgICByZXN1bHRUaXRsZTogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInJlc3VsdC10aXRsZSIpLAogICAgcmVzdWx0VGV4dDogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInJlc3VsdC10ZXh0IiksCiAgICBmaW5hbFNjb3JlOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZmluYWwtc2NvcmUiKSwKICAgIGZpbmFsVGltZTogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImZpbmFsLXRpbWUiKSwKICAgIGZpbmFsTGV2ZWw6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJmaW5hbC1sZXZlbCIpLAogICAgcGxheUFnYWluQnV0dG9uOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicGxheS1hZ2Fpbi1idXR0b24iKSwKICAgIGVuZE1lbnVCdXR0b246IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJlbmQtbWVudS1idXR0b24iKQogIH07CgogIGxldCBib2FyZFN0YXRlID0gW107CiAgbGV0IHNlbGVjdGVkSW5kZXggPSBudWxsOwogIGxldCBsZWdhbE1vdmVzRm9yU2VsZWN0ZWQgPSBbXTsKICBsZXQgZm9yY2VkUGllY2VJbmRleCA9IG51bGw7CiAgbGV0IHR1cm4gPSBTSURFX1BMQVlFUjsKICBsZXQgc2NvcmUgPSAwOwogIGxldCBjYXB0dXJlcyA9IDA7CiAgbGV0IGVsYXBzZWRTZWNvbmRzID0gMDsKICBsZXQgdGltZXJJZCA9IG51bGw7CiAgbGV0IGJvdFRpbWVySWQgPSBudWxsOwogIGxldCB0b2FzdFRpbWVySWQgPSBudWxsOwogIGxldCBkaWZmaWN1bHR5ID0gImJhbGFuY2VkIjsKICBsZXQgYWN0aXZlU2NyZWVuID0gInN0YXJ0IjsKICBsZXQgbGFzdE1vdmUgPSBudWxsOwogIGxldCBoaW50TW92ZSA9IG51bGw7CiAgbGV0IGFpVGhpbmtpbmcgPSBmYWxzZTsKICBsZXQga2V5Ym9hcmRGb2N1c0luZGV4ID0gbnVsbDsKICBsZXQgZ2FtZUZpbmlzaGVkID0gZmFsc2U7CgogIGZ1bmN0aW9uIGluZGV4RnJvbVJvd0NvbChyb3csIGNvbCkgewogICAgcmV0dXJuIHJvdyAqIEJPQVJEX1NJWkUgKyBjb2w7CiAgfQoKICBmdW5jdGlvbiByb3dPZihpbmRleCkgewogICAgcmV0dXJuIE1hdGguZmxvb3IoaW5kZXggLyBCT0FSRF9TSVpFKTsKICB9CgogIGZ1bmN0aW9uIGNvbE9mKGluZGV4KSB7CiAgICByZXR1cm4gaW5kZXggJSBCT0FSRF9TSVpFOwogIH0KCiAgZnVuY3Rpb24gaXNJbnNpZGUocm93LCBjb2wpIHsKICAgIHJldHVybiByb3cgPj0gMCAmJiByb3cgPCBCT0FSRF9TSVpFICYmIGNvbCA+PSAwICYmIGNvbCA8IEJPQVJEX1NJWkU7CiAgfQoKICBmdW5jdGlvbiBpc0Rhcmsocm93LCBjb2wpIHsKICAgIHJldHVybiAocm93ICsgY29sKSAlIDIgPT09IDE7CiAgfQoKICBmdW5jdGlvbiBmaWVsZE5hbWUoaW5kZXgpIHsKICAgIGNvbnN0IHJvdyA9IHJvd09mKGluZGV4KTsKICAgIGNvbnN0IGNvbCA9IGNvbE9mKGluZGV4KTsKICAgIHJldHVybiBMRVRURVJTW2NvbF0gKyBTdHJpbmcoQk9BUkRfU0laRSAtIHJvdyk7CiAgfQoKICBmdW5jdGlvbiBlbmVteU9mKHNpZGUpIHsKICAgIHJldHVybiBzaWRlID09PSBTSURFX1BMQVlFUiA/IFNJREVfQk9UIDogU0lERV9QTEFZRVI7CiAgfQoKICBmdW5jdGlvbiBzZXR1cEJvYXJkKCkgewogICAgY29uc3QgbmV4dEJvYXJkID0gbmV3IEFycmF5KEJPQVJEX1NJWkUgKiBCT0FSRF9TSVpFKS5maWxsKG51bGwpOwogICAgZm9yIChsZXQgcm93ID0gMDsgcm93IDwgQk9BUkRfU0laRTsgcm93ICs9IDEpIHsKICAgICAgZm9yIChsZXQgY29sID0gMDsgY29sIDwgQk9BUkRfU0laRTsgY29sICs9IDEpIHsKICAgICAgICBpZiAoIWlzRGFyayhyb3csIGNvbCkpIHsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBjb25zdCBpbmRleCA9IGluZGV4RnJvbVJvd0NvbChyb3csIGNvbCk7CiAgICAgICAgaWYgKHJvdyA8IDMpIHsKICAgICAgICAgIG5leHRCb2FyZFtpbmRleF0gPSB7IHNpZGU6IFNJREVfQk9ULCBraW5nOiBmYWxzZSB9OwogICAgICAgIH0gZWxzZSBpZiAocm93ID4gNCkgewogICAgICAgICAgbmV4dEJvYXJkW2luZGV4XSA9IHsgc2lkZTogU0lERV9QTEFZRVIsIGtpbmc6IGZhbHNlIH07CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gbmV4dEJvYXJkOwogIH0KCiAgZnVuY3Rpb24gcmVzZXRHYW1lKCkgewogICAgY2xlYXJUaW1lcnMoKTsKICAgIGJvYXJkU3RhdGUgPSBzZXR1cEJvYXJkKCk7CiAgICBzZWxlY3RlZEluZGV4ID0gbnVsbDsKICAgIGxlZ2FsTW92ZXNGb3JTZWxlY3RlZCA9IFtdOwogICAgZm9yY2VkUGllY2VJbmRleCA9IG51bGw7CiAgICB0dXJuID0gU0lERV9QTEFZRVI7CiAgICBzY29yZSA9IDA7CiAgICBjYXB0dXJlcyA9IDA7CiAgICBlbGFwc2VkU2Vjb25kcyA9IDA7CiAgICBhaVRoaW5raW5nID0gZmFsc2U7CiAgICBnYW1lRmluaXNoZWQgPSBmYWxzZTsKICAgIGxhc3RNb3ZlID0gbnVsbDsKICAgIGhpbnRNb3ZlID0gbnVsbDsKICAgIGtleWJvYXJkRm9jdXNJbmRleCA9IGluZGV4RnJvbVJvd0NvbCg1LCAwKTsKICAgIHN0YXJ0VGltZXIoKTsKICAgIHNldEZlZWRiYWNrKCJXw6RobGUgZWluZW4gZGVpbmVyIGhlbGxlbiBTdGVpbmUuIFRpcHA6IEVudHdpY2tsZSB6dWVyc3QgZWluZW4gU3RlaW4genVyIE1pdHRlLiIsICIiKTsKICAgIHVwZGF0ZUh1ZCgpOwogICAgcmVuZGVyQm9hcmQoKTsKICB9CgogIGZ1bmN0aW9uIGNsZWFyVGltZXJzKCkgewogICAgaWYgKHRpbWVySWQgIT09IG51bGwpIHsKICAgICAgY2xlYXJJbnRlcnZhbCh0aW1lcklkKTsKICAgICAgdGltZXJJZCA9IG51bGw7CiAgICB9CiAgICBpZiAoYm90VGltZXJJZCAhPT0gbnVsbCkgewogICAgICBjbGVhclRpbWVvdXQoYm90VGltZXJJZCk7CiAgICAgIGJvdFRpbWVySWQgPSBudWxsOwogICAgfQogICAgaWYgKHRvYXN0VGltZXJJZCAhPT0gbnVsbCkgewogICAgICBjbGVhclRpbWVvdXQodG9hc3RUaW1lcklkKTsKICAgICAgdG9hc3RUaW1lcklkID0gbnVsbDsKICAgIH0KICB9CgogIGZ1bmN0aW9uIHNob3dTY3JlZW4obmFtZSkgewogICAgYWN0aXZlU2NyZWVuID0gbmFtZTsKICAgIGNvbnN0IG1hcCA9IHsKICAgICAgc3RhcnQ6IGVsZW1lbnRzLnN0YXJ0U2NyZWVuLAogICAgICBwbGF5OiBlbGVtZW50cy5wbGF5U2NyZWVuLAogICAgICBlbmQ6IGVsZW1lbnRzLmVuZFNjcmVlbgogICAgfTsKICAgIE9iamVjdC5rZXlzKG1hcCkuZm9yRWFjaCgoa2V5KSA9PiB7CiAgICAgIG1hcFtrZXldLmNsYXNzTGlzdC50b2dnbGUoInNjcmVlbi1hY3RpdmUiLCBrZXkgPT09IG5hbWUpOwogICAgfSk7CiAgfQoKICBmdW5jdGlvbiBzdGFydEdhbWUodHJhaW5pbmdNb2RlKSB7CiAgICBpZiAodHJhaW5pbmdNb2RlKSB7CiAgICAgIHNldERpZmZpY3VsdHkoImVhc3kiKTsKICAgICAgc2hvd1RvYXN0KCJUcmFpbmluZ3NydW5kZTogRGllIEtJIHNwaWVsdCBiZXd1c3N0IGxlaHJyZWljaC4iKTsKICAgIH0KICAgIHNob3dTY3JlZW4oInBsYXkiKTsKICAgIHJlc2V0R2FtZSgpOwogIH0KCiAgZnVuY3Rpb24gcmV0dXJuVG9NZW51KCkgewogICAgY2xlYXJUaW1lcnMoKTsKICAgIGdhbWVGaW5pc2hlZCA9IGZhbHNlOwogICAgc2hvd1NjcmVlbigic3RhcnQiKTsKICB9CgogIGZ1bmN0aW9uIHN0YXJ0VGltZXIoKSB7CiAgICBpZiAodGltZXJJZCAhPT0gbnVsbCkgewogICAgICBjbGVhckludGVydmFsKHRpbWVySWQpOwogICAgfQogICAgdGltZXJJZCA9IHNldEludGVydmFsKCgpID0+IHsKICAgICAgZWxhcHNlZFNlY29uZHMgKz0gMTsKICAgICAgdXBkYXRlSHVkKCk7CiAgICB9LCAxMDAwKTsKICB9CgogIGZ1bmN0aW9uIGZvcm1hdFRpbWUoc2Vjb25kcykgewogICAgY29uc3QgbWludXRlcyA9IE1hdGguZmxvb3Ioc2Vjb25kcyAvIDYwKTsKICAgIGNvbnN0IHJlc3QgPSBzZWNvbmRzICUgNjA7CiAgICByZXR1cm4gU3RyaW5nKG1pbnV0ZXMpLnBhZFN0YXJ0KDIsICIwIikgKyAiOiIgKyBTdHJpbmcocmVzdCkucGFkU3RhcnQoMiwgIjAiKTsKICB9CgogIGZ1bmN0aW9uIGRpcmVjdGlvbnNGb3JQaWVjZShwaWVjZSkgewogICAgaWYgKHBpZWNlLmtpbmcpIHsKICAgICAgcmV0dXJuIFsKICAgICAgICBbLTEsIC0xXSwKICAgICAgICBbLTEsIDFdLAogICAgICAgIFsxLCAtMV0sCiAgICAgICAgWzEsIDFdCiAgICAgIF07CiAgICB9CiAgICBpZiAocGllY2Uuc2lkZSA9PT0gU0lERV9QTEFZRVIpIHsKICAgICAgcmV0dXJuIFsKICAgICAgICBbLTEsIC0xXSwKICAgICAgICBbLTEsIDFdCiAgICAgIF07CiAgICB9CiAgICByZXR1cm4gWwogICAgICBbMSwgLTFdLAogICAgICBbMSwgMV0KICAgIF07CiAgfQoKICBmdW5jdGlvbiBnZXRNb3Zlc0ZvclBpZWNlKHN0YXRlLCBpbmRleCwgY2FwdHVyZXNPbmx5KSB7CiAgICBjb25zdCBwaWVjZSA9IHN0YXRlW2luZGV4XTsKICAgIGlmICghcGllY2UpIHsKICAgICAgcmV0dXJuIFtdOwogICAgfQoKICAgIGNvbnN0IG1vdmVzID0gW107CiAgICBjb25zdCByb3cgPSByb3dPZihpbmRleCk7CiAgICBjb25zdCBjb2wgPSBjb2xPZihpbmRleCk7CiAgICBjb25zdCBkaXJlY3Rpb25zID0gZGlyZWN0aW9uc0ZvclBpZWNlKHBpZWNlKTsKCiAgICBkaXJlY3Rpb25zLmZvckVhY2goKGRpcmVjdGlvbikgPT4gewogICAgICBjb25zdCBtaWRSb3cgPSByb3cgKyBkaXJlY3Rpb25bMF07CiAgICAgIGNvbnN0IG1pZENvbCA9IGNvbCArIGRpcmVjdGlvblsxXTsKICAgICAgY29uc3QgbGFuZFJvdyA9IHJvdyArIGRpcmVjdGlvblswXSAqIDI7CiAgICAgIGNvbnN0IGxhbmRDb2wgPSBjb2wgKyBkaXJlY3Rpb25bMV0gKiAyOwoKICAgICAgaWYgKGlzSW5zaWRlKG1pZFJvdywgbWlkQ29sKSkgewogICAgICAgIGNvbnN0IG1pZEluZGV4ID0gaW5kZXhGcm9tUm93Q29sKG1pZFJvdywgbWlkQ29sKTsKICAgICAgICBjb25zdCBtaWRQaWVjZSA9IHN0YXRlW21pZEluZGV4XTsKCiAgICAgICAgaWYgKCFjYXB0dXJlc09ubHkgJiYgIW1pZFBpZWNlKSB7CiAgICAgICAgICBtb3Zlcy5wdXNoKHsKICAgICAgICAgICAgZnJvbTogaW5kZXgsCiAgICAgICAgICAgIHRvOiBtaWRJbmRleCwKICAgICAgICAgICAgY2FwdHVyZWQ6IG51bGwKICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgaWYgKGlzSW5zaWRlKGxhbmRSb3csIGxhbmRDb2wpICYmIG1pZFBpZWNlICYmIG1pZFBpZWNlLnNpZGUgIT09IHBpZWNlLnNpZGUpIHsKICAgICAgICAgIGNvbnN0IGxhbmRJbmRleCA9IGluZGV4RnJvbVJvd0NvbChsYW5kUm93LCBsYW5kQ29sKTsKICAgICAgICAgIGlmICghc3RhdGVbbGFuZEluZGV4XSkgewogICAgICAgICAgICBtb3Zlcy5wdXNoKHsKICAgICAgICAgICAgICBmcm9tOiBpbmRleCwKICAgICAgICAgICAgICB0bzogbGFuZEluZGV4LAogICAgICAgICAgICAgIGNhcHR1cmVkOiBtaWRJbmRleAogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0pOwoKICAgIGlmIChjYXB0dXJlc09ubHkpIHsKICAgICAgcmV0dXJuIG1vdmVzLmZpbHRlcigobW92ZSkgPT4gbW92ZS5jYXB0dXJlZCAhPT0gbnVsbCk7CiAgICB9CiAgICByZXR1cm4gbW92ZXM7CiAgfQoKICBmdW5jdGlvbiBnZXRBbGxDYXB0dXJlcyhzdGF0ZSwgc2lkZSwgb25seUluZGV4KSB7CiAgICBjb25zdCBjYXB0dXJlc0xpc3QgPSBbXTsKICAgIHN0YXRlLmZvckVhY2goKHBpZWNlLCBpbmRleCkgPT4gewogICAgICBpZiAoIXBpZWNlIHx8IHBpZWNlLnNpZGUgIT09IHNpZGUpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgaWYgKG9ubHlJbmRleCAhPT0gbnVsbCAmJiBpbmRleCAhPT0gb25seUluZGV4KSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGdldE1vdmVzRm9yUGllY2Uoc3RhdGUsIGluZGV4LCB0cnVlKS5mb3JFYWNoKChtb3ZlKSA9PiBjYXB0dXJlc0xpc3QucHVzaChtb3ZlKSk7CiAgICB9KTsKICAgIHJldHVybiBjYXB0dXJlc0xpc3Q7CiAgfQoKICBmdW5jdGlvbiBnZXRBbGxMZWdhbE1vdmVzKHN0YXRlLCBzaWRlLCBvbmx5SW5kZXgpIHsKICAgIGNvbnN0IGZvcmNlZENhcHR1cmVzID0gZ2V0QWxsQ2FwdHVyZXMoc3RhdGUsIHNpZGUsIG9ubHlJbmRleCk7CiAgICBpZiAoZm9yY2VkQ2FwdHVyZXMubGVuZ3RoID4gMCkgewogICAgICByZXR1cm4gZm9yY2VkQ2FwdHVyZXM7CiAgICB9CiAgICBpZiAob25seUluZGV4ICE9PSBudWxsKSB7CiAgICAgIHJldHVybiBbXTsKICAgIH0KICAgIGNvbnN0IG1vdmVzID0gW107CiAgICBzdGF0ZS5mb3JFYWNoKChwaWVjZSwgaW5kZXgpID0+IHsKICAgICAgaWYgKHBpZWNlICYmIHBpZWNlLnNpZGUgPT09IHNpZGUpIHsKICAgICAgICBnZXRNb3Zlc0ZvclBpZWNlKHN0YXRlLCBpbmRleCwgZmFsc2UpCiAgICAgICAgICAuZmlsdGVyKChtb3ZlKSA9PiBtb3ZlLmNhcHR1cmVkID09PSBudWxsKQogICAgICAgICAgLmZvckVhY2goKG1vdmUpID0+IG1vdmVzLnB1c2gobW92ZSkpOwogICAgICB9CiAgICB9KTsKICAgIHJldHVybiBtb3ZlczsKICB9CgogIGZ1bmN0aW9uIGNsb25lQm9hcmQoc3RhdGUpIHsKICAgIHJldHVybiBzdGF0ZS5tYXAoKHBpZWNlKSA9PiB7CiAgICAgIGlmICghcGllY2UpIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICByZXR1cm4geyBzaWRlOiBwaWVjZS5zaWRlLCBraW5nOiBwaWVjZS5raW5nIH07CiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIGFwcGx5TW92ZVRvU3RhdGUoc3RhdGUsIG1vdmUpIHsKICAgIGNvbnN0IHBpZWNlID0gc3RhdGVbbW92ZS5mcm9tXTsKICAgIGNvbnN0IGNhcHR1cmVkUGllY2UgPSBtb3ZlLmNhcHR1cmVkID09PSBudWxsID8gbnVsbCA6IHN0YXRlW21vdmUuY2FwdHVyZWRdOwogICAgc3RhdGVbbW92ZS5mcm9tXSA9IG51bGw7CiAgICBzdGF0ZVttb3ZlLnRvXSA9IHBpZWNlOwogICAgaWYgKG1vdmUuY2FwdHVyZWQgIT09IG51bGwpIHsKICAgICAgc3RhdGVbbW92ZS5jYXB0dXJlZF0gPSBudWxsOwogICAgfQoKICAgIGxldCBwcm9tb3RlZCA9IGZhbHNlOwogICAgY29uc3Qgcm93ID0gcm93T2YobW92ZS50byk7CiAgICBpZiAocGllY2UgJiYgIXBpZWNlLmtpbmcpIHsKICAgICAgaWYgKChwaWVjZS5zaWRlID09PSBTSURFX1BMQVlFUiAmJiByb3cgPT09IDApIHx8IChwaWVjZS5zaWRlID09PSBTSURFX0JPVCAmJiByb3cgPT09IEJPQVJEX1NJWkUgLSAxKSkgewogICAgICAgIHBpZWNlLmtpbmcgPSB0cnVlOwogICAgICAgIHByb21vdGVkID0gdHJ1ZTsKICAgICAgfQogICAgfQoKICAgIHJldHVybiB7IHBpZWNlLCBjYXB0dXJlZFBpZWNlLCBwcm9tb3RlZCB9OwogIH0KCiAgZnVuY3Rpb24gY291bnRQaWVjZXMoc2lkZSkgewogICAgcmV0dXJuIGJvYXJkU3RhdGUuZmlsdGVyKChwaWVjZSkgPT4gcGllY2UgJiYgcGllY2Uuc2lkZSA9PT0gc2lkZSkubGVuZ3RoOwogIH0KCiAgZnVuY3Rpb24gY291bnRLaW5ncyhzdGF0ZSwgc2lkZSkgewogICAgcmV0dXJuIHN0YXRlLmZpbHRlcigocGllY2UpID0+IHBpZWNlICYmIHBpZWNlLnNpZGUgPT09IHNpZGUgJiYgcGllY2Uua2luZykubGVuZ3RoOwogIH0KCiAgZnVuY3Rpb24gc2V0RmVlZGJhY2sobWVzc2FnZSwgdG9uZSkgewogICAgZWxlbWVudHMuZmVlZGJhY2sudGV4dENvbnRlbnQgPSBtZXNzYWdlOwogICAgZWxlbWVudHMuZmVlZGJhY2suY2xhc3NMaXN0LnJlbW92ZSgiZ29vZCIsICJiYWQiKTsKICAgIGlmICh0b25lID09PSAiZ29vZCIpIHsKICAgICAgZWxlbWVudHMuZmVlZGJhY2suY2xhc3NMaXN0LmFkZCgiZ29vZCIpOwogICAgfSBlbHNlIGlmICh0b25lID09PSAiYmFkIikgewogICAgICBlbGVtZW50cy5mZWVkYmFjay5jbGFzc0xpc3QuYWRkKCJiYWQiKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIHNob3dUb2FzdChtZXNzYWdlKSB7CiAgICBlbGVtZW50cy50b2FzdC50ZXh0Q29udGVudCA9IG1lc3NhZ2U7CiAgICBlbGVtZW50cy50b2FzdC5jbGFzc0xpc3QuYWRkKCJ0b2FzdC12aXNpYmxlIik7CiAgICBpZiAodG9hc3RUaW1lcklkICE9PSBudWxsKSB7CiAgICAgIGNsZWFyVGltZW91dCh0b2FzdFRpbWVySWQpOwogICAgfQogICAgdG9hc3RUaW1lcklkID0gc2V0VGltZW91dCgoKSA9PiB7CiAgICAgIGVsZW1lbnRzLnRvYXN0LmNsYXNzTGlzdC5yZW1vdmUoInRvYXN0LXZpc2libGUiKTsKICAgIH0sIDIyMDApOwogIH0KCiAgZnVuY3Rpb24gdXBkYXRlSHVkKCkgewogICAgY29uc3QgbGV2ZWxJbmRleCA9IGdldExldmVsSW5kZXgoKTsKICAgIGNvbnN0IGxldmVsID0gbGV2ZWxJbmRleCArIDE7CiAgICBjb25zdCBuZXh0TGV2ZWwgPSBsZXZlbERhdGFbTWF0aC5taW4obGV2ZWxJbmRleCArIDEsIGxldmVsRGF0YS5sZW5ndGggLSAxKV07CiAgICBjb25zdCBjdXJyZW50TGV2ZWwgPSBsZXZlbERhdGFbbGV2ZWxJbmRleF07CiAgICBjb25zdCBiYXNlID0gY3VycmVudExldmVsLnRocmVzaG9sZDsKICAgIGNvbnN0IHRhcmdldCA9IG5leHRMZXZlbC50aHJlc2hvbGQgPT09IGJhc2UgPyBiYXNlICsgMTIwIDogbmV4dExldmVsLnRocmVzaG9sZDsKICAgIGNvbnN0IHByb2dyZXNzID0gTWF0aC5tYXgoNCwgTWF0aC5taW4oMTAwLCAoKHNjb3JlIC0gYmFzZSkgLyAodGFyZ2V0IC0gYmFzZSkpICogMTAwKSk7CgogICAgZWxlbWVudHMuc2NvcmVWYWx1ZS50ZXh0Q29udGVudCA9IFN0cmluZyhzY29yZSk7CiAgICBlbGVtZW50cy5sZXZlbFZhbHVlLnRleHRDb250ZW50ID0gU3RyaW5nKGxldmVsKTsKICAgIGVsZW1lbnRzLnR1cm5WYWx1ZS50ZXh0Q29udGVudCA9IHR1cm4gPT09IFNJREVfUExBWUVSID8gIkR1IiA6ICJLSSI7CiAgICBlbGVtZW50cy50aW1lVmFsdWUudGV4dENvbnRlbnQgPSBmb3JtYXRUaW1lKGVsYXBzZWRTZWNvbmRzKTsKICAgIGVsZW1lbnRzLnByb2dyZXNzQmFyLnN0eWxlLndpZHRoID0gU3RyaW5nKHByb2dyZXNzKSArICIlIjsKICAgIGVsZW1lbnRzLmNvYWNoVGV4dC50ZXh0Q29udGVudCA9IGN1cnJlbnRMZXZlbC5jb2FjaDsKICAgIGVsZW1lbnRzLm1pc3Npb25MYWJlbC50ZXh0Q29udGVudCA9IGN1cnJlbnRMZXZlbC5sYWJlbDsKICAgIGVsZW1lbnRzLm1pc3Npb25UZXh0LnRleHRDb250ZW50ID0gY3VycmVudExldmVsLm1pc3Npb247CiAgICBlbGVtZW50cy5wbGF5ZXJQaWVjZXMudGV4dENvbnRlbnQgPSBTdHJpbmcoY291bnRQaWVjZXMoU0lERV9QTEFZRVIpKTsKICAgIGVsZW1lbnRzLmJvdFBpZWNlcy50ZXh0Q29udGVudCA9IFN0cmluZyhjb3VudFBpZWNlcyhTSURFX0JPVCkpOwogICAgZWxlbWVudHMuY2FwdHVyZVZhbHVlLnRleHRDb250ZW50ID0gU3RyaW5nKGNhcHR1cmVzKTsKICB9CgogIGZ1bmN0aW9uIGdldExldmVsSW5kZXgoKSB7CiAgICBsZXQgaW5kZXggPSAwOwogICAgbGV2ZWxEYXRhLmZvckVhY2goKGxldmVsLCBsZXZlbEluZGV4KSA9PiB7CiAgICAgIGlmIChzY29yZSA+PSBsZXZlbC50aHJlc2hvbGQpIHsKICAgICAgICBpbmRleCA9IGxldmVsSW5kZXg7CiAgICAgIH0KICAgIH0pOwogICAgcmV0dXJuIGluZGV4OwogIH0KCiAgZnVuY3Rpb24gcGllY2VMYWJlbChwaWVjZSkgewogICAgaWYgKCFwaWVjZSkgewogICAgICByZXR1cm4gImxlZXIiOwogICAgfQogICAgY29uc3Qgb3duZXIgPSBwaWVjZS5zaWRlID09PSBTSURFX1BMQVlFUiA/ICJkZWluIiA6ICJnZWduZXJpc2NoZXIiOwogICAgcmV0dXJuIHBpZWNlLmtpbmcgPyBvd25lciArICIgRGFtZS1TdGVpbiIgOiBvd25lciArICIgU3RlaW4iOwogIH0KCiAgZnVuY3Rpb24gcmVuZGVyQm9hcmQoKSB7CiAgICB3aGlsZSAoZWxlbWVudHMuYm9hcmQuZmlyc3RDaGlsZCkgewogICAgICBlbGVtZW50cy5ib2FyZC5yZW1vdmVDaGlsZChlbGVtZW50cy5ib2FyZC5maXJzdENoaWxkKTsKICAgIH0KCiAgICBjb25zdCBsZWdhbFRhcmdldHMgPSBsZWdhbE1vdmVzRm9yU2VsZWN0ZWQubWFwKChtb3ZlKSA9PiBtb3ZlLnRvKTsKICAgIGNvbnN0IGNhcHR1cmVUYXJnZXRzID0gbGVnYWxNb3Zlc0ZvclNlbGVjdGVkCiAgICAgIC5maWx0ZXIoKG1vdmUpID0+IG1vdmUuY2FwdHVyZWQgIT09IG51bGwpCiAgICAgIC5tYXAoKG1vdmUpID0+IG1vdmUudG8pOwoKICAgIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8IEJPQVJEX1NJWkU7IHJvdyArPSAxKSB7CiAgICAgIGZvciAobGV0IGNvbCA9IDA7IGNvbCA8IEJPQVJEX1NJWkU7IGNvbCArPSAxKSB7CiAgICAgICAgY29uc3QgaW5kZXggPSBpbmRleEZyb21Sb3dDb2wocm93LCBjb2wpOwogICAgICAgIGNvbnN0IGRhcmsgPSBpc0Rhcmsocm93LCBjb2wpOwogICAgICAgIGNvbnN0IHNxdWFyZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoZGFyayA/ICJidXR0b24iIDogImRpdiIpOwogICAgICAgIHNxdWFyZS5jbGFzc05hbWUgPSBkYXJrID8gInNxdWFyZSBkYXJrIiA6ICJzcXVhcmUgbGlnaHQiOwogICAgICAgIHNxdWFyZS5zZXRBdHRyaWJ1dGUoInJvbGUiLCBkYXJrID8gImdyaWRjZWxsIiA6ICJwcmVzZW50YXRpb24iKTsKICAgICAgICBzcXVhcmUuZGF0YXNldC5pbmRleCA9IFN0cmluZyhpbmRleCk7CgogICAgICAgIGlmICghZGFyaykgewogICAgICAgICAgZWxlbWVudHMuYm9hcmQuYXBwZW5kQ2hpbGQoc3F1YXJlKTsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KCiAgICAgICAgc3F1YXJlLnR5cGUgPSAiYnV0dG9uIjsKICAgICAgICBzcXVhcmUuZGF0YXNldC5maWVsZCA9IGZpZWxkTmFtZShpbmRleCk7CiAgICAgICAgc3F1YXJlLnNldEF0dHJpYnV0ZSgiYXJpYS1sYWJlbCIsIGZpZWxkTmFtZShpbmRleCkgKyAiOiAiICsgcGllY2VMYWJlbChib2FyZFN0YXRlW2luZGV4XSkpOwogICAgICAgIHNxdWFyZS50YWJJbmRleCA9IGluZGV4ID09PSBrZXlib2FyZEZvY3VzSW5kZXggPyAwIDogLTE7CgogICAgICAgIGlmIChpbmRleCA9PT0gc2VsZWN0ZWRJbmRleCkgewogICAgICAgICAgc3F1YXJlLmNsYXNzTGlzdC5hZGQoInNlbGVjdGVkIik7CiAgICAgICAgfQogICAgICAgIGlmIChsZWdhbFRhcmdldHMuaW5jbHVkZXMoaW5kZXgpKSB7CiAgICAgICAgICBzcXVhcmUuY2xhc3NMaXN0LmFkZCgidmFsaWQiKTsKICAgICAgICB9CiAgICAgICAgaWYgKGNhcHR1cmVUYXJnZXRzLmluY2x1ZGVzKGluZGV4KSkgewogICAgICAgICAgc3F1YXJlLmNsYXNzTGlzdC5hZGQoImNhcHR1cmUtdGFyZ2V0Iik7CiAgICAgICAgfQogICAgICAgIGlmIChoaW50TW92ZSAmJiAoaGludE1vdmUuZnJvbSA9PT0gaW5kZXggfHwgaGludE1vdmUudG8gPT09IGluZGV4KSkgewogICAgICAgICAgc3F1YXJlLmNsYXNzTGlzdC5hZGQoImhpbnQiKTsKICAgICAgICB9CiAgICAgICAgaWYgKGxhc3RNb3ZlICYmIChsYXN0TW92ZS5mcm9tID09PSBpbmRleCB8fCBsYXN0TW92ZS50byA9PT0gaW5kZXgpKSB7CiAgICAgICAgICBzcXVhcmUuY2xhc3NMaXN0LmFkZCgibGFzdC1tb3ZlIik7CiAgICAgICAgfQoKICAgICAgICBjb25zdCBwaWVjZSA9IGJvYXJkU3RhdGVbaW5kZXhdOwogICAgICAgIGlmIChwaWVjZSkgewogICAgICAgICAgc3F1YXJlLmFwcGVuZENoaWxkKGNyZWF0ZVBpZWNlTm9kZShwaWVjZSkpOwogICAgICAgIH0KCiAgICAgICAgZWxlbWVudHMuYm9hcmQuYXBwZW5kQ2hpbGQoc3F1YXJlKTsKICAgICAgfQogICAgfQogIH0KCiAgZnVuY3Rpb24gY3JlYXRlUGllY2VOb2RlKHBpZWNlKSB7CiAgICBjb25zdCBub2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpOwogICAgbm9kZS5jbGFzc05hbWUgPSAicGllY2UgIiArIHBpZWNlLnNpZGUgKyAocGllY2Uua2luZyA/ICIga2luZyIgOiAiIik7CiAgICBjb25zdCBtYXJrID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpOwogICAgbWFyay5jbGFzc05hbWUgPSAicGllY2UtbWFyayI7CiAgICBtYXJrLnRleHRDb250ZW50ID0gcGllY2Uua2luZyA/ICJEIiA6ICIiOwogICAgbm9kZS5hcHBlbmRDaGlsZChtYXJrKTsKICAgIHJldHVybiBub2RlOwogIH0KCiAgZnVuY3Rpb24gc2VsZWN0UGllY2UoaW5kZXgpIHsKICAgIGNvbnN0IHBpZWNlID0gYm9hcmRTdGF0ZVtpbmRleF07CiAgICBpZiAoIXBpZWNlIHx8IHBpZWNlLnNpZGUgIT09IFNJREVfUExBWUVSKSB7CiAgICAgIHNldEZlZWRiYWNrKCJXw6RobGUgZWluZW4gZWlnZW5lbiBoZWxsZW4gU3RlaW4uIiwgImJhZCIpOwogICAgICByZXR1cm47CiAgICB9CgogICAgY29uc3QgYWxsTW92ZXMgPSBnZXRBbGxMZWdhbE1vdmVzKGJvYXJkU3RhdGUsIFNJREVfUExBWUVSLCBmb3JjZWRQaWVjZUluZGV4KTsKICAgIGNvbnN0IG1vdmVzID0gYWxsTW92ZXMuZmlsdGVyKChtb3ZlKSA9PiBtb3ZlLmZyb20gPT09IGluZGV4KTsKCiAgICBpZiAobW92ZXMubGVuZ3RoID09PSAwKSB7CiAgICAgIGlmIChhbGxNb3Zlcy5zb21lKChtb3ZlKSA9PiBtb3ZlLmNhcHR1cmVkICE9PSBudWxsKSkgewogICAgICAgIHNldEZlZWRiYWNrKCJTY2hsYWdwZmxpY2h0OiBFaW4gYW5kZXJlciBTdGVpbiBtdXNzIHNjaGxhZ2VuLiIsICJiYWQiKTsKICAgICAgfSBlbHNlIGlmIChmb3JjZWRQaWVjZUluZGV4ICE9PSBudWxsKSB7CiAgICAgICAgc2V0RmVlZGJhY2soIkRlciBNZWhyZmFjaHNjaGxhZyBtdXNzIG1pdCBkZW1zZWxiZW4gU3RlaW4gZm9ydGdlc2V0enQgd2VyZGVuLiIsICJiYWQiKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBzZXRGZWVkYmFjaygiRGllc2VyIFN0ZWluIGhhdCBnZXJhZGUga2VpbmVuIGxlZ2FsZW4gWnVnLiIsICJiYWQiKTsKICAgICAgfQogICAgICBzZWxlY3RlZEluZGV4ID0gbnVsbDsKICAgICAgbGVnYWxNb3Zlc0ZvclNlbGVjdGVkID0gW107CiAgICAgIHJlbmRlckJvYXJkKCk7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBzZWxlY3RlZEluZGV4ID0gaW5kZXg7CiAgICBsZWdhbE1vdmVzRm9yU2VsZWN0ZWQgPSBtb3ZlczsKICAgIGhpbnRNb3ZlID0gbnVsbDsKICAgIGNvbnN0IGNhcHR1cmVzSGVyZSA9IG1vdmVzLmZpbHRlcigobW92ZSkgPT4gbW92ZS5jYXB0dXJlZCAhPT0gbnVsbCkubGVuZ3RoOwogICAgaWYgKGNhcHR1cmVzSGVyZSA+IDApIHsKICAgICAgc2V0RmVlZGJhY2soIlNjaGxhZ3p1ZyBnZWZ1bmRlbjogV8OkaGxlIGVpbiBnb2xkZW4gbWFya2llcnRlcyBaaWVsZmVsZC4iLCAiZ29vZCIpOwogICAgfSBlbHNlIHsKICAgICAgc2V0RmVlZGJhY2soIlfDpGhsZSBlaW4gZ3LDvG5lcyBaaWVsZmVsZCBmw7xyIGRlaW5lbiBadWcuIiwgIiIpOwogICAgfQogICAgcmVuZGVyQm9hcmQoKTsKICB9CgogIGZ1bmN0aW9uIGhhbmRsZVNxdWFyZUFjdGlvbihpbmRleCkgewogICAgaWYgKGFjdGl2ZVNjcmVlbiAhPT0gInBsYXkiIHx8IGdhbWVGaW5pc2hlZCkgewogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoYWlUaGlua2luZyB8fCB0dXJuICE9PSBTSURFX1BMQVlFUikgewogICAgICBzZXRGZWVkYmFjaygiRGllIEtJIGRlbmt0IGdlcmFkZS4gRGFuYWNoIGJpc3QgZHUgd2llZGVyIGFtIFp1Zy4iLCAiIik7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBrZXlib2FyZEZvY3VzSW5kZXggPSBpbmRleDsKICAgIGNvbnN0IGNob3Nlbk1vdmUgPSBsZWdhbE1vdmVzRm9yU2VsZWN0ZWQuZmluZCgobW92ZSkgPT4gbW92ZS50byA9PT0gaW5kZXgpOwogICAgaWYgKHNlbGVjdGVkSW5kZXggIT09IG51bGwgJiYgY2hvc2VuTW92ZSkgewogICAgICBwbGF5UGxheWVyTW92ZShjaG9zZW5Nb3ZlKTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIGNvbnN0IHBpZWNlID0gYm9hcmRTdGF0ZVtpbmRleF07CiAgICBpZiAocGllY2UgJiYgcGllY2Uuc2lkZSA9PT0gU0lERV9QTEFZRVIpIHsKICAgICAgc2VsZWN0UGllY2UoaW5kZXgpOwogICAgICByZXR1cm47CiAgICB9CgogICAgY29uc3QgYWxsTW92ZXMgPSBnZXRBbGxMZWdhbE1vdmVzKGJvYXJkU3RhdGUsIFNJREVfUExBWUVSLCBmb3JjZWRQaWVjZUluZGV4KTsKICAgIGlmIChhbGxNb3Zlcy5zb21lKChtb3ZlKSA9PiBtb3ZlLmNhcHR1cmVkICE9PSBudWxsKSkgewogICAgICBzZXRGZWVkYmFjaygiU2NobGFncGZsaWNodDogV8OkaGxlIGVpbmVuIFN0ZWluLCBkZXIgc2NobGFnZW4ga2Fubi4iLCAiYmFkIik7CiAgICB9IGVsc2UgewogICAgICBzZXRGZWVkYmFjaygiV8OkaGxlIHp1ZXJzdCBlaW5lbiBlaWdlbmVuIFN0ZWluLiIsICJiYWQiKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIHBsYXlQbGF5ZXJNb3ZlKG1vdmUpIHsKICAgIGhpbnRNb3ZlID0gbnVsbDsKICAgIGNvbnN0IG91dGNvbWUgPSBhcHBseU1vdmVUb1N0YXRlKGJvYXJkU3RhdGUsIG1vdmUpOwogICAgbGFzdE1vdmUgPSB7IGZyb206IG1vdmUuZnJvbSwgdG86IG1vdmUudG8gfTsKICAgIHNlbGVjdGVkSW5kZXggPSBudWxsOwogICAgbGVnYWxNb3Zlc0ZvclNlbGVjdGVkID0gW107CiAgICBrZXlib2FyZEZvY3VzSW5kZXggPSBtb3ZlLnRvOwoKICAgIGlmIChtb3ZlLmNhcHR1cmVkICE9PSBudWxsKSB7CiAgICAgIGNhcHR1cmVzICs9IDE7CiAgICAgIHNjb3JlICs9IDI1OwogICAgfSBlbHNlIHsKICAgICAgc2NvcmUgKz0gNTsKICAgIH0KCiAgICBpZiAob3V0Y29tZS5wcm9tb3RlZCkgewogICAgICBzY29yZSArPSAzNTsKICAgICAgc2hvd1RvYXN0KCJEYW1lIGdlYmlsZGV0OiArMzUgUHVua3RlIik7CiAgICB9CgogICAgaWYgKG1vdmUuY2FwdHVyZWQgIT09IG51bGwgJiYgIW91dGNvbWUucHJvbW90ZWQpIHsKICAgICAgY29uc3QgZm9sbG93VXBzID0gZ2V0QWxsTGVnYWxNb3Zlcyhib2FyZFN0YXRlLCBTSURFX1BMQVlFUiwgbW92ZS50byk7CiAgICAgIGlmIChmb2xsb3dVcHMubGVuZ3RoID4gMCkgewogICAgICAgIGZvcmNlZFBpZWNlSW5kZXggPSBtb3ZlLnRvOwogICAgICAgIHNlbGVjdGVkSW5kZXggPSBtb3ZlLnRvOwogICAgICAgIGxlZ2FsTW92ZXNGb3JTZWxlY3RlZCA9IGZvbGxvd1VwczsKICAgICAgICBzZXRGZWVkYmFjaygiU2VociBndXQhIERlciBNZWhyZmFjaHNjaGxhZyBtdXNzIG1pdCBkZW1zZWxiZW4gU3RlaW4gd2VpdGVyZ2VoZW4uIiwgImdvb2QiKTsKICAgICAgICB1cGRhdGVIdWQoKTsKICAgICAgICByZW5kZXJCb2FyZCgpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgfQoKICAgIGZvcmNlZFBpZWNlSW5kZXggPSBudWxsOwogICAgdXBkYXRlSHVkKCk7CiAgICByZW5kZXJCb2FyZCgpOwoKICAgIGlmIChjaGVja0dhbWVFbmQoKSkgewogICAgICByZXR1cm47CiAgICB9CgogICAgdHVybiA9IFNJREVfQk9UOwogICAgdXBkYXRlSHVkKCk7CiAgICBzZXRGZWVkYmFjaygiRGllIEtJIGlzdCBhbSBadWcuIiwgIiIpOwogICAgYWlUaGlua2luZyA9IHRydWU7CiAgICBib3RUaW1lcklkID0gc2V0VGltZW91dChwbGF5Qm90VHVybiwgNTIwKTsKICB9CgogIGZ1bmN0aW9uIHBsYXlCb3RUdXJuKCkgewogICAgaWYgKGdhbWVGaW5pc2hlZCkgewogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCBsZWdhbCA9IGdldEFsbExlZ2FsTW92ZXMoYm9hcmRTdGF0ZSwgU0lERV9CT1QsIGZvcmNlZFBpZWNlSW5kZXgpOwogICAgaWYgKGxlZ2FsLmxlbmd0aCA9PT0gMCkgewogICAgICBmaW5pc2hHYW1lKHRydWUsICJEaWUgS0kgaGF0IGtlaW5lbiBsZWdhbGVuIFp1ZyBtZWhyLiBEdSBoYXN0IGRpZSBTdGVsbHVuZyBibG9ja2llcnQuIik7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBjb25zdCBtb3ZlID0gY2hvb3NlQm90TW92ZShsZWdhbCk7CiAgICBjb25zdCBvdXRjb21lID0gYXBwbHlNb3ZlVG9TdGF0ZShib2FyZFN0YXRlLCBtb3ZlKTsKICAgIGxhc3RNb3ZlID0geyBmcm9tOiBtb3ZlLmZyb20sIHRvOiBtb3ZlLnRvIH07CgogICAgaWYgKG1vdmUuY2FwdHVyZWQgIT09IG51bGwpIHsKICAgICAgc2V0RmVlZGJhY2soIkRpZSBLSSBzY2hsw6RndCBhdWYgIiArIGZpZWxkTmFtZShtb3ZlLnRvKSArICIuIFByw7xmZSBqZXR6dCBHZWdlbnNjaGzDpGdlLiIsICJiYWQiKTsKICAgIH0gZWxzZSB7CiAgICAgIHNldEZlZWRiYWNrKCJEaWUgS0kgemllaHQgbmFjaCAiICsgZmllbGROYW1lKG1vdmUudG8pICsgIi4gRHUgYmlzdCBnbGVpY2ggd2llZGVyIGRyYW4uIiwgIiIpOwogICAgfQoKICAgIGlmIChvdXRjb21lLnByb21vdGVkKSB7CiAgICAgIHNob3dUb2FzdCgiRGllIEtJIGhhdCBlaW5lIERhbWUgZXJyZWljaHQuIik7CiAgICB9CgogICAgdXBkYXRlSHVkKCk7CiAgICByZW5kZXJCb2FyZCgpOwoKICAgIGlmIChtb3ZlLmNhcHR1cmVkICE9PSBudWxsICYmICFvdXRjb21lLnByb21vdGVkKSB7CiAgICAgIGNvbnN0IGZvbGxvd1VwcyA9IGdldEFsbExlZ2FsTW92ZXMoYm9hcmRTdGF0ZSwgU0lERV9CT1QsIG1vdmUudG8pOwogICAgICBpZiAoZm9sbG93VXBzLmxlbmd0aCA+IDApIHsKICAgICAgICBmb3JjZWRQaWVjZUluZGV4ID0gbW92ZS50bzsKICAgICAgICBib3RUaW1lcklkID0gc2V0VGltZW91dChwbGF5Qm90VHVybiwgNTAwKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgIH0KCiAgICBmb3JjZWRQaWVjZUluZGV4ID0gbnVsbDsKICAgIGFpVGhpbmtpbmcgPSBmYWxzZTsKCiAgICBpZiAoY2hlY2tHYW1lRW5kKCkpIHsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIHR1cm4gPSBTSURFX1BMQVlFUjsKICAgIGNvbnN0IHBsYXllck1vdmVzID0gZ2V0QWxsTGVnYWxNb3Zlcyhib2FyZFN0YXRlLCBTSURFX1BMQVlFUiwgbnVsbCk7CiAgICBpZiAocGxheWVyTW92ZXMubGVuZ3RoID09PSAwKSB7CiAgICAgIGZpbmlzaEdhbWUoZmFsc2UsICJEdSBoYXN0IGtlaW5lbiBsZWdhbGVuIFp1ZyBtZWhyLiBEaWUgS0kgZ2V3aW5udCBkdXJjaCBCbG9ja2FkZS4iKTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIGNvbnN0IGNhcHR1cmVzUmVhZHkgPSBwbGF5ZXJNb3Zlcy5maWx0ZXIoKG5leHRNb3ZlKSA9PiBuZXh0TW92ZS5jYXB0dXJlZCAhPT0gbnVsbCkubGVuZ3RoOwogICAgaWYgKGNhcHR1cmVzUmVhZHkgPiAwKSB7CiAgICAgIHNldEZlZWRiYWNrKCJEdSBiaXN0IGFtIFp1Zy4gU2NobGFncGZsaWNodDogRXMgZ2lidCAiICsgU3RyaW5nKGNhcHR1cmVzUmVhZHkpICsgIiBtw7ZnbGljaGVuIFNjaGxhZ3p1Zy4iLCAiZ29vZCIpOwogICAgfSBlbHNlIHsKICAgICAgc2V0RmVlZGJhY2soIkR1IGJpc3QgYW0gWnVnLiBXw6RobGUgZWluZW4gaGVsbGVuIFN0ZWluLiIsICIiKTsKICAgIH0KICAgIHVwZGF0ZUh1ZCgpOwogICAgcmVuZGVyQm9hcmQoKTsKICB9CgogIGZ1bmN0aW9uIGNoZWNrR2FtZUVuZCgpIHsKICAgIGNvbnN0IHBsYXllckNvdW50ID0gY291bnRQaWVjZXMoU0lERV9QTEFZRVIpOwogICAgY29uc3QgYm90Q291bnQgPSBjb3VudFBpZWNlcyhTSURFX0JPVCk7CiAgICBpZiAoYm90Q291bnQgPT09IDApIHsKICAgICAgc2NvcmUgKz0gMTIwOwogICAgICB1cGRhdGVIdWQoKTsKICAgICAgZmluaXNoR2FtZSh0cnVlLCAiRHUgaGFzdCBhbGxlIEtJLVN0ZWluZSBnZXNjaGxhZ2VuLiIpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIGlmIChwbGF5ZXJDb3VudCA9PT0gMCkgewogICAgICBmaW5pc2hHYW1lKGZhbHNlLCAiRGllIEtJIGhhdCBhbGxlIGRlaW5lIFN0ZWluZSBnZXNjaGxhZ2VuLiIpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIGZ1bmN0aW9uIGZpbmlzaEdhbWUod29uLCByZWFzb24pIHsKICAgIGdhbWVGaW5pc2hlZCA9IHRydWU7CiAgICBhaVRoaW5raW5nID0gZmFsc2U7CiAgICBjbGVhclRpbWVycygpOwoKICAgIGNvbnN0IGxldmVsID0gZ2V0TGV2ZWxJbmRleCgpICsgMTsKICAgIGVsZW1lbnRzLnJlc3VsdFRpdGxlLnRleHRDb250ZW50ID0gd29uID8gIlNpZWchIiA6ICJQYXJ0aWUgdmVybG9yZW4iOwogICAgZWxlbWVudHMucmVzdWx0VGV4dC50ZXh0Q29udGVudCA9IHJlYXNvbiArICIgRW5kc3RhbmQ6ICIgKyBTdHJpbmcoc2NvcmUpICsgIiBQdW5rdGUgaW0gTW9kdXMgIiArIGRpZmZpY3VsdHlOYW1lc1tkaWZmaWN1bHR5XSArICIuIjsKICAgIGVsZW1lbnRzLmZpbmFsU2NvcmUudGV4dENvbnRlbnQgPSBTdHJpbmcoc2NvcmUpOwogICAgZWxlbWVudHMuZmluYWxUaW1lLnRleHRDb250ZW50ID0gZm9ybWF0VGltZShlbGFwc2VkU2Vjb25kcyk7CiAgICBlbGVtZW50cy5maW5hbExldmVsLnRleHRDb250ZW50ID0gU3RyaW5nKGxldmVsKTsKICAgIHNob3dTY3JlZW4oImVuZCIpOwogIH0KCiAgZnVuY3Rpb24gY2hvb3NlQm90TW92ZShsZWdhbCkgewogICAgaWYgKGRpZmZpY3VsdHkgPT09ICJlYXN5IikgewogICAgICBjb25zdCBjYXB0dXJlc09ubHkgPSBsZWdhbC5maWx0ZXIoKG1vdmUpID0+IG1vdmUuY2FwdHVyZWQgIT09IG51bGwpOwogICAgICBjb25zdCBwb29sID0gY2FwdHVyZXNPbmx5Lmxlbmd0aCA+IDAgPyBjYXB0dXJlc09ubHkgOiBsZWdhbDsKICAgICAgcmV0dXJuIHBvb2xbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogcG9vbC5sZW5ndGgpXTsKICAgIH0KCiAgICBpZiAoZGlmZmljdWx0eSA9PT0gImJhbGFuY2VkIikgewogICAgICByZXR1cm4gYmVzdE1vdmVCeUhldXJpc3RpYyhsZWdhbCk7CiAgICB9CgogICAgcmV0dXJuIGJlc3RNb3ZlQnlTZWFyY2gobGVnYWwpOwogIH0KCiAgZnVuY3Rpb24gYmVzdE1vdmVCeUhldXJpc3RpYyhsZWdhbCkgewogICAgbGV0IGJlc3QgPSBsZWdhbFswXTsKICAgIGxldCBiZXN0U2NvcmUgPSAtSW5maW5pdHk7CiAgICBsZWdhbC5mb3JFYWNoKChtb3ZlKSA9PiB7CiAgICAgIGNvbnN0IHZhbHVlID0gc2NvcmVCb3RNb3ZlKGJvYXJkU3RhdGUsIG1vdmUpOwogICAgICBpZiAodmFsdWUgPiBiZXN0U2NvcmUpIHsKICAgICAgICBiZXN0U2NvcmUgPSB2YWx1ZTsKICAgICAgICBiZXN0ID0gbW92ZTsKICAgICAgfQogICAgfSk7CiAgICByZXR1cm4gYmVzdDsKICB9CgogIGZ1bmN0aW9uIHNjb3JlQm90TW92ZShzdGF0ZSwgbW92ZSkgewogICAgY29uc3QgdGVzdEJvYXJkID0gY2xvbmVCb2FyZChzdGF0ZSk7CiAgICBjb25zdCBvdXRjb21lID0gYXBwbHlNb3ZlVG9TdGF0ZSh0ZXN0Qm9hcmQsIG1vdmUpOwogICAgbGV0IHZhbHVlID0gZXZhbHVhdGVCb2FyZCh0ZXN0Qm9hcmQpOwoKICAgIGlmIChtb3ZlLmNhcHR1cmVkICE9PSBudWxsKSB7CiAgICAgIHZhbHVlICs9IDgwOwogICAgfQogICAgaWYgKG91dGNvbWUucHJvbW90ZWQpIHsKICAgICAgdmFsdWUgKz0gMTIwOwogICAgfQoKICAgIGNvbnN0IHRhcmdldFJvdyA9IHJvd09mKG1vdmUudG8pOwogICAgY29uc3QgdGFyZ2V0Q29sID0gY29sT2YobW92ZS50byk7CiAgICBjb25zdCBjZW50ZXJEaXN0YW5jZSA9IE1hdGguYWJzKDMuNSAtIHRhcmdldFJvdykgKyBNYXRoLmFicygzLjUgLSB0YXJnZXRDb2wpOwogICAgdmFsdWUgKz0gMTIgLSBjZW50ZXJEaXN0YW5jZSAqIDM7CgogICAgY29uc3QgcGxheWVyUmVwbGllcyA9IGdldEFsbExlZ2FsTW92ZXModGVzdEJvYXJkLCBTSURFX1BMQVlFUiwgbnVsbCk7CiAgICBjb25zdCBkYW5nZXJvdXNSZXBsaWVzID0gcGxheWVyUmVwbGllcy5maWx0ZXIoKHJlcGx5KSA9PiByZXBseS5jYXB0dXJlZCAhPT0gbnVsbCkubGVuZ3RoOwogICAgdmFsdWUgLT0gZGFuZ2Vyb3VzUmVwbGllcyAqIDM0OwoKICAgIGNvbnN0IGZvbGxvd1VwcyA9IG1vdmUuY2FwdHVyZWQgIT09IG51bGwgJiYgIW91dGNvbWUucHJvbW90ZWQKICAgICAgPyBnZXRBbGxMZWdhbE1vdmVzKHRlc3RCb2FyZCwgU0lERV9CT1QsIG1vdmUudG8pLmxlbmd0aAogICAgICA6IDA7CiAgICB2YWx1ZSArPSBmb2xsb3dVcHMgKiA0NTsKCiAgICByZXR1cm4gdmFsdWU7CiAgfQoKICBmdW5jdGlvbiBiZXN0TW92ZUJ5U2VhcmNoKGxlZ2FsKSB7CiAgICBsZXQgYmVzdCA9IGxlZ2FsWzBdOwogICAgbGV0IGJlc3RTY29yZSA9IC1JbmZpbml0eTsKICAgIGxlZ2FsLmZvckVhY2goKG1vdmUpID0+IHsKICAgICAgY29uc3QgdGVzdEJvYXJkID0gY2xvbmVCb2FyZChib2FyZFN0YXRlKTsKICAgICAgY29uc3Qgb3V0Y29tZSA9IGFwcGx5TW92ZVRvU3RhdGUodGVzdEJvYXJkLCBtb3ZlKTsKICAgICAgbGV0IHZhbHVlOwogICAgICBjb25zdCBmb2xsb3dVcHMgPSBtb3ZlLmNhcHR1cmVkICE9PSBudWxsICYmICFvdXRjb21lLnByb21vdGVkCiAgICAgICAgPyBnZXRBbGxMZWdhbE1vdmVzKHRlc3RCb2FyZCwgU0lERV9CT1QsIG1vdmUudG8pCiAgICAgICAgOiBbXTsKICAgICAgaWYgKGZvbGxvd1Vwcy5sZW5ndGggPiAwKSB7CiAgICAgICAgdmFsdWUgPSBtaW5pbWF4KHRlc3RCb2FyZCwgU0lERV9CT1QsIG1vdmUudG8sIDMsIC1JbmZpbml0eSwgSW5maW5pdHkpOwogICAgICB9IGVsc2UgewogICAgICAgIHZhbHVlID0gbWluaW1heCh0ZXN0Qm9hcmQsIFNJREVfUExBWUVSLCBudWxsLCAzLCAtSW5maW5pdHksIEluZmluaXR5KTsKICAgICAgfQogICAgICB2YWx1ZSArPSBzY29yZUJvdE1vdmUoYm9hcmRTdGF0ZSwgbW92ZSkgKiAwLjA4OwogICAgICBpZiAodmFsdWUgPiBiZXN0U2NvcmUpIHsKICAgICAgICBiZXN0U2NvcmUgPSB2YWx1ZTsKICAgICAgICBiZXN0ID0gbW92ZTsKICAgICAgfQogICAgfSk7CiAgICByZXR1cm4gYmVzdDsKICB9CgogIGZ1bmN0aW9uIG1pbmltYXgoc3RhdGUsIHNpZGUsIG9ubHlJbmRleCwgZGVwdGgsIGFscGhhLCBiZXRhKSB7CiAgICBjb25zdCBsZWdhbCA9IGdldEFsbExlZ2FsTW92ZXMoc3RhdGUsIHNpZGUsIG9ubHlJbmRleCk7CiAgICBpZiAobGVnYWwubGVuZ3RoID09PSAwKSB7CiAgICAgIGlmIChvbmx5SW5kZXggIT09IG51bGwpIHsKICAgICAgICByZXR1cm4gZXZhbHVhdGVCb2FyZChzdGF0ZSk7CiAgICAgIH0KICAgICAgcmV0dXJuIHNpZGUgPT09IFNJREVfQk9UID8gLTEwMDAwIC0gZGVwdGggOiAxMDAwMCArIGRlcHRoOwogICAgfQoKICAgIGlmIChkZXB0aCA8PSAwKSB7CiAgICAgIHJldHVybiBldmFsdWF0ZUJvYXJkKHN0YXRlKTsKICAgIH0KCiAgICBpZiAoc2lkZSA9PT0gU0lERV9CT1QpIHsKICAgICAgbGV0IGJlc3QgPSAtSW5maW5pdHk7CiAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBsZWdhbC5sZW5ndGg7IGluZGV4ICs9IDEpIHsKICAgICAgICBjb25zdCBtb3ZlID0gbGVnYWxbaW5kZXhdOwogICAgICAgIGNvbnN0IG5leHRCb2FyZCA9IGNsb25lQm9hcmQoc3RhdGUpOwogICAgICAgIGNvbnN0IG91dGNvbWUgPSBhcHBseU1vdmVUb1N0YXRlKG5leHRCb2FyZCwgbW92ZSk7CiAgICAgICAgY29uc3QgZm9sbG93VXBzID0gbW92ZS5jYXB0dXJlZCAhPT0gbnVsbCAmJiAhb3V0Y29tZS5wcm9tb3RlZAogICAgICAgICAgPyBnZXRBbGxMZWdhbE1vdmVzKG5leHRCb2FyZCwgU0lERV9CT1QsIG1vdmUudG8pCiAgICAgICAgICA6IFtdOwogICAgICAgIGNvbnN0IHZhbHVlID0gZm9sbG93VXBzLmxlbmd0aCA+IDAKICAgICAgICAgID8gbWluaW1heChuZXh0Qm9hcmQsIFNJREVfQk9ULCBtb3ZlLnRvLCBkZXB0aCwgYWxwaGEsIGJldGEpCiAgICAgICAgICA6IG1pbmltYXgobmV4dEJvYXJkLCBTSURFX1BMQVlFUiwgbnVsbCwgZGVwdGggLSAxLCBhbHBoYSwgYmV0YSk7CiAgICAgICAgYmVzdCA9IE1hdGgubWF4KGJlc3QsIHZhbHVlKTsKICAgICAgICBhbHBoYSA9IE1hdGgubWF4KGFscGhhLCBiZXN0KTsKICAgICAgICBpZiAoYmV0YSA8PSBhbHBoYSkgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBiZXN0OwogICAgfQoKICAgIGxldCBiZXN0ID0gSW5maW5pdHk7CiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgbGVnYWwubGVuZ3RoOyBpbmRleCArPSAxKSB7CiAgICAgIGNvbnN0IG1vdmUgPSBsZWdhbFtpbmRleF07CiAgICAgIGNvbnN0IG5leHRCb2FyZCA9IGNsb25lQm9hcmQoc3RhdGUpOwogICAgICBjb25zdCBvdXRjb21lID0gYXBwbHlNb3ZlVG9TdGF0ZShuZXh0Qm9hcmQsIG1vdmUpOwogICAgICBjb25zdCBmb2xsb3dVcHMgPSBtb3ZlLmNhcHR1cmVkICE9PSBudWxsICYmICFvdXRjb21lLnByb21vdGVkCiAgICAgICAgPyBnZXRBbGxMZWdhbE1vdmVzKG5leHRCb2FyZCwgU0lERV9QTEFZRVIsIG1vdmUudG8pCiAgICAgICAgOiBbXTsKICAgICAgY29uc3QgdmFsdWUgPSBmb2xsb3dVcHMubGVuZ3RoID4gMAogICAgICAgID8gbWluaW1heChuZXh0Qm9hcmQsIFNJREVfUExBWUVSLCBtb3ZlLnRvLCBkZXB0aCwgYWxwaGEsIGJldGEpCiAgICAgICAgOiBtaW5pbWF4KG5leHRCb2FyZCwgU0lERV9CT1QsIG51bGwsIGRlcHRoIC0gMSwgYWxwaGEsIGJldGEpOwogICAgICBiZXN0ID0gTWF0aC5taW4oYmVzdCwgdmFsdWUpOwogICAgICBiZXRhID0gTWF0aC5taW4oYmV0YSwgYmVzdCk7CiAgICAgIGlmIChiZXRhIDw9IGFscGhhKSB7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBiZXN0OwogIH0KCiAgZnVuY3Rpb24gZXZhbHVhdGVCb2FyZChzdGF0ZSkgewogICAgbGV0IHZhbHVlID0gMDsKICAgIHN0YXRlLmZvckVhY2goKHBpZWNlLCBpbmRleCkgPT4gewogICAgICBpZiAoIXBpZWNlKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICBjb25zdCByb3cgPSByb3dPZihpbmRleCk7CiAgICAgIGNvbnN0IGNvbCA9IGNvbE9mKGluZGV4KTsKICAgICAgY29uc3QgbWF0ZXJpYWwgPSBwaWVjZS5raW5nID8gMTc1IDogMTAwOwogICAgICBjb25zdCBhZHZhbmNlID0gcGllY2Uuc2lkZSA9PT0gU0lERV9CT1QgPyByb3cgKiA1IDogKEJPQVJEX1NJWkUgLSAxIC0gcm93KSAqIDU7CiAgICAgIGNvbnN0IGNlbnRlciA9IDE0IC0gKE1hdGguYWJzKDMuNSAtIHJvdykgKyBNYXRoLmFicygzLjUgLSBjb2wpKSAqIDM7CiAgICAgIGNvbnN0IGVkZ2VQZW5hbHR5ID0gY29sID09PSAwIHx8IGNvbCA9PT0gQk9BUkRfU0laRSAtIDEgPyAtNSA6IDA7CiAgICAgIGNvbnN0IHBpZWNlVmFsdWUgPSBtYXRlcmlhbCArIGFkdmFuY2UgKyBjZW50ZXIgKyBlZGdlUGVuYWx0eTsKCiAgICAgIHZhbHVlICs9IHBpZWNlLnNpZGUgPT09IFNJREVfQk9UID8gcGllY2VWYWx1ZSA6IC1waWVjZVZhbHVlOwogICAgfSk7CgogICAgdmFsdWUgKz0gZ2V0QWxsTGVnYWxNb3ZlcyhzdGF0ZSwgU0lERV9CT1QsIG51bGwpLmxlbmd0aCAqIDM7CiAgICB2YWx1ZSAtPSBnZXRBbGxMZWdhbE1vdmVzKHN0YXRlLCBTSURFX1BMQVlFUiwgbnVsbCkubGVuZ3RoICogMzsKICAgIHZhbHVlICs9IGNvdW50S2luZ3Moc3RhdGUsIFNJREVfQk9UKSAqIDIwOwogICAgdmFsdWUgLT0gY291bnRLaW5ncyhzdGF0ZSwgU0lERV9QTEFZRVIpICogMjA7CgogICAgcmV0dXJuIHZhbHVlOwogIH0KCiAgZnVuY3Rpb24gcmVxdWVzdEhpbnQoKSB7CiAgICBpZiAoYWN0aXZlU2NyZWVuICE9PSAicGxheSIgfHwgZ2FtZUZpbmlzaGVkKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmICh0dXJuICE9PSBTSURFX1BMQVlFUiB8fCBhaVRoaW5raW5nKSB7CiAgICAgIHNob3dUb2FzdCgiVGlwcCB2ZXJmw7xnYmFyLCBzb2JhbGQgZHUgYW0gWnVnIGJpc3QuIik7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBjb25zdCBsZWdhbCA9IGdldEFsbExlZ2FsTW92ZXMoYm9hcmRTdGF0ZSwgU0lERV9QTEFZRVIsIGZvcmNlZFBpZWNlSW5kZXgpOwogICAgaWYgKGxlZ2FsLmxlbmd0aCA9PT0gMCkgewogICAgICBzaG93VG9hc3QoIkVzIGdpYnQgZ2VyYWRlIGtlaW5lbiBsZWdhbGVuIFp1Zy4iKTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIGxldCBiZXN0ID0gbGVnYWxbMF07CiAgICBsZXQgYmVzdFNjb3JlID0gLUluZmluaXR5OwogICAgbGVnYWwuZm9yRWFjaCgobW92ZSkgPT4gewogICAgICBjb25zdCB0ZXN0Qm9hcmQgPSBjbG9uZUJvYXJkKGJvYXJkU3RhdGUpOwogICAgICBjb25zdCBvdXRjb21lID0gYXBwbHlNb3ZlVG9TdGF0ZSh0ZXN0Qm9hcmQsIG1vdmUpOwogICAgICBsZXQgdmFsdWUgPSAtZXZhbHVhdGVCb2FyZCh0ZXN0Qm9hcmQpOwogICAgICBpZiAobW92ZS5jYXB0dXJlZCAhPT0gbnVsbCkgewogICAgICAgIHZhbHVlICs9IDcwOwogICAgICB9CiAgICAgIGlmIChvdXRjb21lLnByb21vdGVkKSB7CiAgICAgICAgdmFsdWUgKz0gMTAwOwogICAgICB9CiAgICAgIGNvbnN0IHJlcGx5Q2FwdHVyZXMgPSBnZXRBbGxMZWdhbE1vdmVzKHRlc3RCb2FyZCwgU0lERV9CT1QsIG51bGwpLmZpbHRlcigocmVwbHkpID0+IHJlcGx5LmNhcHR1cmVkICE9PSBudWxsKS5sZW5ndGg7CiAgICAgIHZhbHVlIC09IHJlcGx5Q2FwdHVyZXMgKiAzMjsKICAgICAgaWYgKHZhbHVlID4gYmVzdFNjb3JlKSB7CiAgICAgICAgYmVzdFNjb3JlID0gdmFsdWU7CiAgICAgICAgYmVzdCA9IG1vdmU7CiAgICAgIH0KICAgIH0pOwoKICAgIGhpbnRNb3ZlID0gYmVzdDsKICAgIHNlbGVjdGVkSW5kZXggPSBiZXN0LmZyb207CiAgICBsZWdhbE1vdmVzRm9yU2VsZWN0ZWQgPSBsZWdhbC5maWx0ZXIoKG1vdmUpID0+IG1vdmUuZnJvbSA9PT0gYmVzdC5mcm9tKTsKICAgIHNldEZlZWRiYWNrKCJUaXBwOiBTcGllbGUgdm9uICIgKyBmaWVsZE5hbWUoYmVzdC5mcm9tKSArICIgbmFjaCAiICsgZmllbGROYW1lKGJlc3QudG8pICsgIi4iLCAiZ29vZCIpOwogICAgcmVuZGVyQm9hcmQoKTsKICB9CgogIGZ1bmN0aW9uIHRvZ2dsZVJ1bGVzUGFuZWwoKSB7CiAgICBjb25zdCB2aXNpYmxlID0gZWxlbWVudHMucnVsZXNQYW5lbC5jbGFzc0xpc3QudG9nZ2xlKCJydWxlcy12aXNpYmxlIik7CiAgICBlbGVtZW50cy5ydWxlc0J1dHRvbi5zZXRBdHRyaWJ1dGUoImFyaWEtcHJlc3NlZCIsIHZpc2libGUgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKICB9CgogIGZ1bmN0aW9uIHRvZ2dsZUZ1bGxzY3JlZW4oKSB7CiAgICBjb25zdCBkb2MgPSBkb2N1bWVudDsKICAgIGNvbnN0IHJvb3ROb2RlID0gZG9jLmRvY3VtZW50RWxlbWVudDsKCiAgICBpZiAoZG9jLmZ1bGxzY3JlZW5FbGVtZW50ICYmIGRvYy5leGl0RnVsbHNjcmVlbikgewogICAgICBkb2MuZXhpdEZ1bGxzY3JlZW4oKS5jYXRjaCgoKSA9PiB7CiAgICAgICAgYWN0aXZhdGVGdWxsc2NyZWVuRmFsbGJhY2soKTsKICAgICAgfSk7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBpZiAocm9vdE5vZGUucmVxdWVzdEZ1bGxzY3JlZW4pIHsKICAgICAgcm9vdE5vZGUucmVxdWVzdEZ1bGxzY3JlZW4oKS5jYXRjaCgoKSA9PiB7CiAgICAgICAgYWN0aXZhdGVGdWxsc2NyZWVuRmFsbGJhY2soKTsKICAgICAgfSk7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBhY3RpdmF0ZUZ1bGxzY3JlZW5GYWxsYmFjaygpOwogIH0KCiAgZnVuY3Rpb24gYWN0aXZhdGVGdWxsc2NyZWVuRmFsbGJhY2soKSB7CiAgICBlbGVtZW50cy5yb290LmNsYXNzTGlzdC50b2dnbGUoImZ1bGxzY3JlZW4tZmFsbGJhY2siLCB0cnVlKTsKICAgIHNob3dUb2FzdCgiVm9sbGJpbGQtQW5zaWNodCB3dXJkZSBpbSBTcGllbGJlcmVpY2ggYWt0aXZpZXJ0LiIpOwogIH0KCiAgZnVuY3Rpb24gdXBkYXRlRnVsbHNjcmVlbkJ1dHRvbnMoKSB7CiAgICBjb25zdCBsYWJlbCA9IGRvY3VtZW50LmZ1bGxzY3JlZW5FbGVtZW50IHx8IGVsZW1lbnRzLnJvb3QuY2xhc3NMaXN0LmNvbnRhaW5zKCJmdWxsc2NyZWVuLWZhbGxiYWNrIikKICAgICAgPyAiVm9sbGJpbGQgYW4iCiAgICAgIDogIlZvbGxiaWxkIjsKICAgIGVsZW1lbnRzLmZ1bGxzY3JlZW5CdXR0b24udGV4dENvbnRlbnQgPSBsYWJlbDsKICAgIGVsZW1lbnRzLnN0YXJ0RnVsbHNjcmVlbkJ1dHRvbi50ZXh0Q29udGVudCA9IGxhYmVsOwogIH0KCiAgZnVuY3Rpb24gc2V0RGlmZmljdWx0eShuZXh0RGlmZmljdWx0eSkgewogICAgZGlmZmljdWx0eSA9IG5leHREaWZmaWN1bHR5OwogICAgY29uc3QgYnV0dG9ucyA9IGVsZW1lbnRzLmRpZmZpY3VsdHlPcHRpb25zLnF1ZXJ5U2VsZWN0b3JBbGwoIltkYXRhLWRpZmZpY3VsdHldIik7CiAgICBidXR0b25zLmZvckVhY2goKGJ1dHRvbikgPT4gewogICAgICBjb25zdCBhY3RpdmUgPSBidXR0b24uZGF0YXNldC5kaWZmaWN1bHR5ID09PSBkaWZmaWN1bHR5OwogICAgICBidXR0b24uY2xhc3NMaXN0LnRvZ2dsZSgiY2hvaWNlLWFjdGl2ZSIsIGFjdGl2ZSk7CiAgICAgIGJ1dHRvbi5zZXRBdHRyaWJ1dGUoImFyaWEtcHJlc3NlZCIsIGFjdGl2ZSA/ICJ0cnVlIiA6ICJmYWxzZSIpOwogICAgfSk7CiAgfQoKICBmdW5jdGlvbiBoYW5kbGVCb2FyZENsaWNrKGV2ZW50KSB7CiAgICBjb25zdCBzcXVhcmUgPSBldmVudC50YXJnZXQuY2xvc2VzdCgiLnNxdWFyZS5kYXJrIik7CiAgICBpZiAoIXNxdWFyZSB8fCAhZWxlbWVudHMuYm9hcmQuY29udGFpbnMoc3F1YXJlKSkgewogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCBpbmRleCA9IE51bWJlcihzcXVhcmUuZGF0YXNldC5pbmRleCk7CiAgICBoYW5kbGVTcXVhcmVBY3Rpb24oaW5kZXgpOwogIH0KCiAgZnVuY3Rpb24gaGFuZGxlQm9hcmRLZXkoZXZlbnQpIHsKICAgIGNvbnN0IGN1cnJlbnQgPSBldmVudC50YXJnZXQuY2xvc2VzdCgiLnNxdWFyZS5kYXJrIik7CiAgICBpZiAoIWN1cnJlbnQpIHsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIGNvbnN0IGluZGV4ID0gTnVtYmVyKGN1cnJlbnQuZGF0YXNldC5pbmRleCk7CiAgICBjb25zdCBrZXkgPSBldmVudC5rZXk7CgogICAgaWYgKGtleSA9PT0gIkVudGVyIiB8fCBrZXkgPT09ICIgIikgewogICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBoYW5kbGVTcXVhcmVBY3Rpb24oaW5kZXgpOwogICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKGtleSA9PT0gIkFycm93VXAiIHx8IGtleSA9PT0gIkFycm93RG93biIgfHwga2V5ID09PSAiQXJyb3dMZWZ0IiB8fCBrZXkgPT09ICJBcnJvd1JpZ2h0IikgewogICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBjb25zdCBuZXh0SW5kZXggPSBuZXh0RGFya0luZGV4KGluZGV4LCBrZXkpOwogICAgICBmb2N1c1NxdWFyZShuZXh0SW5kZXgpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gbmV4dERhcmtJbmRleChpbmRleCwga2V5KSB7CiAgICBsZXQgcm93ID0gcm93T2YoaW5kZXgpOwogICAgbGV0IGNvbCA9IGNvbE9mKGluZGV4KTsKCiAgICBpZiAoa2V5ID09PSAiQXJyb3dVcCIpIHsKICAgICAgcm93IC09IDE7CiAgICAgIGNvbCArPSBpc0Rhcmsocm93LCBjb2wpID8gMCA6IDE7CiAgICB9IGVsc2UgaWYgKGtleSA9PT0gIkFycm93RG93biIpIHsKICAgICAgcm93ICs9IDE7CiAgICAgIGNvbCArPSBpc0Rhcmsocm93LCBjb2wpID8gMCA6IDE7CiAgICB9IGVsc2UgaWYgKGtleSA9PT0gIkFycm93TGVmdCIpIHsKICAgICAgY29sIC09IDI7CiAgICB9IGVsc2UgaWYgKGtleSA9PT0gIkFycm93UmlnaHQiKSB7CiAgICAgIGNvbCArPSAyOwogICAgfQoKICAgIHJvdyA9IE1hdGgubWF4KDAsIE1hdGgubWluKEJPQVJEX1NJWkUgLSAxLCByb3cpKTsKICAgIGNvbCA9IE1hdGgubWF4KDAsIE1hdGgubWluKEJPQVJEX1NJWkUgLSAxLCBjb2wpKTsKCiAgICBpZiAoIWlzRGFyayhyb3csIGNvbCkpIHsKICAgICAgaWYgKGNvbCA8IEJPQVJEX1NJWkUgLSAxKSB7CiAgICAgICAgY29sICs9IDE7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY29sIC09IDE7CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gaW5kZXhGcm9tUm93Q29sKHJvdywgY29sKTsKICB9CgogIGZ1bmN0aW9uIGZvY3VzU3F1YXJlKGluZGV4KSB7CiAgICBrZXlib2FyZEZvY3VzSW5kZXggPSBpbmRleDsKICAgIGNvbnN0IHNxdWFyZSA9IGVsZW1lbnRzLmJvYXJkLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWluZGV4PSInICsgU3RyaW5nKGluZGV4KSArICciXScpOwogICAgaWYgKHNxdWFyZSkgewogICAgICBzcXVhcmUudGFiSW5kZXggPSAwOwogICAgICBzcXVhcmUuZm9jdXMoKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGhhbmRsZUdsb2JhbEtleXMoZXZlbnQpIHsKICAgIGlmIChhY3RpdmVTY3JlZW4gPT09ICJzdGFydCIpIHsKICAgICAgaWYgKGV2ZW50LmtleSA9PT0gIkVudGVyIikgewogICAgICAgIHN0YXJ0R2FtZShmYWxzZSk7CiAgICAgIH0KICAgICAgcmV0dXJuOwogICAgfQoKICAgIGlmIChhY3RpdmVTY3JlZW4gIT09ICJwbGF5IikgewogICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKGV2ZW50LmtleSA9PT0gImgiIHx8IGV2ZW50LmtleSA9PT0gIkgiKSB7CiAgICAgIHJlcXVlc3RIaW50KCk7CiAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gIm4iIHx8IGV2ZW50LmtleSA9PT0gIk4iKSB7CiAgICAgIHJlc2V0R2FtZSgpOwogICAgICBzaG93VG9hc3QoIk5ldWUgUGFydGllIGdlc3RhcnRldC4iKTsKICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSAiZiIgfHwgZXZlbnQua2V5ID09PSAiRiIpIHsKICAgICAgdG9nZ2xlRnVsbHNjcmVlbigpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gaW5pdEV2ZW50cygpIHsKICAgIGVsZW1lbnRzLnN0YXJ0R2FtZUJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsICgpID0+IHN0YXJ0R2FtZShmYWxzZSkpOwogICAgZWxlbWVudHMudHJhaW5pbmdHYW1lQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgKCkgPT4gc3RhcnRHYW1lKHRydWUpKTsKICAgIGVsZW1lbnRzLnN0YXJ0RnVsbHNjcmVlbkJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIHRvZ2dsZUZ1bGxzY3JlZW4pOwogICAgZWxlbWVudHMuZnVsbHNjcmVlbkJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIHRvZ2dsZUZ1bGxzY3JlZW4pOwogICAgZWxlbWVudHMucmVzZXRCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCAoKSA9PiB7CiAgICAgIHJlc2V0R2FtZSgpOwogICAgICBzaG93VG9hc3QoIk5ldWUgUGFydGllIGdlc3RhcnRldC4iKTsKICAgIH0pOwogICAgZWxlbWVudHMubWVudUJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIHJldHVyblRvTWVudSk7CiAgICBlbGVtZW50cy5oaW50QnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgcmVxdWVzdEhpbnQpOwogICAgZWxlbWVudHMucnVsZXNCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCB0b2dnbGVSdWxlc1BhbmVsKTsKICAgIGVsZW1lbnRzLnBsYXlBZ2FpbkJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsICgpID0+IHsKICAgICAgc2hvd1NjcmVlbigicGxheSIpOwogICAgICByZXNldEdhbWUoKTsKICAgIH0pOwogICAgZWxlbWVudHMuZW5kTWVudUJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIHJldHVyblRvTWVudSk7CgogICAgZWxlbWVudHMuZGlmZmljdWx0eU9wdGlvbnMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCAoZXZlbnQpID0+IHsKICAgICAgY29uc3QgYnV0dG9uID0gZXZlbnQudGFyZ2V0LmNsb3Nlc3QoIltkYXRhLWRpZmZpY3VsdHldIik7CiAgICAgIGlmICghYnV0dG9uKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHNldERpZmZpY3VsdHkoYnV0dG9uLmRhdGFzZXQuZGlmZmljdWx0eSk7CiAgICB9KTsKCiAgICBlbGVtZW50cy5ib2FyZC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGhhbmRsZUJvYXJkQ2xpY2spOwogICAgZWxlbWVudHMuYm9hcmQuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsIGhhbmRsZUJvYXJkS2V5KTsKICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLCBoYW5kbGVHbG9iYWxLZXlzKTsKICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImZ1bGxzY3JlZW5jaGFuZ2UiLCB1cGRhdGVGdWxsc2NyZWVuQnV0dG9ucyk7CiAgfQoKICBmdW5jdGlvbiBpbml0KCkgewogICAgaW5pdEV2ZW50cygpOwogICAgc2V0RGlmZmljdWx0eShkaWZmaWN1bHR5KTsKICAgIGJvYXJkU3RhdGUgPSBzZXR1cEJvYXJkKCk7CiAgICB1cGRhdGVGdWxsc2NyZWVuQnV0dG9ucygpOwogICAgdXBkYXRlSHVkKCk7CiAgICByZW5kZXJCb2FyZCgpOwogIH0KCiAgaW5pdCgpOwp9KSgpOwoKPC9zY3JpcHQ+CjwvYm9keT4KPC9odG1sPg== | PCFkb2N0eXBlIGh0bWw+CjxodG1sIGxhbmc9ImRlIj4KPGhlYWQ+CiAgPG1ldGEgY2hhcnNldD0idXRmLTgiPgogIDxtZXRhIG5hbWU9InZpZXdwb3J0IiBjb250ZW50PSJ3aWR0aD1kZXZpY2Utd2lkdGgsIGluaXRpYWwtc2NhbGU9MSwgdmlld3BvcnQtZml0PWNvdmVyIj4KICA8bWV0YSBuYW1lPSJ0aGVtZS1jb2xvciIgY29udGVudD0iIzE0MTgyNSI+CiAgPHRpdGxlPkRhbWUgTWVpc3RlcnNjaHVsZTwvdGl0bGU+CiAgCjxzdHlsZT4KOnJvb3QgewogIC0tYmc6ICMxMTE1MjE7CiAgLS1iZy1zb2Z0OiAjMTgxZTJlOwogIC0tcGFuZWw6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOSk7CiAgLS1wYW5lbC1zdHJvbmc6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNSk7CiAgLS10ZXh0OiAjZjhmYmZmOwogIC0tbXV0ZWQ6ICNiYWM0ZDY7CiAgLS1nb2xkOiAjZjJjMjYwOwogIC0tZ29sZC1zb2Z0OiByZ2JhKDI0MiwgMTk0LCA5NiwgMC4xOCk7CiAgLS1jeWFuOiAjNzZlMGQ2OwogIC0tZ29vZDogIzg0ZTA4YTsKICAtLWJhZDogI2ZmOGM4YzsKICAtLWRhcmstc3F1YXJlOiAjNWQzYzJiOwogIC0tbGlnaHQtc3F1YXJlOiAjZTlkN2I4OwogIC0tdmFsaWQ6ICM4Y2YwYTQ7CiAgLS1jYXB0dXJlOiAjZmZjZjcwOwogIC0tc2hhZG93OiAwIDI0cHggNzBweCByZ2JhKDAsIDAsIDAsIDAuMzYpOwogIC0tcmFkaXVzLXhsOiAzMHB4OwogIC0tcmFkaXVzLWxnOiAyMnB4OwogIC0tcmFkaXVzLW1kOiAxNnB4OwogIC0tdGFwLXNpemU6IDQ4cHg7CiAgZm9udC1mYW1pbHk6IHN5c3RlbS11aSwgLWFwcGxlLXN5c3RlbSwgQmxpbmtNYWNTeXN0ZW1Gb250LCAiU2Vnb2UgVUkiLCBzYW5zLXNlcmlmOwp9CgoqIHsKICBib3gtc2l6aW5nOiBib3JkZXItYm94Owp9CgpodG1sLApib2R5IHsKICBtaW4taGVpZ2h0OiAxMDAlOwogIG1hcmdpbjogMDsKICBiYWNrZ3JvdW5kOgogICAgcmFkaWFsLWdyYWRpZW50KGNpcmNsZSBhdCAxNSUgMTAlLCByZ2JhKDExOCwgMjI0LCAyMTQsIDAuMTgpLCB0cmFuc3BhcmVudCAyOHJlbSksCiAgICByYWRpYWwtZ3JhZGllbnQoY2lyY2xlIGF0IDkwJSA4JSwgcmdiYSgyNDIsIDE5NCwgOTYsIDAuMTQpLCB0cmFuc3BhcmVudCAyOHJlbSksCiAgICBsaW5lYXItZ3JhZGllbnQoMTQ1ZGVnLCAjMGMxMDE5IDAlLCAjMTcxYzJhIDQ4JSwgIzBmMTIxYyAxMDAlKTsKICBjb2xvcjogdmFyKC0tdGV4dCk7Cn0KCmJvZHkgewogIG1pbi1oZWlnaHQ6IDEwMHZoOwogIG1pbi1oZWlnaHQ6IDEwMGR2aDsKICBvdmVyZmxvdy14OiBoaWRkZW47Cn0KCmJ1dHRvbiB7CiAgZm9udDogaW5oZXJpdDsKfQoKYnV0dG9uOmZvY3VzLXZpc2libGUsClt0YWJpbmRleF06Zm9jdXMtdmlzaWJsZSB7CiAgb3V0bGluZTogNHB4IHNvbGlkIHZhcigtLWN5YW4pOwogIG91dGxpbmUtb2Zmc2V0OiA0cHg7Cn0KCi5hcHAtc2hlbGwgewogIG1pbi1oZWlnaHQ6IDEwMHZoOwogIG1pbi1oZWlnaHQ6IDEwMGR2aDsKICB3aWR0aDogMTAwJTsKICBkaXNwbGF5OiBncmlkOwogIHBsYWNlLWl0ZW1zOiBzdHJldGNoOwogIHBhZGRpbmc6IGNsYW1wKDEycHgsIDJ2dywgMjZweCk7Cn0KCi5hcHAtc2hlbGwuZnVsbHNjcmVlbi1mYWxsYmFjayB7CiAgcG9zaXRpb246IGZpeGVkOwogIGluc2V0OiAwOwogIHotaW5kZXg6IDIwOwogIG92ZXJmbG93OiBhdXRvOwp9Cgouc2NyZWVuIHsKICBkaXNwbGF5OiBub25lOwogIHdpZHRoOiBtaW4oMTQyMHB4LCAxMDAlKTsKICBtYXJnaW46IDAgYXV0bzsKfQoKLnNjcmVlbi1hY3RpdmUgewogIGRpc3BsYXk6IGJsb2NrOwp9Cgojc3RhcnQtc2NyZWVuIHsKICBtaW4taGVpZ2h0OiBjYWxjKDEwMHZoIC0gNTJweCk7CiAgbWluLWhlaWdodDogY2FsYygxMDBkdmggLSA1MnB4KTsKICBkaXNwbGF5OiBub25lOwogIGdyaWQtdGVtcGxhdGUtY29sdW1uczogbWlubWF4KDAsIDEuMjVmcikgbWlubWF4KDMyMHB4LCAwLjc1ZnIpOwogIGdhcDogY2xhbXAoMThweCwgM3Z3LCAzNHB4KTsKICBhbGlnbi1pdGVtczogc3RyZXRjaDsKfQoKI3N0YXJ0LXNjcmVlbi5zY3JlZW4tYWN0aXZlIHsKICBkaXNwbGF5OiBncmlkOwp9Cgouc3RhcnQtaGVybywKLnN0YXJ0LXBhbmVsLAoucmVzdWx0LWNhcmQsCi5zaWRlLXBhbmVsLAouYm9hcmQtZnJhbWUsCi5odWQtY2FyZCB7CiAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE0KTsKICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTYwZGVnLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDYpKTsKICBib3gtc2hhZG93OiB2YXIoLS1zaGFkb3cpOwogIGJhY2tkcm9wLWZpbHRlcjogYmx1cigxNHB4KTsKfQoKLnN0YXJ0LWhlcm8gewogIG1pbi1oZWlnaHQ6IDYyMHB4OwogIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy14bCk7CiAgcGFkZGluZzogY2xhbXAoMjRweCwgNXZ3LCA3MnB4KTsKICBkaXNwbGF5OiBmbGV4OwogIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgcG9zaXRpb246IHJlbGF0aXZlOwogIG92ZXJmbG93OiBoaWRkZW47Cn0KCi5zdGFydC1oZXJvOjpiZWZvcmUgewogIGNvbnRlbnQ6ICIiOwogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICBpbnNldDogYXV0byAtMTAlIC0yMiUgYXV0bzsKICB3aWR0aDogbWluKDY0dncsIDY4MHB4KTsKICBhc3BlY3QtcmF0aW86IDE7CiAgYm9yZGVyLXJhZGl1czogNTAlOwogIGJhY2tncm91bmQ6CiAgICByYWRpYWwtZ3JhZGllbnQoY2lyY2xlIGF0IDQ0JSA0NCUsIHJnYmEoMjQyLCAxOTQsIDk2LCAwLjUyKSAwIDEyJSwgdHJhbnNwYXJlbnQgMTIuNSUpLAogICAgcmFkaWFsLWdyYWRpZW50KGNpcmNsZSBhdCA1OCUgNTglLCByZ2JhKDExOCwgMjI0LCAyMTQsIDAuMjgpIDAgMTMlLCB0cmFuc3BhcmVudCAxMy41JSksCiAgICByZXBlYXRpbmctY29uaWMtZ3JhZGllbnQoZnJvbSA0NWRlZywgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA5KSAwIDI1JSwgdHJhbnNwYXJlbnQgMCA1MCUpOwogIG9wYWNpdHk6IDAuNTg7CiAgdHJhbnNmb3JtOiByb3RhdGUoLTE2ZGVnKTsKfQoKLnN0YXJ0LWhlcm8gPiAqIHsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgei1pbmRleDogMTsKfQoKLmJyYW5kLXJvdyB7CiAgZGlzcGxheTogZmxleDsKICBmbGV4LXdyYXA6IHdyYXA7CiAgZ2FwOiAxMHB4OwogIG1hcmdpbi1ib3R0b206IDIycHg7Cn0KCi5icmFuZC1iYWRnZSB7CiAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgbWluLWhlaWdodDogMzRweDsKICBhbGlnbi1pdGVtczogY2VudGVyOwogIHBhZGRpbmc6IDZweCAxMnB4OwogIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogIGJhY2tncm91bmQ6IHZhcigtLWdvbGQtc29mdCk7CiAgY29sb3I6ICNmZmU0YTU7CiAgZm9udC13ZWlnaHQ6IDgwMDsKICBsZXR0ZXItc3BhY2luZzogMC4wMmVtOwp9CgouYnJhbmQtYmFkZ2Uuc3VidGxlIHsKICBiYWNrZ3JvdW5kOiByZ2JhKDExOCwgMjI0LCAyMTQsIDAuMTQpOwogIGNvbG9yOiAjY2ZmYmY2Owp9CgpoMSwKaDIsCnAgewogIG1hcmdpbi10b3A6IDA7Cn0KCmgxIHsKICBtYXJnaW4tYm90dG9tOiAxNnB4OwogIGZvbnQtc2l6ZTogY2xhbXAoMi41cmVtLCA2dncsIDYuN3JlbSk7CiAgbGluZS1oZWlnaHQ6IDAuOTI7CiAgbGV0dGVyLXNwYWNpbmc6IC0wLjA3NWVtOwp9CgpoMiB7CiAgZm9udC1zaXplOiBjbGFtcCgxLjA1cmVtLCAyLjN2dywgMS4zNXJlbSk7CiAgbWFyZ2luLWJvdHRvbTogMTJweDsKfQoKLmhlcm8tdGV4dCB7CiAgbWF4LXdpZHRoOiA3MzBweDsKICBjb2xvcjogdmFyKC0tbXV0ZWQpOwogIGZvbnQtc2l6ZTogY2xhbXAoMS4wOHJlbSwgMnZ3LCAxLjQycmVtKTsKICBsaW5lLWhlaWdodDogMS42Owp9CgouaGVyby1hY3Rpb25zLAoudG9wLWFjdGlvbnMgewogIGRpc3BsYXk6IGZsZXg7CiAgZmxleC13cmFwOiB3cmFwOwogIGdhcDogMTJweDsKfQoKLmhlcm8tYWN0aW9ucyB7CiAgbWFyZ2luLXRvcDogMjRweDsKfQoKLnByaW1hcnktYnV0dG9uLAouc2Vjb25kYXJ5LWJ1dHRvbiwKLmdob3N0LWJ1dHRvbiwKLmljb24tYnV0dG9uLAouY2hvaWNlLWJ1dHRvbiB7CiAgbWluLWhlaWdodDogdmFyKC0tdGFwLXNpemUpOwogIGJvcmRlcjogMDsKICBib3JkZXItcmFkaXVzOiA5OTlweDsKICBwYWRkaW5nOiAxM3B4IDIwcHg7CiAgY3Vyc29yOiBwb2ludGVyOwogIGNvbG9yOiB2YXIoLS10ZXh0KTsKICB0b3VjaC1hY3Rpb246IG1hbmlwdWxhdGlvbjsKICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMTYwbXMgZWFzZSwgYmFja2dyb3VuZCAxNjBtcyBlYXNlLCBib3gtc2hhZG93IDE2MG1zIGVhc2UsIGJvcmRlci1jb2xvciAxNjBtcyBlYXNlOwp9CgoucHJpbWFyeS1idXR0b24gewogIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxMzVkZWcsICNmZmQzNmYsICNmNzllM2QpOwogIGNvbG9yOiAjMWIxMzA4OwogIGZvbnQtd2VpZ2h0OiA5MDA7CiAgYm94LXNoYWRvdzogMCAxNHB4IDMycHggcmdiYSgyNDcsIDE1OCwgNjEsIDAuMzIpOwp9Cgouc2Vjb25kYXJ5LWJ1dHRvbiB7CiAgYmFja2dyb3VuZDogcmdiYSgxMTgsIDIyNCwgMjE0LCAwLjE2KTsKICBjb2xvcjogI2RmZmZmYzsKICBmb250LXdlaWdodDogODAwOwogIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMTE4LCAyMjQsIDIxNCwgMC40Mik7Cn0KCi5naG9zdC1idXR0b24sCi5pY29uLWJ1dHRvbiB7CiAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA5KTsKICBjb2xvcjogdmFyKC0tdGV4dCk7CiAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE2KTsKICBmb250LXdlaWdodDogODAwOwp9CgouaWNvbi1idXR0b24ud2FybmluZyB7CiAgYm9yZGVyLWNvbG9yOiByZ2JhKDI1NSwgMTQwLCAxNDAsIDAuMzQpOwogIGNvbG9yOiAjZmZkZWRlOwp9CgoucHJpbWFyeS1idXR0b246aG92ZXIsCi5zZWNvbmRhcnktYnV0dG9uOmhvdmVyLAouZ2hvc3QtYnV0dG9uOmhvdmVyLAouaWNvbi1idXR0b246aG92ZXIsCi5jaG9pY2UtYnV0dG9uOmhvdmVyIHsKICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTJweCk7Cn0KCi5wcmltYXJ5LWJ1dHRvbjphY3RpdmUsCi5zZWNvbmRhcnktYnV0dG9uOmFjdGl2ZSwKLmdob3N0LWJ1dHRvbjphY3RpdmUsCi5pY29uLWJ1dHRvbjphY3RpdmUsCi5jaG9pY2UtYnV0dG9uOmFjdGl2ZSwKLnNxdWFyZS5kYXJrOmFjdGl2ZSB7CiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDFweCkgc2NhbGUoMC45OCk7Cn0KCi5zdGFydC1wYW5lbCB7CiAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLXhsKTsKICBwYWRkaW5nOiBjbGFtcCgxOHB4LCAzdncsIDMwcHgpOwogIGRpc3BsYXk6IGZsZXg7CiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICBnYXA6IDE4cHg7CiAgYWxpZ24tc2VsZjogc3RyZXRjaDsKfQoKLmRpZmZpY3VsdHktb3B0aW9ucyB7CiAgZGlzcGxheTogZ3JpZDsKICBnYXA6IDEycHg7Cn0KCi5jaG9pY2UtYnV0dG9uIHsKICB3aWR0aDogMTAwJTsKICBtaW4taGVpZ2h0OiA4MnB4OwogIHRleHQtYWxpZ246IGxlZnQ7CiAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLWxnKTsKICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDgpOwogIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMyk7Cn0KCi5jaG9pY2UtYnV0dG9uIHNwYW4gewogIGRpc3BsYXk6IGJsb2NrOwogIGZvbnQtd2VpZ2h0OiA5MDA7CiAgZm9udC1zaXplOiAxLjA1cmVtOwogIG1hcmdpbi1ib3R0b206IDRweDsKfQoKLmNob2ljZS1idXR0b24gc21hbGwgewogIGRpc3BsYXk6IGJsb2NrOwogIGNvbG9yOiB2YXIoLS1tdXRlZCk7CiAgbGluZS1oZWlnaHQ6IDEuMzU7Cn0KCi5jaG9pY2UtYWN0aXZlIHsKICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCByZ2JhKDI0MiwgMTk0LCA5NiwgMC4yKSwgcmdiYSgxMTgsIDIyNCwgMjE0LCAwLjE0KSk7CiAgYm9yZGVyLWNvbG9yOiByZ2JhKDI0MiwgMTk0LCA5NiwgMC41NSk7Cn0KCi5ydWxlLWNhcmQsCi5rZXktY2FyZCwKLmNvYWNoLWNhcmQsCi5taXNzaW9uLWNhcmQsCi5jYXB0dXJlLWNhcmQsCi5ydWxlcy1wYW5lbCB7CiAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLWxnKTsKICBwYWRkaW5nOiAxOHB4OwogIGJhY2tncm91bmQ6IHJnYmEoOSwgMTMsIDI0LCAwLjQ0KTsKICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTEpOwp9CgoucnVsZS1jYXJkIHAsCi5rZXktY2FyZCBwLAouY29hY2gtY2FyZCBwLAoubWlzc2lvbi1jYXJkIHAsCi5ydWxlcy1wYW5lbCBsaSB7CiAgY29sb3I6IHZhcigtLW11dGVkKTsKICBsaW5lLWhlaWdodDogMS41NTsKfQoKI3BsYXktc2NyZWVuLnNjcmVlbi1hY3RpdmUgewogIGRpc3BsYXk6IGJsb2NrOwp9CgoudG9wYmFyIHsKICBkaXNwbGF5OiBmbGV4OwogIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICBnYXA6IDE4cHg7CiAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICBtYXJnaW4tYm90dG9tOiAxNnB4Owp9CgouZXllYnJvdyB7CiAgbWFyZ2luLWJvdHRvbTogNXB4OwogIGNvbG9yOiB2YXIoLS1jeWFuKTsKICBmb250LXdlaWdodDogOTAwOwogIGxldHRlci1zcGFjaW5nOiAwLjEyZW07CiAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICBmb250LXNpemU6IDAuNzZyZW07Cn0KCi50b3BiYXIgaDEgewogIGZvbnQtc2l6ZTogY2xhbXAoMS43cmVtLCAzLjR2dywgMy4ycmVtKTsKICBtYXJnaW4tYm90dG9tOiAwOwogIGxldHRlci1zcGFjaW5nOiAtMC4wNDVlbTsKfQoKLmh1ZC1ncmlkIHsKICBkaXNwbGF5OiBncmlkOwogIGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KDQsIG1pbm1heCgxMjBweCwgMWZyKSk7CiAgZ2FwOiAxMnB4OwogIG1hcmdpbi1ib3R0b206IDEycHg7Cn0KCi5odWQtY2FyZCB7CiAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLWxnKTsKICBwYWRkaW5nOiAxNHB4IDE2cHg7Cn0KCi5odWQtbGFiZWwgewogIGRpc3BsYXk6IGJsb2NrOwogIGNvbG9yOiB2YXIoLS1tdXRlZCk7CiAgZm9udC1zaXplOiAwLjg4cmVtOwogIG1hcmdpbi1ib3R0b206IDRweDsKfQoKLmh1ZC1jYXJkIHN0cm9uZyB7CiAgZm9udC1zaXplOiBjbGFtcCgxLjM1cmVtLCAyLjZ2dywgMnJlbSk7Cn0KCi5wcm9ncmVzcy13cmFwIHsKICB3aWR0aDogMTAwJTsKICBoZWlnaHQ6IDEycHg7CiAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgb3ZlcmZsb3c6IGhpZGRlbjsKICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSk7CiAgbWFyZ2luLWJvdHRvbTogMThweDsKfQoKLnByb2dyZXNzLWJhciB7CiAgd2lkdGg6IDQlOwogIGhlaWdodDogMTAwJTsKICBib3JkZXItcmFkaXVzOiBpbmhlcml0OwogIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCg5MGRlZywgdmFyKC0tY3lhbiksIHZhcigtLWdvbGQpKTsKICB0cmFuc2l0aW9uOiB3aWR0aCAyNjBtcyBlYXNlOwp9CgouZ2FtZS1sYXlvdXQgewogIGRpc3BsYXk6IGdyaWQ7CiAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiBtaW5tYXgoMzAwcHgsIDFmcikgbWlubWF4KDI4MHB4LCAzNjBweCk7CiAgZ2FwOiBjbGFtcCgxNHB4LCAyLjN2dywgMjRweCk7CiAgYWxpZ24taXRlbXM6IHN0YXJ0Owp9CgouYm9hcmQtd3JhcCB7CiAgbWluLXdpZHRoOiAwOwp9CgouYm9hcmQtZnJhbWUgewogIHdpZHRoOiBtaW4oODZ2aCwgMTAwJSk7CiAgbWF4LXdpZHRoOiA4NTBweDsKICBtYXJnaW46IDAgYXV0bzsKICBwYWRkaW5nOiBjbGFtcCgxMHB4LCAydncsIDE4cHgpOwogIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy14bCk7CiAgYmFja2dyb3VuZDoKICAgIGxpbmVhci1ncmFkaWVudCgxNjBkZWcsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNSksIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNikpLAogICAgbGluZWFyLWdyYWRpZW50KDQ1ZGVnLCByZ2JhKDI0MiwgMTk0LCA5NiwgMC4wOSksIHJnYmEoMTE4LCAyMjQsIDIxNCwgMC4wOCkpOwp9CgouYm9hcmQgewogIHdpZHRoOiAxMDAlOwogIGFzcGVjdC1yYXRpbzogMTsKICBkaXNwbGF5OiBncmlkOwogIGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KDgsIDFmcik7CiAgZ3JpZC10ZW1wbGF0ZS1yb3dzOiByZXBlYXQoOCwgMWZyKTsKICBvdmVyZmxvdzogaGlkZGVuOwogIGJvcmRlci1yYWRpdXM6IDIwcHg7CiAgYm9yZGVyOiA3cHggc29saWQgcmdiYSgxOCwgMTMsIDksIDAuOSk7CiAgYm94LXNoYWRvdzogaW5zZXQgMCAwIDAgMnB4IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMiksIDAgMThweCA2MHB4IHJnYmEoMCwgMCwgMCwgMC4zKTsKfQoKLnNxdWFyZSB7CiAgbWluLXdpZHRoOiAwOwogIG1pbi1oZWlnaHQ6IDA7CiAgYm9yZGVyOiAwOwogIHBvc2l0aW9uOiByZWxhdGl2ZTsKICBkaXNwbGF5OiBncmlkOwogIHBsYWNlLWl0ZW1zOiBjZW50ZXI7Cn0KCi5zcXVhcmUubGlnaHQgewogIGJhY2tncm91bmQ6CiAgICBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMjUpLCB0cmFuc3BhcmVudCksCiAgICB2YXIoLS1saWdodC1zcXVhcmUpOwp9Cgouc3F1YXJlLmRhcmsgewogIGJhY2tncm91bmQ6CiAgICByYWRpYWwtZ3JhZGllbnQoY2lyY2xlIGF0IDI0JSAxOCUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMiksIHRyYW5zcGFyZW50IDMyJSksCiAgICB2YXIoLS1kYXJrLXNxdWFyZSk7CiAgY3Vyc29yOiBwb2ludGVyOwogIHBhZGRpbmc6IDZweDsKfQoKLnNxdWFyZS5kYXJrOjpiZWZvcmUgewogIGNvbnRlbnQ6IGF0dHIoZGF0YS1maWVsZCk7CiAgcG9zaXRpb246IGFic29sdXRlOwogIHRvcDogNXB4OwogIGxlZnQ6IDdweDsKICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjMyKTsKICBmb250LXNpemU6IGNsYW1wKDAuNTJyZW0sIDEuMXZ3LCAwLjc4cmVtKTsKICBmb250LXdlaWdodDogODAwOwogIHBvaW50ZXItZXZlbnRzOiBub25lOwp9Cgouc3F1YXJlLmRhcmsudmFsaWQ6OmFmdGVyLAouc3F1YXJlLmRhcmsuaGludDo6YWZ0ZXIgewogIGNvbnRlbnQ6ICIiOwogIHdpZHRoOiAzNCU7CiAgYXNwZWN0LXJhdGlvOiAxOwogIGJvcmRlci1yYWRpdXM6IDUwJTsKICBiYWNrZ3JvdW5kOiByZ2JhKDE0MCwgMjQwLCAxNjQsIDAuNDUpOwogIGJvcmRlcjogM3B4IHNvbGlkIHJnYmEoMTQwLCAyNDAsIDE2NCwgMC45NSk7CiAgYm94LXNoYWRvdzogMCAwIDI0cHggcmdiYSgxNDAsIDI0MCwgMTY0LCAwLjMpOwp9Cgouc3F1YXJlLmRhcmsuY2FwdHVyZS10YXJnZXQ6OmFmdGVyIHsKICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjA3LCAxMTIsIDAuNDIpOwogIGJvcmRlci1jb2xvcjogcmdiYSgyNTUsIDIwNywgMTEyLCAwLjk4KTsKICBib3gtc2hhZG93OiAwIDAgMjhweCByZ2JhKDI1NSwgMjA3LCAxMTIsIDAuMzgpOwp9Cgouc3F1YXJlLmRhcmsuc2VsZWN0ZWQgewogIGJveC1zaGFkb3c6IGluc2V0IDAgMCAwIDVweCB2YXIoLS1jeWFuKTsKfQoKLnNxdWFyZS5kYXJrLmxhc3QtbW92ZSB7CiAgYm94LXNoYWRvdzogaW5zZXQgMCAwIDAgNHB4IHJnYmEoMjQyLCAxOTQsIDk2LCAwLjY4KTsKfQoKLnBpZWNlIHsKICB3aWR0aDogbWluKDcyJSwgNzRweCk7CiAgYXNwZWN0LXJhdGlvOiAxOwogIGJvcmRlci1yYWRpdXM6IDUwJTsKICBkaXNwbGF5OiBncmlkOwogIHBsYWNlLWl0ZW1zOiBjZW50ZXI7CiAgcG9zaXRpb246IHJlbGF0aXZlOwogIHotaW5kZXg6IDI7CiAgYm94LXNoYWRvdzoKICAgIGluc2V0IDAgOHB4IDEycHggcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIyKSwKICAgIGluc2V0IDAgLTEwcHggMTRweCByZ2JhKDAsIDAsIDAsIDAuMjgpLAogICAgMCA5cHggMThweCByZ2JhKDAsIDAsIDAsIDAuMzIpOwp9CgoucGllY2U6OmJlZm9yZSB7CiAgY29udGVudDogIiI7CiAgcG9zaXRpb246IGFic29sdXRlOwogIGluc2V0OiAxNiU7CiAgYm9yZGVyLXJhZGl1czogNTAlOwogIGJvcmRlcjogM3B4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yOCk7Cn0KCi5waWVjZS5wbGF5ZXIgewogIGJhY2tncm91bmQ6CiAgICByYWRpYWwtZ3JhZGllbnQoY2lyY2xlIGF0IDM1JSAyNSUsICNmZmZmZmYgMCA4JSwgdHJhbnNwYXJlbnQgMTAlKSwKICAgIGxpbmVhci1ncmFkaWVudCgxNDVkZWcsICNmOGYwZDksICNjZmE0NWEgNjAlLCAjOGI1YzI2KTsKICBib3JkZXI6IDNweCBzb2xpZCAjZmZmMmJjOwp9CgoucGllY2UuYm90IHsKICBiYWNrZ3JvdW5kOgogICAgcmFkaWFsLWdyYWRpZW50KGNpcmNsZSBhdCAzNSUgMjUlLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNDUpIDAgOCUsIHRyYW5zcGFyZW50IDEwJSksCiAgICBsaW5lYXItZ3JhZGllbnQoMTQ1ZGVnLCAjM2M0NTY1LCAjMTcxZDMyIDU1JSwgIzA3MDkxMyk7CiAgYm9yZGVyOiAzcHggc29saWQgIzU2NjE3ZjsKfQoKLnBpZWNlLmtpbmcgewogIG91dGxpbmU6IDRweCBzb2xpZCByZ2JhKDI0MiwgMTk0LCA5NiwgMC42NSk7CiAgb3V0bGluZS1vZmZzZXQ6IC05cHg7Cn0KCi5waWVjZS1tYXJrIHsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgei1pbmRleDogMzsKICBjb2xvcjogIzJhMTkwODsKICBmb250LXNpemU6IGNsYW1wKDFyZW0sIDMuM3Z3LCAycmVtKTsKICBmb250LXdlaWdodDogMTAwMDsKICB0ZXh0LXNoYWRvdzogMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMjgpOwp9CgoucGllY2UuYm90IC5waWVjZS1tYXJrIHsKICBjb2xvcjogI2Y4ZDI3YTsKfQoKLmJvYXJkLWxhYmVsIHsKICBkaXNwbGF5OiBncmlkOwogIGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KDgsIDFmcik7CiAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC41Mik7CiAgZm9udC13ZWlnaHQ6IDkwMDsKICBwYWRkaW5nOiAwIDlweDsKICBmb250LXNpemU6IDAuNzhyZW07Cn0KCi5ib2FyZC1sYWJlbCBzcGFuIHsKICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KCi50b3AtbGFiZWwgewogIG1hcmdpbi1ib3R0b206IDdweDsKfQoKLmJvdHRvbS1sYWJlbCB7CiAgbWFyZ2luLXRvcDogN3B4Owp9CgouZmVlZGJhY2sgewogIG1pbi1oZWlnaHQ6IDYycHg7CiAgZGlzcGxheTogZ3JpZDsKICBhbGlnbi1pdGVtczogY2VudGVyOwogIG1hcmdpbjogMTRweCBhdXRvIDA7CiAgd2lkdGg6IG1pbig4NTBweCwgMTAwJSk7CiAgcGFkZGluZzogMTNweCAxOHB4OwogIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1sZyk7CiAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjI4KTsKICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTMpOwogIGNvbG9yOiAjZjZmYmZmOwogIGxpbmUtaGVpZ2h0OiAxLjQ1OwogIGJveC1zaGFkb3c6IDAgMTJweCAyOHB4IHJnYmEoMCwgMCwgMCwgMC4xOCk7Cn0KCi5mZWVkYmFjay5nb29kIHsKICBib3JkZXItY29sb3I6IHJnYmEoMTMyLCAyMjQsIDEzOCwgMC41NSk7CiAgYmFja2dyb3VuZDogcmdiYSg0MiwgOTYsIDQ5LCAwLjI2KTsKfQoKLmZlZWRiYWNrLmJhZCB7CiAgYm9yZGVyLWNvbG9yOiByZ2JhKDI1NSwgMTQwLCAxNDAsIDAuNTgpOwogIGJhY2tncm91bmQ6IHJnYmEoMTEyLCAzMiwgMzIsIDAuMjIpOwp9Cgouc2lkZS1wYW5lbCB7CiAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLXhsKTsKICBwYWRkaW5nOiAxNnB4OwogIGRpc3BsYXk6IGdyaWQ7CiAgZ2FwOiAxNHB4Owp9CgoubWlzc2lvbi1oZWFkLAoubWF0ZXJpYWwtcm93IHsKICBkaXNwbGF5OiBmbGV4OwogIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICBnYXA6IDEycHg7CiAgYWxpZ24taXRlbXM6IGNlbnRlcjsKfQoKI21pc3Npb24tbGFiZWwgewogIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogIHBhZGRpbmc6IDVweCAxMHB4OwogIGJhY2tncm91bmQ6IHZhcigtLWdvbGQtc29mdCk7CiAgY29sb3I6ICNmZmU1YWE7CiAgZm9udC13ZWlnaHQ6IDkwMDsKICB3aGl0ZS1zcGFjZTogbm93cmFwOwp9CgoubWF0ZXJpYWwtcm93IHsKICBwYWRkaW5nOiAxMXB4IDA7CiAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMik7CiAgY29sb3I6IHZhcigtLW11dGVkKTsKfQoKLm1hdGVyaWFsLXJvdzpmaXJzdC1vZi10eXBlIHsKICBib3JkZXItdG9wOiAwOwp9CgoubWF0ZXJpYWwtcm93IHN0cm9uZyB7CiAgY29sb3I6IHZhcigtLXRleHQpOwogIGZvbnQtc2l6ZTogMS4ycmVtOwp9CgoucnVsZXMtcGFuZWwgewogIGRpc3BsYXk6IG5vbmU7Cn0KCi5ydWxlcy1wYW5lbC5ydWxlcy12aXNpYmxlIHsKICBkaXNwbGF5OiBibG9jazsKfQoKLnJ1bGVzLXBhbmVsIHVsIHsKICBwYWRkaW5nLWxlZnQ6IDEuMTVyZW07CiAgbWFyZ2luOiAwOwp9CgoucnVsZXMtcGFuZWwgbGkgKyBsaSB7CiAgbWFyZ2luLXRvcDogOHB4Owp9CgoucmVzdWx0LWNhcmQgewogIG1pbi1oZWlnaHQ6IGNhbGMoMTAwdmggLSA1MnB4KTsKICBtaW4taGVpZ2h0OiBjYWxjKDEwMGR2aCAtIDUycHgpOwogIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy14bCk7CiAgcGFkZGluZzogY2xhbXAoMjZweCwgNnZ3LCA3OHB4KTsKICBkaXNwbGF5OiBmbGV4OwogIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7Cn0KCi5yZXN1bHQtY2FyZCBoMSB7CiAgZm9udC1zaXplOiBjbGFtcCgyLjVyZW0sIDZ2dywgNS44cmVtKTsKfQoKI3Jlc3VsdC10ZXh0IHsKICBtYXgtd2lkdGg6IDc4MHB4OwogIGNvbG9yOiB2YXIoLS1tdXRlZCk7CiAgZm9udC1zaXplOiBjbGFtcCgxLjA4cmVtLCAydncsIDEuMzVyZW0pOwogIGxpbmUtaGVpZ2h0OiAxLjY1Owp9CgoucmVzdWx0LXN0YXRzIHsKICBkaXNwbGF5OiBncmlkOwogIGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KDMsIG1pbm1heCgxMzBweCwgMWZyKSk7CiAgZ2FwOiAxNHB4OwogIG1heC13aWR0aDogODIwcHg7CiAgbWFyZ2luOiAyNnB4IDAgOHB4Owp9CgoucmVzdWx0LXN0YXRzIGRpdiB7CiAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLWxnKTsKICBwYWRkaW5nOiAxOHB4OwogIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOSk7CiAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEzKTsKfQoKLnJlc3VsdC1zdGF0cyBzcGFuIHsKICBkaXNwbGF5OiBibG9jazsKICBjb2xvcjogdmFyKC0tbXV0ZWQpOwogIG1hcmdpbi1ib3R0b206IDRweDsKfQoKLnJlc3VsdC1zdGF0cyBzdHJvbmcgewogIGZvbnQtc2l6ZTogMnJlbTsKfQoKLnRvYXN0IHsKICBwb3NpdGlvbjogZml4ZWQ7CiAgbGVmdDogNTAlOwogIGJvdHRvbTogbWF4KDE4cHgsIGVudihzYWZlLWFyZWEtaW5zZXQtYm90dG9tKSk7CiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpIHRyYW5zbGF0ZVkoMTIwJSk7CiAgbWF4LXdpZHRoOiBtaW4oNTYwcHgsIGNhbGMoMTAwdncgLSAzMnB4KSk7CiAgcGFkZGluZzogMTNweCAxOHB4OwogIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogIGJhY2tncm91bmQ6IHJnYmEoOSwgMTMsIDI0LCAwLjkpOwogIGNvbG9yOiB2YXIoLS10ZXh0KTsKICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTcpOwogIGJveC1zaGFkb3c6IDAgMThweCA0NnB4IHJnYmEoMCwgMCwgMCwgMC4zOCk7CiAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIDIyMG1zIGVhc2U7CiAgei1pbmRleDogMzA7CiAgdGV4dC1hbGlnbjogY2VudGVyOwp9CgoudG9hc3QudG9hc3QtdmlzaWJsZSB7CiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpIHRyYW5zbGF0ZVkoMCk7Cn0KCkBtZWRpYSAobWF4LXdpZHRoOiAxMDgwcHgpIHsKICAjc3RhcnQtc2NyZWVuLAogIC5nYW1lLWxheW91dCB7CiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmcjsKICB9CgogIC5zdGFydC1oZXJvIHsKICAgIG1pbi1oZWlnaHQ6IDQ4MHB4OwogIH0KCiAgLmJvYXJkLWZyYW1lIHsKICAgIHdpZHRoOiBtaW4oOTJ2dywgNzgwcHgpOwogIH0KCiAgLnNpZGUtcGFuZWwgewogICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoMiwgbWlubWF4KDAsIDFmcikpOwogIH0KCiAgLnJ1bGVzLXBhbmVsIHsKICAgIGdyaWQtY29sdW1uOiAxIC8gLTE7CiAgfQp9CgpAbWVkaWEgKG1heC13aWR0aDogNzYwcHgpIHsKICAuYXBwLXNoZWxsIHsKICAgIHBhZGRpbmc6IDEwcHg7CiAgfQoKICAudG9wYmFyIHsKICAgIGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICB9CgogIC50b3AtYWN0aW9ucywKICAuaGVyby1hY3Rpb25zIHsKICAgIHdpZHRoOiAxMDAlOwogIH0KCiAgLnByaW1hcnktYnV0dG9uLAogIC5zZWNvbmRhcnktYnV0dG9uLAogIC5naG9zdC1idXR0b24sCiAgLmljb24tYnV0dG9uIHsKICAgIGZsZXg6IDEgMSBhdXRvOwogIH0KCiAgLmh1ZC1ncmlkIHsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KDIsIG1pbm1heCgwLCAxZnIpKTsKICB9CgogIC5zaWRlLXBhbmVsIHsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyOwogIH0KCiAgLmJvYXJkLWZyYW1lIHsKICAgIGJvcmRlci1yYWRpdXM6IDIycHg7CiAgICBwYWRkaW5nOiA5cHg7CiAgICB3aWR0aDogMTAwJTsKICB9CgogIC5ib2FyZCB7CiAgICBib3JkZXItd2lkdGg6IDVweDsKICAgIGJvcmRlci1yYWRpdXM6IDE1cHg7CiAgfQoKICAuc3F1YXJlLmRhcmsgewogICAgcGFkZGluZzogM3B4OwogIH0KCiAgLnBpZWNlIHsKICAgIHdpZHRoOiA3OCU7CiAgfQoKICAucmVzdWx0LXN0YXRzIHsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyOwogIH0KfQoKQG1lZGlhIChtYXgtd2lkdGg6IDQ2MHB4KSB7CiAgLnN0YXJ0LWhlcm8sCiAgLnN0YXJ0LXBhbmVsLAogIC5yZXN1bHQtY2FyZCB7CiAgICBib3JkZXItcmFkaXVzOiAyMHB4OwogICAgcGFkZGluZzogMThweDsKICB9CgogIC5icmFuZC1yb3cgewogICAgZ2FwOiA3cHg7CiAgfQoKICAuYnJhbmQtYmFkZ2UgewogICAgZm9udC1zaXplOiAwLjc4cmVtOwogIH0KCiAgaDEgewogICAgbGV0dGVyLXNwYWNpbmc6IC0wLjA1NWVtOwogIH0KCiAgLmh1ZC1jYXJkIHsKICAgIHBhZGRpbmc6IDEycHg7CiAgfQoKICAuaWNvbi1idXR0b24gewogICAgbWluLWhlaWdodDogNDRweDsKICAgIHBhZGRpbmc6IDExcHggMTJweDsKICAgIGZvbnQtc2l6ZTogMC45MnJlbTsKICB9CgogIC5mZWVkYmFjayB7CiAgICBmb250LXNpemU6IDAuOTRyZW07CiAgfQoKICAuYm9hcmQtbGFiZWwgewogICAgZm9udC1zaXplOiAwLjY2cmVtOwogIH0KfQoKQG1lZGlhIChwcmVmZXJzLXJlZHVjZWQtbW90aW9uOiByZWR1Y2UpIHsKICAqLAogICo6OmJlZm9yZSwKICAqOjphZnRlciB7CiAgICB0cmFuc2l0aW9uLWR1cmF0aW9uOiAwLjAxbXMgIWltcG9ydGFudDsKICAgIGFuaW1hdGlvbi1kdXJhdGlvbjogMC4wMW1zICFpbXBvcnRhbnQ7CiAgfQp9Cgo8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgogIDxtYWluIGlkPSJnYW1lLXJvb3QiIGNsYXNzPSJhcHAtc2hlbGwiPgogICAgPHNlY3Rpb24gaWQ9InN0YXJ0LXNjcmVlbiIgY2xhc3M9InNjcmVlbiBzY3JlZW4tYWN0aXZlIiBhcmlhLWxhYmVsbGVkYnk9ImdhbWUtdGl0bGUiPgogICAgICA8ZGl2IGNsYXNzPSJzdGFydC1oZXJvIj4KICAgICAgICA8ZGl2IGNsYXNzPSJicmFuZC1yb3ciPgogICAgICAgICAgPHNwYW4gY2xhc3M9ImJyYW5kLWJhZGdlIj5NT09Dd2lraSBTcGllbGU8L3NwYW4+CiAgICAgICAgICA8c3BhbiBjbGFzcz0iYnJhbmQtYmFkZ2Ugc3VidGxlIj5Mb2thbCBzcGllbGJhcjwvc3Bhbj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8aDEgaWQ9ImdhbWUtdGl0bGUiPkRhbWUgTWVpc3RlcnNjaHVsZTwvaDE+CiAgICAgICAgPHAgY2xhc3M9Imhlcm8tdGV4dCI+CiAgICAgICAgICBTcGllbGUgRGFtZSBnZWdlbiBlaW5lIGZhaXJlIEtJLCBsZXJuZSBTY2hsYWdwZmxpY2h0LCBNZWhyZmFjaHNjaGzDpGdlIHVuZCBEYW1lbmJpbGR1bmcKICAgICAgICAgIGRpcmVrdCBhdWYgZGVtIEJyZXR0LgogICAgICAgIDwvcD4KICAgICAgICA8ZGl2IGNsYXNzPSJoZXJvLWFjdGlvbnMiPgogICAgICAgICAgPGJ1dHRvbiBpZD0ic3RhcnQtZ2FtZS1idXR0b24iIGNsYXNzPSJwcmltYXJ5LWJ1dHRvbiIgdHlwZT0iYnV0dG9uIj5QYXJ0aWUgc3RhcnRlbjwvYnV0dG9uPgogICAgICAgICAgPGJ1dHRvbiBpZD0idHJhaW5pbmctZ2FtZS1idXR0b24iIGNsYXNzPSJzZWNvbmRhcnktYnV0dG9uIiB0eXBlPSJidXR0b24iPlRyYWluaW5nc3J1bmRlPC9idXR0b24+CiAgICAgICAgICA8YnV0dG9uIGlkPSJzdGFydC1mdWxsc2NyZWVuLWJ1dHRvbiIgY2xhc3M9Imdob3N0LWJ1dHRvbiIgdHlwZT0iYnV0dG9uIj5Wb2xsYmlsZDwvYnV0dG9uPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KCiAgICAgIDxhc2lkZSBjbGFzcz0ic3RhcnQtcGFuZWwiIGFyaWEtbGFiZWw9IlNwaWVsZWluc3RlbGx1bmdlbiI+CiAgICAgICAgPGgyPlNjaHdpZXJpZ2tlaXQ8L2gyPgogICAgICAgIDxkaXYgaWQ9ImRpZmZpY3VsdHktb3B0aW9ucyIgY2xhc3M9ImRpZmZpY3VsdHktb3B0aW9ucyIgYXJpYS1sYWJlbD0iU2Nod2llcmlna2VpdCBhdXN3w6RobGVuIj4KICAgICAgICAgIDxidXR0b24gY2xhc3M9ImNob2ljZS1idXR0b24iIHR5cGU9ImJ1dHRvbiIgZGF0YS1kaWZmaWN1bHR5PSJlYXN5IiBhcmlhLXByZXNzZWQ9ImZhbHNlIj4KICAgICAgICAgICAgPHNwYW4+RWluc3RlaWdlcjwvc3Bhbj4KICAgICAgICAgICAgPHNtYWxsPktJIGJldm9yenVndCBndXRlIFrDvGdlLCBsw6Rzc3QgQ2hhbmNlbiBvZmZlbi48L3NtYWxsPgogICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJjaG9pY2UtYnV0dG9uIGNob2ljZS1hY3RpdmUiIHR5cGU9ImJ1dHRvbiIgZGF0YS1kaWZmaWN1bHR5PSJiYWxhbmNlZCIgYXJpYS1wcmVzc2VkPSJ0cnVlIj4KICAgICAgICAgICAgPHNwYW4+Rm9ydGdlc2Nocml0dGVuPC9zcGFuPgogICAgICAgICAgICA8c21hbGw+QXVzZ2V3b2dlbmVzIFNwaWVsIG1pdCB0YWt0aXNjaGVuIEFudHdvcnRlbi48L3NtYWxsPgogICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJjaG9pY2UtYnV0dG9uIiB0eXBlPSJidXR0b24iIGRhdGEtZGlmZmljdWx0eT0iZXhwZXJ0IiBhcmlhLXByZXNzZWQ9ImZhbHNlIj4KICAgICAgICAgICAgPHNwYW4+UHJvZmk8L3NwYW4+CiAgICAgICAgICAgIDxzbWFsbD5Wb3JhdXNzY2hhdWVuZGUgS0kgbWl0IEVuZHNwaWVsYmxpY2suPC9zbWFsbD4KICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgIDwvZGl2PgoKICAgICAgICA8ZGl2IGNsYXNzPSJydWxlLWNhcmQiPgogICAgICAgICAgPGgyPlJlZ2VsbiBpbSBTcGllbDwvaDI+CiAgICAgICAgICA8cD4KICAgICAgICAgICAgR2VzcGllbHQgd2lyZCBlaW5lIGtsYXJlIDjDlzgtU2NodWx2YXJpYW50ZTogU3RlaW5lIHppZWhlbiBkaWFnb25hbCB2b3J3w6RydHMsCiAgICAgICAgICAgIHNjaGxhZ2VuIGlzdCBQZmxpY2h0LCBEYW1lbiB6aWVoZW4gZGlhZ29uYWwgaW4gYmVpZGUgUmljaHR1bmdlbi4KICAgICAgICAgIDwvcD4KICAgICAgICA8L2Rpdj4KCiAgICAgICAgPGRpdiBjbGFzcz0ia2V5LWNhcmQiPgogICAgICAgICAgPGgyPlN0ZXVlcnVuZzwvaDI+CiAgICAgICAgICA8cD5NYXVzIG9kZXIgVG91Y2g6IFN0ZWluIHVuZCBaaWVsZmVsZCB3w6RobGVuLiBUYXN0YXR1cjogUGZlaWx0YXN0ZW4sIEVpbmdhYmUgdW5kIExlZXJ0YXN0ZS48L3A+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvYXNpZGU+CiAgICA8L3NlY3Rpb24+CgogICAgPHNlY3Rpb24gaWQ9InBsYXktc2NyZWVuIiBjbGFzcz0ic2NyZWVuIiBhcmlhLWxhYmVsbGVkYnk9InBsYXktdGl0bGUiPgogICAgICA8aGVhZGVyIGNsYXNzPSJ0b3BiYXIiPgogICAgICAgIDxkaXY+CiAgICAgICAgICA8cCBjbGFzcz0iZXllYnJvdyI+U3RyYXRlZ2llLVNwaWVsPC9wPgogICAgICAgICAgPGgxIGlkPSJwbGF5LXRpdGxlIj5EYW1lIE1laXN0ZXJzY2h1bGU8L2gxPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InRvcC1hY3Rpb25zIiBhcmlhLWxhYmVsPSJTcGllbG1lbsO8Ij4KICAgICAgICAgIDxidXR0b24gaWQ9ImZ1bGxzY3JlZW4tYnV0dG9uIiBjbGFzcz0iaWNvbi1idXR0b24iIHR5cGU9ImJ1dHRvbiI+Vm9sbGJpbGQ8L2J1dHRvbj4KICAgICAgICAgIDxidXR0b24gaWQ9ImhpbnQtYnV0dG9uIiBjbGFzcz0iaWNvbi1idXR0b24iIHR5cGU9ImJ1dHRvbiI+VGlwcDwvYnV0dG9uPgogICAgICAgICAgPGJ1dHRvbiBpZD0icnVsZXMtYnV0dG9uIiBjbGFzcz0iaWNvbi1idXR0b24iIHR5cGU9ImJ1dHRvbiI+UmVnZWxuPC9idXR0b24+CiAgICAgICAgICA8YnV0dG9uIGlkPSJyZXNldC1idXR0b24iIGNsYXNzPSJpY29uLWJ1dHRvbiB3YXJuaW5nIiB0eXBlPSJidXR0b24iPk5ldTwvYnV0dG9uPgogICAgICAgICAgPGJ1dHRvbiBpZD0ibWVudS1idXR0b24iIGNsYXNzPSJpY29uLWJ1dHRvbiIgdHlwZT0iYnV0dG9uIj5NZW7DvDwvYnV0dG9uPgogICAgICAgIDwvZGl2PgogICAgICA8L2hlYWRlcj4KCiAgICAgIDxzZWN0aW9uIGNsYXNzPSJodWQtZ3JpZCIgYXJpYS1sYWJlbD0iU3BpZWxzdGFuZCI+CiAgICAgICAgPGRpdiBjbGFzcz0iaHVkLWNhcmQiPgogICAgICAgICAgPHNwYW4gY2xhc3M9Imh1ZC1sYWJlbCI+UHVua3RlPC9zcGFuPgogICAgICAgICAgPHN0cm9uZyBpZD0ic2NvcmUtdmFsdWUiPjA8L3N0cm9uZz4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJodWQtY2FyZCI+CiAgICAgICAgICA8c3BhbiBjbGFzcz0iaHVkLWxhYmVsIj5MZXJuc3R1ZmU8L3NwYW4+CiAgICAgICAgICA8c3Ryb25nIGlkPSJsZXZlbC12YWx1ZSI+MTwvc3Ryb25nPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9Imh1ZC1jYXJkIj4KICAgICAgICAgIDxzcGFuIGNsYXNzPSJodWQtbGFiZWwiPlp1Zzwvc3Bhbj4KICAgICAgICAgIDxzdHJvbmcgaWQ9InR1cm4tdmFsdWUiPkR1PC9zdHJvbmc+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0iaHVkLWNhcmQiPgogICAgICAgICAgPHNwYW4gY2xhc3M9Imh1ZC1sYWJlbCI+WmVpdDwvc3Bhbj4KICAgICAgICAgIDxzdHJvbmcgaWQ9InRpbWUtdmFsdWUiPjAwOjAwPC9zdHJvbmc+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvc2VjdGlvbj4KCiAgICAgIDxkaXYgY2xhc3M9InByb2dyZXNzLXdyYXAiIGFyaWEtbGFiZWw9Ikxlcm5mb3J0c2Nocml0dCI+CiAgICAgICAgPGRpdiBpZD0icHJvZ3Jlc3MtYmFyIiBjbGFzcz0icHJvZ3Jlc3MtYmFyIj48L2Rpdj4KICAgICAgPC9kaXY+CgogICAgICA8c2VjdGlvbiBjbGFzcz0iZ2FtZS1sYXlvdXQiPgogICAgICAgIDxkaXYgY2xhc3M9ImJvYXJkLXdyYXAiPgogICAgICAgICAgPGRpdiBjbGFzcz0iYm9hcmQtZnJhbWUiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJib2FyZC1sYWJlbCB0b3AtbGFiZWwiIGFyaWEtaGlkZGVuPSJ0cnVlIj4KICAgICAgICAgICAgICA8c3Bhbj5BPC9zcGFuPjxzcGFuPkI8L3NwYW4+PHNwYW4+Qzwvc3Bhbj48c3Bhbj5EPC9zcGFuPjxzcGFuPkU8L3NwYW4+PHNwYW4+Rjwvc3Bhbj48c3Bhbj5HPC9zcGFuPjxzcGFuPkg8L3NwYW4+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGlkPSJib2FyZCIgY2xhc3M9ImJvYXJkIiByb2xlPSJncmlkIiBhcmlhLWxhYmVsPSJEYW1lYnJldHQgbWl0IDY0IEZlbGRlcm4iPjwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJib2FyZC1sYWJlbCBib3R0b20tbGFiZWwiIGFyaWEtaGlkZGVuPSJ0cnVlIj4KICAgICAgICAgICAgICA8c3Bhbj5BPC9zcGFuPjxzcGFuPkI8L3NwYW4+PHNwYW4+Qzwvc3Bhbj48c3Bhbj5EPC9zcGFuPjxzcGFuPkU8L3NwYW4+PHNwYW4+Rjwvc3Bhbj48c3Bhbj5HPC9zcGFuPjxzcGFuPkg8L3NwYW4+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8cCBpZD0iZmVlZGJhY2siIGNsYXNzPSJmZWVkYmFjayIgYXJpYS1saXZlPSJwb2xpdGUiPlfDpGhsZSBlaW5lbiBkZWluZXIgaGVsbGVuIFN0ZWluZS48L3A+CiAgICAgICAgPC9kaXY+CgogICAgICAgIDxhc2lkZSBjbGFzcz0ic2lkZS1wYW5lbCI+CiAgICAgICAgICA8c2VjdGlvbiBjbGFzcz0iY29hY2gtY2FyZCI+CiAgICAgICAgICAgIDxoMj5Db2FjaDwvaDI+CiAgICAgICAgICAgIDxwIGlkPSJjb2FjaC10ZXh0Ij5Lb250cm9sbGllcmUgZGllIE1pdHRlIHVuZCBhY2h0ZSBhdWYgU2NobGFncGZsaWNodC48L3A+CiAgICAgICAgICA8L3NlY3Rpb24+CgogICAgICAgICAgPHNlY3Rpb24gY2xhc3M9Im1pc3Npb24tY2FyZCI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1pc3Npb24taGVhZCI+CiAgICAgICAgICAgICAgPGgyPk1pc3Npb248L2gyPgogICAgICAgICAgICAgIDxzcGFuIGlkPSJtaXNzaW9uLWxhYmVsIj5FcsO2ZmZudW5nPC9zcGFuPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPHAgaWQ9Im1pc3Npb24tdGV4dCI+QnJpbmdlIGRlaW5lIFN0ZWluZSBzaWNoZXIgbmFjaCB2b3JuIHVuZCBiZXJlaXRlIGVpbmVuIFNjaGxhZ3p1ZyB2b3IuPC9wPgogICAgICAgICAgPC9zZWN0aW9uPgoKICAgICAgICAgIDxzZWN0aW9uIGNsYXNzPSJjYXB0dXJlLWNhcmQiPgogICAgICAgICAgICA8aDI+TWF0ZXJpYWw8L2gyPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJtYXRlcmlhbC1yb3ciPgogICAgICAgICAgICAgIDxzcGFuPkRlaW5lIFN0ZWluZTwvc3Bhbj4KICAgICAgICAgICAgICA8c3Ryb25nIGlkPSJwbGF5ZXItcGllY2VzIj4xMjwvc3Ryb25nPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ibWF0ZXJpYWwtcm93Ij4KICAgICAgICAgICAgICA8c3Bhbj5LSS1TdGVpbmU8L3NwYW4+CiAgICAgICAgICAgICAgPHN0cm9uZyBpZD0iYm90LXBpZWNlcyI+MTI8L3N0cm9uZz4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1hdGVyaWFsLXJvdyI+CiAgICAgICAgICAgICAgPHNwYW4+R2VzY2hsYWdlbjwvc3Bhbj4KICAgICAgICAgICAgICA8c3Ryb25nIGlkPSJjYXB0dXJlLXZhbHVlIj4wPC9zdHJvbmc+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9zZWN0aW9uPgoKICAgICAgICAgIDxzZWN0aW9uIGlkPSJydWxlcy1wYW5lbCIgY2xhc3M9InJ1bGVzLXBhbmVsIiBhcmlhLWxhYmVsPSJSZWdlbGhpbGZlIj4KICAgICAgICAgICAgPGgyPlJlZ2VsaGlsZmU8L2gyPgogICAgICAgICAgICA8dWw+CiAgICAgICAgICAgICAgPGxpPk5vcm1hbGUgU3RlaW5lIHppZWhlbiBlaW4gRmVsZCBkaWFnb25hbCB2b3J3w6RydHMuPC9saT4KICAgICAgICAgICAgICA8bGk+RWluIFNjaGxhZyDDvGJlcnNwcmluZ3QgZWluZW4gZ2VnbmVyaXNjaGVuIFN0ZWluIGF1ZiBlaW4gZnJlaWVzIEZlbGQuPC9saT4KICAgICAgICAgICAgICA8bGk+V2VubiBlaW4gU2NobGFnIG3DtmdsaWNoIGlzdCwgbXVzcyBlaW4gU2NobGFnIGdlc3BpZWx0IHdlcmRlbi48L2xpPgogICAgICAgICAgICAgIDxsaT5OYWNoIGVpbmVtIFNjaGxhZyB3aXJkIGVpbiB3ZWl0ZXJlciBTY2hsYWcgbWl0IGRlbXNlbGJlbiBTdGVpbiBzb2ZvcnQgZm9ydGdlc2V0enQuPC9saT4KICAgICAgICAgICAgICA8bGk+QXVmIGRlciBHcnVuZHJlaWhlIGRlciBHZWdlbnNlaXRlIHdpcmQgZWluIFN0ZWluIHp1ciBEYW1lLjwvbGk+CiAgICAgICAgICAgIDwvdWw+CiAgICAgICAgICA8L3NlY3Rpb24+CiAgICAgICAgPC9hc2lkZT4KICAgICAgPC9zZWN0aW9uPgogICAgPC9zZWN0aW9uPgoKICAgIDxzZWN0aW9uIGlkPSJlbmQtc2NyZWVuIiBjbGFzcz0ic2NyZWVuIiBhcmlhLWxhYmVsbGVkYnk9InJlc3VsdC10aXRsZSI+CiAgICAgIDxkaXYgY2xhc3M9InJlc3VsdC1jYXJkIj4KICAgICAgICA8cCBjbGFzcz0iZXllYnJvdyI+UGFydGllIGJlZW5kZXQ8L3A+CiAgICAgICAgPGgxIGlkPSJyZXN1bHQtdGl0bGUiPkF1c3dlcnR1bmc8L2gxPgogICAgICAgIDxwIGlkPSJyZXN1bHQtdGV4dCI+RHUgaGFzdCBkaWUgUGFydGllIGFiZ2VzY2hsb3NzZW4uPC9wPgogICAgICAgIDxkaXYgY2xhc3M9InJlc3VsdC1zdGF0cyI+CiAgICAgICAgICA8ZGl2PgogICAgICAgICAgICA8c3Bhbj5QdW5rdGU8L3NwYW4+CiAgICAgICAgICAgIDxzdHJvbmcgaWQ9ImZpbmFsLXNjb3JlIj4wPC9zdHJvbmc+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgIDxzcGFuPlplaXQ8L3NwYW4+CiAgICAgICAgICAgIDxzdHJvbmcgaWQ9ImZpbmFsLXRpbWUiPjAwOjAwPC9zdHJvbmc+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgIDxzcGFuPkxlcm5zdHVmZTwvc3Bhbj4KICAgICAgICAgICAgPHN0cm9uZyBpZD0iZmluYWwtbGV2ZWwiPjE8L3N0cm9uZz4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9Imhlcm8tYWN0aW9ucyI+CiAgICAgICAgICA8YnV0dG9uIGlkPSJwbGF5LWFnYWluLWJ1dHRvbiIgY2xhc3M9InByaW1hcnktYnV0dG9uIiB0eXBlPSJidXR0b24iPk5vY2ggZWluZSBQYXJ0aWU8L2J1dHRvbj4KICAgICAgICAgIDxidXR0b24gaWQ9ImVuZC1tZW51LWJ1dHRvbiIgY2xhc3M9InNlY29uZGFyeS1idXR0b24iIHR5cGU9ImJ1dHRvbiI+WnVtIE1lbsO8PC9idXR0b24+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgPC9zZWN0aW9uPgoKICAgIDxkaXYgaWQ9InRvYXN0IiBjbGFzcz0idG9hc3QiIHJvbGU9InN0YXR1cyIgYXJpYS1saXZlPSJwb2xpdGUiPjwvZGl2PgogIDwvbWFpbj4KCiAgCjxzY3JpcHQ+CigoKSA9PiB7CiAgInVzZSBzdHJpY3QiOwoKICBjb25zdCBCT0FSRF9TSVpFID0gODsKICBjb25zdCBTSURFX1BMQVlFUiA9ICJwbGF5ZXIiOwogIGNvbnN0IFNJREVfQk9UID0gImJvdCI7CiAgY29uc3QgTEVUVEVSUyA9IFsiQSIsICJCIiwgIkMiLCAiRCIsICJFIiwgIkYiLCAiRyIsICJIIl07CgogIGNvbnN0IGRpZmZpY3VsdHlOYW1lcyA9IHsKICAgIGVhc3k6ICJFaW5zdGVpZ2VyIiwKICAgIGJhbGFuY2VkOiAiRm9ydGdlc2Nocml0dGVuIiwKICAgIGV4cGVydDogIlByb2ZpIgogIH07CgogIGNvbnN0IGxldmVsRGF0YSA9IFsKICAgIHsKICAgICAgdGhyZXNob2xkOiAwLAogICAgICBsYWJlbDogIkVyw7ZmZm51bmciLAogICAgICBtaXNzaW9uOiAiQnJpbmdlIGRlaW5lIFN0ZWluZSBzaWNoZXIgbmFjaCB2b3JuIHVuZCBiZXJlaXRlIGVpbmVuIFNjaGxhZ3p1ZyB2b3IuIiwKICAgICAgY29hY2g6ICJLb250cm9sbGllcmUgZGllIE1pdHRlIHVuZCB6aWVoZSBuaWNodCBqZWRlbiBSYW5kc3RlaW4gc29mb3J0IHdlZy4iCiAgICB9LAogICAgewogICAgICB0aHJlc2hvbGQ6IDgwLAogICAgICBsYWJlbDogIlRha3RpayIsCiAgICAgIG1pc3Npb246ICJOdXR6ZSBkaWUgU2NobGFncGZsaWNodDogTG9ja2UgZGllIEtJIGluIGVpbmVuIHVuZ8O8bnN0aWdlbiBTY2hsYWcuIiwKICAgICAgY29hY2g6ICJXZW5uIG1laHJlcmUgU2NobMOkZ2UgZHJvaGVuLCBzdWNoZSB6dWVyc3QgbmFjaCBkZW0gWnVnIG1pdCBBbnNjaGx1c3MuIgogICAgfSwKICAgIHsKICAgICAgdGhyZXNob2xkOiAxODAsCiAgICAgIGxhYmVsOiAiRGFtZW5sYXVmIiwKICAgICAgbWlzc2lvbjogIkVycmVpY2hlIGRpZSBnZWduZXJpc2NoZSBHcnVuZHJlaWhlIHVuZCBiaWxkZSBlaW5lIERhbWUuIiwKICAgICAgY29hY2g6ICJEYW1lbiBzaW5kIGJld2VnbGljaGVyLiBTaWNoZXJlIGRlbiBXZWcgbWl0IGJlbmFjaGJhcnRlbiBTdGVpbmVuLiIKICAgIH0sCiAgICB7CiAgICAgIHRocmVzaG9sZDogMzIwLAogICAgICBsYWJlbDogIkVuZHNwaWVsIiwKICAgICAgbWlzc2lvbjogIkhhbHRlIE1hdGVyaWFsdm9ydGVpbCwgYmxvY2tpZXJlIGRpZSBLSSB1bmQgZXJ6d2luZ2UgZGVuIFNpZWcuIiwKICAgICAgY29hY2g6ICJJbSBFbmRzcGllbCB6w6RobHQgWnVnendhbmc6IEJlZ3JlbnplIGRpZSBGZWxkZXIgZGVyIGdlZ25lcmlzY2hlbiBTdGVpbmUuIgogICAgfQogIF07CgogIGNvbnN0IGVsZW1lbnRzID0gewogICAgcm9vdDogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUtcm9vdCIpLAogICAgc3RhcnRTY3JlZW46IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzdGFydC1zY3JlZW4iKSwKICAgIHBsYXlTY3JlZW46IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJwbGF5LXNjcmVlbiIpLAogICAgZW5kU2NyZWVuOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZW5kLXNjcmVlbiIpLAogICAgc3RhcnRHYW1lQnV0dG9uOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgic3RhcnQtZ2FtZS1idXR0b24iKSwKICAgIHRyYWluaW5nR2FtZUJ1dHRvbjogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInRyYWluaW5nLWdhbWUtYnV0dG9uIiksCiAgICBzdGFydEZ1bGxzY3JlZW5CdXR0b246IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzdGFydC1mdWxsc2NyZWVuLWJ1dHRvbiIpLAogICAgZnVsbHNjcmVlbkJ1dHRvbjogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImZ1bGxzY3JlZW4tYnV0dG9uIiksCiAgICBkaWZmaWN1bHR5T3B0aW9uczogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImRpZmZpY3VsdHktb3B0aW9ucyIpLAogICAgcmVzZXRCdXR0b246IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJyZXNldC1idXR0b24iKSwKICAgIG1lbnVCdXR0b246IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJtZW51LWJ1dHRvbiIpLAogICAgaGludEJ1dHRvbjogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImhpbnQtYnV0dG9uIiksCiAgICBydWxlc0J1dHRvbjogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInJ1bGVzLWJ1dHRvbiIpLAogICAgcnVsZXNQYW5lbDogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInJ1bGVzLXBhbmVsIiksCiAgICBib2FyZDogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJvYXJkIiksCiAgICBmZWVkYmFjazogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImZlZWRiYWNrIiksCiAgICBzY29yZVZhbHVlOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgic2NvcmUtdmFsdWUiKSwKICAgIGxldmVsVmFsdWU6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJsZXZlbC12YWx1ZSIpLAogICAgdHVyblZhbHVlOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidHVybi12YWx1ZSIpLAogICAgdGltZVZhbHVlOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidGltZS12YWx1ZSIpLAogICAgcHJvZ3Jlc3NCYXI6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJwcm9ncmVzcy1iYXIiKSwKICAgIGNvYWNoVGV4dDogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvYWNoLXRleHQiKSwKICAgIG1pc3Npb25MYWJlbDogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm1pc3Npb24tbGFiZWwiKSwKICAgIG1pc3Npb25UZXh0OiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibWlzc2lvbi10ZXh0IiksCiAgICBwbGF5ZXJQaWVjZXM6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJwbGF5ZXItcGllY2VzIiksCiAgICBib3RQaWVjZXM6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJib3QtcGllY2VzIiksCiAgICBjYXB0dXJlVmFsdWU6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjYXB0dXJlLXZhbHVlIiksCiAgICB0b2FzdDogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInRvYXN0IiksCiAgICByZXN1bHRUaXRsZTogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInJlc3VsdC10aXRsZSIpLAogICAgcmVzdWx0VGV4dDogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInJlc3VsdC10ZXh0IiksCiAgICBmaW5hbFNjb3JlOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZmluYWwtc2NvcmUiKSwKICAgIGZpbmFsVGltZTogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImZpbmFsLXRpbWUiKSwKICAgIGZpbmFsTGV2ZWw6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJmaW5hbC1sZXZlbCIpLAogICAgcGxheUFnYWluQnV0dG9uOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicGxheS1hZ2Fpbi1idXR0b24iKSwKICAgIGVuZE1lbnVCdXR0b246IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJlbmQtbWVudS1idXR0b24iKQogIH07CgogIGxldCBib2FyZFN0YXRlID0gW107CiAgbGV0IHNlbGVjdGVkSW5kZXggPSBudWxsOwogIGxldCBsZWdhbE1vdmVzRm9yU2VsZWN0ZWQgPSBbXTsKICBsZXQgZm9yY2VkUGllY2VJbmRleCA9IG51bGw7CiAgbGV0IHR1cm4gPSBTSURFX1BMQVlFUjsKICBsZXQgc2NvcmUgPSAwOwogIGxldCBjYXB0dXJlcyA9IDA7CiAgbGV0IGVsYXBzZWRTZWNvbmRzID0gMDsKICBsZXQgdGltZXJJZCA9IG51bGw7CiAgbGV0IGJvdFRpbWVySWQgPSBudWxsOwogIGxldCB0b2FzdFRpbWVySWQgPSBudWxsOwogIGxldCBkaWZmaWN1bHR5ID0gImJhbGFuY2VkIjsKICBsZXQgYWN0aXZlU2NyZWVuID0gInN0YXJ0IjsKICBsZXQgbGFzdE1vdmUgPSBudWxsOwogIGxldCBoaW50TW92ZSA9IG51bGw7CiAgbGV0IGFpVGhpbmtpbmcgPSBmYWxzZTsKICBsZXQga2V5Ym9hcmRGb2N1c0luZGV4ID0gbnVsbDsKICBsZXQgZ2FtZUZpbmlzaGVkID0gZmFsc2U7CgogIGZ1bmN0aW9uIGluZGV4RnJvbVJvd0NvbChyb3csIGNvbCkgewogICAgcmV0dXJuIHJvdyAqIEJPQVJEX1NJWkUgKyBjb2w7CiAgfQoKICBmdW5jdGlvbiByb3dPZihpbmRleCkgewogICAgcmV0dXJuIE1hdGguZmxvb3IoaW5kZXggLyBCT0FSRF9TSVpFKTsKICB9CgogIGZ1bmN0aW9uIGNvbE9mKGluZGV4KSB7CiAgICByZXR1cm4gaW5kZXggJSBCT0FSRF9TSVpFOwogIH0KCiAgZnVuY3Rpb24gaXNJbnNpZGUocm93LCBjb2wpIHsKICAgIHJldHVybiByb3cgPj0gMCAmJiByb3cgPCBCT0FSRF9TSVpFICYmIGNvbCA+PSAwICYmIGNvbCA8IEJPQVJEX1NJWkU7CiAgfQoKICBmdW5jdGlvbiBpc0Rhcmsocm93LCBjb2wpIHsKICAgIHJldHVybiAocm93ICsgY29sKSAlIDIgPT09IDE7CiAgfQoKICBmdW5jdGlvbiBmaWVsZE5hbWUoaW5kZXgpIHsKICAgIGNvbnN0IHJvdyA9IHJvd09mKGluZGV4KTsKICAgIGNvbnN0IGNvbCA9IGNvbE9mKGluZGV4KTsKICAgIHJldHVybiBMRVRURVJTW2NvbF0gKyBTdHJpbmcoQk9BUkRfU0laRSAtIHJvdyk7CiAgfQoKICBmdW5jdGlvbiBlbmVteU9mKHNpZGUpIHsKICAgIHJldHVybiBzaWRlID09PSBTSURFX1BMQVlFUiA/IFNJREVfQk9UIDogU0lERV9QTEFZRVI7CiAgfQoKICBmdW5jdGlvbiBzZXR1cEJvYXJkKCkgewogICAgY29uc3QgbmV4dEJvYXJkID0gbmV3IEFycmF5KEJPQVJEX1NJWkUgKiBCT0FSRF9TSVpFKS5maWxsKG51bGwpOwogICAgZm9yIChsZXQgcm93ID0gMDsgcm93IDwgQk9BUkRfU0laRTsgcm93ICs9IDEpIHsKICAgICAgZm9yIChsZXQgY29sID0gMDsgY29sIDwgQk9BUkRfU0laRTsgY29sICs9IDEpIHsKICAgICAgICBpZiAoIWlzRGFyayhyb3csIGNvbCkpIHsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBjb25zdCBpbmRleCA9IGluZGV4RnJvbVJvd0NvbChyb3csIGNvbCk7CiAgICAgICAgaWYgKHJvdyA8IDMpIHsKICAgICAgICAgIG5leHRCb2FyZFtpbmRleF0gPSB7IHNpZGU6IFNJREVfQk9ULCBraW5nOiBmYWxzZSB9OwogICAgICAgIH0gZWxzZSBpZiAocm93ID4gNCkgewogICAgICAgICAgbmV4dEJvYXJkW2luZGV4XSA9IHsgc2lkZTogU0lERV9QTEFZRVIsIGtpbmc6IGZhbHNlIH07CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gbmV4dEJvYXJkOwogIH0KCiAgZnVuY3Rpb24gcmVzZXRHYW1lKCkgewogICAgY2xlYXJUaW1lcnMoKTsKICAgIGJvYXJkU3RhdGUgPSBzZXR1cEJvYXJkKCk7CiAgICBzZWxlY3RlZEluZGV4ID0gbnVsbDsKICAgIGxlZ2FsTW92ZXNGb3JTZWxlY3RlZCA9IFtdOwogICAgZm9yY2VkUGllY2VJbmRleCA9IG51bGw7CiAgICB0dXJuID0gU0lERV9QTEFZRVI7CiAgICBzY29yZSA9IDA7CiAgICBjYXB0dXJlcyA9IDA7CiAgICBlbGFwc2VkU2Vjb25kcyA9IDA7CiAgICBhaVRoaW5raW5nID0gZmFsc2U7CiAgICBnYW1lRmluaXNoZWQgPSBmYWxzZTsKICAgIGxhc3RNb3ZlID0gbnVsbDsKICAgIGhpbnRNb3ZlID0gbnVsbDsKICAgIGtleWJvYXJkRm9jdXNJbmRleCA9IGluZGV4RnJvbVJvd0NvbCg1LCAwKTsKICAgIHN0YXJ0VGltZXIoKTsKICAgIHNldEZlZWRiYWNrKCJXw6RobGUgZWluZW4gZGVpbmVyIGhlbGxlbiBTdGVpbmUuIFRpcHA6IEVudHdpY2tsZSB6dWVyc3QgZWluZW4gU3RlaW4genVyIE1pdHRlLiIsICIiKTsKICAgIHVwZGF0ZUh1ZCgpOwogICAgcmVuZGVyQm9hcmQoKTsKICB9CgogIGZ1bmN0aW9uIGNsZWFyVGltZXJzKCkgewogICAgaWYgKHRpbWVySWQgIT09IG51bGwpIHsKICAgICAgY2xlYXJJbnRlcnZhbCh0aW1lcklkKTsKICAgICAgdGltZXJJZCA9IG51bGw7CiAgICB9CiAgICBpZiAoYm90VGltZXJJZCAhPT0gbnVsbCkgewogICAgICBjbGVhclRpbWVvdXQoYm90VGltZXJJZCk7CiAgICAgIGJvdFRpbWVySWQgPSBudWxsOwogICAgfQogICAgaWYgKHRvYXN0VGltZXJJZCAhPT0gbnVsbCkgewogICAgICBjbGVhclRpbWVvdXQodG9hc3RUaW1lcklkKTsKICAgICAgdG9hc3RUaW1lcklkID0gbnVsbDsKICAgIH0KICB9CgogIGZ1bmN0aW9uIHNob3dTY3JlZW4obmFtZSkgewogICAgYWN0aXZlU2NyZWVuID0gbmFtZTsKICAgIGNvbnN0IG1hcCA9IHsKICAgICAgc3RhcnQ6IGVsZW1lbnRzLnN0YXJ0U2NyZWVuLAogICAgICBwbGF5OiBlbGVtZW50cy5wbGF5U2NyZWVuLAogICAgICBlbmQ6IGVsZW1lbnRzLmVuZFNjcmVlbgogICAgfTsKICAgIE9iamVjdC5rZXlzKG1hcCkuZm9yRWFjaCgoa2V5KSA9PiB7CiAgICAgIG1hcFtrZXldLmNsYXNzTGlzdC50b2dnbGUoInNjcmVlbi1hY3RpdmUiLCBrZXkgPT09IG5hbWUpOwogICAgfSk7CiAgfQoKICBmdW5jdGlvbiBzdGFydEdhbWUodHJhaW5pbmdNb2RlKSB7CiAgICBpZiAodHJhaW5pbmdNb2RlKSB7CiAgICAgIHNldERpZmZpY3VsdHkoImVhc3kiKTsKICAgICAgc2hvd1RvYXN0KCJUcmFpbmluZ3NydW5kZTogRGllIEtJIHNwaWVsdCBiZXd1c3N0IGxlaHJyZWljaC4iKTsKICAgIH0KICAgIHNob3dTY3JlZW4oInBsYXkiKTsKICAgIHJlc2V0R2FtZSgpOwogIH0KCiAgZnVuY3Rpb24gcmV0dXJuVG9NZW51KCkgewogICAgY2xlYXJUaW1lcnMoKTsKICAgIGdhbWVGaW5pc2hlZCA9IGZhbHNlOwogICAgc2hvd1NjcmVlbigic3RhcnQiKTsKICB9CgogIGZ1bmN0aW9uIHN0YXJ0VGltZXIoKSB7CiAgICBpZiAodGltZXJJZCAhPT0gbnVsbCkgewogICAgICBjbGVhckludGVydmFsKHRpbWVySWQpOwogICAgfQogICAgdGltZXJJZCA9IHNldEludGVydmFsKCgpID0+IHsKICAgICAgZWxhcHNlZFNlY29uZHMgKz0gMTsKICAgICAgdXBkYXRlSHVkKCk7CiAgICB9LCAxMDAwKTsKICB9CgogIGZ1bmN0aW9uIGZvcm1hdFRpbWUoc2Vjb25kcykgewogICAgY29uc3QgbWludXRlcyA9IE1hdGguZmxvb3Ioc2Vjb25kcyAvIDYwKTsKICAgIGNvbnN0IHJlc3QgPSBzZWNvbmRzICUgNjA7CiAgICByZXR1cm4gU3RyaW5nKG1pbnV0ZXMpLnBhZFN0YXJ0KDIsICIwIikgKyAiOiIgKyBTdHJpbmcocmVzdCkucGFkU3RhcnQoMiwgIjAiKTsKICB9CgogIGZ1bmN0aW9uIGRpcmVjdGlvbnNGb3JQaWVjZShwaWVjZSkgewogICAgaWYgKHBpZWNlLmtpbmcpIHsKICAgICAgcmV0dXJuIFsKICAgICAgICBbLTEsIC0xXSwKICAgICAgICBbLTEsIDFdLAogICAgICAgIFsxLCAtMV0sCiAgICAgICAgWzEsIDFdCiAgICAgIF07CiAgICB9CiAgICBpZiAocGllY2Uuc2lkZSA9PT0gU0lERV9QTEFZRVIpIHsKICAgICAgcmV0dXJuIFsKICAgICAgICBbLTEsIC0xXSwKICAgICAgICBbLTEsIDFdCiAgICAgIF07CiAgICB9CiAgICByZXR1cm4gWwogICAgICBbMSwgLTFdLAogICAgICBbMSwgMV0KICAgIF07CiAgfQoKICBmdW5jdGlvbiBnZXRNb3Zlc0ZvclBpZWNlKHN0YXRlLCBpbmRleCwgY2FwdHVyZXNPbmx5KSB7CiAgICBjb25zdCBwaWVjZSA9IHN0YXRlW2luZGV4XTsKICAgIGlmICghcGllY2UpIHsKICAgICAgcmV0dXJuIFtdOwogICAgfQoKICAgIGNvbnN0IG1vdmVzID0gW107CiAgICBjb25zdCByb3cgPSByb3dPZihpbmRleCk7CiAgICBjb25zdCBjb2wgPSBjb2xPZihpbmRleCk7CiAgICBjb25zdCBkaXJlY3Rpb25zID0gZGlyZWN0aW9uc0ZvclBpZWNlKHBpZWNlKTsKCiAgICBkaXJlY3Rpb25zLmZvckVhY2goKGRpcmVjdGlvbikgPT4gewogICAgICBjb25zdCBtaWRSb3cgPSByb3cgKyBkaXJlY3Rpb25bMF07CiAgICAgIGNvbnN0IG1pZENvbCA9IGNvbCArIGRpcmVjdGlvblsxXTsKICAgICAgY29uc3QgbGFuZFJvdyA9IHJvdyArIGRpcmVjdGlvblswXSAqIDI7CiAgICAgIGNvbnN0IGxhbmRDb2wgPSBjb2wgKyBkaXJlY3Rpb25bMV0gKiAyOwoKICAgICAgaWYgKGlzSW5zaWRlKG1pZFJvdywgbWlkQ29sKSkgewogICAgICAgIGNvbnN0IG1pZEluZGV4ID0gaW5kZXhGcm9tUm93Q29sKG1pZFJvdywgbWlkQ29sKTsKICAgICAgICBjb25zdCBtaWRQaWVjZSA9IHN0YXRlW21pZEluZGV4XTsKCiAgICAgICAgaWYgKCFjYXB0dXJlc09ubHkgJiYgIW1pZFBpZWNlKSB7CiAgICAgICAgICBtb3Zlcy5wdXNoKHsKICAgICAgICAgICAgZnJvbTogaW5kZXgsCiAgICAgICAgICAgIHRvOiBtaWRJbmRleCwKICAgICAgICAgICAgY2FwdHVyZWQ6IG51bGwKICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgaWYgKGlzSW5zaWRlKGxhbmRSb3csIGxhbmRDb2wpICYmIG1pZFBpZWNlICYmIG1pZFBpZWNlLnNpZGUgIT09IHBpZWNlLnNpZGUpIHsKICAgICAgICAgIGNvbnN0IGxhbmRJbmRleCA9IGluZGV4RnJvbVJvd0NvbChsYW5kUm93LCBsYW5kQ29sKTsKICAgICAgICAgIGlmICghc3RhdGVbbGFuZEluZGV4XSkgewogICAgICAgICAgICBtb3Zlcy5wdXNoKHsKICAgICAgICAgICAgICBmcm9tOiBpbmRleCwKICAgICAgICAgICAgICB0bzogbGFuZEluZGV4LAogICAgICAgICAgICAgIGNhcHR1cmVkOiBtaWRJbmRleAogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0pOwoKICAgIGlmIChjYXB0dXJlc09ubHkpIHsKICAgICAgcmV0dXJuIG1vdmVzLmZpbHRlcigobW92ZSkgPT4gbW92ZS5jYXB0dXJlZCAhPT0gbnVsbCk7CiAgICB9CiAgICByZXR1cm4gbW92ZXM7CiAgfQoKICBmdW5jdGlvbiBnZXRBbGxDYXB0dXJlcyhzdGF0ZSwgc2lkZSwgb25seUluZGV4KSB7CiAgICBjb25zdCBjYXB0dXJlc0xpc3QgPSBbXTsKICAgIHN0YXRlLmZvckVhY2goKHBpZWNlLCBpbmRleCkgPT4gewogICAgICBpZiAoIXBpZWNlIHx8IHBpZWNlLnNpZGUgIT09IHNpZGUpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgaWYgKG9ubHlJbmRleCAhPT0gbnVsbCAmJiBpbmRleCAhPT0gb25seUluZGV4KSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGdldE1vdmVzRm9yUGllY2Uoc3RhdGUsIGluZGV4LCB0cnVlKS5mb3JFYWNoKChtb3ZlKSA9PiBjYXB0dXJlc0xpc3QucHVzaChtb3ZlKSk7CiAgICB9KTsKICAgIHJldHVybiBjYXB0dXJlc0xpc3Q7CiAgfQoKICBmdW5jdGlvbiBnZXRBbGxMZWdhbE1vdmVzKHN0YXRlLCBzaWRlLCBvbmx5SW5kZXgpIHsKICAgIGNvbnN0IGZvcmNlZENhcHR1cmVzID0gZ2V0QWxsQ2FwdHVyZXMoc3RhdGUsIHNpZGUsIG9ubHlJbmRleCk7CiAgICBpZiAoZm9yY2VkQ2FwdHVyZXMubGVuZ3RoID4gMCkgewogICAgICByZXR1cm4gZm9yY2VkQ2FwdHVyZXM7CiAgICB9CiAgICBpZiAob25seUluZGV4ICE9PSBudWxsKSB7CiAgICAgIHJldHVybiBbXTsKICAgIH0KICAgIGNvbnN0IG1vdmVzID0gW107CiAgICBzdGF0ZS5mb3JFYWNoKChwaWVjZSwgaW5kZXgpID0+IHsKICAgICAgaWYgKHBpZWNlICYmIHBpZWNlLnNpZGUgPT09IHNpZGUpIHsKICAgICAgICBnZXRNb3Zlc0ZvclBpZWNlKHN0YXRlLCBpbmRleCwgZmFsc2UpCiAgICAgICAgICAuZmlsdGVyKChtb3ZlKSA9PiBtb3ZlLmNhcHR1cmVkID09PSBudWxsKQogICAgICAgICAgLmZvckVhY2goKG1vdmUpID0+IG1vdmVzLnB1c2gobW92ZSkpOwogICAgICB9CiAgICB9KTsKICAgIHJldHVybiBtb3ZlczsKICB9CgogIGZ1bmN0aW9uIGNsb25lQm9hcmQoc3RhdGUpIHsKICAgIHJldHVybiBzdGF0ZS5tYXAoKHBpZWNlKSA9PiB7CiAgICAgIGlmICghcGllY2UpIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICByZXR1cm4geyBzaWRlOiBwaWVjZS5zaWRlLCBraW5nOiBwaWVjZS5raW5nIH07CiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIGFwcGx5TW92ZVRvU3RhdGUoc3RhdGUsIG1vdmUpIHsKICAgIGNvbnN0IHBpZWNlID0gc3RhdGVbbW92ZS5mcm9tXTsKICAgIGNvbnN0IGNhcHR1cmVkUGllY2UgPSBtb3ZlLmNhcHR1cmVkID09PSBudWxsID8gbnVsbCA6IHN0YXRlW21vdmUuY2FwdHVyZWRdOwogICAgc3RhdGVbbW92ZS5mcm9tXSA9IG51bGw7CiAgICBzdGF0ZVttb3ZlLnRvXSA9IHBpZWNlOwogICAgaWYgKG1vdmUuY2FwdHVyZWQgIT09IG51bGwpIHsKICAgICAgc3RhdGVbbW92ZS5jYXB0dXJlZF0gPSBudWxsOwogICAgfQoKICAgIGxldCBwcm9tb3RlZCA9IGZhbHNlOwogICAgY29uc3Qgcm93ID0gcm93T2YobW92ZS50byk7CiAgICBpZiAocGllY2UgJiYgIXBpZWNlLmtpbmcpIHsKICAgICAgaWYgKChwaWVjZS5zaWRlID09PSBTSURFX1BMQVlFUiAmJiByb3cgPT09IDApIHx8IChwaWVjZS5zaWRlID09PSBTSURFX0JPVCAmJiByb3cgPT09IEJPQVJEX1NJWkUgLSAxKSkgewogICAgICAgIHBpZWNlLmtpbmcgPSB0cnVlOwogICAgICAgIHByb21vdGVkID0gdHJ1ZTsKICAgICAgfQogICAgfQoKICAgIHJldHVybiB7IHBpZWNlLCBjYXB0dXJlZFBpZWNlLCBwcm9tb3RlZCB9OwogIH0KCiAgZnVuY3Rpb24gY291bnRQaWVjZXMoc2lkZSkgewogICAgcmV0dXJuIGJvYXJkU3RhdGUuZmlsdGVyKChwaWVjZSkgPT4gcGllY2UgJiYgcGllY2Uuc2lkZSA9PT0gc2lkZSkubGVuZ3RoOwogIH0KCiAgZnVuY3Rpb24gY291bnRLaW5ncyhzdGF0ZSwgc2lkZSkgewogICAgcmV0dXJuIHN0YXRlLmZpbHRlcigocGllY2UpID0+IHBpZWNlICYmIHBpZWNlLnNpZGUgPT09IHNpZGUgJiYgcGllY2Uua2luZykubGVuZ3RoOwogIH0KCiAgZnVuY3Rpb24gc2V0RmVlZGJhY2sobWVzc2FnZSwgdG9uZSkgewogICAgZWxlbWVudHMuZmVlZGJhY2sudGV4dENvbnRlbnQgPSBtZXNzYWdlOwogICAgZWxlbWVudHMuZmVlZGJhY2suY2xhc3NMaXN0LnJlbW92ZSgiZ29vZCIsICJiYWQiKTsKICAgIGlmICh0b25lID09PSAiZ29vZCIpIHsKICAgICAgZWxlbWVudHMuZmVlZGJhY2suY2xhc3NMaXN0LmFkZCgiZ29vZCIpOwogICAgfSBlbHNlIGlmICh0b25lID09PSAiYmFkIikgewogICAgICBlbGVtZW50cy5mZWVkYmFjay5jbGFzc0xpc3QuYWRkKCJiYWQiKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIHNob3dUb2FzdChtZXNzYWdlKSB7CiAgICBlbGVtZW50cy50b2FzdC50ZXh0Q29udGVudCA9IG1lc3NhZ2U7CiAgICBlbGVtZW50cy50b2FzdC5jbGFzc0xpc3QuYWRkKCJ0b2FzdC12aXNpYmxlIik7CiAgICBpZiAodG9hc3RUaW1lcklkICE9PSBudWxsKSB7CiAgICAgIGNsZWFyVGltZW91dCh0b2FzdFRpbWVySWQpOwogICAgfQogICAgdG9hc3RUaW1lcklkID0gc2V0VGltZW91dCgoKSA9PiB7CiAgICAgIGVsZW1lbnRzLnRvYXN0LmNsYXNzTGlzdC5yZW1vdmUoInRvYXN0LXZpc2libGUiKTsKICAgIH0sIDIyMDApOwogIH0KCiAgZnVuY3Rpb24gdXBkYXRlSHVkKCkgewogICAgY29uc3QgbGV2ZWxJbmRleCA9IGdldExldmVsSW5kZXgoKTsKICAgIGNvbnN0IGxldmVsID0gbGV2ZWxJbmRleCArIDE7CiAgICBjb25zdCBuZXh0TGV2ZWwgPSBsZXZlbERhdGFbTWF0aC5taW4obGV2ZWxJbmRleCArIDEsIGxldmVsRGF0YS5sZW5ndGggLSAxKV07CiAgICBjb25zdCBjdXJyZW50TGV2ZWwgPSBsZXZlbERhdGFbbGV2ZWxJbmRleF07CiAgICBjb25zdCBiYXNlID0gY3VycmVudExldmVsLnRocmVzaG9sZDsKICAgIGNvbnN0IHRhcmdldCA9IG5leHRMZXZlbC50aHJlc2hvbGQgPT09IGJhc2UgPyBiYXNlICsgMTIwIDogbmV4dExldmVsLnRocmVzaG9sZDsKICAgIGNvbnN0IHByb2dyZXNzID0gTWF0aC5tYXgoNCwgTWF0aC5taW4oMTAwLCAoKHNjb3JlIC0gYmFzZSkgLyAodGFyZ2V0IC0gYmFzZSkpICogMTAwKSk7CgogICAgZWxlbWVudHMuc2NvcmVWYWx1ZS50ZXh0Q29udGVudCA9IFN0cmluZyhzY29yZSk7CiAgICBlbGVtZW50cy5sZXZlbFZhbHVlLnRleHRDb250ZW50ID0gU3RyaW5nKGxldmVsKTsKICAgIGVsZW1lbnRzLnR1cm5WYWx1ZS50ZXh0Q29udGVudCA9IHR1cm4gPT09IFNJREVfUExBWUVSID8gIkR1IiA6ICJLSSI7CiAgICBlbGVtZW50cy50aW1lVmFsdWUudGV4dENvbnRlbnQgPSBmb3JtYXRUaW1lKGVsYXBzZWRTZWNvbmRzKTsKICAgIGVsZW1lbnRzLnByb2dyZXNzQmFyLnN0eWxlLndpZHRoID0gU3RyaW5nKHByb2dyZXNzKSArICIlIjsKICAgIGVsZW1lbnRzLmNvYWNoVGV4dC50ZXh0Q29udGVudCA9IGN1cnJlbnRMZXZlbC5jb2FjaDsKICAgIGVsZW1lbnRzLm1pc3Npb25MYWJlbC50ZXh0Q29udGVudCA9IGN1cnJlbnRMZXZlbC5sYWJlbDsKICAgIGVsZW1lbnRzLm1pc3Npb25UZXh0LnRleHRDb250ZW50ID0gY3VycmVudExldmVsLm1pc3Npb247CiAgICBlbGVtZW50cy5wbGF5ZXJQaWVjZXMudGV4dENvbnRlbnQgPSBTdHJpbmcoY291bnRQaWVjZXMoU0lERV9QTEFZRVIpKTsKICAgIGVsZW1lbnRzLmJvdFBpZWNlcy50ZXh0Q29udGVudCA9IFN0cmluZyhjb3VudFBpZWNlcyhTSURFX0JPVCkpOwogICAgZWxlbWVudHMuY2FwdHVyZVZhbHVlLnRleHRDb250ZW50ID0gU3RyaW5nKGNhcHR1cmVzKTsKICB9CgogIGZ1bmN0aW9uIGdldExldmVsSW5kZXgoKSB7CiAgICBsZXQgaW5kZXggPSAwOwogICAgbGV2ZWxEYXRhLmZvckVhY2goKGxldmVsLCBsZXZlbEluZGV4KSA9PiB7CiAgICAgIGlmIChzY29yZSA+PSBsZXZlbC50aHJlc2hvbGQpIHsKICAgICAgICBpbmRleCA9IGxldmVsSW5kZXg7CiAgICAgIH0KICAgIH0pOwogICAgcmV0dXJuIGluZGV4OwogIH0KCiAgZnVuY3Rpb24gcGllY2VMYWJlbChwaWVjZSkgewogICAgaWYgKCFwaWVjZSkgewogICAgICByZXR1cm4gImxlZXIiOwogICAgfQogICAgY29uc3Qgb3duZXIgPSBwaWVjZS5zaWRlID09PSBTSURFX1BMQVlFUiA/ICJkZWluIiA6ICJnZWduZXJpc2NoZXIiOwogICAgcmV0dXJuIHBpZWNlLmtpbmcgPyBvd25lciArICIgRGFtZS1TdGVpbiIgOiBvd25lciArICIgU3RlaW4iOwogIH0KCiAgZnVuY3Rpb24gcmVuZGVyQm9hcmQoKSB7CiAgICB3aGlsZSAoZWxlbWVudHMuYm9hcmQuZmlyc3RDaGlsZCkgewogICAgICBlbGVtZW50cy5ib2FyZC5yZW1vdmVDaGlsZChlbGVtZW50cy5ib2FyZC5maXJzdENoaWxkKTsKICAgIH0KCiAgICBjb25zdCBsZWdhbFRhcmdldHMgPSBsZWdhbE1vdmVzRm9yU2VsZWN0ZWQubWFwKChtb3ZlKSA9PiBtb3ZlLnRvKTsKICAgIGNvbnN0IGNhcHR1cmVUYXJnZXRzID0gbGVnYWxNb3Zlc0ZvclNlbGVjdGVkCiAgICAgIC5maWx0ZXIoKG1vdmUpID0+IG1vdmUuY2FwdHVyZWQgIT09IG51bGwpCiAgICAgIC5tYXAoKG1vdmUpID0+IG1vdmUudG8pOwoKICAgIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8IEJPQVJEX1NJWkU7IHJvdyArPSAxKSB7CiAgICAgIGZvciAobGV0IGNvbCA9IDA7IGNvbCA8IEJPQVJEX1NJWkU7IGNvbCArPSAxKSB7CiAgICAgICAgY29uc3QgaW5kZXggPSBpbmRleEZyb21Sb3dDb2wocm93LCBjb2wpOwogICAgICAgIGNvbnN0IGRhcmsgPSBpc0Rhcmsocm93LCBjb2wpOwogICAgICAgIGNvbnN0IHNxdWFyZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoZGFyayA/ICJidXR0b24iIDogImRpdiIpOwogICAgICAgIHNxdWFyZS5jbGFzc05hbWUgPSBkYXJrID8gInNxdWFyZSBkYXJrIiA6ICJzcXVhcmUgbGlnaHQiOwogICAgICAgIHNxdWFyZS5zZXRBdHRyaWJ1dGUoInJvbGUiLCBkYXJrID8gImdyaWRjZWxsIiA6ICJwcmVzZW50YXRpb24iKTsKICAgICAgICBzcXVhcmUuZGF0YXNldC5pbmRleCA9IFN0cmluZyhpbmRleCk7CgogICAgICAgIGlmICghZGFyaykgewogICAgICAgICAgZWxlbWVudHMuYm9hcmQuYXBwZW5kQ2hpbGQoc3F1YXJlKTsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KCiAgICAgICAgc3F1YXJlLnR5cGUgPSAiYnV0dG9uIjsKICAgICAgICBzcXVhcmUuZGF0YXNldC5maWVsZCA9IGZpZWxkTmFtZShpbmRleCk7CiAgICAgICAgc3F1YXJlLnNldEF0dHJpYnV0ZSgiYXJpYS1sYWJlbCIsIGZpZWxkTmFtZShpbmRleCkgKyAiOiAiICsgcGllY2VMYWJlbChib2FyZFN0YXRlW2luZGV4XSkpOwogICAgICAgIHNxdWFyZS50YWJJbmRleCA9IGluZGV4ID09PSBrZXlib2FyZEZvY3VzSW5kZXggPyAwIDogLTE7CgogICAgICAgIGlmIChpbmRleCA9PT0gc2VsZWN0ZWRJbmRleCkgewogICAgICAgICAgc3F1YXJlLmNsYXNzTGlzdC5hZGQoInNlbGVjdGVkIik7CiAgICAgICAgfQogICAgICAgIGlmIChsZWdhbFRhcmdldHMuaW5jbHVkZXMoaW5kZXgpKSB7CiAgICAgICAgICBzcXVhcmUuY2xhc3NMaXN0LmFkZCgidmFsaWQiKTsKICAgICAgICB9CiAgICAgICAgaWYgKGNhcHR1cmVUYXJnZXRzLmluY2x1ZGVzKGluZGV4KSkgewogICAgICAgICAgc3F1YXJlLmNsYXNzTGlzdC5hZGQoImNhcHR1cmUtdGFyZ2V0Iik7CiAgICAgICAgfQogICAgICAgIGlmIChoaW50TW92ZSAmJiAoaGludE1vdmUuZnJvbSA9PT0gaW5kZXggfHwgaGludE1vdmUudG8gPT09IGluZGV4KSkgewogICAgICAgICAgc3F1YXJlLmNsYXNzTGlzdC5hZGQoImhpbnQiKTsKICAgICAgICB9CiAgICAgICAgaWYgKGxhc3RNb3ZlICYmIChsYXN0TW92ZS5mcm9tID09PSBpbmRleCB8fCBsYXN0TW92ZS50byA9PT0gaW5kZXgpKSB7CiAgICAgICAgICBzcXVhcmUuY2xhc3NMaXN0LmFkZCgibGFzdC1tb3ZlIik7CiAgICAgICAgfQoKICAgICAgICBjb25zdCBwaWVjZSA9IGJvYXJkU3RhdGVbaW5kZXhdOwogICAgICAgIGlmIChwaWVjZSkgewogICAgICAgICAgc3F1YXJlLmFwcGVuZENoaWxkKGNyZWF0ZVBpZWNlTm9kZShwaWVjZSkpOwogICAgICAgIH0KCiAgICAgICAgZWxlbWVudHMuYm9hcmQuYXBwZW5kQ2hpbGQoc3F1YXJlKTsKICAgICAgfQogICAgfQogIH0KCiAgZnVuY3Rpb24gY3JlYXRlUGllY2VOb2RlKHBpZWNlKSB7CiAgICBjb25zdCBub2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpOwogICAgbm9kZS5jbGFzc05hbWUgPSAicGllY2UgIiArIHBpZWNlLnNpZGUgKyAocGllY2Uua2luZyA/ICIga2luZyIgOiAiIik7CiAgICBjb25zdCBtYXJrID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpOwogICAgbWFyay5jbGFzc05hbWUgPSAicGllY2UtbWFyayI7CiAgICBtYXJrLnRleHRDb250ZW50ID0gcGllY2Uua2luZyA/ICJEIiA6ICIiOwogICAgbm9kZS5hcHBlbmRDaGlsZChtYXJrKTsKICAgIHJldHVybiBub2RlOwogIH0KCiAgZnVuY3Rpb24gc2VsZWN0UGllY2UoaW5kZXgpIHsKICAgIGNvbnN0IHBpZWNlID0gYm9hcmRTdGF0ZVtpbmRleF07CiAgICBpZiAoIXBpZWNlIHx8IHBpZWNlLnNpZGUgIT09IFNJREVfUExBWUVSKSB7CiAgICAgIHNldEZlZWRiYWNrKCJXw6RobGUgZWluZW4gZWlnZW5lbiBoZWxsZW4gU3RlaW4uIiwgImJhZCIpOwogICAgICByZXR1cm47CiAgICB9CgogICAgY29uc3QgYWxsTW92ZXMgPSBnZXRBbGxMZWdhbE1vdmVzKGJvYXJkU3RhdGUsIFNJREVfUExBWUVSLCBmb3JjZWRQaWVjZUluZGV4KTsKICAgIGNvbnN0IG1vdmVzID0gYWxsTW92ZXMuZmlsdGVyKChtb3ZlKSA9PiBtb3ZlLmZyb20gPT09IGluZGV4KTsKCiAgICBpZiAobW92ZXMubGVuZ3RoID09PSAwKSB7CiAgICAgIGlmIChhbGxNb3Zlcy5zb21lKChtb3ZlKSA9PiBtb3ZlLmNhcHR1cmVkICE9PSBudWxsKSkgewogICAgICAgIHNldEZlZWRiYWNrKCJTY2hsYWdwZmxpY2h0OiBFaW4gYW5kZXJlciBTdGVpbiBtdXNzIHNjaGxhZ2VuLiIsICJiYWQiKTsKICAgICAgfSBlbHNlIGlmIChmb3JjZWRQaWVjZUluZGV4ICE9PSBudWxsKSB7CiAgICAgICAgc2V0RmVlZGJhY2soIkRlciBNZWhyZmFjaHNjaGxhZyBtdXNzIG1pdCBkZW1zZWxiZW4gU3RlaW4gZm9ydGdlc2V0enQgd2VyZGVuLiIsICJiYWQiKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBzZXRGZWVkYmFjaygiRGllc2VyIFN0ZWluIGhhdCBnZXJhZGUga2VpbmVuIGxlZ2FsZW4gWnVnLiIsICJiYWQiKTsKICAgICAgfQogICAgICBzZWxlY3RlZEluZGV4ID0gbnVsbDsKICAgICAgbGVnYWxNb3Zlc0ZvclNlbGVjdGVkID0gW107CiAgICAgIHJlbmRlckJvYXJkKCk7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBzZWxlY3RlZEluZGV4ID0gaW5kZXg7CiAgICBsZWdhbE1vdmVzRm9yU2VsZWN0ZWQgPSBtb3ZlczsKICAgIGhpbnRNb3ZlID0gbnVsbDsKICAgIGNvbnN0IGNhcHR1cmVzSGVyZSA9IG1vdmVzLmZpbHRlcigobW92ZSkgPT4gbW92ZS5jYXB0dXJlZCAhPT0gbnVsbCkubGVuZ3RoOwogICAgaWYgKGNhcHR1cmVzSGVyZSA+IDApIHsKICAgICAgc2V0RmVlZGJhY2soIlNjaGxhZ3p1ZyBnZWZ1bmRlbjogV8OkaGxlIGVpbiBnb2xkZW4gbWFya2llcnRlcyBaaWVsZmVsZC4iLCAiZ29vZCIpOwogICAgfSBlbHNlIHsKICAgICAgc2V0RmVlZGJhY2soIlfDpGhsZSBlaW4gZ3LDvG5lcyBaaWVsZmVsZCBmw7xyIGRlaW5lbiBadWcuIiwgIiIpOwogICAgfQogICAgcmVuZGVyQm9hcmQoKTsKICB9CgogIGZ1bmN0aW9uIGhhbmRsZVNxdWFyZUFjdGlvbihpbmRleCkgewogICAgaWYgKGFjdGl2ZVNjcmVlbiAhPT0gInBsYXkiIHx8IGdhbWVGaW5pc2hlZCkgewogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoYWlUaGlua2luZyB8fCB0dXJuICE9PSBTSURFX1BMQVlFUikgewogICAgICBzZXRGZWVkYmFjaygiRGllIEtJIGRlbmt0IGdlcmFkZS4gRGFuYWNoIGJpc3QgZHUgd2llZGVyIGFtIFp1Zy4iLCAiIik7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBrZXlib2FyZEZvY3VzSW5kZXggPSBpbmRleDsKICAgIGNvbnN0IGNob3Nlbk1vdmUgPSBsZWdhbE1vdmVzRm9yU2VsZWN0ZWQuZmluZCgobW92ZSkgPT4gbW92ZS50byA9PT0gaW5kZXgpOwogICAgaWYgKHNlbGVjdGVkSW5kZXggIT09IG51bGwgJiYgY2hvc2VuTW92ZSkgewogICAgICBwbGF5UGxheWVyTW92ZShjaG9zZW5Nb3ZlKTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIGNvbnN0IHBpZWNlID0gYm9hcmRTdGF0ZVtpbmRleF07CiAgICBpZiAocGllY2UgJiYgcGllY2Uuc2lkZSA9PT0gU0lERV9QTEFZRVIpIHsKICAgICAgc2VsZWN0UGllY2UoaW5kZXgpOwogICAgICByZXR1cm47CiAgICB9CgogICAgY29uc3QgYWxsTW92ZXMgPSBnZXRBbGxMZWdhbE1vdmVzKGJvYXJkU3RhdGUsIFNJREVfUExBWUVSLCBmb3JjZWRQaWVjZUluZGV4KTsKICAgIGlmIChhbGxNb3Zlcy5zb21lKChtb3ZlKSA9PiBtb3ZlLmNhcHR1cmVkICE9PSBudWxsKSkgewogICAgICBzZXRGZWVkYmFjaygiU2NobGFncGZsaWNodDogV8OkaGxlIGVpbmVuIFN0ZWluLCBkZXIgc2NobGFnZW4ga2Fubi4iLCAiYmFkIik7CiAgICB9IGVsc2UgewogICAgICBzZXRGZWVkYmFjaygiV8OkaGxlIHp1ZXJzdCBlaW5lbiBlaWdlbmVuIFN0ZWluLiIsICJiYWQiKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIHBsYXlQbGF5ZXJNb3ZlKG1vdmUpIHsKICAgIGhpbnRNb3ZlID0gbnVsbDsKICAgIGNvbnN0IG91dGNvbWUgPSBhcHBseU1vdmVUb1N0YXRlKGJvYXJkU3RhdGUsIG1vdmUpOwogICAgbGFzdE1vdmUgPSB7IGZyb206IG1vdmUuZnJvbSwgdG86IG1vdmUudG8gfTsKICAgIHNlbGVjdGVkSW5kZXggPSBudWxsOwogICAgbGVnYWxNb3Zlc0ZvclNlbGVjdGVkID0gW107CiAgICBrZXlib2FyZEZvY3VzSW5kZXggPSBtb3ZlLnRvOwoKICAgIGlmIChtb3ZlLmNhcHR1cmVkICE9PSBudWxsKSB7CiAgICAgIGNhcHR1cmVzICs9IDE7CiAgICAgIHNjb3JlICs9IDI1OwogICAgfSBlbHNlIHsKICAgICAgc2NvcmUgKz0gNTsKICAgIH0KCiAgICBpZiAob3V0Y29tZS5wcm9tb3RlZCkgewogICAgICBzY29yZSArPSAzNTsKICAgICAgc2hvd1RvYXN0KCJEYW1lIGdlYmlsZGV0OiArMzUgUHVua3RlIik7CiAgICB9CgogICAgaWYgKG1vdmUuY2FwdHVyZWQgIT09IG51bGwgJiYgIW91dGNvbWUucHJvbW90ZWQpIHsKICAgICAgY29uc3QgZm9sbG93VXBzID0gZ2V0QWxsTGVnYWxNb3Zlcyhib2FyZFN0YXRlLCBTSURFX1BMQVlFUiwgbW92ZS50byk7CiAgICAgIGlmIChmb2xsb3dVcHMubGVuZ3RoID4gMCkgewogICAgICAgIGZvcmNlZFBpZWNlSW5kZXggPSBtb3ZlLnRvOwogICAgICAgIHNlbGVjdGVkSW5kZXggPSBtb3ZlLnRvOwogICAgICAgIGxlZ2FsTW92ZXNGb3JTZWxlY3RlZCA9IGZvbGxvd1VwczsKICAgICAgICBzZXRGZWVkYmFjaygiU2VociBndXQhIERlciBNZWhyZmFjaHNjaGxhZyBtdXNzIG1pdCBkZW1zZWxiZW4gU3RlaW4gd2VpdGVyZ2VoZW4uIiwgImdvb2QiKTsKICAgICAgICB1cGRhdGVIdWQoKTsKICAgICAgICByZW5kZXJCb2FyZCgpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgfQoKICAgIGZvcmNlZFBpZWNlSW5kZXggPSBudWxsOwogICAgdXBkYXRlSHVkKCk7CiAgICByZW5kZXJCb2FyZCgpOwoKICAgIGlmIChjaGVja0dhbWVFbmQoKSkgewogICAgICByZXR1cm47CiAgICB9CgogICAgdHVybiA9IFNJREVfQk9UOwogICAgdXBkYXRlSHVkKCk7CiAgICBzZXRGZWVkYmFjaygiRGllIEtJIGlzdCBhbSBadWcuIiwgIiIpOwogICAgYWlUaGlua2luZyA9IHRydWU7CiAgICBib3RUaW1lcklkID0gc2V0VGltZW91dChwbGF5Qm90VHVybiwgNTIwKTsKICB9CgogIGZ1bmN0aW9uIHBsYXlCb3RUdXJuKCkgewogICAgaWYgKGdhbWVGaW5pc2hlZCkgewogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCBsZWdhbCA9IGdldEFsbExlZ2FsTW92ZXMoYm9hcmRTdGF0ZSwgU0lERV9CT1QsIGZvcmNlZFBpZWNlSW5kZXgpOwogICAgaWYgKGxlZ2FsLmxlbmd0aCA9PT0gMCkgewogICAgICBmaW5pc2hHYW1lKHRydWUsICJEaWUgS0kgaGF0IGtlaW5lbiBsZWdhbGVuIFp1ZyBtZWhyLiBEdSBoYXN0IGRpZSBTdGVsbHVuZyBibG9ja2llcnQuIik7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBjb25zdCBtb3ZlID0gY2hvb3NlQm90TW92ZShsZWdhbCk7CiAgICBjb25zdCBvdXRjb21lID0gYXBwbHlNb3ZlVG9TdGF0ZShib2FyZFN0YXRlLCBtb3ZlKTsKICAgIGxhc3RNb3ZlID0geyBmcm9tOiBtb3ZlLmZyb20sIHRvOiBtb3ZlLnRvIH07CgogICAgaWYgKG1vdmUuY2FwdHVyZWQgIT09IG51bGwpIHsKICAgICAgc2V0RmVlZGJhY2soIkRpZSBLSSBzY2hsw6RndCBhdWYgIiArIGZpZWxkTmFtZShtb3ZlLnRvKSArICIuIFByw7xmZSBqZXR6dCBHZWdlbnNjaGzDpGdlLiIsICJiYWQiKTsKICAgIH0gZWxzZSB7CiAgICAgIHNldEZlZWRiYWNrKCJEaWUgS0kgemllaHQgbmFjaCAiICsgZmllbGROYW1lKG1vdmUudG8pICsgIi4gRHUgYmlzdCBnbGVpY2ggd2llZGVyIGRyYW4uIiwgIiIpOwogICAgfQoKICAgIGlmIChvdXRjb21lLnByb21vdGVkKSB7CiAgICAgIHNob3dUb2FzdCgiRGllIEtJIGhhdCBlaW5lIERhbWUgZXJyZWljaHQuIik7CiAgICB9CgogICAgdXBkYXRlSHVkKCk7CiAgICByZW5kZXJCb2FyZCgpOwoKICAgIGlmIChtb3ZlLmNhcHR1cmVkICE9PSBudWxsICYmICFvdXRjb21lLnByb21vdGVkKSB7CiAgICAgIGNvbnN0IGZvbGxvd1VwcyA9IGdldEFsbExlZ2FsTW92ZXMoYm9hcmRTdGF0ZSwgU0lERV9CT1QsIG1vdmUudG8pOwogICAgICBpZiAoZm9sbG93VXBzLmxlbmd0aCA+IDApIHsKICAgICAgICBmb3JjZWRQaWVjZUluZGV4ID0gbW92ZS50bzsKICAgICAgICBib3RUaW1lcklkID0gc2V0VGltZW91dChwbGF5Qm90VHVybiwgNTAwKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgIH0KCiAgICBmb3JjZWRQaWVjZUluZGV4ID0gbnVsbDsKICAgIGFpVGhpbmtpbmcgPSBmYWxzZTsKCiAgICBpZiAoY2hlY2tHYW1lRW5kKCkpIHsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIHR1cm4gPSBTSURFX1BMQVlFUjsKICAgIGNvbnN0IHBsYXllck1vdmVzID0gZ2V0QWxsTGVnYWxNb3Zlcyhib2FyZFN0YXRlLCBTSURFX1BMQVlFUiwgbnVsbCk7CiAgICBpZiAocGxheWVyTW92ZXMubGVuZ3RoID09PSAwKSB7CiAgICAgIGZpbmlzaEdhbWUoZmFsc2UsICJEdSBoYXN0IGtlaW5lbiBsZWdhbGVuIFp1ZyBtZWhyLiBEaWUgS0kgZ2V3aW5udCBkdXJjaCBCbG9ja2FkZS4iKTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIGNvbnN0IGNhcHR1cmVzUmVhZHkgPSBwbGF5ZXJNb3Zlcy5maWx0ZXIoKG5leHRNb3ZlKSA9PiBuZXh0TW92ZS5jYXB0dXJlZCAhPT0gbnVsbCkubGVuZ3RoOwogICAgaWYgKGNhcHR1cmVzUmVhZHkgPiAwKSB7CiAgICAgIHNldEZlZWRiYWNrKCJEdSBiaXN0IGFtIFp1Zy4gU2NobGFncGZsaWNodDogRXMgZ2lidCAiICsgU3RyaW5nKGNhcHR1cmVzUmVhZHkpICsgIiBtw7ZnbGljaGVuIFNjaGxhZ3p1Zy4iLCAiZ29vZCIpOwogICAgfSBlbHNlIHsKICAgICAgc2V0RmVlZGJhY2soIkR1IGJpc3QgYW0gWnVnLiBXw6RobGUgZWluZW4gaGVsbGVuIFN0ZWluLiIsICIiKTsKICAgIH0KICAgIHVwZGF0ZUh1ZCgpOwogICAgcmVuZGVyQm9hcmQoKTsKICB9CgogIGZ1bmN0aW9uIGNoZWNrR2FtZUVuZCgpIHsKICAgIGNvbnN0IHBsYXllckNvdW50ID0gY291bnRQaWVjZXMoU0lERV9QTEFZRVIpOwogICAgY29uc3QgYm90Q291bnQgPSBjb3VudFBpZWNlcyhTSURFX0JPVCk7CiAgICBpZiAoYm90Q291bnQgPT09IDApIHsKICAgICAgc2NvcmUgKz0gMTIwOwogICAgICB1cGRhdGVIdWQoKTsKICAgICAgZmluaXNoR2FtZSh0cnVlLCAiRHUgaGFzdCBhbGxlIEtJLVN0ZWluZSBnZXNjaGxhZ2VuLiIpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIGlmIChwbGF5ZXJDb3VudCA9PT0gMCkgewogICAgICBmaW5pc2hHYW1lKGZhbHNlLCAiRGllIEtJIGhhdCBhbGxlIGRlaW5lIFN0ZWluZSBnZXNjaGxhZ2VuLiIpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIGZ1bmN0aW9uIGZpbmlzaEdhbWUod29uLCByZWFzb24pIHsKICAgIGdhbWVGaW5pc2hlZCA9IHRydWU7CiAgICBhaVRoaW5raW5nID0gZmFsc2U7CiAgICBjbGVhclRpbWVycygpOwoKICAgIGNvbnN0IGxldmVsID0gZ2V0TGV2ZWxJbmRleCgpICsgMTsKICAgIGVsZW1lbnRzLnJlc3VsdFRpdGxlLnRleHRDb250ZW50ID0gd29uID8gIlNpZWchIiA6ICJQYXJ0aWUgdmVybG9yZW4iOwogICAgZWxlbWVudHMucmVzdWx0VGV4dC50ZXh0Q29udGVudCA9IHJlYXNvbiArICIgRW5kc3RhbmQ6ICIgKyBTdHJpbmcoc2NvcmUpICsgIiBQdW5rdGUgaW0gTW9kdXMgIiArIGRpZmZpY3VsdHlOYW1lc1tkaWZmaWN1bHR5XSArICIuIjsKICAgIGVsZW1lbnRzLmZpbmFsU2NvcmUudGV4dENvbnRlbnQgPSBTdHJpbmcoc2NvcmUpOwogICAgZWxlbWVudHMuZmluYWxUaW1lLnRleHRDb250ZW50ID0gZm9ybWF0VGltZShlbGFwc2VkU2Vjb25kcyk7CiAgICBlbGVtZW50cy5maW5hbExldmVsLnRleHRDb250ZW50ID0gU3RyaW5nKGxldmVsKTsKICAgIHNob3dTY3JlZW4oImVuZCIpOwogIH0KCiAgZnVuY3Rpb24gY2hvb3NlQm90TW92ZShsZWdhbCkgewogICAgaWYgKGRpZmZpY3VsdHkgPT09ICJlYXN5IikgewogICAgICBjb25zdCBjYXB0dXJlc09ubHkgPSBsZWdhbC5maWx0ZXIoKG1vdmUpID0+IG1vdmUuY2FwdHVyZWQgIT09IG51bGwpOwogICAgICBjb25zdCBwb29sID0gY2FwdHVyZXNPbmx5Lmxlbmd0aCA+IDAgPyBjYXB0dXJlc09ubHkgOiBsZWdhbDsKICAgICAgcmV0dXJuIHBvb2xbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogcG9vbC5sZW5ndGgpXTsKICAgIH0KCiAgICBpZiAoZGlmZmljdWx0eSA9PT0gImJhbGFuY2VkIikgewogICAgICByZXR1cm4gYmVzdE1vdmVCeUhldXJpc3RpYyhsZWdhbCk7CiAgICB9CgogICAgcmV0dXJuIGJlc3RNb3ZlQnlTZWFyY2gobGVnYWwpOwogIH0KCiAgZnVuY3Rpb24gYmVzdE1vdmVCeUhldXJpc3RpYyhsZWdhbCkgewogICAgbGV0IGJlc3QgPSBsZWdhbFswXTsKICAgIGxldCBiZXN0U2NvcmUgPSAtSW5maW5pdHk7CiAgICBsZWdhbC5mb3JFYWNoKChtb3ZlKSA9PiB7CiAgICAgIGNvbnN0IHZhbHVlID0gc2NvcmVCb3RNb3ZlKGJvYXJkU3RhdGUsIG1vdmUpOwogICAgICBpZiAodmFsdWUgPiBiZXN0U2NvcmUpIHsKICAgICAgICBiZXN0U2NvcmUgPSB2YWx1ZTsKICAgICAgICBiZXN0ID0gbW92ZTsKICAgICAgfQogICAgfSk7CiAgICByZXR1cm4gYmVzdDsKICB9CgogIGZ1bmN0aW9uIHNjb3JlQm90TW92ZShzdGF0ZSwgbW92ZSkgewogICAgY29uc3QgdGVzdEJvYXJkID0gY2xvbmVCb2FyZChzdGF0ZSk7CiAgICBjb25zdCBvdXRjb21lID0gYXBwbHlNb3ZlVG9TdGF0ZSh0ZXN0Qm9hcmQsIG1vdmUpOwogICAgbGV0IHZhbHVlID0gZXZhbHVhdGVCb2FyZCh0ZXN0Qm9hcmQpOwoKICAgIGlmIChtb3ZlLmNhcHR1cmVkICE9PSBudWxsKSB7CiAgICAgIHZhbHVlICs9IDgwOwogICAgfQogICAgaWYgKG91dGNvbWUucHJvbW90ZWQpIHsKICAgICAgdmFsdWUgKz0gMTIwOwogICAgfQoKICAgIGNvbnN0IHRhcmdldFJvdyA9IHJvd09mKG1vdmUudG8pOwogICAgY29uc3QgdGFyZ2V0Q29sID0gY29sT2YobW92ZS50byk7CiAgICBjb25zdCBjZW50ZXJEaXN0YW5jZSA9IE1hdGguYWJzKDMuNSAtIHRhcmdldFJvdykgKyBNYXRoLmFicygzLjUgLSB0YXJnZXRDb2wpOwogICAgdmFsdWUgKz0gMTIgLSBjZW50ZXJEaXN0YW5jZSAqIDM7CgogICAgY29uc3QgcGxheWVyUmVwbGllcyA9IGdldEFsbExlZ2FsTW92ZXModGVzdEJvYXJkLCBTSURFX1BMQVlFUiwgbnVsbCk7CiAgICBjb25zdCBkYW5nZXJvdXNSZXBsaWVzID0gcGxheWVyUmVwbGllcy5maWx0ZXIoKHJlcGx5KSA9PiByZXBseS5jYXB0dXJlZCAhPT0gbnVsbCkubGVuZ3RoOwogICAgdmFsdWUgLT0gZGFuZ2Vyb3VzUmVwbGllcyAqIDM0OwoKICAgIGNvbnN0IGZvbGxvd1VwcyA9IG1vdmUuY2FwdHVyZWQgIT09IG51bGwgJiYgIW91dGNvbWUucHJvbW90ZWQKICAgICAgPyBnZXRBbGxMZWdhbE1vdmVzKHRlc3RCb2FyZCwgU0lERV9CT1QsIG1vdmUudG8pLmxlbmd0aAogICAgICA6IDA7CiAgICB2YWx1ZSArPSBmb2xsb3dVcHMgKiA0NTsKCiAgICByZXR1cm4gdmFsdWU7CiAgfQoKICBmdW5jdGlvbiBiZXN0TW92ZUJ5U2VhcmNoKGxlZ2FsKSB7CiAgICBsZXQgYmVzdCA9IGxlZ2FsWzBdOwogICAgbGV0IGJlc3RTY29yZSA9IC1JbmZpbml0eTsKICAgIGxlZ2FsLmZvckVhY2goKG1vdmUpID0+IHsKICAgICAgY29uc3QgdGVzdEJvYXJkID0gY2xvbmVCb2FyZChib2FyZFN0YXRlKTsKICAgICAgY29uc3Qgb3V0Y29tZSA9IGFwcGx5TW92ZVRvU3RhdGUodGVzdEJvYXJkLCBtb3ZlKTsKICAgICAgbGV0IHZhbHVlOwogICAgICBjb25zdCBmb2xsb3dVcHMgPSBtb3ZlLmNhcHR1cmVkICE9PSBudWxsICYmICFvdXRjb21lLnByb21vdGVkCiAgICAgICAgPyBnZXRBbGxMZWdhbE1vdmVzKHRlc3RCb2FyZCwgU0lERV9CT1QsIG1vdmUudG8pCiAgICAgICAgOiBbXTsKICAgICAgaWYgKGZvbGxvd1Vwcy5sZW5ndGggPiAwKSB7CiAgICAgICAgdmFsdWUgPSBtaW5pbWF4KHRlc3RCb2FyZCwgU0lERV9CT1QsIG1vdmUudG8sIDMsIC1JbmZpbml0eSwgSW5maW5pdHkpOwogICAgICB9IGVsc2UgewogICAgICAgIHZhbHVlID0gbWluaW1heCh0ZXN0Qm9hcmQsIFNJREVfUExBWUVSLCBudWxsLCAzLCAtSW5maW5pdHksIEluZmluaXR5KTsKICAgICAgfQogICAgICB2YWx1ZSArPSBzY29yZUJvdE1vdmUoYm9hcmRTdGF0ZSwgbW92ZSkgKiAwLjA4OwogICAgICBpZiAodmFsdWUgPiBiZXN0U2NvcmUpIHsKICAgICAgICBiZXN0U2NvcmUgPSB2YWx1ZTsKICAgICAgICBiZXN0ID0gbW92ZTsKICAgICAgfQogICAgfSk7CiAgICByZXR1cm4gYmVzdDsKICB9CgogIGZ1bmN0aW9uIG1pbmltYXgoc3RhdGUsIHNpZGUsIG9ubHlJbmRleCwgZGVwdGgsIGFscGhhLCBiZXRhKSB7CiAgICBjb25zdCBsZWdhbCA9IGdldEFsbExlZ2FsTW92ZXMoc3RhdGUsIHNpZGUsIG9ubHlJbmRleCk7CiAgICBpZiAobGVnYWwubGVuZ3RoID09PSAwKSB7CiAgICAgIGlmIChvbmx5SW5kZXggIT09IG51bGwpIHsKICAgICAgICByZXR1cm4gZXZhbHVhdGVCb2FyZChzdGF0ZSk7CiAgICAgIH0KICAgICAgcmV0dXJuIHNpZGUgPT09IFNJREVfQk9UID8gLTEwMDAwIC0gZGVwdGggOiAxMDAwMCArIGRlcHRoOwogICAgfQoKICAgIGlmIChkZXB0aCA8PSAwKSB7CiAgICAgIHJldHVybiBldmFsdWF0ZUJvYXJkKHN0YXRlKTsKICAgIH0KCiAgICBpZiAoc2lkZSA9PT0gU0lERV9CT1QpIHsKICAgICAgbGV0IGJlc3QgPSAtSW5maW5pdHk7CiAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBsZWdhbC5sZW5ndGg7IGluZGV4ICs9IDEpIHsKICAgICAgICBjb25zdCBtb3ZlID0gbGVnYWxbaW5kZXhdOwogICAgICAgIGNvbnN0IG5leHRCb2FyZCA9IGNsb25lQm9hcmQoc3RhdGUpOwogICAgICAgIGNvbnN0IG91dGNvbWUgPSBhcHBseU1vdmVUb1N0YXRlKG5leHRCb2FyZCwgbW92ZSk7CiAgICAgICAgY29uc3QgZm9sbG93VXBzID0gbW92ZS5jYXB0dXJlZCAhPT0gbnVsbCAmJiAhb3V0Y29tZS5wcm9tb3RlZAogICAgICAgICAgPyBnZXRBbGxMZWdhbE1vdmVzKG5leHRCb2FyZCwgU0lERV9CT1QsIG1vdmUudG8pCiAgICAgICAgICA6IFtdOwogICAgICAgIGNvbnN0IHZhbHVlID0gZm9sbG93VXBzLmxlbmd0aCA+IDAKICAgICAgICAgID8gbWluaW1heChuZXh0Qm9hcmQsIFNJREVfQk9ULCBtb3ZlLnRvLCBkZXB0aCwgYWxwaGEsIGJldGEpCiAgICAgICAgICA6IG1pbmltYXgobmV4dEJvYXJkLCBTSURFX1BMQVlFUiwgbnVsbCwgZGVwdGggLSAxLCBhbHBoYSwgYmV0YSk7CiAgICAgICAgYmVzdCA9IE1hdGgubWF4KGJlc3QsIHZhbHVlKTsKICAgICAgICBhbHBoYSA9IE1hdGgubWF4KGFscGhhLCBiZXN0KTsKICAgICAgICBpZiAoYmV0YSA8PSBhbHBoYSkgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBiZXN0OwogICAgfQoKICAgIGxldCBiZXN0ID0gSW5maW5pdHk7CiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgbGVnYWwubGVuZ3RoOyBpbmRleCArPSAxKSB7CiAgICAgIGNvbnN0IG1vdmUgPSBsZWdhbFtpbmRleF07CiAgICAgIGNvbnN0IG5leHRCb2FyZCA9IGNsb25lQm9hcmQoc3RhdGUpOwogICAgICBjb25zdCBvdXRjb21lID0gYXBwbHlNb3ZlVG9TdGF0ZShuZXh0Qm9hcmQsIG1vdmUpOwogICAgICBjb25zdCBmb2xsb3dVcHMgPSBtb3ZlLmNhcHR1cmVkICE9PSBudWxsICYmICFvdXRjb21lLnByb21vdGVkCiAgICAgICAgPyBnZXRBbGxMZWdhbE1vdmVzKG5leHRCb2FyZCwgU0lERV9QTEFZRVIsIG1vdmUudG8pCiAgICAgICAgOiBbXTsKICAgICAgY29uc3QgdmFsdWUgPSBmb2xsb3dVcHMubGVuZ3RoID4gMAogICAgICAgID8gbWluaW1heChuZXh0Qm9hcmQsIFNJREVfUExBWUVSLCBtb3ZlLnRvLCBkZXB0aCwgYWxwaGEsIGJldGEpCiAgICAgICAgOiBtaW5pbWF4KG5leHRCb2FyZCwgU0lERV9CT1QsIG51bGwsIGRlcHRoIC0gMSwgYWxwaGEsIGJldGEpOwogICAgICBiZXN0ID0gTWF0aC5taW4oYmVzdCwgdmFsdWUpOwogICAgICBiZXRhID0gTWF0aC5taW4oYmV0YSwgYmVzdCk7CiAgICAgIGlmIChiZXRhIDw9IGFscGhhKSB7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBiZXN0OwogIH0KCiAgZnVuY3Rpb24gZXZhbHVhdGVCb2FyZChzdGF0ZSkgewogICAgbGV0IHZhbHVlID0gMDsKICAgIHN0YXRlLmZvckVhY2goKHBpZWNlLCBpbmRleCkgPT4gewogICAgICBpZiAoIXBpZWNlKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICBjb25zdCByb3cgPSByb3dPZihpbmRleCk7CiAgICAgIGNvbnN0IGNvbCA9IGNvbE9mKGluZGV4KTsKICAgICAgY29uc3QgbWF0ZXJpYWwgPSBwaWVjZS5raW5nID8gMTc1IDogMTAwOwogICAgICBjb25zdCBhZHZhbmNlID0gcGllY2Uuc2lkZSA9PT0gU0lERV9CT1QgPyByb3cgKiA1IDogKEJPQVJEX1NJWkUgLSAxIC0gcm93KSAqIDU7CiAgICAgIGNvbnN0IGNlbnRlciA9IDE0IC0gKE1hdGguYWJzKDMuNSAtIHJvdykgKyBNYXRoLmFicygzLjUgLSBjb2wpKSAqIDM7CiAgICAgIGNvbnN0IGVkZ2VQZW5hbHR5ID0gY29sID09PSAwIHx8IGNvbCA9PT0gQk9BUkRfU0laRSAtIDEgPyAtNSA6IDA7CiAgICAgIGNvbnN0IHBpZWNlVmFsdWUgPSBtYXRlcmlhbCArIGFkdmFuY2UgKyBjZW50ZXIgKyBlZGdlUGVuYWx0eTsKCiAgICAgIHZhbHVlICs9IHBpZWNlLnNpZGUgPT09IFNJREVfQk9UID8gcGllY2VWYWx1ZSA6IC1waWVjZVZhbHVlOwogICAgfSk7CgogICAgdmFsdWUgKz0gZ2V0QWxsTGVnYWxNb3ZlcyhzdGF0ZSwgU0lERV9CT1QsIG51bGwpLmxlbmd0aCAqIDM7CiAgICB2YWx1ZSAtPSBnZXRBbGxMZWdhbE1vdmVzKHN0YXRlLCBTSURFX1BMQVlFUiwgbnVsbCkubGVuZ3RoICogMzsKICAgIHZhbHVlICs9IGNvdW50S2luZ3Moc3RhdGUsIFNJREVfQk9UKSAqIDIwOwogICAgdmFsdWUgLT0gY291bnRLaW5ncyhzdGF0ZSwgU0lERV9QTEFZRVIpICogMjA7CgogICAgcmV0dXJuIHZhbHVlOwogIH0KCiAgZnVuY3Rpb24gcmVxdWVzdEhpbnQoKSB7CiAgICBpZiAoYWN0aXZlU2NyZWVuICE9PSAicGxheSIgfHwgZ2FtZUZpbmlzaGVkKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmICh0dXJuICE9PSBTSURFX1BMQVlFUiB8fCBhaVRoaW5raW5nKSB7CiAgICAgIHNob3dUb2FzdCgiVGlwcCB2ZXJmw7xnYmFyLCBzb2JhbGQgZHUgYW0gWnVnIGJpc3QuIik7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBjb25zdCBsZWdhbCA9IGdldEFsbExlZ2FsTW92ZXMoYm9hcmRTdGF0ZSwgU0lERV9QTEFZRVIsIGZvcmNlZFBpZWNlSW5kZXgpOwogICAgaWYgKGxlZ2FsLmxlbmd0aCA9PT0gMCkgewogICAgICBzaG93VG9hc3QoIkVzIGdpYnQgZ2VyYWRlIGtlaW5lbiBsZWdhbGVuIFp1Zy4iKTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIGxldCBiZXN0ID0gbGVnYWxbMF07CiAgICBsZXQgYmVzdFNjb3JlID0gLUluZmluaXR5OwogICAgbGVnYWwuZm9yRWFjaCgobW92ZSkgPT4gewogICAgICBjb25zdCB0ZXN0Qm9hcmQgPSBjbG9uZUJvYXJkKGJvYXJkU3RhdGUpOwogICAgICBjb25zdCBvdXRjb21lID0gYXBwbHlNb3ZlVG9TdGF0ZSh0ZXN0Qm9hcmQsIG1vdmUpOwogICAgICBsZXQgdmFsdWUgPSAtZXZhbHVhdGVCb2FyZCh0ZXN0Qm9hcmQpOwogICAgICBpZiAobW92ZS5jYXB0dXJlZCAhPT0gbnVsbCkgewogICAgICAgIHZhbHVlICs9IDcwOwogICAgICB9CiAgICAgIGlmIChvdXRjb21lLnByb21vdGVkKSB7CiAgICAgICAgdmFsdWUgKz0gMTAwOwogICAgICB9CiAgICAgIGNvbnN0IHJlcGx5Q2FwdHVyZXMgPSBnZXRBbGxMZWdhbE1vdmVzKHRlc3RCb2FyZCwgU0lERV9CT1QsIG51bGwpLmZpbHRlcigocmVwbHkpID0+IHJlcGx5LmNhcHR1cmVkICE9PSBudWxsKS5sZW5ndGg7CiAgICAgIHZhbHVlIC09IHJlcGx5Q2FwdHVyZXMgKiAzMjsKICAgICAgaWYgKHZhbHVlID4gYmVzdFNjb3JlKSB7CiAgICAgICAgYmVzdFNjb3JlID0gdmFsdWU7CiAgICAgICAgYmVzdCA9IG1vdmU7CiAgICAgIH0KICAgIH0pOwoKICAgIGhpbnRNb3ZlID0gYmVzdDsKICAgIHNlbGVjdGVkSW5kZXggPSBiZXN0LmZyb207CiAgICBsZWdhbE1vdmVzRm9yU2VsZWN0ZWQgPSBsZWdhbC5maWx0ZXIoKG1vdmUpID0+IG1vdmUuZnJvbSA9PT0gYmVzdC5mcm9tKTsKICAgIHNldEZlZWRiYWNrKCJUaXBwOiBTcGllbGUgdm9uICIgKyBmaWVsZE5hbWUoYmVzdC5mcm9tKSArICIgbmFjaCAiICsgZmllbGROYW1lKGJlc3QudG8pICsgIi4iLCAiZ29vZCIpOwogICAgcmVuZGVyQm9hcmQoKTsKICB9CgogIGZ1bmN0aW9uIHRvZ2dsZVJ1bGVzUGFuZWwoKSB7CiAgICBjb25zdCB2aXNpYmxlID0gZWxlbWVudHMucnVsZXNQYW5lbC5jbGFzc0xpc3QudG9nZ2xlKCJydWxlcy12aXNpYmxlIik7CiAgICBlbGVtZW50cy5ydWxlc0J1dHRvbi5zZXRBdHRyaWJ1dGUoImFyaWEtcHJlc3NlZCIsIHZpc2libGUgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKICB9CgogIGZ1bmN0aW9uIHRvZ2dsZUZ1bGxzY3JlZW4oKSB7CiAgICBjb25zdCBkb2MgPSBkb2N1bWVudDsKICAgIGNvbnN0IHJvb3ROb2RlID0gZG9jLmRvY3VtZW50RWxlbWVudDsKCiAgICBpZiAoZG9jLmZ1bGxzY3JlZW5FbGVtZW50ICYmIGRvYy5leGl0RnVsbHNjcmVlbikgewogICAgICBkb2MuZXhpdEZ1bGxzY3JlZW4oKS5jYXRjaCgoKSA9PiB7CiAgICAgICAgYWN0aXZhdGVGdWxsc2NyZWVuRmFsbGJhY2soKTsKICAgICAgfSk7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBpZiAocm9vdE5vZGUucmVxdWVzdEZ1bGxzY3JlZW4pIHsKICAgICAgcm9vdE5vZGUucmVxdWVzdEZ1bGxzY3JlZW4oKS5jYXRjaCgoKSA9PiB7CiAgICAgICAgYWN0aXZhdGVGdWxsc2NyZWVuRmFsbGJhY2soKTsKICAgICAgfSk7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBhY3RpdmF0ZUZ1bGxzY3JlZW5GYWxsYmFjaygpOwogIH0KCiAgZnVuY3Rpb24gYWN0aXZhdGVGdWxsc2NyZWVuRmFsbGJhY2soKSB7CiAgICBlbGVtZW50cy5yb290LmNsYXNzTGlzdC50b2dnbGUoImZ1bGxzY3JlZW4tZmFsbGJhY2siLCB0cnVlKTsKICAgIHNob3dUb2FzdCgiVm9sbGJpbGQtQW5zaWNodCB3dXJkZSBpbSBTcGllbGJlcmVpY2ggYWt0aXZpZXJ0LiIpOwogIH0KCiAgZnVuY3Rpb24gdXBkYXRlRnVsbHNjcmVlbkJ1dHRvbnMoKSB7CiAgICBjb25zdCBsYWJlbCA9IGRvY3VtZW50LmZ1bGxzY3JlZW5FbGVtZW50IHx8IGVsZW1lbnRzLnJvb3QuY2xhc3NMaXN0LmNvbnRhaW5zKCJmdWxsc2NyZWVuLWZhbGxiYWNrIikKICAgICAgPyAiVm9sbGJpbGQgYW4iCiAgICAgIDogIlZvbGxiaWxkIjsKICAgIGVsZW1lbnRzLmZ1bGxzY3JlZW5CdXR0b24udGV4dENvbnRlbnQgPSBsYWJlbDsKICAgIGVsZW1lbnRzLnN0YXJ0RnVsbHNjcmVlbkJ1dHRvbi50ZXh0Q29udGVudCA9IGxhYmVsOwogIH0KCiAgZnVuY3Rpb24gc2V0RGlmZmljdWx0eShuZXh0RGlmZmljdWx0eSkgewogICAgZGlmZmljdWx0eSA9IG5leHREaWZmaWN1bHR5OwogICAgY29uc3QgYnV0dG9ucyA9IGVsZW1lbnRzLmRpZmZpY3VsdHlPcHRpb25zLnF1ZXJ5U2VsZWN0b3JBbGwoIltkYXRhLWRpZmZpY3VsdHldIik7CiAgICBidXR0b25zLmZvckVhY2goKGJ1dHRvbikgPT4gewogICAgICBjb25zdCBhY3RpdmUgPSBidXR0b24uZGF0YXNldC5kaWZmaWN1bHR5ID09PSBkaWZmaWN1bHR5OwogICAgICBidXR0b24uY2xhc3NMaXN0LnRvZ2dsZSgiY2hvaWNlLWFjdGl2ZSIsIGFjdGl2ZSk7CiAgICAgIGJ1dHRvbi5zZXRBdHRyaWJ1dGUoImFyaWEtcHJlc3NlZCIsIGFjdGl2ZSA/ICJ0cnVlIiA6ICJmYWxzZSIpOwogICAgfSk7CiAgfQoKICBmdW5jdGlvbiBoYW5kbGVCb2FyZENsaWNrKGV2ZW50KSB7CiAgICBjb25zdCBzcXVhcmUgPSBldmVudC50YXJnZXQuY2xvc2VzdCgiLnNxdWFyZS5kYXJrIik7CiAgICBpZiAoIXNxdWFyZSB8fCAhZWxlbWVudHMuYm9hcmQuY29udGFpbnMoc3F1YXJlKSkgewogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCBpbmRleCA9IE51bWJlcihzcXVhcmUuZGF0YXNldC5pbmRleCk7CiAgICBoYW5kbGVTcXVhcmVBY3Rpb24oaW5kZXgpOwogIH0KCiAgZnVuY3Rpb24gaGFuZGxlQm9hcmRLZXkoZXZlbnQpIHsKICAgIGNvbnN0IGN1cnJlbnQgPSBldmVudC50YXJnZXQuY2xvc2VzdCgiLnNxdWFyZS5kYXJrIik7CiAgICBpZiAoIWN1cnJlbnQpIHsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIGNvbnN0IGluZGV4ID0gTnVtYmVyKGN1cnJlbnQuZGF0YXNldC5pbmRleCk7CiAgICBjb25zdCBrZXkgPSBldmVudC5rZXk7CgogICAgaWYgKGtleSA9PT0gIkVudGVyIiB8fCBrZXkgPT09ICIgIikgewogICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBoYW5kbGVTcXVhcmVBY3Rpb24oaW5kZXgpOwogICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKGtleSA9PT0gIkFycm93VXAiIHx8IGtleSA9PT0gIkFycm93RG93biIgfHwga2V5ID09PSAiQXJyb3dMZWZ0IiB8fCBrZXkgPT09ICJBcnJvd1JpZ2h0IikgewogICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBjb25zdCBuZXh0SW5kZXggPSBuZXh0RGFya0luZGV4KGluZGV4LCBrZXkpOwogICAgICBmb2N1c1NxdWFyZShuZXh0SW5kZXgpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gbmV4dERhcmtJbmRleChpbmRleCwga2V5KSB7CiAgICBsZXQgcm93ID0gcm93T2YoaW5kZXgpOwogICAgbGV0IGNvbCA9IGNvbE9mKGluZGV4KTsKCiAgICBpZiAoa2V5ID09PSAiQXJyb3dVcCIpIHsKICAgICAgcm93IC09IDE7CiAgICAgIGNvbCArPSBpc0Rhcmsocm93LCBjb2wpID8gMCA6IDE7CiAgICB9IGVsc2UgaWYgKGtleSA9PT0gIkFycm93RG93biIpIHsKICAgICAgcm93ICs9IDE7CiAgICAgIGNvbCArPSBpc0Rhcmsocm93LCBjb2wpID8gMCA6IDE7CiAgICB9IGVsc2UgaWYgKGtleSA9PT0gIkFycm93TGVmdCIpIHsKICAgICAgY29sIC09IDI7CiAgICB9IGVsc2UgaWYgKGtleSA9PT0gIkFycm93UmlnaHQiKSB7CiAgICAgIGNvbCArPSAyOwogICAgfQoKICAgIHJvdyA9IE1hdGgubWF4KDAsIE1hdGgubWluKEJPQVJEX1NJWkUgLSAxLCByb3cpKTsKICAgIGNvbCA9IE1hdGgubWF4KDAsIE1hdGgubWluKEJPQVJEX1NJWkUgLSAxLCBjb2wpKTsKCiAgICBpZiAoIWlzRGFyayhyb3csIGNvbCkpIHsKICAgICAgaWYgKGNvbCA8IEJPQVJEX1NJWkUgLSAxKSB7CiAgICAgICAgY29sICs9IDE7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY29sIC09IDE7CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gaW5kZXhGcm9tUm93Q29sKHJvdywgY29sKTsKICB9CgogIGZ1bmN0aW9uIGZvY3VzU3F1YXJlKGluZGV4KSB7CiAgICBrZXlib2FyZEZvY3VzSW5kZXggPSBpbmRleDsKICAgIGNvbnN0IHNxdWFyZSA9IGVsZW1lbnRzLmJvYXJkLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWluZGV4PSInICsgU3RyaW5nKGluZGV4KSArICciXScpOwogICAgaWYgKHNxdWFyZSkgewogICAgICBzcXVhcmUudGFiSW5kZXggPSAwOwogICAgICBzcXVhcmUuZm9jdXMoKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGhhbmRsZUdsb2JhbEtleXMoZXZlbnQpIHsKICAgIGlmIChhY3RpdmVTY3JlZW4gPT09ICJzdGFydCIpIHsKICAgICAgaWYgKGV2ZW50LmtleSA9PT0gIkVudGVyIikgewogICAgICAgIHN0YXJ0R2FtZShmYWxzZSk7CiAgICAgIH0KICAgICAgcmV0dXJuOwogICAgfQoKICAgIGlmIChhY3RpdmVTY3JlZW4gIT09ICJwbGF5IikgewogICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKGV2ZW50LmtleSA9PT0gImgiIHx8IGV2ZW50LmtleSA9PT0gIkgiKSB7CiAgICAgIHJlcXVlc3RIaW50KCk7CiAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gIm4iIHx8IGV2ZW50LmtleSA9PT0gIk4iKSB7CiAgICAgIHJlc2V0R2FtZSgpOwogICAgICBzaG93VG9hc3QoIk5ldWUgUGFydGllIGdlc3RhcnRldC4iKTsKICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSAiZiIgfHwgZXZlbnQua2V5ID09PSAiRiIpIHsKICAgICAgdG9nZ2xlRnVsbHNjcmVlbigpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gaW5pdEV2ZW50cygpIHsKICAgIGVsZW1lbnRzLnN0YXJ0R2FtZUJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsICgpID0+IHN0YXJ0R2FtZShmYWxzZSkpOwogICAgZWxlbWVudHMudHJhaW5pbmdHYW1lQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgKCkgPT4gc3RhcnRHYW1lKHRydWUpKTsKICAgIGVsZW1lbnRzLnN0YXJ0RnVsbHNjcmVlbkJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIHRvZ2dsZUZ1bGxzY3JlZW4pOwogICAgZWxlbWVudHMuZnVsbHNjcmVlbkJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIHRvZ2dsZUZ1bGxzY3JlZW4pOwogICAgZWxlbWVudHMucmVzZXRCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCAoKSA9PiB7CiAgICAgIHJlc2V0R2FtZSgpOwogICAgICBzaG93VG9hc3QoIk5ldWUgUGFydGllIGdlc3RhcnRldC4iKTsKICAgIH0pOwogICAgZWxlbWVudHMubWVudUJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIHJldHVyblRvTWVudSk7CiAgICBlbGVtZW50cy5oaW50QnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgcmVxdWVzdEhpbnQpOwogICAgZWxlbWVudHMucnVsZXNCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCB0b2dnbGVSdWxlc1BhbmVsKTsKICAgIGVsZW1lbnRzLnBsYXlBZ2FpbkJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsICgpID0+IHsKICAgICAgc2hvd1NjcmVlbigicGxheSIpOwogICAgICByZXNldEdhbWUoKTsKICAgIH0pOwogICAgZWxlbWVudHMuZW5kTWVudUJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIHJldHVyblRvTWVudSk7CgogICAgZWxlbWVudHMuZGlmZmljdWx0eU9wdGlvbnMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCAoZXZlbnQpID0+IHsKICAgICAgY29uc3QgYnV0dG9uID0gZXZlbnQudGFyZ2V0LmNsb3Nlc3QoIltkYXRhLWRpZmZpY3VsdHldIik7CiAgICAgIGlmICghYnV0dG9uKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHNldERpZmZpY3VsdHkoYnV0dG9uLmRhdGFzZXQuZGlmZmljdWx0eSk7CiAgICB9KTsKCiAgICBlbGVtZW50cy5ib2FyZC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGhhbmRsZUJvYXJkQ2xpY2spOwogICAgZWxlbWVudHMuYm9hcmQuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsIGhhbmRsZUJvYXJkS2V5KTsKICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLCBoYW5kbGVHbG9iYWxLZXlzKTsKICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImZ1bGxzY3JlZW5jaGFuZ2UiLCB1cGRhdGVGdWxsc2NyZWVuQnV0dG9ucyk7CiAgfQoKICBmdW5jdGlvbiBpbml0KCkgewogICAgaW5pdEV2ZW50cygpOwogICAgc2V0RGlmZmljdWx0eShkaWZmaWN1bHR5KTsKICAgIGJvYXJkU3RhdGUgPSBzZXR1cEJvYXJkKCk7CiAgICB1cGRhdGVGdWxsc2NyZWVuQnV0dG9ucygpOwogICAgdXBkYXRlSHVkKCk7CiAgICByZW5kZXJCb2FyZCgpOwogIH0KCiAgaW5pdCgpOwp9KSgpOwoKPC9zY3JpcHQ+CjwvYm9keT4KPC9odG1sPg== | ||
</aimoocgame> | </aimoocgame> | ||
[[Kategorie:Spiele]] | [[Kategorie:Spiele]] | ||
Aktuelle Version vom 14. Juni 2026, 10:58 Uhr


Dame
Dame
Dame, das Brettspiel als Online-Spiel
MOOCwiki Spiele
Dame
Schulfach+


aiMOOCs



aiMOOC Projekte


THE MONKEY DANCE





{{#ev:youtube | https://youtu.be/rFhZlg38Zf8?si=9KdMNZYRkRD81YTo%7C 500 | center}}
|
{{#ev:youtube | https://youtu.be/Ob7etf9QuBo?si=t_NBA71bWg3Rq3LI%7C 500 | center}}
| <inputbox>
type=create break=no preload=MOOCit Vorlage default= width=30 placeholder= Dein MOOC Titel buttonlabel=MOOC erstellen </inputbox> |