https://ipfs.io/ipfs/QmaLEow51upmWcjsEnufTjuboL9NSGtmXJBeXrPkEEcNas\n

PCFET0NUWVBFIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xIi8+CiAgICA8bWV0YSBjaGFyc2V0PSJVVEYtOCIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwOi8vc3ZnaWNvbnMuc3BhcmtrLmZyL3N2Z2ljb25zLmNzcyIvPgogICAgPHN0eWxlPgogICAgICBib2R5IHsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICB3aWR0aDogMTAwdnc7CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICAgIGZvbnQtZmFtaWx5OiAiTm90byBTZXJpZiI7CiAgICAgIH0KICAgICAgCiAgICAgICNoZWFkZXIgYSwgCiAgICAgIGZvcm0sIAogICAgICAjcXVlcnlkaXNwbGF5LCAKICAgICAgI2hlYWRlciB7CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgfQogICAgICAKICAgICAgI3F1ZXJ5ZGlzcGxheSAudGV4dCwgCiAgICAgICNoZWFkZXIgYSwKICAgICAgI21lZGlhLWNvbnRhaW5lciB7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KCiAgICAgICNoZWFkZXIgYSwgCiAgICAgIGZvcm0sIAogICAgICAjcXVlcnlkaXNwbGF5IHsKICAgICAgICB6LWluZGV4OiAxOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfQogICAgICAKICAgICAgQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAzMGVtKSB7CiAgICAgICAgI3F1ZXJ5ZGlzcGxheSwKICAgICAgICAjY29udHJvbGluZm8gewogICAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGZvcm0gewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQogICAgICAKICAgICAgYSB7CiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwogICAgICB9CgogICAgICAjaGVhZGVyIC5zZXRjb2xzLCAKICAgICAgI2hlYWRlciAuc2V0bGltaXQgewogICAgICAgIHBhZGRpbmc6IC44ZW0gMDsKICAgICAgfQogICAgICAKICAgICAgI3F1ZXJ5IHsKICAgICAgICB3aWR0aDogNWVtOwogICAgICB9CiAgICAgIAogICAgICAjcXVlcnlkaXNwbGF5LCAKICAgICAgI2NvbnRyb2xpbmZvLAogICAgICBhIHsKICAgICAgICBjb2xvcjogIzk5OTsKICAgICAgfQogICAgICAKICAgICAgI3F1ZXJ5ZGlzcGxheSB7CiAgICAgICAgcGFkZGluZzogMCAxZW07CiAgICAgIH0KCiAgICAgICNxdWVyeWRpc3BsYXkgLnRleHQgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBtaW4td2lkdGg6IDNlbTsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICB9CgogICAgICAjaGVhZGVyIGEsCiAgICAgICNoZWFkZXIgc3BhbiB7CiAgICAgICAgcGFkZGluZzogMC44ZW07CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGJhY2tncm91bmQ6ICMwMDA7CiAgICAgIH0KCiAgICAgICNoZWFkZXIgewogICAgICAgIHBhZGRpbmc6IDAuNDVlbSAwOwogICAgICAgIG1hcmdpbjogMDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgIH0KCiAgICAgICNoZWFkZXIgLml0ZW1zIHsKICAgICAgICBiYWNrZ3JvdW5kOiAjMDAwOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgfQogICAgICAKICAgICAgI2hlYWRlciAuaXRlbXMsIAogICAgICAjY29udHJvbGluZm8gewogICAgICAgIG1hcmdpbi10b3A6IC4zZW07CiAgICAgIH0KCiAgICAgIC5sYWJlbCB7CiAgICAgICAgcGFkZGluZzogLjhlbSAuOGVtIC44ZW0gMDsKICAgICAgfQoKICAgICAgc3BhbiNjb250cm9saW5mbywgCiAgICAgICNwaWNzIGEgPiBhIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgIH0KICAgICAgCiAgICAgIHNwYW4jY29udHJvbGluZm8gewogICAgICAgIHJpZ2h0OiAyZW07CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICBwYWRkaW5nOiAwIDFlbTsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgIH0KCiAgICAgICNtZWRpYS1jb250YWluZXIgewogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwKTsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIHotaW5kZXg6IDQ7CiAgICAgIH0KICAgICAgCiAgICAgICNwaWMtY29udGFpbmVyIHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAgICAgCiAgICAgICNwaWMgewogICAgICAgIG1heC13aWR0aDogMTAwdnc7CiAgICAgICAgbWF4LWhlaWdodDogMTAwdmg7CiAgICAgIH0KICAgICAgICAKICAgICAgI3BpY3MgewogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KICAgICAgCiAgICAgICNwaWNzID4gYSwgCiAgICAgICNwaWNzIGltZyB7CiAgICAgICAgd2lkdGg6IDI1dnc7CiAgICAgIH0KCiAgICAgICNwaWNzID4gYSB7CiAgICAgICAgaGVpZ2h0OiAyNXZ3OwogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGZsb2F0OiBsZWZ0OwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgYm9yZGVyOiAwLjNlbSBzb2xpZCB0cmFuc3BhcmVudDsKICAgICAgICBib3JkZXItcmFkaXVzOiAwLjNlbTsKICAgICAgICBtYXJnaW46IC0wLjNlbTsKICAgICAgfQogICAgICAKICAgICAgYm9keTpub3QoLm5vc3RyKSAjZmlsdGVyLWxpa2VzLCAKICAgICAgLmZpbHRlci1saWtlcyAjcGljcyA+IGE6bm90KC5yZWFjdGVkKSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CiAgICAgIAogICAgICAucXVlcnksIAogICAgICAubGlrZSwgCiAgICAgICNwaWMtcXVlcnksCiAgICAgICNwaWMtdXNlciB7CiAgICAgICAgei1pbmRleDogMjsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgYm9yZGVyLXJhZGl1czogM3Z3OwogICAgICB9CiAgICAgIAogICAgICAucXVlcnksIAogICAgICAubGlrZSB7CiAgICAgICAgcGFkZGluZzogMCAxdnc7CiAgICAgIH0KICAgICAgCiAgICAgIC5xdWVyeSwgCiAgICAgIC5saWtlLCAKICAgICAgI3BpYy1xdWVyeSB7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGZvbnQtc2l6ZTogbWluKDMuNXZ3LCAxLjVlbSk7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLDAsMCwwLjYpOwogICAgICB9CiAgICAgIAogICAgICAjcGljLXF1ZXJ5IHsKICAgICAgICBwYWRkaW5nOiAuNmVtIC40ZW0gLjFlbSAuNGVtOwogICAgICAgIG1heC13aWR0aDogNWVtOwogICAgICB9CiAgICAgIAogICAgICBhLmxpa2UucmVhY3RlZCwKICAgICAgLmZpbHRlci1saWtlcyAjZmlsdGVyLWxpa2VzIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZWQ7CiAgICAgIH0KCiAgICAgICNwaWMtcXVlcnksCiAgICAgICNwaWMtdXNlciB7CiAgICAgICAgZm9udC1zaXplOiAzZW07CiAgICAgIH0KICAgICAgCiAgICAgICNwaWMtcXVlcnksCiAgICAgICNwaWMtdXNlciwKICAgICAgI21lZGlhLWZvb3RlciAubGlrZSB7CiAgICAgICAgei1pbmRleDogNTsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgIH0KICAgICAgCiAgICAgICNwaWMtcXVlcnksCiAgICAgICNwaWMtdXNlciB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KCiAgICAgICNwaWMtdXNlciB7CiAgICAgICAgYm90dG9tOiAxLjllbTsKICAgICAgICBmb250LXNpemU6IDEuOGVtOwogICAgICAgIHBhZGRpbmctcmlnaHQ6IC42NWVtOwogICAgICAgIG1heC13aWR0aDogOGVtOwogICAgICAgIG92ZXJmbG93LXg6IGhpZGRlbjsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgICB9CiAgICAgIAogICAgICAubGlrZSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiBhdXRvOwogICAgICAgIHBhZGRpbmc6IC4yZW07CiAgICAgICAgd2lkdGg6IDFlbTsKICAgICAgICBoZWlnaHQ6IDFlbTsKICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICB9CgogICAgICAubm9zdHIgLmxpa2UgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOyAgCiAgICAgIH0KCiAgICAgICNtZWRpYS1mb290ZXIgLmxpa2UgewogICAgICAgIGZvbnQtc2l6ZTogMi40ZW07CiAgICAgIH0KCiAgICAgICNtZWRpYS1mb290ZXIgewogICAgICAgIGRpc3BsYXk6IG5vbmU7ICAKICAgICAgfQogIAogICAgICAjcGljcyBpbWcgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgfQoKICAgICAgI21lbnUtY29udGVudCAuaXRlbXMgYS5hY3RpdmUgewogICAgICAgIGJhY2tncm91bmQ6ICM0NDQ7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KICAgICAgCiAgICAgICNwaWNzID4gYS5hY3RpdmUgewogICAgICAgIGJvcmRlci1jb2xvcjogZ3JlZW47CiAgICAgICAgei1pbmRleDogMTsKICAgICAgfQoKICAgICAgLmhlYXJ0c3ZnIHBhdGggewogICAgICAgIHN0cm9rZTogI2ZmZjsKICAgICAgfQogIAogICAgICBhI21lbnUsIGEjZmlsdGVyLWxpa2VzIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBtYXJnaW4tdG9wOiAtLjNlbTsKICAgICAgICBiYWNrZ3JvdW5kOiAjMDAwOwogICAgICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgICB9CgogICAgICBhI21lbnUgewogICAgICAgIGZsb2F0OiBsZWZ0OwogICAgICAgIHBhZGRpbmc6IDAgLjNlbSAwIC41ZW07CiAgICAgICAgaGVpZ2h0OiAyLjFlbTsKICAgICAgfQogICAgICAKICAgICAgYSNmaWx0ZXItbGlrZXMgewogICAgICAgIHBhZGRpbmc6IC4yZW07CiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgICAgIHdpZHRoOiAxLjVlbTsKICAgICAgICBoZWlnaHQ6IDEuNWVtOwogICAgICAgIG1hcmdpbjogLjFlbSAuNWVtOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICByaWdodDogMDsKICAgICAgfQogICAgICAKICAgICAgYSNmaWx0ZXItbGlrZXMgc3ZnIHsKICAgICAgICB3aWR0aDogMS41ZW07CiAgICAgICAgaGVpZ2h0OiAxLjVlbTsKICAgICAgfQogICAgICAgCiAgICAgIC5tZW51c3ZnIHsKICAgICAgICB3aWR0aDogMmVtOwogICAgICAgIGhlaWdodDogMmVtOwogICAgICB9CgogICAgICAubWVudXN2ZyBwYXRoIHsKICAgICAgICBmaWxsOiAjZmZmOwogICAgICB9CgogICAgICAjbWVudS1jb250ZW50IHsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgICBoZWlnaHQ6IDEwMHZoOwogICAgICAgIHdpZHRoOiAxNWVtOwogICAgICAgIG1hcmdpbi1sZWZ0OiAtMTVlbTsKICAgICAgICBiYWNrZ3JvdW5kOiAjMjIyOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB6LWluZGV4OiAzOyAKICAgICAgfQoKICAgICAgI21lbnUtY29udGVudC5vcGVuIHsKICAgICAgICBtYXJnaW4tbGVmdDogMDsKICAgICAgfQogICAgICAKICAgICAgI21lbnUtY29udGVudCAuaXRlbXMgewogICAgICAgIHBhZGRpbmc6IDAgMWVtOwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICB9CiAgICAgIAogICAgICAjbWVudS1jb250ZW50IC5pdGVtcyBhIHsKICAgICAgICBwYWRkaW5nOiAuNWVtIC43ZW07CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIGJhY2tncm91bmQ6ICMxMTE7CiAgICAgIH0KCiAgICAgICNtZW51LW92ZXJsYXkgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgei1pbmRleDogMzsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgICAgb3BhY2l0eTogLjU7CiAgICAgIH0KCiAgICAgICNtZW51LW92ZXJsYXkub3BlbiB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KCiAgICAgIHN2ZywgaW1nIHsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQoKICAgICAgI3RlbXBsYXRlIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvaGVhZD4KICA8Ym9keSBjbGFzcz0iY29sczYiPgogICAgPGRpdiBpZD0idGVtcGxhdGUiPgogICAgICA8c3ZnIGNsYXNzPSJoZWFydHN2ZyBzdmctaWNvbiIgdmlld0JveD0iMCAwIDIwIDIwIj4KICAgICAgICA8cGF0aCBkPSJNOS43MTksMTcuMDczbC02LjU2Mi02LjUxYy0wLjI3LTAuMjY4LTAuNTA0LTAuNTY3LTAuNjk2LTAuODg4QzEuMzg1LDcuODksMS42Nyw1LjYxMywzLjE1NSw0LjE0YzAuODY0LTAuODU2LDIuMDEyLTEuMzI5LDMuMjMzLTEuMzI5YzEuOTI0LDAsMy4xMTUsMS4xMiwzLjYxMiwxLjc1MmMwLjQ5OS0wLjYzNCwxLjY4OS0xLjc1MiwzLjYxMi0xLjc1MmMxLjIyMSwwLDIuMzY5LDAuNDcyLDMuMjMzLDEuMzI5YzEuNDg0LDEuNDczLDEuNzcxLDMuNzUsMC42OTMsNS41MzdjLTAuMTksMC4zMi0wLjQyNSwwLjYxOC0wLjY5NSwwLjg4N2wtNi41NjIsNi41MUMxMC4xMjUsMTcuMjI5LDkuODc1LDE3LjIyOSw5LjcxOSwxNy4wNzMgTTYuMzg4LDMuNjFDNS4zNzksMy42MSw0LjQzMSw0LDMuNzE3LDQuNzA3QzIuNDk1LDUuOTIsMi4yNTksNy43OTQsMy4xNDUsOS4yNjVjMC4xNTgsMC4yNjUsMC4zNTEsMC41MSwwLjU3NCwwLjczMUwxMCwxNi4yMjhsNi4yODEtNi4yMzJjMC4yMjQtMC4yMjEsMC40MTYtMC40NjYsMC41NzMtMC43MjljMC44ODctMS40NzIsMC42NTEtMy4zNDYtMC41NzEtNC41NkMxNS41Nyw0LDE0LjYyMSwzLjYxLDEzLjYxMiwzLjYxYy0xLjQzLDAtMi42MzksMC43ODYtMy4yNjgsMS44NjNjLTAuMTU0LDAuMjY0LTAuNTM2LDAuMjY0LTAuNjksMEM5LjAyOSw0LjM5Nyw3LjgyLDMuNjEsNi4zODgsMy42MSI+PC9wYXRoPgogICAgICA8L3N2Zz4KICAgICAgPGRpdiBpZD0iY29sc2NzcyI+CiAgICAgIC5jb2xzJHtjb2xzfSAjcGljcyA+IGEsIAogICAgICAuY29scyR7Y29sc30gI3BpY3MgaW1nIHsKICAgICAgICB3aWR0aDogY2FsYygxMDB2dyAvICR7Y29sc30pOwogICAgICB9CgogICAgICAuY29scyR7Y29sc30gI3BpY3MgPiBhIHsKICAgICAgICBoZWlnaHQ6IGNhbGMoMTAwdncgLyAke2NvbHN9KTsKICAgICAgfQogICAgICAKICAgICAgLmNvbHMke2NvbHN9ICNwaWNzID4gYSA+IGEgewogICAgICAgIGZvbnQtc2l6ZTogbWluKDE0dncgKiAoMSAvICR7Y29sc30pLCA2ZW0gKiAoMSAvICR7Y29sc30pKQogICAgICB9CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGlkPSJtZWRpYS1mb290ZXIiPgogICAgICA8YSBpZD0icGljLWxpa2UiIGNsYXNzPSJsaWtlIiBocmVmPSIjIj48L2E+CiAgICAgIDxhIGlkPSJwaWMtcXVlcnkiIGhyZWY9IiMiPjwvYT4KICAgICAgPGEgaWQ9InBpYy11c2VyIiBocmVmPSIjIj48L2E+CiAgICA8L2Rpdj4KICAgIDxjZW50ZXIgaWQ9Im1lZGlhLWNvbnRhaW5lciI+CiAgICAgIDxkaXYgaWQ9InBpYy1jb250YWluZXIiPgogICAgICAgIDxpbWcgaWQ9InBpYyIvPgogICAgICA8L2Rpdj4KICAgIDwvY2VudGVyPgogICAgPGRpdiBpZD0ibWVudS1vdmVybGF5Ij48L2Rpdj4KICAgIDxkaXYgaWQ9Im1lbnUtY29udGVudCIgY2xhc3M9InRlc3QiPgogICAgICA8ZGl2IGNsYXNzPSJpdGVtcyI+CiAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPmNvbHM6PC9kaXY+CiAgICAgICAgPGEgY2xhc3M9InNldGNvbHMiIGRhdGEtY29scz0iMiIgaHJlZj0iIyI+MjwvYT4KICAgICAgICA8YSBjbGFzcz0ic2V0Y29scyIgZGF0YS1jb2xzPSI0IiBocmVmPSIjIj40PC9hPgogICAgICAgIDxhIGNsYXNzPSJzZXRjb2xzIiBkYXRhLWNvbHM9IjYiIGhyZWY9IiMiPjY8L2E+CiAgICAgICAgPGEgY2xhc3M9InNldGNvbHMiIGRhdGEtY29scz0iMTAiIGhyZWY9IiMiPjEwPC9hPgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5saW1pdDo8L2Rpdj4KICAgICAgICA8YSBjbGFzcz0ic2V0bGltaXQiIGRhdGEtbGltaXQ9Ijc1IiBocmVmPSIjIj43NTwvYT4KICAgICAgICA8YSBjbGFzcz0ic2V0bGltaXQiIGRhdGEtbGltaXQ9IjIwMCIgaHJlZj0iIyI+MjAwPC9hPgogICAgICAgIDxhIGNsYXNzPSJzZXRsaW1pdCIgZGF0YS1saW1pdD0iNTAwIiBocmVmPSIjIj41MDA8L2E+CiAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPmxhdGVzdCByZWxlYXNlOjwvZGl2PgogICAgICAgIDxhIGlkPSJyZWxlYXNlIiBocmVmPSIjIj48L2E+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGlkPSJoZWFkZXIiPgogICAgICA8c3BhbiBpZD0iY29udHJvbGluZm8iPmNvbnRyb2xzOiBhcnJvd3MsIGVudGVyLCBlc2M8L3NwYW4+CiAgICAgIDxhIGlkPSJmaWx0ZXItbGlrZXMiIGhyZWY9IiMiPjwvYT4KICAgICAgPGRpdiBjbGFzcz0iaXRlbXMiPgogICAgICAgIDxhIGlkPSJtZW51IiBocmVmPSIjIj4KICAgICAgICAgIDxzdmcgY2xhc3M9Im1lbnVzdmcgc3ZnLWljb24iIHZpZXdCb3g9IjAgMCAyMCAyMCI+CgkJICAgICAgICA8cGF0aCBkPSJNMTAsMS40NDVjLTQuNzI2LDAtOC41NTUsMy44MjktOC41NTUsOC41NTVjMCw0LjcyNSwzLjgyOSw4LjU1NSw4LjU1NSw4LjU1NWM0LjcyNSwwLDguNTU1LTMuODMsOC41NTUtOC41NTVDMTguNTU1LDUuMjc0LDE0LjcyNSwxLjQ0NSwxMCwxLjQ0NSBNMTAsMTcuNjU0Yy00LjIyMSwwLTcuNjU0LTMuNDM0LTcuNjU0LTcuNjU0YzAtNC4yMjEsMy40MzMtNy42NTQsNy42NTQtNy42NTRjNC4yMjIsMCw3LjY1NCwzLjQzMyw3LjY1NCw3LjY1NEMxNy42NTQsMTQuMjIxLDE0LjIyMiwxNy42NTQsMTAsMTcuNjU0IE0xNC4zOSwxMGMwLDAuMjQ4LTAuMjAzLDAuNDUtMC40NSwwLjQ1SDYuMDZjLTAuMjQ4LDAtMC40NS0wLjIwMy0wLjQ1LTAuNDVzMC4yMDMtMC40NSwwLjQ1LTAuNDVoNy44NzlDMTQuMTg3LDkuNTUsMTQuMzksOS43NTIsMTQuMzksMTAgTTE0LjM5LDEyLjcwMmMwLDAuMjQ3LTAuMjAzLDAuNDQ5LTAuNDUsMC40NDlINi4wNmMtMC4yNDgsMC0wLjQ1LTAuMjAyLTAuNDUtMC40NDljMC0wLjI0OCwwLjIwMy0wLjQ1MSwwLjQ1LTAuNDUxaDcuODc5QzE0LjE4NywxMi4yNTEsMTQuMzksMTIuNDU0LDE0LjM5LDEyLjcwMiBNMTQuMzksNy4yOThjMCwwLjI0OC0wLjIwMywwLjQ1LTAuNDUsMC40NUg2LjA2Yy0wLjI0OCwwLTAuNDUtMC4yMDMtMC40NS0wLjQ1czAuMjAzLTAuNDUsMC40NS0wLjQ1aDcuODc5QzE0LjE4Nyw2Ljg0OCwxNC4zOSw3LjA1MSwxNC4zOSw3LjI5OCI+PC9wYXRoPgoJICAgICAgICA8L3N2Zz4KICAgICAgICA8L2E+CiAgICAgICAgPGEgaWQ9InRpdGxlIiBocmVmPSIjIj5pbWFnZXMuaHRtbDwvYT4KICAgICAgICA8Zm9ybSBhY3Rpb249IiMiPgogICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJxdWVyeSIgbmFtZT0icXVlcnkiIGlkPSIiIC8+CiAgICAgICAgICA8aW5wdXQgaWQ9ImdvIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJnbyIvPgogICAgICAgIDwvZm9ybT4KICAgICAgICA8c3BhbiBpZD0icXVlcnlkaXNwbGF5Ij4KICAgICAgICAgIDxzcGFuIGNsYXNzPSJ0ZXh0Ij48L3NwYW4+CiAgICAgICAgPC9zcGFuPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogICAgPGRpdiBpZD0icGljcyI+PC9kaXY+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9zbG93bGkuZ2l0aHViLmlvL2JlY2gzMi1idWZmZXIvYXNzZXRzL2pzL2JlY2gzMi1idWZmZXIubWluLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQ+CiAgICAgIGNvbnN0IHVwZGF0ZXNwdWJrZXkgPSAiYWU1YzZlMGI3NDY2MGQyMTk0YzgyNTRiNWMyYzgyNTY3NjU3NmJlMDI5NzM3OWZhMjA1MjMxMTRhNmE4NWU4NyIKICAgICAgY29uc3QgcXVlcmllcyA9IHsKICAgICAgICAiZ2xvYmFsIjogJ1siUkVRIiwiPEk+Iix7ImNhY2hlIjpbImV4cGxvcmUiLHsidGltZWZyYW1lIjoibGF0ZXN0Iiwic2NvcGUiOiJnbG9iYWwiLCJsaW1pdCI6PEw+fV19XScsIAogICAgICAgICJzZWFyY2giOiAnWyJSRVEiLCI8ST4iLHsiY2FjaGUiOlsic2VhcmNoIix7InF1ZXJ5IjoiPFE+IiwibGltaXQiOjxMPn1dfV0nLAogICAgICAgICJhdXRob3IiOiAnWyJSRVEiLCI8ST4iLHsia2luZHMiOlsxXSwiYXV0aG9ycyI6WyI8UD4iXX1dJywKICAgICAgICAicmVhY3Rpb25zIjogJ1siUkVRIiwiPEk+IiwgeyJraW5kcyI6WzddLCIjZSI6IDxFPn1dJwogICAgICB9CiAgICAgIGNvbnN0IHJlbGF5cyA9IFsKICAgICAgICBbInByaW1hbCIsICJ3c3M6Ly9jYWNoZTMucHJpbWFsLm5ldC9jYWNoZTE3Il0sIAogICAgICAgIFsicmVsYXkiLCAid3NzOi8vbm9zLmxvbCJdLAogICAgICAgIFsicmVsYXkiLCAid3NzOi8vcmVsYXkubm9zdHIuYmFuZC8iXQogICAgICBdCiAgICAgIAogICAgICBjb25zdCBjb2xvcHRzID0gWzIsIDQsIDYsIDEwXQogICAgICBjb2xzID0gKCkgPT4gcGFyc2VJbnQobG9jYWxTdG9yYWdlLmdldEl0ZW0oImNvbHMiKSB8fCAiNCIsIDEwKQogICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoImNvbHMiICsgY29scygpKQogICAgICBsaW1pdCA9ICgpID0+IHBhcnNlSW50KGxvY2FsU3RvcmFnZS5nZXRJdGVtKCJsaW1pdCIpIHx8ICI3NSIsIDEwKQogICAgICBsZXQgcHJvdG9jb2wgPSBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9Nb2JpbGUvKSA/ICJub3N0cjoiIDogIndlYitub3N0cjoiCiAgICAgIGxldCByZWxheXNvY2tldHMgPSBbXQogICAgICBsZXQgcHJpbWFsaGFuZGxlcnMgPSBbXQogICAgICBsZXQgcmVzaGFuZGxlcnMgPSBbXQogICAgICBsZXQgcGljdHVyZXMgPSBbXQogICAgICBsZXQgZXZlbnRkYiA9IFtdCiAgICAgIGxldCByZWFjdGVkID0gW10KICAgICAgbGV0IGlkY291bnRlciA9IDAKICAgICAgbGV0IGltZ3JlZ2V4PS9odHRwKHxzKVw6XC9cL1teIF0qP1wuKHBuZ3xqcGd8anBlZ3x3ZWJwKS9naQogICAgICB3YWl0bXMgPSAzMDAwCiAgICAgIHF1ZXJ5c3RyID0gIiIKICAgICAgCiAgICAgIHVwZGF0ZXF1ZXJ5KCkKICAgICAgcXMoIiNwaWMtbGlrZSIpLmlubmVySFRNTCA9IHFzKCIjZmlsdGVyLWxpa2VzIikuaW5uZXJIVE1MID0gcXMoIiN0ZW1wbGF0ZSAuaGVhcnRzdmciKS5vdXRlckhUTUwKICAgICAgc2V0YWN0aXZlKCJzZXRjb2xzIiwgImNvbHMiLCBjb2xzKCkpCiAgICAgIHNldGFjdGl2ZSgic2V0bGltaXQiLCAibGltaXQiLCBsaW1pdCgpKQogICAgICAgICAgCiAgICAgIGZ1bmN0aW9uIGZyb21IZXhTdHJpbmcoc3RyKXsKICAgICAgICBsZXQgYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoc3RyLmxlbmd0aCAvIDIpCiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBidWZmZXIubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGJ1ZmZlcltpXSA9IHBhcnNlSW50KHN0ci5zdWJzdHIoMiAqIGksIDIpLCAxNikKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGJ1ZmZlcgogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBxcyhxKXsKICAgICAgICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihxKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBxc2EocSl7CiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChxKSkKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gZ2lkKGkpewogICAgICAgIHJldHVybiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiB1cGRhdGVxdWVyeSgpewogICAgICAgIHF1ZXJ5c3RyID0gcXMoIiNxdWVyeWRpc3BsYXkgLnRleHQiKS5pbm5lclRleHQgPSBsb2NhdGlvbi5oYXNoLnN1YnN0cmluZygxKQogICAgICB9CgogICAgICBmdW5jdGlvbiBhY3RpdmUoKXsKICAgICAgICByZXR1cm4gcXMoIiNwaWNzIGEuYWN0aXZlIikKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gcGljb2Zmc2V0KG9mZnNldCl7CiAgICAgICAgY29uc3QgcGljcyA9IHFzYSgiI3BpY3MgPiBhIikuZmlsdGVyKGUgPT4gZS5zdHlsZS5kaXNwbGF5ID09ICJibG9jayIpCiAgICAgICAgcmV0dXJuIHBpY3NbcGljcy5pbmRleE9mKGFjdGl2ZSgpKStvZmZzZXRdCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGxhc3RhY3RpdmUoKXsKICAgICAgICByZXR1cm4gcXNhKCIjcGljcyBhLmFjdGl2ZSIpLnBvcCgpICAgICAgCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIG1lbnUoKXsKICAgICAgICBxc2EoIiNtZW51LWNvbnRlbnQsICNtZW51LW92ZXJsYXkiKS5mb3JFYWNoKG4gPT4gbi5jbGFzc0xpc3QudG9nZ2xlKCJvcGVuIikpCiAgICAgIH0KICAKICAgICAgZnVuY3Rpb24gc2V0YWN0aXZlKGMsIGtleSwgdmFsKXsKICAgICAgICBxc2EoIi4iICsgYykuZm9yRWFjaChuID0+IG4uY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIikpCiAgICAgICAgcXMoIi4iICsgYyArICJbZGF0YS0iICsga2V5ICsgIj0nIiArIHZhbCArICInXSIpLmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgIH0KICAgICAgCiAgICAgIHFzKCJmb3JtIikuYWRkRXZlbnRMaXN0ZW5lcigic3VibWl0IiwgZSA9PiB7CiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpCiAgICAgICAgbG9jYXRpb24uaGFzaCA9ICIjIiArIHFzKCIjcXVlcnkiKS52YWx1ZQogICAgICAgIHVwZGF0ZXF1ZXJ5KCkKICAgICAgfSkKCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgYXN5bmMgKGUpID0+IHsKICAgICAgICAvL2NvbnNvbGUubG9nKCJjbGljayIsIGUsIGUudGFyZ2V0LmhyZWYpCiAgICAgICAgaWYoZS50YXJnZXQudHlwZSA9PSAic3VibWl0IiB8fCAoZS50YXJnZXQudGFnTmFtZSA9PSAiQSIgJiYgZS50YXJnZXQuaHJlZi5tYXRjaCgvXih8d2ViXCspbm9zdHJcOi8pKSl7CiAgICAgICAgICBjb25zb2xlLmxvZygicmV0dXJuIikKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgIAogICAgICAgIGlmKGUudGFyZ2V0LmlkID09ICJ0aXRsZSIpewogICAgICAgICAgcXMoIiNxdWVyeSIpLnZhbHVlID0gIiIKICAgICAgICAgIHFzKCIjZ28iKS5jbGljaygpCiAgICAgICAgfQoKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCkKCiAgICAgICAgaWYoZS50YXJnZXQuaWQgPT0gImZpbHRlci1saWtlcyIpewogICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QudG9nZ2xlKCJmaWx0ZXItbGlrZXMiKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygic2hvdyIpKXsKICAgICAgICAgIGFjdGl2ZSgpLmNsYXNzTGlzdC5yZW1vdmUoImFjdGl2ZSIpCiAgICAgICAgICBnaWQoZS50YXJnZXQuaWQpLmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgICAgICBzaG93KGUudGFyZ2V0LmlkKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKGUudGFyZ2V0LnRhZ05hbWUgIT0gIkEiICYmIHFzKCIjcGljLWNvbnRhaW5lciIpID09IGUudGFyZ2V0KXsKICAgICAgICAgIGhpZGVtZWRpYSgpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CgogICAgICAgIGlmKGUudGFyZ2V0LmlkID09ICJtZW51IiB8fCBlLnRhcmdldC5pZCA9PSAibWVudS1vdmVybGF5Iil7CiAgICAgICAgICBtZW51KCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgaWYoZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJzZXRjb2xzIikpewogICAgICAgICAgZm9yKGxldCBjIG9mIGNvbG9wdHMpewogICAgICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoImNvbHMiICsgYykKICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCJjb2xzIiArIGUudGFyZ2V0LmRhdGFzZXQuY29scykKICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCJjb2xzIiwgZS50YXJnZXQuZGF0YXNldC5jb2xzKQogICAgICAgICAgc2V0YWN0aXZlKCJzZXRjb2xzIiwgImNvbHMiLCBjb2xzKCkpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CgogICAgICAgIGlmKGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygic2V0bGltaXQiKSl7CiAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgibGltaXQiLCBlLnRhcmdldC5kYXRhc2V0LmxpbWl0KQogICAgICAgICAgc2V0YWN0aXZlKCJzZXRsaW1pdCIsICJsaW1pdCIsIGxpbWl0KCkpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CgogICAgICAgIGlmKGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygibGlrZSIpKXsKICAgICAgICAgIGNvbnNvbGUubG9nKCJsaWtlIiwgZS50YXJnZXQpCiAgICAgICAgICBsaWtlKGUudGFyZ2V0KQogICAgICAgIH0KICAgICAgfSkKICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIGxpa2UobGluayl7CiAgICAgICAgY29uc3QgZXZlbnQgPSBsaW5rLnBhcmVudEVsZW1lbnRbImRhdGEtZXZlbnQiXQogICAgICAgIGNvbnN0IHB1YmtleSA9IGF3YWl0IG5vc3RyLmdldFB1YmxpY0tleSgpCiAgICAgICAgY29uc3QgbGlrZSA9IGF3YWl0IG5vc3RyLnNpZ25FdmVudCh7CiAgICAgICAgICAia2luZCI6IDcsCiAgICAgICAgICAiY29udGVudCI6ICIrIiwKICAgICAgICAgICJ0YWdzIjogWwogICAgICAgICAgICBbImUiLCBldmVudC5pZF0sCiAgICAgICAgICAgIFsicCIsIGV2ZW50LnB1YmtleV0KICAgICAgICAgIF0sCiAgICAgICAgICAicHVia2V5IjogcHVia2V5LAogICAgICAgICAgImNyZWF0ZWRfYXQiOiBwYXJzZUludChEYXRlLm5vdygpIC8gMTAwMCAsIDEwKQogICAgICAgIH0pCiAgICAgICAgCiAgICAgICAgcmVsYXlzb2NrZXRzLmZvckVhY2gocyA9PiBzLnNlbmQoSlNPTi5zdHJpbmdpZnkoWyJFVkVOVCIsIGxpa2VdKSkpCgogICAgICAgIGxpbmsuY2xhc3NMaXN0LmFkZCgicmVhY3RlZCIpCgogICAgICAgIGNvbnN0IHBpY2lkID0gbGlua1siZGF0YS1waWMtaWQiXSB8fCBsaW5rLmRhdGFzZXQucGljSWQKICAgICAgICAKICAgICAgICBpZihwaWNpZCl7CiAgICAgICAgICBnaWQocGljaWQpLnF1ZXJ5U2VsZWN0b3IoIi5saWtlIikuY2xhc3NMaXN0LmFkZCgicmVhY3RlZCIpCiAgICAgICAgICByZWFjdGVkLnB1c2gocGljaWQpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGNvbnNvbGUubG9nKCJyZWFjdGlvbiBzZW50IikKICAgICAgfQoKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsIGUgPT4gewogICAgICAgIGlmKFsiVGFiIiwgIkFycm93TGVmdCIsICJBcnJvd1JpZ2h0IiwgIkFycm93VXAiLCAiQXJyb3dEb3duIl0uaW5jbHVkZXMoZS5rZXkpKXsKICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKQogICAgICAgIH0KCiAgICAgICAgaWYoZS5rZXkgPT0gIkVzY2FwZSIpewogICAgICAgICAgbWVudSgpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoZS5rZXkgPT0gIkVudGVyIiAmJiBlLnRhcmdldC50YWdOYW1lID09ICJCT0RZIil7CiAgICAgICAgICBpZihxcygiI21lZGlhLWNvbnRhaW5lciIpLnN0eWxlLmRpc3BsYXkgPT0gImJsb2NrIil7CiAgICAgICAgICAgIGhpZGVtZWRpYSgpCiAgICAgICAgICAgIHJldHVybgogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICBzaG93KGFjdGl2ZSgpLmlkKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQoKICAgICAgICBpZihlLmtleSA9PSAiQXJyb3dVcCIgJiYgcGljb2Zmc2V0KC1jb2xzKCkpKXsKICAgICAgICAgIHBpY29mZnNldCgtY29scygpKS5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICAgICAgbGFzdGFjdGl2ZSgpLmNsYXNzTGlzdC5yZW1vdmUoImFjdGl2ZSIpCiAgICAgICAgfQoKICAgICAgICBpZihlLmtleSA9PSAiQXJyb3dEb3duIiAmJiBwaWNvZmZzZXQoY29scygpKSl7CiAgICAgICAgICBwaWNvZmZzZXQoY29scygpKS5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICAgICAgYWN0aXZlKCkuY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIikKICAgICAgICB9CgogICAgICAgIGlmKGUua2V5ID09ICJBcnJvd0xlZnQiICYmIHBpY29mZnNldCgtMSkpewogICAgICAgICAgcGljb2Zmc2V0KC0xKS5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICAgICAgbGFzdGFjdGl2ZSgpLmNsYXNzTGlzdC5yZW1vdmUoImFjdGl2ZSIpCiAgICAgICAgfQoKICAgICAgICBpZihlLmtleSA9PSAiQXJyb3dSaWdodCIgJiYgcGljb2Zmc2V0KDEpKXsKICAgICAgICAgIHBpY29mZnNldCgxKS5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICAgICAgYWN0aXZlKCkuY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIikKICAgICAgICB9CiAgCiAgICAgICAgaWYocXMoIiNtZWRpYS1jb250YWluZXIiKS5zdHlsZS5kaXNwbGF5ID09ICJibG9jayIpewogICAgICAgICAgc2hvdyhhY3RpdmUoKS5pZCkKICAgICAgICB9CiAgICAgIH0pCgogICAgICBmdW5jdGlvbiBxdWVyeShzb2NrZXQpewogICAgICAgIGxldCB0ID0gRGF0ZS5ub3coKQogICAgICAgIGxldCBxID0gcXVlcnlzdHIKICAgICAgICAKICAgICAgICBwcmltYWxoYW5kbGVycy5wdXNoKChldmVudCkgPT4gewogICAgICAgICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2UoZXZlbnQuZGF0YSlbMl0KICAgICAgICAgIGRhdGEgJiYgZXZlbnRkYi5wdXNoKGRhdGEpCiAgICAgICAgICAgCiAgICAgICAgICBpZihldmVudC5kYXRhLmluZGV4T2YoIkVPU0UiKSA9PSAyKXsKICAgICAgICAgICAgc2F2ZShldmVudGRiLCBxKQogICAgICAgICAgICBldmVudGRiID0gW10KICAgICAgICAgICAgbGV0IHdhaXQgPSB3YWl0bXMgLSAoRGF0ZS5ub3coKSAtIHQpCiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gcXVlcnkoc29ja2V0KSwgd2FpdCkKICAgICAgICAKICAgICAgICAgICAgcHJpbWFsaGFuZGxlcnMuc3BsaWNlKHByaW1hbGhhbmRsZXJzLmluZGV4T2YodGhpcyksIDEpCiAgICAgICAgICB9CiAgICAgICAgfSkKCiAgICAgICAgc29ja2V0LnNlbmQocSA9PSAiIiAmJiBxdWVyaWVzLmdsb2JhbC5yZXBsYWNlKCc8ST4nLCArK2lkY291bnRlcikucmVwbGFjZSgnPEw+JywgbGltaXQoKSkgCiAgICAgICAgICB8fCBxdWVyaWVzLnNlYXJjaC5yZXBsYWNlKCc8ST4nLCArK2lkY291bnRlcikucmVwbGFjZSgnPEw+JywgbGltaXQpLnJlcGxhY2UoJzxRPicsIHEpKQogICAgICB9CgogICAgICBhc3luYyBmdW5jdGlvbiBxdWVyeWxpa2VzKHNvY2tldCwgZXZlbnRpZHMpewogICAgICAgIGlmKCF3aW5kb3cubm9zdHIpewogICAgICAgICAgcmV0dXJuIFtdCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGNvbnN0IG15cHVia2V5ID0gYXdhaXQgbm9zdHIuZ2V0UHVibGljS2V5KCkKICAgICAgICAKICAgICAgICBjb25zdCBxdWVyeWlkID0gImxpa2VzXyIgKyAoKytpZGNvdW50ZXIpCiAgICAgICAgc29ja2V0LnNlbmQocXVlcmllcy5yZWFjdGlvbnMucmVwbGFjZSgiPEk+IiwgcXVlcnlpZCkucmVwbGFjZSgiPEU+IiwgSlNPTi5zdHJpbmdpZnkoZXZlbnRpZHMpKSkKICAgICAgICBjb25zdCByZXMgPSBhd2FpdCB3YWl0cmVzKHF1ZXJ5aWQpCiAgICAgICAgcmV0dXJuIHJlcyAmJiByZXMuZmlsdGVyKGUgPT4gZS5wdWJrZXkgPT0gbXlwdWJrZXkpLm1hcChlID0+IGUudGFncy5maW5kKHQgPT4gdFswXSA9PSAiZSIpWzFdKSB8fCBbXQogICAgICB9CgogICAgICBhc3luYyBmdW5jdGlvbiBxdWVyeXB1YmtleShzb2NrZXQsIHB1YmtleSl7CiAgICAgICAgY29uc3QgcXVlcnlpZCA9ICJxdWVyeV8iICsgKCsraWRjb3VudGVyKQogICAgICAgIHNvY2tldC5zZW5kKHF1ZXJpZXMuYXV0aG9yLnJlcGxhY2UoIjxJPiIsIHF1ZXJ5aWQpLnJlcGxhY2UoIjxQPiIsIHB1YmtleSkpCgogICAgICAgIHJldHVybiAoYXdhaXQgd2FpdHJlcyhxdWVyeWlkKSkKICAgICAgfQoKICAgICAgYXN5bmMgZnVuY3Rpb24gc2F2ZShldmVudGRiLCBxKXsKICAgICAgICBjb25zdCBtZXRhZXZlbnRzID0gZXZlbnRkYi5maWx0ZXIobyA9PiBvLmtpbmQgPT0gMCkKICAgICAgICBjb25zdCBldmVudHMgPSBldmVudGRiLmZpbHRlcihvID0+IG8ua2luZCA9PSAxKQogICAgICAgIGxldCBuZXdwaWNzID0gW10KICAgICAgICAKICAgICAgICBjb25zdCBldmVudGlkcyA9IGV2ZW50cy5tYXAoZSA9PiBlLmlkKQogICAgICAgIGxldCByZWFjdGVkZXZlbnRpZHMgPSBbXQoKICAgICAgICBmb3IobGV0IHMgb2YgcmVsYXlzb2NrZXRzKXsKICAgICAgICAgIHJlYWN0ZWRldmVudGlkcy5wdXNoKC4uLihhd2FpdCBxdWVyeWxpa2VzKHMsIGV2ZW50aWRzKSkpCiAgICAgICAgfQoKICAgICAgICBmb3IobGV0IGV2ZW50IG9mIGV2ZW50cyl7CiAgICAgICAgICBmb3IobGV0IHVybCBvZiBldmVudC5jb250ZW50Lm1hdGNoKGltZ3JlZ2V4KSB8fCBbXSl7CiAgICAgICAgICAgIGlmKCFwaWN0dXJlcy5pbmNsdWRlcyh1cmwpKXsKICAgICAgICAgICAgICBjb25zdCBtZXRhID0gbWV0YWV2ZW50cy5maW5kKG8gPT4gby5wdWJrZXkgPT0gZXZlbnQucHVia2V5KQogICAgICAgICAgICAgIAogICAgICAgICAgICAgIHBpY3R1cmVzLnB1c2godXJsKQogICAgICAgICAgICAgIG5ld3BpY3MucHVzaCh7CiAgICAgICAgICAgICAgICByZWFjdGVkOiByZWFjdGVkZXZlbnRpZHMuaW5jbHVkZXMoZXZlbnQuaWQpLCAKICAgICAgICAgICAgICAgIHVybDogdXJsLCAKICAgICAgICAgICAgICAgIGV2ZW50OiBldmVudCwgCiAgICAgICAgICAgICAgICBiZWNoMzJpZDogYmVjaDMyLmVuY29kZSgibm90ZSIsIGZyb21IZXhTdHJpbmcoZXZlbnQuaWQpKSwKICAgICAgICAgICAgICAgIG1ldGE6IG1ldGEKICAgICAgICAgICAgICB9KQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICB1cGRhdGVwaWNzKG5ld3BpY3MsIHEpCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIHVwZGF0ZXBpY3MocGljcywgcSl7CiAgICAgICAgcGljcy5yZXZlcnNlKCkuZm9yRWFjaChwaWMgPT4gewogICAgICAgICAgY29uc3QgdGV4dCA9IChxIHx8ICJ2aWV3IG5vdGUiKS5zdWJzdHJpbmcoLTMwKQogICAgICAgICAgY29uc3QgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKQogICAgICAgICAgYS5pZCA9ICJwaWNfIiArICgrK2lkY291bnRlcikKICAgICAgICAgIGEuY2xhc3NMaXN0LmFkZCgic2hvdyIpCiAgICAgICAgICAKICAgICAgICAgIGlmKHBpYy5yZWFjdGVkKXsKICAgICAgICAgICAgYS5jbGFzc0xpc3QuYWRkKCJyZWFjdGVkIikKICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgYVsiZGF0YS1waWMiXSA9IHBpYwogICAgICAgICAgYVsiZGF0YS1ldmVudCJdID0gcGljLmV2ZW50CiAgICAgICAgICBhWyJkYXRhLXF1ZXJ5Il0gPSBxCiAgICAgICAgICBhWyJkYXRhLXRleHQiXSA9IHRleHQKICAgICAgICAgIGEuaHJlZiA9ICIjIgogICAgICAgICAgYS5pbm5lckhUTUwgPSAnPGEgY2xhc3M9Imxpa2UnICsgKHBpYy5yZWFjdGVkID8gJyByZWFjdGVkJyA6ICcnKSArICciIGRhdGEtcGljLWlkPSInICsgYS5pZCArIAogICAgICAgICAgICAnIiBocmVmPSIjIj4nICsgcXMoIiN0ZW1wbGF0ZSAuaGVhcnRzdmciKS5vdXRlckhUTUwgKyAnPC9hPjxhIGNsYXNzPSJxdWVyeSIgaHJlZj0iJyArIHByb3RvY29sICsgCiAgICAgICAgICAgIHBpYy5iZWNoMzJpZCArICciPicgKyB0ZXh0ICsgJzwvYT48aW1nIG9ubG9hZD0iZ2lkKFwnJyArIGEuaWQgKyAnXCcpLnN0eWxlLmRpc3BsYXk9XCdibG9ja1wnIiBzcmM9IicgKyBwaWMudXJsICsgJyIvPicKICAgICAgICAgIHFzKCIjcGljcyIpLnByZXBlbmQoYSkKICAgICAgICB9KQoKICAgICAgICBpZihhY3RpdmUoKSA9PSBudWxsKXsKICAgICAgICAgIHFzKCIjcGljcyBhIikuY2xhc3NMaXN0LmFkZCgiYWN0aXZlIikKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGhpZGVtZWRpYSgpewogICAgICAgIHFzYSgiI21lZGlhLWNvbnRhaW5lciwgI3BpYywgI21lZGlhLWZvb3RlciIpLmZvckVhY2gobiA9PiBuLnN0eWxlLmRpc3BsYXkgPSAibm9uZSIpCiAgICAgICAgZ2lkKCJwaWMtbGlrZSIpLmNsYXNzTGlzdC5yZW1vdmUoInJlYWN0ZWQiKQogICAgICB9CgogICAgICBmdW5jdGlvbiB3YWl0cmVzKGtleSl7CiAgICAgICAgbGV0IGV2ZW50cyA9IFtdCiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsKICAgICAgICAgIHJlc2hhbmRsZXJzLnB1c2goKHJlcykgPT4gewogICAgICAgICAgICBsZXQgbyA9IEpTT04ucGFyc2UocmVzLmRhdGEpCiAgICAgICAgICAgIGlmKG9bMV0gPT0ga2V5KXsKICAgICAgICAgICAgICBpZihvWzBdID09ICJFT1NFIil7CiAgICAgICAgICAgICAgICByZXNvbHZlKGV2ZW50cykKICAgICAgICAgICAgICAgIHJlc2hhbmRsZXJzLnNwbGljZShyZXNoYW5kbGVycy5pbmRleE9mKHRoaXMpLCAxKQogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICBldmVudHMucHVzaChvWzJdKQogICAgICAgICAgICB9CiAgICAgICAgICB9KQogICAgICAgIH0pCiAgICAgIH0KICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBjaGVja3VwZGF0ZSgpewogICAgICAgIGNvbnN0IHVwZGF0ZXNyZXMgPSBhd2FpdCBxdWVyeXB1YmtleShyZWxheXNvY2tldHNbMF0sIHVwZGF0ZXNwdWJrZXkpCiAgICAgICAgY29uc3QgdXBkYXRlbm90ZSA9IHVwZGF0ZXNyZXMuZmluZChuID0+IG4uY29udGVudC5tYXRjaCgvXmh0dHBzXDpcL1wvLykpCiAgICAgICAgY29uc3QgYWdlID0gTWF0aC5yb3VuZCgoRGF0ZS5ub3coKSAvIDEwMDAgLSB1cGRhdGVub3RlLmNyZWF0ZWRfYXQpIC8gMzYwMCAvIDI0KQogICAgICAgIGNvbnN0IG5vdGVpZCA9IGJlY2gzMi5lbmNvZGUoIm5vdGUiLCBmcm9tSGV4U3RyaW5nKHVwZGF0ZW5vdGUuaWQpKQogICAgICAgIHFzKCIjcmVsZWFzZSIpLmhyZWYgPSBwcm90b2NvbCArIG5vdGVpZAogICAgICAgIHFzKCIjcmVsZWFzZSIpLmlubmVyVGV4dCA9IChhZ2UgPT0gMCAmJiAidG9kYXkiIHx8IGFnZSArICIgZGF5KHMpIGFnbyIpCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIHNsZWVwKG1zKXsKICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4gc2V0VGltZW91dCgoKSA9PiByZXNvbHZlKCksIG1zKSkKICAgICAgfQoKICAgICAgZnVuY3Rpb24gc2hvdyhpZCl7CiAgICAgICAgY29uc3QgcCA9IGdpZChpZClbImRhdGEtcGljIl0KICAgICAgICBjb25zdCBtZWRpYSA9IGdpZCgibWVkaWEtY29udGFpbmVyIikKICAgICAgICBjb25zdCBwaWMgPSBnaWQoInBpYyIpCiAgICAgICAgY29uc3QgYSA9IHFzKCIjcGljLXF1ZXJ5IikKICAgICAgICAKICAgICAgICBpZihwLm1ldGEpewogICAgICAgICAgY29uc3QgbWV0YWNvbnRlbnQgPSBKU09OLnBhcnNlKHAubWV0YS5jb250ZW50KQogICAgICAgICAgY29uc3QgbmFtZSA9IG1ldGFjb250ZW50LmRpc3BsYXlfbmFtZSB8fCBtZXRhY29udGVudC5uYW1lCiAgICAgICAgICBxcygiI3BpYy11c2VyIikuaHJlZiA9IHByb3RvY29sICsgYmVjaDMyLmVuY29kZSgibnB1YiIsIGZyb21IZXhTdHJpbmcocC5tZXRhLnB1YmtleSkpCiAgICAgICAgICBxcygiI3BpYy11c2VyIikuaW5uZXJUZXh0ID0gbmFtZQogICAgICAgICAgCiAgICAgICAgfQoKICAgICAgICBnaWQoInBpYy1saWtlIilbImRhdGEtcGljLWlkIl0gPSBpZAogICAgICAgIGdpZCgibWVkaWEtZm9vdGVyIilbImRhdGEtZXZlbnQiXSA9IHAuZXZlbnQKICAgICAgICBtZWRpYS5zdHlsZS5kaXNwbGF5ID0gZ2lkKCJtZWRpYS1mb290ZXIiKS5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIgoKICAgICAgICBpZihwLnJlYWN0ZWQgfHwgcmVhY3RlZC5pbmNsdWRlcyhpZCkpewogICAgICAgICAgZ2lkKCJwaWMtbGlrZSIpLmNsYXNzTGlzdC5hZGQoInJlYWN0ZWQiKQogICAgICAgIH0KCiAgICAgICAgYS5ocmVmID0gcHJvdG9jb2wgKyBwLmJlY2gzMmlkCiAgICAgICAgYS5pbm5lclRleHQgPSBnaWQoaWQpWyJkYXRhLXRleHQiXQogICAgICAgIHBpYy5zcmMgPSBwLnVybAogICAgICAgIHBpYy5vbmxvYWQgPSAoKSA9PiAocGljLnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siKQogICAgICB9CiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJsb2FkIiwgKCkgPT4gewogICAgICAgIGZvcihsZXQgcmVsYXkgb2YgcmVsYXlzKXsKICAgICAgICAgIGxldCBzb2NrZXQgPSBuZXcgV2ViU29ja2V0KHJlbGF5WzFdKQoKICAgICAgICAgIGlmKHJlbGF5WzBdID09ICJwcmltYWwiKXsKICAgICAgICAgICAgc29ja2V0Lm9ub3BlbiA9IGFzeW5jIGUgPT4gewogICAgICAgICAgICAgIHdoaWxlKHRydWUpewogICAgICAgICAgICAgICAgbGV0IHJlYWR5ID0gcmVsYXlzb2NrZXRzLmZpbHRlcihyID0+IHIucmVhZHlTdGF0ZSA9PSAxKS5sZW5ndGgKICAgICAgICAgICAgICAgIGlmKHJlYWR5IDwgcmVsYXlzb2NrZXRzLmxlbmd0aCl7CiAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCJjb25uZWN0aW5nIHRvIHJlbGF5cyIsIHJlYWR5LCByZWxheXNvY2tldHMubGVuZ3RoKQogICAgICAgICAgICAgICAgICBhd2FpdCBzbGVlcCg1MCkKICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIH0KICAKICAgICAgICAgICAgICAgIGJyZWFrICAKICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIGNvbnNvbGUubG9nKCJjb25uZWN0ZWQiKQoKICAgICAgICAgICAgICBpZih3aW5kb3cubm9zdHIpewogICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCJub3N0ciIpCiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICBxdWVyeShzb2NrZXQpCiAgICAgICAgICAgIH0KICAgICAgICAgICAgc29ja2V0Lm9ubWVzc2FnZSA9IG1lc3NhZ2UgPT4gcHJpbWFsaGFuZGxlcnMuZm9yRWFjaChmID0+IGYobWVzc2FnZSkpCiAgICAgICAgICAgIHNvY2tldC5vbmNsb3NlID0gKCkgPT4gY29uc29sZS5sb2coImNsb3NlIikKICAgICAgICAgIH1lbHNlewogICAgICAgICAgICBzb2NrZXQub25tZXNzYWdlID0gbWVzc2FnZSA9PiByZXNoYW5kbGVycy5mb3JFYWNoKGYgPT4gZihtZXNzYWdlKSkKICAgICAgICAgICAgcmVsYXlzb2NrZXRzLnB1c2goc29ja2V0KQogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmVsYXlzb2NrZXRzWzBdLm9ub3BlbiA9IGUgPT4gY2hlY2t1cGRhdGUoKQogICAgICB9KQogICAgICAKICAgICAgZm9yKGxldCBjIG9mIGNvbG9wdHMpewogICAgICAgIGRvY3VtZW50LndyaXRlKCc8c3R5bGU+JyArIGNvbHNjc3MuaW5uZXJUZXh0LnJlcGxhY2UoL1wkXHtjb2xzXH0vZywgYykgKyAnPC9zdHlsZT4nKQogICAgICB9CiAgICA8L3NjcmlwdD4KICA8L2JvZHk+CjwvaHRtbD4K\n

sha256

158791b9e9f328f092eff3f9b1d7c0f1e94d7498e6330b8bf7d22843df9ff289 images.html

Reply to this note

Please Login to reply.

Discussion

No replies yet.