TESTX

[fusion_builder_container hundred_percent=»no» hundred_percent_height=»no» hundred_percent_height_scroll=»no» hundred_percent_height_center_content=»yes» equal_height_columns=»no» menu_anchor=»» hide_on_mobile=»small-visibility,medium-visibility,large-visibility» status=»published» publish_date=»» class=»» id=»» link_color=»» link_hover_color=»» border_size=»» border_color=»» border_style=»solid» margin_top=»» margin_bottom=»» padding_top=»» padding_right=»» padding_bottom=»» padding_left=»» gradient_start_color=»» gradient_end_color=»» gradient_start_position=»0″ gradient_end_position=»100″ gradient_type=»linear» radial_direction=»center center» linear_angle=»180″ background_color=»» background_image=»» background_position=»center center» background_repeat=»no-repeat» fade=»no» background_parallax=»none» enable_mobile=»no» parallax_speed=»0.3″ background_blend_mode=»none» video_mp4=»» video_webm=»» video_ogv=»» video_url=»» video_aspect_ratio=»16:9″ video_loop=»yes» video_mute=»yes» video_preview_image=»» filter_hue=»0″ filter_saturation=»100″ filter_brightness=»100″ filter_contrast=»100″ filter_invert=»0″ filter_sepia=»0″ filter_opacity=»100″ filter_blur=»0″ filter_hue_hover=»0″ filter_saturation_hover=»100″ filter_brightness_hover=»100″ filter_contrast_hover=»100″ filter_invert_hover=»0″ filter_sepia_hover=»0″ filter_opacity_hover=»100″ filter_blur_hover=»0″][fusion_builder_row][fusion_builder_column type=»1_1″ type=»1_1″ layout=»1_1″ spacing=»» center_content=»no» link=»» target=»_self» min_height=»» hide_on_mobile=»small-visibility,medium-visibility,large-visibility» class=»» id=»» hover_type=»none» border_size=»0″ border_color=»» border_style=»solid» border_position=»all» box_shadow=»no» box_shadow_blur=»0″ box_shadow_spread=»0″ box_shadow_color=»» box_shadow_style=»» background_type=»single» gradient_start_position=»0″ gradient_end_position=»100″ gradient_type=»linear» radial_direction=»center center» linear_angle=»180″ background_color=»» background_image=»» background_image_id=»» background_position=»left top» background_repeat=»no-repeat» background_blend_mode=»none» animation_type=»» animation_direction=»left» animation_speed=»0.3″ animation_offset=»» filter_type=»regular» filter_hue=»0″ filter_saturation=»100″ filter_brightness=»100″ filter_contrast=»100″ filter_invert=»0″ filter_sepia=»0″ filter_opacity=»100″ filter_blur=»0″ filter_hue_hover=»0″ filter_saturation_hover=»100″ filter_brightness_hover=»100″ filter_contrast_hover=»100″ filter_invert_hover=»0″ filter_sepia_hover=»0″ filter_opacity_hover=»100″ filter_blur_hover=»0″ first=»true» last=»true»][fusion_code]PG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2luZGV4LCBub2ZvbGxvdyI+[/fusion_code][fusion_code]PCFkb2N0eXBlIGh0bWw+CjxodG1sIGxhbmc9ImVzIj4KPGhlYWQ+CiAgPG1ldGEgY2hhcnNldD0idXRmLTgiIC8+CiAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xIiAvPgogIDx0aXRsZT5URVNUWCB2MC4xIC0gQm9uYSBzb3J0Li4uIEEgWCBUT1RFUzwvdGl0bGU+CiAgPHN0eWxlPgogIDpyb290IHsKICAgIC0tYmc6I2YzZjRmNjsKICAgIC0tcGFuZWw6I2YyZjJmMjsKICAgIC0tYWNjZW50OiMyMmM1NWU7CiAgICAtLW11dGVkOiM2YjcyODA7CiAgICAtLXRleHQ6IzExMTgyNzsKICAgIC0td3Jvbmc6I2VmNDQ0NDsKICAgIC0tcmlnaHQ6IzE2YTM0YTsKICB9CgogICogeyBib3gtc2l6aW5nOmJvcmRlci1ib3ggfQogIGJvZHkgewogICAgbWFyZ2luOjA7CiAgICBmb250LWZhbWlseTpzeXN0ZW0tdWksIC1hcHBsZS1zeXN0ZW0sIFNlZ29lIFVJLCBSb2JvdG8sIFVidW50dSwgQ2FudGFyZWxsLCBOb3RvIFNhbnMsIEhlbHZldGljYSwgQXJpYWw7CiAgICBiYWNrZ3JvdW5kOmxpbmVhci1ncmFkaWVudCgxODBkZWcsI2Y5ZmFmYix2YXIoLS1iZykpOwogICAgY29sb3I6dmFyKC0tdGV4dCk7CiAgfQoKICBoZWFkZXIgewogICAgcG9zaXRpb246c3RpY2t5OyB0b3A6MDsgei1pbmRleDoxMDsKICAgIGJhY2tkcm9wLWZpbHRlcjpibHVyKDhweCk7CiAgICBiYWNrZ3JvdW5kOnJnYmEoMjU1LDI1NSwyNTUsLjg1KTsKICAgIGJvcmRlci1ib3R0b206MXB4IHNvbGlkIHJnYmEoMCwwLDAsLjA4KTsKICB9CgogIC53cmFwIHsgbWF4LXdpZHRoOjk4MHB4OyBtYXJnaW46MCBhdXRvOyBwYWRkaW5nOjE2cHggfQogIGgxIHsgbWFyZ2luOjAgMCA0cHg7IGZvbnQtc2l6ZTpjbGFtcCgxLjRyZW0sMS4ycmVtICsgMXZ3LDJyZW0pIH0KICAuc3VidGl0bGUgeyBtYXJnaW46MDsgY29sb3I6dmFyKC0tbXV0ZWQpOyBmb250LXNpemU6Ljk1cmVtIH0KCiAgLmNvbnRyb2xzIHsgZGlzcGxheTpmbGV4OyBmbGV4LXdyYXA6d3JhcDsgZ2FwOjhweDsgbWFyZ2luLXRvcDoxMHB4OyBhbGlnbi1pdGVtczpjZW50ZXIgfQogIGJ1dHRvbiwgc2VsZWN0LCBpbnB1dFt0eXBlPSJjaGVja2JveCJdLCBsYWJlbCB7CiAgICBiYWNrZ3JvdW5kOiNmZmZmZmY7CiAgICBjb2xvcjp2YXIoLS10ZXh0KTsKICAgIGJvcmRlcjoxcHggc29saWQgcmdiYSgwLDAsMCwuMTIpOwogICAgcGFkZGluZzoxMHB4IDE0cHg7CiAgICBib3JkZXItcmFkaXVzOjEycHg7CiAgICBjdXJzb3I6cG9pbnRlcjsKICAgIGZvbnQtd2VpZ2h0OjYwMDsKICB9CiAgaW5wdXRbdHlwZT0iY2hlY2tib3giXXsgcGFkZGluZzowIDEwcHg7IHdpZHRoOmF1dG87IGhlaWdodDphdXRvOyBhY2NlbnQtY29sb3I6dmFyKC0tYWNjZW50KTsgYm9yZGVyOm5vbmUgfQogIGxhYmVsLmNoa3sgYm9yZGVyOm5vbmU7IHBhZGRpbmc6MCA4cHggMCAwOyBjdXJzb3I6cG9pbnRlcjsgfQogIGJ1dHRvbjpob3ZlciB7IGJvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4zKSB9CiAgLmFjY2VudCB7IGJhY2tncm91bmQ6dmFyKC0tYWNjZW50KTsgY29sb3I6IzA0MTMwYTsgYm9yZGVyLWNvbG9yOnRyYW5zcGFyZW50IH0KICAuYWNjZW50OmhvdmVyIHsgZmlsdGVyOmJyaWdodG5lc3MoLjk1KSB9CgogIG1haW4geyBwYWRkaW5nOjI0cHggMTZweCA2NHB4IH0KCiAgLmNhcmQgewogICAgYmFja2dyb3VuZDp2YXIoLS1wYW5lbCk7CiAgICBib3JkZXI6MXB4IHNvbGlkIHJnYmEoMCwwLDAsLjA4KTsKICAgIHBhZGRpbmc6MThweDsgYm9yZGVyLXJhZGl1czoxNnB4OyBtYXJnaW46MTJweCAwOwogICAgYm94LXNoYWRvdzowIDRweCAxMnB4IHJnYmEoMCwwLDAsLjEwKTsKICB9CgogIC5xaGVhZGVyIHsgZGlzcGxheTpmbGV4OyBqdXN0aWZ5LWNvbnRlbnQ6c3BhY2UtYmV0d2VlbjsgYWxpZ24taXRlbXM6YmFzZWxpbmU7IGdhcDo4cHggfQogIC5xdGl0bGUgeyBmb250LXdlaWdodDo3MDA7IGZvbnQtc2l6ZToxLjA1cmVtIH0KCiAgb2wub3B0aW9ucyB7IGxpc3Qtc3R5bGU6bm9uZTsgcGFkZGluZy1sZWZ0OjA7IG1hcmdpbjoxMHB4IDAgMDsgZGlzcGxheTpncmlkOyBnYXA6OHB4IH0KICAub3B0IHsKICAgIGJvcmRlcjoxcHggc29saWQgcmdiYSgwLDAsMCwuMTIpOwogICAgYm9yZGVyLXJhZGl1czoxMnB4OyBwYWRkaW5nOjEwcHggMTJweDsKICAgIGRpc3BsYXk6Z3JpZDsgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOmF1dG8gMWZyIGF1dG87IGdhcDoxMHB4OyBhbGlnbi1pdGVtczpjZW50ZXI7CiAgfQogIC5vcHQgaW5wdXQgeyB3aWR0aDoxOHB4OyBoZWlnaHQ6MThweDsgYWNjZW50LWNvbG9yOnZhcigtLWFjY2VudCkgfQoKICAuYmFkZ2UgeyBmb250LXNpemU6LjhyZW07IHBhZGRpbmc6MnB4IDhweDsgYm9yZGVyLXJhZGl1czo5OTlweDsgYm9yZGVyOjFweCBzb2xpZCByZ2JhKDAsMCwwLC4xNSk7IGNvbG9yOnZhcigtLW11dGVkKSB9CiAgLmZlZWRiYWNrIHsgbWFyZ2luLXRvcDo4cHg7IGZvbnQtc2l6ZTouOTVyZW0gfQogIC5yaWdodCB7IGNvbG9yOnZhcigtLXJpZ2h0KSB9IC53cm9uZyB7IGNvbG9yOnZhcigtLXdyb25nKSB9CgogIGZvb3RlciB7CiAgICBwb3NpdGlvbjpzdGlja3k7IGJvdHRvbTowOwogICAgYmFja2dyb3VuZDpyZ2JhKDI1NSwyNTUsMjU1LC45KTsKICAgIGJvcmRlci10b3A6MXB4IHNvbGlkIHJnYmEoMCwwLDAsLjA4KTsKICAgIGJhY2tkcm9wLWZpbHRlcjpibHVyKDhweCk7CiAgfQogIC5mb290ZXItaW5uZXIgewogICAgbWF4LXdpZHRoOjk4MHB4OyBtYXJnaW46MCBhdXRvOyBwYWRkaW5nOjE2cHg7CiAgICBkaXNwbGF5OmdyaWQ7IGdhcDoxMHB4OyBncmlkLXRlbXBsYXRlLWNvbHVtbnM6MWZyIGF1dG87IGFsaWduLWl0ZW1zOmNlbnRlcgogIH0KICAuc2NvcmVib3ggeyBmb250LXdlaWdodDo3MDAgfQoKICBwcm9ncmVzcyB7IHdpZHRoOjEwMCU7IGhlaWdodDoxMHB4OyBib3JkZXItcmFkaXVzOjk5OXB4OyBvdmVyZmxvdzpoaWRkZW4gfQogIHByb2dyZXNzOjotd2Via2l0LXByb2dyZXNzLWJhciB7IGJhY2tncm91bmQtY29sb3I6I2U1ZTdlYiB9CiAgcHJvZ3Jlc3M6Oi13ZWJraXQtcHJvZ3Jlc3MtdmFsdWUgeyBiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLWFjY2VudCkgfQoKICBAbWVkaWEgKG1heC13aWR0aDo2NDBweCl7IC5mb290ZXItaW5uZXJ7IGdyaWQtdGVtcGxhdGUtY29sdW1uczoxZnIgfSB9CgogIC5oaW50IHsgY29sb3I6dmFyKC0tbXV0ZWQpOyBmb250LXNpemU6Ljg1cmVtOyBtYXJnaW4tdG9wOjZweCB9CiAgLmZpbGV6b25lIHsgYm9yZGVyOjFweCBkYXNoZWQgcmdiYSgwLDAsMCwuMjUpOyBib3JkZXItcmFkaXVzOjEycHg7IHBhZGRpbmc6MTBweCAxMnB4OyBjb2xvcjp2YXIoLS1tdXRlZCkgfQogIDwvc3R5bGU+CjwvaGVhZD4KPGJvZHk+CiAgPGhlYWRlcj4KICAgIDxkaXYgY2xhc3M9IndyYXAiPgogICAgICA8aDE+VEVTVCBTVEVQViAtIEJvbmEgc29ydC4uLiBBIFBFUiBUT1RFUyAtIFYwLjIwPC9oMT4KICAgICAgPHAgY2xhc3M9InN1YnRpdGxlIj5NYXJjYSBlbHMgYmxvY3MgYSBjYXJyZWdhciBpIHByZW0g4oCcQ2FyZ2FyIGJsb3F1ZXPigJ0uPC9wPgoKICAgICAgPGRpdiBjbGFzcz0iY29udHJvbHMiPgogICAgICAgIDxidXR0b24gaWQ9InNodWZmbGVCdG4iIHRpdGxlPSJCYXJhamFyIHByZWd1bnRhcyI+8J+UgCBCYXJhamFyPC9idXR0b24+CiAgICAgICAgPGJ1dHRvbiBpZD0iY2hlY2tBbGxCdG4iIGNsYXNzPSJhY2NlbnQiIHRpdGxlPSJDb3JyZWdpciB0b2RvIj7inIUgQ29ycmVnaXIgdG9kbzwvYnV0dG9uPgogICAgICAgIDxidXR0b24gaWQ9InNob3dBbnNCdG4iIHRpdGxlPSJSZXZlbGFyIHNvbHVjaW9uZXMiPvCfkYHvuI8gTW9zdHJhciBzb2x1Y2lvbmVzPC9idXR0b24+CiAgICAgICAgPGJ1dHRvbiBpZD0icmVzZXRCdG4iIHRpdGxlPSJSZWluaWNpYXIgdGVzdCI+4pm777iPIFJlaW5pY2lhcjwvYnV0dG9uPgogICAgICAgIDxidXR0b24gaWQ9ImV4cG9ydFJlc3VsdHNCdG4iIHRpdGxlPSJFeHBvcnRhciByZXN1bHRhZG9zIChYTFMpIj7wn6e+IEV4cG9ydGFyIHJlc3VsdGFkb3M8L2J1dHRvbj4KICAgICAgICA8c2VsZWN0IGlkPSJtb2RlU2VsIiB0aXRsZT0iTW9kbyBkZSBjb3JyZWNjacOzbiI+CiAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJkZWZlcnJlZCI+Q29ycmVjY2nDs24gYWwgZmluYWw8L29wdGlvbj4KICAgICAgICAgIDxvcHRpb24gdmFsdWU9ImltbWVkaWF0ZSI+Q29ycmVjY2nDs24gaW5tZWRpYXRhPC9vcHRpb24+CiAgICAgICAgPC9zZWxlY3Q+CiAgICAgIDwvZGl2PgoKICAgICAgPCEtLSBTZWxlY3RvciBkZSBibG9xdWVzIDHigJM1IC0tPgogICAgICA8ZGl2IGNsYXNzPSJjb250cm9scyI+CiAgICAgICAgPGxhYmVsIGNsYXNzPSJjaGsiPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgaWQ9ImIxIiBjaGVja2VkPiBCbG9xdWUgMTwvbGFiZWw+CiAgICAgICAgPGxhYmVsIGNsYXNzPSJjaGsiPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgaWQ9ImIyIiBjaGVja2VkPiBCbG9xdWUgMjwvbGFiZWw+CiAgICAgICAgPGxhYmVsIGNsYXNzPSJjaGsiPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgaWQ9ImIzIiBjaGVja2VkPiBCbG9xdWUgMzwvbGFiZWw+CiAgICAgICAgPGxhYmVsIGNsYXNzPSJjaGsiPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgaWQ9ImI0Ij4gQmxvcXVlIDQ8L2xhYmVsPgogICAgICAgIDxsYWJlbCBjbGFzcz0iY2hrIj48aW5wdXQgdHlwZT0iY2hlY2tib3giIGlkPSJiNSI+IEJsb3F1ZSA1PC9sYWJlbD4KICAgICAgICA8YnV0dG9uIGlkPSJsb2FkQmxvY2tzQnRuIiBjbGFzcz0iYWNjZW50Ij7wn4yQIENhcmdhciBibG9xdWVzPC9idXR0b24+CiAgICAgICAgPHNwYW4gaWQ9ImxvYWRTdGF0dXMiIGNsYXNzPSJoaW50Ij48L3NwYW4+CiAgICAgIDwvZGl2PgoKICAgICAgPCEtLSAoT3BjaW9uYWwpIGltcG9ydGFjacOzbiBwb3IgYXJjaGl2byAtLT4KICAgICAgPGRpdiBjbGFzcz0iY29udHJvbHMiIHN0eWxlPSJtYXJnaW4tdG9wOjhweDsiPgogICAgICAgIDxpbnB1dCB0eXBlPSJmaWxlIiBpZD0iZmlsZUlucHV0IiBhY2NlcHQ9ImFwcGxpY2F0aW9uL2pzb24iIC8+CiAgICAgICAgPGRpdiBpZD0iZHJvcHpvbmUiIGNsYXNzPSJmaWxlem9uZSI+QXJyYXN0cmEgeSBzdWVsdGEgYXF1w60gdW4gYXJjaGl2byBKU09OIGRlIHByZWd1bnRhcyBwYXJhIGluY29ycG9yYXJsbzwvZGl2PgogICAgICA8L2Rpdj4KCiAgICAgIDxkaXYgY2xhc3M9ImhpbnQiPgogICAgICAgIEZvcm1hdG8gSlNPTiBlc3BlcmFkbzogW3sicSI6ICIuLi4iLCAib3B0aW9ucyI6IFsiQSIsIkIiLCJDIiwiRCJdLCAiYW5zd2VyIjogMCwgInNvdXJjZSI6IHsicGRmIjoiLi4uIiwgInBhZ2UiOiAxLCAicGFyYWdyYXBoIjoiLi4uIn19XQogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogIDwvaGVhZGVyPgoKICA8bWFpbiBjbGFzcz0id3JhcCIgaWQ9InF1aXoiPjwvbWFpbj4KCiAgPGZvb3Rlcj4KICAgIDxkaXYgY2xhc3M9ImZvb3Rlci1pbm5lciI+CiAgICAgIDxkaXYgY2xhc3M9InNjb3JlYm94IiBpZD0ic2NvcmVCb3giPkFjaWVydG9zOiAwIC8gMDwvZGl2PgogICAgICA8cHJvZ3Jlc3MgaWQ9InByb2dyZXNzIiB2YWx1ZT0iMCIgbWF4PSIwIj48L3Byb2dyZXNzPgogICAgPC9kaXY+CiAgPC9mb290ZXI+CgogIDxzY3JpcHQ+CiAgICAvLyA9PT09PT09PT09PT09PT09PT0gQ29uZmlnID09PT09PT09PT09PT09PT09PQogICAgY29uc3QgU09VUkNFUyA9IHsKICAgICAgYjE6ICJodHRwczovL3d3dy5zdGVwdi51cHYuZXMvdmEvZGF0YV9qc29uX2Jsb2MwMS8iLAogICAgICBiMjogImh0dHBzOi8vd3d3LnN0ZXB2LnVwdi5lcy92YS9kYXRhX2pzb25fYmxvYzAyIiwKICAgICAgYjM6ICJodHRwczovL3d3dy5zdGVwdi51cHYuZXMvdmEvZGF0YV9qc29uX2Jsb2MwMyIsCiAgICAgIGI0OiAiaHR0cHM6Ly93d3cuc3RlcHYudXB2LmVzL3ZhL2RhdGFfanNvbl9ibG9jMDQiLAogICAgICBiNTogImh0dHBzOi8vd3d3LnN0ZXB2LnVwdi5lcy92YS9kYXRhX2pzb25fYmxvYzA1IgogICAgfTsKCiAgICAvLyA9PT09PT09PT09PT09PT09PT0gRXN0YWRvIHkgZGF0b3MgPT09PT09PT09PT09PT09PT09CiAgICBsZXQgZGF0YSA9IFtdOwogICAgbGV0IG1vZGUgPSAnZGVmZXJyZWQnOwogICAgbGV0IHN0YXRlID0gW107CgogICAgLy8gPT09PT09PT09PT09PT09PT09IERPTSA9PT09PT09PT09PT09PT09PT0KICAgIGNvbnN0IHF1aXogPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncXVpeicpOwogICAgY29uc3Qgc2NvcmVCb3ggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2NvcmVCb3gnKTsKICAgIGNvbnN0IHByb2dyZXNzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Byb2dyZXNzJyk7CiAgICBjb25zdCBtb2RlU2VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vZGVTZWwnKTsKICAgIGNvbnN0IGZpbGVJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaWxlSW5wdXQnKTsKICAgIGNvbnN0IGRyb3B6b25lID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Ryb3B6b25lJyk7CiAgICBjb25zdCBiMSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiMScpOwogICAgY29uc3QgYjIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYjInKTsKICAgIGNvbnN0IGIzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2IzJyk7CiAgICBjb25zdCBiNCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiNCcpOwogICAgY29uc3QgYjUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYjUnKTsKICAgIGNvbnN0IGxvYWRCbG9ja3NCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbG9hZEJsb2Nrc0J0bicpOwogICAgY29uc3QgbG9hZFN0YXR1cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2FkU3RhdHVzJyk7CgogICAgbW9kZVNlbC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBlID0+IG1vZGUgPSBlLnRhcmdldC52YWx1ZSk7CgogICAgLy8gPT09PT09PT09PT09PT09PT09IFJlbmRlciA9PT09PT09PT09PT09PT09PT0KICAgIGZ1bmN0aW9uIHJlbmRlcigpIHsKICAgICAgcXVpei5pbm5lckhUTUwgPSAnJzsKICAgICAgZGF0YS5mb3JFYWNoKChpdGVtLCBpZHgpID0+IHsKICAgICAgICBjb25zdCBjYXJkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYXJ0aWNsZScpOwogICAgICAgIGNhcmQuY2xhc3NOYW1lID0gJ2NhcmQnOwoKICAgICAgICBjb25zdCBoZWFkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgICAgaGVhZC5jbGFzc05hbWUgPSAncWhlYWRlcic7CiAgICAgICAgaGVhZC5pbm5lckhUTUwgPSBgCiAgICAgICAgICA8ZGl2IGNsYXNzPSJxdGl0bGUiPiR7aWR4KzF9LiAke2l0ZW0ucX08L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImJhZGdlIj5QcmVndW50YSAke2lkeCsxfSAvICR7ZGF0YS5sZW5ndGh9IOKAlCAke2l0ZW0uYmxvY2tOYW1lIHx8ICcnfTwvZGl2PgogICAgICAgIGA7CiAgICAgICAgY2FyZC5hcHBlbmRDaGlsZChoZWFkKTsKCiAgICAgICAgY29uc3QgbGlzdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ29sJyk7CiAgICAgICAgbGlzdC5jbGFzc05hbWUgPSAnb3B0aW9ucyc7CgogICAgICAgIGl0ZW0ub3B0aW9ucy5mb3JFYWNoKChvcHQsIGkpID0+IHsKICAgICAgICAgIGNvbnN0IGxpID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGknKTsKICAgICAgICAgIGxpLmNsYXNzTmFtZSA9ICdvcHQnOwogICAgICAgICAgbGkuaW5uZXJIVE1MID0gYAogICAgICAgICAgICA8aW5wdXQgdHlwZT0icmFkaW8iIG5hbWU9InEke2lkeH0iIGlkPSJxJHtpZHh9byR7aX0iIC8+CiAgICAgICAgICAgIDxsYWJlbCBmb3I9InEke2lkeH1vJHtpfSI+JHtvcHR9PC9sYWJlbD4KICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImJhZGdlIj48L3NwYW4+CiAgICAgICAgICBgOwogICAgICAgICAgY29uc3QgaW5wdXQgPSBsaS5xdWVyeVNlbGVjdG9yKCdpbnB1dCcpOwogICAgICAgICAgaW5wdXQuY2hlY2tlZCA9IHN0YXRlW2lkeF0gPT09IGk7CiAgICAgICAgICBpbnB1dC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKSA9PiB7CiAgICAgICAgICAgIHN0YXRlW2lkeF0gPSBpOwogICAgICAgICAgICBpZiAobW9kZSA9PT0gJ2ltbWVkaWF0ZScpIGNoZWNrT25lKGlkeCwgbGkpOwogICAgICAgICAgICB1cGRhdGVTY29yZSgpOwogICAgICAgICAgfSk7CiAgICAgICAgICBsaXN0LmFwcGVuZENoaWxkKGxpKTsKICAgICAgICB9KTsKCiAgICAgICAgY29uc3QgZmIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgICBmYi5jbGFzc05hbWUgPSAnZmVlZGJhY2snOwogICAgICAgIGNhcmQuYXBwZW5kQ2hpbGQobGlzdCk7CiAgICAgICAgY2FyZC5hcHBlbmRDaGlsZChmYik7CgogICAgICAgIGNvbnN0IHJvdyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICAgIHJvdy5jbGFzc05hbWUgPSAnY29udHJvbHMnOwogICAgICAgIGNvbnN0IGJ0bkNoZWNrID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7CiAgICAgICAgYnRuQ2hlY2sudGV4dENvbnRlbnQgPSAnQ29ycmVnaXIgZXN0YSc7CiAgICAgICAgYnRuQ2hlY2suYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiBjaGVja09uZShpZHgpKTsKICAgICAgICBjb25zdCBidG5SZXZlYWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTsKICAgICAgICBidG5SZXZlYWwudGV4dENvbnRlbnQgPSAnTW9zdHJhciBzb2x1Y2nDs24nOwogICAgICAgIGJ0blJldmVhbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHJldmVhbChpZHgpKTsKICAgICAgICByb3cuYXBwZW5kQ2hpbGQoYnRuQ2hlY2spOwogICAgICAgIHJvdy5hcHBlbmRDaGlsZChidG5SZXZlYWwpOwogICAgICAgIGNhcmQuYXBwZW5kQ2hpbGQocm93KTsKCiAgICAgICAgcXVpei5hcHBlbmRDaGlsZChjYXJkKTsKICAgICAgfSk7CgogICAgICB1cGRhdGVTY29yZSgpOwogICAgICBwcm9ncmVzcy5tYXggPSBkYXRhLmxlbmd0aCB8fCAwOwogICAgfQoKICAgIGZ1bmN0aW9uIGNoZWNrT25lKGlkeCwgZGlyZWN0TGkgPSBudWxsKSB7CiAgICAgIGlmIChzdGF0ZVtpZHhdID09PSBudWxsIHx8IHN0YXRlW2lkeF0gPT09IHVuZGVmaW5lZCkgcmV0dXJuOwogICAgICBjb25zdCBjYXJkID0gcXVpei5jaGlsZHJlbltpZHhdOwogICAgICBjb25zdCBsaXN0ID0gY2FyZC5xdWVyeVNlbGVjdG9yKCcub3B0aW9ucycpOwogICAgICBjb25zdCBmYiA9IGNhcmQucXVlcnlTZWxlY3RvcignLmZlZWRiYWNrJyk7CiAgICAgIGNvbnN0IGFuc3dlciA9IGRhdGFbaWR4XS5hbnN3ZXI7CgogICAgICBbLi4ubGlzdC5jaGlsZHJlbl0uZm9yRWFjaChsaSA9PiB7CiAgICAgICAgbGkuc3R5bGUuYm9yZGVyQ29sb3IgPSAncmdiYSgwLDAsMCwuMTIpJzsKICAgICAgICBjb25zdCBiYWRnZSA9IGxpLnF1ZXJ5U2VsZWN0b3IoJy5iYWRnZScpOwogICAgICAgIGJhZGdlLnRleHRDb250ZW50ID0gJyc7CiAgICAgICAgYmFkZ2Uuc3R5bGUuY29sb3IgPSAnaW5oZXJpdCc7CiAgICAgIH0pOwoKICAgICAgY29uc3Qgc2VsID0gc3RhdGVbaWR4XTsKICAgICAgY29uc3Qgc2VsZWN0ZWRMaSA9IGRpcmVjdExpIHx8IGxpc3QuY2hpbGRyZW5bc2VsXTsKICAgICAgY29uc3QgcmVmID0gZGF0YVtpZHhdLnNvdXJjZSB8fCBudWxsOwogICAgICBjb25zdCByZWZUZXh0ID0gcmVmID8gYCBWZXJpZmljYSBlbjogPGVtPiR7cmVmLnBkZn08L2VtPiwgcMOhZy4gJHtyZWYucGFnZX0sIHDDoXJyLi90YWJsYTogPGVtPiR7cmVmLnBhcmFncmFwaCB8fCAn4oCUJ308L2VtPi5gIDogJyc7CgogICAgICBpZiAoc2VsID09PSBhbnN3ZXIpIHsKICAgICAgICBzZWxlY3RlZExpLnN0eWxlLmJvcmRlckNvbG9yID0gJ3ZhcigtLXJpZ2h0KSc7CiAgICAgICAgc2VsZWN0ZWRMaS5xdWVyeVNlbGVjdG9yKCcuYmFkZ2UnKS50ZXh0Q29udGVudCA9ICfinJTvuI8gQ29ycmVjdGEnOwogICAgICAgIHNlbGVjdGVkTGkucXVlcnlTZWxlY3RvcignLmJhZGdlJykuc3R5bGUuY29sb3IgPSAndmFyKC0tcmlnaHQpJzsKICAgICAgICBmYi5pbm5lckhUTUwgPSAnPHNwYW4gY2xhc3M9InJpZ2h0Ij7CoUJpZW4hIFJlc3B1ZXN0YSBjb3JyZWN0YS48L3NwYW4+JyArIHJlZlRleHQ7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc2VsZWN0ZWRMaS5zdHlsZS5ib3JkZXJDb2xvciA9ICd2YXIoLS13cm9uZyknOwogICAgICAgIHNlbGVjdGVkTGkucXVlcnlTZWxlY3RvcignLmJhZGdlJykudGV4dENvbnRlbnQgPSAn4pyW77iPIEluY29ycmVjdGEnOwogICAgICAgIHNlbGVjdGVkTGkucXVlcnlTZWxlY3RvcignLmJhZGdlJykuc3R5bGUuY29sb3IgPSAndmFyKC0td3JvbmcpJzsKICAgICAgICBjb25zdCByaWdodExpID0gbGlzdC5jaGlsZHJlblthbnN3ZXJdOwogICAgICAgIHJpZ2h0TGkuc3R5bGUuYm9yZGVyQ29sb3IgPSAndmFyKC0tcmlnaHQpJzsKICAgICAgICByaWdodExpLnF1ZXJ5U2VsZWN0b3IoJy5iYWRnZScpLnRleHRDb250ZW50ID0gJ+KclO+4jyBDb3JyZWN0YSc7CiAgICAgICAgcmlnaHRMaS5xdWVyeVNlbGVjdG9yKCcuYmFkZ2UnKS5zdHlsZS5jb2xvciA9ICd2YXIoLS1yaWdodCknOwogICAgICAgIGZiLmlubmVySFRNTCA9IGA8c3BhbiBjbGFzcz0id3JvbmciPk5vIGVzIGNvcnJlY3RvLjwvc3Bhbj4gTGEgY29ycmVjdGEgZXM6IDxzdHJvbmc+JHtkYXRhW2lkeF0ub3B0aW9uc1thbnN3ZXJdfTwvc3Ryb25nPi5gICsgcmVmVGV4dDsKICAgICAgfQogICAgICB1cGRhdGVTY29yZSgpOwogICAgfQoKICAgIGZ1bmN0aW9uIHJldmVhbChpZHgpIHsKICAgICAgY29uc3QgY2FyZCA9IHF1aXouY2hpbGRyZW5baWR4XTsKICAgICAgY29uc3QgbGlzdCA9IGNhcmQucXVlcnlTZWxlY3RvcignLm9wdGlvbnMnKTsKICAgICAgY29uc3QgZmIgPSBjYXJkLnF1ZXJ5U2VsZWN0b3IoJy5mZWVkYmFjaycpOwogICAgICBjb25zdCBhbnN3ZXIgPSBkYXRhW2lkeF0uYW5zd2VyOwogICAgICBjb25zdCByZWYgPSBkYXRhW2lkeF0uc291cmNlIHx8IG51bGw7CiAgICAgIGNvbnN0IHJlZlRleHQgPSByZWYgPyBgIFZlcmlmaWNhIGVuOiA8ZW0+JHtyZWYucGRmfTwvZW0+LCBww6FnLiAke3JlZi5wYWdlfSwgcMOhcnIuL3RhYmxhOiA8ZW0+JHtyZWYucGFyYWdyYXBoIHx8ICfigJQnfTwvZW0+LmAgOiAnJzsKCiAgICAgIFsuLi5saXN0LmNoaWxkcmVuXS5mb3JFYWNoKChsaSwgaSkgPT4gewogICAgICAgIGxpLnN0eWxlLmJvcmRlckNvbG9yID0gaSA9PT0gYW5zd2VyID8gJ3ZhcigtLXJpZ2h0KScgOiAncmdiYSgwLDAsMCwuMTIpJzsKICAgICAgICBjb25zdCBiYWRnZSA9IGxpLnF1ZXJ5U2VsZWN0b3IoJy5iYWRnZScpOwogICAgICAgIGJhZGdlLnRleHRDb250ZW50ID0gaSA9PT0gYW5zd2VyID8gJ+KclO+4jyBDb3JyZWN0YScgOiAnJzsKICAgICAgICBiYWRnZS5zdHlsZS5jb2xvciA9IGkgPT09IGFuc3dlciA/ICd2YXIoLS1yaWdodCknIDogJ2luaGVyaXQnOwogICAgICB9KTsKICAgICAgZmIuaW5uZXJIVE1MID0gYFNvbHVjacOzbjogPHN0cm9uZz4ke2RhdGFbaWR4XS5vcHRpb25zW2Fuc3dlcl19PC9zdHJvbmc+LmAgKyByZWZUZXh0OwogICAgfQoKICAgIGZ1bmN0aW9uIHNodWZmbGUoKSB7CiAgICAgIGZvciAobGV0IGkgPSBkYXRhLmxlbmd0aCAtIDE7IGkgPiAwOyBpLS0pIHsKICAgICAgICBjb25zdCBqID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKGkgKyAxKSk7CiAgICAgICAgW2RhdGFbaV0sIGRhdGFbal1dID0gW2RhdGFbal0sIGRhdGFbaV1dOwogICAgICAgIFtzdGF0ZVtpXSwgc3RhdGVbal1dID0gW3N0YXRlW2pdLCBzdGF0ZVtpXV07CiAgICAgIH0KICAgICAgcmVuZGVyKCk7CiAgICB9CgogICAgZnVuY3Rpb24gcmVzZXRBbGwoKSB7IHN0YXRlID0gbmV3IEFycmF5KGRhdGEubGVuZ3RoKS5maWxsKG51bGwpOyByZW5kZXIoKTsgfQoKICAgIGZ1bmN0aW9uIGNoZWNrQWxsKCkgeyBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIGlmIChzdGF0ZVtpXSAhPT0gbnVsbCkgY2hlY2tPbmUoaSk7IH0KCiAgICBmdW5jdGlvbiB1cGRhdGVTY29yZSgpIHsKICAgICAgbGV0IGFuc3dlcmVkID0gMCwgY29ycmVjdCA9IDA7CiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykgewogICAgICAgIGlmIChzdGF0ZVtpXSAhPT0gbnVsbCAmJiBzdGF0ZVtpXSAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICBhbnN3ZXJlZCsrOwogICAgICAgICAgaWYgKHN0YXRlW2ldID09PSBkYXRhW2ldLmFuc3dlcikgY29ycmVjdCsrOwogICAgICAgIH0KICAgICAgfQogICAgICBzY29yZUJveC50ZXh0Q29udGVudCA9IGBBY2llcnRvczogJHtjb3JyZWN0fSAvICR7YW5zd2VyZWR9YDsKICAgICAgcHJvZ3Jlc3MudmFsdWUgPSBjb3JyZWN0OwogICAgICBwcm9ncmVzcy5tYXggPSBkYXRhLmxlbmd0aCB8fCAwOwogICAgfQoKICAgIC8vID09PT09PT09PT09PT09PT09PSBFeHBvcnRhY2nDs24gWExTIChSZXN1bWVuIHBvciBibG9xdWUgKyBEZXRhbGxlKSA9PT09PT09PT09PT09PT09PT0KICAgIGZ1bmN0aW9uIGV4cG9ydFJlc3VsdHMoKSB7CiAgICAgIGlmICghZGF0YS5sZW5ndGgpIHsgYWxlcnQoJ05vIGhheSBwcmVndW50YXMgY2FyZ2FkYXMuJyk7IHJldHVybjsgfQoKICAgICAgLy8gTcOpdHJpY2FzIHBvciBibG9xdWUKICAgICAgY29uc3QgYmxvY2tzID0ge307CiAgICAgIGRhdGEuZm9yRWFjaCgocSwgaSkgPT4gewogICAgICAgIGNvbnN0IGtleSA9IHEuYmxvY2tLZXkgfHwgJ3Vua25vd24nOwogICAgICAgIGlmICghYmxvY2tzW2tleV0pIGJsb2Nrc1trZXldID0gewogICAgICAgICAgbmFtZTogcS5ibG9ja05hbWUgfHwga2V5LAogICAgICAgICAgdG90YWw6IDAsIGFuc3dlcmVkOiAwLCBjb3JyZWN0OiAwLCB3cm9uZzogMAogICAgICAgIH07CiAgICAgICAgY29uc3QgYiA9IGJsb2Nrc1trZXldOwogICAgICAgIGIudG90YWwrKzsKICAgICAgICBjb25zdCBzZWwgPSBzdGF0ZVtpXTsKICAgICAgICBpZiAoc2VsICE9PSB1bmRlZmluZWQgJiYgc2VsICE9PSBudWxsKSB7CiAgICAgICAgICBiLmFuc3dlcmVkKys7CiAgICAgICAgICBpZiAoc2VsID09PSBxLmFuc3dlcikgYi5jb3JyZWN0Kys7IGVsc2UgYi53cm9uZysrOwogICAgICAgIH0KICAgICAgfSk7CgogICAgICAvLyBFc2NhcGFyIFhNTAogICAgICBjb25zdCB4ID0gKHMpID0+IFN0cmluZyhzID8/ICcnKS5yZXBsYWNlKC8mL2csJyZhbXA7JykucmVwbGFjZSgvPC9nLCcmbHQ7JykucmVwbGFjZSgvPi9nLCcmZ3Q7JykucmVwbGFjZSgvIi9nLCcmcXVvdDsnKTsKCiAgICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKTsKICAgICAgY29uc3QgdGl0bGUgPSAoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignaDEnKT8udGV4dENvbnRlbnQ/LnRyaW0oKSB8fCAnVGVzdCcpOwoKICAgICAgY29uc3QgaGVhZGVyWE1MID0KYDw/eG1sIHZlcnNpb249IjEuMCI/Pgo8V29ya2Jvb2sgeG1sbnM9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOnNwcmVhZHNoZWV0IgogICAgICAgICAgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgogICAgICAgICAgeG1sbnM6eD0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6ZXhjZWwiCiAgICAgICAgICB4bWxuczpzcz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6c3ByZWFkc2hlZXQiPgogIDxEb2N1bWVudFByb3BlcnRpZXMgeG1sbnM9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSI+CiAgICA8QXV0aG9yPlRFU1RYPC9BdXRob3I+CiAgICA8TGFzdEF1dGhvcj5URVNUWDwvTGFzdEF1dGhvcj4KICAgIDxDcmVhdGVkPiR7eChub3cpfTwvQ3JlYXRlZD4KICAgIDxDb21wYW55PlRFU1RYPC9Db21wYW55PgogICAgPFZlcnNpb24+MS4wPC9WZXJzaW9uPgogIDwvRG9jdW1lbnRQcm9wZXJ0aWVzPgogIDxFeGNlbFdvcmtib29rIHhtbG5zPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpleGNlbCI+CiAgICA8UHJvdGVjdFN0cnVjdHVyZT5GYWxzZTwvUHJvdGVjdFN0cnVjdHVyZT4KICAgIDxQcm90ZWN0V2luZG93cz5GYWxzZTwvUHJvdGVjdFdpbmRvd3M+CiAgPC9FeGNlbFdvcmtib29rPmA7CgogICAgICAvLyBIb2phIDE6IFJlc3VtZW4KICAgICAgbGV0IHNoZWV0UmVzdW1lbiA9CmAgIDxXb3Jrc2hlZXQgc3M6TmFtZT0iUmVzdW1lbiI+CiAgICA8VGFibGU+CiAgICAgIDxSb3c+CiAgICAgICAgPENlbGw+PERhdGEgc3M6VHlwZT0iU3RyaW5nIj5CbG9xdWU8L0RhdGE+PC9DZWxsPgogICAgICAgIDxDZWxsPjxEYXRhIHNzOlR5cGU9Ik51bWJlciI+VG90YWw8L0RhdGE+PC9DZWxsPgogICAgICAgIDxDZWxsPjxEYXRhIHNzOlR5cGU9Ik51bWJlciI+UmVzcG9uZGlkYXM8L0RhdGE+PC9DZWxsPgogICAgICAgIDxDZWxsPjxEYXRhIHNzOlR5cGU9Ik51bWJlciI+QWNpZXJ0b3M8L0RhdGE+PC9DZWxsPgogICAgICAgIDxDZWxsPjxEYXRhIHNzOlR5cGU9Ik51bWJlciI+RmFsbG9zPC9EYXRhPjwvQ2VsbD4KICAgICAgICA8Q2VsbD48RGF0YSBzczpUeXBlPSJTdHJpbmciPiUgQWNpZXJ0bzwvRGF0YT48L0NlbGw+CiAgICAgIDwvUm93PmA7CgogICAgICBPYmplY3QudmFsdWVzKGJsb2NrcykuZm9yRWFjaChiID0+IHsKICAgICAgICBjb25zdCBhY2MgPSBiLmFuc3dlcmVkID8gKGIuY29ycmVjdCAvIGIuYW5zd2VyZWQpIDogMDsKICAgICAgICBzaGVldFJlc3VtZW4gKz0gYAogICAgICA8Um93PgogICAgICAgIDxDZWxsPjxEYXRhIHNzOlR5cGU9IlN0cmluZyI+JHt4KGIubmFtZSl9PC9EYXRhPjwvQ2VsbD4KICAgICAgICA8Q2VsbD48RGF0YSBzczpUeXBlPSJOdW1iZXIiPiR7Yi50b3RhbH08L0RhdGE+PC9DZWxsPgogICAgICAgIDxDZWxsPjxEYXRhIHNzOlR5cGU9Ik51bWJlciI+JHtiLmFuc3dlcmVkfTwvRGF0YT48L0NlbGw+CiAgICAgICAgPENlbGw+PERhdGEgc3M6VHlwZT0iTnVtYmVyIj4ke2IuY29ycmVjdH08L0RhdGE+PC9DZWxsPgogICAgICAgIDxDZWxsPjxEYXRhIHNzOlR5cGU9Ik51bWJlciI+JHtiLndyb25nfTwvRGF0YT48L0NlbGw+CiAgICAgICAgPENlbGw+PERhdGEgc3M6VHlwZT0iU3RyaW5nIj4keyhhY2MqMTAwKS50b0ZpeGVkKDEpfSU8L0RhdGE+PC9DZWxsPgogICAgICA8L1Jvdz5gOwogICAgICB9KTsKCiAgICAgIGNvbnN0IHRvdGFscyA9IE9iamVjdC52YWx1ZXMoYmxvY2tzKS5yZWR1Y2UoKGEsYik9Pih7CiAgICAgICAgdG90YWw6YS50b3RhbCtiLnRvdGFsLCBhbnN3ZXJlZDphLmFuc3dlcmVkK2IuYW5zd2VyZWQsIGNvcnJlY3Q6YS5jb3JyZWN0K2IuY29ycmVjdCwgd3Jvbmc6YS53cm9uZytiLndyb25nCiAgICAgIH0pLCB7dG90YWw6MCxhbnN3ZXJlZDowLGNvcnJlY3Q6MCx3cm9uZzowfSk7CiAgICAgIGNvbnN0IGFjY0dsb2JhbCA9IHRvdGFscy5hbnN3ZXJlZCA/ICh0b3RhbHMuY29ycmVjdC90b3RhbHMuYW5zd2VyZWQpIDogMDsKCiAgICAgIHNoZWV0UmVzdW1lbiArPSBgCiAgICAgIDxSb3c+CiAgICAgICAgPENlbGw+PERhdGEgc3M6VHlwZT0iU3RyaW5nIj5UT1RBTDwvRGF0YT48L0NlbGw+CiAgICAgICAgPENlbGw+PERhdGEgc3M6VHlwZT0iTnVtYmVyIj4ke3RvdGFscy50b3RhbH08L0RhdGE+PC9DZWxsPgogICAgICAgIDxDZWxsPjxEYXRhIHNzOlR5cGU9Ik51bWJlciI+JHt0b3RhbHMuYW5zd2VyZWR9PC9EYXRhPjwvQ2VsbD4KICAgICAgICA8Q2VsbD48RGF0YSBzczpUeXBlPSJOdW1iZXIiPiR7dG90YWxzLmNvcnJlY3R9PC9EYXRhPjwvQ2VsbD4KICAgICAgICA8Q2VsbD48RGF0YSBzczpUeXBlPSJOdW1iZXIiPiR7dG90YWxzLndyb25nfTwvRGF0YT48L0NlbGw+CiAgICAgICAgPENlbGw+PERhdGEgc3M6VHlwZT0iU3RyaW5nIj4keyhhY2NHbG9iYWwqMTAwKS50b0ZpeGVkKDEpfSU8L0RhdGE+PC9DZWxsPgogICAgICA8L1Jvdz4KICAgIDwvVGFibGU+CiAgPC9Xb3Jrc2hlZXQ+YDsKCiAgICAgIC8vIEhvamEgMjogRGV0YWxsZQogICAgICBsZXQgc2hlZXREZXRhbGxlID0KYCAgPFdvcmtzaGVldCBzczpOYW1lPSJEZXRhbGxlIj4KICAgIDxUYWJsZT4KICAgICAgPFJvdz4KICAgICAgICA8Q2VsbD48RGF0YSBzczpUeXBlPSJTdHJpbmciPkJsb3F1ZTwvRGF0YT48L0NlbGw+CiAgICAgICAgPENlbGw+PERhdGEgc3M6VHlwZT0iTnVtYmVyIj4jPC9EYXRhPjwvQ2VsbD4KICAgICAgICA8Q2VsbD48RGF0YSBzczpUeXBlPSJTdHJpbmciPlByZWd1bnRhPC9EYXRhPjwvQ2VsbD4KICAgICAgICA8Q2VsbD48RGF0YSBzczpUeXBlPSJTdHJpbmciPk1hcmNhZGE8L0RhdGE+PC9DZWxsPgogICAgICAgIDxDZWxsPjxEYXRhIHNzOlR5cGU9IlN0cmluZyI+Q29ycmVjdGE8L0RhdGE+PC9DZWxsPgogICAgICAgIDxDZWxsPjxEYXRhIHNzOlR5cGU9IlN0cmluZyI+wr9BY2llcnRvPzwvRGF0YT48L0NlbGw+CiAgICAgIDwvUm93PmA7CgogICAgICBkYXRhLmZvckVhY2goKHEsIGkpID0+IHsKICAgICAgICBjb25zdCBzZWwgPSBzdGF0ZVtpXTsKICAgICAgICBjb25zdCBzZWxUZXh0ID0gKHNlbCAhPT0gdW5kZWZpbmVkICYmIHNlbCAhPT0gbnVsbCkgPyBxLm9wdGlvbnNbc2VsXSA6ICcnOwogICAgICAgIGNvbnN0IG9rVGV4dCAgPSBxLm9wdGlvbnNbcS5hbnN3ZXJdOwogICAgICAgIGNvbnN0IGlzT2sgICAgPSAoc2VsICE9PSB1bmRlZmluZWQgJiYgc2VsICE9PSBudWxsKSA/IChzZWwgPT09IHEuYW5zd2VyID8gJ1PDrScgOiAnTm8nKSA6ICcnOwogICAgICAgIHNoZWV0RGV0YWxsZSArPSBgCiAgICAgIDxSb3c+CiAgICAgICAgPENlbGw+PERhdGEgc3M6VHlwZT0iU3RyaW5nIj4ke3gocS5ibG9ja05hbWUgfHwgJycpfTwvRGF0YT48L0NlbGw+CiAgICAgICAgPENlbGw+PERhdGEgc3M6VHlwZT0iTnVtYmVyIj4ke2krMX08L0RhdGE+PC9DZWxsPgogICAgICAgIDxDZWxsPjxEYXRhIHNzOlR5cGU9IlN0cmluZyI+JHt4KHEucSl9PC9EYXRhPjwvQ2VsbD4KICAgICAgICA8Q2VsbD48RGF0YSBzczpUeXBlPSJTdHJpbmciPiR7eChzZWxUZXh0KX08L0RhdGE+PC9DZWxsPgogICAgICAgIDxDZWxsPjxEYXRhIHNzOlR5cGU9IlN0cmluZyI+JHt4KG9rVGV4dCl9PC9EYXRhPjwvQ2VsbD4KICAgICAgICA8Q2VsbD48RGF0YSBzczpUeXBlPSJTdHJpbmciPiR7eChpc09rKX08L0RhdGE+PC9DZWxsPgogICAgICA8L1Jvdz5gOwogICAgICB9KTsKCiAgICAgIHNoZWV0RGV0YWxsZSArPSBgCiAgICA8L1RhYmxlPgogIDwvV29ya3NoZWV0PmA7CgogICAgICBjb25zdCBmb290ZXJYTUwgPSBgPC9Xb3JrYm9vaz5gOwogICAgICBjb25zdCB4bWwgPSBoZWFkZXJYTUwgKyAnXG4nICsgc2hlZXRSZXN1bWVuICsgJ1xuJyArIHNoZWV0RGV0YWxsZSArICdcbicgKyBmb290ZXJYTUw7CgogICAgICBjb25zdCBibG9iID0gbmV3IEJsb2IoW3htbF0sIHsgdHlwZTogJ2FwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbCcgfSk7CiAgICAgIGNvbnN0IHVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7CiAgICAgIGNvbnN0IGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7CiAgICAgIGNvbnN0IHN0YW1wID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpLnJlcGxhY2UoL1s6Ll0vZywnLScpOwogICAgICBhLmhyZWYgPSB1cmw7IGEuZG93bmxvYWQgPSBgJHt0aXRsZS5yZXBsYWNlKC9ccysvZywnXycpfS1yZXN1bHRhZG9zLSR7c3RhbXB9Lnhsc2A7CiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSk7IGEuY2xpY2soKTsgVVJMLnJldm9rZU9iamVjdFVSTCh1cmwpOyBhLnJlbW92ZSgpOwogICAgfQoKICAgIC8vID09PT09PT09PT09PT09PT09PSBVdGlsaWRhZGVzIGRlIGNhcmdhIChKU09OIHB1cm8gbyBpbmNydXN0YWRvIGVuIEhUTUwpID09PT09PT09PT09PT09PT09PQogICAgY29uc3QgaHRtbERlY29kZSA9IChzKSA9PiB7IGNvbnN0IGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZXh0YXJlYSIpOyBkLmlubmVySFRNTCA9IHM7IHJldHVybiBkLnZhbHVlOyB9OwogICAgY29uc3QgdHJ5UGFyc2VKU09OID0gKHQpID0+IHsgdHJ5IHsgcmV0dXJuIEpTT04ucGFyc2UodCk7IH0gY2F0Y2ggKF8pIHsgcmV0dXJuIG51bGw7IH0gfTsKCiAgICBmdW5jdGlvbiBmaW5kSlNPTkluRG9jKGRvYykgewogICAgICBjb25zdCBzID0gZG9jLnF1ZXJ5U2VsZWN0b3IoJ3NjcmlwdFt0eXBlPSJhcHBsaWNhdGlvbi9qc29uIl0nKTsKICAgICAgaWYgKHM/LnRleHRDb250ZW50Py50cmltKCkpIHJldHVybiBzLnRleHRDb250ZW50LnRyaW0oKTsKICAgICAgY29uc3QgY2FuZGlkYXRlcyA9IFtkb2MucXVlcnlTZWxlY3RvcignI215LWpzb24nKSwgLi4uZG9jLnF1ZXJ5U2VsZWN0b3JBbGwoJ3ByZSwgY29kZScpXS5maWx0ZXIoQm9vbGVhbik7CiAgICAgIGZvciAoY29uc3QgZWwgb2YgY2FuZGlkYXRlcykgewogICAgICAgIGNvbnN0IHR4dCA9IGVsLnRleHRDb250ZW50Py50cmltKCkgfHwgIiI7CiAgICAgICAgaWYgKHR4dC5pbmNsdWRlcygneycpIHx8IHR4dC5pbmNsdWRlcygnWycpKSByZXR1cm4gdHh0OwogICAgICB9CiAgICAgIHJldHVybiBkb2MuYm9keT8uaW5uZXJIVE1MIHx8ICIiOwogICAgfQoKICAgIGZ1bmN0aW9uIGV4dHJhY3RKU09OSGV1cmlzdGljKHRleHQpIHsKICAgICAgbGV0IHBhcnNlZCA9IHRyeVBhcnNlSlNPTih0ZXh0KTsKICAgICAgaWYgKHBhcnNlZCkgcmV0dXJuIHBhcnNlZDsKICAgICAgY29uc3QgZGVzID0gaHRtbERlY29kZSh0ZXh0KS50cmltKCk7CiAgICAgIHBhcnNlZCA9IHRyeVBhcnNlSlNPTihkZXMpOwogICAgICBpZiAocGFyc2VkKSByZXR1cm4gcGFyc2VkOwoKICAgICAgY29uc3QgaU9iaiA9IGRlcy5pbmRleE9mKCJ7Iik7CiAgICAgIGNvbnN0IGlBcnIgPSBkZXMuaW5kZXhPZigiWyIpOwogICAgICBjb25zdCBpID0gKGlPYmogPT09IC0xKSA/IGlBcnIgOiAoaUFyciA9PT0gLTEgPyBpT2JqIDogTWF0aC5taW4oaU9iaiwgaUFycikpOwogICAgICBpZiAoaSA+PSAwKSB7CiAgICAgICAgY29uc3Qgb3BlbiA9IGRlc1tpXSA9PT0gInsiID8gInsiIDogIlsiOwogICAgICAgIGNvbnN0IGNsb3NlID0gb3BlbiA9PT0gInsiID8gIn0iIDogIl0iOwogICAgICAgIGxldCBkZXB0aCA9IDAsIGVuZCA9IC0xOwogICAgICAgIGZvciAobGV0IGogPSBpOyBqIDwgZGVzLmxlbmd0aDsgaisrKSB7CiAgICAgICAgICBjb25zdCBjaCA9IGRlc1tqXTsKICAgICAgICAgIGlmIChjaCA9PT0gb3BlbikgZGVwdGgrKzsKICAgICAgICAgIGVsc2UgaWYgKGNoID09PSBjbG9zZSkgeyBkZXB0aC0tOyBpZiAoZGVwdGggPT09IDApIHsgZW5kID0gaiArIDE7IGJyZWFrOyB9IH0KICAgICAgICB9CiAgICAgICAgaWYgKGVuZCA+IGkpIHsKICAgICAgICAgIGNvbnN0IGZyYWcgPSBkZXMuc2xpY2UoaSwgZW5kKTsKICAgICAgICAgIHBhcnNlZCA9IHRyeVBhcnNlSlNPTihmcmFnKTsKICAgICAgICAgIGlmIChwYXJzZWQpIHJldHVybiBwYXJzZWQ7CiAgICAgICAgfQogICAgICB9CiAgICAgIHRocm93IG5ldyBFcnJvcigiTm8gc2UgaGEgcG9kaWRvIGV4dHJhZXIgSlNPTiB2w6FsaWRvIGRlIGxhIHDDoWdpbmEuIik7CiAgICB9CgogICAgZnVuY3Rpb24gbm9ybWFsaXplUXVlc3Rpb25zKGFyciwgb3JpZ2luS2V5KSB7CiAgICAgIGlmICghQXJyYXkuaXNBcnJheShhcnIpKSB0aHJvdyBuZXcgRXJyb3IoJ0VsIGNvbnRlbmlkbyBvYnRlbmlkbyBubyBlcyB1biBhcnJheSBkZSBwcmVndW50YXMnKTsKICAgICAgY29uc3QgYmxvY2tOYW1lTWFwID0geyBiMTonQmxvcXVlIDEnLCBiMjonQmxvcXVlIDInLCBiMzonQmxvcXVlIDMnLCBiNDonQmxvcXVlIDQnLCBiNTonQmxvcXVlIDUnIH07CiAgICAgIHJldHVybiBhcnIubWFwKChwLCBpKSA9PiAoewogICAgICAgIHE6IFN0cmluZyhwLnEgfHwgYFByZWd1bnRhIGltcG9ydGFkYSAke2krMX1gKSwKICAgICAgICBvcHRpb25zOiBBcnJheS5pc0FycmF5KHAub3B0aW9ucykgPyBwLm9wdGlvbnMuc2xpY2UoMCw0KS5tYXAoU3RyaW5nKSA6IFsnQScsJ0InLCdDJywnRCddLAogICAgICAgIGFuc3dlcjogTnVtYmVyLmlzSW50ZWdlcihwLmFuc3dlcikgPyBwLmFuc3dlciA6IDAsCiAgICAgICAgc291cmNlOiBwLnNvdXJjZSAmJiB0eXBlb2YgcC5zb3VyY2UgPT09ICdvYmplY3QnID8gcC5zb3VyY2UgOiBudWxsLAogICAgICAgIGJsb2NrS2V5OiBvcmlnaW5LZXksCiAgICAgICAgYmxvY2tOYW1lOiBibG9ja05hbWVNYXBbb3JpZ2luS2V5XSB8fCBvcmlnaW5LZXkgfHwgJ0Jsb3F1ZScKICAgICAgfSkpOwogICAgfQoKICAgIGFzeW5jIGZ1bmN0aW9uIGZldGNoRnJvbVVybCh1cmwsIG9yaWdpbktleSkgewogICAgICBjb25zdCBidXN0ID0gKHVybC5pbmNsdWRlcygnPycpID8gJyYnIDogJz8nKSArICd2PScgKyBEYXRlLm5vdygpOwogICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCh1cmwgKyBidXN0LCB7IGNyZWRlbnRpYWxzOiAnb21pdCcsIGNhY2hlOiAnbm8tc3RvcmUnIH0pOwogICAgICBpZiAoIXJlcy5vaykgdGhyb3cgbmV3IEVycm9yKGBIVFRQICR7cmVzLnN0YXR1c31gKTsKCiAgICAgIC8vIGludGVudG8gSlNPTiBkaXJlY3RvCiAgICAgIHRyeSB7CiAgICAgICAgY29uc3QgYXNKc29uID0gYXdhaXQgcmVzLmNsb25lKCkuanNvbigpOwogICAgICAgIHJldHVybiBub3JtYWxpemVRdWVzdGlvbnMoYXNKc29uLCBvcmlnaW5LZXkpOwogICAgICB9IGNhdGNoIChfKSB7fQoKICAgICAgLy8gcGFyc2VhciBIVE1MIGNvbiBKU09OIGluY3J1c3RhZG8KICAgICAgY29uc3QgaHRtbCA9IGF3YWl0IHJlcy50ZXh0KCk7CiAgICAgIGNvbnN0IGRvYyAgPSBuZXcgRE9NUGFyc2VyKCkucGFyc2VGcm9tU3RyaW5nKGh0bWwsICd0ZXh0L2h0bWwnKTsKICAgICAgY29uc3QgcmF3ICA9IGZpbmRKU09OSW5Eb2MoZG9jKTsKICAgICAgY29uc3QgcGFyc2VkID0gZXh0cmFjdEpTT05IZXVyaXN0aWMocmF3KTsKICAgICAgcmV0dXJuIG5vcm1hbGl6ZVF1ZXN0aW9ucyhwYXJzZWQsIG9yaWdpbktleSk7CiAgICB9CgogICAgYXN5bmMgZnVuY3Rpb24gbG9hZFNlbGVjdGVkQmxvY2tzKCkgewogICAgICBjb25zdCBzZWxlY3RlZCA9IFsKICAgICAgICBiMT8uY2hlY2tlZCA/ICdiMScgOiBudWxsLAogICAgICAgIGIyPy5jaGVja2VkID8gJ2IyJyA6IG51bGwsCiAgICAgICAgYjM/LmNoZWNrZWQgPyAnYjMnIDogbnVsbCwKICAgICAgICBiND8uY2hlY2tlZCA/ICdiNCcgOiBudWxsLAogICAgICAgIGI1Py5jaGVja2VkID8gJ2I1JyA6IG51bGwsCiAgICAgIF0uZmlsdGVyKEJvb2xlYW4pOwoKICAgICAgaWYgKCFzZWxlY3RlZC5sZW5ndGgpIHsKICAgICAgICBsb2FkU3RhdHVzLnRleHRDb250ZW50ID0gJ1NlbGVjY2lvbmEgYWwgbWVub3MgdW4gYmxvcXVlLic7CiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICBsb2FkQmxvY2tzQnRuLmRpc2FibGVkID0gdHJ1ZTsKICAgICAgbG9hZFN0YXR1cy50ZXh0Q29udGVudCA9ICdDYXJnYW5kbyBibG9xdWVzLi4uJzsKICAgICAgdHJ5IHsKICAgICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwoc2VsZWN0ZWQubWFwKGtleSA9PiBmZXRjaEZyb21VcmwoU09VUkNFU1trZXldLCBrZXkpKSk7CiAgICAgICAgZGF0YSA9IHJlc3VsdHMuZmxhdCgpOwogICAgICAgIHN0YXRlID0gbmV3IEFycmF5KGRhdGEubGVuZ3RoKS5maWxsKG51bGwpOwogICAgICAgIHJlbmRlcigpOwogICAgICAgIGxvYWRTdGF0dXMudGV4dENvbnRlbnQgPSBgQ2FyZ2Fkb3MgJHtkYXRhLmxlbmd0aH0gw610ZW1zIGRlICR7c2VsZWN0ZWQubGVuZ3RofSBibG9xdWUocykuYDsKICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7CiAgICAgICAgbG9hZFN0YXR1cy50ZXh0Q29udGVudCA9ICdFcnJvciBhbCBjYXJnYXI6ICcgKyBlLm1lc3NhZ2UgKyAnICjCv0NPUlMgbyByZWQ/KSc7CiAgICAgIH0gZmluYWxseSB7CiAgICAgICAgbG9hZEJsb2Nrc0J0bi5kaXNhYmxlZCA9IGZhbHNlOwogICAgICB9CiAgICB9CgogICAgLy8gPT09PT09PT09PT09PT09PT09IEltcG9ydGFjacOzbiBwb3IgYXJjaGl2byAob3BjaW9uYWwpID09PT09PT09PT09PT09PT09PQogICAgYXN5bmMgZnVuY3Rpb24gaGFuZGxlRmlsZXMoZmlsZXMpIHsKICAgICAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIGNvbnN0IHRleHQgPSBhd2FpdCBmaWxlLnRleHQoKTsKICAgICAgICAgIGNvbnN0IGluY29taW5nID0gSlNPTi5wYXJzZSh0ZXh0KTsKICAgICAgICAgIGNvbnN0IGNsZWFuZWQgPSBub3JtYWxpemVRdWVzdGlvbnMoaW5jb21pbmcsICdhcmNoaXZvJyk7CiAgICAgICAgICBkYXRhID0gZGF0YS5jb25jYXQoY2xlYW5lZCk7CiAgICAgICAgfSBjYXRjaCAoZXJyKSB7IGFsZXJ0KCdFcnJvciBhbCBsZWVyIEpTT046ICcgKyBlcnIubWVzc2FnZSk7IH0KICAgICAgfQogICAgICBzdGF0ZSA9IG5ldyBBcnJheShkYXRhLmxlbmd0aCkuZmlsbChudWxsKTsKICAgICAgcmVuZGVyKCk7CiAgICB9CgogICAgLy8gPT09PT09PT09PT09PT09PT09IExpc3RlbmVycyBVSSA9PT09PT09PT09PT09PT09PT0KICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzaHVmZmxlQnRuJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBzaHVmZmxlKTsKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjaGVja0FsbEJ0bicpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgY2hlY2tBbGwpOwogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Nob3dBbnNCdG4nKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IGRhdGEuZm9yRWFjaCgoXywgaSkgPT4gcmV2ZWFsKGkpKSk7CiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVzZXRCdG4nKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHJlc2V0QWxsKTsKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHBvcnRSZXN1bHRzQnRuJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBleHBvcnRSZXN1bHRzKTsKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2FkQmxvY2tzQnRuJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBsb2FkU2VsZWN0ZWRCbG9ja3MpOwoKICAgIGlmIChmaWxlSW5wdXQgJiYgZHJvcHpvbmUpIHsKICAgICAgZmlsZUlucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIChlKSA9PiBoYW5kbGVGaWxlcyhlLnRhcmdldC5maWxlcykpOwogICAgICA7WydkcmFnZW50ZXInLCdkcmFnb3ZlciddLmZvckVhY2goZXYgPT4gZHJvcHpvbmUuYWRkRXZlbnRMaXN0ZW5lcihldiwgZSA9PiB7IGUucHJldmVudERlZmF1bHQoKTsgZHJvcHpvbmUuc3R5bGUuYm9yZGVyQ29sb3I9J3ZhcigtLWFjY2VudCknOyB9KSk7CiAgICAgIDtbJ2RyYWdsZWF2ZScsJ2Ryb3AnXS5mb3JFYWNoKGV2ID0+IGRyb3B6b25lLmFkZEV2ZW50TGlzdGVuZXIoZXYsIGUgPT4geyBlLnByZXZlbnREZWZhdWx0KCk7IGRyb3B6b25lLnN0eWxlLmJvcmRlckNvbG9yPSdyZ2JhKDAsMCwwLC4yNSknOyB9KSk7CiAgICAgIGRyb3B6b25lLmFkZEV2ZW50TGlzdGVuZXIoJ2Ryb3AnLCBlID0+IGhhbmRsZUZpbGVzKGUuZGF0YVRyYW5zZmVyLmZpbGVzKSk7CiAgICB9CgogICAgLy8gPT09PT09PT09PT09PT09PT09IEluaXQgPT09PT09PT09PT09PT09PT09CiAgICByZW5kZXIoKTsgICAgICAgICAgIC8vIHBpbnRhIHZhY8OtbwogICAgbG9hZFNlbGVjdGVkQmxvY2tzKCk7IC8vIGNhcmdhIGF1dG9tw6F0aWNhIGluaWNpYWwgc2Vnw7puIGNoZWNrYm94ZXMKICA8L3NjcmlwdD4KPC9ib2R5Pgo8L2h0bWw+Cg==[/fusion_code][/fusion_builder_column][/fusion_builder_row][/fusion_builder_container]

STEPV UPV uses Accessibility Checker to monitor our website's accessibility.

Desplaça cap amunt