ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2pzJyk7CgogIC8qIC0tLS0tLS0tLS0gZW1haWwgY2FwdHVyZSAoQnJldm8pIHdpcmluZyAtLS0tLS0tLS0tICovCiAgKGZ1bmN0aW9uKCl7ZnVuY3Rpb24gd2lyZShmKXtpZihmLl9fYnYpcmV0dXJuO2YuX19idj0xO2YuYWRkRXZlbnRMaXN0ZW5lcignc3VibWl0JyxmdW5jdGlvbihlKXt2YXIgZW09Zi5xdWVyeVNlbGVjdG9yKCdbbmFtZT1FTUFJTF0nKTtpZighZW18fCFlbS52YWx1ZXx8ZW0udmFsdWUuaW5kZXhPZignQCcpPDEpe2UucHJldmVudERlZmF1bHQoKTtpZihlbSl7ZW0uZm9jdXMoKTtlbS5zdHlsZS5ib3JkZXJDb2xvcj0nI2ZmNmI4Yid9cmV0dXJufXZhciBiPWYucXVlcnlTZWxlY3RvcignYnV0dG9uJyk7aWYoYil7Yi5kaXNhYmxlZD10cnVlO2Iuc3R5bGUub3BhY2l0eT0nLjYnfXZhciBzPWYucGFyZW50Tm9kZS5xdWVyeVNlbGVjdG9yKCcuYnYtc3RhdGUnKTtpZihzKXMuc3R5bGUuZGlzcGxheT0nYmxvY2snO3NldFRpbWVvdXQoZnVuY3Rpb24oKXt3aW5kb3cubG9jYXRpb24uaHJlZj0nL21lcmNpLWVib29rLyd9LDExMDApfSl9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmJ2LWZvcm0nKS5mb3JFYWNoKHdpcmUpO30pKCk7CiAgLyogLS0tLS0tLS0tLSBhbmltYXRlZCBub2RlIG5ldHdvcmsgLS0tLS0tLS0tLSAqLwogIGNvbnN0IGN2ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Zsb3ctY2FudmFzJyk7CiAgY29uc3QgY3R4ID0gY3YuZ2V0Q29udGV4dCgnMmQnKTsKICBsZXQgdyxoLG5vZGVzLERQUj1NYXRoLm1pbih3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpb3x8MSwyKTsKICBmdW5jdGlvbiByZXNpemUoKXsKICAgIHc9Y3Yud2lkdGg9aW5uZXJXaWR0aCpEUFI7IGg9Y3YuaGVpZ2h0PWlubmVySGVpZ2h0KkRQUjsKICAgIGN2LnN0eWxlLndpZHRoPWlubmVyV2lkdGgrJ3B4JzsgY3Yuc3R5bGUuaGVpZ2h0PWlubmVySGVpZ2h0KydweCc7CiAgICBjb25zdCBjb3VudD1NYXRoLm1pbig3MCxNYXRoLmZsb29yKGlubmVyV2lkdGgvMjIpKTsKICAgIG5vZGVzPUFycmF5LmZyb20oe2xlbmd0aDpjb3VudH0sKCk9Pih7CiAgICAgIHg6TWF0aC5yYW5kb20oKSp3LHk6TWF0aC5yYW5kb20oKSpoLAogICAgICB2eDooTWF0aC5yYW5kb20oKS0uNSkqLjI1KkRQUix2eTooTWF0aC5yYW5kb20oKS0uNSkqLjI1KkRQUgogICAgfSkpOwogIH0KICBmdW5jdGlvbiB0aWNrKCl7CiAgICBjdHguY2xlYXJSZWN0KDAsMCx3LGgpOwogICAgZm9yKGNvbnN0IG4gb2Ygbm9kZXMpewogICAgICBuLngrPW4udng7bi55Kz1uLnZ5OwogICAgICBpZihuLng8MHx8bi54Pncpbi52eCo9LTE7CiAgICAgIGlmKG4ueTwwfHxuLnk+aCluLnZ5Kj0tMTsKICAgIH0KICAgIGZvcihsZXQgaT0wO2k8bm9kZXMubGVuZ3RoO2krKyl7CiAgICAgIGZvcihsZXQgaj1pKzE7ajxub2Rlcy5sZW5ndGg7aisrKXsKICAgICAgICBjb25zdCBhPW5vZGVzW2ldLGI9bm9kZXNbal07CiAgICAgICAgY29uc3QgZD1NYXRoLmh5cG90KGEueC1iLngsYS55LWIueSk7CiAgICAgICAgY29uc3QgbWF4PTE1MCpEUFI7CiAgICAgICAgaWYoZDxtYXgpewogICAgICAgICAgY29uc3Qgbz0oMS1kL21heCkqLjU7CiAgICAgICAgICBjb25zdCBnPWN0eC5jcmVhdGVMaW5lYXJHcmFkaWVudChhLngsYS55LGIueCxiLnkpOwogICAgICAgICAgZy5hZGRDb2xvclN0b3AoMCwncmdiYSg1NiwyMjUsMjU1LCcrbysnKScpOwogICAgICAgICAgZy5hZGRDb2xvclN0b3AoMSwncmdiYSgxMzksOTIsMjQ2LCcrbysnKScpOwogICAgICAgICAgY3R4LnN0cm9rZVN0eWxlPWc7Y3R4LmxpbmVXaWR0aD1EUFI7CiAgICAgICAgICBjdHguYmVnaW5QYXRoKCk7Y3R4Lm1vdmVUbyhhLngsYS55KTtjdHgubGluZVRvKGIueCxiLnkpO2N0eC5zdHJva2UoKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGZvcihjb25zdCBuIG9mIG5vZGVzKXsKICAgICAgY3R4LmJlZ2luUGF0aCgpO2N0eC5hcmMobi54LG4ueSwxLjYqRFBSLDAsNyk7CiAgICAgIGN0eC5maWxsU3R5bGU9J3JnYmEoMTgwLDIwMCwyNTUsLjcpJztjdHguZmlsbCgpOwogICAgfQogICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRpY2spOwogIH0KICByZXNpemUoKTt0aWNrKCk7CiAgYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJyxyZXNpemUpOwoKICAvKiAtLS0tLS0tLS0tIGhlcm8gZGF0YSBnbG9iZSAoVDMpICsgZMOpbWVtYnJlbWVudCBkZXMgY2VsbHVsZXMgYXUgc3Vydm9sIC0tLS0tLS0tLS0gKi8KICAoZnVuY3Rpb24oKXsKICAgIGNvbnN0IGM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlcm8tZ2xvYmUnKTsgaWYoIWMpIHJldHVybjsKICAgIGNvbnN0IHZpc3VhbD1jLmNsb3Nlc3QoJy5oZXJvLXZpc3VhbCcpOwogICAgY29uc3QgY3R4PWMuZ2V0Q29udGV4dCgnMmQnKTsgY29uc3QgRFBSPU1hdGgubWluKHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvfHwxLDIpOwogICAgY29uc3QgTj0xNDAsIHB0cz1bXTsKICAgIGZvcihsZXQgaT0wO2k8TjtpKyspewogICAgICBjb25zdCB5PTEtKGkvKE4tMSkpKjIsIHI9TWF0aC5zcXJ0KDEteSp5KSwgcGhpPWkqTWF0aC5QSSooMy1NYXRoLnNxcnQoNSkpOwogICAgICBjb25zdCBhPU1hdGgucmFuZG9tKCkqTWF0aC5QSSoyLCBiPU1hdGguYWNvcyhNYXRoLnJhbmRvbSgpKjItMSk7CiAgICAgIHB0cy5wdXNoKHt4Ok1hdGguY29zKHBoaSkqcix5OnksejpNYXRoLnNpbihwaGkpKnIsCiAgICAgICAgc3g6TWF0aC5zaW4oYikqTWF0aC5jb3MoYSksc3k6TWF0aC5zaW4oYikqTWF0aC5zaW4oYSksc3o6TWF0aC5jb3MoYiksCiAgICAgICAgbWFnOjAuNStNYXRoLnJhbmRvbSgpKjEuNH0pOwogICAgfQogICAgbGV0IFIsY3gsY3k7CiAgICBmdW5jdGlvbiBzaXplKCl7CiAgICAgIGNvbnN0IGJ4PWMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgIGMud2lkdGg9TWF0aC5tYXgoMSxieC53aWR0aCpEUFIpOyBjLmhlaWdodD1NYXRoLm1heCgxLGJ4LmhlaWdodCpEUFIpOwogICAgICBSPU1hdGgubWluKGMud2lkdGgsYy5oZWlnaHQpKjAuNDA7IGN4PWMud2lkdGgvMjsgY3k9Yy5oZWlnaHQvMjsKICAgIH0KICAgIHNpemUoKTsgYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJyxzaXplKTsKICAgIGxldCBkaXNwZXJzZT0wLCB0YXJnZXQ9MDsKICAgIGlmKHZpc3VhbCAmJiBtYXRjaE1lZGlhKCcoaG92ZXI6aG92ZXIpJykubWF0Y2hlcyl7CiAgICAgIHZpc3VhbC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWVudGVyJyxmdW5jdGlvbigpe3RhcmdldD0xO30pOwogICAgICB2aXN1YWwuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsZnVuY3Rpb24oKXt0YXJnZXQ9MDt9KTsKICAgIH0KICAgIGxldCBhbmc9MDsKICAgIGZ1bmN0aW9uIGZyYW1lKCl7CiAgICAgIGFuZys9MC4wMDEyOwogICAgICBkaXNwZXJzZSs9KHRhcmdldC1kaXNwZXJzZSkqMC4wNDU7CiAgICAgIGNvbnN0IGU9ZGlzcGVyc2UqZGlzcGVyc2UqKDMtMipkaXNwZXJzZSk7CiAgICAgIGN0eC5jbGVhclJlY3QoMCwwLGMud2lkdGgsYy5oZWlnaHQpOwogICAgICBjb25zdCBjYT1NYXRoLmNvcyhhbmcpLCBzYT1NYXRoLnNpbihhbmcpOwogICAgICBjb25zdCBwPXB0cy5tYXAobz0+ewogICAgICAgIGNvbnN0IFg9by54KmNhLW8ueipzYSwgWj1vLngqc2Erby56KmNhLCBvZmY9ZSpvLm1hZzsKICAgICAgICByZXR1cm4ge3g6Y3grKFgrby5zeCpvZmYpKlIsIHk6Y3krKG8ueStvLnN5Km9mZikqUiwgejpaK28uc3oqb2ZmLCBmOihaKzEpLzJ9OwogICAgICB9KTsKICAgICAgY29uc3QgbGluZUZhZGU9TWF0aC5tYXgoMCwxLWUqMS43KTsKICAgICAgaWYobGluZUZhZGU+MC4wMSl7CiAgICAgICAgY29uc3QgbGltPVIqMC40ODsKICAgICAgICBmb3IobGV0IGk9MDtpPHAubGVuZ3RoO2krKykgZm9yKGxldCBqPWkrMTtqPHAubGVuZ3RoO2orKyl7CiAgICAgICAgICBjb25zdCBhPXBbaV0sYj1wW2pdLCBkPU1hdGguaHlwb3QoYS54LWIueCxhLnktYi55KTsKICAgICAgICAgIGlmKGQ8bGltKXsKICAgICAgICAgICAgY29uc3QgZGVwdGg9KGEueitiLnopLzIsIG89KDEtZC9saW0pKigwLjIwKzAuNDUqKGRlcHRoKzEpLzIpKmxpbmVGYWRlOwogICAgICAgICAgICBjb25zdCBnPWN0eC5jcmVhdGVMaW5lYXJHcmFkaWVudChhLngsYS55LGIueCxiLnkpOwogICAgICAgICAgICBnLmFkZENvbG9yU3RvcCgwLCdyZ2JhKDU2LDIyNSwyNTUsJytvKycpJyk7IGcuYWRkQ29sb3JTdG9wKDEsJ3JnYmEoMTM5LDkyLDI0NiwnK28rJyknKTsKICAgICAgICAgICAgY3R4LnN0cm9rZVN0eWxlPWc7IGN0eC5saW5lV2lkdGg9RFBSKjAuODU7IGN0eC5iZWdpblBhdGgoKTsgY3R4Lm1vdmVUbyhhLngsYS55KTsgY3R4LmxpbmVUbyhiLngsYi55KTsgY3R4LnN0cm9rZSgpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBjb25zdCBwdEZhZGU9TWF0aC5tYXgoMCwxLWUqMC45Mik7CiAgICAgIGN0eC5zaGFkb3dDb2xvcj0ncmdiYSgxMjAsMjAwLDI1NSwuNyknOwogICAgICBmb3IoY29uc3QgbyBvZiBwKXsKICAgICAgICBjdHguc2hhZG93Qmx1cj1EUFIqKDIrMypvLmYpOwogICAgICAgIGN0eC5iZWdpblBhdGgoKTsgY3R4LmFyYyhvLngsby55LERQUiooMC45KzEuOSpvLmYpKigxK2UqMC43KSwwLDcpOwogICAgICAgIGN0eC5maWxsU3R5bGU9J3JnYmEoMjA1LDIzMiwyNTUsJysoKDAuMzIrMC42NipvLmYpKnB0RmFkZSkrJyknOyBjdHguZmlsbCgpOwogICAgICB9CiAgICAgIGN0eC5zaGFkb3dCbHVyPTA7CiAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShmcmFtZSk7CiAgICB9CiAgICBmcmFtZSgpOwogIH0pKCk7CgogIC8qIC0tLS0tLS0tLS0gaGVhZGVyIGF1dG8tbWFzcXVhbnQgYXUgc2Nyb2xsIC0tLS0tLS0tLS0gKi8KICAoZnVuY3Rpb24oKXsKICAgIHZhciBoPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2hlYWRlcicpOyBpZighaCkgcmV0dXJuOwogICAgdmFyIGxhc3Q9d2luZG93LnNjcm9sbFl8fDAsIHRpY2tpbmc9ZmFsc2U7CiAgICBhZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLGZ1bmN0aW9uKCl7CiAgICAgIGlmKHRpY2tpbmcpIHJldHVybjsgdGlja2luZz10cnVlOwogICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24oKXsKICAgICAgICB2YXIgeT13aW5kb3cuc2Nyb2xsWXx8MDsKICAgICAgICBpZih5Pmxhc3QgJiYgeT4xNDApeyBoLmNsYXNzTGlzdC5hZGQoJ25hdi1oaWRkZW4nKTsgfSBlbHNlIHsgaC5jbGFzc0xpc3QucmVtb3ZlKCduYXYtaGlkZGVuJyk7IH0KICAgICAgICBsYXN0PXk7IHRpY2tpbmc9ZmFsc2U7CiAgICAgIH0pOwogICAgfSx7cGFzc2l2ZTp0cnVlfSk7CiAgfSkoKTsKCiAgLyogLS0tLS0tLS0tLSBwYXJhbGxheGUgbMOpZ8OocmUgZHUgZm9uZCBhdSBzY3JvbGwgLS0tLS0tLS0tLSAqLwogIChmdW5jdGlvbigpewogICAgY29uc3QgZ2xvd3M9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmJnLWdsb3cnKTsKICAgIGNvbnN0IGN2PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmbG93LWNhbnZhcycpOwogICAgbGV0IHRpY2tpbmc9ZmFsc2U7CiAgICBmdW5jdGlvbiBvblNjcm9sbCgpewogICAgICBpZih0aWNraW5nKSByZXR1cm47IHRpY2tpbmc9dHJ1ZTsKICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uKCl7CiAgICAgICAgY29uc3QgeT13aW5kb3cuc2Nyb2xsWXx8MDsKICAgICAgICBnbG93cy5mb3JFYWNoKGZ1bmN0aW9uKGcsaSl7IGcuc3R5bGUudHJhbnNmb3JtPSd0cmFuc2xhdGUzZCgwLCcrKHkqKDAuMTEraSowLjA2KSkudG9GaXhlZCgxKSsncHgsMCknOyB9KTsKICAgICAgICBpZihjdikgY3Yuc3R5bGUudHJhbnNmb3JtPSd0cmFuc2xhdGUzZCgwLCcrKHkqMC4wNykudG9GaXhlZCgxKSsncHgsMCknOwogICAgICAgIHRpY2tpbmc9ZmFsc2U7CiAgICAgIH0pOwogICAgfQogICAgYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJyxvblNjcm9sbCx7cGFzc2l2ZTp0cnVlfSk7CiAgfSkoKTsKCiAgLyogLS0tLS0tLS0tLSByZXZlYWwgb24gc2Nyb2xsIC0tLS0tLS0tLS0gKi8KICBjb25zdCBpbz1uZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoKGVzKT0+ewogICAgZXMuZm9yRWFjaChlPT57aWYoZS5pc0ludGVyc2VjdGluZyl7ZS50YXJnZXQuY2xhc3NMaXN0LmFkZCgnaW4nKTtpby51bm9ic2VydmUoZS50YXJnZXQpO319KTsKICB9LHt0aHJlc2hvbGQ6LjEyfSk7CiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnJldmVhbCcpLmZvckVhY2goKGVsLGkpPT57ZWwuc3R5bGUudHJhbnNpdGlvbkRlbGF5PShpJTMqNzApKydtcyc7aW8ub2JzZXJ2ZShlbCk7fSk7CiAgLyogZmlsZXQgZGUgc8OpY3VyaXTDqSA6IHNpIGwnSW50ZXJzZWN0aW9uT2JzZXJ2ZXIgbmUgc2UgZMOpY2xlbmNoZSBwYXMsIG9uIHLDqXbDqGxlIHRvdXQgYXByw6hzIDEsNiBzICovCiAgc2V0VGltZW91dChmdW5jdGlvbigpe2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5yZXZlYWw6bm90KC5pbiknKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuY2xhc3NMaXN0LmFkZCgnaW4nKTt9KTt9LDE2MDApOwoKICAvKiAtLS0tLS0tLS0tIG1lbnUgbW9iaWxlIChoYW1idXJnZXIpIC0tLS0tLS0tLS0gKi8KICAoZnVuY3Rpb24oKXsKICAgIGNvbnN0IGJ1cmdlcj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYnVyZ2VyJyksIG1tPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2JpbGVNZW51Jyk7CiAgICBpZighYnVyZ2VyfHwhbW0pIHJldHVybjsKICAgIGZ1bmN0aW9uIHNldChvcGVuKXttbS5jbGFzc0xpc3QudG9nZ2xlKCdvcGVuJyxvcGVuKTtidXJnZXIuY2xhc3NMaXN0LnRvZ2dsZSgnb3Blbicsb3Blbik7YnVyZ2VyLnNldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcsb3Blbik7fQogICAgYnVyZ2VyLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbigpe3NldCghbW0uY2xhc3NMaXN0LmNvbnRhaW5zKCdvcGVuJykpO30pOwogICAgbW0ucXVlcnlTZWxlY3RvckFsbCgnYScpLmZvckVhY2goZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oKXtzZXQoZmFsc2UpO30pO30pOwogIH0pKCk7CgoKICAvKiAtLS0tLS0tLS0tIHYzIDogcGVyc29uYSByb3RhdGlmIC0tLS0tLS0tLS0gKi8KICAoZnVuY3Rpb24oKXsKICAgIGNvbnN0IHdobz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncFdobycpLCB3aGF0PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwV2hhdCcpOwogICAgaWYoIXdobykgcmV0dXJuOwogICAgY29uc3QgZGF0YT1bWyJVbiBmcmVlbGFuY2UiLCJyZWxhbmNlciBzZXMgY2xpZW50cyBwZW5kYW50IHF1J2lsIGRvcnQiXSwKICAgICAgWyJVbiBlLWNvbW1lcsOnYW50IiwiZ8OpbsOpcmVyIHNlcyBmYWN0dXJlcyBzYW5zIGxldmVyIGxlIHBldGl0IGRvaWd0Il0sCiAgICAgIFsiVW5lIGFnZW5jZSIsIm9uYm9hcmRlciB1biBjbGllbnQgZW4gNSBtaW51dGVzIl0sCiAgICAgIFsiVW4gY3LDqWF0ZXVyIiwicHVibGllciBzdXIgNCByw6lzZWF1eCBkJ3VuIHNldWwgY291cCJdLAogICAgICBbIlVuZSBQTUUiLCJ0cmllciBzb24gc3VwcG9ydCBjbGllbnQgYXZlYyBsJ0lBIl1dOwogICAgbGV0IGk9MDsKICAgIGZ1bmN0aW9uIHR5cGUoZWwsdHh0LGRvbmUpe2xldCBrPTA7ZWwudGV4dENvbnRlbnQ9Jyc7KGZ1bmN0aW9uIHQoKXtpZihrPD10eHQubGVuZ3RoKXtlbC50ZXh0Q29udGVudD10eHQuc2xpY2UoMCxrKTtrKys7c2V0VGltZW91dCh0LDI2KX1lbHNlIGRvbmUmJmRvbmUoKX0pKCl9CiAgICBzZXRJbnRlcnZhbChmdW5jdGlvbigpe2k9KGkrMSklZGF0YS5sZW5ndGg7d2hvLnN0eWxlLm9wYWNpdHk9MDsKICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpe3doby50ZXh0Q29udGVudD1kYXRhW2ldWzBdO3doby5zdHlsZS5vcGFjaXR5PTE7dHlwZSh3aGF0LGRhdGFbaV1bMV0pfSwyNTApOwogICAgfSw0MjAwKTsKICB9KSgpOwogIC8qIC0tLS0tLS0tLS0gdjMgOiBjb21wdGV1cnMgLS0tLS0tLS0tLSAqLwogIChmdW5jdGlvbigpewogICAgY29uc3QgZWxzPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5jb3VudCcpOyBpZighZWxzLmxlbmd0aCkgcmV0dXJuOwogICAgY29uc3QgaW8yPW5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcihmdW5jdGlvbihlcyl7ZXMuZm9yRWFjaChmdW5jdGlvbihlKXsKICAgICAgaWYoIWUuaXNJbnRlcnNlY3RpbmcpIHJldHVybjsgaW8yLnVub2JzZXJ2ZShlLnRhcmdldCk7CiAgICAgIGNvbnN0IHRvPStlLnRhcmdldC5kYXRhc2V0LnRvOyBjb25zdCB0MD1wZXJmb3JtYW5jZS5ub3coKTsKICAgICAgKGZ1bmN0aW9uIHN0ZXAobm93KXtjb25zdCBwPU1hdGgubWluKDEsKG5vdy10MCkvMTIwMCk7Y29uc3Qgdj1NYXRoLnJvdW5kKHRvKigxLU1hdGgucG93KDEtcCwzKSkpO2UudGFyZ2V0LnRleHRDb250ZW50PXY7aWYocDwxKXJlcXVlc3RBbmltYXRpb25GcmFtZShzdGVwKX0pKHQwKTsKICAgIH0pfSx7dGhyZXNob2xkOi41fSk7CiAgICBlbHMuZm9yRWFjaChmdW5jdGlvbihlbCl7aW8yLm9ic2VydmUoZWwpfSk7CiAgfSkoKTsKICAvKiAtLS0tLS0tLS0tIHYzIDogb25nbGV0cyBwZXJzb25hcyAtLS0tLS0tLS0tICovCiAgKGZ1bmN0aW9uKCl7CiAgICBjb25zdCB0YWJzPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5wdGFiJyksIHBhbmVscz1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcucHBhbmVsJyk7CiAgICB0YWJzLmZvckVhY2goZnVuY3Rpb24odCl7dC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oKXsKICAgICAgdGFicy5mb3JFYWNoKGZ1bmN0aW9uKHgpe3guY2xhc3NMaXN0LnJlbW92ZSgnb24nKX0pOyB0LmNsYXNzTGlzdC5hZGQoJ29uJyk7CiAgICAgIHBhbmVscy5mb3JFYWNoKGZ1bmN0aW9uKHApe3AuY2xhc3NMaXN0LnRvZ2dsZSgnb24nLHAuZGF0YXNldC5wPT09dC5kYXRhc2V0LnApfSk7CiAgICB9KX0pOwogIH0pKCk7CgogIC8qIC0tLS0tLS0tLS0gZmVhdHVyZSBzcG90bGlnaHQgLS0tLS0tLS0tLSAqLwogIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5mZWF0dXJlLC5iLWNhcmQsLnN0ZXAsLnN0YXRzLC5jdGEtZmluYWwnKS5mb3JFYWNoKGY9PnsKICAgIGYuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJyxlPT57CiAgICAgIGNvbnN0IHI9Zi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgZi5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1teCcsKGUuY2xpZW50WC1yLmxlZnQpKydweCcpOwogICAgICBmLnN0eWxlLnNldFByb3BlcnR5KCctLW15JywoZS5jbGllbnRZLXIudG9wKSsncHgnKTsKICAgIH0pOwogIH0pOwo=
Nous avons remarqué que vous vous trouvez dans le pays suivant : Canada. Nous avons mis à jour nos prix à Dollar canadien pour faciliter votre processus d'achat. Utilisez Euro à la place. Ignorer
Votre vie privée, votre choix
On utilise des cookies nécessaires au fonctionnement du site et, avec votre accord, Google Analytics pour mesurer l'audience. En savoir plus
Cookies nécessairesPanier, sécurité, préférences
Mesure d'audienceGoogle Analytics
Personnaliser
Tout refuser
Tout accepter
Retour
Enregistrer mes choix